Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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