diff --git a/CHANGELOG.md b/CHANGELOG.md index 38d07f07f..11c63c454 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,7 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix missing prophet in docker images ([#767](https://github.com/tinkoff-ai/etna/pull/767)) - Add `known_future` parameter to CLI ([#758](https://github.com/tinkoff-ai/etna/pull/758)) - FutureWarning: The frame.append method is deprecated. Use pandas.concat instead ([#764](https://github.com/tinkoff-ai/etna/pull/764)) -- +- Correct ordering if multi-index in backtest ([#771](https://github.com/tinkoff-ai/etna/pull/771)) - - - diff --git a/etna/pipeline/base.py b/etna/pipeline/base.py index 89a446673..b37a23c68 100644 --- a/etna/pipeline/base.py +++ b/etna/pipeline/base.py @@ -457,6 +457,7 @@ def _get_backtest_forecasts(self) -> pd.DataFrame: forecast = forecast.join(fold_number_df) forecasts_list.append(forecast) forecasts = pd.concat(forecasts_list) + forecasts.sort_index(axis=1, inplace=True) return forecasts def _prepare_fold_masks(self, ts: TSDataset, masks: Union[int, List[FoldMask]], mode: str) -> List[FoldMask]: diff --git a/tests/test_pipeline/conftest.py b/tests/test_pipeline/conftest.py index 7fdd6f832..e3dbb3464 100644 --- a/tests/test_pipeline/conftest.py +++ b/tests/test_pipeline/conftest.py @@ -162,13 +162,12 @@ def step_ts() -> Tuple[TSDataset, pd.DataFrame, pd.DataFrame]: target_forecast += [start_value + i * add_value] * horizon fold_number_forecast += [i] * horizon forecast_df = pd.DataFrame( - {"target": target_forecast, "fold_number": fold_number_forecast}, + {"fold_number": fold_number_forecast, "target": target_forecast}, index=timestamp_forecast, ) forecast_df.columns = pd.MultiIndex.from_product( - [[segment], ["target", "fold_number"]], names=("segment", "feature") + [[segment], ["fold_number", "target"]], names=("segment", "feature") ) - return ts, metrics_df, forecast_df diff --git a/tests/test_pipeline/test_pipeline.py b/tests/test_pipeline/test_pipeline.py index 104e68951..695a26418 100644 --- a/tests/test_pipeline/test_pipeline.py +++ b/tests/test_pipeline/test_pipeline.py @@ -573,3 +573,10 @@ def test_backtest_nans_at_beginning_with_mask(ts_name, request): metrics=[MAE()], n_folds=[mask], ) + + +def test_forecast_backtest_correct_ordering(step_ts: TSDataset): + ts, _, expected_forecast_df = step_ts + pipeline = Pipeline(model=NaiveModel(), horizon=5) + _, forecast_df, _ = pipeline.backtest(ts=ts, metrics=[MAE()], n_folds=3) + assert np.all(forecast_df.values == expected_forecast_df.values)