--- title: WRAPPER keywords: fastai sidebar: home_sidebar nb_path: "nbs/models_rnn__rnn.ipynb" ---
import matplotlib.pyplot as plt
from neuralforecast.data.datasets.epf import EPF, EPFInfo
import torch as t
import pytorch_lightning as pl
from pytorch_lightning.callbacks import EarlyStopping
from neuralforecast.data.tsdataset import TimeSeriesDataset
from neuralforecast.data.tsloader import TimeSeriesLoader
from neuralforecast.losses.utils import LossFunction
import pandas as pd
from neuralforecast.data.datasets.epf import EPF
from neuralforecast.data.tsloader import TimeSeriesLoader
import pylab as plt
from pylab import rcParams
plt.style.use('seaborn-whitegrid')
plt.rcParams['font.family'] = 'serif'
FONTSIZE = 19
# Load and plot data
Y_df, X_df, S_df = EPF.load_groups(directory='./data', groups=['FR'])
Y_df_2, X_df_2, S_df_2 = EPF.load_groups(directory='./data', groups=['NP'])
Y_df_2['ds'] = Y_df['ds']
X_df_2['ds'] = X_df['ds']
Y_df = Y_df.append(Y_df_2).reset_index(drop=True)
X_df = X_df.append(X_df_2).reset_index(drop=True)
S_df = S_df.append(S_df_2).reset_index(drop=True)
X_df = X_df[['unique_id', 'ds', 'week_day']]
# Trimming series to avoid slow backprop through time
Y_df = Y_df.groupby('unique_id').tail(60*24+7*24).reset_index(drop=True)
X_df = X_df.groupby('unique_id').tail(60*24+7*24).reset_index(drop=True)
Y_df['y'] = Y_df['y']/Y_df['y'].max()
train_dataset = TimeSeriesDataset(Y_df=Y_df, X_df=X_df,
ds_in_test=7*24,
is_test=False,
input_size=1*24,
output_size=24,
verbose=True)
valid_dataset = TimeSeriesDataset(Y_df=Y_df, X_df=X_df,
ds_in_test=7*24,
is_test=True,
input_size=1*24,
output_size=24,
verbose=True)
train_loader = TimeSeriesLoader(dataset=train_dataset,
batch_size=2,
shuffle=True)
valid_loader = TimeSeriesLoader(dataset=valid_dataset,
batch_size=2,
shuffle=False)
model = RNN(# Architecture parameters
n_s=train_dataset.n_s,
n_x=train_dataset.n_x,
input_size=3*train_dataset.input_size,
output_size=train_dataset.output_size,
sample_freq=train_dataset.output_size,
cell_type='LSTM',
state_hsize=50,
dilations=[[1, 2, 4, 8]],
add_nl_layer=False,
# Regularization and optimization parameters
learning_rate=1e-2,
lr_scheduler_step_size=333,
lr_decay=0.8,
gradient_eps=1e-8,
gradient_clipping_threshold=10,
weight_decay=0,
noise_std=0.0001,
loss_train='MAE',
loss_valid='MAE',
frequency='H',
random_seed=1
)
early_stopping = EarlyStopping(monitor="val_loss",
min_delta=1e-4,
patience=3, verbose=True,
mode="min")
trainer = pl.Trainer(max_epochs=10, progress_bar_refresh_rate=1,
log_every_n_steps=100, check_val_every_n_epoch=100,
callbacks=[early_stopping])
trainer.fit(model, train_loader, valid_loader)
outputs = trainer.predict(model, valid_loader)
y_true, y_hat, sample_mask = zip(*outputs)
y_true = t.cat(y_true).cpu()
y_hat = t.cat(y_hat).cpu()
sample_mask = t.cat(sample_mask).cpu()
print("Original")
print("y_true.shape", y_true.shape)
print("y_hat.shape", y_hat.shape)
start = 0
end = 7 * 24
fig = plt.figure(figsize=(15, 6))
plt.plot(y_true[0], color='#628793', linewidth=1, label='true')
plt.plot(y_hat[0], color='peru', linewidth=1, label='forecast')
plt.ylabel('Price [EUR/MWh]', fontsize=15)
plt.xlabel('Date', fontsize=15)
plt.legend()
plt.grid()
plt.show()
Y_forecast_df = Y_df[Y_df['ds']<'2016-11-26'].reset_index(drop=True)
Y_forecast_df.tail()
X_forecast_df = X_df[X_df['ds']<'2016-11-27'].reset_index(drop=True)
X_forecast_df.tail()
forecast_df = model.forecast(Y_df=Y_forecast_df, X_df=X_forecast_df, S_df=S_df, batch_size=2)
plt.plot(Y_df[Y_df['unique_id']=='FR']['y'][-24:].values)
plt.plot(forecast_df['y'].values[:24])
plt.plot(Y_df[Y_df['unique_id']=='NP']['y'][-24:].values)
plt.plot(forecast_df['y'].values[24:])