Forecasting¶

This notebook has the forecasting model for predicting the electricity demand. The rto-region-data is used for this. We use Prophet model for this purpose. You can know more about prophet here: https://facebook.github.io/prophet/

Importing necessary libraries¶

In [1]:
import eia
import pandas as pd 
import plotly.express as px
import prophet
from sklearn.metrics import mean_absolute_error
import matplotlib

Loading RTO Data¶

In [2]:
region_data=eia.loaders.load_dataframe(data="rto-region-data")
In [3]:
region_data[region_data["type"]=="D"].groupby(['period']).sum()
Out[3]:
Unnamed: 0
period
2022-11-04T06 316642.0
2022-11-04T07 298485.0
2022-11-04T08 283410.0
2022-11-04T09 264248.0
2022-11-04T10 245086.0
... ...
2022-11-11T21 61506.0
2022-11-11T22 52595.0
2022-11-11T23 43684.0
2022-11-12T00 39062.0
2022-11-12T01 25862.0

185 rows × 1 columns

In [4]:
#Convert data type
region_data=region_data[region_data["type"]=="D"].astype({'value':'float'})
In [5]:
#Aggregating Demand for each timestamp
df=region_data[region_data["type"]=="D"].groupby(['period']).sum()
In [6]:
#Converting the dataframe to a format prophet model understands
df1=pd.DataFrame()
df1["y"]=df["value"]
df1["ds"]=df.index
In [7]:
df1
Out[7]:
y ds
period
2022-11-04T06 1129524.0 2022-11-04T06
2022-11-04T07 1097349.0 2022-11-04T07
2022-11-04T08 1077567.0 2022-11-04T08
2022-11-04T09 1076958.0 2022-11-04T09
2022-11-04T10 1101372.0 2022-11-04T10
... ... ...
2022-11-11T21 1362642.0 2022-11-11T21
2022-11-11T22 1358040.0 2022-11-11T22
2022-11-11T23 1371486.0 2022-11-11T23
2022-11-12T00 1376088.0 2022-11-12T00
2022-11-12T01 1335069.0 2022-11-12T01

185 rows × 2 columns

In [8]:
#Visualising the timeseries data
df1.plot()
Out[8]:
<AxesSubplot:xlabel='period'>
In [9]:
# Renaming the dataframe to a format prophet model understands
df1=df1.rename(columns={"value":"y"},index={"period":"ds"})
In [10]:
df1.index.names=["index"]
In [11]:
df1=df1.reset_index(drop=True)

Train Test Split¶

In [12]:
df1_train,df1_test=df1[:int(0.8*len(df1))], df1[int(0.8*len(df1)):]
In [13]:
df1_test["ds"]
Out[13]:
148    2022-11-10T12
149    2022-11-10T13
150    2022-11-10T14
151    2022-11-10T15
152    2022-11-10T16
153    2022-11-10T17
154    2022-11-10T18
155    2022-11-10T19
156    2022-11-10T20
157    2022-11-10T21
158    2022-11-10T22
159    2022-11-11T00
160    2022-11-11T01
161    2022-11-11T02
162    2022-11-11T03
163    2022-11-11T04
164    2022-11-11T05
165    2022-11-11T06
166    2022-11-11T07
167    2022-11-11T08
168    2022-11-11T09
169    2022-11-11T10
170    2022-11-11T11
171    2022-11-11T12
172    2022-11-11T13
173    2022-11-11T14
174    2022-11-11T15
175    2022-11-11T16
176    2022-11-11T17
177    2022-11-11T18
178    2022-11-11T19
179    2022-11-11T20
180    2022-11-11T21
181    2022-11-11T22
182    2022-11-11T23
183    2022-11-12T00
184    2022-11-12T01
Name: ds, dtype: object

Train the model¶

