def test_events(self): log.info("testing: Events") df = pd.read_csv(PEYTON_FILE)[-NROWS:] playoffs = pd.DataFrame( { "event": "playoff", "ds": pd.to_datetime( [ "2008-01-13", "2009-01-03", "2010-01-16", "2010-01-24", "2010-02-07", "2011-01-08", "2013-01-12", "2014-01-12", "2014-01-19", "2014-02-02", "2015-01-11", "2016-01-17", "2016-01-24", "2016-02-07", ] ), } ) superbowls = pd.DataFrame( { "event": "superbowl", "ds": pd.to_datetime(["2010-02-07", "2014-02-02", "2016-02-07"]), } ) events_df = pd.concat((playoffs, superbowls)) m = NeuralProphet( n_lags=2, n_forecasts=30, daily_seasonality=False, epochs=EPOCHS, batch_size=BATCH_SIZE, ) # set event windows m = m.add_events( ["superbowl", "playoff"], lower_window=-1, upper_window=1, mode="multiplicative", regularization=0.5 ) # add the country specific holidays m = m.add_country_holidays("US", mode="additive", regularization=0.5) history_df = m.create_df_with_events(df, events_df) metrics_df = m.fit(history_df, freq="D") future = m.make_future_dataframe(df=history_df, events_df=events_df, periods=30, n_historic_predictions=90) forecast = m.predict(df=future) log.debug("Event Parameters:: {}".format(m.model.event_params)) if self.plot: m.plot_components(forecast) m.plot(forecast) m.plot_parameters() plt.show()
def seek_the_oracle(current_series, args, series, forecast_length, future_regressor): """Prophet for for loop or parallel.""" current_series = current_series.rename(columns={series: 'y'}) current_series['ds'] = current_series.index try: quant_range = (1 - args['prediction_interval']) / 2 quantiles = [quant_range, 0.5, (1 - quant_range)] m = NeuralProphet( quantiles=quantiles, growth=self.growth, n_changepoints=self.n_changepoints, changepoints_range=self.changepoints_range, trend_reg=self.trend_reg, trend_reg_threshold=self.trend_reg_threshold, ar_sparsity=self.ar_sparsity, yearly_seasonality=self.yearly_seasonality, weekly_seasonality=self.weekly_seasonality, daily_seasonality=self.daily_seasonality, seasonality_mode=self.seasonality_mode, seasonality_reg=self.seasonality_reg, n_lags=self.n_lags, n_forecasts=forecast_length, num_hidden_layers=self.num_hidden_layers, d_hidden=self.d_hidden, learning_rate=self.learning_rate, loss_func=self.loss_func, train_speed=self.train_speed, normalize=self.normalize, collect_metrics=False, ) except Exception: m = NeuralProphet( growth=self.growth, n_changepoints=self.n_changepoints, changepoints_range=self.changepoints_range, trend_reg=self.trend_reg, trend_reg_threshold=self.trend_reg_threshold, ar_sparsity=self.ar_sparsity, yearly_seasonality=self.yearly_seasonality, weekly_seasonality=self.weekly_seasonality, daily_seasonality=self.daily_seasonality, seasonality_mode=self.seasonality_mode, seasonality_reg=self.seasonality_reg, n_lags=self.n_lags, n_forecasts=forecast_length, num_hidden_layers=self.num_hidden_layers, d_hidden=self.d_hidden, learning_rate=self.learning_rate, loss_func=self.loss_func, train_speed=self.train_speed, normalize=self.normalize, collect_metrics=False, ) if args['holiday']: m.add_country_holidays(country_name=args['holiday_country']) if args['regression_type'] == 'User': current_series = pd.concat( [current_series, args['regressor_train']], axis=1) for nme in args['regressor_name']: m.add_future_regressor(nme) m.fit(current_series, freq=args['freq'], progress_print=False, minimal=True) if args['regression_type'] == 'User': if future_regressor.ndim > 1: if future_regressor.shape[1] > 1: ft_regr = (future_regressor.mean( axis=1).to_frame().merge( future_regressor.std(axis=1).to_frame(), left_index=True, right_index=True, )) else: ft_regr = future_regressor.copy() ft_regr.columns = args['regressor_train'].columns regr = pd.concat([args['regressor_train'], ft_regr]) regr.columns = args['regressor_train'].columns # regr.index.name = 'ds' # regr.reset_index(drop=False, inplace=True) # future = future.merge(regr, on="ds", how='left') else: # a = np.append(args['regressor_train'], future_regressor.values) regr = future_regressor future = m.make_future_dataframe(current_series, periods=forecast_length, regressors_df=regr) else: future = m.make_future_dataframe(current_series, periods=forecast_length) fcst = m.predict(future, decompose=False) fcst = fcst.tail(forecast_length) # remove the backcast # predicting that someday they will change back to fbprophet format if "yhat2" in fcst.columns: fcst['yhat1'] = fcst.fillna(0).sum(axis=1, numeric_only=True) try: forecast = fcst['yhat1'] except Exception: forecast = fcst['yhat'] forecast.name = series # not yet supported, so fill with the NaN column for now if missing try: lower_forecast = fcst['yhat_lower'] upper_forecast = fcst['yhat_upper'] except Exception: lower_forecast = fcst['y'] upper_forecast = fcst['y'] lower_forecast.name = series upper_forecast.name = series return (forecast, lower_forecast, upper_forecast)