openstef 3.4.77__tar.gz → 3.4.78__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.
Files changed (117) hide show
  1. {openstef-3.4.77 → openstef-3.4.78}/PKG-INFO +1 -1
  2. {openstef-3.4.77 → openstef-3.4.78}/openstef/data_classes/prediction_job.py +4 -0
  3. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/serializer.py +23 -7
  4. {openstef-3.4.77 → openstef-3.4.78}/openstef/pipeline/create_forecast.py +1 -2
  5. {openstef-3.4.77 → openstef-3.4.78}/openstef/pipeline/train_model.py +4 -1
  6. {openstef-3.4.77 → openstef-3.4.78}/openstef.egg-info/PKG-INFO +1 -1
  7. {openstef-3.4.77 → openstef-3.4.78}/setup.py +1 -1
  8. {openstef-3.4.77 → openstef-3.4.78}/LICENSE +0 -0
  9. {openstef-3.4.77 → openstef-3.4.78}/README.md +0 -0
  10. {openstef-3.4.77 → openstef-3.4.78}/openstef/__init__.py +0 -0
  11. {openstef-3.4.77 → openstef-3.4.78}/openstef/__main__.py +0 -0
  12. {openstef-3.4.77 → openstef-3.4.78}/openstef/app_settings.py +0 -0
  13. {openstef-3.4.77 → openstef-3.4.78}/openstef/data/NL_terrestrial_radiation.csv +0 -0
  14. {openstef-3.4.77 → openstef-3.4.78}/openstef/data/NL_terrestrial_radiation.csv.license +0 -0
  15. {openstef-3.4.77 → openstef-3.4.78}/openstef/data/dazls_model_3.4.24/dazls_stored_3.4.24_baseline_model.z +0 -0
  16. {openstef-3.4.77 → openstef-3.4.78}/openstef/data/dazls_model_3.4.24/dazls_stored_3.4.24_baseline_model.z.license +0 -0
  17. {openstef-3.4.77 → openstef-3.4.78}/openstef/data/dazls_model_3.4.24/dazls_stored_3.4.24_model_card.md +0 -0
  18. {openstef-3.4.77 → openstef-3.4.78}/openstef/data/dazls_model_3.4.24/dazls_stored_3.4.24_model_card.md.license +0 -0
  19. {openstef-3.4.77 → openstef-3.4.78}/openstef/data/dutch_holidays.csv +0 -0
  20. {openstef-3.4.77 → openstef-3.4.78}/openstef/data/dutch_holidays.csv.license +0 -0
  21. {openstef-3.4.77 → openstef-3.4.78}/openstef/data/pv_single_coefs.csv +0 -0
  22. {openstef-3.4.77 → openstef-3.4.78}/openstef/data/pv_single_coefs.csv.license +0 -0
  23. {openstef-3.4.77 → openstef-3.4.78}/openstef/data_classes/__init__.py +0 -0
  24. {openstef-3.4.77 → openstef-3.4.78}/openstef/data_classes/data_prep.py +0 -0
  25. {openstef-3.4.77 → openstef-3.4.78}/openstef/data_classes/model_specifications.py +0 -0
  26. {openstef-3.4.77 → openstef-3.4.78}/openstef/data_classes/split_function.py +0 -0
  27. {openstef-3.4.77 → openstef-3.4.78}/openstef/enums.py +0 -0
  28. {openstef-3.4.77 → openstef-3.4.78}/openstef/exceptions.py +0 -0
  29. {openstef-3.4.77 → openstef-3.4.78}/openstef/feature_engineering/__init__.py +0 -0
  30. {openstef-3.4.77 → openstef-3.4.78}/openstef/feature_engineering/apply_features.py +0 -0
  31. {openstef-3.4.77 → openstef-3.4.78}/openstef/feature_engineering/bidding_zone_to_country_mapping.py +0 -0
  32. {openstef-3.4.77 → openstef-3.4.78}/openstef/feature_engineering/cyclic_features.py +0 -0
  33. {openstef-3.4.77 → openstef-3.4.78}/openstef/feature_engineering/data_preparation.py +0 -0
  34. {openstef-3.4.77 → openstef-3.4.78}/openstef/feature_engineering/feature_adder.py +0 -0
  35. {openstef-3.4.77 → openstef-3.4.78}/openstef/feature_engineering/feature_applicator.py +0 -0
  36. {openstef-3.4.77 → openstef-3.4.78}/openstef/feature_engineering/general.py +0 -0
  37. {openstef-3.4.77 → openstef-3.4.78}/openstef/feature_engineering/holiday_features.py +0 -0
  38. {openstef-3.4.77 → openstef-3.4.78}/openstef/feature_engineering/lag_features.py +0 -0
  39. {openstef-3.4.77 → openstef-3.4.78}/openstef/feature_engineering/missing_values_transformer.py +0 -0
  40. {openstef-3.4.77 → openstef-3.4.78}/openstef/feature_engineering/rolling_features.py +0 -0
  41. {openstef-3.4.77 → openstef-3.4.78}/openstef/feature_engineering/weather_features.py +0 -0
  42. {openstef-3.4.77 → openstef-3.4.78}/openstef/logging/__init__.py +0 -0
  43. {openstef-3.4.77 → openstef-3.4.78}/openstef/logging/base_logger.py +0 -0
  44. {openstef-3.4.77 → openstef-3.4.78}/openstef/logging/logger_factory.py +0 -0
  45. {openstef-3.4.77 → openstef-3.4.78}/openstef/logging/logger_types.py +0 -0
  46. {openstef-3.4.77 → openstef-3.4.78}/openstef/logging/standard_logger.py +0 -0
  47. {openstef-3.4.77 → openstef-3.4.78}/openstef/logging/structlog_logger.py +0 -0
  48. {openstef-3.4.77 → openstef-3.4.78}/openstef/metrics/__init__.py +0 -0
  49. {openstef-3.4.77 → openstef-3.4.78}/openstef/metrics/figure.py +0 -0
  50. {openstef-3.4.77 → openstef-3.4.78}/openstef/metrics/metrics.py +0 -0
  51. {openstef-3.4.77 → openstef-3.4.78}/openstef/metrics/reporter.py +0 -0
  52. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/__init__.py +0 -0
  53. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/basecase.py +0 -0
  54. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/confidence_interval_applicator.py +0 -0
  55. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/fallback.py +0 -0
  56. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/metamodels/__init__.py +0 -0
  57. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/metamodels/feature_clipper.py +0 -0
  58. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/metamodels/grouped_regressor.py +0 -0
  59. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/metamodels/missing_values_handler.py +0 -0
  60. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/model_creator.py +0 -0
  61. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/objective.py +0 -0
  62. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/objective_creator.py +0 -0
  63. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/regressors/__init__.py +0 -0
  64. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/regressors/arima.py +0 -0
  65. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/regressors/custom_regressor.py +0 -0
  66. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/regressors/dazls.py +0 -0
  67. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/regressors/flatliner.py +0 -0
  68. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/regressors/gblinear_quantile.py +0 -0
  69. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/regressors/lgbm.py +0 -0
  70. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/regressors/linear.py +0 -0
  71. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/regressors/linear_quantile.py +0 -0
  72. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/regressors/median.py +0 -0
  73. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/regressors/regressor.py +0 -0
  74. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/regressors/xgb.py +0 -0
  75. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/regressors/xgb_multioutput_quantile.py +0 -0
  76. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/regressors/xgb_quantile.py +0 -0
  77. {openstef-3.4.77 → openstef-3.4.78}/openstef/model/standard_deviation_generator.py +0 -0
  78. {openstef-3.4.77 → openstef-3.4.78}/openstef/model_selection/__init__.py +0 -0
  79. {openstef-3.4.77 → openstef-3.4.78}/openstef/model_selection/model_selection.py +0 -0
  80. {openstef-3.4.77 → openstef-3.4.78}/openstef/monitoring/__init__.py +0 -0
  81. {openstef-3.4.77 → openstef-3.4.78}/openstef/monitoring/performance_meter.py +0 -0
  82. {openstef-3.4.77 → openstef-3.4.78}/openstef/monitoring/teams.py +0 -0
  83. {openstef-3.4.77 → openstef-3.4.78}/openstef/pipeline/__init__.py +0 -0
  84. {openstef-3.4.77 → openstef-3.4.78}/openstef/pipeline/create_basecase_forecast.py +0 -0
  85. {openstef-3.4.77 → openstef-3.4.78}/openstef/pipeline/create_component_forecast.py +0 -0
  86. {openstef-3.4.77 → openstef-3.4.78}/openstef/pipeline/optimize_hyperparameters.py +0 -0
  87. {openstef-3.4.77 → openstef-3.4.78}/openstef/pipeline/train_create_forecast_backtest.py +0 -0
  88. {openstef-3.4.77 → openstef-3.4.78}/openstef/pipeline/utils.py +0 -0
  89. {openstef-3.4.77 → openstef-3.4.78}/openstef/plotting/__init__.py +0 -0
  90. {openstef-3.4.77 → openstef-3.4.78}/openstef/plotting/load_forecast_plotter.py +0 -0
  91. {openstef-3.4.77 → openstef-3.4.78}/openstef/postprocessing/__init__.py +0 -0
  92. {openstef-3.4.77 → openstef-3.4.78}/openstef/postprocessing/postprocessing.py +0 -0
  93. {openstef-3.4.77 → openstef-3.4.78}/openstef/preprocessing/__init__.py +0 -0
  94. {openstef-3.4.77 → openstef-3.4.78}/openstef/preprocessing/preprocessing.py +0 -0
  95. {openstef-3.4.77 → openstef-3.4.78}/openstef/settings.py +0 -0
  96. {openstef-3.4.77 → openstef-3.4.78}/openstef/tasks/__init__.py +0 -0
  97. {openstef-3.4.77 → openstef-3.4.78}/openstef/tasks/calculate_kpi.py +0 -0
  98. {openstef-3.4.77 → openstef-3.4.78}/openstef/tasks/create_basecase_forecast.py +0 -0
  99. {openstef-3.4.77 → openstef-3.4.78}/openstef/tasks/create_components_forecast.py +0 -0
  100. {openstef-3.4.77 → openstef-3.4.78}/openstef/tasks/create_forecast.py +0 -0
  101. {openstef-3.4.77 → openstef-3.4.78}/openstef/tasks/create_solar_forecast.py +0 -0
  102. {openstef-3.4.77 → openstef-3.4.78}/openstef/tasks/create_wind_forecast.py +0 -0
  103. {openstef-3.4.77 → openstef-3.4.78}/openstef/tasks/optimize_hyperparameters.py +0 -0
  104. {openstef-3.4.77 → openstef-3.4.78}/openstef/tasks/split_forecast.py +0 -0
  105. {openstef-3.4.77 → openstef-3.4.78}/openstef/tasks/train_model.py +0 -0
  106. {openstef-3.4.77 → openstef-3.4.78}/openstef/tasks/utils/__init__.py +0 -0
  107. {openstef-3.4.77 → openstef-3.4.78}/openstef/tasks/utils/dependencies.py +0 -0
  108. {openstef-3.4.77 → openstef-3.4.78}/openstef/tasks/utils/predictionjobloop.py +0 -0
  109. {openstef-3.4.77 → openstef-3.4.78}/openstef/tasks/utils/taskcontext.py +0 -0
  110. {openstef-3.4.77 → openstef-3.4.78}/openstef/validation/__init__.py +0 -0
  111. {openstef-3.4.77 → openstef-3.4.78}/openstef/validation/validation.py +0 -0
  112. {openstef-3.4.77 → openstef-3.4.78}/openstef.egg-info/SOURCES.txt +0 -0
  113. {openstef-3.4.77 → openstef-3.4.78}/openstef.egg-info/dependency_links.txt +0 -0
  114. {openstef-3.4.77 → openstef-3.4.78}/openstef.egg-info/requires.txt +0 -0
  115. {openstef-3.4.77 → openstef-3.4.78}/openstef.egg-info/top_level.txt +0 -0
  116. {openstef-3.4.77 → openstef-3.4.78}/pyproject.toml +0 -0
  117. {openstef-3.4.77 → openstef-3.4.78}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openstef
