Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MNT] Hotfix tag scitype:y typo #1449

Merged
merged 11 commits into from Sep 27, 2021
27 changes: 18 additions & 9 deletions sktime/forecasting/tests/test_all_forecasters.py
Expand Up @@ -62,8 +62,9 @@
def test_get_fitted_params(Forecaster):
"""Test get_fitted_params."""
f = _construct_instance(Forecaster)
columns = _get_n_columns(f.get_tag("y:scitype"))
columns = _get_n_columns(f.get_tag("scitype:y"))
for n_columns in columns:
f = _construct_instance(Forecaster)
y_train = _make_series(n_columns=n_columns)
f.fit(y_train, fh=FH0)
try:
Expand Down Expand Up @@ -130,9 +131,10 @@ def test_y_invalid_type_raises_error(Forecaster, y):
def test_X_invalid_type_raises_error(Forecaster, X):
"""Test that invalid X input types raise error."""
f = _construct_instance(Forecaster)
n_columns_list = _get_n_columns(f.get_tag("y:scitype"))
n_columns_list = _get_n_columns(f.get_tag("scitype:y"))

for n_columns in n_columns_list:
f = _construct_instance(Forecaster)
y_train = _make_series(n_columns=n_columns)
try:
with pytest.raises(TypeError, match=r"type"):
Expand All @@ -150,9 +152,10 @@ def test_X_invalid_type_raises_error(Forecaster, X):
def test_predict_time_index(Forecaster, index_type, fh_type, is_relative, steps):
"""Check that predicted time index matches forecasting horizon."""
f = _construct_instance(Forecaster)
n_columns_list = _get_n_columns(f.get_tag("y:scitype"))
n_columns_list = _get_n_columns(f.get_tag("scitype:y"))

for n_columns in n_columns_list:
f = _construct_instance(Forecaster)
y_train = _make_series(
n_columns=n_columns, index_type=index_type, n_timepoints=50
)
Expand All @@ -175,13 +178,14 @@ def test_predict_time_index(Forecaster, index_type, fh_type, is_relative, steps)
def test_predict_time_index_with_X(Forecaster, index_type, fh_type, is_relative, steps):
"""Check that predicted time index matches forecasting horizon."""
f = _construct_instance(Forecaster)
n_columns_list = _get_n_columns(f.get_tag("y:scitype"))
n_columns_list = _get_n_columns(f.get_tag("scitype:y"))

z, X = make_forecasting_problem(index_type=index_type, make_X=True)

