openstef 3.4.67__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.
- openstef/app_settings.py +7 -0
- openstef/feature_engineering/apply_features.py +8 -9
- openstef/feature_engineering/cyclic_features.py +2 -11
- openstef/feature_engineering/data_preparation.py +2 -9
- openstef/feature_engineering/general.py +3 -15
- openstef/feature_engineering/missing_values_transformer.py +1 -1
- openstef/feature_engineering/rolling_features.py +1 -1
- openstef/feature_engineering/weather_features.py +2 -9
- openstef/logging/__init__.py +3 -0
- openstef/logging/base_logger.py +34 -0
- openstef/logging/logger_factory.py +17 -0
- openstef/logging/logger_types.py +10 -0
- openstef/logging/standard_logger.py +33 -0
- openstef/logging/structlog_logger.py +38 -0
- openstef/metrics/reporter.py +2 -9
- openstef/model/confidence_interval_applicator.py +2 -9
- openstef/model/fallback.py +1 -1
- openstef/model/metamodels/feature_clipper.py +3 -2
- openstef/model/model_creator.py +4 -12
- openstef/model/objective_creator.py +1 -1
- openstef/model/regressors/gblinear_quantile.py +2 -2
- openstef/model/regressors/linear_quantile.py +1 -1
- openstef/model/regressors/xgb.py +0 -1
- openstef/model/serializer.py +3 -8
- openstef/monitoring/teams.py +2 -8
- openstef/pipeline/create_basecase_forecast.py +2 -10
- openstef/pipeline/create_component_forecast.py +2 -10
- openstef/pipeline/create_forecast.py +2 -9
- openstef/pipeline/optimize_hyperparameters.py +2 -9
- openstef/pipeline/train_model.py +4 -11
- openstef/plotting/load_forecast_plotter.py +3 -3
- openstef/postprocessing/postprocessing.py +2 -9
- openstef/tasks/calculate_kpi.py +3 -10
- openstef/tasks/create_basecase_forecast.py +1 -1
- openstef/tasks/create_components_forecast.py +3 -10
- openstef/tasks/create_forecast.py +1 -1
- openstef/tasks/create_solar_forecast.py +1 -1
- openstef/tasks/optimize_hyperparameters.py +1 -1
- openstef/tasks/split_forecast.py +3 -10
- openstef/tasks/utils/taskcontext.py +2 -10
- openstef/validation/validation.py +6 -28
- {openstef-3.4.67.dist-info → openstef-3.4.68.dist-info}/METADATA +1 -1
- {openstef-3.4.67.dist-info → openstef-3.4.68.dist-info}/RECORD +46 -40
- {openstef-3.4.67.dist-info → openstef-3.4.68.dist-info}/WHEEL +0 -0
- {openstef-3.4.67.dist-info → openstef-3.4.68.dist-info}/licenses/LICENSE +0 -0
- {openstef-3.4.67.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
|
-
|
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
|
-
|
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
|
-
|
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
|
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.
|
14
|
+
from openstef.logging.logger_factory import get_logger
|
17
15
|
|
18
|
-
|
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:
|
@@ -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)
|
openstef/metrics/reporter.py
CHANGED
@@ -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
|
-
|
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.
|
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
|
-
|
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,
|
openstef/model/fallback.py
CHANGED
@@ -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
|
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
|
4
|
+
from typing import Dict, List, Optional, Tuple
|
5
|
+
|
5
6
|
import pandas as pd
|
6
|
-
from
|
7
|
+
from sklearn.base import BaseEstimator, TransformerMixin
|
7
8
|
|
8
9
|
|
9
10
|
class FeatureClipper(BaseEstimator, TransformerMixin):
|
openstef/model/model_creator.py
CHANGED
@@ -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.
|
20
|
+
from openstef.model.regressors.xgb_quantile import XGBQuantileOpenstfRegressor
|
24
21
|
|
25
|
-
|
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
|
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
|
|
openstef/model/regressors/xgb.py
CHANGED
openstef/model/serializer.py
CHANGED
@@ -5,7 +5,7 @@ import json
|
|
5
5
|
import logging
|
6
6
|
import os
|
7
7
|
import shutil
|
8
|
-
from datetime import
|
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
|
-
|
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 = (
|
openstef/monitoring/teams.py
CHANGED
@@ -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
|
-
|
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
|
-
|
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)
|