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

Remove access to changing TSDataset attributes #630

Merged
merged 35 commits into from
Mar 13, 2025
Merged
Changes from 1 commit
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
5a78a8f
create _df attribute
Mar 11, 2025
02d9bc5
change tests
Mar 11, 2025
4d12e73
Merge remote-tracking branch 'origin/master' into issue-598
Mar 11, 2025
38a1e62
create _raw_df attribute
Mar 11, 2025
6c4167d
change tests
Mar 11, 2025
5148e79
add _df_exog attribute
Mar 11, 2025
f028871
change tests
Mar 11, 2025
4472279
create _known_feature attribute and read_only property known_future
Mar 11, 2025
4bcc365
change tests and add new ones
Mar 11, 2025
f3218d5
create _freq attribute and read_only property freq
Mar 11, 2025
da4d848
add new test
Mar 11, 2025
b35684f
create _current_df_level attribute and property current_df_level
Mar 11, 2025
5a45b19
add new test
Mar 11, 2025
434f873
create _current_df_exog_level attribute and property current_df_exog_…
Mar 11, 2025
bb3d9bf
add new test
Mar 11, 2025
e5a521d
lint
Mar 11, 2025
e31c3b7
fix some tests
Mar 12, 2025
b26bbf6
change changelog
Mar 12, 2025
4f0606c
change notebooks
Mar 12, 2025
d1fb936
some fixes
Mar 12, 2025
a375969
change .columns to ._df.columns
Mar 12, 2025
1e0f91d
change .columns to ._df.columns
Mar 12, 2025
287e340
change .loc to ._df.loc
Mar 12, 2025
1ab14b4
lint
Mar 12, 2025
7298012
fix typo
Mar 12, 2025
36d9326
notebook view
Mar 12, 2025
c57c1b3
review fixed
Mar 12, 2025
f3f94cc
review fixed v2
Mar 12, 2025
0d3ff73
fix typo in changelog
Mar 12, 2025
7c3efd3
review fixed v3
Mar 12, 2025
72d51e3
review fixed v4
Mar 13, 2025
9aa9789
review fixed v5
Mar 13, 2025
b24b65a
fix isnull docs
Mar 13, 2025
bd0de1f
fix isnull docs
Mar 13, 2025
5dfb9e8
fix isnull docs
Mar 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
change tests and add new ones
Danil Smorchkov authored and Danil Smorchkov committed Mar 11, 2025
commit 4bcc36513862c0e021a0276713f396044204fd98
23 changes: 19 additions & 4 deletions tests/test_datasets/test_dataset.py
Original file line number Diff line number Diff line change
@@ -1495,7 +1495,7 @@ def test_to_dataset_not_modify_dataframe():
@pytest.mark.parametrize("start_idx,end_idx", [(1, None), (None, 1), (1, 2), (1, -1)])
def test_tsdataset_idx_slice(tsdf_with_exog, start_idx, end_idx):
ts_slice = tsdf_with_exog.tsdataset_idx_slice(start_idx=start_idx, end_idx=end_idx)
assert ts_slice.known_future == tsdf_with_exog.known_future
assert ts_slice._known_future == tsdf_with_exog._known_future
assert ts_slice.regressors == tsdf_with_exog.regressors
pd.testing.assert_frame_equal(ts_slice._df, tsdf_with_exog._df.iloc[start_idx:end_idx])
pd.testing.assert_frame_equal(ts_slice._df_exog, tsdf_with_exog._df_exog)
@@ -1944,7 +1944,7 @@ def test_create_from_misaligned_without_exog(df_name, freq, original_timestamp_n
expected_df_exog = TSDataset.to_dataset(timestamp_df)
pd.testing.assert_frame_equal(ts._df_exog, expected_df_exog)

assert original_timestamp_name in ts.known_future
assert original_timestamp_name in ts._known_future
assert ts.freq is None


@@ -1996,7 +1996,7 @@ def test_create_from_misaligned_with_exog(
pd.testing.assert_frame_equal(ts._df_exog, expected_df_exog)

expected_known_future = sorted(set(known_future).union([original_timestamp_name]))
assert ts.known_future == expected_known_future
assert ts._known_future == expected_known_future

assert ts.freq is None

@@ -2046,7 +2046,7 @@ def test_create_from_misaligned_with_exog_all(
expected_df_exog = TSDataset.to_dataset(expected_df_exog)
pd.testing.assert_frame_equal(ts._df_exog, expected_df_exog)

assert ts.known_future == expected_known_future
assert ts._known_future == expected_known_future
assert ts.freq is None


@@ -2111,3 +2111,18 @@ def test_features(ts_name, expected_features, request):
ts = request.getfixturevalue(ts_name)
features = ts.features
assert sorted(features) == sorted(expected_features)


def test_error_set_read_only_known_future(df_and_regressors):
df, df_exog, regressors = df_and_regressors
ts = TSDataset(df=df, freq="D", df_exog=df_exog, known_future=regressors)
with pytest.raises(AttributeError, match="can't set attribute"):
ts.known_future = ["exog_1"]


def test_not_equal_updated_known_futures(df_and_regressors):
df, df_exog, regressors = df_and_regressors
ts = TSDataset(df=df, freq="D", df_exog=df_exog, known_future=regressors)
new_known_future = ts.known_future
new_known_future.append("new_regressor")
assert ts.known_future != new_known_future
2 changes: 1 addition & 1 deletion tests/test_models/test_inference/test_forecast.py
Original file line number Diff line number Diff line change
@@ -1164,7 +1164,7 @@ def _test_forecast_mixed_in_out_sample(ts, model, transforms, num_skip_points=50
future_ts = ts.make_future(future_steps=future_prediction_size)
future_df = future_ts.to_pandas().loc[:, pd.IndexSlice[:, "target"]]
df_full = pd.concat((df, future_df))
forecast_full_ts = TSDataset(df=df_full, df_exog=ts._df_exog, freq=ts.freq, known_future=ts.known_future)
forecast_full_ts = TSDataset(df=df_full, df_exog=ts._df_exog, freq=ts.freq, known_future=ts._known_future)
forecast_full_ts.transform(transforms)
forecast_full_ts._df = forecast_full_ts._df.iloc[(num_skip_points - model.context_size) :]
full_prediction_size = len(forecast_full_ts.timestamps) - model.context_size
6 changes: 3 additions & 3 deletions tests/test_models/test_inference/test_predict.py
Original file line number Diff line number Diff line change
@@ -834,15 +834,15 @@ def _test_predict_mixed_in_out_sample(ts, model, transforms, num_skip_points=50,

# predicting mixed in-sample and out-sample
df_full = pd.concat((train_df, future_df))
forecast_full_ts = TSDataset(df=df_full, df_exog=ts._df_exog, freq=ts.freq, known_future=ts.known_future)
forecast_full_ts = TSDataset(df=df_full, df_exog=ts._df_exog, freq=ts.freq, known_future=ts._known_future)
forecast_full_ts.transform(transforms)
forecast_full_ts._df = forecast_full_ts._df.iloc[(num_skip_points - model.context_size) :]
full_prediction_size = len(forecast_full_ts.timestamps) - model.context_size
forecast_full_ts = make_predict(model=model, ts=forecast_full_ts, prediction_size=full_prediction_size)

# predicting only in sample
forecast_in_sample_ts = TSDataset(
df=train_df, df_exog=train_ts._df_exog, freq=ts.freq, known_future=ts.known_future
df=train_df, df_exog=train_ts._df_exog, freq=ts.freq, known_future=ts._known_future
)
forecast_in_sample_ts.transform(transforms)
to_skip = num_skip_points - model.context_size
@@ -853,7 +853,7 @@ def _test_predict_mixed_in_out_sample(ts, model, transforms, num_skip_points=50,
)

# predicting only out sample
forecast_out_sample_ts = TSDataset(df=df_full, df_exog=ts._df_exog, freq=ts.freq, known_future=ts.known_future)
forecast_out_sample_ts = TSDataset(df=df_full, df_exog=ts._df_exog, freq=ts.freq, known_future=ts._known_future)
forecast_out_sample_ts.transform(transforms)
to_remain = model.context_size + future_prediction_size
forecast_out_sample_ts._df = forecast_out_sample_ts._df.iloc[-to_remain:]
4 changes: 2 additions & 2 deletions tests/test_reconciliation/test_base.py
Original file line number Diff line number Diff line change
@@ -116,7 +116,7 @@ def test_reconcile(hierarchical_ts, source_level, target_level, mapping_matrix,

assert obtained_ts.freq == expected_ts.freq
assert obtained_ts.current_df_level == expected_ts.current_df_level
assert obtained_ts.known_future == expected_ts.known_future
assert obtained_ts._known_future == expected_ts._known_future
assert obtained_ts.regressors == expected_ts.regressors
pd.testing.assert_frame_equal(obtained_ts._df, expected_ts._df)
pd.testing.assert_frame_equal(obtained_ts._df_exog, expected_ts._df_exog)
@@ -138,7 +138,7 @@ def test_reconcile_with_target_components(

assert obtained_ts.freq == expected_ts.freq
assert obtained_ts.current_df_level == expected_ts.current_df_level
assert obtained_ts.known_future == expected_ts.known_future
assert obtained_ts._known_future == expected_ts._known_future
assert obtained_ts.regressors == expected_ts.regressors
pd.testing.assert_frame_equal(obtained_ts.get_target_components(), expected_ts.get_target_components())
pd.testing.assert_frame_equal(obtained_ts._df, expected_ts._df)
Original file line number Diff line number Diff line change
@@ -343,7 +343,7 @@ def test_transform_values_with_shift(shift, in_column, ts_name, period, mod, req
ts = request.getfixturevalue(ts_name)

ts_1 = ts
ts_2 = TSDataset(df=ts._raw_df.iloc[shift:], df_exog=ts._df_exog, freq=ts.freq, known_future=ts.known_future)
ts_2 = TSDataset(df=ts._raw_df.iloc[shift:], df_exog=ts._df_exog, freq=ts.freq, known_future=ts._known_future)
transform = FourierTransform(period=period, mods=[mod], out_column="regressor_fourier", in_column=in_column)

transform.fit(ts)
6 changes: 3 additions & 3 deletions tests/utils.py
Original file line number Diff line number Diff line change
@@ -30,7 +30,7 @@ def select_segments_subset(ts: TSDataset, segments: List[str]) -> TSDataset:
df_exog = ts._df_exog
if df_exog is not None:
df_exog = df_exog.loc[:, pd.IndexSlice[segments, :]].copy()
known_future = ts.known_future
known_future = ts._known_future
freq = ts.freq
subset_ts = TSDataset(df=df, df_exog=df_exog, known_future=known_future, freq=freq)
return subset_ts
@@ -49,7 +49,7 @@ def convert_ts_to_int_timestamp(ts: TSDataset, shift=0):
ts = TSDataset(
df=df,
df_exog=df_exog,
known_future=ts.known_future,
known_future=ts._known_future,
freq=None,
hierarchical_structure=ts.hierarchical_structure,
)
@@ -72,7 +72,7 @@ def convert_ts_index_to_freq(ts: TSDataset, freq: str, shift=0):
ts = TSDataset(
df=df,
df_exog=df_exog,
known_future=ts.known_future,
known_future=ts._known_future,
freq=freq,
hierarchical_structure=ts.hierarchical_structure,
)