Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
## [22.4.0-rc.1](https://github.com/sequential-parameter-optimization/spotforecast2-safe/compare/v22.3.0...v22.4.0-rc.1) (2026-06-13)


### Features

* **weather:** per-zone weather for the ENTSO-E four-zone pipeline ([260a084](https://github.com/sequential-parameter-optimization/spotforecast2-safe/commit/260a08432177181f8cec78a7d1a679379888a16f))


### Documentation

* **tasks:** drop stale n-to-1 task wrapper references from task_multi ([00e9dab](https://github.com/sequential-parameter-optimization/spotforecast2-safe/commit/00e9dabfeba10cc975397aef6aef800630f47cb8))

## [22.3.0](https://github.com/sequential-parameter-optimization/spotforecast2-safe/compare/v22.2.0...v22.3.0) (2026-06-12)


Expand Down
8 changes: 4 additions & 4 deletions MODEL_CARD.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ This card describes what spotforecast2-safe is, how to use it safely, the condit
| Field | Value |
| --- | --- |
| Name | spotforecast2-safe |
| Version | 22.3.0 |
| Version | 22.4.0-rc.1 |
| Type | Deterministic Python library for time series feature engineering and recursive multi-step forecasting. It performs no training of its own. |
| Developed by | Thomas Bartz-Beielstein, ORCID [0000-0002-5938-5158](https://orcid.org/0000-0002-5938-5158) |
| Distributed by | the `sequential-parameter-optimization` GitHub organization |
Expand All @@ -18,7 +18,7 @@ This card describes what spotforecast2-safe is, how to use it safely, the condit

The library depends only on numpy, pandas, scikit-learn, lightgbm, numba, pyarrow, requests, feature-engine, holidays, astral, and tqdm. It deliberately excludes plotly, matplotlib, spotoptim, optuna, torch, and tensorflow, so no plotting or automated-tuning code ships in this package.

Two Common Platform Enumeration (CPE) identifiers let vulnerability-tracking and software bill of materials (SBOM) tools recognize the package. The wildcard identifier `cpe:2.3:a:sequential_parameter_optimization:spotforecast2_safe:*:*:*:*:*:*:*:*` matches any release; the current release is `cpe:2.3:a:sequential_parameter_optimization:spotforecast2_safe:22.3.0:*:*:*:*:*:*:*`.
Two Common Platform Enumeration (CPE) identifiers let vulnerability-tracking and software bill of materials (SBOM) tools recognize the package. The wildcard identifier `cpe:2.3:a:sequential_parameter_optimization:spotforecast2_safe:*:*:*:*:*:*:*:*` matches any release; the current release is `cpe:2.3:a:sequential_parameter_optimization:spotforecast2_safe:22.4.0-rc.1:*:*:*:*:*:*:*`.

The library itself is a low-risk component: it is deterministic, its source is fully inspectable, and it fails safe on invalid input. It is built to support high-risk AI systems in the sense of the EU AI Act, but it is not itself such a system. When it is embedded in a high-risk deployment, the duties that attach to that system fall on the integrator, not on the library.

Expand All @@ -30,7 +30,7 @@ Responsibilities are divided as follows.
| Distribution | sequential-parameter-optimization on GitHub | repository issue tracker |
| Deployment, operation, and audit | the system integrator | defined per deployment |

The current release is 22.3.0, with a stable public interface pinned in `spotforecast2_safe.__init__.__all__`. The full version history, including release dates, is recorded in `CHANGELOG.md` and on the GitHub Releases page; it is maintained automatically by the release pipeline and is not repeated here.
The current release is 22.4.0-rc.1, with a stable public interface pinned in `spotforecast2_safe.__init__.__all__`. The full version history, including release dates, is recorded in `CHANGELOG.md` and on the GitHub Releases page; it is maintained automatically by the release pipeline and is not repeated here.

## 2. Intended Use and Scope

Expand Down Expand Up @@ -216,7 +216,7 @@ Maintainer: Thomas Bartz-Beielstein, ORCID [0000-0002-5938-5158](https://orcid.o
}
```

Or as a formatted reference: Bartz-Beielstein, T. (2026). *spotforecast2-safe: Safety-critical subset of spotforecast2* (Version 22.3.0) [Computer software]. https://github.com/sequential-parameter-optimization/spotforecast2-safe
Or as a formatted reference: Bartz-Beielstein, T. (2026). *spotforecast2-safe: Safety-critical subset of spotforecast2* (Version 22.4.0-rc.1) [Computer software]. https://github.com/sequential-parameter-optimization/spotforecast2-safe

The technical report (`bart26h/index.qmd`) is the long-form reference for design rationale, compliance mapping, and evaluation protocol.

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"hash": "df358d89e8796124284183fc6efecd0c",
"hash": "c2f76276942f6735a97f7843afa6912d",
"result": {
"engine": "jupyter",
"markdown": "---\ntitle: configurator.config_entsoe.ConfigEntsoe\n---\n\n\n\n```python\nconfigurator.config_entsoe.ConfigEntsoe(\n country_code='DE',\n periods=default_periods(),\n lags_consider=(lambda: list(range(1, 24)))(),\n train_size=(lambda: pd.Timedelta(days=(3 * 365)))(),\n end_train_default='2025-12-31 00:00+00:00',\n delta_val=(lambda: pd.Timedelta(hours=(24 * 7 * 10)))(),\n predict_size=24,\n cv_block_size=None,\n refit_size=7,\n random_state=314159,\n n_hyperparameters_trials=20,\n data_filename='interim/energy_load.csv',\n targets=None,\n use_outlier_detection=True,\n contamination=0.01,\n imputation_method='weighted',\n window_size=72,\n imputation_window_size=None,\n use_exogenous_features=True,\n latitude=51.5136,\n longitude=7.4653,\n timezone='UTC',\n state='NW',\n include_weather_windows=False,\n include_holiday_features=False,\n include_holiday_adjacency_features=False,\n use_population_weighted_weather=False,\n include_degree_hours=False,\n include_apparent_temperature=False,\n degree_hours_base_heating=15.0,\n degree_hours_base_cooling=22.0,\n include_ephemeris_features=False,\n include_day_type_features=False,\n include_school_holiday_features=False,\n poly_features_degree=1,\n max_poly_features=10,\n poly_mi_n_jobs=-1,\n poly_mi_sample_size=4000,\n include_covid_infection_rate=False,\n include_entsoe_forecast_load=False,\n include_entsoe_renewable_forecast=False,\n include_entsoe_net_load=False,\n include_entsoe_day_ahead_price=False,\n include_football_match_window=False,\n include_energy_saving_window=False,\n index_name='Time (UTC)',\n bounds=None,\n verbose=False,\n cache_home=None,\n n_trials_optuna=15,\n n_trials_spotoptim=10,\n n_initial_spotoptim=5,\n max_time_spotoptim=None,\n warm_start_lags=(lambda: list(DEFAULT_WARM_START_LAGS))(),\n task='lazy',\n agg_weights=None,\n forecaster_factory=None,\n data_loader=None,\n test_data_loader=None,\n auto_save_models=True,\n data_frame_name='default',\n number_folds=10,\n on_weather_failure='raise',\n on_exog_provider_failure='raise',\n exog_max_gap_hours=0,\n exog_max_tail_gap_hours=0,\n exog_provider_window='full',\n target_qc_range_mw=None,\n target_qc_step_mw=None,\n target_qc_window_days=None,\n target_corruption_policy='abort',\n target_max_heal_hours=0,\n target_anchor_zone_hours=168,\n target_qc_deviation_mw=None,\n target_qc_deviation_ref=None,\n target_qc_deviation_slots=2,\n retrain_max_age=(lambda: pd.Timedelta(days=7))(),\n)\n```\n\nConfiguration for the ENTSO-E forecasting pipeline.\n\nSingle-target counterpart to `ConfigMulti`, used by the ENTSO-E CLI\n(``spotforecast2.tasks.task_entsoe``) and any single-target pipeline routed\nthrough ``spotforecast2.multitask.runner.run(config_cls=ConfigEntsoe)``.\n\n``ConfigEntsoe`` **inherits every field and method of `ConfigMulti`** — so any\nfeature flag added to ``ConfigMulti`` is available here automatically (this\nis what closes the historical feature-flag parity gap structurally, rather\nthan via a hand-maintained mirror). It differs from ``ConfigMulti`` in\nexactly two ways:\n\n- ``index_name`` defaults to ``\"Time (UTC)\"`` (the ENTSO-E CSV time column)\n instead of ``\"DateTime\"``.\n- it adds ``retrain_max_age`` — the maximum age of a previously trained model\n before retraining is required (consumed by\n `spotforecast2_safe.manager.trainer.should_retrain`).\n\nSee `ConfigMulti` for the full field reference (training/validation windows,\nfeature toggles, exogenous-provider flags, target-corruption knobs, …).\n\n## Parameters {.doc-section .doc-section-parameters}\n\n| Name | Type | Description | Default |\n|-----------------|------------------------------------------------|--------------------------------------------------------------------------------------------------|------------------------------------|\n| index_name | [str](`str`) | Datetime column name used when resetting the index. Defaults to ``\"Time (UTC)\"``. | `'Time (UTC)'` |\n| retrain_max_age | [pd](`pandas`).[Timedelta](`pandas.Timedelta`) | Maximum age of a trained model before a retrain is forced. Defaults to ``pd.Timedelta(days=7)``. | `(lambda: pd.Timedelta(days=7))()` |\n\n## Examples {.doc-section .doc-section-examples}\n\n\n::: {#fdcc96fe .cell execution_count=1}\n``` {.python .cell-code}\nimport pandas as pd\nfrom spotforecast2_safe.configurator.config_entsoe import ConfigEntsoe\nfrom spotforecast2_safe.configurator.config_multi import ConfigMulti\n\nconfig = ConfigEntsoe(country_code=\"DE\")\n# ENTSO-E-specific defaults:\nprint(\"index_name:\", config.index_name)\nprint(\"retrain_max_age:\", config.retrain_max_age)\nassert config.index_name == \"Time (UTC)\"\nassert config.retrain_max_age == pd.Timedelta(days=7)\n\n# Inherits the full ConfigMulti surface, incl. the opt-in feature flags:\nassert isinstance(config, ConfigMulti)\nconfig = ConfigEntsoe(\n include_ephemeris_features=True,\n include_day_type_features=True,\n include_degree_hours=True,\n)\nprint(\"ephemeris:\", config.include_ephemeris_features)\nprint(\"predict_size:\", config.predict_size)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nindex_name: Time (UTC)\nretrain_max_age: 7 days 00:00:00\nephemeris: True\npredict_size: 24\n```\n:::\n:::\n\n\n",
"markdown": "---\ntitle: configurator.config_entsoe.ConfigEntsoe\n---\n\n\n\n```python\nconfigurator.config_entsoe.ConfigEntsoe(\n country_code='DE',\n periods=default_periods(),\n lags_consider=(lambda: list(range(1, 24)))(),\n train_size=(lambda: pd.Timedelta(days=(3 * 365)))(),\n end_train_default='2025-12-31 00:00+00:00',\n delta_val=(lambda: pd.Timedelta(hours=(24 * 7 * 10)))(),\n predict_size=24,\n cv_block_size=None,\n refit_size=7,\n random_state=314159,\n n_hyperparameters_trials=20,\n data_filename='interim/energy_load.csv',\n targets=None,\n use_outlier_detection=True,\n contamination=0.01,\n imputation_method='weighted',\n window_size=72,\n imputation_window_size=None,\n use_exogenous_features=True,\n latitude=51.5136,\n longitude=7.4653,\n timezone='UTC',\n state='NW',\n include_weather_windows=False,\n include_holiday_features=False,\n include_holiday_adjacency_features=False,\n use_population_weighted_weather=False,\n per_zone_weather=False,\n zone_weather_locations=None,\n include_degree_hours=False,\n include_apparent_temperature=False,\n degree_hours_base_heating=15.0,\n degree_hours_base_cooling=22.0,\n include_ephemeris_features=False,\n include_day_type_features=False,\n include_school_holiday_features=False,\n poly_features_degree=1,\n max_poly_features=10,\n poly_mi_n_jobs=-1,\n poly_mi_sample_size=4000,\n include_covid_infection_rate=False,\n include_entsoe_forecast_load=False,\n include_entsoe_renewable_forecast=False,\n include_entsoe_net_load=False,\n include_entsoe_day_ahead_price=False,\n include_football_match_window=False,\n include_energy_saving_window=False,\n index_name='Time (UTC)',\n bounds=None,\n verbose=False,\n cache_home=None,\n n_trials_optuna=15,\n n_trials_spotoptim=10,\n n_initial_spotoptim=5,\n max_time_spotoptim=None,\n warm_start_lags=(lambda: list(DEFAULT_WARM_START_LAGS))(),\n task='lazy',\n agg_weights=None,\n forecaster_factory=None,\n data_loader=None,\n test_data_loader=None,\n auto_save_models=True,\n data_frame_name='default',\n number_folds=10,\n on_weather_failure='raise',\n on_exog_provider_failure='raise',\n exog_max_gap_hours=0,\n exog_max_tail_gap_hours=0,\n exog_provider_window='full',\n target_qc_range_mw=None,\n target_qc_step_mw=None,\n target_qc_window_days=None,\n target_corruption_policy='abort',\n target_max_heal_hours=0,\n target_anchor_zone_hours=168,\n target_qc_deviation_mw=None,\n target_qc_deviation_ref=None,\n target_qc_deviation_slots=2,\n retrain_max_age=(lambda: pd.Timedelta(days=7))(),\n)\n```\n\nConfiguration for the ENTSO-E forecasting pipeline.\n\nSingle-target counterpart to `ConfigMulti`, used by the ENTSO-E CLI\n(``spotforecast2.tasks.task_entsoe``) and any single-target pipeline routed\nthrough ``spotforecast2.multitask.runner.run(config_cls=ConfigEntsoe)``.\n\n``ConfigEntsoe`` **inherits every field and method of `ConfigMulti`** — so any\nfeature flag added to ``ConfigMulti`` is available here automatically (this\nis what closes the historical feature-flag parity gap structurally, rather\nthan via a hand-maintained mirror). It differs from ``ConfigMulti`` in\nexactly two ways:\n\n- ``index_name`` defaults to ``\"Time (UTC)\"`` (the ENTSO-E CSV time column)\n instead of ``\"DateTime\"``.\n- it adds ``retrain_max_age`` — the maximum age of a previously trained model\n before retraining is required (consumed by\n `spotforecast2_safe.manager.trainer.should_retrain`).\n\nSee `ConfigMulti` for the full field reference (training/validation windows,\nfeature toggles, exogenous-provider flags, target-corruption knobs, …).\n\n## Parameters {.doc-section .doc-section-parameters}\n\n| Name | Type | Description | Default |\n|-----------------|------------------------------------------------|--------------------------------------------------------------------------------------------------|------------------------------------|\n| index_name | [str](`str`) | Datetime column name used when resetting the index. Defaults to ``\"Time (UTC)\"``. | `'Time (UTC)'` |\n| retrain_max_age | [pd](`pandas`).[Timedelta](`pandas.Timedelta`) | Maximum age of a trained model before a retrain is forced. Defaults to ``pd.Timedelta(days=7)``. | `(lambda: pd.Timedelta(days=7))()` |\n\n## Examples {.doc-section .doc-section-examples}\n\n\n::: {#2f34fa00 .cell execution_count=1}\n``` {.python .cell-code}\nimport pandas as pd\nfrom spotforecast2_safe.configurator.config_entsoe import ConfigEntsoe\nfrom spotforecast2_safe.configurator.config_multi import ConfigMulti\n\nconfig = ConfigEntsoe(country_code=\"DE\")\n# ENTSO-E-specific defaults:\nprint(\"index_name:\", config.index_name)\nprint(\"retrain_max_age:\", config.retrain_max_age)\nassert config.index_name == \"Time (UTC)\"\nassert config.retrain_max_age == pd.Timedelta(days=7)\n\n# Inherits the full ConfigMulti surface, incl. the opt-in feature flags:\nassert isinstance(config, ConfigMulti)\nconfig = ConfigEntsoe(\n include_ephemeris_features=True,\n include_day_type_features=True,\n include_degree_hours=True,\n)\nprint(\"ephemeris:\", config.include_ephemeris_features)\nprint(\"predict_size:\", config.predict_size)\n```\n\n::: {.cell-output .cell-output-stdout}\n```\nindex_name: Time (UTC)\nretrain_max_age: 7 days 00:00:00\nephemeris: True\npredict_size: 24\n```\n:::\n:::\n\n\n",
"supporting": [
"configurator.config_entsoe.ConfigEntsoe_files/figure-html"
],
Expand Down

Large diffs are not rendered by default.

Loading