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


receiving file list ... 
1 file to consider
.templog.phonon.log
     4061649 100%   13.88MB/s    0:00:00 (xfer#1, to-check=0/1)

sent 10230 bytes  received 1204183 bytes  485765.20 bytes/sec
total size is 4061649  speedup is 3.34
receiving file list ... 
1 file to consider
.uptime2.phonon.log
    14914705 100%   10.44MB/s    0:00:01 (xfer#1, to-check=0/1)

sent 42 bytes  received 14916663 bytes  5966682.00 bytes/sec
total size is 14914705  speedup is 1.00
X11 forwarding request failed on channel 5
Killed by signal 1.
X11 forwarding request failed on channel 5
Killed by signal 1.

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)


213771

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()


/Users/ajmendez/.local/anaconda/lib/python2.7/site-packages/matplotlib/figure.py:1644: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.
  warnings.warn("This figure includes Axes that are not "

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)


7678