Files
seq2seq-time/notebooks/RNN_Timeseries_Seq2Seq.ipynb
T
2020-10-18 14:12:53 +08:00

3023 lines
152 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-10T01:25:12.788851Z",
"start_time": "2020-10-10T01:25:12.783398Z"
}
},
"source": [
"# Sequence to Sequence Models for Timeseries Regression\n",
"\n",
"\n",
"In this notebook we are going to tackle a harder problem: \n",
"- predicting the future on a timeseries\n",
"- using an LSTM\n",
"- with rough uncertainty (uncalibrated)\n",
"- outputing sequence of predictions\n",
"\n",
"<img src=\"../reports/figures/Seq2Seq for regression.png\" />\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"- [ ] TODO mike autocorrelation baseline\n",
"- [x] TODO mike acorn data\n",
"- [ ] TODO mike handle multiple houses. Multiindex"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T05:54:18.887427Z",
"start_time": "2020-10-18T05:54:18.458609Z"
}
},
"outputs": [],
"source": [
"# OPTIONAL: Load the \"autoreload\" extension so that code can change. But blacklist large modules\n",
"%load_ext autoreload\n",
"%autoreload 2\n",
"%aimport -pandas\n",
"%aimport -torch\n",
"%aimport -numpy\n",
"%aimport -matplotlib\n",
"%aimport -dask\n",
"%aimport -tqdm\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T05:54:19.908725Z",
"start_time": "2020-10-18T05:54:18.889783Z"
}
},
"outputs": [],
"source": [
"# Imports\n",
"import torch\n",
"from torch import nn, optim\n",
"from torch.nn import functional as F\n",
"from torch.autograd import Variable\n",
"import torch\n",
"import torch.utils.data\n",
"\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from pathlib import Path\n",
"from tqdm.auto import tqdm\n",
"\n",
"import pytorch_lightning as pl"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T05:55:10.980981Z",
"start_time": "2020-10-18T05:55:10.892778Z"
}
},
"outputs": [],
"source": [
"from seq2seq_time.data.dataset import Seq2SeqDataSet\n",
"from seq2seq_time.predict import predict"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T05:55:11.511921Z",
"start_time": "2020-10-18T05:55:11.469331Z"
}
},
"outputs": [],
"source": [
"import logging, sys\n",
"logging.basicConfig(stream=sys.stdout, level=logging.INFO)"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-10T01:28:32.492160Z",
"start_time": "2020-10-10T01:28:32.488140Z"
}
},
"source": [
"## Parameters"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T05:55:11.910208Z",
"start_time": "2020-10-18T05:55:11.830517Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"using cuda\n"
]
}
],
"source": [
"device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n",
"print(f'using {device}')\n",
"\n",
"columns_target=['energy(kWh/hh)']\n",
"window_past = 48*4\n",
"window_future = 48*4\n",
"batch_size = 64\n",
"num_workers = 0\n",
"freq = '30T'\n",
"max_rows = 1e5"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load data"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:09:38.090802Z",
"start_time": "2020-10-18T06:09:38.044605Z"
},
"lines_to_next_cell": 0
},
"outputs": [],
"source": [
"\n",
"def get_smartmeter_df(indir=Path('../data/raw/smart-meters-in-london'), max_files=1):\n",
" \"\"\"\n",
" Data loading and cleanding is always messy, so understand this code is optional.\n",
" \"\"\"\n",
" \n",
" # Load csv files\n",
" csv_files = sorted((indir/'halfhourly_dataset').glob('*.csv'))[:max_files]\n",
" \n",
" # concatendate them\n",
" df = pd.concat([pd.read_csv(f, parse_dates=[1], na_values=['Null']) for f in csv_files])\n",
" \n",
" # Add ACORN categories\n",
" df_households = pd.read_csv(indir/'informations_households.csv')\n",
" df_households = df_households[['LCLid', 'stdorToU', 'Acorn_grouped']]\n",
" df = pd.merge(df, df_households, on='LCLid')\n",
" \n",
" df = df.set_index('tstp')\n",
" \n",
" # Drop nan and 0's\n",
" df = df[df['energy(kWh/hh)']!=0]\n",
" df = df.dropna()\n",
" \n",
" # Add time features \n",
" time = df.index.to_series()\n",
" df[\"month\"] = time.dt.month\n",
" df['day'] = time.dt.day\n",
" df['week'] = time.dt.week\n",
" df['hour'] = time.dt.hour\n",
" df['minute'] = time.dt.minute\n",
" df['dayofweek'] = time.dt.dayofweek\n",
" \n",
" # Load weather data\n",
" df_weather = pd.read_csv(indir/'weather_hourly_darksky.csv', parse_dates=[3])\n",
" use_cols = ['visibility', 'windBearing', 'temperature', 'time', 'dewPoint',\n",
" 'pressure', 'apparentTemperature', 'windSpeed', \n",
" 'humidity']\n",
" df_weather = df_weather[use_cols].set_index('time')\n",
" df_weather = df_weather.resample(freq).first().ffill() # Resample to match energy data \n",
" \n",
" # Join weather and energy data\n",
" df = pd.merge(df, df_weather, how='inner', left_index=True, right_index=True, sort=True)\n",
" \n",
" # Holidays\n",
" df_hols = pd.read_csv(indir/'uk_bank_holidays.csv', parse_dates=[0])\n",
" holidays = set(df_hols['Bank holidays'].dt.round('D')) \n",
" def is_holiday(dt):\n",
" return dt in holidays\n",
" days = df.index.floor('D')\n",
" holiday_mapping = days.unique().to_series().apply(is_holiday).astype(int).to_dict()\n",
" df['holiday'] = days.to_series().map(holiday_mapping).values\n",
"\n",
" # Loop over houses\n",
" for name, df_h in df.groupby('LCLid'):\n",
"\n",
" yield df_h"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our dataset is the london smartmeter data. But at half hour intervals"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:09:42.586813Z",
"start_time": "2020-10-18T06:09:38.985189Z"
},
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/wassname/anaconda/envs/seq2seq-time/lib/python3.7/site-packages/ipykernel_launcher.py:27: FutureWarning: Series.dt.weekofyear and Series.dt.week have been deprecated. Please use Series.dt.isocalendar().week instead.\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>LCLid</th>\n",
" <th>energy(kWh/hh)</th>\n",
" <th>stdorToU</th>\n",
" <th>Acorn_grouped</th>\n",
" <th>month</th>\n",
" <th>day</th>\n",
" <th>week</th>\n",
" <th>hour</th>\n",
" <th>minute</th>\n",
" <th>dayofweek</th>\n",
" <th>visibility</th>\n",
" <th>windBearing</th>\n",
" <th>temperature</th>\n",
" <th>dewPoint</th>\n",
" <th>pressure</th>\n",
" <th>apparentTemperature</th>\n",
" <th>windSpeed</th>\n",
" <th>humidity</th>\n",
" <th>holiday</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2012-10-12 11:30:00</th>\n",
" <td>MAC000002</td>\n",
" <td>0.143</td>\n",
" <td>Std</td>\n",
" <td>Affluent</td>\n",
" <td>10</td>\n",
" <td>12</td>\n",
" <td>41</td>\n",
" <td>11</td>\n",
" <td>30</td>\n",
" <td>4</td>\n",
" <td>13.52</td>\n",
" <td>267.0</td>\n",
" <td>12.59</td>\n",
" <td>4.48</td>\n",
" <td>1007.25</td>\n",
" <td>12.59</td>\n",
" <td>6.96</td>\n",
" <td>0.58</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-12 12:00:00</th>\n",
" <td>MAC000002</td>\n",
" <td>0.663</td>\n",
" <td>Std</td>\n",
" <td>Affluent</td>\n",
" <td>10</td>\n",
" <td>12</td>\n",
" <td>41</td>\n",
" <td>12</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>13.52</td>\n",
" <td>260.0</td>\n",
" <td>13.86</td>\n",
" <td>4.32</td>\n",
" <td>1007.37</td>\n",
" <td>13.86</td>\n",
" <td>6.92</td>\n",
" <td>0.53</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-12 12:30:00</th>\n",
" <td>MAC000002</td>\n",
" <td>0.256</td>\n",
" <td>Std</td>\n",
" <td>Affluent</td>\n",
" <td>10</td>\n",
" <td>12</td>\n",
" <td>41</td>\n",
" <td>12</td>\n",
" <td>30</td>\n",
" <td>4</td>\n",
" <td>13.52</td>\n",
" <td>260.0</td>\n",
" <td>13.86</td>\n",
" <td>4.32</td>\n",
" <td>1007.37</td>\n",
" <td>13.86</td>\n",
" <td>6.92</td>\n",
" <td>0.53</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-12 13:00:00</th>\n",
" <td>MAC000002</td>\n",
" <td>0.155</td>\n",
" <td>Std</td>\n",
" <td>Affluent</td>\n",
" <td>10</td>\n",
" <td>12</td>\n",
" <td>41</td>\n",
" <td>13</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>13.52</td>\n",
" <td>253.0</td>\n",
" <td>13.99</td>\n",
" <td>4.48</td>\n",
" <td>1007.54</td>\n",
" <td>13.99</td>\n",
" <td>7.00</td>\n",
" <td>0.53</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-12 13:30:00</th>\n",
" <td>MAC000002</td>\n",
" <td>0.199</td>\n",
" <td>Std</td>\n",
" <td>Affluent</td>\n",
" <td>10</td>\n",
" <td>12</td>\n",
" <td>41</td>\n",
" <td>13</td>\n",
" <td>30</td>\n",
" <td>4</td>\n",
" <td>13.52</td>\n",
" <td>253.0</td>\n",
" <td>13.99</td>\n",
" <td>4.48</td>\n",
" <td>1007.54</td>\n",
" <td>13.99</td>\n",
" <td>7.00</td>\n",
" <td>0.53</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-27 22:00:00</th>\n",
" <td>MAC000002</td>\n",
" <td>0.416</td>\n",
" <td>Std</td>\n",
" <td>Affluent</td>\n",
" <td>2</td>\n",
" <td>27</td>\n",
" <td>9</td>\n",
" <td>22</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>14.00</td>\n",
" <td>216.0</td>\n",
" <td>4.10</td>\n",
" <td>1.64</td>\n",
" <td>1005.67</td>\n",
" <td>1.41</td>\n",
" <td>3.02</td>\n",
" <td>0.84</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-27 22:30:00</th>\n",
" <td>MAC000002</td>\n",
" <td>1.350</td>\n",
" <td>Std</td>\n",
" <td>Affluent</td>\n",
" <td>2</td>\n",
" <td>27</td>\n",
" <td>9</td>\n",
" <td>22</td>\n",
" <td>30</td>\n",
" <td>3</td>\n",
" <td>14.00</td>\n",
" <td>216.0</td>\n",
" <td>4.10</td>\n",
" <td>1.64</td>\n",
" <td>1005.67</td>\n",
" <td>1.41</td>\n",
" <td>3.02</td>\n",
" <td>0.84</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-27 23:00:00</th>\n",
" <td>MAC000002</td>\n",
" <td>1.247</td>\n",
" <td>Std</td>\n",
" <td>Affluent</td>\n",
" <td>2</td>\n",
" <td>27</td>\n",
" <td>9</td>\n",
" <td>23</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>14.03</td>\n",
" <td>200.0</td>\n",
" <td>3.93</td>\n",
" <td>1.61</td>\n",
" <td>1004.62</td>\n",
" <td>1.42</td>\n",
" <td>2.75</td>\n",
" <td>0.85</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-27 23:30:00</th>\n",
" <td>MAC000002</td>\n",
" <td>1.218</td>\n",
" <td>Std</td>\n",
" <td>Affluent</td>\n",
" <td>2</td>\n",
" <td>27</td>\n",
" <td>9</td>\n",
" <td>23</td>\n",
" <td>30</td>\n",
" <td>3</td>\n",
" <td>14.03</td>\n",
" <td>200.0</td>\n",
" <td>3.93</td>\n",
" <td>1.61</td>\n",
" <td>1004.62</td>\n",
" <td>1.42</td>\n",
" <td>2.75</td>\n",
" <td>0.85</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-28 00:00:00</th>\n",
" <td>MAC000002</td>\n",
" <td>1.387</td>\n",
" <td>Std</td>\n",
" <td>Affluent</td>\n",
" <td>2</td>\n",
" <td>28</td>\n",
" <td>9</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>12.63</td>\n",
" <td>190.0</td>\n",
" <td>3.81</td>\n",
" <td>1.53</td>\n",
" <td>1003.57</td>\n",
" <td>1.47</td>\n",
" <td>2.53</td>\n",
" <td>0.85</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>24119 rows × 19 columns</p>\n",
"</div>"
],
"text/plain": [
" LCLid energy(kWh/hh) stdorToU Acorn_grouped month \\\n",
"2012-10-12 11:30:00 MAC000002 0.143 Std Affluent 10 \n",
"2012-10-12 12:00:00 MAC000002 0.663 Std Affluent 10 \n",
"2012-10-12 12:30:00 MAC000002 0.256 Std Affluent 10 \n",
"2012-10-12 13:00:00 MAC000002 0.155 Std Affluent 10 \n",
"2012-10-12 13:30:00 MAC000002 0.199 Std Affluent 10 \n",
"... ... ... ... ... ... \n",
"2014-02-27 22:00:00 MAC000002 0.416 Std Affluent 2 \n",
"2014-02-27 22:30:00 MAC000002 1.350 Std Affluent 2 \n",
"2014-02-27 23:00:00 MAC000002 1.247 Std Affluent 2 \n",
"2014-02-27 23:30:00 MAC000002 1.218 Std Affluent 2 \n",
"2014-02-28 00:00:00 MAC000002 1.387 Std Affluent 2 \n",
"\n",
" day week hour minute dayofweek visibility \\\n",
"2012-10-12 11:30:00 12 41 11 30 4 13.52 \n",
"2012-10-12 12:00:00 12 41 12 0 4 13.52 \n",
"2012-10-12 12:30:00 12 41 12 30 4 13.52 \n",
"2012-10-12 13:00:00 12 41 13 0 4 13.52 \n",
"2012-10-12 13:30:00 12 41 13 30 4 13.52 \n",
"... ... ... ... ... ... ... \n",
"2014-02-27 22:00:00 27 9 22 0 3 14.00 \n",
"2014-02-27 22:30:00 27 9 22 30 3 14.00 \n",
"2014-02-27 23:00:00 27 9 23 0 3 14.03 \n",
"2014-02-27 23:30:00 27 9 23 30 3 14.03 \n",
"2014-02-28 00:00:00 28 9 0 0 4 12.63 \n",
"\n",
" windBearing temperature dewPoint pressure \\\n",
"2012-10-12 11:30:00 267.0 12.59 4.48 1007.25 \n",
"2012-10-12 12:00:00 260.0 13.86 4.32 1007.37 \n",
"2012-10-12 12:30:00 260.0 13.86 4.32 1007.37 \n",
"2012-10-12 13:00:00 253.0 13.99 4.48 1007.54 \n",
"2012-10-12 13:30:00 253.0 13.99 4.48 1007.54 \n",
"... ... ... ... ... \n",
"2014-02-27 22:00:00 216.0 4.10 1.64 1005.67 \n",
"2014-02-27 22:30:00 216.0 4.10 1.64 1005.67 \n",
"2014-02-27 23:00:00 200.0 3.93 1.61 1004.62 \n",
"2014-02-27 23:30:00 200.0 3.93 1.61 1004.62 \n",
"2014-02-28 00:00:00 190.0 3.81 1.53 1003.57 \n",
"\n",
" apparentTemperature windSpeed humidity holiday \n",
"2012-10-12 11:30:00 12.59 6.96 0.58 0 \n",
"2012-10-12 12:00:00 13.86 6.92 0.53 0 \n",
"2012-10-12 12:30:00 13.86 6.92 0.53 0 \n",
"2012-10-12 13:00:00 13.99 7.00 0.53 0 \n",
"2012-10-12 13:30:00 13.99 7.00 0.53 0 \n",
"... ... ... ... ... \n",
"2014-02-27 22:00:00 1.41 3.02 0.84 0 \n",
"2014-02-27 22:30:00 1.41 3.02 0.84 0 \n",
"2014-02-27 23:00:00 1.42 2.75 0.85 0 \n",
"2014-02-27 23:30:00 1.42 2.75 0.85 0 \n",
"2014-02-28 00:00:00 1.47 2.53 0.85 0 \n",
"\n",
"[24119 rows x 19 columns]"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfs = get_smartmeter_df()\n",
"\n",
"# Just get the first one for now\n",
"df = next(iter(dfs))\n",
"\n",
"# df = df.resample(freq).first().dropna() # Where empty we will backfill, this will respect causality, and mostly maintain the mean\n",
"\n",
"df = df.tail(int(max_rows)).copy() # Just use last X rows\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:07.809434Z",
"start_time": "2020-10-18T06:10:07.675919Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>energy(kWh/hh)</th>\n",
" <th>month</th>\n",
" <th>day</th>\n",
" <th>week</th>\n",
" <th>hour</th>\n",
" <th>minute</th>\n",
" <th>dayofweek</th>\n",
" <th>visibility</th>\n",
" <th>windBearing</th>\n",
" <th>temperature</th>\n",
" <th>dewPoint</th>\n",
" <th>pressure</th>\n",
" <th>apparentTemperature</th>\n",
" <th>windSpeed</th>\n",
" <th>humidity</th>\n",
" <th>holiday</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" <td>24119.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>0.252733</td>\n",
" <td>6.672416</td>\n",
" <td>15.899623</td>\n",
" <td>27.084746</td>\n",
" <td>11.504664</td>\n",
" <td>14.999378</td>\n",
" <td>2.999129</td>\n",
" <td>11.132308</td>\n",
" <td>193.259215</td>\n",
" <td>9.896434</td>\n",
" <td>6.069227</td>\n",
" <td>1012.490613</td>\n",
" <td>8.446964</td>\n",
" <td>4.000070</td>\n",
" <td>0.786521</td>\n",
" <td>0.021891</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>0.247079</td>\n",
" <td>3.881916</td>\n",
" <td>8.744709</td>\n",
" <td>16.913482</td>\n",
" <td>6.922411</td>\n",
" <td>15.000311</td>\n",
" <td>2.002766</td>\n",
" <td>3.143717</td>\n",
" <td>92.104725</td>\n",
" <td>5.940428</td>\n",
" <td>5.195058</td>\n",
" <td>11.420208</td>\n",
" <td>7.175969</td>\n",
" <td>2.103774</td>\n",
" <td>0.138358</td>\n",
" <td>0.146332</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>0.065000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.270000</td>\n",
" <td>0.000000</td>\n",
" <td>-3.860000</td>\n",
" <td>-8.920000</td>\n",
" <td>975.740000</td>\n",
" <td>-8.880000</td>\n",
" <td>0.040000</td>\n",
" <td>0.230000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>0.112000</td>\n",
" <td>3.000000</td>\n",
" <td>8.000000</td>\n",
" <td>10.000000</td>\n",
" <td>6.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1.000000</td>\n",
" <td>9.960000</td>\n",
" <td>115.000000</td>\n",
" <td>5.640000</td>\n",
" <td>2.240000</td>\n",
" <td>1005.470000</td>\n",
" <td>2.980000</td>\n",
" <td>2.450000</td>\n",
" <td>0.710000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>0.158000</td>\n",
" <td>7.000000</td>\n",
" <td>16.000000</td>\n",
" <td>28.000000</td>\n",
" <td>12.000000</td>\n",
" <td>0.000000</td>\n",
" <td>3.000000</td>\n",
" <td>12.130000</td>\n",
" <td>214.000000</td>\n",
" <td>9.140000</td>\n",
" <td>6.040000</td>\n",
" <td>1013.450000</td>\n",
" <td>7.120000</td>\n",
" <td>3.760000</td>\n",
" <td>0.820000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>0.286000</td>\n",
" <td>10.000000</td>\n",
" <td>23.000000</td>\n",
" <td>43.000000</td>\n",
" <td>18.000000</td>\n",
" <td>30.000000</td>\n",
" <td>5.000000</td>\n",
" <td>13.070000</td>\n",
" <td>255.000000</td>\n",
" <td>13.670000</td>\n",
" <td>9.840000</td>\n",
" <td>1020.550000</td>\n",
" <td>13.670000</td>\n",
" <td>5.200000</td>\n",
" <td>0.890000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>2.994000</td>\n",
" <td>12.000000</td>\n",
" <td>31.000000</td>\n",
" <td>52.000000</td>\n",
" <td>23.000000</td>\n",
" <td>30.000000</td>\n",
" <td>6.000000</td>\n",
" <td>16.090000</td>\n",
" <td>359.000000</td>\n",
" <td>32.400000</td>\n",
" <td>18.950000</td>\n",
" <td>1040.130000</td>\n",
" <td>32.420000</td>\n",
" <td>14.800000</td>\n",
" <td>1.000000</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" energy(kWh/hh) month day week hour \\\n",
"count 24119.000000 24119.000000 24119.000000 24119.000000 24119.000000 \n",
"mean 0.252733 6.672416 15.899623 27.084746 11.504664 \n",
"std 0.247079 3.881916 8.744709 16.913482 6.922411 \n",
"min 0.065000 1.000000 1.000000 1.000000 0.000000 \n",
"25% 0.112000 3.000000 8.000000 10.000000 6.000000 \n",
"50% 0.158000 7.000000 16.000000 28.000000 12.000000 \n",
"75% 0.286000 10.000000 23.000000 43.000000 18.000000 \n",
"max 2.994000 12.000000 31.000000 52.000000 23.000000 \n",
"\n",
" minute dayofweek visibility windBearing temperature \\\n",
"count 24119.000000 24119.000000 24119.000000 24119.000000 24119.000000 \n",
"mean 14.999378 2.999129 11.132308 193.259215 9.896434 \n",
"std 15.000311 2.002766 3.143717 92.104725 5.940428 \n",
"min 0.000000 0.000000 0.270000 0.000000 -3.860000 \n",
"25% 0.000000 1.000000 9.960000 115.000000 5.640000 \n",
"50% 0.000000 3.000000 12.130000 214.000000 9.140000 \n",
"75% 30.000000 5.000000 13.070000 255.000000 13.670000 \n",
"max 30.000000 6.000000 16.090000 359.000000 32.400000 \n",
"\n",
" dewPoint pressure apparentTemperature windSpeed \\\n",
"count 24119.000000 24119.000000 24119.000000 24119.000000 \n",
"mean 6.069227 1012.490613 8.446964 4.000070 \n",
"std 5.195058 11.420208 7.175969 2.103774 \n",
"min -8.920000 975.740000 -8.880000 0.040000 \n",
"25% 2.240000 1005.470000 2.980000 2.450000 \n",
"50% 6.040000 1013.450000 7.120000 3.760000 \n",
"75% 9.840000 1020.550000 13.670000 5.200000 \n",
"max 18.950000 1040.130000 32.420000 14.800000 \n",
"\n",
" humidity holiday \n",
"count 24119.000000 24119.000000 \n",
"mean 0.786521 0.021891 \n",
"std 0.138358 0.146332 \n",
"min 0.230000 0.000000 \n",
"25% 0.710000 0.000000 \n",
"50% 0.820000 0.000000 \n",
"75% 0.890000 0.000000 \n",
"max 1.000000 1.000000 "
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.describe()"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:08.215379Z",
"start_time": "2020-10-18T06:10:08.056587Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>energy(kWh/hh)</th>\n",
" <th>month</th>\n",
" <th>day</th>\n",
" <th>week</th>\n",
" <th>hour</th>\n",
" <th>minute</th>\n",
" <th>dayofweek</th>\n",
" <th>visibility</th>\n",
" <th>windBearing</th>\n",
" <th>temperature</th>\n",
" <th>dewPoint</th>\n",
" <th>pressure</th>\n",
" <th>apparentTemperature</th>\n",
" <th>windSpeed</th>\n",
" <th>humidity</th>\n",
" <th>holiday</th>\n",
" <th>Acorn_grouped</th>\n",
" <th>LCLid</th>\n",
" <th>stdorToU</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2012-10-12 11:30:00</th>\n",
" <td>-0.444130</td>\n",
" <td>0.857219</td>\n",
" <td>-0.445950</td>\n",
" <td>0.822749</td>\n",
" <td>-0.072904</td>\n",
" <td>1.000041</td>\n",
" <td>0.499755</td>\n",
" <td>0.759528</td>\n",
" <td>0.800636</td>\n",
" <td>0.453439</td>\n",
" <td>-0.305918</td>\n",
" <td>-0.458899</td>\n",
" <td>0.577361</td>\n",
" <td>1.406991</td>\n",
" <td>-1.492695</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-12 12:00:00</th>\n",
" <td>1.660500</td>\n",
" <td>0.857219</td>\n",
" <td>-0.445950</td>\n",
" <td>0.822749</td>\n",
" <td>0.071557</td>\n",
" <td>-0.999959</td>\n",
" <td>0.499755</td>\n",
" <td>0.759528</td>\n",
" <td>0.724633</td>\n",
" <td>0.667233</td>\n",
" <td>-0.336717</td>\n",
" <td>-0.448391</td>\n",
" <td>0.754344</td>\n",
" <td>1.387977</td>\n",
" <td>-1.854084</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-12 12:30:00</th>\n",
" <td>0.013222</td>\n",
" <td>0.857219</td>\n",
" <td>-0.445950</td>\n",
" <td>0.822749</td>\n",
" <td>0.071557</td>\n",
" <td>1.000041</td>\n",
" <td>0.499755</td>\n",
" <td>0.759528</td>\n",
" <td>0.724633</td>\n",
" <td>0.667233</td>\n",
" <td>-0.336717</td>\n",
" <td>-0.448391</td>\n",
" <td>0.754344</td>\n",
" <td>1.387977</td>\n",
" <td>-1.854084</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-12 13:00:00</th>\n",
" <td>-0.395562</td>\n",
" <td>0.857219</td>\n",
" <td>-0.445950</td>\n",
" <td>0.822749</td>\n",
" <td>0.216018</td>\n",
" <td>-0.999959</td>\n",
" <td>0.499755</td>\n",
" <td>0.759528</td>\n",
" <td>0.648631</td>\n",
" <td>0.689117</td>\n",
" <td>-0.305918</td>\n",
" <td>-0.433505</td>\n",
" <td>0.772460</td>\n",
" <td>1.426005</td>\n",
" <td>-1.854084</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-12 13:30:00</th>\n",
" <td>-0.217478</td>\n",
" <td>0.857219</td>\n",
" <td>-0.445950</td>\n",
" <td>0.822749</td>\n",
" <td>0.216018</td>\n",
" <td>1.000041</td>\n",
" <td>0.499755</td>\n",
" <td>0.759528</td>\n",
" <td>0.648631</td>\n",
" <td>0.689117</td>\n",
" <td>-0.305918</td>\n",
" <td>-0.433505</td>\n",
" <td>0.772460</td>\n",
" <td>1.426005</td>\n",
" <td>-1.854084</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-27 22:00:00</th>\n",
" <td>0.660800</td>\n",
" <td>-1.203661</td>\n",
" <td>1.269408</td>\n",
" <td>-1.069273</td>\n",
" <td>1.516170</td>\n",
" <td>-0.999959</td>\n",
" <td>0.000435</td>\n",
" <td>0.912217</td>\n",
" <td>0.246907</td>\n",
" <td>-0.975781</td>\n",
" <td>-0.852602</td>\n",
" <td>-0.597253</td>\n",
" <td>-0.980649</td>\n",
" <td>-0.465873</td>\n",
" <td>0.386532</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-27 22:30:00</th>\n",
" <td>4.441040</td>\n",
" <td>-1.203661</td>\n",
" <td>1.269408</td>\n",
" <td>-1.069273</td>\n",
" <td>1.516170</td>\n",
" <td>1.000041</td>\n",
" <td>0.000435</td>\n",
" <td>0.912217</td>\n",
" <td>0.246907</td>\n",
" <td>-0.975781</td>\n",
" <td>-0.852602</td>\n",
" <td>-0.597253</td>\n",
" <td>-0.980649</td>\n",
" <td>-0.465873</td>\n",
" <td>0.386532</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-27 23:00:00</th>\n",
" <td>4.024161</td>\n",
" <td>-1.203661</td>\n",
" <td>1.269408</td>\n",
" <td>-1.069273</td>\n",
" <td>1.660631</td>\n",
" <td>-0.999959</td>\n",
" <td>0.000435</td>\n",
" <td>0.921760</td>\n",
" <td>0.073188</td>\n",
" <td>-1.004399</td>\n",
" <td>-0.858377</td>\n",
" <td>-0.689197</td>\n",
" <td>-0.979256</td>\n",
" <td>-0.594216</td>\n",
" <td>0.458810</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-27 23:30:00</th>\n",
" <td>3.906788</td>\n",
" <td>-1.203661</td>\n",
" <td>1.269408</td>\n",
" <td>-1.069273</td>\n",
" <td>1.660631</td>\n",
" <td>1.000041</td>\n",
" <td>0.000435</td>\n",
" <td>0.921760</td>\n",
" <td>0.073188</td>\n",
" <td>-1.004399</td>\n",
" <td>-0.858377</td>\n",
" <td>-0.689197</td>\n",
" <td>-0.979256</td>\n",
" <td>-0.594216</td>\n",
" <td>0.458810</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-28 00:00:00</th>\n",
" <td>4.590792</td>\n",
" <td>-1.203661</td>\n",
" <td>1.383766</td>\n",
" <td>-1.069273</td>\n",
" <td>-1.661979</td>\n",
" <td>-0.999959</td>\n",
" <td>0.499755</td>\n",
" <td>0.476418</td>\n",
" <td>-0.035387</td>\n",
" <td>-1.024600</td>\n",
" <td>-0.873777</td>\n",
" <td>-0.781141</td>\n",
" <td>-0.972288</td>\n",
" <td>-0.698792</td>\n",
" <td>0.458810</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>24119 rows × 19 columns</p>\n",
"</div>"
],
"text/plain": [
" energy(kWh/hh) month day week hour \\\n",
"2012-10-12 11:30:00 -0.444130 0.857219 -0.445950 0.822749 -0.072904 \n",
"2012-10-12 12:00:00 1.660500 0.857219 -0.445950 0.822749 0.071557 \n",
"2012-10-12 12:30:00 0.013222 0.857219 -0.445950 0.822749 0.071557 \n",
"2012-10-12 13:00:00 -0.395562 0.857219 -0.445950 0.822749 0.216018 \n",
"2012-10-12 13:30:00 -0.217478 0.857219 -0.445950 0.822749 0.216018 \n",
"... ... ... ... ... ... \n",
"2014-02-27 22:00:00 0.660800 -1.203661 1.269408 -1.069273 1.516170 \n",
"2014-02-27 22:30:00 4.441040 -1.203661 1.269408 -1.069273 1.516170 \n",
"2014-02-27 23:00:00 4.024161 -1.203661 1.269408 -1.069273 1.660631 \n",
"2014-02-27 23:30:00 3.906788 -1.203661 1.269408 -1.069273 1.660631 \n",
"2014-02-28 00:00:00 4.590792 -1.203661 1.383766 -1.069273 -1.661979 \n",
"\n",
" minute dayofweek visibility windBearing \\\n",
"2012-10-12 11:30:00 1.000041 0.499755 0.759528 0.800636 \n",
"2012-10-12 12:00:00 -0.999959 0.499755 0.759528 0.724633 \n",
"2012-10-12 12:30:00 1.000041 0.499755 0.759528 0.724633 \n",
"2012-10-12 13:00:00 -0.999959 0.499755 0.759528 0.648631 \n",
"2012-10-12 13:30:00 1.000041 0.499755 0.759528 0.648631 \n",
"... ... ... ... ... \n",
"2014-02-27 22:00:00 -0.999959 0.000435 0.912217 0.246907 \n",
"2014-02-27 22:30:00 1.000041 0.000435 0.912217 0.246907 \n",
"2014-02-27 23:00:00 -0.999959 0.000435 0.921760 0.073188 \n",
"2014-02-27 23:30:00 1.000041 0.000435 0.921760 0.073188 \n",
"2014-02-28 00:00:00 -0.999959 0.499755 0.476418 -0.035387 \n",
"\n",
" temperature dewPoint pressure apparentTemperature \\\n",
"2012-10-12 11:30:00 0.453439 -0.305918 -0.458899 0.577361 \n",
"2012-10-12 12:00:00 0.667233 -0.336717 -0.448391 0.754344 \n",
"2012-10-12 12:30:00 0.667233 -0.336717 -0.448391 0.754344 \n",
"2012-10-12 13:00:00 0.689117 -0.305918 -0.433505 0.772460 \n",
"2012-10-12 13:30:00 0.689117 -0.305918 -0.433505 0.772460 \n",
"... ... ... ... ... \n",
"2014-02-27 22:00:00 -0.975781 -0.852602 -0.597253 -0.980649 \n",
"2014-02-27 22:30:00 -0.975781 -0.852602 -0.597253 -0.980649 \n",
"2014-02-27 23:00:00 -1.004399 -0.858377 -0.689197 -0.979256 \n",
"2014-02-27 23:30:00 -1.004399 -0.858377 -0.689197 -0.979256 \n",
"2014-02-28 00:00:00 -1.024600 -0.873777 -0.781141 -0.972288 \n",
"\n",
" windSpeed humidity holiday Acorn_grouped LCLid \\\n",
"2012-10-12 11:30:00 1.406991 -1.492695 -0.149604 0.0 0.0 \n",
"2012-10-12 12:00:00 1.387977 -1.854084 -0.149604 0.0 0.0 \n",
"2012-10-12 12:30:00 1.387977 -1.854084 -0.149604 0.0 0.0 \n",
"2012-10-12 13:00:00 1.426005 -1.854084 -0.149604 0.0 0.0 \n",
"2012-10-12 13:30:00 1.426005 -1.854084 -0.149604 0.0 0.0 \n",
"... ... ... ... ... ... \n",
"2014-02-27 22:00:00 -0.465873 0.386532 -0.149604 0.0 0.0 \n",
"2014-02-27 22:30:00 -0.465873 0.386532 -0.149604 0.0 0.0 \n",
"2014-02-27 23:00:00 -0.594216 0.458810 -0.149604 0.0 0.0 \n",
"2014-02-27 23:30:00 -0.594216 0.458810 -0.149604 0.0 0.0 \n",
"2014-02-28 00:00:00 -0.698792 0.458810 -0.149604 0.0 0.0 \n",
"\n",
" stdorToU \n",
"2012-10-12 11:30:00 0.0 \n",
"2012-10-12 12:00:00 0.0 \n",
"2012-10-12 12:30:00 0.0 \n",
"2012-10-12 13:00:00 0.0 \n",
"2012-10-12 13:30:00 0.0 \n",
"... ... \n",
"2014-02-27 22:00:00 0.0 \n",
"2014-02-27 22:30:00 0.0 \n",
"2014-02-27 23:00:00 0.0 \n",
"2014-02-27 23:30:00 0.0 \n",
"2014-02-28 00:00:00 0.0 \n",
"\n",
"[24119 rows x 19 columns]"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sklearn\n",
"from sklearn.preprocessing import StandardScaler, OrdinalEncoder\n",
"from sklearn_pandas import DataFrameMapper\n",
"\n",
"columns_input_numeric = list(df.drop(columns=columns_target)._get_numeric_data().columns)\n",
"columns_categorical = list(set(df.columns)-set(columns_input_numeric)-set(columns_target))\n",
"\n",
"output_scalers = [([n], StandardScaler()) for n in columns_target]\n",
"transformers=output_scalers + \\\n",
"[([n], StandardScaler()) for n in columns_input_numeric] + \\\n",
"[([n], OrdinalEncoder()) for n in columns_categorical]\n",
"scaler = DataFrameMapper(transformers, df_out=True)\n",
"df_norm = scaler.fit_transform(df)\n",
"df_norm"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:08.302640Z",
"start_time": "2020-10-18T06:10:08.249960Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"StandardScaler()"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"output_scaler = next(filter(lambda r:r[0][0] in columns_target, scaler.features))[-1]\n",
"output_scaler"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:08.476523Z",
"start_time": "2020-10-18T06:10:08.413755Z"
}
},
"outputs": [],
"source": [
"# # Resample\n",
"df_norm = df_norm.resample(freq).first().fillna(0)"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:11.469433Z",
"start_time": "2020-10-18T06:10:08.562215Z"
},
"lines_to_next_cell": 0
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f988520c110>"
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# split data, with the test in the future\n",
"n_split = -int(len(df)*0.2)\n",
"df_train = df_norm[:n_split]\n",
"df_test = df_norm[n_split:]\n",
"\n",
"# Show split\n",
"df_train['energy(kWh/hh)'].plot(label='train')\n",
"df_test['energy(kWh/hh)'].plot(label='test')\n",
"plt.ylabel('energy(kWh/hh)')\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:11.534932Z",
"start_time": "2020-10-18T06:10:11.471576Z"
},
"lines_to_next_cell": 2
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>energy(kWh/hh)</th>\n",
" <th>month</th>\n",
" <th>day</th>\n",
" <th>week</th>\n",
" <th>hour</th>\n",
" <th>minute</th>\n",
" <th>dayofweek</th>\n",
" <th>visibility</th>\n",
" <th>windBearing</th>\n",
" <th>temperature</th>\n",
" <th>dewPoint</th>\n",
" <th>pressure</th>\n",
" <th>apparentTemperature</th>\n",
" <th>windSpeed</th>\n",
" <th>humidity</th>\n",
" <th>holiday</th>\n",
" <th>Acorn_grouped</th>\n",
" <th>LCLid</th>\n",
" <th>stdorToU</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2012-10-12 11:30:00</th>\n",
" <td>-0.444130</td>\n",
" <td>0.857219</td>\n",
" <td>-0.445950</td>\n",
" <td>0.822749</td>\n",
" <td>-0.072904</td>\n",
" <td>1.000041</td>\n",
" <td>0.499755</td>\n",
" <td>0.759528</td>\n",
" <td>0.800636</td>\n",
" <td>0.453439</td>\n",
" <td>-0.305918</td>\n",
" <td>-0.458899</td>\n",
" <td>0.577361</td>\n",
" <td>1.406991</td>\n",
" <td>-1.492695</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-12 12:00:00</th>\n",
" <td>1.660500</td>\n",
" <td>0.857219</td>\n",
" <td>-0.445950</td>\n",
" <td>0.822749</td>\n",
" <td>0.071557</td>\n",
" <td>-0.999959</td>\n",
" <td>0.499755</td>\n",
" <td>0.759528</td>\n",
" <td>0.724633</td>\n",
" <td>0.667233</td>\n",
" <td>-0.336717</td>\n",
" <td>-0.448391</td>\n",
" <td>0.754344</td>\n",
" <td>1.387977</td>\n",
" <td>-1.854084</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-12 12:30:00</th>\n",
" <td>0.013222</td>\n",
" <td>0.857219</td>\n",
" <td>-0.445950</td>\n",
" <td>0.822749</td>\n",
" <td>0.071557</td>\n",
" <td>1.000041</td>\n",
" <td>0.499755</td>\n",
" <td>0.759528</td>\n",
" <td>0.724633</td>\n",
" <td>0.667233</td>\n",
" <td>-0.336717</td>\n",
" <td>-0.448391</td>\n",
" <td>0.754344</td>\n",
" <td>1.387977</td>\n",
" <td>-1.854084</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-12 13:00:00</th>\n",
" <td>-0.395562</td>\n",
" <td>0.857219</td>\n",
" <td>-0.445950</td>\n",
" <td>0.822749</td>\n",
" <td>0.216018</td>\n",
" <td>-0.999959</td>\n",
" <td>0.499755</td>\n",
" <td>0.759528</td>\n",
" <td>0.648631</td>\n",
" <td>0.689117</td>\n",
" <td>-0.305918</td>\n",
" <td>-0.433505</td>\n",
" <td>0.772460</td>\n",
" <td>1.426005</td>\n",
" <td>-1.854084</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-12 13:30:00</th>\n",
" <td>-0.217478</td>\n",
" <td>0.857219</td>\n",
" <td>-0.445950</td>\n",
" <td>0.822749</td>\n",
" <td>0.216018</td>\n",
" <td>1.000041</td>\n",
" <td>0.499755</td>\n",
" <td>0.759528</td>\n",
" <td>0.648631</td>\n",
" <td>0.689117</td>\n",
" <td>-0.305918</td>\n",
" <td>-0.433505</td>\n",
" <td>0.772460</td>\n",
" <td>1.426005</td>\n",
" <td>-1.854084</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-27 22:00:00</th>\n",
" <td>0.660800</td>\n",
" <td>-1.203661</td>\n",
" <td>1.269408</td>\n",
" <td>-1.069273</td>\n",
" <td>1.516170</td>\n",
" <td>-0.999959</td>\n",
" <td>0.000435</td>\n",
" <td>0.912217</td>\n",
" <td>0.246907</td>\n",
" <td>-0.975781</td>\n",
" <td>-0.852602</td>\n",
" <td>-0.597253</td>\n",
" <td>-0.980649</td>\n",
" <td>-0.465873</td>\n",
" <td>0.386532</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-27 22:30:00</th>\n",
" <td>4.441040</td>\n",
" <td>-1.203661</td>\n",
" <td>1.269408</td>\n",
" <td>-1.069273</td>\n",
" <td>1.516170</td>\n",
" <td>1.000041</td>\n",
" <td>0.000435</td>\n",
" <td>0.912217</td>\n",
" <td>0.246907</td>\n",
" <td>-0.975781</td>\n",
" <td>-0.852602</td>\n",
" <td>-0.597253</td>\n",
" <td>-0.980649</td>\n",
" <td>-0.465873</td>\n",
" <td>0.386532</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-27 23:00:00</th>\n",
" <td>4.024161</td>\n",
" <td>-1.203661</td>\n",
" <td>1.269408</td>\n",
" <td>-1.069273</td>\n",
" <td>1.660631</td>\n",
" <td>-0.999959</td>\n",
" <td>0.000435</td>\n",
" <td>0.921760</td>\n",
" <td>0.073188</td>\n",
" <td>-1.004399</td>\n",
" <td>-0.858377</td>\n",
" <td>-0.689197</td>\n",
" <td>-0.979256</td>\n",
" <td>-0.594216</td>\n",
" <td>0.458810</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-27 23:30:00</th>\n",
" <td>3.906788</td>\n",
" <td>-1.203661</td>\n",
" <td>1.269408</td>\n",
" <td>-1.069273</td>\n",
" <td>1.660631</td>\n",
" <td>1.000041</td>\n",
" <td>0.000435</td>\n",
" <td>0.921760</td>\n",
" <td>0.073188</td>\n",
" <td>-1.004399</td>\n",
" <td>-0.858377</td>\n",
" <td>-0.689197</td>\n",
" <td>-0.979256</td>\n",
" <td>-0.594216</td>\n",
" <td>0.458810</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2014-02-28 00:00:00</th>\n",
" <td>4.590792</td>\n",
" <td>-1.203661</td>\n",
" <td>1.383766</td>\n",
" <td>-1.069273</td>\n",
" <td>-1.661979</td>\n",
" <td>-0.999959</td>\n",
" <td>0.499755</td>\n",
" <td>0.476418</td>\n",
" <td>-0.035387</td>\n",
" <td>-1.024600</td>\n",
" <td>-0.873777</td>\n",
" <td>-0.781141</td>\n",
" <td>-0.972288</td>\n",
" <td>-0.698792</td>\n",
" <td>0.458810</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>24170 rows × 19 columns</p>\n",
"</div>"
],
"text/plain": [
" energy(kWh/hh) month day week hour \\\n",
"2012-10-12 11:30:00 -0.444130 0.857219 -0.445950 0.822749 -0.072904 \n",
"2012-10-12 12:00:00 1.660500 0.857219 -0.445950 0.822749 0.071557 \n",
"2012-10-12 12:30:00 0.013222 0.857219 -0.445950 0.822749 0.071557 \n",
"2012-10-12 13:00:00 -0.395562 0.857219 -0.445950 0.822749 0.216018 \n",
"2012-10-12 13:30:00 -0.217478 0.857219 -0.445950 0.822749 0.216018 \n",
"... ... ... ... ... ... \n",
"2014-02-27 22:00:00 0.660800 -1.203661 1.269408 -1.069273 1.516170 \n",
"2014-02-27 22:30:00 4.441040 -1.203661 1.269408 -1.069273 1.516170 \n",
"2014-02-27 23:00:00 4.024161 -1.203661 1.269408 -1.069273 1.660631 \n",
"2014-02-27 23:30:00 3.906788 -1.203661 1.269408 -1.069273 1.660631 \n",
"2014-02-28 00:00:00 4.590792 -1.203661 1.383766 -1.069273 -1.661979 \n",
"\n",
" minute dayofweek visibility windBearing \\\n",
"2012-10-12 11:30:00 1.000041 0.499755 0.759528 0.800636 \n",
"2012-10-12 12:00:00 -0.999959 0.499755 0.759528 0.724633 \n",
"2012-10-12 12:30:00 1.000041 0.499755 0.759528 0.724633 \n",
"2012-10-12 13:00:00 -0.999959 0.499755 0.759528 0.648631 \n",
"2012-10-12 13:30:00 1.000041 0.499755 0.759528 0.648631 \n",
"... ... ... ... ... \n",
"2014-02-27 22:00:00 -0.999959 0.000435 0.912217 0.246907 \n",
"2014-02-27 22:30:00 1.000041 0.000435 0.912217 0.246907 \n",
"2014-02-27 23:00:00 -0.999959 0.000435 0.921760 0.073188 \n",
"2014-02-27 23:30:00 1.000041 0.000435 0.921760 0.073188 \n",
"2014-02-28 00:00:00 -0.999959 0.499755 0.476418 -0.035387 \n",
"\n",
" temperature dewPoint pressure apparentTemperature \\\n",
"2012-10-12 11:30:00 0.453439 -0.305918 -0.458899 0.577361 \n",
"2012-10-12 12:00:00 0.667233 -0.336717 -0.448391 0.754344 \n",
"2012-10-12 12:30:00 0.667233 -0.336717 -0.448391 0.754344 \n",
"2012-10-12 13:00:00 0.689117 -0.305918 -0.433505 0.772460 \n",
"2012-10-12 13:30:00 0.689117 -0.305918 -0.433505 0.772460 \n",
"... ... ... ... ... \n",
"2014-02-27 22:00:00 -0.975781 -0.852602 -0.597253 -0.980649 \n",
"2014-02-27 22:30:00 -0.975781 -0.852602 -0.597253 -0.980649 \n",
"2014-02-27 23:00:00 -1.004399 -0.858377 -0.689197 -0.979256 \n",
"2014-02-27 23:30:00 -1.004399 -0.858377 -0.689197 -0.979256 \n",
"2014-02-28 00:00:00 -1.024600 -0.873777 -0.781141 -0.972288 \n",
"\n",
" windSpeed humidity holiday Acorn_grouped LCLid \\\n",
"2012-10-12 11:30:00 1.406991 -1.492695 -0.149604 0.0 0.0 \n",
"2012-10-12 12:00:00 1.387977 -1.854084 -0.149604 0.0 0.0 \n",
"2012-10-12 12:30:00 1.387977 -1.854084 -0.149604 0.0 0.0 \n",
"2012-10-12 13:00:00 1.426005 -1.854084 -0.149604 0.0 0.0 \n",
"2012-10-12 13:30:00 1.426005 -1.854084 -0.149604 0.0 0.0 \n",
"... ... ... ... ... ... \n",
"2014-02-27 22:00:00 -0.465873 0.386532 -0.149604 0.0 0.0 \n",
"2014-02-27 22:30:00 -0.465873 0.386532 -0.149604 0.0 0.0 \n",
"2014-02-27 23:00:00 -0.594216 0.458810 -0.149604 0.0 0.0 \n",
"2014-02-27 23:30:00 -0.594216 0.458810 -0.149604 0.0 0.0 \n",
"2014-02-28 00:00:00 -0.698792 0.458810 -0.149604 0.0 0.0 \n",
"\n",
" stdorToU \n",
"2012-10-12 11:30:00 0.0 \n",
"2012-10-12 12:00:00 0.0 \n",
"2012-10-12 12:30:00 0.0 \n",
"2012-10-12 13:00:00 0.0 \n",
"2012-10-12 13:30:00 0.0 \n",
"... ... \n",
"2014-02-27 22:00:00 0.0 \n",
"2014-02-27 22:30:00 0.0 \n",
"2014-02-27 23:00:00 0.0 \n",
"2014-02-27 23:30:00 0.0 \n",
"2014-02-28 00:00:00 0.0 \n",
"\n",
"[24170 rows x 19 columns]"
]
},
"execution_count": 78,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_norm"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Dataset"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:11.581192Z",
"start_time": "2020-10-18T06:10:11.537081Z"
}
},
"outputs": [],
"source": [
"# These are the columns that we wont know in the future\n",
"# We need to blank them out in x_future\n",
"columns_blank=['visibility',\n",
" 'windBearing', 'temperature', 'dewPoint', 'pressure',\n",
" 'apparentTemperature', 'windSpeed', 'humidity']"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:15.218869Z",
"start_time": "2020-10-18T06:10:15.136626Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<Seq2SeqDataSet(shape=(19347, 19), times=2012-10-12 11:30:00 to 2012-10-12 12:00:00 at 30T)>\n",
"<Seq2SeqDataSet(shape=(4823, 19), times=2013-11-19 13:00:00 to 2013-11-19 13:30:00 at 30T)>\n"
]
}
],
"source": [
"ds_train = Seq2SeqDataSet(df_train,\n",
" window_past=window_past,\n",
" window_future=window_future,\n",
" columns_blank=columns_blank)\n",
"ds_test = Seq2SeqDataSet(df_test,\n",
" window_past=window_past,\n",
" window_future=window_future,\n",
" columns_blank=columns_blank)\n",
"print(ds_train)\n",
"print(ds_test)"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:15.417257Z",
"start_time": "2020-10-18T06:10:15.365151Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0.85721916, 0.4689078 , 0.88187414, -0.21736582, 1.0000415 ,\n",
" 0.9990746 , 0. , 0. , 0. , 0. ,\n",
" 0. , 0. , 0. , 0. , -0.1496042 ,\n",
" 0. , 0. , 0. , 3.9583333 , 0. ],\n",
" dtype=float32)"
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# we can treat it like an array\n",
"ds_train[0]\n",
"len(ds_train)\n",
"ds_train[0][2][-2]"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:15.976507Z",
"start_time": "2020-10-18T06:10:15.607052Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>month</th>\n",
" <th>day</th>\n",
" <th>week</th>\n",
" <th>hour</th>\n",
" <th>minute</th>\n",
" <th>dayofweek</th>\n",
" <th>visibility</th>\n",
" <th>windBearing</th>\n",
" <th>temperature</th>\n",
" <th>dewPoint</th>\n",
" <th>pressure</th>\n",
" <th>apparentTemperature</th>\n",
" <th>windSpeed</th>\n",
" <th>humidity</th>\n",
" <th>holiday</th>\n",
" <th>Acorn_grouped</th>\n",
" <th>LCLid</th>\n",
" <th>stdorToU</th>\n",
" <th>tsp_days</th>\n",
" <th>is_past</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2012-10-16 14:00:00</th>\n",
" <td>0.857219</td>\n",
" <td>0.011479</td>\n",
" <td>0.881874</td>\n",
" <td>0.360479</td>\n",
" <td>-0.999959</td>\n",
" <td>-0.998205</td>\n",
" <td>0.540038</td>\n",
" <td>0.529200</td>\n",
" <td>0.815373</td>\n",
" <td>-0.344417</td>\n",
" <td>-0.843313</td>\n",
" <td>0.876978</td>\n",
" <td>2.267368</td>\n",
" <td>-2.070918</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.104167</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-16 14:30:00</th>\n",
" <td>0.857219</td>\n",
" <td>0.011479</td>\n",
" <td>0.881874</td>\n",
" <td>0.360479</td>\n",
" <td>1.000041</td>\n",
" <td>-0.998205</td>\n",
" <td>0.540038</td>\n",
" <td>0.529200</td>\n",
" <td>0.815373</td>\n",
" <td>-0.344417</td>\n",
" <td>-0.843313</td>\n",
" <td>0.876978</td>\n",
" <td>2.267368</td>\n",
" <td>-2.070918</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.083333</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-16 15:00:00</th>\n",
" <td>0.857219</td>\n",
" <td>0.011479</td>\n",
" <td>0.881874</td>\n",
" <td>0.504941</td>\n",
" <td>-0.999959</td>\n",
" <td>-0.998205</td>\n",
" <td>0.600477</td>\n",
" <td>0.518342</td>\n",
" <td>0.798539</td>\n",
" <td>-0.261644</td>\n",
" <td>-0.818795</td>\n",
" <td>0.863042</td>\n",
" <td>1.753994</td>\n",
" <td>-1.998640</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.062500</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-16 15:30:00</th>\n",
" <td>0.857219</td>\n",
" <td>0.011479</td>\n",
" <td>0.881874</td>\n",
" <td>0.504941</td>\n",
" <td>1.000041</td>\n",
" <td>-0.998205</td>\n",
" <td>0.600477</td>\n",
" <td>0.518342</td>\n",
" <td>0.798539</td>\n",
" <td>-0.261644</td>\n",
" <td>-0.818795</td>\n",
" <td>0.863042</td>\n",
" <td>1.753994</td>\n",
" <td>-1.998640</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.041667</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-16 16:00:00</th>\n",
" <td>0.857219</td>\n",
" <td>0.011479</td>\n",
" <td>0.881874</td>\n",
" <td>0.649402</td>\n",
" <td>-0.999959</td>\n",
" <td>-0.998205</td>\n",
" <td>0.492323</td>\n",
" <td>0.485770</td>\n",
" <td>0.635248</td>\n",
" <td>-0.232770</td>\n",
" <td>-0.805660</td>\n",
" <td>0.727866</td>\n",
" <td>0.741507</td>\n",
" <td>-1.709528</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.020833</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" month day week hour minute \\\n",
"2012-10-16 14:00:00 0.857219 0.011479 0.881874 0.360479 -0.999959 \n",
"2012-10-16 14:30:00 0.857219 0.011479 0.881874 0.360479 1.000041 \n",
"2012-10-16 15:00:00 0.857219 0.011479 0.881874 0.504941 -0.999959 \n",
"2012-10-16 15:30:00 0.857219 0.011479 0.881874 0.504941 1.000041 \n",
"2012-10-16 16:00:00 0.857219 0.011479 0.881874 0.649402 -0.999959 \n",
"\n",
" dayofweek visibility windBearing temperature \\\n",
"2012-10-16 14:00:00 -0.998205 0.540038 0.529200 0.815373 \n",
"2012-10-16 14:30:00 -0.998205 0.540038 0.529200 0.815373 \n",
"2012-10-16 15:00:00 -0.998205 0.600477 0.518342 0.798539 \n",
"2012-10-16 15:30:00 -0.998205 0.600477 0.518342 0.798539 \n",
"2012-10-16 16:00:00 -0.998205 0.492323 0.485770 0.635248 \n",
"\n",
" dewPoint pressure apparentTemperature windSpeed \\\n",
"2012-10-16 14:00:00 -0.344417 -0.843313 0.876978 2.267368 \n",
"2012-10-16 14:30:00 -0.344417 -0.843313 0.876978 2.267368 \n",
"2012-10-16 15:00:00 -0.261644 -0.818795 0.863042 1.753994 \n",
"2012-10-16 15:30:00 -0.261644 -0.818795 0.863042 1.753994 \n",
"2012-10-16 16:00:00 -0.232770 -0.805660 0.727866 0.741507 \n",
"\n",
" humidity holiday Acorn_grouped LCLid stdorToU \\\n",
"2012-10-16 14:00:00 -2.070918 -0.149604 0.0 0.0 0.0 \n",
"2012-10-16 14:30:00 -2.070918 -0.149604 0.0 0.0 0.0 \n",
"2012-10-16 15:00:00 -1.998640 -0.149604 0.0 0.0 0.0 \n",
"2012-10-16 15:30:00 -1.998640 -0.149604 0.0 0.0 0.0 \n",
"2012-10-16 16:00:00 -1.709528 -0.149604 0.0 0.0 0.0 \n",
"\n",
" tsp_days is_past \n",
"2012-10-16 14:00:00 -0.104167 1.0 \n",
"2012-10-16 14:30:00 -0.083333 1.0 \n",
"2012-10-16 15:00:00 -0.062500 1.0 \n",
"2012-10-16 15:30:00 -0.041667 1.0 \n",
"2012-10-16 16:00:00 -0.020833 1.0 "
]
},
"execution_count": 82,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# We can get rows\n",
"x_past, y_past, x_future, y_future = ds_train.get_rows(10)\n",
"\n",
"# Plot one instance, this is what the model sees\n",
"y_past['energy(kWh/hh)'].plot(label='past')\n",
"y_future['energy(kWh/hh)'].plot(ax=plt.gca(), label='future')\n",
"plt.legend()\n",
"plt.ylabel('energy(kWh/hh)')\n",
"\n",
"# Notice we've added on two new columns tsp (time since present) and is_past\n",
"x_past.tail()"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:16.052080Z",
"start_time": "2020-10-18T06:10:15.978378Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>month</th>\n",
" <th>day</th>\n",
" <th>week</th>\n",
" <th>hour</th>\n",
" <th>minute</th>\n",
" <th>dayofweek</th>\n",
" <th>visibility</th>\n",
" <th>windBearing</th>\n",
" <th>temperature</th>\n",
" <th>dewPoint</th>\n",
" <th>pressure</th>\n",
" <th>apparentTemperature</th>\n",
" <th>windSpeed</th>\n",
" <th>humidity</th>\n",
" <th>holiday</th>\n",
" <th>Acorn_grouped</th>\n",
" <th>LCLid</th>\n",
" <th>stdorToU</th>\n",
" <th>tsp_days</th>\n",
" <th>is_past</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2012-10-20 14:00:00</th>\n",
" <td>0.857219</td>\n",
" <td>0.468908</td>\n",
" <td>0.881874</td>\n",
" <td>0.360479</td>\n",
" <td>-0.999959</td>\n",
" <td>0.999075</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>3.895833</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-20 14:30:00</th>\n",
" <td>0.857219</td>\n",
" <td>0.468908</td>\n",
" <td>0.881874</td>\n",
" <td>0.360479</td>\n",
" <td>1.000041</td>\n",
" <td>0.999075</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>3.916667</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-20 15:00:00</th>\n",
" <td>0.857219</td>\n",
" <td>0.468908</td>\n",
" <td>0.881874</td>\n",
" <td>0.504941</td>\n",
" <td>-0.999959</td>\n",
" <td>0.999075</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>3.937500</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-20 15:30:00</th>\n",
" <td>0.857219</td>\n",
" <td>0.468908</td>\n",
" <td>0.881874</td>\n",
" <td>0.504941</td>\n",
" <td>1.000041</td>\n",
" <td>0.999075</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>3.958333</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-10-20 16:00:00</th>\n",
" <td>0.857219</td>\n",
" <td>0.468908</td>\n",
" <td>0.881874</td>\n",
" <td>0.649402</td>\n",
" <td>-0.999959</td>\n",
" <td>0.999075</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>-0.149604</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>3.979167</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" month day week hour minute \\\n",
"2012-10-20 14:00:00 0.857219 0.468908 0.881874 0.360479 -0.999959 \n",
"2012-10-20 14:30:00 0.857219 0.468908 0.881874 0.360479 1.000041 \n",
"2012-10-20 15:00:00 0.857219 0.468908 0.881874 0.504941 -0.999959 \n",
"2012-10-20 15:30:00 0.857219 0.468908 0.881874 0.504941 1.000041 \n",
"2012-10-20 16:00:00 0.857219 0.468908 0.881874 0.649402 -0.999959 \n",
"\n",
" dayofweek visibility windBearing temperature \\\n",
"2012-10-20 14:00:00 0.999075 0.0 0.0 0.0 \n",
"2012-10-20 14:30:00 0.999075 0.0 0.0 0.0 \n",
"2012-10-20 15:00:00 0.999075 0.0 0.0 0.0 \n",
"2012-10-20 15:30:00 0.999075 0.0 0.0 0.0 \n",
"2012-10-20 16:00:00 0.999075 0.0 0.0 0.0 \n",
"\n",
" dewPoint pressure apparentTemperature windSpeed \\\n",
"2012-10-20 14:00:00 0.0 0.0 0.0 0.0 \n",
"2012-10-20 14:30:00 0.0 0.0 0.0 0.0 \n",
"2012-10-20 15:00:00 0.0 0.0 0.0 0.0 \n",
"2012-10-20 15:30:00 0.0 0.0 0.0 0.0 \n",
"2012-10-20 16:00:00 0.0 0.0 0.0 0.0 \n",
"\n",
" humidity holiday Acorn_grouped LCLid stdorToU \\\n",
"2012-10-20 14:00:00 0.0 -0.149604 0.0 0.0 0.0 \n",
"2012-10-20 14:30:00 0.0 -0.149604 0.0 0.0 0.0 \n",
"2012-10-20 15:00:00 0.0 -0.149604 0.0 0.0 0.0 \n",
"2012-10-20 15:30:00 0.0 -0.149604 0.0 0.0 0.0 \n",
"2012-10-20 16:00:00 0.0 -0.149604 0.0 0.0 0.0 \n",
"\n",
" tsp_days is_past \n",
"2012-10-20 14:00:00 3.895833 0.0 \n",
"2012-10-20 14:30:00 3.916667 0.0 \n",
"2012-10-20 15:00:00 3.937500 0.0 \n",
"2012-10-20 15:30:00 3.958333 0.0 \n",
"2012-10-20 16:00:00 3.979167 0.0 "
]
},
"execution_count": 83,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Notice we've hidden some future columns to prevent cheating\n",
"x_future.tail()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Model"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:16.199517Z",
"start_time": "2020-10-18T06:10:16.159602Z"
},
"lines_to_end_of_cell_marker": 2,
"lines_to_next_cell": 0
},
"outputs": [],
"source": [
"\n",
"class Seq2SeqNet(nn.Module):\n",
" def __init__(self, input_size, input_size_decoder, output_size, hidden_size=32, lstm_layers=2, lstm_dropout=0, _min_std = 0.05):\n",
" super().__init__()\n",
" self._min_std = _min_std\n",
"\n",
" self.encoder = nn.LSTM(\n",
" input_size=input_size + output_size,\n",
" hidden_size=hidden_size,\n",
" batch_first=True,\n",
" num_layers=lstm_layers,\n",
" dropout=lstm_dropout,\n",
" )\n",
" self.decoder = nn.LSTM(\n",
" input_size=input_size_decoder,\n",
" hidden_size=hidden_size,\n",
" batch_first=True,\n",
" num_layers=lstm_layers,\n",
" dropout=lstm_dropout,\n",
" )\n",
" self.mean = nn.Linear(hidden_size, output_size)\n",
" self.std = nn.Linear(hidden_size, output_size)\n",
"\n",
" def forward(self, context_x, context_y, target_x, target_y=None):\n",
" x = torch.cat([context_x, context_y], -1)\n",
" _, (h_out, cell) = self.encoder(x)\n",
" \n",
" ## Shape\n",
" # hidden = [batch size, n layers * n directions, hid dim]\n",
" # cell = [batch size, n layers * n directions, hid dim]\n",
" # output = [batch size, seq len, hid dim * n directions]\n",
" outputs, (_, _) = self.decoder(target_x, (h_out, cell))\n",
" \n",
" \n",
" # outputs: [B, T, num_direction * H]\n",
" mean = self.mean(outputs)\n",
" log_sigma = self.std(outputs)\n",
" log_sigma = torch.clamp(log_sigma, np.log(self._min_std), -np.log(self._min_std))\n",
"\n",
" sigma = torch.exp(log_sigma)\n",
" y_dist = torch.distributions.Normal(mean, sigma)\n",
" return y_dist"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-11T10:56:42.836934Z",
"start_time": "2020-10-11T10:56:42.832646Z"
},
"lines_to_next_cell": 2
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:19.573015Z",
"start_time": "2020-10-18T06:10:16.472649Z"
},
"lines_to_next_cell": 0
},
"outputs": [
{
"data": {
"text/plain": [
"Seq2SeqNet(\n",
" (encoder): LSTM(21, 32, num_layers=2, batch_first=True)\n",
" (decoder): LSTM(20, 32, num_layers=2, batch_first=True)\n",
" (mean): Linear(in_features=32, out_features=1, bias=True)\n",
" (std): Linear(in_features=32, out_features=1, bias=True)\n",
")"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"input_size = x_past.shape[-1]\n",
"output_size = y_future.shape[-1]\n",
"\n",
"model = Seq2SeqNet(input_size, input_size, output_size,\n",
" hidden_size=32, \n",
" lstm_layers=2, \n",
" lstm_dropout=0).to(device)\n",
"model"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:19.607637Z",
"start_time": "2020-10-18T06:10:19.575213Z"
}
},
"outputs": [],
"source": [
"# Init the optimiser\n",
"optimizer = optim.Adam(model.parameters(), lr=1e-3)"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:19.726636Z",
"start_time": "2020-10-18T06:10:19.610734Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Normal(loc: torch.Size([64, 192, 1]), scale: torch.Size([64, 192, 1]))\n",
"========================================================\n",
" Kernel Shape Output Shape Params Mult-Adds\n",
"Layer \n",
"0_encoder - [64, 192, 32] 15488 14976\n",
"1_decoder - [64, 192, 32] 15360 14848\n",
"2_mean [32, 1] [64, 192, 1] 33 32\n",
"3_std [32, 1] [64, 192, 1] 33 32\n",
"--------------------------------------------------------\n",
" Totals\n",
"Total params 30914\n",
"Trainable params 30914\n",
"Non-trainable params 0\n",
"Mult-Adds 29888\n",
"========================================================\n"
]
},
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"past_x = torch.rand((batch_size, window_past, input_size)).to(device)\n",
"future_x = torch.rand((batch_size, window_future, input_size)).to(device)\n",
"past_y = torch.rand((batch_size, window_past, output_size)).to(device)\n",
"future_y = torch.rand((batch_size, window_future, output_size)).to(device)\n",
"output = model(past_x, past_y, future_x, future_y) \n",
"print(output)\n",
"\n",
"from torchsummaryX import summary\n",
"summary(model, past_x, past_y, future_x, future_y )\n",
"1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Training"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-18T06:10:19.773990Z",
"start_time": "2020-10-18T06:10:19.729611Z"
}
},
"outputs": [],
"source": [
"def train_epoch(ds, model, bs=128):\n",
" model.train()\n",
"\n",
" training_loss = []\n",
"\n",
" # Put data into a torch loader\n",
" load_train = torch.utils.data.dataloader.DataLoader(\n",
" ds,\n",
" batch_size=bs,\n",
" pin_memory=False,\n",
" num_workers=num_workers,\n",
" shuffle=True,\n",
" )\n",
"\n",
" for batch in tqdm(load_train, leave=False, desc='train'):\n",
" # Send data to gpu\n",
" x_past, y_past, x_future, y_future = [d.to(device) for d in batch]\n",
"\n",
" # Discard previous gradients\n",
" optimizer.zero_grad()\n",
" \n",
" # Run model\n",
" y_dist = model(x_past, y_past, x_future, y_future)\n",
" \n",
" # Get loss, it's Negative Log Likelihood\n",
" loss = -y_dist.log_prob(y_future).mean()\n",
"\n",
" # Backprop\n",
" loss.backward()\n",
" optimizer.step()\n",
"\n",
" # Record stats\n",
" training_loss.append(loss.item())\n",
"\n",
" return np.mean(training_loss)\n",
"\n",
"\n",
"def test_epoch(ds, model, bs=512):\n",
" model.eval()\n",
"\n",
" test_loss = []\n",
" load_test = torch.utils.data.dataloader.DataLoader(ds,\n",
" batch_size=bs,\n",
" pin_memory=False,\n",
" num_workers=num_workers)\n",
" for batch in tqdm(load_test, leave=False, desc='test'):\n",
" # Send data to gpu\n",
" x_past, y_past, x_future, y_future = [d.to(device) for d in batch]\n",
" with torch.no_grad():\n",
" # Run model\n",
" y_dist = model(x_past, y_past, x_future, y_future)\n",
" # Get loss, it's Negative Log Likelihood\n",
" loss = -y_dist.log_prob(y_future).mean()\n",
"\n",
" test_loss.append(loss.item())\n",
"\n",
" return np.mean(test_loss)\n",
"\n",
"\n",
"def training_loop(ds_train, ds_test, model, epochs=1, bs=128):\n",
" all_losses = []\n",
" try:\n",
" test_loss = test_epoch(ds_test, model)\n",
" print(f\"Start: Test Loss = {test_loss:.2f}\")\n",
" for epoch in tqdm(range(epochs), desc='epochs'):\n",
" loss = train_epoch(ds_train, model, bs=bs)\n",
" print(f\"Epoch {epoch+1}/{epochs}: Training Loss = {loss:.2f}\")\n",
"\n",
" test_loss = test_epoch(ds_test, model)\n",
" print(f\"Epoch {epoch+1}/{epochs}: Test Loss = {test_loss:.2f}\")\n",
" print(\"-\" * 50)\n",
"\n",
" all_losses.append([loss, test_loss])\n",
"\n",
" except KeyboardInterrupt:\n",
" # This lets you stop manually. and still get the results\n",
" pass\n",
"\n",
" # Visualising the results\n",
" all_losses = np.array(all_losses)\n",
" plt.plot(all_losses[:, 0], label=\"Training\")\n",
" plt.plot(all_losses[:, 1], label=\"Test\")\n",
" plt.title(\"Loss\")\n",
" plt.legend()\n",
"\n",
" return all_losses"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"start_time": "2020-10-18T06:10:18.300Z"
}
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='test'), FloatProgress(value=0.0, max=9.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Start: Test Loss = 1.54\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "26bb06680b314849914fe0a9db508456",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='epochs'), FloatProgress(value=0.0, max=8.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='train'), FloatProgress(value=0.0, max=297.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/8: Training Loss = 1.00\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='test'), FloatProgress(value=0.0, max=9.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/8: Test Loss = 1.07\n",
"--------------------------------------------------\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='train'), FloatProgress(value=0.0, max=297.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 2/8: Training Loss = 0.80\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='test'), FloatProgress(value=0.0, max=9.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 2/8: Test Loss = 1.13\n",
"--------------------------------------------------\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='train'), FloatProgress(value=0.0, max=297.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 3/8: Training Loss = 0.66\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='test'), FloatProgress(value=0.0, max=9.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 3/8: Test Loss = 1.40\n",
"--------------------------------------------------\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "9a315823bb234fafaf1f2a92fd3360f5",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(HTML(value='train'), FloatProgress(value=0.0, max=297.0), HTML(value='')))"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# this might take 1 minute per epoch on a gpu\n",
"training_loop(ds_train, ds_test, model, epochs=8, bs=batch_size)\n",
"1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Predict\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"start_time": "2020-10-18T06:10:18.900Z"
}
},
"outputs": [],
"source": [
"ds_preds = predict(model, ds_test, batch_size, device=device, scaler=output_scaler)\n",
"ds_preds"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"start_time": "2020-10-18T06:10:19.000Z"
}
},
"outputs": [],
"source": [
"# TODO Metrics... smape etc"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"start_time": "2020-10-18T06:10:19.200Z"
}
},
"outputs": [],
"source": [
"def plot_prediction(ds_preds, i):\n",
" \"\"\"Plot a prediction into the future, at a single point in time.\"\"\"\n",
" d = ds_preds.isel(t_source=i)\n",
"\n",
" # Get arrays\n",
" xf = d.t_target\n",
" yp = d.y_pred\n",
" s = d.y_pred_std\n",
" yt = d.y_true\n",
" now = d.t_source.squeeze()\n",
"\n",
" # plot prediction\n",
" plt.fill_between(xf, yp-2*s, yp+2*s, alpha=0.25,\n",
" facecolor=\"b\",\n",
" interpolate=True,\n",
" label=\"2 std\",)\n",
" plt.plot(xf, yp, label='pred', c='b')\n",
"\n",
" # plot true\n",
" plt.scatter(\n",
" d.t_past,\n",
" d.y_past,\n",
" c='k',\n",
" s=6\n",
" )\n",
" plt.scatter(xf, yt, label='true', c='k', s=6)\n",
" \n",
" # plot a red line for now\n",
" plt.vlines(x=now, ymin=0, ymax=1, label='now', color='r')\n",
"\n",
" now=pd.Timestamp(now.values)\n",
" plt.title(f'Prediction NLL={d.nll.mean().item():2.2g}')\n",
" plt.xlabel(f'{now.date()}')\n",
" plt.ylabel('energy(kWh/hh)')\n",
" plt.legend()\n",
" plt.xticks(rotation=45)\n",
" plt.show()\n",
" \n",
"# plot_prediction(ds_preds, 0) \n",
"# plot_prediction(ds_preds, 12) # 6 hours later\n",
"plot_prediction(ds_preds, 24) # 12 hours later\n",
"plot_prediction(ds_preds, 48) # 12 hours later"
]
},
{
"cell_type": "markdown",
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-10T02:54:21.496689Z",
"start_time": "2020-10-10T02:53:39.916Z"
}
},
"source": [
"## Error vs time ahead"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-11T10:17:55.322055Z",
"start_time": "2020-10-11T10:17:55.250658Z"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"start_time": "2020-10-18T06:10:19.600Z"
}
},
"outputs": [],
"source": [
"ds_preds.mean('t_source').plot.scatter('t_ahead_hours', 'nll') # Mean over all predictions\n",
"\n",
"# Tidy the graph\n",
"n = len(ds_preds.t_source)\n",
"plt.ylabel('Negative Log Likelihood (lower is better)')\n",
"plt.xlabel('Hours ahead')\n",
"plt.title(f'NLL vs time (no. samples={n})')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"end_time": "2020-10-11T09:32:13.207661Z",
"start_time": "2020-10-11T09:32:11.921740Z"
}
},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"start_time": "2020-10-18T06:10:20.000Z"
}
},
"outputs": [],
"source": [
"# Make a plot of the NLL over time. Does this solution get worse with time?\n",
"d = ds_preds.mean('t_ahead').groupby('t_source').mean().plot.scatter('t_source', 'nll')\n",
"plt.xticks(rotation=45)\n",
"plt.title('NLL over time (lower is better)')\n",
"1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"ExecuteTime": {
"start_time": "2020-10-18T06:10:20.100Z"
}
},
"outputs": [],
"source": [
"# A scatter plot is easy with xarray\n",
"ds_preds.plot.scatter('y_true', 'y_pred', s=.01)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"jupytext": {
"encoding": "# -*- coding: utf-8 -*-",
"formats": "ipynb,py:light"
},
"kernelspec": {
"display_name": "seq2seq-time",
"language": "python",
"name": "seq2seq-time"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.8"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "calc(100% - 180px)",
"left": "10px",
"top": "150px",
"width": "307.2px"
},
"toc_section_display": true,
"toc_window_display": true
}
},
"nbformat": 4,
"nbformat_minor": 2
}