openstef 3.4.66__py3-none-any.whl → 3.4.68__py3-none-any.whl

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 (46) hide show
  1. openstef/app_settings.py +7 -0
  2. openstef/feature_engineering/apply_features.py +8 -9
  3. openstef/feature_engineering/cyclic_features.py +2 -11
  4. openstef/feature_engineering/data_preparation.py +2 -9
  5. openstef/feature_engineering/general.py +3 -15
  6. openstef/feature_engineering/missing_values_transformer.py +1 -1
  7. openstef/feature_engineering/rolling_features.py +1 -1
  8. openstef/feature_engineering/weather_features.py +7 -12
  9. openstef/logging/__init__.py +3 -0
  10. openstef/logging/base_logger.py +34 -0
  11. openstef/logging/logger_factory.py +17 -0
  12. openstef/logging/logger_types.py +10 -0
  13. openstef/logging/standard_logger.py +33 -0
  14. openstef/logging/structlog_logger.py +38 -0
  15. openstef/metrics/reporter.py +2 -9
  16. openstef/model/confidence_interval_applicator.py +2 -9
  17. openstef/model/fallback.py +1 -1
  18. openstef/model/metamodels/feature_clipper.py +3 -2
  19. openstef/model/model_creator.py +4 -12
  20. openstef/model/objective_creator.py +1 -1
  21. openstef/model/regressors/gblinear_quantile.py +2 -2
  22. openstef/model/regressors/linear_quantile.py +1 -1
  23. openstef/model/regressors/xgb.py +0 -1
  24. openstef/model/serializer.py +3 -8
  25. openstef/monitoring/teams.py +2 -8
  26. openstef/pipeline/create_basecase_forecast.py +2 -10
  27. openstef/pipeline/create_component_forecast.py +2 -10
  28. openstef/pipeline/create_forecast.py +2 -9
  29. openstef/pipeline/optimize_hyperparameters.py +2 -9
  30. openstef/pipeline/train_model.py +4 -11
  31. openstef/plotting/load_forecast_plotter.py +3 -3
  32. openstef/postprocessing/postprocessing.py +2 -9
  33. openstef/tasks/calculate_kpi.py +3 -10
  34. openstef/tasks/create_basecase_forecast.py +1 -1
  35. openstef/tasks/create_components_forecast.py +3 -10
  36. openstef/tasks/create_forecast.py +1 -1
  37. openstef/tasks/create_solar_forecast.py +1 -1
  38. openstef/tasks/optimize_hyperparameters.py +1 -1
  39. openstef/tasks/split_forecast.py +3 -10
  40. openstef/tasks/utils/taskcontext.py +2 -10
  41. openstef/validation/validation.py +6 -28
  42. {openstef-3.4.66.dist-info → openstef-3.4.68.dist-info}/METADATA +3 -2
  43. {openstef-3.4.66.dist-info → openstef-3.4.68.dist-info}/RECORD +46 -40
  44. {openstef-3.4.66.dist-info → openstef-3.4.68.dist-info}/WHEEL +1 -1
  45. {openstef-3.4.66.dist-info → openstef-3.4.68.dist-info/licenses}/LICENSE +0 -0
  46. {openstef-3.4.66.dist-info → openstef-3.4.68.dist-info}/top_level.txt +0 -0
openstef/app_settings.py CHANGED
@@ -5,6 +5,8 @@
5
5
  from pydantic import Field
6
6
  from pydantic_settings import BaseSettings, SettingsConfigDict
7
7
 
8
+ from openstef.logging.logger_factory import LoggerType
9
+
8
10
 
9
11
  class AppSettings(BaseSettings):
10
12
  """Global app settings."""
@@ -13,6 +15,11 @@ class AppSettings(BaseSettings):
13
15
  env_prefix="openstef_", env_file=".env", extra="ignore"
14
16
  )
15
17
 
