In [1]:
import os
import sys
import json
import pylab
import numpy as np
import matplotlib.ticker
from dateutil import parser
from scipy import interpolate
from matplotlib.dates import date2num
from datetime import timedelta, datetime
from pysurvey.plot import setup, dateticks, minmax, hcolorbar, line, icolorbar
In [2]:
%%bash
rsync -ravpP gphonon:.templog.phonon.log ~/.templog.phonon.log
rsync -ravpP gphonon:.uptime2.phonon.log ~/.uptime.phonon.log
# ../bin/get_temperature.sh
In [3]:
FILENAME = os.path.expanduser('/Users/ajmendez/.templog.phonon.log')
SEP = ' '
YR = [29,65]
TNORM = 40
In [4]:
def read_temps(filename=FILENAME):
out = []
with open(filename, 'r') as f:
lines = f.readlines()
for line in lines:
items = line.replace('\xc2\xb0C','').strip().split(SEP)
out.append(dict(date=datetime.fromtimestamp(int(items[0])),
temperature=float(items[1])))
return out
data = read_temps()
print len(data)
In [5]:
def get_continuum(dates, x, y, delta=2):
out = []
t = timedelta(hours=delta)
for d in dates:
ii = np.where( (date2num(x) > date2num(d-t) ) &
(date2num(x) <= date2num(d+t) ) )[0]
if len(ii) <= 20:
out.append(-1)
else:
out.append( np.mean(y[ii]) )
t = date2num(dates)
n = np.min(t)
tmp = np.array(out)
ii = np.where(tmp > 0)
f = interpolate.UnivariateSpline(date2num(dates[ii])-n,tmp[ii], s=4)
return f(t-n)
def get_continuum(dates, x, y, delta=5):
out = []
# t = timedelta(hours=delta)
tmp = date2num(x)
nd = date2num(dates)
for d in nd:
t = np.abs(tmp-d)
ii = np.where( t < delta/24.0)[0]
if len(ii) <= 20:
out.append(-1)
else:
out.append( np.mean(y[ii]) )
# out.append(np.min(y[ii]))
# return np.array(out)
tmp = np.array(out)
n = np.min(nd)
ii = np.where(tmp > 0)
f = interpolate.UnivariateSpline(nd[ii]-n,tmp[ii], s=4)
return f(nd-n)
dates, values = map(np.array, zip(*[(d['date'], d['temperature'])
for d in data]))
ndates = date2num(dates)
tmp = (ndates % 1.0)*24.0
ii = np.where((tmp > 0) & (tmp < 8))[0]
continuum = get_continuum(dates, dates[ii], values[ii])
In [6]:
def setupplot(secondax=False, **kwargs):
ytickv = np.linspace(YR[0],YR[1],6)
yticknames = map('{:0.0f}'.format, ytickv)
tmp = dict(
ylabel='Temperature [c]',
yr=minmax(ytickv), ytickv=ytickv,
yticknames=yticknames,
)
tmp.update(kwargs)
ax = setup(**tmp)
if secondax:
subplt = kwargs.get('subplt',None)
f = lambda x: '{:0.0f}'.format(1.8*x + 32.0)
yticknames = map(f, ytickv)
ax2 = ax.twinx()
ax2.set_ylabel(r"Temperature [F]")
ax2.set_ylim(minmax(ytickv))
ax2.yaxis.set_major_locator(matplotlib.ticker.FixedLocator(ytickv))
ax2.yaxis.set_major_formatter(matplotlib.ticker.FixedFormatter(yticknames))
pylab.sca(ax)
# setup(ax=ax.twinx(),
# subplt=subplt,
# ylabel='Temperature [F]',
# yr=minmax(ytickv), ytickv=ytickv, yticknames=yticknames)
return ax
In [7]:
def plot_temp():
setup(figsize=(12,6))
setupplot(subplt=(1,2,1), autoticks=True, xlabel='Date',)
pylab.plot(dates, values)
pylab.plot(dates[ii], values[ii], '.r')
pylab.plot(dates, continuum, '.k')
# plot_weather(np.min(date2num(dates)))
# pylab.plot(dates, values-continuum+38, '.r')
dateticks('%Y.%m.%d')
setupplot(subplt=(2,2,2), autoticks=False, xlabel='Hour of Day')
# pylab.plot(tmp, values, '.')
sc = pylab.scatter(tmp, values,
c=date2num(dates)-np.min(date2num(dates)), s=15,
marker='.', edgecolor='none',
label='Days since Start')
setupplot(subplt=(2,2,2), ylabel='', secondax=True)
setupplot(subplt=(2,2,4), autoticks=False, xlabel='Hour of Day')
sc = pylab.scatter(tmp, values-continuum+TNORM,
c=date2num(dates)-np.min(date2num(dates)), s=15,
marker='.', edgecolor='none',
label='Days since Start')
setupplot(subplt=(2,2,4), ylabel='', secondax=True)
# hcolorbar(sc, axes=[0.6, 0.4, 0.1, 0.01])
icolorbar(sc)
pylab.tight_layout()
pylab.show()
plot_temp()
In [8]:
def plot_recent(delta=48):
'''plot the last delta [48] hrs'''
now = datetime.now()
start = date2num(now - timedelta(hours=delta))
ii = np.where(ndates > start)[0]
print len(ii)
setup(figsize=(6,6))
# setupplot(secondax=True, title='Now:{}'.format(now))
# pylab.plot(dates[ii], values[ii])
nsmooth = 150
nend = 100
svalues = np.convolve(np.ones(nsmooth)/nsmooth, values[ii], mode='same')
pylab.plot(dates[ii][nend:-nend], svalues[nend:-nend])
# kk = np.where( (continuum[ii] > 30) & (continuum[ii] < 100) )
# pylab.plot(dates[ii][kk], continuum[ii][kk], '.k')
dateticks('%Y.%m.%d')
line(now+timedelta(hours=5)) # to gmt
plot_recent(128)