openstef 4.2.2__tar.gz → 4.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openstef-4.2.2 → openstef-4.3.0}/PKG-INFO +15 -15
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/guides/probabilistic_forecasting.rst +38 -1
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/quantile_calibration.ipynb +113 -27
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/quantile_calibration.py +88 -25
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/pyproject.toml +1 -1
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/metrics/metrics_deterministic.py +70 -9
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/visualizations/test_timeseries_visualization.py +7 -2
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/metrics/test_metrics_deterministic.py +35 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/pyproject.toml +2 -3
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/datasets/test_timeseries_dataset.py +5 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/pyproject.toml +1 -1
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/pyproject.toml +1 -1
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/tests/unit/models/conftest.py +1 -1
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/pyproject.toml +1 -1
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/integrations/mlflow/mlflow_storage.py +44 -3
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/forecasting/median_forecaster.py +4 -1
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/presets/forecasting_workflow.py +16 -1
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/postprocessing/__init__.py +7 -1
- openstef-4.3.0/packages/openstef-models/src/openstef_models/transforms/postprocessing/conformalized_quantile_calibrator.py +115 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/utils/data_split.py +1 -1
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/integrations/mlflow/test_mlflow_storage.py +20 -1
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/forecasting/conftest.py +1 -1
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/forecasting/test_median_forecaster.py +6 -1
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/general/test_dimensionality_reducer.py +1 -1
- openstef-4.3.0/packages/openstef-models/tests/unit/transforms/postprocessing/test_conformalized_quantile_calibrator.py +141 -0
- {openstef-4.2.2 → openstef-4.3.0}/pyproject.toml +15 -15
- {openstef-4.2.2 → openstef-4.3.0}/uv.lock +65 -70
- {openstef-4.2.2 → openstef-4.3.0}/.github/CODEOWNERS +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/ISSUE_TEMPLATE/task.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/dependabot.yml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/pr-labeler.yml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/workflows/_job_quality_check.yaml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/workflows/check.yaml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/workflows/citations.yaml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/workflows/codeql.yaml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/workflows/docs-check.yaml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/workflows/docs.yaml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/workflows/pr-labeler.yaml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.github/workflows/release-v4.yaml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.gitignore +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/.python-version +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/CITATION.cff +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/COMMITTERS.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/LICENSE.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/LICENSES/MPL-2.0.txt +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/README.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/REUSE.toml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/THIRD_PARTY_NOTICES.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/.gitkeep +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/README.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/automation.yml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/autosummary_cache.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/autosummary_helpers.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/pages.yml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/pyproject.toml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/_figures/generate_concept_figures.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/_figures/generate_guide_figures.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/_static/css/.gitkeep +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/_static/css/custom.css +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/_static/versions.json +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/_static/versions.json.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/_templates/custom_class.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/_templates/custom_class_noindex.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/_templates/custom_function.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/_templates/module_overview.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/_templates/package_overview.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/api/beam.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/api/core.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/api/foundation_models.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/api/index.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/api/meta.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/api/models.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/conf.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/contribute/_getting_help.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/contribute/code_of_conduct.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/contribute/code_style_guide.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/contribute/contributing_guide.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/contribute/development_setup.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/contribute/development_workflow.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/contribute/document.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/contribute/index.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/concepts/beam_diagram_1.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/concepts/beam_diagram_1.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/concepts/component_splitting_diagram_1.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/concepts/component_splitting_diagram_1.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/concepts/intro_to_energy_forecasting_diagram_1.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/concepts/intro_to_energy_forecasting_diagram_1.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/concepts/metalearning_diagram_1.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/concepts/metalearning_diagram_1.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/concepts/metalearning_diagram_2.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/concepts/metalearning_diagram_2.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/concepts/metalearning_diagram_3.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/concepts/metalearning_diagram_3.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/concepts/models_diagram_1.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/concepts/models_diagram_1.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/getting_started/migration_diagram_1.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/getting_started/migration_diagram_1.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/datasets_diagram_1.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/datasets_diagram_1.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/datasets_diagram_2.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/datasets_diagram_2.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/deployment_diagram_1.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/deployment_diagram_1.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/deployment_diagram_2.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/deployment_diagram_2.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/forecasting_diagram_1.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/forecasting_diagram_1.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/probabilistic_forecasting_diagram_1.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/probabilistic_forecasting_diagram_1.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/reliability_fallback_diagram_1.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/reliability_fallback_diagram_1.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/reliability_fallback_diagram_2.mmd +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/diagrams/user_guide/guides/reliability_fallback_diagram_2.mmd.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/examples.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/concepts/aggregation_comparison.svg +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/concepts/aggregation_comparison.svg.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/concepts/backtesting_simulation.gif +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/concepts/backtesting_simulation.gif.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/concepts/forecast_confidence_bands.svg +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/concepts/forecast_confidence_bands.svg.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/concepts/weekly_load_profile.svg +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/concepts/weekly_load_profile.svg.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/guides/calibration_plot.svg +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/guides/calibration_plot.svg.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/guides/flatline_detection.svg +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/guides/flatline_detection.svg.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/guides/liander2024_rcrps_by_group.png +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/guides/liander2024_rcrps_by_group.png.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/guides/probabilistic_fan_chart.svg +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/guides/probabilistic_fan_chart.svg.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/methodology_train_predict.pptx +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/methodology_train_predict.pptx.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/methodology_train_predict.svg +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/methodology_train_predict.svg.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/uncertainty_estimation.svg +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/images/uncertainty_estimation.svg.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/index.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/js/.gitkeep +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/logos/favicon.ico +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/logos/favicon.ico.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/logos/logo_openstef_small.png +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/logos/logo_openstef_small.png.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/logos/openstef-horizontal-color.svg +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/logos/openstef-horizontal-color.svg.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/logos/openstef-horizontal-white.svg +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/logos/openstef-horizontal-white.svg.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/project/citing.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/project/governance.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/project/index.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/project/license.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/project/support.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/concepts/beam.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/concepts/component_splitting.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/concepts/foundation_models.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/concepts/index.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/concepts/intro_to_energy_forecasting.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/concepts/metalearning.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/concepts/models.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/external_resources.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/getting_started/index.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/getting_started/installation.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/getting_started/migration.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/guides/benchmark_results.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/guides/deployment.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/guides/forecasting.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/guides/index.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/guides/reliability_fallback.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/index.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/intro/index.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/intro/methodology_train_predict.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/logging.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/tutorials.rst +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/docs/sync_sources.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/.gitkeep +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/README.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/README.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/README.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/compare_benchmark_runs.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/compare_benchmark_runs.ipynb.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/compare_benchmark_runs.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/custom_benchmark.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/custom_benchmark.ipynb.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/custom_benchmark.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/custom_forecaster.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/custom_forecaster.ipynb.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/custom_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/evaluate_existing_forecasts.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/evaluate_existing_forecasts.ipynb.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/evaluate_existing_forecasts.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/run_custom_benchmark.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/run_custom_benchmark.ipynb.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/run_custom_benchmark.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/run_liander2024_benchmark.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/run_liander2024_benchmark.ipynb.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/custom/run_liander2024_benchmark.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/liander2024/README.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/liander2024/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/liander2024/compare_benchmark_runs.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/liander2024/compare_benchmark_runs.ipynb.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/liander2024/compare_benchmark_runs.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/liander2024/run_chronos2_benchmark.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/liander2024/run_chronos2_benchmark.ipynb.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/liander2024/run_chronos2_benchmark.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/liander2024/run_ensemble_benchmark.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/liander2024/run_ensemble_benchmark.ipynb.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/liander2024/run_ensemble_benchmark.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/liander2024/run_xgboost_gblinear_benchmark.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/liander2024/run_xgboost_gblinear_benchmark.ipynb.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/benchmarks/liander2024/run_xgboost_gblinear_benchmark.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/.gitignore +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/README.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/poe_tasks.toml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/pyproject.toml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/src/airflow_app/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/src/airflow_app/dags/openstef_forecast.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/src/airflow_app/dags/openstef_train.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/src/celery_app/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/src/celery_app/app.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/src/celery_app/run.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/src/celery_app/tasks.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/src/common/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/src/common/config.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/src/common/pipeline.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/src/common/services.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/src/dagster_app/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/src/dagster_app/definitions.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/src/dagster_app/run.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/deployment/tests/test_deployment.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/pyproject.toml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/.gitignore +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/backtesting_quickstart.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/backtesting_quickstart.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/custom_pipeline.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/custom_pipeline.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/datasets.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/ensemble_forecasting.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/ensemble_forecasting.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/feature_engineering.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/feature_engineering.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/forecasting_quickstart.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/forecasting_quickstart.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/foundation_model_forecasting.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/foundation_model_forecasting.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/foundation_model_forecasting_quickstart.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/foundation_model_forecasting_quickstart.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/hyperparameter_tuning_with_optuna.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/hyperparameter_tuning_with_optuna.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/model_explainability.ipynb +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/examples/tutorials/model_explainability.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/jupytext.toml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/README.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/analysis_pipeline.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/models/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/models/target_metadata.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/models/visualization_aggregation.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/models/visualization_output.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/plots/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/plots/forecast_time_series_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/plots/grouped_target_metric_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/plots/precision_recall_curve_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/plots/quantile_calibration_box_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/plots/quantile_probability_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/plots/summary_table_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/plots/windowed_metric_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/visualizations/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/visualizations/base.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/visualizations/grouped_target_metric_visualization.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/visualizations/precision_recall_curve_visualization.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/visualizations/quantile_calibration_box_visualization.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/visualizations/quantile_probability_visualization.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/visualizations/summary_table_visualization.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/visualizations/timeseries_visualization.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/analysis/visualizations/windowed_metric_visualization.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/backtesting/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/backtesting/backtest_callback.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/backtesting/backtest_event.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/backtesting/backtest_event_generator.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/backtesting/backtest_forecaster/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/backtesting/backtest_forecaster/dummy_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/backtesting/backtest_forecaster/mixins.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/backtesting/backtest_pipeline.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/backtesting/restricted_horizon_timeseries.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/baselines/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/baselines/openstef4.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/benchmark_comparison_pipeline.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/benchmark_pipeline.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/benchmarks/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/benchmarks/liander2024.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/callbacks/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/callbacks/base.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/callbacks/strict_execution_callback.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/models/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/models/benchmark_target.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/storage/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/storage/base.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/storage/local_storage.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/storage/s3_storage.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/benchmarking/target_provider.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/evaluation/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/evaluation/evaluation_pipeline.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/evaluation/metric_providers.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/evaluation/models/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/evaluation/models/report.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/evaluation/models/subset.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/evaluation/models/window.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/evaluation/window_iterators.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/metrics/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/metrics/metrics_helpers.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/src/openstef_beam/metrics/metrics_probabilistic.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/plots/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/plots/test_forecast_time_series_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/plots/test_grouped_target_metric_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/plots/test_precision_recall_curve_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/plots/test_quantile_calibration_box_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/plots/test_quantile_probability_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/plots/test_summary_table_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/plots/test_windowed_metric_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/test_analysis_pipeline.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/visualizations/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/visualizations/conftest.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/visualizations/test_grouped_target_metric_visualization.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/visualizations/test_precision_recall_curve_visualization.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/visualizations/test_quantile_calibration_box_visualization.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/visualizations/test_quantile_probability_visualization.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/visualizations/test_summary_table_visualization.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/analysis/visualizations/test_windowed_metric_visualization.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/backtesting/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/backtesting/test_backtest_event_generator.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/backtesting/test_backtest_pipeline.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/backtesting/test_batch_prediction.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/benchmarking/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/benchmarking/baselines/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/benchmarking/baselines/test_openstef4.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/benchmarking/storage/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/benchmarking/storage/test_local_storage.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/benchmarking/storage/test_s3_storage.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/benchmarking/test_benchmark_pipeline.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/benchmarking/test_target_provider.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/evaluation/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/evaluation/models/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/evaluation/models/test_window.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/evaluation/test_evaluation_pipeline.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/evaluation/test_metric_provider.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/evaluation/test_window_iterators.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/metrics/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/metrics/test_metrics_helpers.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/unit/metrics/test_metrics_probabilistic.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/utils/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-beam/tests/utils/mocks.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/README.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/base_model.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/constants.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/datasets/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/datasets/mixins.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/datasets/timeseries_dataset.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/datasets/validated_datasets.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/datasets/validation.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/datasets/versioned_timeseries_dataset.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/exceptions.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/mixins/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/mixins/param_ranges.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/mixins/predictor.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/mixins/stateful.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/mixins/transform.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/testing.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/transforms/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/transforms/dataset_transforms.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/types.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/utils/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/utils/datetime.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/utils/invariants.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/utils/itertools.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/utils/multiprocessing.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/utils/numpy.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/utils/pandas.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/src/openstef_core/utils/pydantic.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/datasets/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/datasets/test_mixins.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/datasets/test_validated_datasets.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/datasets/test_validation.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/datasets/test_versioned_timeseries_dataset.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/datasets/utils.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/mixins/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/mixins/test_stateful.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/mixins/test_transform.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/test_base_model.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/test_hyperparams_tuning.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/test_param_ranges.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/test_types.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/transforms/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/utils/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/utils/test_datetime.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/utils/test_itertools.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/utils/test_multiprocessing.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/utils/test_numpy.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-core/tests/unit/utils/test_pandas.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/README.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/inference/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/inference/backend.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/inference/onnx_backend.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/inference/provider_selection.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/inference/providers.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/integrations/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/integrations/beam.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/models/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/models/catalog.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/models/checkpoint.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/models/forecasting/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/models/forecasting/chronos2_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/presets/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/src/openstef_foundation_models/presets/forecasting_workflow.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/integration/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/integration/conftest.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/integration/test_beam_integration.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/integration/test_chronos2_onnx.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/unit/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/unit/inference/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/unit/inference/test_onnx_backend.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/unit/inference/test_provider_selection.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/unit/inference/test_providers.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/unit/integrations/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/unit/integrations/test_beam.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/unit/models/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/unit/models/forecasting/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/unit/models/forecasting/test_chronos2_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/unit/models/test_catalog.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/unit/presets/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-foundation-models/tests/unit/presets/test_forecasting_workflow.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/README.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/src/openstef_meta/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/src/openstef_meta/models/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/src/openstef_meta/models/ensemble_forecasting_model.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/src/openstef_meta/models/forecast_combiners/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/src/openstef_meta/models/forecast_combiners/forecast_combiner.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/src/openstef_meta/models/forecast_combiners/learned_weights_combiner.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/src/openstef_meta/models/forecast_combiners/stacking_combiner.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/src/openstef_meta/presets/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/src/openstef_meta/presets/forecasting_workflow.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/src/openstef_meta/utils/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/src/openstef_meta/utils/datasets.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/tests/integration/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/tests/integration/test_ensemble_forecasting_model.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/tests/unit/integrations/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/tests/unit/integrations/test_mlflow_storage_callback_ensemble.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/tests/unit/models/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/tests/unit/models/forecast_combiners/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/tests/unit/models/forecast_combiners/conftest.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/tests/unit/models/forecast_combiners/test_learned_weights_combiner.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/tests/unit/models/forecast_combiners/test_stacking_combiner.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/tests/unit/models/forecasting/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/tests/unit/models/test_ensemble_forecasting_model.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/tests/unit/utils/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-meta/tests/unit/utils/test_datasets.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/README.md +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/explainability/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/explainability/mixins.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/explainability/plotters/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/explainability/plotters/contributions_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/explainability/plotters/feature_importance_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/integrations/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/integrations/joblib/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/integrations/joblib/joblib_model_serializer.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/integrations/mlflow/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/integrations/mlflow/mlflow_storage_callback.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/integrations/optuna/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/integrations/optuna/tuner.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/mixins/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/mixins/callbacks.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/mixins/model_serializer.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/component_splitting/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/component_splitting/component_splitter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/component_splitting/constant_component_splitter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/component_splitting/linear_component_splitter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/component_splitting/linear_component_splitter_model/linear_component_splitter_model.z +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/component_splitting/linear_component_splitter_model/linear_component_splitter_model.z.license +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/component_splitting_model.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/forecasting/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/forecasting/base_case_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/forecasting/constant_quantile_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/forecasting/flatliner_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/forecasting/forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/forecasting/gblinear_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/forecasting/lgbm_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/forecasting/lgbmlinear_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/forecasting/xgboost_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/models/forecasting_model.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/presets/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/testing.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/energy_domain/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/energy_domain/wind_power_feature_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/general/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/general/dimensionality_reducer.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/general/empty_feature_remover.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/general/flagger.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/general/imputer.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/general/nan_dropper.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/general/outlier_handler.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/general/sample_weighter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/general/scaler.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/general/selector.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/general/shifter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/postprocessing/confidence_interval_applicator.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/postprocessing/isotonic_quantile_calibrator.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/postprocessing/quantile_sorter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/time_domain/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/time_domain/cyclic_features_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/time_domain/datetime_features_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/time_domain/holiday_features_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/time_domain/lags_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/time_domain/rolling_aggregates_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/time_domain/versioned_lags_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/validation/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/validation/completeness_checker.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/validation/flatline_checker.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/validation/input_consistency_checker.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/weather_domain/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/weather_domain/atmosphere_derived_features_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/weather_domain/daylight_feature_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/transforms/weather_domain/radiation_derived_features_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/utils/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/utils/evaluation_functions.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/utils/feature_selection.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/utils/loss_functions.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/utils/multi_quantile_regressor.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/utils/xgboost.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/workflows/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/workflows/callbacks/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/workflows/callbacks/data_save.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/workflows/callbacks/model_performance_callback.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/workflows/custom_component_split_workflow.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/src/openstef_models/workflows/custom_forecasting_workflow.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/integration/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/integration/test_integration.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/explainability/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/explainability/plotters/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/explainability/plotters/test_contributions_plotter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/integrations/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/integrations/joblib/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/integrations/joblib/test_joblib_model_serializer.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/integrations/mlflow/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/integrations/mlflow/test_mlflow_storage_callback.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/integrations/optuna/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/integrations/optuna/test_tuner.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/component_splitting/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/component_splitting/test_constant_component_splitter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/component_splitting/test_linear_component_splitter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/forecasting/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/forecasting/test_base_case_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/forecasting/test_constant_quantile_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/forecasting/test_flatliner_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/forecasting/test_gblinear_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/forecasting/test_lgbm_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/forecasting/test_lgbmlinear_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/forecasting/test_xgboost_forecaster.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/models/test_forecasting_model.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/test_example.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/energy_domain/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/energy_domain/test_wind_power_feature_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/general/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/general/test_empty_feature_remover.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/general/test_flagger.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/general/test_imputer.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/general/test_nan_dropper.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/general/test_outlier_handler.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/general/test_sample_weighter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/general/test_scaler.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/general/test_selector.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/general/test_shifter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/postprocessing/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/postprocessing/test_confidence_interval_applicator.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/postprocessing/test_isotonic_quantile_calibrator.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/postprocessing/test_quantile_sorter.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/time_domain/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/time_domain/test_cyclic_features_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/time_domain/test_datetime_features_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/time_domain/test_holiday_features_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/time_domain/test_lags_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/time_domain/test_rolling_aggregates_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/time_domain/test_versioned_lags_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/validation/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/validation/test_completeness_checker.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/validation/test_flatline_checker.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/validation/test_input_consistency_checker.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/weather_domain/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/weather_domain/test_atmosphere_derived_features_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/weather_domain/test_daylight_feature_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/transforms/weather_domain/test_radiation_derived_featuers_adder.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/utils/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/utils/test_data_split.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/utils/test_feature_selection.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/utils/test_loss_functions.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/utils/test_multi_quantile_regressor.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/workflows/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/workflows/callbacks/__init__.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/workflows/callbacks/test_model_performance_callback.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/packages/openstef-models/tests/unit/workflows/test_custom_forecasting_workflow.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/poe_tasks.toml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/ruff.toml +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/sonar-project.properties +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/tools/check_notebook_outputs.py +0 -0
- {openstef-4.2.2 → openstef-4.3.0}/tools/reuse-fix.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: openstef
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.3.0
|
|
4
4
|
Summary: Open Short Term Energy forecasting library
|
|
5
5
|
Project-URL: Documentation, https://openstef.github.io/openstef/index.html
|
|
6
6
|
Project-URL: Homepage, https://lfenergy.org/projects/openstef/
|
|
@@ -16,26 +16,26 @@ Classifier: Programming Language :: Python :: 3 :: Only
|
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.12
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.13
|
|
18
18
|
Requires-Python: <4.0,>=3.12
|
|
19
|
-
Requires-Dist: openstef-core==4.
|
|
20
|
-
Requires-Dist: openstef-models[xgb-cpu]==4.
|
|
19
|
+
Requires-Dist: openstef-core==4.3.0
|
|
20
|
+
Requires-Dist: openstef-models[xgb-cpu]==4.3.0
|
|
21
21
|
Provides-Extra: all
|
|
22
|
-
Requires-Dist: openstef-beam[all]==4.
|
|
23
|
-
Requires-Dist: openstef-core==4.
|
|
24
|
-
Requires-Dist: openstef-foundation-models[cpu]==4.
|
|
25
|
-
Requires-Dist: openstef-meta==4.
|
|
26
|
-
Requires-Dist: openstef-models[xgb-cpu]==4.
|
|
22
|
+
Requires-Dist: openstef-beam[all]==4.3.0; extra == 'all'
|
|
23
|
+
Requires-Dist: openstef-core==4.3.0; extra == 'all'
|
|
24
|
+
Requires-Dist: openstef-foundation-models[cpu]==4.3.0; extra == 'all'
|
|
25
|
+
Requires-Dist: openstef-meta==4.3.0; extra == 'all'
|
|
26
|
+
Requires-Dist: openstef-models[xgb-cpu]==4.3.0; extra == 'all'
|
|
27
27
|
Provides-Extra: beam
|
|
28
28
|
Requires-Dist: huggingface-hub>=0.35.3; extra == 'beam'
|
|
29
|
-
Requires-Dist: openstef-beam==4.
|
|
29
|
+
Requires-Dist: openstef-beam==4.3.0; extra == 'beam'
|
|
30
30
|
Provides-Extra: core
|
|
31
|
-
Requires-Dist: openstef-core==4.
|
|
31
|
+
Requires-Dist: openstef-core==4.3.0; extra == 'core'
|
|
32
32
|
Provides-Extra: foundation-models
|
|
33
|
-
Requires-Dist: openstef-foundation-models[cpu]==4.
|
|
33
|
+
Requires-Dist: openstef-foundation-models[cpu]==4.3.0; extra == 'foundation-models'
|
|
34
34
|
Provides-Extra: meta
|
|
35
|
-
Requires-Dist: openstef-meta==4.
|
|
35
|
+
Requires-Dist: openstef-meta==4.3.0; extra == 'meta'
|
|
36
36
|
Provides-Extra: models
|
|
37
|
-
Requires-Dist: openstef-meta==4.
|
|
38
|
-
Requires-Dist: openstef-models[xgb-cpu]==4.
|
|
37
|
+
Requires-Dist: openstef-meta==4.3.0; extra == 'models'
|
|
38
|
+
Requires-Dist: openstef-models[xgb-cpu]==4.3.0; extra == 'models'
|
|
39
39
|
Description-Content-Type: text/markdown
|
|
40
40
|
|
|
41
41
|
<!--
|
{openstef-4.2.2 → openstef-4.3.0}/docs/source/user_guide/guides/probabilistic_forecasting.rst
RENAMED
|
@@ -206,7 +206,44 @@ When ``use_local_quantile_estimation=True``, the calibrator estimates observed q
|
|
|
206
206
|
|
|
207
207
|
The calibrator must be fitted (via ``workflow.fit()``) before it can be used for prediction. Calling ``predict()`` on a workflow with an unfitted calibrator will raise a :class:`~openstef_core.exceptions.NotFittedError`.
|
|
208
208
|
|
|
209
|
-
For a complete worked example showing
|
|
209
|
+
For a complete worked example showing isotonic and asymmetric conformal
|
|
210
|
+
calibration before and after, including diagnostic plots, see
|
|
211
|
+
:doc:`/tutorials/quantile_calibration`.
|
|
212
|
+
|
|
213
|
+
Conformalized Quantile Calibration
|
|
214
|
+
----------------------------------
|
|
215
|
+
|
|
216
|
+
OpenSTEF also provides a dependency-free
|
|
217
|
+
:class:`~openstef_models.transforms.postprocessing.ConformalizedQuantileCalibrator`
|
|
218
|
+
that implements asymmetric finite-sample conformal calibration. It is a
|
|
219
|
+
postprocessing transform over a
|
|
220
|
+
``ForecastDataset``:
|
|
221
|
+
|
|
222
|
+
1. Fit the forecaster and generate forecasts for a time-ordered calibration
|
|
223
|
+
period.
|
|
224
|
+
2. Fit the calibrator on those forecasts and the corresponding actuals.
|
|
225
|
+
3. Apply the fitted corrections to later forecast datasets.
|
|
226
|
+
|
|
227
|
+
The correction is asymmetric by tail. For a lower quantile ``q < 0.5``, the
|
|
228
|
+
calibrator uses ``forecast - actual`` scores and subtracts the finite-sample
|
|
229
|
+
quantile at ``1 - q``. For an upper quantile ``q >= 0.5``, it uses ``actual -
|
|
230
|
+
forecast`` scores and adds the finite-sample quantile at ``q``. The finite-sample
|
|
231
|
+
level is adjusted with ``min(level * (n + 1) / n, 1)`` and estimated with
|
|
232
|
+
NumPy's ``method="higher"`` convention.
|
|
233
|
+
|
|
234
|
+
By default, P50 is unchanged and quantile columns are not sorted inside the
|
|
235
|
+
calibrator. This preserves the specified semantics: median calibration is an
|
|
236
|
+
explicit opt-in, while downstream
|
|
237
|
+
:class:`~openstef_models.transforms.postprocessing.quantile_sorter.QuantileSorter`
|
|
238
|
+
owns the quantile-ordering invariant.
|
|
239
|
+
|
|
240
|
+
.. code-block:: python
|
|
241
|
+
|
|
242
|
+
from openstef_models.transforms.postprocessing import ConformalizedQuantileCalibrator
|
|
243
|
+
|
|
244
|
+
calibrator = ConformalizedQuantileCalibrator(quantiles=quantiles)
|
|
245
|
+
calibrator.fit(calibration_forecasts_with_actuals)
|
|
246
|
+
calibrated_forecasts = calibrator.transform(forecasts)
|
|
210
247
|
|
|
211
248
|
Evaluating Probabilistic Forecasts
|
|
212
249
|
-----------------------------------
|
|
@@ -56,24 +56,25 @@
|
|
|
56
56
|
"source": [
|
|
57
57
|
"# Quantile Calibration\n",
|
|
58
58
|
"\n",
|
|
59
|
-
"Improve the reliability of probabilistic forecasts using isotonic
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
59
|
+
"Improve the reliability of probabilistic forecasts using isotonic and\n",
|
|
60
|
+
"asymmetric conformal\n",
|
|
61
|
+
"quantile calibration. A well-calibrated P10 quantile should exceed actual\n",
|
|
62
|
+
"values roughly 10 % of the time — this tutorial shows how to measure and\n",
|
|
63
|
+
"correct deviations.\n",
|
|
63
64
|
"\n",
|
|
64
65
|
"**What you'll learn:**\n",
|
|
65
66
|
"\n",
|
|
66
67
|
"- Measure quantile calibration with observed coverage\n",
|
|
67
|
-
"- Add isotonic calibration as
|
|
68
|
+
"- Add isotonic and asymmetric conformal calibration as postprocessing steps\n",
|
|
68
69
|
"- Compare before/after calibration on real data\n",
|
|
69
70
|
"\n",
|
|
70
71
|
"```{note}\n",
|
|
71
72
|
"This tutorial uses a small data slice for fast execution.\n",
|
|
72
|
-
"See `examples/benchmarks/` for production-scale runs.\n",
|
|
73
73
|
"```\n",
|
|
74
74
|
"\n",
|
|
75
75
|
"**Key API references:**\n",
|
|
76
76
|
"[`IsotonicQuantileCalibrator`](https://openstef.github.io/openstef/api/generated/openstef_models.transforms.postprocessing.IsotonicQuantileCalibrator.html)\n",
|
|
77
|
+
"· [`ConformalizedQuantileCalibrator`](https://openstef.github.io/openstef/api/generated/openstef_models.transforms.postprocessing.ConformalizedQuantileCalibrator.html)\n",
|
|
77
78
|
"· [`ForecastingWorkflowConfig`](https://openstef.github.io/openstef/api/generated/openstef_models.presets.ForecastingWorkflowConfig.html)"
|
|
78
79
|
]
|
|
79
80
|
},
|
|
@@ -111,11 +112,12 @@
|
|
|
111
112
|
"\n",
|
|
112
113
|
"train_start = datetime.fromisoformat(\"2024-03-01T00:00:00Z\")\n",
|
|
113
114
|
"train_end = train_start + timedelta(days=45)\n",
|
|
114
|
-
"
|
|
115
|
+
"cal_end = train_end + timedelta(days=4)\n",
|
|
116
|
+
"forecast_end = cal_end + timedelta(days=7)\n",
|
|
115
117
|
"\n",
|
|
116
118
|
"train_dataset = dataset.filter_by_range(start=train_start, end=train_end)\n",
|
|
117
119
|
"predict_dataset = dataset.filter_by_range(\n",
|
|
118
|
-
" start=
|
|
120
|
+
" start=cal_end - timedelta(days=14),\n",
|
|
119
121
|
" end=forecast_end,\n",
|
|
120
122
|
")\n",
|
|
121
123
|
"\n",
|
|
@@ -139,7 +141,7 @@
|
|
|
139
141
|
"\n",
|
|
140
142
|
"workflow_uncal = create_forecasting_workflow(config=config)\n",
|
|
141
143
|
"workflow_uncal.fit(train_dataset)\n",
|
|
142
|
-
"forecast_uncal = workflow_uncal.predict(predict_dataset, forecast_start=
|
|
144
|
+
"forecast_uncal = workflow_uncal.predict(predict_dataset, forecast_start=cal_end)\n",
|
|
143
145
|
"\n",
|
|
144
146
|
"print(f\"Forecast rows: {len(forecast_uncal.data)}\")"
|
|
145
147
|
]
|
|
@@ -201,15 +203,16 @@
|
|
|
201
203
|
"id": "c0b8a434",
|
|
202
204
|
"metadata": {},
|
|
203
205
|
"source": [
|
|
204
|
-
"## Add isotonic calibration\n",
|
|
205
|
-
"\n",
|
|
206
|
-
"[`IsotonicQuantileCalibrator`](https://openstef.github.io/openstef/api/generated/openstef_models.transforms.postprocessing.IsotonicQuantileCalibrator.html)
|
|
207
|
-
"monotonic mapping from predicted quantiles to observed quantile levels
|
|
208
|
-
"
|
|
209
|
-
"
|
|
210
|
-
"\n",
|
|
211
|
-
"
|
|
212
|
-
"
|
|
206
|
+
"## Add isotonic and asymmetric conformal calibration\n",
|
|
207
|
+
"\n",
|
|
208
|
+
"[`IsotonicQuantileCalibrator`](https://openstef.github.io/openstef/api/generated/openstef_models.transforms.postprocessing.IsotonicQuantileCalibrator.html) learns a\n",
|
|
209
|
+
"monotonic mapping from predicted quantiles to observed quantile levels. It is\n",
|
|
210
|
+
"appended to the workflow's postprocessing pipeline and fitted on training-set\n",
|
|
211
|
+
"predictions automatically.\n",
|
|
212
|
+
"[`ConformalizedQuantileCalibrator`](https://openstef.github.io/openstef/api/generated/openstef_models.transforms.postprocessing.ConformalizedQuantileCalibrator.html)\n",
|
|
213
|
+
"instead applies asymmetric conformal corrections. It leaves\n",
|
|
214
|
+
"P50 unchanged by default and delegates quantile ordering to a downstream\n",
|
|
215
|
+
"`QuantileSorter`."
|
|
213
216
|
]
|
|
214
217
|
},
|
|
215
218
|
{
|
|
@@ -233,7 +236,7 @@
|
|
|
233
236
|
")\n",
|
|
234
237
|
"\n",
|
|
235
238
|
"workflow_cal.fit(train_dataset)\n",
|
|
236
|
-
"forecast_cal = workflow_cal.predict(predict_dataset, forecast_start=
|
|
239
|
+
"forecast_cal = workflow_cal.predict(predict_dataset, forecast_start=cal_end)"
|
|
237
240
|
]
|
|
238
241
|
},
|
|
239
242
|
{
|
|
@@ -250,12 +253,76 @@
|
|
|
250
253
|
"assert len(forecast_cal.data) > 100, f\"Expected >100 calibrated forecast rows, got {len(forecast_cal.data)}\""
|
|
251
254
|
]
|
|
252
255
|
},
|
|
256
|
+
{
|
|
257
|
+
"cell_type": "markdown",
|
|
258
|
+
"id": "4381f623",
|
|
259
|
+
"metadata": {},
|
|
260
|
+
"source": [
|
|
261
|
+
"### Calibrate with the asymmetric conformal transform\n",
|
|
262
|
+
"\n",
|
|
263
|
+
"Split-conformal calibration requires a **held-out** calibration period that\n",
|
|
264
|
+
"the forecaster was not trained on. We predict that period with the fitted\n",
|
|
265
|
+
"workflow, attach the observed target, and fit the calibrator before applying\n",
|
|
266
|
+
"it to the final holdout forecast."
|
|
267
|
+
]
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"cell_type": "code",
|
|
271
|
+
"execution_count": null,
|
|
272
|
+
"id": "d6730356",
|
|
273
|
+
"metadata": {},
|
|
274
|
+
"outputs": [],
|
|
275
|
+
"source": [
|
|
276
|
+
"from openstef_models.transforms.postprocessing import ConformalizedQuantileCalibrator\n",
|
|
277
|
+
"\n",
|
|
278
|
+
"calibration_dataset = dataset.filter_by_range(\n",
|
|
279
|
+
" start=train_end - timedelta(days=14),\n",
|
|
280
|
+
" end=cal_end,\n",
|
|
281
|
+
")\n",
|
|
282
|
+
"workflow_conformalized = create_forecasting_workflow(\n",
|
|
283
|
+
" config=config.model_copy(update={\"model_id\": \"conformalized_gblinear\"})\n",
|
|
284
|
+
")\n",
|
|
285
|
+
"workflow_conformalized.fit(train_dataset)\n",
|
|
286
|
+
"cal_forecast = workflow_conformalized.predict(calibration_dataset, forecast_start=train_end)\n",
|
|
287
|
+
"conformalized_calibrator = ConformalizedQuantileCalibrator(quantiles=quantiles)\n",
|
|
288
|
+
"conformalized_calibrator.fit(cal_forecast)\n",
|
|
289
|
+
"forecast_conformalized_raw = workflow_conformalized.predict(predict_dataset, forecast_start=cal_end)\n",
|
|
290
|
+
"forecast_conformalized = conformalized_calibrator.transform(forecast_conformalized_raw)"
|
|
291
|
+
]
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
"cell_type": "code",
|
|
295
|
+
"execution_count": null,
|
|
296
|
+
"id": "f0b399bf",
|
|
297
|
+
"metadata": {
|
|
298
|
+
"tags": [
|
|
299
|
+
"remove-cell"
|
|
300
|
+
]
|
|
301
|
+
},
|
|
302
|
+
"outputs": [],
|
|
303
|
+
"source": [
|
|
304
|
+
"assert len(forecast_conformalized.data) > 100, \"Expected >100 conformalized forecast rows\""
|
|
305
|
+
]
|
|
306
|
+
},
|
|
253
307
|
{
|
|
254
308
|
"cell_type": "markdown",
|
|
255
309
|
"id": "0dc57ac6",
|
|
256
310
|
"metadata": {},
|
|
257
311
|
"source": [
|
|
258
|
-
"## Compare calibration before and after"
|
|
312
|
+
"## Compare calibration before and after\n",
|
|
313
|
+
"\n",
|
|
314
|
+
"The following table and plot compare the uncalibrated forecast with both\n",
|
|
315
|
+
"postprocessing approaches on the same holdout rows.\n",
|
|
316
|
+
"\n",
|
|
317
|
+
"### Isotonic calibration\n",
|
|
318
|
+
"\n",
|
|
319
|
+
"Isotonic calibration learns a monotonic mapping for each quantile. The\n",
|
|
320
|
+
"``observed (isotonic)`` and ``error (isotonic)`` columns show its effect.\n",
|
|
321
|
+
"\n",
|
|
322
|
+
"### Asymmetric conformal calibration\n",
|
|
323
|
+
"\n",
|
|
324
|
+
"The ``observed (conformalized)`` and ``error (conformalized)`` columns show\n",
|
|
325
|
+
"the effect of the asymmetric corrections."
|
|
259
326
|
]
|
|
260
327
|
},
|
|
261
328
|
{
|
|
@@ -266,17 +333,23 @@
|
|
|
266
333
|
"outputs": [],
|
|
267
334
|
"source": [
|
|
268
335
|
"forecast_cal_aligned = forecast_cal.data.loc[actuals.index]\n",
|
|
336
|
+
"forecast_conformalized_aligned = forecast_conformalized.data.loc[actuals.index]\n",
|
|
269
337
|
"\n",
|
|
270
338
|
"observed_cal = [float((actuals <= forecast_cal_aligned[f\"quantile_P{int(float(q) * 100)}\"]).mean()) for q in quantiles]\n",
|
|
339
|
+
"observed_conformalized = [\n",
|
|
340
|
+
" float((actuals <= forecast_conformalized_aligned[f\"quantile_P{int(float(q) * 100)}\"]).mean()) for q in quantiles\n",
|
|
341
|
+
"]\n",
|
|
271
342
|
"\n",
|
|
272
343
|
"comparison_df = pd.DataFrame(\n",
|
|
273
344
|
" {\n",
|
|
274
345
|
" \"quantile\": [f\"P{int(float(q) * 100)}\" for q in quantiles],\n",
|
|
275
346
|
" \"expected\": expected,\n",
|
|
276
347
|
" \"observed (before)\": observed_uncal,\n",
|
|
277
|
-
" \"observed (
|
|
348
|
+
" \"observed (isotonic)\": observed_cal,\n",
|
|
349
|
+
" \"observed (conformalized)\": observed_conformalized,\n",
|
|
278
350
|
" \"error (before)\": [o - e for o, e in zip(observed_uncal, expected, strict=True)],\n",
|
|
279
|
-
" \"error (
|
|
351
|
+
" \"error (isotonic)\": [o - e for o, e in zip(observed_cal, expected, strict=True)],\n",
|
|
352
|
+
" \"error (conformalized)\": [o - e for o, e in zip(observed_conformalized, expected, strict=True)],\n",
|
|
280
353
|
" }\n",
|
|
281
354
|
")\n",
|
|
282
355
|
"print(comparison_df.to_string(index=False))"
|
|
@@ -321,12 +394,23 @@
|
|
|
321
394
|
" x=expected,\n",
|
|
322
395
|
" y=observed_cal,\n",
|
|
323
396
|
" mode=\"markers+lines\",\n",
|
|
324
|
-
" name=\"After calibration\",\n",
|
|
397
|
+
" name=\"After isotonic calibration\",\n",
|
|
325
398
|
" marker={\"size\": 12, \"color\": \"blue\"},\n",
|
|
326
399
|
" line={\"color\": \"blue\", \"width\": 2},\n",
|
|
327
400
|
" )\n",
|
|
328
401
|
")\n",
|
|
329
402
|
"\n",
|
|
403
|
+
"fig.add_trace(\n",
|
|
404
|
+
" go.Scatter(\n",
|
|
405
|
+
" x=expected,\n",
|
|
406
|
+
" y=observed_conformalized,\n",
|
|
407
|
+
" mode=\"markers+lines\",\n",
|
|
408
|
+
" name=\"After conformalized calibration\",\n",
|
|
409
|
+
" marker={\"size\": 12, \"color\": \"green\", \"symbol\": \"diamond\"},\n",
|
|
410
|
+
" line={\"color\": \"green\", \"width\": 2, \"dash\": \"dash\"},\n",
|
|
411
|
+
" )\n",
|
|
412
|
+
")\n",
|
|
413
|
+
"\n",
|
|
330
414
|
"fig.update_layout(\n",
|
|
331
415
|
" title=\"Quantile calibration: expected vs observed coverage\",\n",
|
|
332
416
|
" xaxis_title=\"Expected quantile level\",\n",
|
|
@@ -344,10 +428,12 @@
|
|
|
344
428
|
"id": "fb2c92a8",
|
|
345
429
|
"metadata": {},
|
|
346
430
|
"source": [
|
|
347
|
-
"Points closer to the diagonal indicate better calibration.
|
|
348
|
-
"
|
|
349
|
-
"
|
|
350
|
-
"
|
|
431
|
+
"Points closer to the diagonal indicate better calibration. Isotonic regression\n",
|
|
432
|
+
"learns a monotonic value mapping, while the conformalized calibrator applies\n",
|
|
433
|
+
"asymmetric corrections. Compare both methods on a separate\n",
|
|
434
|
+
"holdout period before selecting one for production. To measure\n",
|
|
435
|
+
"calibration stability over longer time horizons, combine this with a\n",
|
|
436
|
+
"{doc}`backtesting_quickstart`."
|
|
351
437
|
]
|
|
352
438
|
},
|
|
353
439
|
{
|
|
@@ -43,24 +43,25 @@ logger = setup_notebook_logging(
|
|
|
43
43
|
# %% [markdown]
|
|
44
44
|
# # Quantile Calibration
|
|
45
45
|
#
|
|
46
|
-
# Improve the reliability of probabilistic forecasts using isotonic
|
|
47
|
-
#
|
|
48
|
-
#
|
|
49
|
-
#
|
|
46
|
+
# Improve the reliability of probabilistic forecasts using isotonic and
|
|
47
|
+
# asymmetric conformal
|
|
48
|
+
# quantile calibration. A well-calibrated P10 quantile should exceed actual
|
|
49
|
+
# values roughly 10 % of the time — this tutorial shows how to measure and
|
|
50
|
+
# correct deviations.
|
|
50
51
|
#
|
|
51
52
|
# **What you'll learn:**
|
|
52
53
|
#
|
|
53
54
|
# - Measure quantile calibration with observed coverage
|
|
54
|
-
# - Add isotonic calibration as
|
|
55
|
+
# - Add isotonic and asymmetric conformal calibration as postprocessing steps
|
|
55
56
|
# - Compare before/after calibration on real data
|
|
56
57
|
#
|
|
57
58
|
# ```{note}
|
|
58
59
|
# This tutorial uses a small data slice for fast execution.
|
|
59
|
-
# See `examples/benchmarks/` for production-scale runs.
|
|
60
60
|
# ```
|
|
61
61
|
#
|
|
62
62
|
# **Key API references:**
|
|
63
63
|
# [`IsotonicQuantileCalibrator`](https://openstef.github.io/openstef/api/generated/openstef_models.transforms.postprocessing.IsotonicQuantileCalibrator.html)
|
|
64
|
+
# · [`ConformalizedQuantileCalibrator`](https://openstef.github.io/openstef/api/generated/openstef_models.transforms.postprocessing.ConformalizedQuantileCalibrator.html)
|
|
64
65
|
# · [`ForecastingWorkflowConfig`](https://openstef.github.io/openstef/api/generated/openstef_models.presets.ForecastingWorkflowConfig.html)
|
|
65
66
|
|
|
66
67
|
# %% [markdown]
|
|
@@ -86,11 +87,12 @@ dataset = load_liander_dataset()
|
|
|
86
87
|
|
|
87
88
|
train_start = datetime.fromisoformat("2024-03-01T00:00:00Z")
|
|
88
89
|
train_end = train_start + timedelta(days=45)
|
|
89
|
-
|
|
90
|
+
cal_end = train_end + timedelta(days=4)
|
|
91
|
+
forecast_end = cal_end + timedelta(days=7)
|
|
90
92
|
|
|
91
93
|
train_dataset = dataset.filter_by_range(start=train_start, end=train_end)
|
|
92
94
|
predict_dataset = dataset.filter_by_range(
|
|
93
|
-
start=
|
|
95
|
+
start=cal_end - timedelta(days=14),
|
|
94
96
|
end=forecast_end,
|
|
95
97
|
)
|
|
96
98
|
|
|
@@ -114,7 +116,7 @@ config = ForecastingWorkflowConfig(
|
|
|
114
116
|
|
|
115
117
|
workflow_uncal = create_forecasting_workflow(config=config)
|
|
116
118
|
workflow_uncal.fit(train_dataset)
|
|
117
|
-
forecast_uncal = workflow_uncal.predict(predict_dataset, forecast_start=
|
|
119
|
+
forecast_uncal = workflow_uncal.predict(predict_dataset, forecast_start=cal_end)
|
|
118
120
|
|
|
119
121
|
print(f"Forecast rows: {len(forecast_uncal.data)}")
|
|
120
122
|
|
|
@@ -148,15 +150,16 @@ print("Calibration before isotonic correction:")
|
|
|
148
150
|
print(calibration_df.to_string(index=False))
|
|
149
151
|
|
|
150
152
|
# %% [markdown]
|
|
151
|
-
# ## Add isotonic calibration
|
|
152
|
-
#
|
|
153
|
-
# [`IsotonicQuantileCalibrator`](https://openstef.github.io/openstef/api/generated/openstef_models.transforms.postprocessing.IsotonicQuantileCalibrator.html) is a postprocessing transform that learns a
|
|
154
|
-
# monotonic mapping from predicted quantiles to observed quantile levels.
|
|
155
|
-
# During training it fits on the validation split; during prediction it
|
|
156
|
-
# corrects each quantile value.
|
|
153
|
+
# ## Add isotonic and asymmetric conformal calibration
|
|
157
154
|
#
|
|
158
|
-
#
|
|
159
|
-
#
|
|
155
|
+
# [`IsotonicQuantileCalibrator`](https://openstef.github.io/openstef/api/generated/openstef_models.transforms.postprocessing.IsotonicQuantileCalibrator.html) learns a
|
|
156
|
+
# monotonic mapping from predicted quantiles to observed quantile levels. It is
|
|
157
|
+
# appended to the workflow's postprocessing pipeline and fitted on training-set
|
|
158
|
+
# predictions automatically.
|
|
159
|
+
# [`ConformalizedQuantileCalibrator`](https://openstef.github.io/openstef/api/generated/openstef_models.transforms.postprocessing.ConformalizedQuantileCalibrator.html)
|
|
160
|
+
# instead applies asymmetric conformal corrections. It leaves
|
|
161
|
+
# P50 unchanged by default and delegates quantile ordering to a downstream
|
|
162
|
+
# `QuantileSorter`.
|
|
160
163
|
|
|
161
164
|
# %%
|
|
162
165
|
from openstef_models.transforms.postprocessing import IsotonicQuantileCalibrator
|
|
@@ -173,27 +176,74 @@ workflow_cal.model.postprocessing.transforms.append(
|
|
|
173
176
|
)
|
|
174
177
|
|
|
175
178
|
workflow_cal.fit(train_dataset)
|
|
176
|
-
forecast_cal = workflow_cal.predict(predict_dataset, forecast_start=
|
|
179
|
+
forecast_cal = workflow_cal.predict(predict_dataset, forecast_start=cal_end)
|
|
177
180
|
|
|
178
181
|
# %% tags=["remove-cell"]
|
|
179
182
|
assert len(forecast_cal.data) > 100, f"Expected >100 calibrated forecast rows, got {len(forecast_cal.data)}"
|
|
180
183
|
|
|
184
|
+
# %% [markdown]
|
|
185
|
+
# ### Calibrate with the asymmetric conformal transform
|
|
186
|
+
#
|
|
187
|
+
# Split-conformal calibration requires a **held-out** calibration period that
|
|
188
|
+
# the forecaster was not trained on. We predict that period with the fitted
|
|
189
|
+
# workflow, attach the observed target, and fit the calibrator before applying
|
|
190
|
+
# it to the final holdout forecast.
|
|
191
|
+
|
|
192
|
+
# %%
|
|
193
|
+
from openstef_models.transforms.postprocessing import ConformalizedQuantileCalibrator
|
|
194
|
+
|
|
195
|
+
calibration_dataset = dataset.filter_by_range(
|
|
196
|
+
start=train_end - timedelta(days=14),
|
|
197
|
+
end=cal_end,
|
|
198
|
+
)
|
|
199
|
+
workflow_conformalized = create_forecasting_workflow(
|
|
200
|
+
config=config.model_copy(update={"model_id": "conformalized_gblinear"})
|
|
201
|
+
)
|
|
202
|
+
workflow_conformalized.fit(train_dataset)
|
|
203
|
+
cal_forecast = workflow_conformalized.predict(calibration_dataset, forecast_start=train_end)
|
|
204
|
+
conformalized_calibrator = ConformalizedQuantileCalibrator(quantiles=quantiles)
|
|
205
|
+
conformalized_calibrator.fit(cal_forecast)
|
|
206
|
+
forecast_conformalized_raw = workflow_conformalized.predict(predict_dataset, forecast_start=cal_end)
|
|
207
|
+
forecast_conformalized = conformalized_calibrator.transform(forecast_conformalized_raw)
|
|
208
|
+
|
|
209
|
+
# %% tags=["remove-cell"]
|
|
210
|
+
assert len(forecast_conformalized.data) > 100, "Expected >100 conformalized forecast rows"
|
|
211
|
+
|
|
181
212
|
# %% [markdown]
|
|
182
213
|
# ## Compare calibration before and after
|
|
214
|
+
#
|
|
215
|
+
# The following table and plot compare the uncalibrated forecast with both
|
|
216
|
+
# postprocessing approaches on the same holdout rows.
|
|
217
|
+
#
|
|
218
|
+
# ### Isotonic calibration
|
|
219
|
+
#
|
|
220
|
+
# Isotonic calibration learns a monotonic mapping for each quantile. The
|
|
221
|
+
# ``observed (isotonic)`` and ``error (isotonic)`` columns show its effect.
|
|
222
|
+
#
|
|
223
|
+
# ### Asymmetric conformal calibration
|
|
224
|
+
#
|
|
225
|
+
# The ``observed (conformalized)`` and ``error (conformalized)`` columns show
|
|
226
|
+
# the effect of the asymmetric corrections.
|
|
183
227
|
|
|
184
228
|
# %%
|
|
185
229
|
forecast_cal_aligned = forecast_cal.data.loc[actuals.index]
|
|
230
|
+
forecast_conformalized_aligned = forecast_conformalized.data.loc[actuals.index]
|
|
186
231
|
|
|
187
232
|
observed_cal = [float((actuals <= forecast_cal_aligned[f"quantile_P{int(float(q) * 100)}"]).mean()) for q in quantiles]
|
|
233
|
+
observed_conformalized = [
|
|
234
|
+
float((actuals <= forecast_conformalized_aligned[f"quantile_P{int(float(q) * 100)}"]).mean()) for q in quantiles
|
|
235
|
+
]
|
|
188
236
|
|
|
189
237
|
comparison_df = pd.DataFrame(
|
|
190
238
|
{
|
|
191
239
|
"quantile": [f"P{int(float(q) * 100)}" for q in quantiles],
|
|
192
240
|
"expected": expected,
|
|
193
241
|
"observed (before)": observed_uncal,
|
|
194
|
-
"observed (
|
|
242
|
+
"observed (isotonic)": observed_cal,
|
|
243
|
+
"observed (conformalized)": observed_conformalized,
|
|
195
244
|
"error (before)": [o - e for o, e in zip(observed_uncal, expected, strict=True)],
|
|
196
|
-
"error (
|
|
245
|
+
"error (isotonic)": [o - e for o, e in zip(observed_cal, expected, strict=True)],
|
|
246
|
+
"error (conformalized)": [o - e for o, e in zip(observed_conformalized, expected, strict=True)],
|
|
197
247
|
}
|
|
198
248
|
)
|
|
199
249
|
print(comparison_df.to_string(index=False))
|
|
@@ -227,12 +277,23 @@ fig.add_trace(
|
|
|
227
277
|
x=expected,
|
|
228
278
|
y=observed_cal,
|
|
229
279
|
mode="markers+lines",
|
|
230
|
-
name="After calibration",
|
|
280
|
+
name="After isotonic calibration",
|
|
231
281
|
marker={"size": 12, "color": "blue"},
|
|
232
282
|
line={"color": "blue", "width": 2},
|
|
233
283
|
)
|
|
234
284
|
)
|
|
235
285
|
|
|
286
|
+
fig.add_trace(
|
|
287
|
+
go.Scatter(
|
|
288
|
+
x=expected,
|
|
289
|
+
y=observed_conformalized,
|
|
290
|
+
mode="markers+lines",
|
|
291
|
+
name="After conformalized calibration",
|
|
292
|
+
marker={"size": 12, "color": "green", "symbol": "diamond"},
|
|
293
|
+
line={"color": "green", "width": 2, "dash": "dash"},
|
|
294
|
+
)
|
|
295
|
+
)
|
|
296
|
+
|
|
236
297
|
fig.update_layout(
|
|
237
298
|
title="Quantile calibration: expected vs observed coverage",
|
|
238
299
|
xaxis_title="Expected quantile level",
|
|
@@ -245,10 +306,12 @@ fig.update_layout(
|
|
|
245
306
|
fig.show()
|
|
246
307
|
|
|
247
308
|
# %% [markdown]
|
|
248
|
-
# Points closer to the diagonal indicate better calibration.
|
|
249
|
-
#
|
|
250
|
-
#
|
|
251
|
-
#
|
|
309
|
+
# Points closer to the diagonal indicate better calibration. Isotonic regression
|
|
310
|
+
# learns a monotonic value mapping, while the conformalized calibrator applies
|
|
311
|
+
# asymmetric corrections. Compare both methods on a separate
|
|
312
|
+
# holdout period before selecting one for production. To measure
|
|
313
|
+
# calibration stability over longer time horizons, combine this with a
|
|
314
|
+
# {doc}`backtesting_quickstart`.
|
|
252
315
|
|
|
253
316
|
# %% [markdown]
|
|
254
317
|
# ## Next steps
|
|
@@ -7,7 +7,7 @@ requires = [ "hatchling" ]
|
|
|
7
7
|
|
|
8
8
|
[project]
|
|
9
9
|
name = "openstef-beam"
|
|
10
|
-
version = "4.
|
|
10
|
+
version = "4.3.0"
|
|
11
11
|
description = "Backtesting, Evaluation, Analysis and Metrics (BEAM) library for OpenSTEF"
|
|
12
12
|
readme = "README.md"
|
|
13
13
|
keywords = [ "energy", "forecasting", "machinelearning" ]
|
|
@@ -19,7 +19,6 @@ from typing import NamedTuple
|
|
|
19
19
|
|
|
20
20
|
import numpy as np
|
|
21
21
|
import numpy.typing as npt
|
|
22
|
-
from sklearn.metrics import r2_score
|
|
23
22
|
|
|
24
23
|
from openstef_core.types import Quantile
|
|
25
24
|
|
|
@@ -518,16 +517,30 @@ def r2(
|
|
|
518
517
|
well observed outcomes are replicated by the model, based on the proportion
|
|
519
518
|
of total variation of outcomes explained by the model.
|
|
520
519
|
|
|
520
|
+
Structurally invalid inputs, such as incompatible shapes or unsupported
|
|
521
|
+
dimensions, raise ValueError. Statistically unusable data, such as fewer
|
|
522
|
+
than two samples or non-finite values, returns NaN.
|
|
523
|
+
|
|
521
524
|
Args:
|
|
522
525
|
y_true: Ground truth values with shape (num_samples,).
|
|
523
526
|
y_pred: Predicted values with shape (num_samples,).
|
|
524
|
-
sample_weights: Optional weights for each sample with shape
|
|
525
|
-
If None, all samples are weighted equally.
|
|
527
|
+
sample_weights: Optional weights for each sample with shape
|
|
528
|
+
(num_samples,). If None, all samples are weighted equally.
|
|
526
529
|
|
|
527
530
|
Returns:
|
|
528
|
-
The R² score as a float.
|
|
529
|
-
|
|
530
|
-
|
|
531
|
+
The R² score as a float. The best possible score is 1.0, and the score
|
|
532
|
+
can be negative because a model can perform arbitrarily worse than a
|
|
533
|
+
constant mean predictor. Fewer than two samples or non-finite data
|
|
534
|
+
returns NaN.
|
|
535
|
+
|
|
536
|
+
For a constant target, this function follows scikit-learn's default
|
|
537
|
+
finite behavior: a perfect prediction returns 1.0 and an imperfect
|
|
538
|
+
prediction returns 0.0.
|
|
539
|
+
|
|
540
|
+
Raises:
|
|
541
|
+
ValueError: If the inputs are not one-dimensional, if y_true and y_pred
|
|
542
|
+
have different shapes, or if sample_weights does not have the same
|
|
543
|
+
one-dimensional shape as y_true.
|
|
531
544
|
|
|
532
545
|
Example:
|
|
533
546
|
Basic usage with energy load data
|
|
@@ -552,10 +565,58 @@ def r2(
|
|
|
552
565
|
>>> isinstance(score, float)
|
|
553
566
|
True
|
|
554
567
|
"""
|
|
555
|
-
|
|
556
|
-
|
|
568
|
+
y_true = np.asarray(y_true, dtype=float)
|
|
569
|
+
y_pred = np.asarray(y_pred, dtype=float)
|
|
570
|
+
|
|
571
|
+
# Structural contract violations should fail loudly. In particular,
|
|
572
|
+
# rejecting dimensions explicitly prevents unintended NumPy broadcasting.
|
|
573
|
+
if y_true.ndim != 1 or y_pred.ndim != 1:
|
|
574
|
+
error_msg = f"y_true and y_pred must be one-dimensional; got shapes {y_true.shape} and {y_pred.shape}"
|
|
575
|
+
raise ValueError(error_msg)
|
|
557
576
|
|
|
558
|
-
|
|
577
|
+
if y_true.shape != y_pred.shape:
|
|
578
|
+
error_msg = f"y_true and y_pred must have the same shape; got {y_true.shape} and {y_pred.shape}"
|
|
579
|
+
raise ValueError(error_msg)
|
|
580
|
+
|
|
581
|
+
if sample_weights is None:
|
|
582
|
+
weights = np.ones_like(y_true)
|
|
583
|
+
else:
|
|
584
|
+
weights = np.asarray(sample_weights, dtype=float)
|
|
585
|
+
|
|
586
|
+
if weights.ndim != 1 or weights.shape != y_true.shape:
|
|
587
|
+
error_msg = (
|
|
588
|
+
f"sample_weights must be one-dimensional and have the same "
|
|
589
|
+
f"shape as y_true; got {weights.shape} and {y_true.shape}"
|
|
590
|
+
)
|
|
591
|
+
raise ValueError(error_msg)
|
|
592
|
+
|
|
593
|
+
# R² is statistically undefined with fewer than two observations.
|
|
594
|
+
if y_true.size < 2: # noqa: PLR2004 (hardcoded constant is too trivial to warrant a named constant)
|
|
595
|
+
return float("nan")
|
|
596
|
+
|
|
597
|
+
# Non-finite values represent unusable metric data rather than a structural
|
|
598
|
+
# programming error. Propagate that condition as an undefined metric.
|
|
599
|
+
if not (np.all(np.isfinite(y_true)) and np.all(np.isfinite(y_pred)) and np.all(np.isfinite(weights))):
|
|
600
|
+
return float("nan")
|
|
601
|
+
|
|
602
|
+
weight_sum = float(np.sum(weights))
|
|
603
|
+
if not np.isfinite(weight_sum) or weight_sum == 0.0:
|
|
604
|
+
return float("nan")
|
|
605
|
+
|
|
606
|
+
weighted_mean = float(np.average(y_true, weights=weights))
|
|
607
|
+
residual_sum = float(np.sum(weights * (y_true - y_pred) ** 2))
|
|
608
|
+
total_sum = float(np.sum(weights * (y_true - weighted_mean) ** 2))
|
|
609
|
+
|
|
610
|
+
if not np.isfinite(residual_sum) or not np.isfinite(total_sum):
|
|
611
|
+
return float("nan")
|
|
612
|
+
|
|
613
|
+
# Match scikit-learn's default force_finite=True behavior for a constant
|
|
614
|
+
# target: perfect predictions score 1.0, otherwise the score is 0.0.
|
|
615
|
+
if total_sum == 0.0:
|
|
616
|
+
return 1.0 if residual_sum == 0.0 else 0.0
|
|
617
|
+
|
|
618
|
+
score = 1.0 - residual_sum / total_sum
|
|
619
|
+
return float(score) if np.isfinite(score) else float("nan")
|
|
559
620
|
|
|
560
621
|
|
|
561
622
|
def pinball_loss(
|