Skip to content

Instantly share code, notes, and snippets.

@martinegginton
Created May 2, 2018 14:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save martinegginton/258855c1fc26aa6227080119007c2395 to your computer and use it in GitHub Desktop.
Save martinegginton/258855c1fc26aa6227080119007c2395 to your computer and use it in GitHub Desktop.
babycls.py
# 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