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/
import eia
import pandas as pd
import plotly.express as px
import prophet
from sklearn.metrics import mean_absolute_error
import matplotlib
region_data=eia.loaders.load_dataframe(data="rto-region-data")
region_data[region_data["type"]=="D"].groupby(['period']).sum()
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
#Convert data type
region_data=region_data[region_data["type"]=="D"].astype({'value':'float'})
#Aggregating Demand for each timestamp
df=region_data[region_data["type"]=="D"].groupby(['period']).sum()
#Converting the dataframe to a format prophet model understands
df1=pd.DataFrame()
df1["y"]=df["value"]
df1["ds"]=df.index
df1
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
#Visualising the timeseries data
df1.plot()
<AxesSubplot:xlabel='period'>
# Renaming the dataframe to a format prophet model understands
df1=df1.rename(columns={"value":"y"},index={"period":"ds"})
df1.index.names=["index"]
df1=df1.reset_index(drop=True)
df1_train,df1_test=df1[:int(0.8*len(df1))], df1[int(0.8*len(df1)):]
df1_test["ds"]
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
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
<prophet.forecaster.Prophet at 0x7fa63ba254c0>
model.history
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
preds=model.predict(df1_test)
preds
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 |
df1_test=df1_test.reset_index(drop=True)
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()