EnsembleForecastingModel#
- class openstef_meta.models.ensemble_forecasting_model.EnsembleForecastingModel(**data: Any) None[source]
Bases:
BaseForecastingModelEnsemble forecasting pipeline: common preprocessing -> N forecasters -> combiner.
Runs multiple base forecasters in parallel, aggregates their predictions via a
ForecastCombiner, and applies shared postprocessing. ExtendsBaseForecastingModelas a sibling ofForecastingModel— not a subclass.The
preprocessingfield (inherited from base) holds the common preprocessing shared across all base forecasters.model_specific_preprocessingadds per-forecaster transforms on top.Invariants
fit() must be called before predict()
All forecaster horizons must be present in the input data
Important
The
cutoff_historyparameter is crucial when using lag-based features. Set it to exclude incomplete rows from training (e.g.timedelta(days=14)for a lag-14 transform).Example
>>> from openstef_models.models.forecasting.constant_quantile_forecaster import ( ... ConstantQuantileForecaster, ... ) >>> from openstef_meta.models.forecast_combiners.learned_weights_combiner import WeightsCombiner >>> from openstef_core.types import LeadTime >>> from datetime import timedelta >>> >>> forecaster_1 = ConstantQuantileForecaster( ... horizons=[LeadTime.from_string("PT36H")] ... ) >>> forecaster_2 = ConstantQuantileForecaster( ... horizons=[LeadTime.from_string("PT36H")] ... ) >>> combiner = WeightsCombiner( ... horizons=[LeadTime.from_string("PT36H")], ... ) >>> model = EnsembleForecastingModel( ... forecasters={"constant_median": forecaster_1, "constant_median_2": forecaster_2}, ... combiner=combiner, ... cutoff_history=timedelta(days=14), ... ) >>> model.fit(training_data) >>> forecasts = model.predict(new_data)
- Parameters:
data (
Any)
-
combiner:
ForecastCombiner
-
combiner_preprocessing:
TransformPipeline[TimeSeriesDataset]
-
model_specific_postprocessing:
TransformPipeline[ForecastDataset]
-
combiner_postprocessing:
TransformPipeline[ForecastDataset]
- property forecaster_configs: dict[str, Forecaster]
Configuration of each base forecaster, keyed by name.
- property max_horizon: LeadTime
Maximum lead-time (horizon) supported by this model.
- property hyperparams: HyperParams
Hyperparameters for this model.
Override in subclasses to expose the relevant hyperparameters. Used by integrations (e.g. MLflow) to log tuning parameters without needing to know the model’s internal structure.
- Returns:
HyperParams instance (defaults to empty base HyperParams).
- property is_fitted: bool
Check if the predictor has been fitted.
- property component_hyperparams: dict[str, HyperParams]
Per-component hyperparameters (e.g. per-forecaster in an ensemble).
- Returns:
Empty dict by default; ensemble subclasses override.
- get_explainable_components() dict[str, ExplainableForecaster][source]
Return named components that support feature-importance plotting.
Keys are used as filename suffixes; an empty key means no suffix. Override in subclasses to expose forecasters and/or combiners.
- Return type:
- Returns:
Empty dict by default.
- fit(data: TimeSeriesDataset, data_val: TimeSeriesDataset | None = None, data_test: TimeSeriesDataset | None = None) EnsembleModelFitResult[source]
Train all base forecasters and then the combiner.
- Parameters:
data (
TimeSeriesDataset) – Historical time series data with features and target values.data_val (
TimeSeriesDataset|None) – Optional validation data. If provided, splitters are ignored for validation.data_test (
TimeSeriesDataset|None) – Optional test data. If provided, splitters are ignored for test.data
data_val
data_test
- Returns:
FitResult containing training details and metrics.
- Return type:
EnsembleModelFitResult
- prepare_forecaster_input(data: TimeSeriesDataset, forecaster_name: str = '', forecast_start: datetime | None = None) ForecastInputDataset[source]
Prepare input data for a specific base forecaster.
Applies common preprocessing, then model-specific preprocessing, restores the target column, and trims history via the shared base
prepare_input.- Parameters:
data (
TimeSeriesDataset) – Raw time series dataset.forecaster_name (
str) – Which forecaster to prepare data for.forecast_start (
datetime|None) – Optional forecast start time override.data
forecaster_name
forecast_start
- Returns:
Processed forecast input dataset ready for the named forecaster.
- Return type:
- predict(data: TimeSeriesDataset, forecast_start: datetime | None = None) ForecastDataset[source]
Generate forecasts for the provided dataset.
- Parameters:
data (
TimeSeriesDataset) – Input time series dataset for prediction.forecast_start (
datetime|None) – Optional start time for forecasts.data
forecast_start
- Returns:
ForecastDataset containing the generated forecasts.
- Raises:
NotFittedError – If the model has not been fitted yet.
- Return type:
- predict_contributions(data: TimeSeriesDataset, forecast_start: datetime | None = None) TimeSeriesDataset[source]
Compute per-model contributions for the ensemble prediction.
- Parameters:
data (
TimeSeriesDataset) – Input time series dataset.forecast_start (
datetime|None) – Optional start time for forecasts.data
forecast_start
- Returns:
TimeSeriesDataset where each column is a base model’s contribution.
- Raises:
NotFittedError – If the model has not been fitted yet.
- Return type:
- model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'protected_namespaces': (), 'ser_json_inf_nan': 'null'}
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].