update
This commit is contained in:
146
analyze.py
146
analyze.py
@@ -1,46 +1,22 @@
|
||||
from pathlib import Path
|
||||
from datetime import datetime
|
||||
from collections import Counter
|
||||
from functools import reduce
|
||||
import re
|
||||
from common import parse_foods_file, evaluate_food_entry
|
||||
import string
|
||||
|
||||
import sys
|
||||
import json
|
||||
|
||||
from common import parse_foods_file
|
||||
journal = json.load(open('journal.json'))
|
||||
|
||||
foods, recipes = parse_foods_file()
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
|
||||
value, name = sys.argv[1:]
|
||||
value = float(value.removesuffix('g'))
|
||||
|
||||
if name in recipes:
|
||||
food = recipes[name]
|
||||
|
||||
if value == 0.0:
|
||||
value = food['TOTAL']
|
||||
|
||||
food = {k: v*(value/food['TOTAL']) for k,v in food.items()}
|
||||
elif name in foods:
|
||||
if value == 0.0:
|
||||
value = 100
|
||||
|
||||
food = {k: v*(value/100.0) for k,v in foods[name].items()}
|
||||
else:
|
||||
breakpoint()
|
||||
print(f'ERROR: Invalid diet entry: {content}')
|
||||
|
||||
from pprint import pprint
|
||||
pprint(food)
|
||||
pprint(evaluate_food_entry(foods, recipes, value, name))
|
||||
|
||||
exit(0)
|
||||
|
||||
|
||||
entry_re = re.compile(r'^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) ', re.MULTILINE)
|
||||
diet_re = re.compile(r'@diet (\d+g) ([a-zA-Z]+)')
|
||||
|
||||
total_entries = 0
|
||||
total_words = 0
|
||||
word_frequency = Counter()
|
||||
@@ -56,14 +32,8 @@ diet_csv = [[
|
||||
'saturated_fat', 'sugar', 'fiber'
|
||||
]]
|
||||
|
||||
output = open('diet', 'w')
|
||||
|
||||
for fpath in sorted((Path.home() / 'workspace' / 'journal').glob('*.md')):
|
||||
day = fpath.stem
|
||||
header, *tmp = entry_re.split(fpath.read_text())
|
||||
entries = list(zip(tmp[::2], tmp[1::2]))
|
||||
|
||||
daily_entries = len(entries)
|
||||
for day, obj in journal.items():
|
||||
daily_entries = len(obj['entries'])
|
||||
daily_words = 0
|
||||
daily_calories = 0.0
|
||||
daily_protein = 0.0
|
||||
@@ -71,73 +41,43 @@ for fpath in sorted((Path.home() / 'workspace' / 'journal').glob('*.md')):
|
||||
daily_fat = 0.0
|
||||
daily_sugar = 0.0
|
||||
|
||||
output.write(f'-- {day}\n')
|
||||
for entry in obj['entries']:
|
||||
for block in entry['blocks']:
|
||||
if isinstance(block, str):
|
||||
words = ''.join(
|
||||
c if c in string.ascii_letters+"'" else ' '
|
||||
for c in block.lower()
|
||||
).split()
|
||||
|
||||
for (timestamp, content) in sorted(entries, key=lambda x: x[0]):
|
||||
ts_str = timestamp
|
||||
timestamp = int(datetime.strptime(timestamp, '%Y-%m-%d %H:%M:%S').timestamp())
|
||||
word_frequency.update(words)
|
||||
|
||||
content = '\n'.join(
|
||||
part.replace('\n', ' ')
|
||||
for part in content.split('\n\n')
|
||||
)
|
||||
entry_words = len(words)
|
||||
daily_words += entry_words
|
||||
elif block['type'] == 'diet':
|
||||
name = block['food']
|
||||
value = block['amount']
|
||||
food = evaluate_food_entry(foods, recipes, value, name)
|
||||
|
||||
for diet in diet_re.finditer(content):
|
||||
value, name = diet.groups()
|
||||
output.write(f'{ts_str} {name} {value}\n')
|
||||
diet_csv.append((
|
||||
entry['timestamp'],
|
||||
name,
|
||||
value,
|
||||
round(food.get('Energy', 0.0), 2),
|
||||
round(food.get('Carbs', 0.0), 2),
|
||||
round(food.get('Fat', 0.0), 2),
|
||||
round(food.get('Protein', 0.0), 2),
|
||||
round(food.get('SaturatedFat', 0.0), 2),
|
||||
round(food.get('Sugar', 0.0), 2),
|
||||
round(food.get('Fiber', 0.0), 2),
|
||||
))
|
||||
|
||||
value = float(value.removesuffix('g'))
|
||||
daily_calories += food.get('Energy', 0.0)
|
||||
daily_protein += food.get('Protein', 0.0)
|
||||
daily_fat += food.get('Fat', 0.0)
|
||||
daily_carbs += food.get('Carbs', 0.0)
|
||||
daily_sugar += food.get('Sugar', 0.0)
|
||||
|
||||
|
||||
if name in recipes:
|
||||
food = recipes[name]
|
||||
|
||||
if value == 0.0:
|
||||
value = food['TOTAL']
|
||||
|
||||
food = {k: v*(value/food['TOTAL']) for k,v in food.items()}
|
||||
elif name in foods:
|
||||
if value == 0.0:
|
||||
value = 100
|
||||
|
||||
food = {k: v*(value/100.0) for k,v in foods[name].items()}
|
||||
else:
|
||||
breakpoint()
|
||||
print(f'ERROR: Invalid diet entry: {content}')
|
||||
continue
|
||||
|
||||
|
||||
|
||||
diet_csv.append((
|
||||
timestamp,
|
||||
name,
|
||||
value,
|
||||
round(food.get('Energy', 0.0), 2),
|
||||
round(food.get('Carbs', 0.0), 2),
|
||||
round(food.get('Fat', 0.0), 2),
|
||||
round(food.get('Protein', 0.0), 2),
|
||||
round(food.get('SaturatedFat', 0.0), 2),
|
||||
round(food.get('Sugar', 0.0), 2),
|
||||
round(food.get('Fiber', 0.0), 2),
|
||||
))
|
||||
|
||||
daily_calories += food.get('Energy', 0.0)
|
||||
daily_protein += food.get('Protein', 0.0)
|
||||
daily_fat += food.get('Fat', 0.0)
|
||||
daily_carbs += food.get('Carbs', 0.0)
|
||||
daily_sugar += food.get('Sugar', 0.0)
|
||||
|
||||
words = ''.join(
|
||||
c if c in string.ascii_letters+"'" else ' '
|
||||
for c in content.lower()
|
||||
).split()
|
||||
|
||||
word_frequency.update(words)
|
||||
|
||||
entry_words = len(words)
|
||||
daily_words += entry_words
|
||||
|
||||
entry_csv.append([timestamp, entry_words])
|
||||
entry_csv.append([entry['timestamp'], entry_words])
|
||||
|
||||
daily_macros = daily_protein + daily_fat + daily_carbs
|
||||
|
||||
@@ -164,8 +104,8 @@ def write_csv(fname, csv):
|
||||
with open(fname, 'w') as fp:
|
||||
fp.write('\n'.join(','.join(str(x) for x in row) for row in csv))
|
||||
|
||||
write_csv('total.csv', total_csv)
|
||||
write_csv('daily.csv', daily_csv)
|
||||
write_csv('entry.csv', entry_csv)
|
||||
write_csv('words.csv', words_csv)
|
||||
write_csv('diet.csv', diet_csv)
|
||||
write_csv('data/total.csv', total_csv)
|
||||
write_csv('data/daily.csv', daily_csv)
|
||||
write_csv('data/entry.csv', entry_csv)
|
||||
write_csv('data/words.csv', words_csv)
|
||||
write_csv('data/diet.csv', diet_csv)
|
||||
|
||||
Reference in New Issue
Block a user