Source code for darts.models.forecasting.sf_auto_theta

"""
AutoTheta
---------
"""

from statsforecast.models import AutoTheta as SFAutoTheta

from darts.models.forecasting.sf_model import StatsForecastModel


[docs] class AutoTheta(StatsForecastModel): def __init__( self, *args, add_encoders: dict | None = None, quantiles: list[float] | None = None, random_state: int | None = None, **kwargs, ): """Auto-Theta based on the `Statsforecasts package <https://github.com/Nixtla/statsforecast>`__. Automatically selects the best Theta model using an information criterion. We refer to the `StatsForecast documentation <https://nixtlaverse.nixtla.io/statsforecast/src/core/models.html#autotheta>`__ for the exhaustive documentation of the arguments. In addition to univariate deterministic forecasting, it comes with additional support: - **Future covariates:** Use exogenous features to potentially improve predictive accuracy. Darts adds support by first regressing the series against the future covariates using a :class:`~darts.models.forecasting.linear_regression_model.LinearRegressionModel` model and then running the StatsForecast model on the in-sample residuals from this original regression. This approach was inspired by `this post of Stephan Kolassa <https://stats.stackexchange.com/q/220885>`__. - **Probabilstic forecasting:** To generate probabilistic forecasts, you can set the following parameters when calling :meth:`~darts.models.forecasting.sf_model.StatsForecastModel.predict`: - Forecast quantile values directly by setting `predict_likelihood_parameters=True`. - Generate sampled forecasts from these quantiles by setting `num_samples >> 1`. - **Conformal prediction:** In addition to the native probabilistic support, you can perform conformal prediction / forecasting by setting `prediction_intervals` at model creation. Then predict the in the same way as described above. - **Transferable series forecasting:** Apply the fitted model to a new input `series` at prediction time. .. note:: Future covariates are not supported when the input series contain missing values. .. note:: The first model call might take more time than all subsequent calls as the model relies on Numba and jit compilation. Parameters ---------- args Positional arguments for ``statsforecasts.models.AutoTheta``. add_encoders A large number of future covariates can be automatically generated with `add_encoders`. This can be done by adding multiple pre-defined index encoders and/or custom user-made functions that will be used as index encoders. Additionally, a transformer such as Darts' :class:`Scaler` can be added to transform the generated covariates. This happens all under one hood and only needs to be specified at model creation. Read :meth:`SequentialEncoder <darts.dataprocessing.encoders.SequentialEncoder>` to find out more about ``add_encoders``. Default: ``None``. An example showing some of ``add_encoders`` features: .. highlight:: python .. code-block:: python def encode_year(idx): return (idx.year - 1950) / 50 add_encoders={ 'cyclic': {'future': ['month']}, 'datetime_attribute': {'future': ['hour', 'dayofweek']}, 'position': {'future': ['relative']}, 'custom': {'future': [encode_year]}, 'transformer': Scaler(), 'tz': 'CET' } .. quantiles Optionally, produce quantile predictions at `quantiles` levels when performing probabilistic forecasting with `num_samples > 1` or `predict_likelihood_parameters=True`. random_state Controls the randomness for reproducible forecasting. kwargs Keyword arguments for ``statsforecasts.models.AutoTheta``. Examples -------- >>> from darts.datasets import AirPassengersDataset >>> from darts.models import AutoTheta >>> from darts.utils.timeseries_generation import datetime_attribute_timeseries >>> series = AirPassengersDataset().load() >>> # optionally, use some future covariates; e.g. the value of the month encoded as a sine and cosine series >>> future_cov = datetime_attribute_timeseries(series, "month", cyclic=True, add_length=6) >>> # define AutoTheta parameters >>> model = AutoTheta(season_length=12) >>> model.fit(series, future_covariates=future_cov) >>> pred = model.predict(6, future_covariates=future_cov) >>> print(pred.values()) [[438.05257224] [428.93751019] [465.20881177] [461.73768912] [467.59232404] [509.82574683]] """ super().__init__( model=SFAutoTheta(*args, **kwargs), quantiles=quantiles, add_encoders=add_encoders, random_state=random_state, )