# Some estimators may not support all time index types and fh types, hence we
# need to catch NotImplementedErrors.
for n_columns in n_columns_list:
f = _construct_instance(Forecaster)
y = _make_series(n_columns=n_columns, index_type=index_type)
cutoff = y.index[len(y) // 2]
fh = _make_fh(cutoff, steps, fh_type, is_relative)
Expand All @@ -205,9 +209,10 @@ def test_predict_time_index_in_sample_full(
):
"""Check that predicted time index equals fh for full in-sample predictions."""
f = _construct_instance(Forecaster)
n_columns_list = _get_n_columns(f.get_tag("y:scitype"))
n_columns_list = _get_n_columns(f.get_tag("scitype:y"))

for n_columns in n_columns_list:
f = _construct_instance(Forecaster)
y_train = _make_series(n_columns=n_columns, index_type=index_type)
cutoff = y_train.index[-1]
steps = -np.arange(len(y_train))
Expand Down Expand Up @@ -265,9 +270,10 @@ def test_predict_pred_interval(Forecaster, fh, alpha):
and no NotImplementedError is raised when asking predict for pred.int
"""
f = _construct_instance(Forecaster)
n_columns_list = _get_n_columns(f.get_tag("y:scitype"))
n_columns_list = _get_n_columns(f.get_tag("scitype:y"))

for n_columns in n_columns_list:
f = _construct_instance(Forecaster)
y_train = _make_series(n_columns=n_columns)
f.fit(y_train, fh=fh)
if f.get_tag("capability:pred_int"):
Expand All @@ -284,9 +290,10 @@ def test_predict_pred_interval(Forecaster, fh, alpha):
def test_score(Forecaster, fh):
"""Check score method."""
f = _construct_instance(Forecaster)
n_columns_list = _get_n_columns(f.get_tag("y:scitype"))
n_columns_list = _get_n_columns(f.get_tag("scitype:y"))

for n_columns in n_columns_list:
f = _construct_instance(Forecaster)
y = _make_series(n_columns=n_columns)
y_train, y_test = temporal_train_test_split(y)
f.fit(y_train, fh=fh)
Expand All @@ -309,9 +316,10 @@ def test_score(Forecaster, fh):
def test_update_predict_single(Forecaster, fh, update_params):
"""Check correct time index of update-predict."""
f = _construct_instance(Forecaster)
n_columns_list = _get_n_columns(f.get_tag("y:scitype"))
n_columns_list = _get_n_columns(f.get_tag("scitype:y"))

for n_columns in n_columns_list:
f = _construct_instance(Forecaster)
y = _make_series(n_columns=n_columns)
y_train, y_test = temporal_train_test_split(y)
f.fit(y_train, fh=fh)
Expand All @@ -323,9 +331,10 @@ def _check_update_predict_predicted_index(
Forecaster, fh, window_length, step_length, update_params
):
f = _construct_instance(Forecaster)
n_columns_list = _get_n_columns(f.get_tag("y:scitype"))
n_columns_list = _get_n_columns(f.get_tag("scitype:y"))

for n_columns in n_columns_list:
f = _construct_instance(Forecaster)
y_train = _make_series(
n_columns=n_columns, all_positive=True, index_type="datetime"
)
Expand Down
17 changes: 10 additions & 7 deletions sktime/forecasting/tests/test_sktime_forecasters.py
Expand Up @@ -55,9 +55,10 @@ def test_oh_setting(Forecaster):
"""Check cuttoff and _y."""
# check _y and cutoff is None after construction
f = _construct_instance(Forecaster)
n_columns_list = _get_n_columns(f.get_tag("y:scitype"))
n_columns_list = _get_n_columns(f.get_tag("scitype:y"))

for n_columns in n_columns_list:
f = _construct_instance(Forecaster)
y = _make_series(n_columns=n_columns)
y_train, y_test = temporal_train_test_split(y, train_size=0.75)

Expand Down Expand Up @@ -143,9 +144,10 @@ def test_different_fh_in_fit_and_predict_req(Forecaster):
def test_no_fh_opt(Forecaster):
"""Check if fh is optional in fit."""
f = _construct_instance(Forecaster)
n_columns_list = _get_n_columns(f.get_tag("y:scitype"))
n_columns_list = _get_n_columns(f.get_tag("scitype:y"))

for n_columns in n_columns_list:
f = _construct_instance(Forecaster)
y_train = _make_series(n_columns=n_columns)
f.fit(y_train)
# not passing fh to either fit or predict raises error
Expand All @@ -157,11 +159,11 @@ def test_no_fh_opt(Forecaster):
def test_fh_in_fit_opt(Forecaster):
"""Check if fh is optional in fit."""
f = _construct_instance(Forecaster)
n_columns_list = _get_n_columns(f.get_tag("y:scitype"))
n_columns_list = _get_n_columns(f.get_tag("scitype:y"))

for n_columns in n_columns_list:
y_train = _make_series(n_columns=n_columns)
f = _construct_instance(Forecaster)
y_train = _make_series(n_columns=n_columns)
f.fit(y_train, fh=FH0)
np.testing.assert_array_equal(f.fh, FH0)
f.predict()
Expand All @@ -172,12 +174,12 @@ def test_fh_in_fit_opt(Forecaster):
def test_fh_in_predict_opt(Forecaster):
"""Check if fh is optional in predict."""
f = _construct_instance(Forecaster)
n_columns_list = _get_n_columns(f.get_tag("y:scitype"))
n_columns_list = _get_n_columns(f.get_tag("scitype:y"))

for n_columns in n_columns_list:
f = _construct_instance(Forecaster)
y_train = _make_series(n_columns=n_columns)
y_train = _make_series(n_columns=1)
f = _construct_instance(Forecaster)
f.fit(y_train)
f.predict(FH0)
np.testing.assert_array_equal(f.fh, FH0)
Expand All @@ -187,9 +189,10 @@ def test_fh_in_predict_opt(Forecaster):
def test_same_fh_in_fit_and_predict_opt(Forecaster):
"""Check if fh is the same in fit and predict."""
f = _construct_instance(Forecaster)
n_columns_list = _get_n_columns(f.get_tag("y:scitype"))
n_columns_list = _get_n_columns(f.get_tag("scitype:y"))

for n_columns in n_columns_list:
f = _construct_instance(Forecaster)
y_train = _make_series(n_columns=n_columns)

# passing the same fh to both fit and predict works
Expand Down
32 changes: 28 additions & 4 deletions sktime/utils/_testing/forecasting.py
Expand Up @@ -29,11 +29,13 @@ def _get_n_columns(tag):
n_columns_list = [2]
elif tag == "both":
n_columns_list = [1, 2]
else:
raise ValueError(f"Unexpected tag {tag}.")
return n_columns_list


def _get_expected_index_for_update_predict(y, fh, step_length):
"""Helper function to compute expected time index from `update_predict`"""
"""Compute expected time index from `update_predict`."""
# time points at which to make predictions
fh = check_fh(fh)
index = y.index
Expand Down Expand Up @@ -69,8 +71,7 @@ def _get_expected_index_for_update_predict(y, fh, step_length):


def _generate_polynomial_series(n, order, coefs=None):
"""Helper function to generate polynomial series of given order and
coefficients"""
"""Generate polynomial series of given order and coefficients."""
if coefs is None:
coefs = np.ones((order + 1, 1))
x = np.vander(np.arange(n), N=order + 1).dot(coefs)
Expand All @@ -85,6 +86,29 @@ def make_forecasting_problem(
n_columns=2,
random_state=None,
):
"""Return test data for forecasting tests.

Parameters
----------
n_timepoints : int, optional
Lenght of data, by default 50
all_positive : bool, optional
Only positive values or not, by default True
index_type : e.g. pd.PeriodIndex, optional
pandas Index type, by default None
make_X : bool, optional
Should X data also be returned, by default False
n_columns : int, optional
Number of columns of X, by default 2
random_state : inst, str, float, optional
Set seed of random state, by default None

Returns
-------
ps.Series, pd.DataFrame
y, if not make_X
y, X if make_X
"""
y = _make_series(
n_timepoints=n_timepoints,
n_columns=1,
Expand Down Expand Up @@ -115,7 +139,7 @@ def _assert_correct_pred_time_index(y_pred_index, cutoff, fh):


def _make_fh(cutoff, steps, fh_type, is_relative):
"""Helper function to construct forecasting horizons for testing"""
"""Construct forecasting horizons for testing."""
from sktime.forecasting.tests._config import INDEX_TYPE_LOOKUP

fh_class = INDEX_TYPE_LOOKUP[fh_type]
Expand Down