In [1]:
import numpy as np
import pandas as pd
from os.path import join
from pylab import rcParams
import matplotlib.pyplot as plt
%matplotlib inline
rcParams['figure.figsize'] = (16, 8)
import nilmtk
from nilmtk import DataSet, TimeFrame, MeterGroup, HDFDataStore
from nilmtk.disaggregate import CombinatorialOptimisation
from nilmtk.utils import print_dict
from nilmtk.metrics import f1_score
import seaborn as sns
sns.set_palette("Set3", n_colors=12)
import warnings
warnings.filterwarnings("ignore")
The full data set can be downloaded from the remote WikiEnergy database. The credentials are omitted here for security reasons.
In [2]:
# download_wikienergy(database_username, database_password, hdf_filename)
In [3]:
data_dir = '/home/nipun/Downloads/'
we = DataSet(join(data_dir, 'wikienergy.h5'))
print('loaded ' + str(len(we.buildings)) + ' buildings')
In [4]:
print_dict(we.metadata)
In [5]:
building_number = 11
print_dict(we.buildings[building_number].metadata)
In [6]:
elec = we.buildings[building_number].elec
elec.appliances
Out[6]:
In [7]:
elec.meters[1].when_on().next().head(100)
Out[7]:
In [8]:
we.store.window = TimeFrame(start='2014-04-01 00:00:00-05:00', end='2014-04-05 00:00:00-05:00')
#elec.plot();
In [9]:
sns.set_palette("Set3", n_colors=12)
elec.plot_when_on(on_power_threshold = 40)
Out[9]:
In [10]:
for meter in elec.meters:
meter.plot_lag(10)
plt.title(meter.appliance_label())
In [11]:
from pandas.tools.plotting import autocorrelation_plot
In [29]:
autocorrelation_plot(elec.meters[9].power_series().next())
Out[29]:
In [10]:
elec.mains().plot_spectrum()
Out[10]:
In [11]:
elec.mains().plot_autocorrelation();
In [37]:
meter.metadata.get('device').get('sample_period')
Out[37]:
In [29]:
fig, ax = plt.subplots()
for i, power in enumerate(elec.meters[9].power_series()):
print(i)
lag_plot(power, ax = ax)
In [17]:
lag_plot(elec.power_series().next())
Out[17]:
In [15]:
autocorrelation_plot(elec.power_series().next())
Out[15]:
In [16]:
elec.meters[1].plot_autocorrelation()
The energy consumed by each appliance can be expressed as a proportion of the household's total energy. Here we find the range of proportions for each fridge.
In [10]:
# Select a subset of fridges, otherwise the computation takes a long time
fridges_restricted = MeterGroup(fridges.meters[:5])
proportion_per_fridge = fridges_restricted.proportion_of_upstream_total_per_meter()
In [11]:
proportion_per_fridge.plot(kind='bar');
plt.title('fridge energy as proportion of total building energy');
plt.ylabel('proportion');
plt.xlabel('Fridge (<appliance instance>, <building instance>, <dataset name>)');
In [12]:
# How much energy does the largest-consuming fridge consume in kWh?
fridges.select(building=61).total_energy()
Out[12]:
In [13]:
fridges.select(building=61).plot();
In [14]:
fridges_restricted = MeterGroup(fridges.meters[:20])
daily_energy = pd.DataFrame([meter.average_energy_per_period(offset_alias='D')
for meter in fridges_restricted.meters])
daily_energy.plot(kind='hist');
plt.title('Histogram of daily fridge energy');
plt.xlabel('energy (kWh)');
plt.ylabel('occurences');
plt.legend().set_visible(False)
In [15]:
we.store.window = TimeFrame(start='2014-04-01 00:00:00-05:00', end='2014-04-03 00:00:00-05:00')
elec.plot();
In [19]:
elec.plot_when_on()
Out[19]:
In [15]:
fraction = elec.submeters().fraction_per_meter().dropna()
In [16]:
elec.clear_cache()
In [17]:
elec.submeters().fraction_per_meter()
Out[17]:
In [18]:
elec.submeters().fraction_per_meter()
Out[18]:
In [19]:
# Create convenient labels
labels = elec.get_appliance_labels(fraction.index)
plt.figure(figsize=(8,8))
fraction.plot(kind='pie', labels=labels);
In [20]:
elec.select_using_appliances(category='heating')
Out[20]:
In [21]:
# Find all appliances with a particular type of motor
elec.select_using_appliances(category='single-phase induction motor')
Out[21]:
In [22]:
# Train
co = CombinatorialOptimisation()
co.train(elec)
In [23]:
for model in co.model:
print_dict(model)
In [24]:
# Disaggregate
disag_filename = join(data_dir, 'wikienergy-disag.h5')
output = HDFDataStore(disag_filename, 'w')
co.disaggregate(elec.mains(), output)
output.close()
In [25]:
disag = DataSet(disag_filename)
disag_elec = disag.buildings[building_number].elec
disag_elec.plot()
disag.store.close()
In [26]:
disag = DataSet(disag_filename)
disag_elec = disag.buildings[building_number].elec
f1 = f1_score(disag_elec, elec)
f1.index = disag_elec.get_appliance_labels(f1.index)
f1.plot(kind='bar')
plt.xlabel('appliance');
plt.ylabel('f-score');
disag.store.close()
In [26]: