openstef 3.4.40__py3-none-any.whl → 3.4.43__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.
@@ -9,7 +9,7 @@ from pydantic.v1 import BaseModel
9
9
  from openstef.data_classes.data_prep import DataPrepDataClass
10
10
  from openstef.data_classes.model_specifications import ModelSpecificationDataClass
11
11
  from openstef.data_classes.split_function import SplitFuncDataClass
12
- from openstef.enums import PipelineType
12
+ from openstef.enums import PipelineType, BiddingZone
13
13
 
14
14
 
15
15
  class PredictionJobDataClass(BaseModel):
@@ -54,6 +54,8 @@ class PredictionJobDataClass(BaseModel):
54
54
  lon: Optional[float] = 5.291266
55
55
  """Longitude of the forecasted location in degrees. Used for fetching weather data in tasks, calculating derrived features and component splitting."""
56
56
  name: str
57
+ """Bidding zone is used to determine the electricity price. It is also used to determine the holidays that should be used. Currently only ENTSO-E bidding zones are supported."""
58
+ electricity_bidding_zone: Optional[BiddingZone] = BiddingZone.NL
57
59
  """Name of the forecast, e.g. the location name."""
58
60
  train_components: Optional[bool]
59
61
  """Whether splitting the forecasts in wind, solar, rest is desired."""
openstef/enums.py CHANGED
@@ -4,6 +4,110 @@
4
4
  from enum import Enum
5
5
 
6
6
 
7
+ class BiddingZone(Enum):
8
+ DE_50HZ = "DE_50HZ"
9
+ AL = "AL"
10
+ DE_AMPRION = "DE_AMPRION"
11
+ AT = "AT"
12
+ BY = "BY"
13
+ BE = "BE"
14
+ BA = "BA"
15
+ BG = "BG"
16
+ CZ_DE_SK = "CZ_DE_SK"
17
+ HR = "HR"
18
+ CWE = "CWE"
19
+ CY = "CY"
20
+ CZ = "CZ"
21
+ DE_AT_LU = "DE_AT_LU"
22
+ DE_LU = "DE_LU"
23
+ DK = "DK"
24
+ DK_1 = "DK_1"
25
+ DK_1_NO_1 = "DK_1_NO_1"
26
+ DK_2 = "DK_2"
27
+ DK_CA = "DK_CA"
28
+ EE = "EE"
29
+ FI = "FI"
30
+ MK = "MK"
31
+ FR = "FR"
32
+ DE = "DE"
33
+ GR = "GR"
34
+ HU = "HU"
35
+ IS = "IS"
36
+ IE_SEM = "IE_SEM"
37
+ IE = "IE"
38
+ IT = "IT"
39
+ IT_SACO_AC = "IT_SACO_AC"
40
+ IT_CALA = "IT_CALA"
41
+ IT_SACO_DC = "IT_SACO_DC"
42
+ IT_BRNN = "IT_BRNN"
43
+ IT_CNOR = "IT_CNOR"
44
+ IT_CSUD = "IT_CSUD"
45
+ IT_FOGN = "IT_FOGN"
46
+ IT_GR = "IT_GR"
47
+ IT_MACRO_NORTH = "IT_MACRO_NORTH"
48
+ IT_MACRO_SOUTH = "IT_MACRO_SOUTH"
49
+ IT_MALTA = "IT_MALTA"
50
+ IT_NORD = "IT_NORD"
51
+ IT_NORD_AT = "IT_NORD_AT"
52
+ IT_NORD_CH = "IT_NORD_CH"
53
+ IT_NORD_FR = "IT_NORD_FR"
54
+ IT_NORD_SI = "IT_NORD_SI"
55
+ IT_PRGP = "IT_PRGP"
56
+ IT_ROSN = "IT_ROSN"
57
+ IT_SARD = "IT_SARD"
58
+ IT_SICI = "IT_SICI"
59
+ IT_SUD = "IT_SUD"
60
+ RU_KGD = "RU_KGD"
61
+ LV = "LV"
62
+ LT = "LT"
63
+ LU = "LU"
64
+ LU_BZN = "LU_BZN"
65
+ MT = "MT"
66
+ ME = "ME"
67
+ GB = "GB"
68
+ GE = "GE"
69
+ GB_IFA = "GB_IFA"
70
+ GB_IFA2 = "GB_IFA2"
71
+ GB_ELECLINK = "GB_ELECLINK"
72
+ UK = "UK"
73
+ NL = "NL"
74
+ NO_1 = "NO_1"
75
+ NO_1A = "NO_1A"
76
+ NO_2 = "NO_2"
77
+ NO_2_NSL = "NO_2_NSL"
78
+ NO_2A = "NO_2A"
79
+ NO_3 = "NO_3"
80
+ NO_4 = "NO_4"
81
+ NO_5 = "NO_5"
82
+ NO = "NO"
83
+ PL_CZ = "PL_CZ"
84
+ PL = "PL"
85
+ PT = "PT"
86
+ MD = "MD"
87
+ RO = "RO"
88
+ RU = "RU"
89
+ SE_1 = "SE_1"
90
+ SE_2 = "SE_2"
91
+ SE_3 = "SE_3"
92
+ SE_4 = "SE_4"
93
+ RS = "RS"
94
+ SK = "SK"
95
+ SI = "SI"
96
+ GB_NIR = "GB_NIR"
97
+ ES = "ES"
98
+ SE = "SE"
99
+ CH = "CH"
100
+ DE_TENNET = "DE_TENNET"
101
+ DE_TRANSNET = "DE_TRANSNET"
102
+ TR = "TR"
103
+ UA = "UA"
104
+ UA_DOBTPP = "UA_DOBTPP"
105
+ UA_BEI = "UA_BEI"
106
+ UA_IPS = "UA_IPS"
107
+ XK = "XK"
108
+ DE_AMP_LU = "DE_AMP_LU"
109
+
110
+
7
111
  class ModelType(Enum):
8
112
  XGB = "xgb"
9
113
  XGB_QUANTILE = "xgb_quantile"
@@ -14,10 +14,14 @@ Examples of features that are added:
14
14
  import pandas as pd
15
15
 
16
16
  from openstef.data_classes.prediction_job import PredictionJobDataClass
17
+ from openstef.enums import BiddingZone
17
18
  from openstef.feature_engineering.holiday_features import (
18
19
  generate_holiday_feature_functions,
19
20
  )
20
21
  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
+ )
21
25
  from openstef.feature_engineering.weather_features import (
22
26
  add_additional_solar_features,
23
27
  add_additional_wind_features,
@@ -58,6 +62,7 @@ def apply_features(
58
62
 
59
63
  import pandas as pd
60
64
  import numpy as np
65
+ from geopy.geocoders import Nominatim
61
66
  index = pd.date_range(start = "2017-01-01 09:00:00",
62
67
  freq = '15T', periods = 200)
63
68
  data = pd.DataFrame(index = index,
@@ -66,6 +71,9 @@ def apply_features(
66
71
  np.random.uniform(0.7,1.7, 200)))
67
72
 
68
73
  """
74
+ if pj is None:
75
+ pj = {"electricity_bidding_zone": BiddingZone.NL}
76
+
69
77
  # Get lag feature functions
70
78
  feature_functions = generate_lag_feature_functions(feature_names, horizon)
71
79
 
@@ -80,8 +88,14 @@ def apply_features(
80
88
  }
81
89
  )
82
90
 
91
+ # Get country code from bidding zone if available
92
+ electricity_bidding_zone = pj.get("electricity_bidding_zone", BiddingZone.NL)
93
+ country_code = BIDDING_ZONE_TO_COUNTRY_CODE_MAPPING[electricity_bidding_zone.name]
94
+
83
95
  # Get holiday feature functions
84
- feature_functions.update(generate_holiday_feature_functions())
96
+ feature_functions.update(
97
+ generate_holiday_feature_functions(country_code=country_code)
98
+ )
85
99
 
86
100
  # Add the features to the dataframe using previously defined feature functions
87
101
  for key, featfunc in feature_functions.items():
@@ -0,0 +1,106 @@
1
+ # SPDX-FileCopyrightText: 2017-2023 Contributors to the OpenSTEF project <korte.termijn.prognoses@alliander.com> # noqa E501>
2
+ #
3
+ # SPDX-License-Identifier: MPL-2.0
4
+ BIDDING_ZONE_TO_COUNTRY_CODE_MAPPING = {
5
+ "DE_50HZ": "DE",
6
+ "AL": "AL",
7
+ "DE_AMPRION": "DE",
8
+ "AT": "AT",
9
+ "BY": "BY",
10
+ "BE": "BE",
11
+ "BA": "BA",
12
+ "BG": "BG",
13
+ "CZ_DE_SK": "CZ",
14
+ "HR": "HR",
15
+ "CWE": "CWE",
16
+ "CY": "CY",
17
+ "CZ": "CZ",
18
+ "DE_AT_LU": "DE",
19
+ "DE_LU": "DE",
20
+ "DK": "DK",
21
+ "DK_1": "DK",
22
+ "DK_1_NO_1": "DK",
23
+ "DK_2": "DK",
24
+ "DK_CA": "DK",
25
+ "EE": "EE",
26
+ "FI": "FI",
27
+ "MK": "MK",
28
+ "FR": "FR",
29
+ "DE": "DE",
30
+ "GR": "GR",
31
+ "HU": "HU",
32
+ "IS": "IS",
33
+ "IE_SEM": "IE",
34
+ "IE": "IE",
35
+ "IT": "IT",
36
+ "IT_SACO_AC": "IT",
37
+ "IT_CALA": "IT",
38
+ "IT_SACO_DC": "IT",
39
+ "IT_BRNN": "IT",
40
+ "IT_CNOR": "IT",
41
+ "IT_CSUD": "IT",
42
+ "IT_FOGN": "IT",
43
+ "IT_GR": "IT",
44
+ "IT_MACRO_NORTH": "IT",
45
+ "IT_MACRO_SOUTH": "IT",
46
+ "IT_MALTA": "IT",
47
+ "IT_NORD": "IT",
48
+ "IT_NORD_AT": "IT",
49
+ "IT_NORD_CH": "IT",
50
+ "IT_NORD_FR": "IT",
51
+ "IT_NORD_SI": "IT",
52
+ "IT_PRGP": "IT",
53
+ "IT_ROSN": "IT",
54
+ "IT_SARD": "IT",
55
+ "IT_SICI": "IT",
56
+ "IT_SUD": "IT",
57
+ "RU_KGD": "RU",
58
+ "LV": "LV",
59
+ "LT": "LT",
60
+ "LU": "LU",
61
+ "LU_BZN": "LU",
62
+ "MT": "MT",
63
+ "ME": "ME",
64
+ "GB": "GB",
65
+ "GE": "GE",
66
+ "GB_IFA": "GB",
67
+ "GB_IFA2": "GB",
68
+ "GB_ELECLINK": "GB",
69
+ "UK": "UK",
70
+ "NL": "NL",
71
+ "NO_1": "NO",
72
+ "NO_1A": "NO",
73
+ "NO_2": "NO",
74
+ "NO_2_NSL": "NO",
75
+ "NO_2A": "NO",
76
+ "NO_3": "NO",
77
+ "NO_4": "NO",
78
+ "NO_5": "NO",
79
+ "NO": "NO",
80
+ "PL_CZ": "PL",
81
+ "PL": "PL",
82
+ "PT": "PT",
83
+ "MD": "MD",
84
+ "RO": "RO",
85
+ "RU": "RU",
86
+ "SE_1": "SE",
87
+ "SE_2": "SE",
88
+ "SE_3": "SE",
89
+ "SE_4": "SE",
90
+ "RS": "RS",
91
+ "SK": "SK",
92
+ "SI": "SI",
93
+ "GB_NIR": "GB",
94
+ "ES": "ES",
95
+ "SE": "SE",
96
+ "CH": "CH",
97
+ "DE_TENNET": "DE",
98
+ "DE_TRANSNET": "DE",
99
+ "TR": "TR",
100
+ "UA": "UA",
101
+ "UA_DOBTPP": "UA",
102
+ "UA_BEI": "UA",
103
+ "UA_IPS": "UA",
104
+ "XK": "XK",
105
+ "DE_AMP_LU": "DE",
106
+ }
@@ -14,7 +14,7 @@ HOLIDAY_CSV_PATH: str = PROJECT_ROOT / "openstef" / "data" / "dutch_holidays.csv
14
14
 
15
15
 
16
16
  def generate_holiday_feature_functions(
17
- country: str = "NL",
17
+ country_code: str = "NL",
18
18
  years: list = None,
19
19
  path_to_school_holidays_csv: str = HOLIDAY_CSV_PATH,
20
20
  ) -> dict:
@@ -69,7 +69,7 @@ def generate_holiday_feature_functions(
69
69
  now.year + 1,
70
70
  ]
71
71
 
72
- country_holidays = holidays.country_holidays(country, years=years)
72
+ country_holidays = holidays.country_holidays(country_code, years=years)
73
73
 
74
74
  # Make holiday function dict
75
75
  holiday_functions = {}
@@ -96,7 +96,7 @@ def generate_holiday_feature_functions(
96
96
 
97
97
  # Check for bridge day
98
98
  holiday_functions, bridge_days = check_for_bridge_day(
99
- date, holiday_name, country, years, holiday_functions, bridge_days
99
+ date, holiday_name, country_code, years, holiday_functions, bridge_days
100
100
  )
101
101
 
102
102
  # Add feature function that includes all bridgedays
@@ -104,33 +104,42 @@ def generate_holiday_feature_functions(
104
104
  {"is_bridgeday": lambda x: np.isin(x.index.date, np.array(list(bridge_days)))}
105
105
  )
106
106
 
107
- # Manully generated csv including all dutch schoolholidays for different regions
108
- df_holidays = pd.read_csv(path_to_school_holidays_csv, index_col=None)
109
- df_holidays["datum"] = pd.to_datetime(df_holidays.datum).apply(lambda x: x.date())
110
-
111
- # Add check function that includes all holidays of the provided csv
112
- holiday_functions.update(
113
- {"is_schoolholiday": lambda x: np.isin(x.index.date, df_holidays.datum.values)}
114
- )
115
-
116
- # Loop over list of holidays names
117
- for holiday_name in list(set(df_holidays.name)):
118
- # Define function explicitely to mitigate 'late binding' problem
119
- def make_holiday_func(holidayname=holiday_name):
120
- return lambda x: np.isin(
121
- x.index.date, df_holidays.datum[df_holidays.name == holidayname].values
122
- )
107
+ # Add school holidays if country is NL
108
+ if country_code == "NL":
109
+ # Manully generated csv including all dutch schoolholidays for different regions
110
+ df_holidays = pd.read_csv(path_to_school_holidays_csv, index_col=None)
111
+ df_holidays["datum"] = pd.to_datetime(df_holidays.datum).apply(
112
+ lambda x: x.date()
113
+ )
123
114
 
124
- # Create lag function for each holiday
115
+ # Add check function that includes all holidays of the provided csv
125
116
  holiday_functions.update(
126
117
  {
127
- "is_"
128
- + holiday_name.replace(" ", "_").lower(): make_holiday_func(
129
- holidayname=holiday_name
118
+ "is_schoolholiday": lambda x: np.isin(
119
+ x.index.date, df_holidays.datum.values
130
120
  )
131
121
  }
132
122
  )
133
123
 
124
+ # Loop over list of holidays names
125
+ for holiday_name in list(set(df_holidays.name)):
126
+ # Define function explicitely to mitigate 'late binding' problem
127
+ def make_holiday_func(holidayname=holiday_name):
128
+ return lambda x: np.isin(
129
+ x.index.date,
130
+ df_holidays.datum[df_holidays.name == holidayname].values,
131
+ )
132
+
133
+ # Create lag function for each holiday
134
+ holiday_functions.update(
135
+ {
136
+ "is_"
137
+ + holiday_name.replace(" ", "_").lower(): make_holiday_func(
138
+ holidayname=holiday_name
139
+ )
140
+ }
141
+ )
142
+
134
143
  return holiday_functions
135
144
 
136
145
 
@@ -244,7 +244,7 @@ def detect_ongoing_zero_flatliner(
244
244
  """
245
245
  # remove all timestamps in the future
246
246
  load = load[load.index.tz_localize(None) <= datetime.utcnow()]
247
- latest_measurement_time = load.index.max()
247
+ latest_measurement_time = load.dropna().index.max()
248
248
  latest_measurements = load[
249
249
  latest_measurement_time - timedelta(minutes=duration_threshold_minutes) :
250
250
  ].dropna()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openstef
3
- Version: 3.4.40
3
+ Version: 3.4.43
4
4
  Summary: Open short term energy forecaster
5
5
  Home-page: https://github.com/OpenSTEF/openstef
6
6
  Author: Alliander N.V
@@ -1,7 +1,7 @@
1
1
  openstef/__init__.py,sha256=93UM6m0LLQhO69-mSqLuUy73jgs4W7Iuxfo3Lm8c98g,419
2
2
  openstef/__main__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
3
3
  openstef/app_settings.py,sha256=EJTDtimctFQQ-3f7ZcOQaRYohpZk3JD6aZBWPFYM2_A,582
4
- openstef/enums.py,sha256=dqwQUn09b-lsQ6BXhL_s_WzPxVDOPO27kQHzuQIeBG8,673
4
+ openstef/enums.py,sha256=Wmoag2p7G2cvENA1qt8FcVbAgo-MswXKxmq7vkxHaxs,2680
5
5
  openstef/exceptions.py,sha256=U4u2LTcdT6cmzpipT2Jh7kq9nCjT_-6gntn8yjuhGU0,1993
6
6
  openstef/settings.py,sha256=nSgkBqFxuqB3w7Rwo60i8j37c5ngDbt6vpjHS6QtJXQ,354
7
7
  openstef/data/dutch_holidays.csv,sha256=Cg8EYjXp1O0lcFOkIOmrS5HaOArrxZwOXsZ9pVkIcKI,49847
@@ -15,15 +15,16 @@ openstef/data/dazls_model_3.4.24/dazls_stored_3.4.24_model_card.md.license,sha25
15
15
  openstef/data_classes/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
16
16
  openstef/data_classes/data_prep.py,sha256=gRSL7UiHvZis8m8z7VoTCZc0Ccffhef5_hmSyApnqK0,3417
17
17
  openstef/data_classes/model_specifications.py,sha256=Uod1W3QzhRqVLb6zvXwxh9wRL3EHCzSvX0oDNd28cFk,1197
18
- openstef/data_classes/prediction_job.py,sha256=tE3K8QCDasXh0ESOBvMgJ3yI_noS6Uz7jU0sSDdt_us,5232
18
+ openstef/data_classes/prediction_job.py,sha256=oVgk6rTC8IYYIGpEuaZHPi01l7gomQQ--BHlixj0Eb0,5496
19
19
  openstef/data_classes/split_function.py,sha256=ljQIQQu1t1Y_CVWGAy25jrM6wG9odIVVQVimrT1n-1s,3358
20
20
  openstef/feature_engineering/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
21
- openstef/feature_engineering/apply_features.py,sha256=-3fyisOVj9ckIkRe2iYfWutbXSX8iqBkcvt8AYr-gmE,3906
21
+ openstef/feature_engineering/apply_features.py,sha256=AgIFnfud55vj0UUWJYwrMTjUzFCBxpV5ACaUK21-ZUo,4451
22
+ openstef/feature_engineering/bidding_zone_to_country_mapping.py,sha256=u9aabjFDImydkO6_cXiaQxBT4gb5zy0gGTg2EoIUO_Y,2106
22
23
  openstef/feature_engineering/data_preparation.py,sha256=htca9LBO3ZN1D-iX4vXf0UN1fw_rRO7y6N3AuYVMpfk,5628
23
24
  openstef/feature_engineering/feature_adder.py,sha256=aSqDl_gUrB3H2TD3cNvU5JniY_KOb4u4a2A6J7zB2BQ,6835
24
25
  openstef/feature_engineering/feature_applicator.py,sha256=DR7jayrEMlra4BFL1Ps5WV2fxbkQ6VaOTa5RIKM-YNk,7447
25
26
  openstef/feature_engineering/general.py,sha256=tgU4_1stag9jJmaQAfWCMhfBscznVuQvW5hPK_z9_9g,4438
26
- openstef/feature_engineering/holiday_features.py,sha256=e4BfS4Wrd3sn_SeXh8F1tL1JNu99oa2smSJJiejcrIw,7891
27
+ openstef/feature_engineering/holiday_features.py,sha256=q_wJvKaVUd54GjPo3qEt1No_XsQ9d1oNmNNJD3AIHtE,8181
27
28
  openstef/feature_engineering/lag_features.py,sha256=Dr6qS8UhdgEHPZZSe-w6ibtjl_lcbcQohhqdZN9fqEU,5652
28
29
  openstef/feature_engineering/missing_values_transformer.py,sha256=o_zCVEOCPn2tWzvlY44XZuDysV0TuxqeVYhilYU54YY,5010
29
30
  openstef/feature_engineering/weather_features.py,sha256=Lr9DItyHvJ2CpWQ1r6A83tJKtR2k_Wwn32FdFTGblO0,15750
@@ -87,9 +88,9 @@ openstef/tasks/utils/dependencies.py,sha256=Jy9dtV_G7lTEa5Cdy--wvMxJuAb0adb3R0X4
87
88
  openstef/tasks/utils/predictionjobloop.py,sha256=Ysy3zF5lzPMz_asYDKeF5m0qgVT3tCtwSPihqMjnI5Q,9580
88
89
  openstef/tasks/utils/taskcontext.py,sha256=L9K14ycwgVxbIVUjH2DIn_QWbnu-OfxcGtQ1K9T6sus,5630
89
90
  openstef/validation/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
90
- openstef/validation/validation.py,sha256=628xaDbAm8B4AYtFOAn8_SXLjejNfULGCfX3hVf_mU0,11119
91
- openstef-3.4.40.dist-info/LICENSE,sha256=7Pm2fWFFHHUG5lDHed1vl5CjzxObIXQglnYsEdtjo_k,14907
92
- openstef-3.4.40.dist-info/METADATA,sha256=dKNS74MnfUzR7VgZuCpHzNSGxioEEgbr2Gkv7Cb60Wg,8068
93
- openstef-3.4.40.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
94
- openstef-3.4.40.dist-info/top_level.txt,sha256=kD0H4PqrQoncZ957FvqwfBxa89kTrun4Z_RAPs_HhLs,9
95
- openstef-3.4.40.dist-info/RECORD,,
91
+ openstef/validation/validation.py,sha256=HVgreHvcZvPazfwC3NNE8_3lsMsZEd_42osCAg1_6W4,11128
92
+ openstef-3.4.43.dist-info/LICENSE,sha256=7Pm2fWFFHHUG5lDHed1vl5CjzxObIXQglnYsEdtjo_k,14907
93
+ openstef-3.4.43.dist-info/METADATA,sha256=L2J9ATvIMBE06--ITAksEWnqGYNZr5T-oODgLroNZFw,8068
94
+ openstef-3.4.43.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
95
+ openstef-3.4.43.dist-info/top_level.txt,sha256=kD0H4PqrQoncZ957FvqwfBxa89kTrun4Z_RAPs_HhLs,9
96
+ openstef-3.4.43.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (75.6.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5