In [14]:
model = prophet.Prophet()
model.fit(df1_train)
19:33:05 - cmdstanpy - INFO - Chain [1] start processing
19:33:05 - cmdstanpy - INFO - Chain [1] done processing
Out[14]:
<prophet.forecaster.Prophet at 0x7fa63ba254c0>
In [15]:
model.history
Out[15]:
y ds floor t y_scaled
0 1129524.0 2022-11-04 06:00:00 0 0.000000 0.428235
1 1097349.0 2022-11-04 07:00:00 0 0.006711 0.416036
2 1077567.0 2022-11-04 08:00:00 0 0.013423 0.408536
3 1076958.0 2022-11-04 09:00:00 0 0.020134 0.408305
4 1101372.0 2022-11-04 10:00:00 0 0.026846 0.417561
... ... ... ... ... ...
143 1137828.0 2022-11-10 07:00:00 0 0.973154 0.431383
144 1111863.0 2022-11-10 08:00:00 0 0.979866 0.421539
145 1097157.0 2022-11-10 09:00:00 0 0.986577 0.415963
146 1098765.0 2022-11-10 10:00:00 0 0.993289 0.416573
147 1119819.0 2022-11-10 11:00:00 0 1.000000 0.424555

148 rows × 5 columns

Perform Prediction¶

