add caching
This commit is contained in:
parent
e11cef6f91
commit
1fa1ead94d
1 changed files with 26 additions and 14 deletions
|
@ -1,13 +1,16 @@
|
||||||
from kython import json_load
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from os.path import join
|
from pathlib import Path
|
||||||
from functools import lru_cache
|
from functools import lru_cache
|
||||||
import logging
|
import logging
|
||||||
from datetime import timedelta, datetime, date
|
from datetime import timedelta, datetime, date
|
||||||
from typing import List, Dict, Iterator, NamedTuple
|
from typing import List, Dict, Iterator, NamedTuple
|
||||||
|
import json
|
||||||
|
|
||||||
from collections import OrderedDict as odict
|
from collections import OrderedDict as odict
|
||||||
|
|
||||||
|
from kython import cproperty
|
||||||
|
|
||||||
|
|
||||||
fromts = datetime.fromtimestamp
|
fromts = datetime.fromtimestamp
|
||||||
|
|
||||||
def get_logger():
|
def get_logger():
|
||||||
|
@ -16,7 +19,7 @@ def get_logger():
|
||||||
def hhmm(minutes):
|
def hhmm(minutes):
|
||||||
return '{:02d}:{:02d}'.format(*divmod(minutes, 60))
|
return '{:02d}:{:02d}'.format(*divmod(minutes, 60))
|
||||||
|
|
||||||
PATH = "/L/backups/emfit/"
|
PATH = Path("/L/backups/emfit")
|
||||||
|
|
||||||
EXCLUDED = [
|
EXCLUDED = [
|
||||||
'***REMOVED***', # pretty weird, detected sleep and HR (!) during the day when I was at work
|
'***REMOVED***', # pretty weird, detected sleep and HR (!) during the day when I was at work
|
||||||
|
@ -32,6 +35,9 @@ class Emfit:
|
||||||
self.sid = sid
|
self.sid = sid
|
||||||
self.jj = jj
|
self.jj = jj
|
||||||
|
|
||||||
|
def __hash__(self):
|
||||||
|
return hash(self.sid)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def hrv_morning(self):
|
def hrv_morning(self):
|
||||||
return self.jj['hrv_rmssd_morning']
|
return self.jj['hrv_rmssd_morning']
|
||||||
|
@ -41,14 +47,14 @@ class Emfit:
|
||||||
return self.jj['hrv_rmssd_evening']
|
return self.jj['hrv_rmssd_evening']
|
||||||
|
|
||||||
# ok, I guess that's reasonable way of defining sleep date
|
# ok, I guess that's reasonable way of defining sleep date
|
||||||
@property
|
@cproperty
|
||||||
def date(self):
|
def date(self):
|
||||||
return self.end.date()
|
return self.end.date()
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Bed time, not necessarily sleep
|
Bed time, not necessarily sleep
|
||||||
"""
|
"""
|
||||||
@property
|
@cproperty
|
||||||
def start(self):
|
def start(self):
|
||||||
return fromts(self.jj['time_start'])
|
return fromts(self.jj['time_start'])
|
||||||
|
|
||||||
|
@ -240,23 +246,29 @@ recovery: {self.recovery:3.0f}
|
||||||
expected = len(hrs)
|
expected = len(hrs)
|
||||||
return covered / expected * 100
|
return covered / expected * 100
|
||||||
|
|
||||||
|
|
||||||
|
import functools
|
||||||
|
|
||||||
|
@functools.lru_cache(1000) # TODO hmm. should I configure it dynamically???
|
||||||
|
def get_emfit(sid: str, f: Path) -> Emfit:
|
||||||
|
return Emfit(sid=sid, jj=json.loads(f.read_text()))
|
||||||
|
|
||||||
|
|
||||||
def iter_datas() -> Iterator[Emfit]:
|
def iter_datas() -> Iterator[Emfit]:
|
||||||
import os
|
for f in PATH.glob('*.json'):
|
||||||
for f in sorted(os.listdir(PATH)):
|
sid = f.stem
|
||||||
if not f.endswith('.json'):
|
|
||||||
continue
|
|
||||||
sid = f[:-len('.json')]
|
|
||||||
if sid in EXCLUDED:
|
if sid in EXCLUDED:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
with open(join(PATH, f), 'r') as fo:
|
yield get_emfit(sid, f)
|
||||||
ef = Emfit(sid, json_load(fo))
|
|
||||||
yield ef
|
|
||||||
|
|
||||||
|
|
||||||
|
# @functools.lru_cache()
|
||||||
def get_datas() -> List[Emfit]:
|
def get_datas() -> List[Emfit]:
|
||||||
return list(sorted(list(iter_datas()), key=lambda e: e.start))
|
return list(sorted(iter_datas(), key=lambda e: e.start))
|
||||||
# TODO move away old entries if there is a diff??
|
# TODO move away old entries if there is a diff??
|
||||||
|
|
||||||
|
|
||||||
from kython import group_by_key
|
from kython import group_by_key
|
||||||
def by_night() -> Dict[date, Emfit]:
|
def by_night() -> Dict[date, Emfit]:
|
||||||
logger = get_logger()
|
logger = get_logger()
|
||||||
|
|
Loading…
Add table
Reference in a new issue