18
+ logger_type: LoggerType = Field(
19
+ LoggerType.STRUCTLOG,
20
+ description="The type of logger to use.",
21
+ )
22
+
16
23
  post_teams_messages: bool = True
17
24
 
18
25
  # Logging settings.
@@ -15,13 +15,18 @@ import pandas as pd
15
15
 
16
16
  from openstef.data_classes.prediction_job import PredictionJobDataClass
17
17
  from openstef.enums import BiddingZone
18
+ from openstef.feature_engineering.bidding_zone_to_country_mapping import (
19
+ BIDDING_ZONE_TO_COUNTRY_CODE_MAPPING,
20
+ )
21
+ from openstef.feature_engineering.cyclic_features import (
22
+ add_daylight_terrestrial_feature,
23
+ add_seasonal_cyclic_features,
24
+ add_time_cyclic_features,
25
+ )
18
26
  from openstef.feature_engineering.holiday_features import (
19
27
  generate_holiday_feature_functions,
20
28
  )
21
29
  from openstef.feature_engineering.lag_features import generate_lag_feature_functions
22
- from openstef.feature_engineering.bidding_zone_to_country_mapping import (
23
- BIDDING_ZONE_TO_COUNTRY_CODE_MAPPING,
24
- )
25
30
  from openstef.feature_engineering.rolling_features import add_rolling_aggregate_features