In [16]:
preds=model.predict(df1_test)
In [17]:
preds
Out[17]:
ds trend yhat_lower yhat_upper trend_lower trend_upper additive_terms additive_terms_lower additive_terms_upper daily daily_lower daily_upper multiplicative_terms multiplicative_terms_lower multiplicative_terms_upper yhat
0 2022-11-10 12:00:00 1.084869e+06 7.547033e+05 1.259218e+06 1.084869e+06 1.084869e+06 -77416.632034 -77416.632034 -77416.632034 -77416.632034 -77416.632034 -77416.632034 0.0 0.0 0.0 1.007452e+06
1 2022-11-10 13:00:00 1.084571e+06 7.628501e+05 1.281542e+06 1.084551e+06 1.084588e+06 -50708.195610 -50708.195610 -50708.195610 -50708.195610 -50708.195610 -50708.195610 0.0 0.0 0.0 1.033863e+06
2 2022-11-10 14:00:00 1.084273e+06 8.027009e+05 1.313878e+06 1.084206e+06 1.084318e+06 -27730.386001 -27730.386001 -27730.386001 -27730.386001 -27730.386001 -27730.386001 0.0 0.0 0.0 1.056543e+06
3 2022-11-10 15:00:00 1.083975e+06 8.361824e+05 1.345869e+06 1.083833e+06 1.084077e+06 5128.209139 5128.209139 5128.209139 5128.209139 5128.209139 5128.209139 0.0 0.0 0.0 1.089103e+06
4 2022-11-10 16:00:00 1.083677e+06 8.905925e+05 1.398298e+06 1.083456e+06 1.083853e+06 58145.300060 58145.300060 58145.300060 58145.300060 58145.300060 58145.300060 0.0 0.0 0.0 1.141822e+06
5 2022-11-10 17:00:00 1.083379e+06 9.464717e+05 1.448678e+06 1.083077e+06 1.083645e+06 120698.577706 120698.577706 120698.577706 120698.577706 120698.577706 120698.577706 0.0 0.0 0.0 1.204078e+06
6 2022-11-10 18:00:00 1.083081e+06 1.002206e+06 1.494781e+06 1.082693e+06 1.083424e+06 162838.172667 162838.172667 162838.172667 162838.172667 162838.172667 162838.172667 0.0 0.0 0.0 1.245919e+06
7 2022-11-10 19:00:00 1.082783e+06 9.834110e+05 1.497769e+06 1.082300e+06 1.083236e+06 158808.587814 158808.587814 158808.587814 158808.587814 158808.587814 158808.587814 0.0 0.0 0.0 1.241592e+06
8 2022-11-10 20:00:00 1.082485e+06 9.397394e+05 1.451508e+06 1.081884e+06 1.083047e+06 112346.797177 112346.797177 112346.797177 112346.797177 112346.797177 112346.797177 0.0 0.0 0.0 1.194832e+06
9 2022-11-10 21:00:00 1.082187e+06 8.701280e+05 1.387479e+06 1.081461e+06 1.082865e+06 58719.632355 58719.632355 58719.632355 58719.632355 58719.632355 58719.632355 0.0 0.0 0.0 1.140907e+06
10 2022-11-10 22:00:00 1.081889e+06 8.673340e+05 1.366367e+06 1.081062e+06 1.082673e+06 38319.221473 38319.221473 38319.221473 38319.221473 38319.221473 38319.221473 0.0 0.0 0.0 1.120208e+06
11 2022-11-11 00:00:00 1.081293e+06 9.257994e+05 1.482368e+06 1.080333e+06 1.082214e+06 106892.705837 106892.705837 106892.705837 106892.705837 106892.705837 106892.705837 0.0 0.0 0.0 1.188186e+06
12 2022-11-11 01:00:00 1.080995e+06 9.483400e+05 1.453146e+06 1.079932e+06 1.082071e+06 124873.729042 124873.729042 124873.729042 124873.729042 124873.729042 124873.729042 0.0 0.0 0.0 1.205869e+06
13 2022-11-11 02:00:00 1.080697e+06 9.277615e+05 1.407839e+06 1.079471e+06 1.081950e+06 91450.868995 91450.868995 91450.868995 91450.868995 91450.868995 91450.868995 0.0 0.0 0.0 1.172148e+06
14 2022-11-11 03:00:00 1.080399e+06 8.377315e+05 1.364435e+06 1.078994e+06 1.081843e+06 17901.246175 17901.246175 17901.246175 17901.246175 17901.246175 17901.246175 0.0 0.0 0.0 1.098300e+06
15 2022-11-11 04:00:00 1.080101e+06 7.923611e+05 1.282768e+06 1.078540e+06 1.081741e+06 -59887.806383 -59887.806383 -59887.806383 -59887.806383 -59887.806383 -59887.806383 0.0 0.0 0.0 1.020213e+06
16 2022-11-11 05:00:00 1.079803e+06 6.974353e+05 1.238004e+06 1.078131e+06 1.081657e+06 -111484.227232 -111484.227232 -111484.227232 -111484.227232 -111484.227232 -111484.227232 0.0 0.0 0.0 9.683187e+05
17 2022-11-11 06:00:00 1.079505e+06 6.805283e+05 1.191367e+06 1.077684e+06 1.081566e+06 -131963.817878 -131963.817878 -131963.817878 -131963.817878 -131963.817878 -131963.817878 0.0 0.0 0.0 9.475411e+05
18 2022-11-11 07:00:00 1.079207e+06 6.816293e+05 1.190964e+06 1.077178e+06 1.081433e+06 -136636.777138 -136636.777138 -136636.777138 -136636.777138 -136636.777138 -136636.777138 0.0 0.0 0.0 9.425702e+05
19 2022-11-11 08:00:00 1.078909e+06 6.887918e+05 1.182781e+06 1.076737e+06 1.081340e+06 -140080.364654 -140080.364654 -140080.364654 -140080.364654 -140080.364654 -140080.364654 0.0 0.0 0.0 9.388286e+05
20 2022-11-11 09:00:00 1.078611e+06 6.818903e+05 1.180408e+06 1.076248e+06 1.081247e+06 -142099.516261 -142099.516261 -142099.516261 -142099.516261 -142099.516261 -142099.516261 0.0 0.0 0.0 9.365114e+05
21 2022-11-11 10:00:00 1.078313e+06 6.881211e+05 1.234654e+06 1.075812e+06 1.081176e+06 -132914.059255 -132914.059255 -132914.059255 -132914.059255 -132914.059255 -132914.059255 0.0 0.0 0.0 9.453989e+05
22 2022-11-11 11:00:00 1.078015e+06 7.139826e+05 1.212451e+06 1.075300e+06 1.080993e+06 -108532.478230 -108532.478230 -108532.478230 -108532.478230 -108532.478230 -108532.478230 0.0 0.0 0.0 9.694824e+05
23 2022-11-11 12:00:00 1.077717e+06 7.442306e+05 1.268394e+06 1.074799e+06 1.080894e+06 -77416.632034 -77416.632034 -77416.632034 -77416.632034 -77416.632034 -77416.632034 0.0 0.0 0.0 1.000300e+06
24 2022-11-11 13:00:00 1.077419e+06 7.679310e+05 1.302619e+06 1.074305e+06 1.080814e+06 -50708.195610 -50708.195610 -50708.195610 -50708.195610 -50708.195610 -50708.195610 0.0 0.0 0.0 1.026711e+06
25 2022-11-11 14:00:00 1.077121e+06 8.000724e+05 1.306347e+06 1.073822e+06 1.080666e+06 -27730.386000 -27730.386000 -27730.386000 -27730.386000 -27730.386000 -27730.386000 0.0 0.0 0.0 1.049391e+06
26 2022-11-11 15:00:00 1.076823e+06 8.146511e+05 1.333837e+06 1.073358e+06 1.080566e+06 5128.209138 5128.209138 5128.209138 5128.209138 5128.209138 5128.209138 0.0 0.0 0.0 1.081951e+06
27 2022-11-11 16:00:00 1.076525e+06 8.750815e+05 1.390111e+06 1.072836e+06 1.080452e+06 58145.300059 58145.300059 58145.300059 58145.300059 58145.300059 58145.300059 0.0 0.0 0.0 1.134670e+06
28 2022-11-11 17:00:00 1.076227e+06 9.665955e+05 1.448912e+06 1.072368e+06 1.080370e+06 120698.577706 120698.577706 120698.577706 120698.577706 120698.577706 120698.577706 0.0 0.0 0.0 1.196925e+06
29 2022-11-11 18:00:00 1.075929e+06 9.796960e+05 1.493271e+06 1.071863e+06 1.080259e+06 162838.172667 162838.172667 162838.172667 162838.172667 162838.172667 162838.172667 0.0 0.0 0.0 1.238767e+06
30 2022-11-11 19:00:00 1.075631e+06 1.007934e+06 1.500901e+06 1.071331e+06 1.080153e+06 158808.587813 158808.587813 158808.587813 158808.587813 158808.587813 158808.587813 0.0 0.0 0.0 1.234439e+06
31 2022-11-11 20:00:00 1.075333e+06 9.381723e+05 1.463547e+06 1.070820e+06 1.080123e+06 112346.797177 112346.797177 112346.797177 112346.797177 112346.797177 112346.797177 0.0 0.0 0.0 1.187680e+06
32 2022-11-11 21:00:00 1.075035e+06 8.814101e+05 1.388168e+06 1.070353e+06 1.080046e+06 58719.632354 58719.632354 58719.632354 58719.632354 58719.632354 58719.632354 0.0 0.0 0.0 1.133754e+06
33 2022-11-11 22:00:00 1.074737e+06 8.680345e+05 1.371115e+06 1.069871e+06 1.080029e+06 38319.221474 38319.221474 38319.221474 38319.221474 38319.221474 38319.221474 0.0 0.0 0.0 1.113056e+06
34 2022-11-11 23:00:00 1.074439e+06 8.915199e+05 1.378423e+06 1.069271e+06 1.079977e+06 63331.212235 63331.212235 63331.212235 63331.212235 63331.212235 63331.212235 0.0 0.0 0.0 1.137770e+06
35 2022-11-12 00:00:00 1.074141e+06 9.163265e+05 1.425541e+06 1.068790e+06 1.079900e+06 106892.705835 106892.705835 106892.705835 106892.705835 106892.705835 106892.705835 0.0 0.0 0.0 1.181034e+06
36 2022-11-12 01:00:00 1.073843e+06 9.454869e+05 1.464206e+06 1.068222e+06 1.079823e+06 124873.729041 124873.729041 124873.729041 124873.729041 124873.729041 124873.729041 0.0 0.0 0.0 1.198717e+06
In [18]:
df1_test=df1_test.reset_index(drop=True)

Plot and compare the prediction and true value¶

In [19]:
matplotlib.pyplot.plot(preds['yhat_upper'], label='Upper Limit')
matplotlib.pyplot.plot(df1_test['y'], label='Actual')
matplotlib.pyplot.plot(preds['yhat'], label='Predicted')
matplotlib.pyplot.plot(preds['yhat_lower'], label='Lower Limit')
matplotlib.pyplot.legend()
matplotlib.pyplot.show()