<forecast_context>
<dataset>
- Observations: 100
- Series: 1
- Frequency: D
- Target: sales
- Exogenous columns: promo
</dataset>
<profile_decision>
A single-series ML forecaster (ForecasterRecursive) is recommended. Data: 100 observations, 'D' frequency. Alternative forecasters: ['ForecasterDirect', 'ForecasterFoundation', 'ForecasterStats']. Estimator: Ridge. A linear model is preferred because the dataset is small (100 observations < 250); gradient boosting is offered as an alternative once more data is available. Alternative estimators: ['RandomForestRegressor', 'LGBMRegressor']. 1 exogenous variable available as predictors.
</profile_decision>
<forecast_plan>
- Steps: 5
- Estimator: Ridge
- Lags: [1, 2, 3, 4, 5, 7]
- Window features: [{'stats': ['mean', 'std'], 'window_size': 3}, {'stats': ['mean'], 'window_size': 7}, {'stats': ['mean'], 'window_size': 21}]
- Prediction interval: [0.1, 0.9] (80% coverage)
- Interval method: bootstrapping
- Primary metric: mean_absolute_error
- Plan: ForecasterRecursive + Ridge. Lags: [1, 2, 3, 4, 5, 7]. Window features: ['mean(window=3)', 'std(window=3)', 'mean(window=7)', 'mean(window=21)']. Calendar features: ['day_of_week', 'weekend', 'month'] (cyclical encoding). Prediction intervals via bootstrapping. NaN rows kept (NaN-tolerant estimator). Exogenous variables included. MAE is interpretable, robust to outliers, and works at any scale.

Note: A validated Python script implementing this plan is generated separately. Do not generate code yourself.
</forecast_plan>
<evaluation_metrics>
series  MAE  MSE  MASE
 sales  2.5 9.25   0.8
</evaluation_metrics>
<predictions>
Total rows: 5 (all shown below).
                 pred  lower_bound  upper_bound
2023-04-11  1000.0000        900.0       1100.0
2023-04-12  1111.1111        980.0       1240.0
2023-04-13  1250.0000       1100.0       1400.0
2023-04-14  1375.0000       1200.0       1550.0
2023-04-15  2000.0000       1800.0       2200.0
</predictions>
</forecast_context>
