def test_ktrlite_span_level(make_daily_data, span_level): train_df, test_df, coef = make_daily_data ktrlite = KTRLiteMAP( response_col='response', date_col='date', seasonality=[7, 365.25], seasonality_fs_order=[2, 5], span_level=span_level, estimator_type=StanEstimatorMAP ) ktrlite.fit(train_df) predict_df = ktrlite.predict(test_df) expected_columns = ['date', 'prediction_5', 'prediction', 'prediction_95'] expected_shape = (364, len(expected_columns)) expected_num_parameters = 6 assert predict_df.shape == expected_shape assert predict_df.columns.tolist() == expected_columns assert len(ktrlite._posterior_samples) == expected_num_parameters assert smape(test_df['response'].values, predict_df['prediction'].values) <= SMAPE_TOLERANCE knots_df = ktrlite.get_level_knots() levels_df = ktrlite.get_levels() assert knots_df.shape[0] == round(1/span_level) assert levels_df.shape[0] == ktrlite.num_of_observations
def test_ktrlite_level_knot_dates(make_daily_data, level_knot_dates): train_df, test_df, coef = make_daily_data ktrlite = KTRLiteMAP( response_col='response', date_col='date', seasonality=[7, 365.25], seasonality_fs_order=[2, 5], level_knot_dates=level_knot_dates, estimator_type=StanEstimatorMAP ) ktrlite.fit(train_df) predict_df = ktrlite.predict(test_df) expected_columns = ['date', 'prediction_5', 'prediction', 'prediction_95'] expected_shape = (364, len(expected_columns)) expected_num_parameters = 6 assert predict_df.shape == expected_shape assert predict_df.columns.tolist() == expected_columns assert len(ktrlite._posterior_samples) == expected_num_parameters assert smape(test_df['response'].values, predict_df['prediction'].values) <= SMAPE_TOLERANCE assert np.all(np.isin(ktrlite.level_knot_dates, level_knot_dates)) assert len(ktrlite.level_knot_dates) == len(level_knot_dates)
def test_ktrlite_predict_decompose(make_daily_data): train_df, test_df, coef = make_daily_data ktrlite = KTRLiteMAP( response_col='response', date_col='date', seasonality=[7, 365.25], seasonality_fs_order=[2, 5], estimator_type=StanEstimatorMAP ) ktrlite.fit(train_df) predict_df = ktrlite.predict(test_df, decompose=True) expected_columns = ['date', 'prediction_5', 'prediction', 'prediction_95', 'trend_5', 'trend', 'trend_95', 'seasonality_7_5', 'seasonality_7', 'seasonality_7_95', 'seasonality_365.25_5', 'seasonality_365.25', 'seasonality_365.25_95'] expected_shape = (364, len(expected_columns)) expected_num_parameters = 6 assert predict_df.shape == expected_shape assert predict_df.columns.tolist() == expected_columns assert len(ktrlite._posterior_samples) == expected_num_parameters assert smape(test_df['response'].values, predict_df['prediction'].values) <= SMAPE_TOLERANCE
def test_ktrlite_dual_seas(make_daily_data, seasonality_fs_order): train_df, _, _ = make_daily_data ktrlite = KTRLite( response_col='response', date_col='date', seasonality=[7, 365.25], seasonality_fs_order=seasonality_fs_order, estimator='stan-map', n_bootstrap_draws=-1, ) ktrlite.fit(train_df) predict_df = ktrlite.predict(train_df) expected_columns = ['date', 'prediction'] expected_shape = (train_df.shape[0], len(expected_columns)) expected_num_parameters = 6 assert predict_df.shape == expected_shape assert predict_df.columns.tolist() == expected_columns assert len(ktrlite._posterior_samples) == expected_num_parameters smape_val = smape(train_df['response'].values, predict_df['prediction'].values) assert smape_val <= SMAPE_TOLERANCE
def test_ktr_seasonality(make_daily_data, seasonality, seas_segments): train_df, _, _ = make_daily_data ktr = KTR( response_col='response', date_col='date', estimator='pyro-svi', seasonality=seasonality, seasonality_segments=seas_segments, num_steps=100, num_sample=100, n_bootstrap_draws=-1, ) ktr.fit(train_df) predict_df = ktr.predict(train_df, decompose=True) expected_columns = [ 'date', 'prediction_5', 'prediction', 'prediction_95', 'trend_5', 'trend', 'trend_95', 'regression_5', 'regression', 'regression_95', ] if len(seasonality) == 1: expected_columns += [ 'seasonality_365.25_5', 'seasonality_365.25', 'seasonality_365.25_95' ] if len(seasonality) == 2: expected_columns += [ 'seasonality_7_5', 'seasonality_7', 'seasonality_7_95', 'seasonality_365.25_5', 'seasonality_365.25', 'seasonality_365.25_95', ] expected_shape = (train_df.shape[0], len(expected_columns)) assert predict_df.shape == expected_shape assert predict_df.columns.tolist() == expected_columns assert np.all(np.isfinite(predict_df['prediction'].values)) smape_val = smape(train_df['response'].values, predict_df['prediction'].values) assert smape_val <= SMAPE_TOLERANCE
def test_ktrx_coef_knot_distance(make_daily_data, coefficients_knot_length): train_df, test_df, coef = make_daily_data ktrlite = KTRLiteMAP(response_col='response', date_col='date', seasonality=[7, 365.25], seasonality_fs_order=[2, 5], estimator_type=StanEstimatorMAP) ktrlite.fit(train_df) level_knot_dates = ktrlite._level_knot_dates level_knots = ktrlite._aggregate_posteriors['map']['lev_knot'][0] seasonal_knots_input = { '_seas_coef_knot_dates': ktrlite._coef_knot_dates, '_sea_coef_knot': ktrlite._aggregate_posteriors['map']['coef_knot'], '_seasonality': ktrlite._seasonality, '_seasonality_fs_order': ktrlite._seasonality_fs_order, } ktrx = KTRXAggregated( response_col='response', date_col='date', regressor_col=['a', 'b', 'c'], coefficients_knot_length=coefficients_knot_length, level_knot_dates=level_knot_dates, level_knots=level_knots, seasonal_knots_input=seasonal_knots_input, estimator_type=PyroEstimatorVI, ) ktrx.fit(train_df) predict_df = ktrx.predict(test_df) expected_columns = ['date', 'prediction_5', 'prediction', 'prediction_95'] expected_shape = (364, len(expected_columns)) expected_num_parameters = 7 assert predict_df.shape == expected_shape assert predict_df.columns.tolist() == expected_columns assert len(ktrx._posterior_samples) == expected_num_parameters assert smape(test_df['response'].values, predict_df['prediction'].values) <= 0.5
def test_ktrlite_dual_seas(make_daily_data, estimator_type): train_df, test_df, coef = make_daily_data ktrlite = KTRLiteMAP(response_col='response', date_col='date', seasonality=[7, 365.25], seasonality_fs_order=[2, 5], estimator_type=estimator_type) ktrlite.fit(train_df) predict_df = ktrlite.predict(test_df) expected_columns = ['date', 'prediction_5', 'prediction', 'prediction_95'] expected_shape = (364, len(expected_columns)) expected_num_parameters = 6 assert predict_df.shape == expected_shape assert predict_df.columns.tolist() == expected_columns assert len(ktrlite._posterior_samples) == expected_num_parameters assert smape(test_df['response'].values, predict_df['prediction'].values) <= 0.5
def test_ktrlite_hourly_data(ca_hourly_electricity_data): train_df, test_df = ca_hourly_electricity_data ktrlite = KTRLite( response_col='SDGE', date_col='Dates', seasonality=[24, 7, 365.25], seasonality_fs_order=[3, 3, 5], estimator='stan-map', n_bootstrap_draws=-1, ) ktrlite.fit(train_df) predict_df = ktrlite.predict(train_df) expected_columns = ['Dates', 'prediction'] expected_shape = (train_df.shape[0], len(expected_columns)) expected_num_parameters = 6 assert predict_df.shape == expected_shape assert predict_df.columns.tolist() == expected_columns assert len(ktrlite._posterior_samples) == expected_num_parameters smape_val = smape(train_df['SDGE'].values, predict_df['prediction'].values) assert smape_val <= SMAPE_TOLERANCE