26
31
  from openstef.feature_engineering.weather_features import (
27
32
  add_additional_solar_features,
@@ -29,12 +34,6 @@ from openstef.feature_engineering.weather_features import (
29
34
  add_humidity_features,
30
35
  )
31
36
 
32
- from openstef.feature_engineering.cyclic_features import (
33
- add_seasonal_cyclic_features,
34
- add_time_cyclic_features,
35
- add_daylight_terrestrial_feature,
36
- )
37
-
38
37
 
39
38
  def apply_features(
40
39
  data: pd.DataFrame,
@@ -9,19 +9,10 @@
9
9
  import numpy as np
10
10
  import pandas as pd
11
11
 
12
- import structlog
13
- import logging
14
-
15
- from openstef.settings import Settings
16
12
  from openstef import PROJECT_ROOT
13
+ from openstef.logging.logger_factory import get_logger
17
14
 
18
-
19
- structlog.configure(
20
- wrapper_class=structlog.make_filtering_bound_logger(
21
- logging.getLevelName(Settings.log_level)
22
- )
23
- )
24
- logger = structlog.get_logger(__name__)
15
+ logger = get_logger(__name__)
25
16
 
26
17
  TERRESTRIAL_RADIATION_CSV_PATH: str = (
27
18
  PROJECT_ROOT / "openstef" / "data" / "NL_terrestrial_radiation.csv"
@@ -1,13 +1,11 @@
1
1
  # SPDX-FileCopyrightText: 2017-2023 Alliander N.V. <korte.termijn.prognoses@alliander.com> # noqa E501>
2
2
  #
3
3
  # SPDX-License-Identifier: MPL-2.0
4
- import logging
5
4
  from abc import ABC, abstractmethod
6
5
  from datetime import timedelta
7
6
  from typing import Optional
8
7
 
9
8
  import pandas as pd
10
- import structlog
11
9
 
12
10
  from openstef.data_classes.model_specifications import ModelSpecificationDataClass
13
11
  from openstef.data_classes.prediction_job import PredictionJobDataClass
@@ -19,9 +17,9 @@ from openstef.feature_engineering.general import (
19
17
  enforce_feature_order,
20
18
  remove_non_requested_feature_columns,
21
19
  )
20
+ from openstef.logging.logger_factory import get_logger
22
21
  from openstef.model.regressors.regressor import OpenstfRegressor
23
22
  from openstef.pipeline.utils import generate_forecast_datetime_range
24
- from openstef.settings import Settings
25
23
 
26
24
 
27
25
  class AbstractDataPreparation(ABC):
@@ -122,12 +120,7 @@ class ARDataPreparation(AbstractDataPreparation):
122
120
  def prepare_forecast_data(
123
121
  self, data: pd.DataFrame
124
122
  ) -> tuple[pd.DataFrame, pd.DataFrame]:
125
- structlog.configure(
126
- wrapper_class=structlog.make_filtering_bound_logger(
127
- logging.getLevelName(Settings.log_level)
128
- )
129
- )
130
- logger = structlog.get_logger(__name__)
123
+ logger = get_logger(__name__)
131
124
  self.check_model()
132
125
  # Prep forecast input by selecting only the forecast datetime interval (this is much smaller than the input range)
133
126
  # Also drop the load column
@@ -3,12 +3,10 @@
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  """This modelu contains various helper functions."""
5
5
 
6
- import logging
7
-
8
6
  import numpy as np
9
7
  import pandas as pd
10
- import structlog
11
8
 
9
+ from openstef.logging.logger_factory import get_logger
12
10
  from openstef.settings import Settings
13
11
 
14
12
 
@@ -34,12 +32,7 @@ def add_missing_feature_columns(
34
32
  Input dataframe with missing columns filled with ``np.N=nan``.
35
33
 
36
34
  """
37
- structlog.configure(
38
- wrapper_class=structlog.make_filtering_bound_logger(
39
- logging.getLevelName(Settings.log_level)
40
- )
41
- )
42
- logger = structlog.get_logger(__name__)
35
+ logger = get_logger(__name__)
43
36
 
44
37
  if features is None:
45
38
  features = []
@@ -70,12 +63,7 @@ def remove_non_requested_feature_columns(
70
63
  Model input data with features.
71
64
 
72
65
  """
73
- structlog.configure(
74
- wrapper_class=structlog.make_filtering_bound_logger(
75
- logging.getLevelName(Settings.log_level)
76
- )
77
- )
78
- logger = structlog.get_logger(__name__)
66
+ logger = get_logger(__name__)
79
67
 
80
68
  if requested_features is None:
81
69
  requested_features = []
@@ -1,7 +1,7 @@
1
1
  # SPDX-FileCopyrightText: 2017-2023 Contributors to the OpenSTEF project <korte.termijn.prognoses@alliander.com> # noqa E501>
2
2
  #
3
3
  # SPDX-License-Identifier: MPL-2.0
4
- from typing import Union, List, Optional
4
+ from typing import List, Optional, Union
5
5
 
6
6
  import numpy as np
7
7
  import pandas as pd
@@ -4,9 +4,9 @@
4
4
  from datetime import timedelta
5
5
 
6
6
  import pandas as pd
7
+ from pydantic import TypeAdapter
7
8
 
8
9
  from openstef.data_classes.prediction_job import PredictionJobDataClass
9
- from pydantic import TypeAdapter
10
10
 
11
11
 
12
12
  def convert_timedelta_to_isoformat(td: timedelta) -> str:
@@ -3,24 +3,17 @@
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
 
5
5
  """This module contains all wheather related functions used for feature engineering."""
6
- import logging
7
6
  from typing import Union
8
7
 
9
8
  import numpy as np
10
9
  import pandas as pd
11
10
  import pvlib
12
- import structlog
13
11
  from pvlib.location import Location
14
12
 
15
13
  from openstef.data_classes.prediction_job import PredictionJobDataClass
16
- from openstef.settings import Settings
14
+ from openstef.logging.logger_factory import get_logger
17
15
 
18
- structlog.configure(
19
- wrapper_class=structlog.make_filtering_bound_logger(
20
- logging.getLevelName(Settings.log_level)
21
- )
22
- )
23
- logger = structlog.get_logger(__name__)
16
+ logger = get_logger(__name__)
24
17
 
25
18
 
26
19
  # Set some (nameless) constants for the Antoine equation:
@@ -353,8 +346,11 @@ def add_additional_wind_features(
353
346
  for x in feature_names
354
347
  )
355
348
 
356
- # Add add_additional_wind_features
357
- if "windspeed" in data.columns and additional_wind_features:
349
+ if (
350
+ "windspeed_100m" not in data.columns
351
+ and "windspeed" in data.columns
352
+ and additional_wind_features
353
+ ):
358
354
  data["windspeed_100mExtrapolated"] = calculate_windspeed_at_hubheight(
359
355
  data["windspeed"]
360
356
  )
@@ -363,7 +359,6 @@ def add_additional_wind_features(
363
359
  data["windspeed_100mExtrapolated"]
364
360
  )
365
361
 
366
- # Do extra check
367
362
  if "windspeed_100m" in data.columns and additional_wind_features:
368
363
  data["windpowerFit_harm_arome"] = calculate_windturbine_power_output(
369
364
  data["windspeed_100m"].astype(float)
@@ -0,0 +1,3 @@
1
+ # SPDX-FileCopyrightText: 2017-2025 Contributors to the OpenSTEF project <korte.termijn.prognoses@alliander.com> # noqa E501>
2
+ #
3
+ # SPDX-License-Identifier: MPL-2.0
@@ -0,0 +1,34 @@
1
+ # SPDX-FileCopyrightText: 2017-2025 Contributors to the OpenSTEF project <korte.termijn.prognoses@alliander.com> # noqa E501>
2
+ #
3
+ # SPDX-License-Identifier: MPL-2.0
4
+
5
+ from abc import ABC, abstractmethod
6
+ from typing import Any
7
+
8
+
9
+ class BaseLogger(ABC):
10
+ """Abstract Base Logger Interface"""
11
+
12
+ @abstractmethod
13
+ def debug(self, message: str, **kwargs: Any) -> None:
14
+ pass
15
+
16
+ @abstractmethod
17
+ def info(self, message: str, **kwargs: Any) -> None:
18
+ pass
19
+
20
+ @abstractmethod
21
+ def warning(self, message: str, **kwargs: Any) -> None:
22
+ pass
23
+
24
+ @abstractmethod
25
+ def error(self, message: str, **kwargs: Any) -> None:
26
+ pass
27
+
28
+ @abstractmethod
29
+ def exception(self, message: str, **kwargs: Any) -> None:
30
+ pass
31
+
32
+ @abstractmethod
33
+ def bind(self, **kwargs: Any) -> "BaseLogger":
34
+ pass
@@ -0,0 +1,17 @@
1
+ # SPDX-FileCopyrightText: 2017-2025 Contributors to the OpenSTEF project <korte.termijn.prognoses@alliander.com> # noqa E501>
2
+ #
3
+ # SPDX-License-Identifier: MPL-2.0
4
+
5
+ from openstef.logging.logger_types import LoggerType
6
+ from openstef.logging.standard_logger import StandardLogger
7
+ from openstef.logging.structlog_logger import StructlogLogger
8
+ from openstef.settings import Settings
9
+
10
+
11
+ def get_logger(name: str, logger_type: str = Settings.logger_type):
12
+ if logger_type == LoggerType.STANDARD:
13
+ return StandardLogger(name)
14
+ elif logger_type == LoggerType.STRUCTLOG:
15
+ return StructlogLogger(name)
16
+ else:
17
+ raise ValueError(f"Unknown logger type: {logger_type}")
@@ -0,0 +1,10 @@
1
+ # SPDX-FileCopyrightText: 2017-2025 Contributors to the OpenSTEF project <korte.termijn.prognoses@alliander.com> # noqa E501>
2
+ #
3
+ # SPDX-License-Identifier: MPL-2.0
4
+
5
+ from enum import StrEnum
6
+
7
+
8
+ class LoggerType(StrEnum):
9
+ STANDARD = "logging"
10
+ STRUCTLOG = "structlog"
@@ -0,0 +1,33 @@
1
+ # SPDX-FileCopyrightText: 2017-2025 Contributors to the OpenSTEF project <korte.termijn.prognoses@alliander.com> # noqa E501>
2
+ #
3
+ # SPDX-License-Identifier: MPL-2.0
4
+
5
+ import logging
6
+
7
+ from openstef.logging.base_logger import BaseLogger
8
+ from openstef.settings import Settings
9
+
10
+
11
+ class StandardLogger(BaseLogger):
12
+ def __init__(self, name: str):
13
+ self.logger = logging.getLogger(name)
14
+ logging.basicConfig(level=Settings.log_level)
15
+
16
+ def debug(self, message: str, **kwargs):
17
+ self.logger.debug(message, extra=kwargs)
18
+
19
+ def info(self, message: str, **kwargs):
20
+ self.logger.info(message, extra=kwargs)
21
+
22
+ def warning(self, message: str, **kwargs):
23
+ self.logger.warning(message, extra=kwargs)
24
+
25
+ def error(self, message: str, **kwargs):
26
+ self.logger.error(message, extra=kwargs)
27
+
28
+ def exception(self, message: str, **kwargs):
29
+ self.logger.exception(message, extra=kwargs)
30
+
31
+ def bind(self, **kwargs):
32
+ """Not implemented for StandardLogger"""
33
+ return self
@@ -0,0 +1,38 @@
1
+ # SPDX-FileCopyrightText: 2017-2025 Contributors to the OpenSTEF project <korte.termijn.prognoses@alliander.com> # noqa E501>
2
+ #
3
+ # SPDX-License-Identifier: MPL-2.0
4
+
5
+ import logging
6
+
7
+ import structlog
8
+
9
+ from openstef.logging.base_logger import BaseLogger
10
+ from openstef.settings import Settings
11
+
12
+
13
+ class StructlogLogger(BaseLogger):
14
+ def __init__(self, name: str):
15
+ structlog.configure(
16
+ wrapper_class=structlog.make_filtering_bound_logger(
17
+ logging.getLevelName(Settings.log_level)
18
+ )
19
+ )
20
+ self.logger = structlog.get_logger(name)
21
+
22
+ def debug(self, message: str, **kwargs):
23
+ self.logger.debug(message, **kwargs)
24
+
25
+ def info(self, message: str, **kwargs):
26
+ self.logger.info(message, **kwargs)
27
+
28
+ def warning(self, message: str, **kwargs):
29
+ self.logger.warning(message, **kwargs)
30
+
31
+ def error(self, message: str, **kwargs):
32
+ self.logger.error(message, **kwargs)
33
+
34
+ def exception(self, message: str, **kwargs):
35
+ self.logger.exception(message, **kwargs)
36
+
37
+ def bind(self, **kwargs):
38
+ return self.logger.bind(**kwargs)
@@ -2,7 +2,6 @@
2
2
  #
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  """Defines reporter class."""
5
- import logging
6
5
  import os
7
6
  import warnings
8
7
  from dataclasses import dataclass
@@ -10,14 +9,13 @@ from dataclasses import dataclass
10
9
  import numpy as np
11
10
  import pandas as pd
12
11
  import sklearn
13
- import structlog
14
12
  from mlflow.models import ModelSignature, infer_signature
15
13
  from plotly.graph_objects import Figure
16
14
 
15
+ from openstef.logging.logger_factory import get_logger
17
16
  from openstef.metrics import figure
18
17
  from openstef.metrics.metrics import bias, mae, nsme, r_mae, rmse
19
18
  from openstef.model.regressors.regressor import OpenstfRegressor
20
- from openstef.settings import Settings
21
19
 
22
20
 
23
21
  @dataclass
@@ -169,12 +167,7 @@ class Reporter:
169
167
  def write_report_to_disk(report: Report, report_folder: str):
170
168
  """Write report to disk; e.g. for viewing report of latest models using grafana."""
171
169
  # Initialize logger and serializer
172
- structlog.configure(
173
- wrapper_class=structlog.make_filtering_bound_logger(
174
- logging.getLevelName(Settings.log_level)
175
- )
176
- )
177
- logger = structlog.get_logger(__name__)
170
+ logger = get_logger(__name__)
178
171
  if report_folder:
179
172
  # create path if does not exist
180
173
  if not os.path.exists(report_folder):
@@ -1,30 +1,23 @@
1
1
  # SPDX-FileCopyrightText: 2017-2023 Contributors to the OpenSTEF project <korte.termijn.prognoses@alliander.com> # noqa E501>
2
2
  #
3
3
  # SPDX-License-Identifier: MPL-2.0
4
- import logging
5
4
  from datetime import datetime
6
5
 
7
6
  import numpy as np
8
7
  import pandas as pd
9
- import structlog
10
8
  from scipy import stats
11
9
  from sklearn.base import RegressorMixin
12
10
 
13
11
  from openstef.data_classes.prediction_job import PredictionJobDataClass
14
12
  from openstef.exceptions import ModelWithoutStDev
15
- from openstef.settings import Settings
13
+ from openstef.logging.logger_factory import get_logger
16
14
 
17
15
 
18
16
  class ConfidenceIntervalApplicator:
19
17
  def __init__(self, model: RegressorMixin, forecast_input_data: pd.DataFrame):
20
18
  self.model = model
21
19
  self.forecast_input_data = forecast_input_data
22
- structlog.configure(
23
- wrapper_class=structlog.make_filtering_bound_logger(
24
- logging.getLevelName(Settings.log_level)
25
- )
26
- )
27
- self.logger = structlog.get_logger(self.__class__.__name__)
20
+ self.logger = get_logger(self.__class__.__name__)
28
21
 
29
22
  def add_confidence_interval(
30
23
  self,
@@ -1,7 +1,7 @@
1
1
  # SPDX-FileCopyrightText: 2017-2023 Contributors to the OpenSTEF project <korte.termijn.prognoses@alliander.com> # noqa E501>
2
2
  #
3
3
  # SPDX-License-Identifier: MPL-2.0
4
- from datetime import datetime, UTC
4
+ from datetime import UTC, datetime
5
5
 
6
6
  import pandas as pd
7
7
 
@@ -1,9 +1,10 @@
1
1
  # SPDX-FileCopyrightText: 2017-2023 Contributors to the OpenSTEF project <korte.termijn.prognoses@alliander.com> # noqa E501>
2
2
  #
3
3
  # SPDX-License-Identifier: MPL-2.0
4
- from sklearn.base import BaseEstimator, TransformerMixin
4
+ from typing import Dict, List, Optional, Tuple
5
+
5
6
  import pandas as pd
6
- from typing import List, Dict, Tuple, Optional
7
+ from sklearn.base import BaseEstimator, TransformerMixin
7
8
 
8
9
 
9
10
  class FeatureClipper(BaseEstimator, TransformerMixin):
@@ -1,33 +1,25 @@
1
1
  # SPDX-FileCopyrightText: 2017-2023 Contributors to the OpenSTEF project <korte.termijn.prognoses@alliander.com> # noqa E501>
2
2
  #
3
3
  # SPDX-License-Identifier: MPL-2.0
4
- import logging
5
4
  from typing import Union
6
5
 
7
- import structlog
8
-
9
6
  from openstef.enums import ModelType
7
+ from openstef.logging.logger_factory import get_logger
10
8
  from openstef.model.regressors.arima import ARIMAOpenstfRegressor
11
9
  from openstef.model.regressors.custom_regressor import is_custom_type, load_custom_model
10
+ from openstef.model.regressors.flatliner import FlatlinerRegressor
12
11
  from openstef.model.regressors.gblinear_quantile import GBLinearQuantileOpenstfRegressor
13
12
  from openstef.model.regressors.lgbm import LGBMOpenstfRegressor
14
13
  from openstef.model.regressors.linear import LinearOpenstfRegressor
15
14
  from openstef.model.regressors.linear_quantile import LinearQuantileOpenstfRegressor
16
15
  from openstef.model.regressors.regressor import OpenstfRegressor
17
- from openstef.model.regressors.flatliner import FlatlinerRegressor
18
16
  from openstef.model.regressors.xgb import XGBOpenstfRegressor
19
- from openstef.model.regressors.xgb_quantile import XGBQuantileOpenstfRegressor
20
17
  from openstef.model.regressors.xgb_multioutput_quantile import (
21
18
  XGBMultiOutputQuantileOpenstfRegressor,
22
19
  )
23
- from openstef.settings import Settings
20
+ from openstef.model.regressors.xgb_quantile import XGBQuantileOpenstfRegressor
24
21
 
25
- structlog.configure(
26
- wrapper_class=structlog.make_filtering_bound_logger(
27
- logging.getLevelName(Settings.log_level)
28
- )
29
- )
30
- logger = structlog.get_logger(__name__)
22
+ logger = get_logger(__name__)
31
23
 
32
24
  valid_model_kwargs = {
33
25
  ModelType.XGB: [
@@ -10,9 +10,9 @@ from openstef.model.objective import (
10
10
  LGBRegressorObjective,
11
11
  LinearRegressorObjective,
12
12
  RegressorObjective,
13
+ XGBMultioutputQuantileRegressorObjective,
13
14
  XGBQuantileRegressorObjective,
14
15
  XGBRegressorObjective,
15
- XGBMultioutputQuantileRegressorObjective,
16
16
  )
17
17
  from openstef.model.regressors.custom_regressor import (
18
18
  create_custom_objective,
@@ -3,12 +3,12 @@
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  import math
5
5
  import re
6
- from typing import Union, Optional, List
6
+ from typing import List, Optional, Union
7
7
 
8
8
  import numpy as np
9
9
  import pandas as pd
10
- from sklearn.model_selection import train_test_split
11
10
  import xgboost as xgb
11
+ from sklearn.model_selection import train_test_split
12
12
  from sklearn.preprocessing import StandardScaler
13
13
  from sklearn.utils.validation import check_is_fitted
14
14
 
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  import re
5
- from typing import Dict, Union, Set, Optional, List
5
+ from typing import Dict, List, Optional, Set, Union
6
6
 
7
7
  import numpy as np
8
8
  import pandas as pd
@@ -5,7 +5,6 @@ from typing import Optional
5
5
 
6
6
  import numpy as np
7
7
  from sklearn.base import RegressorMixin
8
-
9
8
  from xgboost import XGBRegressor
10
9
 
11
10
  from openstef.model.regressors.regressor import OpenstfRegressor
@@ -5,7 +5,7 @@ import json
5
5
  import logging
6
6
  import os
7
7
  import shutil
8
- from datetime import datetime, UTC
8
+ from datetime import UTC, datetime
9
9
  from json import JSONDecodeError
10
10
  from typing import Optional, Union
11
11
  from urllib.parse import unquote, urlparse
@@ -13,12 +13,12 @@ from urllib.parse import unquote, urlparse
13
13
  import mlflow
14
14
  import numpy as np
15
15
  import pandas as pd
16
- import structlog
17
16
  from mlflow.exceptions import MlflowException
18
17
  from mlflow.store.artifact.artifact_repository_registry import get_artifact_repository
19
18
  from xgboost import XGBModel # Temporary for backward compatibility
20
19
 
21
20
  from openstef.data_classes.model_specifications import ModelSpecificationDataClass
21
+ from openstef.logging.logger_factory import get_logger
22
22
  from openstef.metrics.reporter import Report
23
23
  from openstef.model.regressors.regressor import OpenstfRegressor
24
24
  from openstef.settings import Settings
@@ -26,12 +26,7 @@ from openstef.settings import Settings
26
26
 
27
27
  class MLflowSerializer:
28
28
  def __init__(self, mlflow_tracking_uri: str):
29
- structlog.configure(
30
- wrapper_class=structlog.make_filtering_bound_logger(
31
- logging.getLevelName(Settings.log_level)
32
- )
33
- )
34
- self.logger = structlog.get_logger(self.__class__.__name__)
29
+ self.logger = get_logger(self.__class__.__name__)
35
30
  mlflow.set_tracking_uri(mlflow_tracking_uri)
36
31
  self.logger.debug(f"MLflow tracking uri at init= {mlflow_tracking_uri}")
37
32
  self.experiment_name_prefix = (
@@ -1,14 +1,13 @@
1
1
  # SPDX-FileCopyrightText: 2017-2023 Contributors to the OpenSTEF project <korte.termijn.prognoses@alliander.com> # noqa E501>
2
2
  #
3
3
  # SPDX-License-Identifier: MPL-2.0
4
- import logging
5
4
  from typing import Union
6
5
 
7
6
  import pandas as pd
8
7
  import pymsteams
9
- import structlog
10
8
  from pymsteams import cardsection
11
9
 
10
+ from openstef.logging.logger_factory import get_logger
12
11
  from openstef.settings import Settings
13
12
 
14
13
 
@@ -44,12 +43,7 @@ def post_teams(
44
43
  if not Settings.post_teams_messages:
45
44
  return
46
45
 
47
- structlog.configure(
48
- wrapper_class=structlog.make_filtering_bound_logger(
49
- logging.getLevelName(Settings.log_level)
50
- )
51
- )
52
- logger = structlog.get_logger(__name__)
46
+ logger = get_logger(__name__)
53
47
  # If no url is passed, give warning and don't send teams message
54
48
  if url is None:
55
49
  logger.warning("Can't post Teams message, no url given.")
@@ -1,17 +1,16 @@
1
1
  # SPDX-FileCopyrightText: 2017-2023 Contributors to the OpenSTEF project <korte.termijn.prognoses@alliander.com> # noqa E501>
2
2
  #
3
3
  # SPDX-License-Identifier: MPL-2.0
4
- import logging
5
4
  from pathlib import Path
6
5
 
7
6
  import pandas as pd
8
- import structlog
9
7
 
10
8
  from openstef.data_classes.prediction_job import PredictionJobDataClass
11
9
  from openstef.exceptions import NoRealisedLoadError
12
10
  from openstef.feature_engineering.feature_applicator import (
13
11
  OperationalPredictFeatureApplicator,
14
12
  )
13
+ from openstef.logging.logger_factory import get_logger
15
14
  from openstef.model.basecase import BaseCaseModel
16
15
  from openstef.model.confidence_interval_applicator import ConfidenceIntervalApplicator
17
16
  from openstef.pipeline.utils import generate_forecast_datetime_range
@@ -19,7 +18,6 @@ from openstef.postprocessing.postprocessing import (
19
18
  add_components_base_case_forecast,
20
19
  add_prediction_job_properties_to_forecast,
21
20
  )
22
- from openstef.settings import Settings
23
21
  from openstef.validation import validation
24
22
 
25
23
  MODEL_LOCATION = Path(".")
@@ -44,13 +42,7 @@ def create_basecase_forecast_pipeline(
44
42
  NoRealisedLoadError: When no realised load for given datetime range.
45
43
 
46
44
  """
47
- structlog.configure(
48
- wrapper_class=structlog.make_filtering_bound_logger(
49
- logging.getLevelName(Settings.log_level)
50
- )
51
- )
52
- logger = structlog.get_logger(__name__)
53
-
45
+ logger = get_logger(__name__)
54
46
  logger.info("Preprocessing data for basecase forecast")
55
47
 
56
48
  forecast_start, forecast_end = generate_forecast_datetime_range(input_data)