예제 #1
0
    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()
예제 #2
0
 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)