From 557df1bb20d1ae13108d071f6de9889fa75521fd Mon Sep 17 00:00:00 2001 From: olari Date: Tue, 1 Jun 2021 12:53:48 +0300 Subject: [PATCH] update --- Untitled.ipynb | 1051 ------------------------------------------------ analyze.py | 146 ++----- common.py | 21 + foods | 14 + search.py | 26 +- summary.py | 42 +- 6 files changed, 101 insertions(+), 1199 deletions(-) delete mode 100644 Untitled.ipynb diff --git a/Untitled.ipynb b/Untitled.ipynb deleted file mode 100644 index d07fb3b..0000000 --- a/Untitled.ipynb +++ /dev/null @@ -1,1051 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "c0ccf4cd", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "9bc76e03", - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_csv('diet.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "a6f9c607", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "KauraTyynyt 8\n", - "Cheese 7\n", - "Ketchup 7\n", - "Milk 6\n", - "Orange 6\n", - "Sugar 6\n", - "Egg 6\n", - "RainbowNoodles 5\n", - "Margarine 5\n", - "CherryTomatoes 5\n", - "Name: name, dtype: int64" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df['name'].value_counts().head(10)" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "e9a1667f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
timestampgramscaloriescarbsfatproteinsaturated_fatsugarfiber
name
Omlette1.620148e+09382.000000680.80000022.89000046.78000035.3400006.82002.5200001.650000
OmletteWithoutMilk1.620737e+09330.000000665.30000019.89000046.63000034.8400006.82000.4200000.600000
LeipaJuusto1.621168e+09188.000000518.8800006.58000041.36000030.08000026.32005.2600000.000000
Egg1.620818e+09172.166667266.8583331.93000018.25000021.6933330.00000.0000000.000000
ProteinSpaghettiBolognese1.620805e+09518.000000649.075000118.7600006.95000021.0000001.265014.84500011.845000
ProteinRahka1.620931e+09175.000000117.25000010.5000000.35000017.5000000.180010.3300000.000000
MilkSoup1.620793e+09330.000000495.38000061.36000016.93000015.4300005.18004.7100003.510000
FakeChickenVeggies1.620210e+09163.000000277.72000017.49000016.10000013.8900001.42002.9500003.920000
CreamPotatoes1.620579e+09430.000000538.55000043.72000031.17000013.85000014.33003.3000002.380000
Pancake1.620461e+09210.000000403.50000044.22000016.29000013.3000003.53003.3200001.400000
Cheese1.620517e+0942.714286140.5300000.00000010.25142911.5328575.98000.0000000.000000
Blov1.620528e+09300.000000404.54000068.9800007.27000011.3700000.85008.7600007.870000
RainbowNoodles1.620367e+0985.000000383.35000053.55000015.3000009.3500007.31001.4400000.000000
Muesli1.620594e+09108.750000425.21250067.32000011.8575009.1350004.237529.0400006.525000
FakeChicken1.620647e+0965.00000092.3000007.3500003.2500008.5400000.33001.0200000.000000
OatmealPorridge1.620911e+09280.000000258.88000034.1000008.4200008.4000001.90002.3600006.600000
FriedFalafel1.621105e+0980.000000209.19000014.81000011.4600007.9600000.91003.0500007.370000
KauraTyynyt1.620907e+0965.000000165.10000025.3500002.6650007.8000000.32500.5200004.290000
TaffelJuustoSnaks1.620405e+0970.000000385.00000035.70000023.1000007.0000004.34002.5200000.000000
Oatmeal1.620120e+0950.000000181.00000027.0000003.7500007.0000000.65000.5500005.500000
FriedPotatoes1.620922e+09415.000000399.01000053.15000014.9400006.3900001.08000.0000003.200000
Milk1.620455e+09189.166667121.0666670.0000006.6216676.0533334.35000.0000000.000000
WhiteBeansTomatoSauce1.620481e+09140.000000147.00000025.2000000.0000005.6000000.00002.8000000.000000
MashedPotato1.620210e+09300.000000241.66000030.6900008.3800005.0200002.80000.0000001.850000
RoastedVeggies1.620390e+09325.000000367.35500047.37000016.0550004.9300001.19004.0150004.565000
BakedPotatoes1.621105e+09310.000000274.48000040.1200008.3100004.8300000.59000.0000002.410000
WhiteBread1.620238e+0950.000000126.50000022.5000001.2500004.7000000.15000.5500003.050000
GelatiPremium1.621058e+0984.000000284.76000025.79000017.8900004.54000011.000023.9400000.000000
SobaChili1.620383e+0992.000000200.56000025.2100008.5600004.5100004.05005.5200000.000000
DarkBread1.620278e+0950.000000121.00000021.8000000.6500004.1000000.10000.7000005.850000
Watermelon1.621006e+09610.000000183.00000048.8000000.0000003.6600000.000036.6000002.440000
KeishaCandy1.620747e+0937.000000204.61000017.39000012.9500003.0000006.660016.6500000.000000
VanilliIceCream1.620579e+0990.000000144.00000020.2500005.6700002.8800003.690017.9100000.000000
SeedAndOilSalad1.621105e+09150.000000113.5400004.2700009.5200002.8500000.74002.4500000.770000
Hummus1.621083e+0941.500000115.3700003.2000009.8750002.8200001.12500.0850000.000000
VahvlitortTallinn1.620359e+0945.000000227.25000018.00000022.9500002.7000000.000011.2500000.000000
BiscuitRings1.620421e+0950.000000270.50000030.90000015.0500002.3000007.400011.5500000.000000
Pringles1.621015e+0950.000000268.00000028.00000016.0000002.3000001.50001.2000001.450000
MousseCherry1.620612e+0931.500000168.52500013.04000011.4650002.0450006.68009.8900000.000000
Pomegranate1.621135e+09100.00000083.00000019.0000000.0000001.7000000.000014.0000004.000000
SourCream1.620409e+0960.00000083.4000002.4000007.2000001.6800004.02002.4000000.000000
Banana1.620646e+09136.750000121.70750031.2325000.4500001.4925000.000016.7225003.555000
BoiledWokMix1.620922e+0990.00000074.3300004.6600004.8700001.4400000.37003.3000002.290000
GelatelliVeganIceCream1.620411e+0962.000000212.04000021.27000013.2100001.4300009.920015.0000000.000000
BerryMustikaVaarika1.620579e+09100.00000085.00000013.0000000.0000000.9500000.00007.2000004.700000
Salad1.620148e+0960.0000006.0000000.6000000.1200000.6600000.00000.3000000.000000
Cocoa1.620579e+0910.00000037.3000007.8600000.2900000.4800000.15007.6600000.000000
CherryTomatoes1.620744e+0948.8000008.7840001.9120000.0960000.4300000.00001.2800000.584000
Ketchup1.620674e+0933.57142934.2428577.7885710.0000000.4028570.00007.6542860.000000
SaladDressing1.620289e+0940.000000103.6000005.6000008.9200000.1600000.60004.3200000.000000
PureOrangeJuice1.621037e+09134.00000060.30000012.5950000.2700000.1100000.000012.5950000.000000
Sugar1.620373e+0918.33333373.33333318.3333330.0000000.0000000.000018.3333330.000000
Margarine1.620566e+0915.60000098.2800000.00000010.9200000.0000003.12000.0000000.000000
SaskiaPeach1.620760e+09243.33333338.9333330.0000000.0000000.0000000.00009.7333330.000000
PickleSlices1.620888e+0933.75000018.2250000.0000000.0000000.0000000.00004.0800000.000000
Orange1.620933e+09138.33333369.16666717.9833330.0000000.0000000.000011.7583333.043333
Oil1.620786e+0915.750000130.4100000.00000014.4900000.0000001.10250.0000000.000000
Honey1.620592e+0915.0000009.6000002.5500000.0000000.0000000.00002.5500000.000000
MonsterEnergy1.620575e+09500.000000235.0000000.0000000.0000000.0000000.000055.0000000.000000
CocaCola1.620441e+09330.000000138.60000034.9800000.0000000.0000000.000034.9800000.000000
\n", - "
" - ], - "text/plain": [ - " timestamp grams calories carbs \\\n", - "name \n", - "Omlette 1.620148e+09 382.000000 680.800000 22.890000 \n", - "OmletteWithoutMilk 1.620737e+09 330.000000 665.300000 19.890000 \n", - "LeipaJuusto 1.621168e+09 188.000000 518.880000 6.580000 \n", - "Egg 1.620818e+09 172.166667 266.858333 1.930000 \n", - "ProteinSpaghettiBolognese 1.620805e+09 518.000000 649.075000 118.760000 \n", - "ProteinRahka 1.620931e+09 175.000000 117.250000 10.500000 \n", - "MilkSoup 1.620793e+09 330.000000 495.380000 61.360000 \n", - "FakeChickenVeggies 1.620210e+09 163.000000 277.720000 17.490000 \n", - "CreamPotatoes 1.620579e+09 430.000000 538.550000 43.720000 \n", - "Pancake 1.620461e+09 210.000000 403.500000 44.220000 \n", - "Cheese 1.620517e+09 42.714286 140.530000 0.000000 \n", - "Blov 1.620528e+09 300.000000 404.540000 68.980000 \n", - "RainbowNoodles 1.620367e+09 85.000000 383.350000 53.550000 \n", - "Muesli 1.620594e+09 108.750000 425.212500 67.320000 \n", - "FakeChicken 1.620647e+09 65.000000 92.300000 7.350000 \n", - "OatmealPorridge 1.620911e+09 280.000000 258.880000 34.100000 \n", - "FriedFalafel 1.621105e+09 80.000000 209.190000 14.810000 \n", - "KauraTyynyt 1.620907e+09 65.000000 165.100000 25.350000 \n", - "TaffelJuustoSnaks 1.620405e+09 70.000000 385.000000 35.700000 \n", - "Oatmeal 1.620120e+09 50.000000 181.000000 27.000000 \n", - "FriedPotatoes 1.620922e+09 415.000000 399.010000 53.150000 \n", - "Milk 1.620455e+09 189.166667 121.066667 0.000000 \n", - "WhiteBeansTomatoSauce 1.620481e+09 140.000000 147.000000 25.200000 \n", - "MashedPotato 1.620210e+09 300.000000 241.660000 30.690000 \n", - "RoastedVeggies 1.620390e+09 325.000000 367.355000 47.370000 \n", - "BakedPotatoes 1.621105e+09 310.000000 274.480000 40.120000 \n", - "WhiteBread 1.620238e+09 50.000000 126.500000 22.500000 \n", - "GelatiPremium 1.621058e+09 84.000000 284.760000 25.790000 \n", - "SobaChili 1.620383e+09 92.000000 200.560000 25.210000 \n", - "DarkBread 1.620278e+09 50.000000 121.000000 21.800000 \n", - "Watermelon 1.621006e+09 610.000000 183.000000 48.800000 \n", - "KeishaCandy 1.620747e+09 37.000000 204.610000 17.390000 \n", - "VanilliIceCream 1.620579e+09 90.000000 144.000000 20.250000 \n", - "SeedAndOilSalad 1.621105e+09 150.000000 113.540000 4.270000 \n", - "Hummus 1.621083e+09 41.500000 115.370000 3.200000 \n", - "VahvlitortTallinn 1.620359e+09 45.000000 227.250000 18.000000 \n", - "BiscuitRings 1.620421e+09 50.000000 270.500000 30.900000 \n", - "Pringles 1.621015e+09 50.000000 268.000000 28.000000 \n", - "MousseCherry 1.620612e+09 31.500000 168.525000 13.040000 \n", - "Pomegranate 1.621135e+09 100.000000 83.000000 19.000000 \n", - "SourCream 1.620409e+09 60.000000 83.400000 2.400000 \n", - "Banana 1.620646e+09 136.750000 121.707500 31.232500 \n", - "BoiledWokMix 1.620922e+09 90.000000 74.330000 4.660000 \n", - "GelatelliVeganIceCream 1.620411e+09 62.000000 212.040000 21.270000 \n", - "BerryMustikaVaarika 1.620579e+09 100.000000 85.000000 13.000000 \n", - "Salad 1.620148e+09 60.000000 6.000000 0.600000 \n", - "Cocoa 1.620579e+09 10.000000 37.300000 7.860000 \n", - "CherryTomatoes 1.620744e+09 48.800000 8.784000 1.912000 \n", - "Ketchup 1.620674e+09 33.571429 34.242857 7.788571 \n", - "SaladDressing 1.620289e+09 40.000000 103.600000 5.600000 \n", - "PureOrangeJuice 1.621037e+09 134.000000 60.300000 12.595000 \n", - "Sugar 1.620373e+09 18.333333 73.333333 18.333333 \n", - "Margarine 1.620566e+09 15.600000 98.280000 0.000000 \n", - "SaskiaPeach 1.620760e+09 243.333333 38.933333 0.000000 \n", - "PickleSlices 1.620888e+09 33.750000 18.225000 0.000000 \n", - "Orange 1.620933e+09 138.333333 69.166667 17.983333 \n", - "Oil 1.620786e+09 15.750000 130.410000 0.000000 \n", - "Honey 1.620592e+09 15.000000 9.600000 2.550000 \n", - "MonsterEnergy 1.620575e+09 500.000000 235.000000 0.000000 \n", - "CocaCola 1.620441e+09 330.000000 138.600000 34.980000 \n", - "\n", - " fat protein saturated_fat sugar \\\n", - "name \n", - "Omlette 46.780000 35.340000 6.8200 2.520000 \n", - "OmletteWithoutMilk 46.630000 34.840000 6.8200 0.420000 \n", - "LeipaJuusto 41.360000 30.080000 26.3200 5.260000 \n", - "Egg 18.250000 21.693333 0.0000 0.000000 \n", - "ProteinSpaghettiBolognese 6.950000 21.000000 1.2650 14.845000 \n", - "ProteinRahka 0.350000 17.500000 0.1800 10.330000 \n", - "MilkSoup 16.930000 15.430000 5.1800 4.710000 \n", - "FakeChickenVeggies 16.100000 13.890000 1.4200 2.950000 \n", - "CreamPotatoes 31.170000 13.850000 14.3300 3.300000 \n", - "Pancake 16.290000 13.300000 3.5300 3.320000 \n", - "Cheese 10.251429 11.532857 5.9800 0.000000 \n", - "Blov 7.270000 11.370000 0.8500 8.760000 \n", - "RainbowNoodles 15.300000 9.350000 7.3100 1.440000 \n", - "Muesli 11.857500 9.135000 4.2375 29.040000 \n", - "FakeChicken 3.250000 8.540000 0.3300 1.020000 \n", - "OatmealPorridge 8.420000 8.400000 1.9000 2.360000 \n", - "FriedFalafel 11.460000 7.960000 0.9100 3.050000 \n", - "KauraTyynyt 2.665000 7.800000 0.3250 0.520000 \n", - "TaffelJuustoSnaks 23.100000 7.000000 4.3400 2.520000 \n", - "Oatmeal 3.750000 7.000000 0.6500 0.550000 \n", - "FriedPotatoes 14.940000 6.390000 1.0800 0.000000 \n", - "Milk 6.621667 6.053333 4.3500 0.000000 \n", - "WhiteBeansTomatoSauce 0.000000 5.600000 0.0000 2.800000 \n", - "MashedPotato 8.380000 5.020000 2.8000 0.000000 \n", - "RoastedVeggies 16.055000 4.930000 1.1900 4.015000 \n", - "BakedPotatoes 8.310000 4.830000 0.5900 0.000000 \n", - "WhiteBread 1.250000 4.700000 0.1500 0.550000 \n", - "GelatiPremium 17.890000 4.540000 11.0000 23.940000 \n", - "SobaChili 8.560000 4.510000 4.0500 5.520000 \n", - "DarkBread 0.650000 4.100000 0.1000 0.700000 \n", - "Watermelon 0.000000 3.660000 0.0000 36.600000 \n", - "KeishaCandy 12.950000 3.000000 6.6600 16.650000 \n", - "VanilliIceCream 5.670000 2.880000 3.6900 17.910000 \n", - "SeedAndOilSalad 9.520000 2.850000 0.7400 2.450000 \n", - "Hummus 9.875000 2.820000 1.1250 0.085000 \n", - "VahvlitortTallinn 22.950000 2.700000 0.0000 11.250000 \n", - "BiscuitRings 15.050000 2.300000 7.4000 11.550000 \n", - "Pringles 16.000000 2.300000 1.5000 1.200000 \n", - "MousseCherry 11.465000 2.045000 6.6800 9.890000 \n", - "Pomegranate 0.000000 1.700000 0.0000 14.000000 \n", - "SourCream 7.200000 1.680000 4.0200 2.400000 \n", - "Banana 0.450000 1.492500 0.0000 16.722500 \n", - "BoiledWokMix 4.870000 1.440000 0.3700 3.300000 \n", - "GelatelliVeganIceCream 13.210000 1.430000 9.9200 15.000000 \n", - "BerryMustikaVaarika 0.000000 0.950000 0.0000 7.200000 \n", - "Salad 0.120000 0.660000 0.0000 0.300000 \n", - "Cocoa 0.290000 0.480000 0.1500 7.660000 \n", - "CherryTomatoes 0.096000 0.430000 0.0000 1.280000 \n", - "Ketchup 0.000000 0.402857 0.0000 7.654286 \n", - "SaladDressing 8.920000 0.160000 0.6000 4.320000 \n", - "PureOrangeJuice 0.270000 0.110000 0.0000 12.595000 \n", - "Sugar 0.000000 0.000000 0.0000 18.333333 \n", - "Margarine 10.920000 0.000000 3.1200 0.000000 \n", - "SaskiaPeach 0.000000 0.000000 0.0000 9.733333 \n", - "PickleSlices 0.000000 0.000000 0.0000 4.080000 \n", - "Orange 0.000000 0.000000 0.0000 11.758333 \n", - "Oil 14.490000 0.000000 1.1025 0.000000 \n", - "Honey 0.000000 0.000000 0.0000 2.550000 \n", - "MonsterEnergy 0.000000 0.000000 0.0000 55.000000 \n", - "CocaCola 0.000000 0.000000 0.0000 34.980000 \n", - "\n", - " fiber \n", - "name \n", - "Omlette 1.650000 \n", - "OmletteWithoutMilk 0.600000 \n", - "LeipaJuusto 0.000000 \n", - "Egg 0.000000 \n", - "ProteinSpaghettiBolognese 11.845000 \n", - "ProteinRahka 0.000000 \n", - "MilkSoup 3.510000 \n", - "FakeChickenVeggies 3.920000 \n", - "CreamPotatoes 2.380000 \n", - "Pancake 1.400000 \n", - "Cheese 0.000000 \n", - "Blov 7.870000 \n", - "RainbowNoodles 0.000000 \n", - "Muesli 6.525000 \n", - "FakeChicken 0.000000 \n", - "OatmealPorridge 6.600000 \n", - "FriedFalafel 7.370000 \n", - "KauraTyynyt 4.290000 \n", - "TaffelJuustoSnaks 0.000000 \n", - "Oatmeal 5.500000 \n", - "FriedPotatoes 3.200000 \n", - "Milk 0.000000 \n", - "WhiteBeansTomatoSauce 0.000000 \n", - "MashedPotato 1.850000 \n", - "RoastedVeggies 4.565000 \n", - "BakedPotatoes 2.410000 \n", - "WhiteBread 3.050000 \n", - "GelatiPremium 0.000000 \n", - "SobaChili 0.000000 \n", - "DarkBread 5.850000 \n", - "Watermelon 2.440000 \n", - "KeishaCandy 0.000000 \n", - "VanilliIceCream 0.000000 \n", - "SeedAndOilSalad 0.770000 \n", - "Hummus 0.000000 \n", - "VahvlitortTallinn 0.000000 \n", - "BiscuitRings 0.000000 \n", - "Pringles 1.450000 \n", - "MousseCherry 0.000000 \n", - "Pomegranate 4.000000 \n", - "SourCream 0.000000 \n", - "Banana 3.555000 \n", - "BoiledWokMix 2.290000 \n", - "GelatelliVeganIceCream 0.000000 \n", - "BerryMustikaVaarika 4.700000 \n", - "Salad 0.000000 \n", - "Cocoa 0.000000 \n", - "CherryTomatoes 0.584000 \n", - "Ketchup 0.000000 \n", - "SaladDressing 0.000000 \n", - "PureOrangeJuice 0.000000 \n", - "Sugar 0.000000 \n", - "Margarine 0.000000 \n", - "SaskiaPeach 0.000000 \n", - "PickleSlices 0.000000 \n", - "Orange 3.043333 \n", - "Oil 0.000000 \n", - "Honey 0.000000 \n", - "MonsterEnergy 0.000000 \n", - "CocaCola 0.000000 " - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.groupby('name').mean().sort_values('protein', ascending=False)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.4" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/analyze.py b/analyze.py index dca9fc5..e9e8a04 100644 --- a/analyze.py +++ b/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) diff --git a/common.py b/common.py index bbb51cf..219b179 100644 --- a/common.py +++ b/common.py @@ -4,6 +4,9 @@ from datetime import datetime def parse_timestamp(timestamp): return datetime.strptime(timestamp, '%Y-%m-%d %H:%M:%S') +def format_timestamp(timestamp): + return datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S') + def parse_foods_file(): path = Path.home() / 'projects' / 'open-journal' / 'foods' text = path.read_text() @@ -79,4 +82,22 @@ def parse_foods_file(): return foods, recipes +def evaluate_food_entry(foods, recipes, value, name): + 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}') + + return food + diff --git a/foods b/foods index 04953fe..a43e5c0 100644 --- a/foods +++ b/foods @@ -1,4 +1,13 @@ +KauraPasta +Energy 359kcal +Fat 3.5g +SaturatedFat 0.7g +Carbs 65g +Sugar 2.9g +Fiber 6g +Protein 13g + Kaurakeksi Energy 461kcal Fat 20g @@ -892,3 +901,8 @@ SkimMilk 100g Margarine 20g TOTAL 788 +KauraPastaVeggies +Oil 40g +KauraPasta 500g +PeasCornPepper 450g +TOTAL 1720g diff --git a/search.py b/search.py index 8537e68..0eb06d8 100644 --- a/search.py +++ b/search.py @@ -1,24 +1,20 @@ -from pathlib import Path from subprocess import run -import re import sys +import json -entry_re = re.compile(r'^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})', re.MULTILINE) +from common import format_timestamp + +journal = json.load(open('journal.json')) matches = [] +keyword = sys.argv[1].lower() -for fpath in sorted((Path.home() / 'workspace' / 'journal').glob('*.md')): - header, *tmp = entry_re.split(fpath.read_text()) - entries = list(zip(tmp[::2], tmp[1::2])) - - for (timestamp, content) in sorted(entries, key=lambda x: x[0]): - content = '\n'.join( - part.replace('\n', ' ') - for part in content.split('\n\n') - ) - - if sys.argv[1].lower() in content.lower().split(): - matches.append((timestamp, content)) +for day, obj in journal.items(): + for entry in obj['entries']: + for block in entry['blocks']: + if isinstance(block, str): + if keyword in block.lower().split(): + matches.append((format_timestamp(entry['timestamp']), block)) buf = '' diff --git a/summary.py b/summary.py index 8205f51..06fac9c 100644 --- a/summary.py +++ b/summary.py @@ -1,49 +1,32 @@ -from pathlib import Path from datetime import datetime -from collections import Counter -from functools import reduce -import re -import string - +import json import sys -do_yesterday = len(sys.argv) > 1 - -from common import parse_foods_file - +from common import parse_foods_file, format_timestamp foods, recipes = parse_foods_file() -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]+)') - +do_yesterday = len(sys.argv) > 1 day_index = -2 if do_yesterday else -1 -current_day = list(sorted((Path.home() / 'workspace' / - 'journal').glob('*.md')))[day_index] +journal = json.load(open('journal.json')) -header, *tmp = entry_re.split(current_day.read_text()) -entries = list(zip(tmp[::2], tmp[1::2])) +current_day = list(journal)[day_index] daily_grams = 0.0 daily_calories = 0.0 daily_protein = 0.0 -for (timestamp, content) in sorted(entries, key=lambda x: x[0]): - content = '\n'.join( - part.replace('\n', ' ') - for part in content.split('\n\n') - ) - +for entry in journal[current_day]['entries']: has_printed = False entry_calories = 0.0 entry_protein = 0.0 - for diet in diet_re.finditer(content): + for diet in (b for b in entry['blocks'] if type(b) != str and b['type'] == 'diet'): if not has_printed: - print(f'-- {timestamp}') + print(f'-- {format_timestamp(entry["timestamp"])}') has_printed = True - - value, name = diet.groups() - value = float(value.removesuffix('g')) + + value = diet['amount'] + name = diet['food'] if name in recipes: food = recipes[name] @@ -58,8 +41,7 @@ for (timestamp, content) in sorted(entries, key=lambda x: x[0]): food = {k: v*(value/100.0) for k,v in foods[name].items()} else: - breakpoint() - print(f'ERROR: Invalid diet entry: {content}') + print(f'ERROR: Invalid diet entry: {diet}') continue protein = round(food.get('Protein', 0.0), 2)