Spaces:
Sleeping
Sleeping
Daniel Varga commited on
Commit ·
969cffd
1
Parent(s): 8ec3059
vis
Browse files- demo_prophet.py +15 -15
demo_prophet.py
CHANGED
|
@@ -22,6 +22,11 @@ def prophet_backend(train_data, forecast_horizon):
|
|
| 22 |
yearly_seasonality=False, weekly_seasonality=True, daily_seasonality=True,
|
| 23 |
holidays=HOLIDAY_DF)
|
| 24 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
model.fit(train_data)
|
| 26 |
|
| 27 |
# Create a DataFrame with future timestamps for the evaluation period
|
|
@@ -34,17 +39,7 @@ def prophet_backend(train_data, forecast_horizon):
|
|
| 34 |
for key in ('yhat', 'yhat_lower', 'yhat_upper'):
|
| 35 |
forecast[key] = np.maximum(forecast[key], PREDICTION_LOWER_BOUND)
|
| 36 |
|
| 37 |
-
return forecast
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
def sklearn_backend(train_data, forecast_horizon):
|
| 41 |
-
dc = train_data[['y']]
|
| 42 |
-
# inserting new column with yesterday's consumption values
|
| 43 |
-
for i in range(1, 4 * 24 + 1):
|
| 44 |
-
dc.loc[:, 'd%02d' % i] = dc.loc[:,'y'].shift(4 * 24 + i) # t-2days to t-1day
|
| 45 |
-
dc.loc[:, 'w%02d' % i] = dc.loc[:,'y'].shift(7 * 4 * 24 + i) # t-7days to t-8days
|
| 46 |
-
dc.info()
|
| 47 |
-
exit()
|
| 48 |
|
| 49 |
|
| 50 |
def prediction_task(backend, df, split_date, forecast_horizon):
|
|
@@ -53,12 +48,15 @@ def prediction_task(backend, df, split_date, forecast_horizon):
|
|
| 53 |
eval_data = df[df['ds'] > split_date]
|
| 54 |
eval_data = eval_data.head(forecast_horizon)
|
| 55 |
|
| 56 |
-
forecast = backend(train_data, forecast_horizon)
|
| 57 |
|
| 58 |
mae = mean_absolute_error(eval_data['y'], forecast['yhat'])
|
| 59 |
|
| 60 |
do_vis = False
|
| 61 |
if do_vis:
|
|
|
|
|
|
|
|
|
|
| 62 |
plt.figure(figsize=(12, 6))
|
| 63 |
plt.plot(eval_data['ds'], eval_data['y'], label='Actual', color='blue')
|
| 64 |
plt.plot(forecast['ds'], forecast['yhat'], label='Predicted', color='red')
|
|
@@ -69,14 +67,14 @@ def prediction_task(backend, df, split_date, forecast_horizon):
|
|
| 69 |
plt.legend()
|
| 70 |
plt.grid(True)
|
| 71 |
plt.show()
|
| 72 |
-
|
| 73 |
fig1 = model.plot(forecast)
|
| 74 |
plt.plot(eval_data['ds'], eval_data['y'], c='r')
|
| 75 |
plt.show()
|
| 76 |
-
'''
|
| 77 |
|
| 78 |
fig2 = model.plot_components(forecast)
|
| 79 |
plt.show()
|
|
|
|
| 80 |
|
| 81 |
return mae, eval_data['y'].mean()
|
| 82 |
|
|
@@ -100,7 +98,8 @@ df['y'] = df['Consumption']
|
|
| 100 |
|
| 101 |
|
| 102 |
# TODO 15 minutes timestep hardwired!
|
| 103 |
-
forecast_horizon =
|
|
|
|
| 104 |
|
| 105 |
|
| 106 |
start_date = '2021-06-01'
|
|
@@ -112,6 +111,7 @@ weekly_date_range = pd.date_range(start=start_date, end=end_date, freq='8d')
|
|
| 112 |
maes = []
|
| 113 |
mean_values = []
|
| 114 |
for split_date in weekly_date_range:
|
|
|
|
| 115 |
mae, mean_value = prediction_task(prophet_backend, df, split_date, forecast_horizon)
|
| 116 |
maes.append(mae)
|
| 117 |
mean_values.append(mean_value)
|
|
|
|
| 22 |
yearly_seasonality=False, weekly_seasonality=True, daily_seasonality=True,
|
| 23 |
holidays=HOLIDAY_DF)
|
| 24 |
|
| 25 |
+
# we can also play with setting daily_seasonality=False above, and then manually adding
|
| 26 |
+
# model.add_seasonality("daily", 1, fourier_order=10, prior_scale=100, mode="multiplicative")
|
| 27 |
+
# ...it didn't really work though. bumping the fourier_order helps, but makes the model slow.
|
| 28 |
+
# the rest didn't have much effect.
|
| 29 |
+
|
| 30 |
model.fit(train_data)
|
| 31 |
|
| 32 |
# Create a DataFrame with future timestamps for the evaluation period
|
|
|
|
| 39 |
for key in ('yhat', 'yhat_lower', 'yhat_upper'):
|
| 40 |
forecast[key] = np.maximum(forecast[key], PREDICTION_LOWER_BOUND)
|
| 41 |
|
| 42 |
+
return forecast, model
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
|
| 44 |
|
| 45 |
def prediction_task(backend, df, split_date, forecast_horizon):
|
|
|
|
| 48 |
eval_data = df[df['ds'] > split_date]
|
| 49 |
eval_data = eval_data.head(forecast_horizon)
|
| 50 |
|
| 51 |
+
forecast, model = backend(train_data, forecast_horizon)
|
| 52 |
|
| 53 |
mae = mean_absolute_error(eval_data['y'], forecast['yhat'])
|
| 54 |
|
| 55 |
do_vis = False
|
| 56 |
if do_vis:
|
| 57 |
+
future = model.make_future_dataframe(periods=forecast_horizon, freq='15T', include_history=True)
|
| 58 |
+
forecast = model.predict(future)
|
| 59 |
+
|
| 60 |
plt.figure(figsize=(12, 6))
|
| 61 |
plt.plot(eval_data['ds'], eval_data['y'], label='Actual', color='blue')
|
| 62 |
plt.plot(forecast['ds'], forecast['yhat'], label='Predicted', color='red')
|
|
|
|
| 67 |
plt.legend()
|
| 68 |
plt.grid(True)
|
| 69 |
plt.show()
|
| 70 |
+
|
| 71 |
fig1 = model.plot(forecast)
|
| 72 |
plt.plot(eval_data['ds'], eval_data['y'], c='r')
|
| 73 |
plt.show()
|
|
|
|
| 74 |
|
| 75 |
fig2 = model.plot_components(forecast)
|
| 76 |
plt.show()
|
| 77 |
+
exit()
|
| 78 |
|
| 79 |
return mae, eval_data['y'].mean()
|
| 80 |
|
|
|
|
| 98 |
|
| 99 |
|
| 100 |
# TODO 15 minutes timestep hardwired!
|
| 101 |
+
forecast_horizon = 24 * 4
|
| 102 |
+
print("forecast horizon", forecast_horizon // 4, "hours")
|
| 103 |
|
| 104 |
|
| 105 |
start_date = '2021-06-01'
|
|
|
|
| 111 |
maes = []
|
| 112 |
mean_values = []
|
| 113 |
for split_date in weekly_date_range:
|
| 114 |
+
# prophet_backend is the only backend currently
|
| 115 |
mae, mean_value = prediction_task(prophet_backend, df, split_date, forecast_horizon)
|
| 116 |
maes.append(mae)
|
| 117 |
mean_values.append(mean_value)
|