3
- Version: 3.4.77
3
+ Version: 3.4.78
4
4
  Summary: Open short term energy forecaster
5
5
  Home-page: https://github.com/OpenSTEF/openstef
6
6
  Author: Alliander N.V
@@ -140,6 +140,10 @@ class PredictionJobDataClass(BaseModel):
140
140
  data_prep_class: Optional[DataPrepDataClass] = Field(
141
141
  None, description="The import string for the custom data prep class"
142
142
  )
143
+ model_run_id: Optional[str] = Field(
144
+ None,
145
+ description="The specific model run number that should be used for the forecast. If not set, the latest model run will be used.",
146
+ )
143
147
 
144
148
  fallback_strategy: Optional[FallbackStrategy] = Field(
145
149
  FallbackStrategy.EXTREME_DAY,
@@ -18,6 +18,7 @@ from mlflow.store.artifact.artifact_repository_registry import get_artifact_repo
18
18
  from xgboost import XGBModel # Temporary for backward compatibility
19
19
 
20
20
  from openstef.data_classes.model_specifications import ModelSpecificationDataClass
21
+ from openstef.data_classes.prediction_job import PredictionJobDataClass
21
22
  from openstef.logging.logger_factory import get_logger
22
23
  from openstef.metrics.reporter import Report
23
24
  from openstef.model.regressors.regressor import OpenstfRegressor
@@ -143,20 +144,30 @@ class MLflowSerializer:
143
144
  def load_model(
144
145
  self,
145
146
  experiment_name: str,
147
+ model_run_id: Optional[str] = None,
146
148
  ) -> tuple[OpenstfRegressor, ModelSpecificationDataClass]:
147
- """Load sklearn compatible model from MLFlow.
149
+ """ Load an sklearn-compatible model from MLflow.
148
150
 
151
+ This method retrieves a trained model and its specifications from MLflow
152
+ based on the provided PredictionJobDataClass instance. It supports loading
153
+ a specific model run if a run number is provided.
154
+
149
155
  Args:
150
- experiment_name: Name of the experiment, often the id of the predition job.
156
+ experiment_name (str): Name of the experiment, often the id of the predition job.
157
+ model_run_id (Optional[str]): The specific model run number that should be used for the forecast.
158
+
159
+ Returns:
160
+ tuple[OpenstfRegressor, ModelSpecificationDataClass]: A tuple containing
161
+ the loaded model and its specifications.
151
162
 
152
- Raises:
153
- LookupError: If model is not found in MLflow.
163
+ LookupError: If the model is not found in MLflow or if an error occurs
164
+ during the loading process.
154
165
 
155
166
  """
156
167
  try:
157
168
  models_df = self._find_models(
158
- self.experiment_name_prefix + experiment_name, max_results=1
159
- ) # return the latest finished run of the model
169
+ self.experiment_name_prefix + experiment_name, max_results=1, model_run_id=model_run_id)
170
+ # return the latest finished run of the model
160
171
  if not models_df.empty:
161
172
  latest_run = models_df.iloc[0] # Use .iloc[0] to only get latest run
162
173
  else:
@@ -172,7 +183,7 @@ class MLflowSerializer:
172
183
  ) # Path without file:///
173
184
  self.logger.info("Model successfully loaded with MLflow")
174
185
  return loaded_model, model_specs
175
- except (AttributeError, MlflowException, OSError) as exception:
186
+ except (AttributeError, MlflowException, OSError) as exception:
176
187
  raise LookupError("Model not found. First train a model!") from exception
177
188
 
178
189
  def get_model_age(
@@ -205,8 +216,13 @@ class MLflowSerializer:
205
216
  experiment_name: str,
206
217
  max_results: Optional[int] = 100,
207
218
  filter_string: str = "attribute.status = 'FINISHED'",
219
+ model_run_id: Optional[int] = None,
208
220
  ) -> pd.DataFrame:
209
221
  """Finds trained models for specific experiment_name sorted by age in descending order."""
222
+
223
+ if model_run_id is not None:
224
+ filter_string += f" AND attributes.run_id = '{model_run_id}'"
225
+
210
226
  models_df = mlflow.search_runs(
211
227
  experiment_names=[experiment_name],
212
228
  max_results=max_results,
@@ -52,11 +52,10 @@ def create_forecast_pipeline(
52
52
  # Use the alternative forecast model if it's specify in the pj
53
53
  if pj.alternative_forecast_model_pid:
54
54
  prediction_model_pid = pj.alternative_forecast_model_pid
55
-
56
55
  # Load most recent model for the given pid
57
56
  model, model_specs = MLflowSerializer(
58
57
  mlflow_tracking_uri=mlflow_tracking_uri
59
- ).load_model(experiment_name=str(prediction_model_pid))
58
+ ).load_model(experiment_name=str(prediction_model_pid), model_run_id=pj.get("model_run_id"))
60
59
  return create_forecast_pipeline_core(pj, input_data, model, model_specs)
61
60
 
62
61
 
@@ -52,6 +52,7 @@ def train_model_pipeline(
52
52
  check_old_model_age: Check if training should be skipped because the model is too young
53
53
  mlflow_tracking_uri: Tracking URI for MLFlow
54
54
  artifact_folder: Path where artifacts, such as trained models, are stored
55
+ ignore_existing_models: If True, a new model is trained as if no old model exists.
55
56
 
56
57
  Returns:
57
58
  If pj.save_train_forecasts is False, None is returned
@@ -168,6 +169,7 @@ def train_model_pipeline_core(
168
169
  input_data: Input data
169
170
  old_model: Old model to compare to. Defaults to None.
170
171
  horizons: Horizons to train on in hours, relevant for feature engineering.
172
+ ignore_existing_models: If True, all existing models, including, hyperparameters are ignored and defsault values are used.
171
173
 
172
174
  Raises:
173
175
  InputDataInsufficientError: when input data is insufficient.
@@ -319,8 +321,9 @@ def train_pipeline_step_load_model(
319
321
  old_model: Optional[OpenstfRegressor]
320
322
 
321
323
  if not ignore_existing_models:
324
+ model_run_id = pj.get("model_run_id", None)
322
325
  try:
323
- old_model, model_specs = serializer.load_model(experiment_name=str(pj.id))
326
+ old_model, model_specs = serializer.load_model(str(pj.id), model_run_id=model_run_id)
324
327
  old_model_age = old_model.age # Age attribute is openstef specific
325
328
  return old_model, model_specs, old_model_age
326
329
  except (AttributeError, FileNotFoundError, LookupError):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openstef
3
- Version: 3.4.77
3
+ Version: 3.4.78
4
4
  Summary: Open short term energy forecaster
5
5
  Home-page: https://github.com/OpenSTEF/openstef
6
6
  Author: Alliander N.V
@@ -33,7 +33,7 @@ def read_long_description_from_readme():
33
33
 
34
34
  setup(
35
35
  name="openstef",
36
- version="3.4.77",
36
+ version="3.4.78",
37
37
  packages=find_packages(include=["openstef", "openstef.*"]),
38
38
  description="Open short term energy forecaster",
39
39
  long_description=read_long_description_from_readme(),
File without changes
File without changes
File without changes
File without changes
File without changes