In [ ]:
import os, sys
import inspect
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.dates import HourLocator, DateFormatter, AutoDateLocator
import datetime as dt
import pytz
import pandas as pd
import pdb
script_dir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
# add the path to opengrid to sys.path
sys.path.append(os.path.join(script_dir, os.pardir, os.pardir))
from opengrid.library import config
c = config.Config()
sys.path.append(c.get('tmpo', 'folder'))
import tmpo
try:
if os.path.exists(c.get('tmpo', 'data')):
path_to_tmpo_data = c.get('tmpo', 'data')
except:
path_to_tmpo_data = None
from opengrid.library.houseprint import houseprint
%matplotlib inline
plt.rcParams['figure.figsize']=14,8
In [ ]:
hp = houseprint.load_houseprint_from_file('new_houseprint.pkl')
hp.init_tmpo(path_to_tmpo_data=path_to_tmpo_data)
In [ ]:
chosen_type = 0
# 0 =water, 1 = gas, 2 = electricity
UtilityTypes = ['water', 'gas','electricity'] # {'water','gas','electricity'}
utility = UtilityTypes[chosen_type] # here 'electricity'
#default values:
FL_units = ['l/day', 'm^3/day ~ 10 kWh/day','Ws/day'] #TODO, to be checked!!
Base_Units = ['l/min', 'kW','kW']
Base_Corr = [1/24.0/60.0, 1/100.0/24.0/3.600 , 3.600/1000.0/24 ] #TODO,check validity of conversions!! # water => (l/day) to (l/hr), gas: (l/day) to (kW), elektr Ws/d to kW
tInt_Units = ['l', 'kWh','kWh'] #units after integration
tInt_Corr = [1/60, 3600/60, 3600/60] #TODO, to be checked!! # water => (l/hr) to (l_cumul/min), gas: kW to (kWh/min)
# units for this utility type
bUnit = Base_Units[chosen_type]
bCorr = Base_Corr[chosen_type]
fl_unit = FL_units[chosen_type]
tiUnit = tInt_Units[chosen_type]
tiCorr = tInt_Corr[chosen_type]
In [ ]:
#load data
print 'Loading', utility ,'-data and converting from ',fl_unit ,' to ',bUnit,':'
df = hp.get_data(sensortype=utility)
df = df.diff() #data is cumulative, we need to take the derivative
df = df[df>0] #filter out negative values
# conversion dependent on type of utility (to be checked!!)
df = df*bCorr
In [ ]:
# plot timeseries and load duration for each retained sensor
for sensor in df.columns:
FL = hp.find_sensor(sensor).device.key
plt.figure()
ax1=plt.subplot(121)
plt.plot_date(df.index, df[sensor], '-', label="{}".format(FL))
plt.ylabel("{}-usage [{}]".format(utility,bUnit) )
plt.legend()
ax2=plt.subplot(122)
plt.plot(np.sort(df[sensor])[::-1], label=sensor)
plt.ylabel("{}-load curve [{}]".format(utility,bUnit) )
plt.legend()
In [ ]:
#Date/Time library
from arrow import Arrow
#Prepare NVD3.js dependencies
from IPython import display as d
import nvd3
nvd3.ipynb.initialize_javascript(use_remote=True)
#Filter sensors and period
sensorlist = ['b28509eb97137e723995838c393d49df', '2923b75daf93e539e37ce5177c0008c5', 'a926bc966f178fc5d507a569a5bfc3d7']
df_water= df[sensorlist][Arrow(2015, 4, 1).datetime:Arrow(2015, 4, 2).datetime].dropna()
#Prepare chart name and timescale in epoch
chart_name = "{}-usage [{}]".format(utility,bUnit)
df_water["epoch"] = [(Arrow.fromdatetime(o) - Arrow(1970, 1, 1)).total_seconds()*1000 for o in df_water.index]
#Create NVD3 chart
water_chart = nvd3.lineChart(x_is_date=True,name=chart_name,height=450,width=800)
for sensor in sensorlist: # df.columns:
series_name = name="{}".format(hp.find_sensor(sensor).device.key)
water_chart.add_serie(name=series_name, x=list(df_water["epoch"]), y=list(df_water[sensor]))
water_chart
In [ ]:
start = pd.Timestamp('20150201')
end = pd.Timestamp('20150301')
In [ ]:
dfcum = hp.get_data(sensortype='electricity', head= start, tail = end)
In [ ]:
dfcum.shape
In [ ]:
dfcum.columns
In [ ]:
dfcum.tail()
In [ ]:
dfi = dfcum.resample(rule='900s', how='max')
dfi = dfi.interpolate(method='time')
dfi=dfi.diff()*3600/900
dfi.plot()
#dfi.ix['20150701'].plot()
In [ ]:
# This works, but is a bad idea if you have multiple sensors for a FLM: you obtain identical column names.
# df.rename(columns = hp.get_flukso_from_sensor, inplace=True)
In [ ]:
# Getting a single sensor
dfi['1a1dac9c2ac155f95c58bf1d4f4b7d01'].plot()
In [ ]: