ARIMA
Model a series as its own past values plus its own past errors.
ARIMA combines three ideas, one per order. The autoregressive part (p)
makes the forecast a weighted sum of recent values. The differencing part
(d) subtracts consecutive observations until what is left has no trend,
which is what lets the other two parts assume a stable level. The moving
average part (q) lets recent forecast errors feed back in.
A seasonal part repeats the same three ideas a season apart: P, D
and Q, counted in seasons of season_length steps. It is off by
default (all three at 0), which is the plain ARIMA.
The orders are not chosen automatically. d = 1 suits a series that
trends, d = 0 one that hovers around a level, and the DashAI optimizer
can search them when told to.
statsmodels' ARIMA is already a state space SARIMAX: it takes the
seasonal orders and exogenous variables, and its forecasts come with
prediction intervals. Nothing is reimplemented.
References
- [1] https://www.statsmodels.org/stable/generated/statsmodels.tsa.arima.model.ARIMA.html
- [2] https://otexts.com/fpp3/arima.html
Parameters
- p : integer, default=
1 - How many past values the forecast is a weighted sum of, the autoregressive order.
- d : integer, default=
1 - How many times to difference the series before modelling it. 1 removes a straight trend, 0 suits a series that already hovers around a fixed level.
- q : integer, default=
0 - How many past forecast errors feed into the next forecast, the moving average order.
- seasonal_p : integer, default=
0 - The autoregressive order of the seasonal part: how many past seasons the forecast is a weighted sum of. 0 leaves it out.
- seasonal_d : integer, default=
0 - How many times to difference the series a season apart. 1 removes a pattern that repeats every season.
- seasonal_q : integer, default=
0 - The moving average order of the seasonal part: how many past seasonal errors feed into the next forecast.
- season_length : integer, default=
1 - How many steps make up one season, which the seasonal orders count in: 12 for monthly data repeating yearly, 7 for daily data repeating weekly. It has to be at least 2 when a seasonal order is above 0.
- use_exogenous : boolean, default=
True - Read the session's exogenous variables. Turn it off to compare the same model without them.
Methods
calculate_metrics(self, split: DashAI.back.core.enums.metrics.SplitEnum = <SplitEnum.VALIDATION: 'validation'>, level: DashAI.back.core.enums.metrics.LevelEnum = <LevelEnum.LAST: 'last'>, log_index: int = None, x_data: 'DashAIDataset' = None, y_data: 'DashAIDataset' = None, fold_index: int = None, inner_fold_index: int = None)
BaseModelCalculate metrics for a data split and save them to the database.
Parameters
- split : SplitEnum
- The data split to evaluate (TRAIN, VALIDATION, or TEST). Defaults to SplitEnum.VALIDATION.
- level : LevelEnum
- The metric granularity level (LAST, TRIAL, STEP, or BATCH). Defaults to LevelEnum.LAST.
- log_index : int, optional
- Explicit step index for the metric entry. If None, the next step index is computed automatically. Defaults to None.
- x_data : DashAIDataset, optional
- Input features. If None, the dataset stored in the model for the given split is used. Defaults to None.
- y_data : DashAIDataset, optional
- Target labels. If None, the labels stored in the model for the given split are used. Defaults to None.
Returns
- Dict[str, float] or None
- What was written, so a caller that also wants the numbers does not have to score the same split twice.
Nonewhen nothing was written: no run to write against, or nothing to score.
compute_metrics(self, split: DashAI.back.core.enums.metrics.SplitEnum = <SplitEnum.VALIDATION: 'validation'>, x_data: 'DashAIDataset' = None, y_data: 'DashAIDataset' = None) -> Optional[Dict[str, float]]
BaseModelScore a data split with this model's metrics, without persisting.
Parameters
- split : SplitEnum
- The data split to evaluate. Defaults to
SplitEnum.VALIDATION. - x_data : DashAIDataset, optional
- Input features. Defaults to the split stored on the model.
- y_data : DashAIDataset, optional
- Target labels. Defaults to the split stored on the model.
Returns
- Dict[str, float] or None
- Metric name to score. A metric that scored a non-finite value is absent from the mapping rather than present with a NaN, so the mapping is empty when every metric returned one.
Nonewhen there is nothing to score at all: no metrics configured, or no data for this split. Callers that need a particular metric must therefore check that it is there. A metric with no value on the data (UndefinedMetricError) is absent the same way.
fit(self, y: Sequence[float], x: Optional[Any] = None) -> 'SingleSeriesForecastingModel'
SingleSeriesForecastingModelFit the model on the series, in time order.
Parameters
- y : sequence of float
- The series, one value per step of its grid.
- x : array-like, optional
- Exogenous variables, one row per step. Refused by a model that declares
EXOGENOUS = "none", and required by one that declares"required".
Returns
- SingleSeriesForecastingModel
- The fitted model.
get_credential(self, name: str)
ConfigObjectResolve a registered credential component by name.
Parameters
- name : str
- Credential component class name (e.g. "HuggingFaceCredential").
Returns
- BaseCredential
- An instance of the requested credential component.
get_metadata(cls) -> Dict[str, Any]
SingleSeriesForecastingModelThe model's metadata, with what it does with exogenous variables.
get_schema(cls) -> dict
ConfigObjectGenerates the component related Json Schema.
Returns
- dict
- Dictionary representing the Json Schema of the component.
load(filename: str) -> Any
SingleSeriesForecastingModelDeserialise a model from disk using joblib.
Parameters
- filename : str
- Path to the file previously written by :meth:
save.
Returns
- SingleSeriesForecastingModel
- The loaded model instance.
predict(self, h: int, x_future: Optional[Any] = None, levels: Optional[Sequence[int]] = None) -> DashAI.back.models.forecasting.single_series_forecasting_model.Forecast
SingleSeriesForecastingModelForecast the h steps that follow the fitted series.
Parameters
- h : int
- How many steps to forecast, at least 1.
- x_future : array-like, optional
- Exogenous variables for the forecast steps, one row per step.
- levels : sequence of int, optional
- Prediction interval levels, in percent, each between 0 and 100.
Returns
- Forecast
- The point forecast and, if levels were asked for, the intervals.
predict_prepared(self, features: Any) -> Any
BaseModelPredict from data that is already in this model's feature space.
Parameters
- features : pandas.DataFrame or numpy.ndarray
- Feature matrix as returned by
prepare_dataset(..., is_fit=False). No further preparation is applied to it.
Returns
- Any
- The same kind of output as
predict: predicted values for regressors, class probabilities for DashAI classifiers.
predict_proba_prepared(self, features: Any) -> Any
BaseModelReturn class probabilities for data already in the feature space.
Parameters
- features : pandas.DataFrame or numpy.ndarray
- Feature matrix as returned by
prepare_dataset(..., is_fit=False).
Returns
- numpy.ndarray
- Array of shape
(n_samples, n_classes)with class probabilities.
prepare_dataset(self, dataset: 'DashAIDataset', is_fit: bool = False) -> 'DashAIDataset'
BaseModelHook for model specific preprocessing of input features.
Parameters
- dataset : DashAIDataset
- The input dataset to preprocess.
- is_fit : bool
- Whether the call is part of a fitting phase. Defaults to False.
Returns
- DashAIDataset
- The preprocessed dataset ready to be fed into the model.
prepare_output(self, dataset: 'DashAIDataset', is_fit: bool = False) -> 'DashAIDataset'
BaseModelHook for model-specific preprocessing of output targets.
Parameters
- dataset : DashAIDataset
- The output dataset (target labels) to preprocess.
- is_fit : bool
- Whether the call is part of a fitting phase. Defaults to False.
Returns
- DashAIDataset
- The preprocessed output dataset.
save(self, filename: str) -> None
SingleSeriesForecastingModelSerialise the model to disk using joblib.
Parameters
- filename : str
- Destination file path where the model will be written.
train(self, x_train: 'DashAIDataset', y_train: 'DashAIDataset', x_validation: 'DashAIDataset' = None, y_validation: 'DashAIDataset' = None) -> 'SingleSeriesForecastingModel'
SingleSeriesForecastingModelFit on the series held by y_train, ignoring every other input.
Parameters
- x_train : DashAIDataset
- Ignored: the model never sees dates.
- y_train : DashAIDataset
- One column holding the series, in time order.
- x_validation, y_validation : DashAIDataset, optional
- Ignored.
Returns
- SingleSeriesForecastingModel
- The fitted model.
validate_and_transform(self, raw_data: dict) -> dict
ConfigObjectIt takes the data given by the user to initialize the model and returns it with all the objects that the model needs to work.
Parameters
- raw_data : dict
- A dictionary with the data provided by the user to initialize the model.
Returns
- dict
- A validated dictionary with the necessary objects.