def test_invalid_aggfuncs(forecasters, aggfunc): """Check if invalid aggregation functions return Error.""" y = make_forecasting_problem() forecaster = EnsembleForecaster(forecasters=forecasters, aggfunc=aggfunc) forecaster.fit(y, fh=[1, 2]) with pytest.raises(ValueError, match=r"not recognized"): forecaster.predict()
def test_avg_mean(forecasters): """Assert `mean` aggfunc returns the same values as `average` with equal weights.""" y = make_forecasting_problem() forecaster = EnsembleForecaster(forecasters) forecaster.fit(y, fh=[1, 2, 3]) mean_pred = forecaster.predict() forecaster_1 = EnsembleForecaster(forecasters, aggfunc="mean", weights=[1, 1]) forecaster_1.fit(y, fh=[1, 2, 3]) avg_pred = forecaster_1.predict() pd.testing.assert_series_equal(mean_pred, avg_pred)
def test_aggregation_unweighted(forecasters, aggfunc): """Assert aggfunc returns the correct values.""" y = make_forecasting_problem() forecaster = EnsembleForecaster(forecasters=forecasters, aggfunc=aggfunc) forecaster.fit(y, fh=[1, 2, 3]) actual_pred = forecaster.predict() predictions = [] _aggfunc = VALID_AGG_FUNCS[aggfunc]["unweighted"] for _, forecaster in forecasters: f = forecaster f.fit(y) f_pred = f.predict(fh=[1, 2, 3]) predictions.append(f_pred) predictions = pd.DataFrame(predictions).T expected_pred = predictions.apply(func=_aggfunc, axis=1) pd.testing.assert_series_equal(actual_pred, expected_pred)
def run_sktimes(dept_id, store_id): # create timeseries for fbprophet ts = CreateTimeSeries(dept_id, store_id) # sktime ensembler forecaster = EnsembleForecaster([ ('naive_ses', NaiveForecaster(sp=28, strategy="seasonal_last")), ('naive', NaiveForecaster(strategy="last")), ('theta_ses', ThetaForecaster(sp=28)), ('theta', ThetaForecaster()), ("exp_ses", ExponentialSmoothing(seasonal="additive", sp=28)), ("exp_damped", ExponentialSmoothing(trend='additive', damped=True, seasonal="additive", sp=28)) ]) forecaster.fit(ts.y + 1) y_pred = forecaster.predict(np.arange(1, 29)) return np.append(np.array([dept_id, store_id]), y_pred - 1)
def test_aggregation_weighted(forecasters, aggfunc, weights): """Assert weighted aggfunc returns the correct values.""" y = make_forecasting_problem() forecaster = EnsembleForecaster( forecasters=forecasters, aggfunc=aggfunc, weights=weights ) forecaster.fit(y, fh=[1, 2, 3]) actual_pred = forecaster.predict() predictions = [] for _, forecaster in forecasters: f = forecaster f.fit(y) f_pred = f.predict(fh=[1, 2, 3]) predictions.append(f_pred) predictions = pd.DataFrame(predictions).T _aggfunc = VALID_AGG_FUNCS[aggfunc]["weighted"] expected_pred = pd.Series( _aggfunc(predictions, axis=1, weights=np.array(weights)), index=predictions.index, ) # expected_pred = predictions.apply(func=_aggfunc, axis=1, weights=weights) pd.testing.assert_series_equal(actual_pred, expected_pred)
def test_aggregation_weighted(forecasters, aggfunc, weights): """Assert weighted aggfunc returns the correct values.""" y = make_forecasting_problem() forecaster = EnsembleForecaster(forecasters=forecasters, aggfunc=aggfunc, weights=weights) forecaster.fit(y, fh=[1, 2, 3]) actual_pred = forecaster.predict() predictions = [] for _, forecaster in forecasters: f = forecaster f.fit(y) f_pred = f.predict(fh=[1, 2, 3]) predictions.append(f_pred) predictions = pd.DataFrame(predictions) if aggfunc == "mean": func = np.average else: func = gmean expected_pred = predictions.apply(func=func, axis=0, weights=weights) pd.testing.assert_series_equal(actual_pred, expected_pred)
def main(): df = datasets.load_airline( ) #Univariate, monthly records from 1949 to 60 (144 records) y_train, y_test = temporal_train_test_split( df, test_size=36) #36 months for testing forecaster = NaiveForecaster( strategy='seasonal_last', sp=12 ) #model strategy: last, mean, seasonal_last. sp=12months (yearly season) forecaster.fit(y_train) #fit fh = np.arange(1, len(y_test) + 1) #forecast horizon: array with the same lenght of y_test y_pred = forecaster.predict(fh) #pred forecaster2 = AutoARIMA(sp=12, suppress_warnings=True, trace=1) forecaster2.fit(y_train) y_pred2 = forecaster2.predict(fh) forecaster3 = ExponentialSmoothing(trend='add', damped='True', seasonal='multiplicative', sp=12) forecaster3.fit(y_train) y_pred3 = forecaster3.predict(fh) forecaster4 = ThetaForecaster(sp=12) forecaster4.fit(y_train) y_pred4 = forecaster4.predict(fh) forecaster5 = EnsembleForecaster([ ('NaiveForecaster', NaiveForecaster(strategy='seasonal_last', sp=12)), ('AutoARIMA', AutoARIMA(sp=12, suppress_warnings=True)), ('Exp Smoothing', ExponentialSmoothing(trend='add', damped='True', seasonal='multiplicative', sp=12)), ('Theta', ThetaForecaster(sp=12)) ]) forecaster5.fit(y_train) y_pred5 = forecaster5.predict(fh) plot_ys(y_train, y_test, y_pred, y_pred2, y_pred3, y_pred4, y_pred5, labels=[ 'Train', 'Test', 'Naive Forecaster', 'AutoARIMA', 'Exp Smoothing', 'Theta', 'Ensemble' ]) plt.xlabel('Months') plt.ylabel('Number of flights') plt.title( 'Time series of the number of international flights in function of time' ) plt.show() print('SMAPE Error for NaiveForecaster is:', 100 * round(smape_loss(y_test, y_pred), 3), '%') print('SMAPE Error for AutoARIMA is:', 100 * round(smape_loss(y_test, y_pred2), 3), '%') print('SMAPE Error for Exp Smoothing is:', 100 * round(smape_loss(y_test, y_pred3), 3), '%') print('SMAPE Error for Theta is:', 100 * round(smape_loss(y_test, y_pred4), 3), '%') print('SMAPE Error for Ensemble is:', 100 * round(smape_loss(y_test, y_pred5), 3), '%')