Created
May 2, 2018 14:34
-
-
Save martinegginton/258855c1fc26aa6227080119007c2395 to your computer and use it in GitHub Desktop.
babycls.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Eventually a GUI to help Kaho! | |
import datetime as DT | |
import numpy as np | |
import pickle | |
import matplotlib.pyplot as plt | |
from matplotlib.dates import DateFormatter | |
import csv | |
import copy | |
class Baby(object): | |
description = 'kawai' # shared by all babies! | |
def __init__(self,*args,**kwargs): | |
#args -- tuple of annonymous args | |
#kwargs -- dictionary of named arguments | |
# specific to this baby | |
self.name = kwargs.get('name','') # return the name if exist otherwise '' | |
self.bday = kwargs.get('birthday',DT.date.today()) | |
self.fmt = {'pee':[],'poo':{},'c':[],'h':[],'s':{},'o':[],'sl':{}} | |
wgt = kwargs.get('weight',None) | |
if wgt is not None: | |
self.wgt = [(self.bday,wgt)] | |
else: | |
self.wgt = [] | |
self.tmp = [] | |
self.db = {'date':self.bday,'db':self.fmt} | |
self.itmlst = {'Pee':'pee','Poo':'poo','Temp':'t','Feed':'o','Bath':'h','Comment':'c','Special':'s','Weight':'w','Sleep':'sl'} | |
@classmethod | |
def enishi(cls): | |
nm = 'Enishi Irving' | |
bday = DT.date(2014,11,7) | |
wgt = 3072 | |
return cls(name=nm,birthday=bday,weight=wgt) | |
def save(self): | |
fid = open('baby.pkl','wb') | |
data = {'name':self.name, 'bday':self.bday,'wgt':self.wgt} | |
pickle.dump(data,fid) | |
fid.close() | |
def load(self): | |
fid = open('baby.pkl','rb') | |
data = pickle.load(fid) | |
self.name = data['name'] | |
self.bday = data['bday'] | |
self.wgt = data['wgt'] | |
def addWeight(self,d,w): | |
self.wgt.append((d,w)) | |
def addTemp(self,d,t,tmp): | |
ms = t.split(':') | |
nd = DT.datetime(d.year,d.month,d.day,int(ms[0]),int(ms[1])) | |
self.tmp.append((nd,tmp)) | |
def plotWgt(self): | |
fig = plt.figure() | |
ax = fig.add_subplot(111) | |
x = [date for (date,value) in self.wgt] | |
y = [value for (date, value) in self.wgt] | |
ax.plot_date(x,y) | |
ax.xaxis.set_major_formatter(DateFormatter('%d/%m')) | |
plt.savefig('baby_plot.png') | |
def plotSleep(self,aday): | |
if aday in self.db: | |
tm = np.asarray(self.db[aday]['sl']['time']) | |
st = np.asarray(self.db[aday]['sl']['asleep']) | |
tm_new = np.arange(0,1439,1) | |
st_new = np.cumsum(np.interp(tm_new,tm,st))/60 | |
fig = plt.figure() | |
ax = fig.add_subplot(111) | |
ax.plot(tm_new,st_new) | |
plt.xlim((0,1440)) | |
#locs,labels = plt.xticks() | |
locs = np.minimum((np.arange(0,12,1)*120),1439) | |
labels = [] | |
FMT = '%H:%M' | |
for itm in locs: | |
labels.append(DT.time(itm/60,itm%60).strftime(FMT)) | |
plt.xticks(locs,labels) | |
plt.ylabel('Total Sleep (hrs)') | |
plt.xlabel('Hours of day') | |
plt.title('Sleep on {}'.format(aday)) | |
plt.savefig('baby_plot.png') | |
def importDB(self,fname): | |
# reads a csv formatted database and overwrites the Baby | |
db = {DT.date.today():copy.copy(self.fmt)} | |
cases = {'poo': lambda x : poolist(x[1:len(x)-1]), | |
'pee': lambda x : peelist(x[1:len(x)-1]), | |
's': lambda x : slist(x[1:len(x)]), | |
'o': lambda x : peelist(x[1:len(x)-1]), # same format for oppai | |
'sl': lambda x : slplst(x[1:len(x)-1]), | |
'else': lambda x : 'non existant key'} | |
try: | |
fid = open(fname,'rb') | |
rdr = csv.reader(fid, delimiter=',', quotechar='|') | |
#print 'reader created' | |
for row in rdr: | |
#print row[0] | |
if row[0]=='d': | |
aday = DT.datetime.strptime(row[1],'%d/%m/%y').date() | |
db[aday] = copy.copy(self.fmt) | |
if row[0] in cases.keys(): | |
db[aday][row[0]] = cases[row[0]](row) | |
elif row[0]=='w': | |
wgt = row[1] | |
if wgt.isdigit(): self.addWeight(aday,int(wgt)) | |
elif row[0]=='t': | |
tmp = row[2] | |
if is_number(tmp): self.addTemp(aday,row[1],tmp) | |
elif (row[0]=='c')or(row[0]=='h'): | |
if not row[1]=='': db[aday][row[0]]=row[1] | |
else: | |
db[aday][row[0]] = 'not defined' | |
fid.close() | |
db.pop(DT.date.today()) | |
except: | |
print 'import failed' | |
self.db = db | |
def add(self,k,args): | |
dte = args[0] | |
if dte not in self.db.keys(): | |
self.db[dte] = copy.copy(self.fmt) | |
if k=='poo': | |
self.db[dte][k][args[1]] = args[2] | |
elif k=='pee': | |
self.db[dte][k].append(args[1]) | |
def peelist(row): | |
lst = [] | |
[lst.append(itm) for itm in row] | |
return lst | |
def poolist(row): | |
lst = {} | |
for i in range(int(len(row)/2)): | |
lst[row[i*2]] = row[i*2-1].replace("'","") | |
return lst | |
def slist(row): | |
lst = {'membo':[]} | |
i = 0 | |
while i<len(row): | |
if row[i]=='': | |
i=len(row) | |
break | |
elif row[i]=='membo': | |
lst['membo'].append(row[i+1]) | |
elif row[i]=='injection': | |
lst['injection'] = row[i+1] | |
i+=2 | |
return lst | |
def slplst(row): | |
if len(row)%2==0: | |
print row | |
FMT = '%H:%M' | |
mn = DT.datetime.strptime('0:00',FMT) | |
tm = row.pop(0) | |
tms = [(DT.datetime.strptime(tm,FMT)-mn).seconds/60] | |
flg = 1 | |
sts = [flg] | |
if tms[0]>2: | |
tms.insert(0,tms[0]-1) | |
tms.insert(0,0) | |
sts.insert(0,0) | |
sts.insert(0,0) | |
elif tms[0]==1: | |
tms[0]=0 | |
for itm in row: | |
if itm=='24:00': | |
itm='23:59' | |
tm = (DT.datetime.strptime(itm,FMT)-mn).seconds/60 | |
tms.append(tm-1) | |
tms.append(tm) | |
sts.append(flg) | |
flg = int(flg==0) | |
sts.append(flg) | |
return {'time':tms,'asleep':sts} | |
def is_number(s): | |
try: | |
float(s) | |
return True | |
except ValueError: | |
return False | |
if False: | |
e = Baby.enishi() | |
e.importDB('baby_data.csv') | |
aday = e.db.keys()[3] | |
e.plotSleep(aday) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment