openstef 3.4.70__py3-none-any.whl → 3.4.73__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/data_classes/prediction_job.py +1 -1
- openstef/enums.py +1 -0
- openstef/model/model_creator.py +5 -1
- openstef/model/objective.py +40 -10
- openstef/model/regressors/arima.py +1 -1
- openstef/model/regressors/median.py +78 -0
- openstef/model/regressors/regressor.py +2 -2
- openstef/model/regressors/xgb.py +0 -3
- openstef/pipeline/train_model.py +1 -2
- {openstef-3.4.70.dist-info → openstef-3.4.73.dist-info}/METADATA +2 -2
- {openstef-3.4.70.dist-info → openstef-3.4.73.dist-info}/RECORD +14 -13
- {openstef-3.4.70.dist-info → openstef-3.4.73.dist-info}/WHEEL +1 -1
- {openstef-3.4.70.dist-info → openstef-3.4.73.dist-info}/licenses/LICENSE +0 -0
- {openstef-3.4.70.dist-info → openstef-3.4.73.dist-info}/top_level.txt +0 -0
@@ -21,7 +21,7 @@ class PredictionJobDataClass(BaseModel):
|
|
21
21
|
)
|
22
22
|
model: str = Field(
|
23
23
|
...,
|
24
|
-
description="The model type that should be used. Options are: 'xgb', 'xgb_quantile', 'lgb', 'linear', 'linear_quantile', 'gblinear_quantile', 'xgb_multioutput_quantile', 'flatliner'.",
|
24
|
+
description="The model type that should be used. Options are: 'xgb', 'xgb_quantile', 'lgb', 'linear', 'linear_quantile', 'gblinear_quantile', 'xgb_multioutput_quantile', 'flatliner', 'median'.",
|
25
25
|
)
|
26
26
|
|
27
27
|
model_kwargs: Optional[dict] = Field(
|
openstef/enums.py
CHANGED
openstef/model/model_creator.py
CHANGED
@@ -17,6 +17,7 @@ from openstef.model.regressors.xgb import XGBOpenstfRegressor
|
|
17
17
|
from openstef.model.regressors.xgb_multioutput_quantile import (
|
18
18
|
XGBMultiOutputQuantileOpenstfRegressor,
|
19
19
|
)
|
20
|
+
from openstef.model.regressors.median import MedianRegressor
|
20
21
|
from openstef.model.regressors.xgb_quantile import XGBQuantileOpenstfRegressor
|
21
22
|
|
22
23
|
logger = get_logger(__name__)
|
@@ -73,7 +74,6 @@ valid_model_kwargs = {
|
|
73
74
|
"n_jobs",
|
74
75
|
"silent",
|
75
76
|
"importance_type",
|
76
|
-
"early_stopping_rounds",
|
77
77
|
],
|
78
78
|
ModelType.XGB_QUANTILE: [
|
79
79
|
"quantiles",
|
@@ -139,6 +139,9 @@ valid_model_kwargs = {
|
|
139
139
|
"seasonal_order",
|
140
140
|
"trend",
|
141
141
|
],
|
142
|
+
ModelType.MEDIAN: [
|
143
|
+
# This model does not have any parameters
|
144
|
+
],
|
142
145
|
}
|
143
146
|
|
144
147
|
|
@@ -156,6 +159,7 @@ class ModelCreator:
|
|
156
159
|
ModelType.GBLINEAR_QUANTILE: GBLinearQuantileOpenstfRegressor,
|
157
160
|
ModelType.ARIMA: ARIMAOpenstfRegressor,
|
158
161
|
ModelType.FLATLINER: FlatlinerRegressor,
|
162
|
+
ModelType.MEDIAN: MedianRegressor,
|
159
163
|
}
|
160
164
|
|
161
165
|
@staticmethod
|
openstef/model/objective.py
CHANGED
@@ -7,6 +7,8 @@ from typing import Any, Callable, Optional
|
|
7
7
|
|
8
8
|
import optuna
|
9
9
|
import pandas as pd
|
10
|
+
from lightgbm import early_stopping
|
11
|
+
from xgboost.callback import EarlyStopping
|
10
12
|
|
11
13
|
from openstef.enums import ModelType
|
12
14
|
from openstef.metrics import metrics
|
@@ -130,31 +132,42 @@ class RegressorObjective:
|
|
130
132
|
# Configure evals for early stopping
|
131
133
|
eval_set = [(train_x, train_y), (valid_x, valid_y)]
|
132
134
|
|
133
|
-
#
|
135
|
+
# Get the parameters used in this trial
|
134
136
|
hyper_params = self.get_params(trial)
|
135
137
|
|
136
|
-
#
|
138
|
+
# Insert parameters into model
|
137
139
|
self.model.set_params(**hyper_params)
|
138
140
|
|
139
|
-
|
141
|
+
callbacks = []
|
142
|
+
|
143
|
+
# Create the early stopping callback
|
144
|
+
early_stopping_callback = self.get_early_stopping_callback()
|
145
|
+
if early_stopping_callback is not None:
|
146
|
+
callbacks.append(early_stopping_callback)
|
147
|
+
|
148
|
+
# Create the specific pruning callback
|
140
149
|
pruning_callback = self.get_pruning_callback(trial)
|
141
|
-
if pruning_callback is None:
|
142
|
-
callbacks
|
143
|
-
|
144
|
-
|
150
|
+
if pruning_callback is not None:
|
151
|
+
callbacks.append(pruning_callback)
|
152
|
+
|
153
|
+
# Pass verbose argument to fit call if model is not LGB
|
154
|
+
fit_kwargs = {}
|
155
|
+
if self.model_type not in [ModelType.XGB, ModelType.LGB]:
|
156
|
+
fit_kwargs["early_stopping_rounds"] = EARLY_STOPPING_ROUNDS
|
157
|
+
elif self.model_type != ModelType.LGB:
|
158
|
+
fit_kwargs["verbose"] = self.verbose
|
145
159
|
|
146
160
|
# validation_0 and validation_1 are available
|
147
161
|
self.model.fit(
|
148
162
|
train_x,
|
149
163
|
train_y,
|
150
164
|
eval_set=eval_set,
|
151
|
-
early_stopping_rounds=EARLY_STOPPING_ROUNDS,
|
152
|
-
verbose=self.verbose,
|
153
165
|
eval_metric=self.eval_metric,
|
154
166
|
callbacks=callbacks,
|
167
|
+
**fit_kwargs,
|
155
168
|
)
|
156
169
|
|
157
|
-
self.model.feature_importance_dataframe = self.model.
|
170
|
+
self.model.feature_importance_dataframe = self.model.get_feature_importance()
|
158
171
|
|
159
172
|
# Do confidence interval determination
|
160
173
|
self.model = StandardDeviationGenerator(
|
@@ -203,6 +216,9 @@ class RegressorObjective:
|
|
203
216
|
def get_pruning_callback(self, trial: optuna.trial.FrozenTrial):
|
204
217
|
return None
|
205
218
|
|
219
|
+
def get_early_stopping_callback(self):
|
220
|
+
return None
|
221
|
+
|
206
222
|
def get_trial_track(self) -> dict:
|
207
223
|
"""Get a dictionary of al trials.
|
208
224
|
|
@@ -272,6 +288,15 @@ class XGBRegressorObjective(RegressorObjective):
|
|
272
288
|
trial, observation_key=f"validation_1-{self.eval_metric}"
|
273
289
|
)
|
274
290
|
|
291
|
+
def get_early_stopping_callback(self):
|
292
|
+
return EarlyStopping(
|
293
|
+
rounds=EARLY_STOPPING_ROUNDS,
|
294
|
+
metric_name=self.eval_metric,
|
295
|
+
data_name=f"validation_1",
|
296
|
+
maximize=False,
|
297
|
+
save_best=True,
|
298
|
+
)
|
299
|
+
|
275
300
|
@classmethod
|
276
301
|
def get_default_values(cls) -> dict:
|
277
302
|
default_parameter_values = super().get_default_values()
|
@@ -319,6 +344,11 @@ class LGBRegressorObjective(RegressorObjective):
|
|
319
344
|
trial, metric=metric, valid_name="valid_1"
|
320
345
|
)
|
321
346
|
|
347
|
+
def get_early_stopping_callback(self):
|
348
|
+
return early_stopping(
|
349
|
+
stopping_rounds=EARLY_STOPPING_ROUNDS, verbose=self.verbose
|
350
|
+
)
|
351
|
+
|
322
352
|
|
323
353
|
class XGBQuantileRegressorObjective(RegressorObjective):
|
324
354
|
def __init__(self, *args, **kwargs):
|
@@ -126,7 +126,7 @@ class ARIMAOpenstfRegressor(OpenstfRegressor):
|
|
126
126
|
predictions = self.predict_quantile(start, end, exog=x, quantile=quantile)
|
127
127
|
return predictions
|
128
128
|
|
129
|
-
def
|
129
|
+
def get_feature_importance(self):
|
130
130
|
"""Because report needs 'weight' and 'gain' as importance metrics, we set the values to these names.
|
131
131
|
|
132
132
|
- 'weight' is corresponding to the coefficients values
|
@@ -0,0 +1,78 @@
|
|
1
|
+
"""This module contains the median regressor."""
|
2
|
+
|
3
|
+
import numpy as np
|
4
|
+
import pandas as pd
|
5
|
+
|
6
|
+
from sklearn.base import RegressorMixin
|
7
|
+
from sklearn.utils.validation import check_is_fitted
|
8
|
+
|
9
|
+
from openstef.model.regressors.regressor import OpenstfRegressor
|
10
|
+
|
11
|
+
|
12
|
+
class MedianRegressor(OpenstfRegressor, RegressorMixin):
|
13
|
+
"""
|
14
|
+
Median regressor implementing the OpenSTEF regressor API.
|
15
|
+
|
16
|
+
This regressor is good for predicting two types of signals:
|
17
|
+
- Signals with very slow dynamics compared to the sampling rate, possibly
|
18
|
+
with a lot of noise.
|
19
|
+
- Signals that switch between two or more states, which random in nature or
|
20
|
+
depend on unknown features, but tend to be stable in each state. An example of
|
21
|
+
this may be waste heat delivered from an industrial process. Using a median
|
22
|
+
over the last few timesteps adds some hysterisis to avoid triggering on noise.
|
23
|
+
"""
|
24
|
+
|
25
|
+
def __init__(self):
|
26
|
+
"""Initialize MedianRegressor."""
|
27
|
+
super().__init__()
|
28
|
+
|
29
|
+
@property
|
30
|
+
def feature_names(self) -> list:
|
31
|
+
"""Retrieve the model input feature names.
|
32
|
+
|
33
|
+
Returns:
|
34
|
+
The list of feature names
|
35
|
+
|
36
|
+
"""
|
37
|
+
check_is_fitted(self, "feature_names_")
|
38
|
+
return self.feature_names_
|
39
|
+
|
40
|
+
@property
|
41
|
+
def can_predict_quantiles(self) -> bool:
|
42
|
+
return False
|
43
|
+
|
44
|
+
def predict(self, x: pd.DataFrame, **kwargs) -> np.array:
|
45
|
+
"""
|
46
|
+
Predict the median of the lag features for each time step in the context window.
|
47
|
+
|
48
|
+
Args:
|
49
|
+
x (pd.DataFrame): The input data for prediction. This should be a pandas dataframe with lag features.
|
50
|
+
|
51
|
+
Returns:
|
52
|
+
np.array: The predicted median for each time step in the context window.
|
53
|
+
If any lag feature is NaN, this will be ignored.
|
54
|
+
If all lag features are NaN, the regressor will return NaN.
|
55
|
+
"""
|
56
|
+
|
57
|
+
lag_df = x.loc[:, self.feature_names]
|
58
|
+
median = lag_df.median(axis=1, skipna=True)
|
59
|
+
|
60
|
+
return median
|
61
|
+
|
62
|
+
def fit(self, x: pd.DataFrame, y: pd.DataFrame, **kwargs) -> RegressorMixin:
|
63
|
+
"""This model does not have any hyperparameters to fit,
|
64
|
+
but it does need to know the feature names of the lag features.
|
65
|
+
|
66
|
+
Which lag features are used is determined by the feature engineering step.
|
67
|
+
"""
|
68
|
+
self.feature_names_ = list(x.columns[x.columns.str.startswith("T-")])
|
69
|
+
if len(self.feature_names_) == 0:
|
70
|
+
raise ValueError("No lag features found in the input data.")
|
71
|
+
|
72
|
+
self.feature_importances_ = np.ones(len(self.feature_names_)) / (
|
73
|
+
len(self.feature_names_) or 1.0
|
74
|
+
)
|
75
|
+
return self
|
76
|
+
|
77
|
+
def __sklearn_is_fitted__(self) -> bool:
|
78
|
+
return True
|
@@ -59,7 +59,7 @@ class OpenstfRegressor(BaseEstimator):
|
|
59
59
|
"""
|
60
60
|
|
61
61
|
@abstractmethod
|
62
|
-
def fit(self, x:
|
62
|
+
def fit(self, x: pd.DataFrame, y: pd.DataFrame, **kwargs) -> RegressorMixin:
|
63
63
|
"""Fits the regressor.
|
64
64
|
|
65
65
|
Args:
|
@@ -72,7 +72,7 @@ class OpenstfRegressor(BaseEstimator):
|
|
72
72
|
|
73
73
|
"""
|
74
74
|
|
75
|
-
def
|
75
|
+
def get_feature_importance(self) -> Union[pd.DataFrame, None]:
|
76
76
|
"""Get feature importance.
|
77
77
|
|
78
78
|
Returns:
|
openstef/model/regressors/xgb.py
CHANGED
@@ -36,13 +36,10 @@ class XGBOpenstfRegressor(XGBRegressor, OpenstfRegressor):
|
|
36
36
|
x: np.array,
|
37
37
|
y: np.array,
|
38
38
|
*,
|
39
|
-
early_stopping_rounds: Optional[int] = None,
|
40
39
|
callbacks: Optional[list] = None,
|
41
40
|
eval_metric: Optional[str] = None,
|
42
41
|
**kwargs
|
43
42
|
):
|
44
|
-
if early_stopping_rounds is not None:
|
45
|
-
self.set_params(early_stopping_rounds=early_stopping_rounds)
|
46
43
|
if callbacks is not None:
|
47
44
|
self.set_params(callbacks=callbacks)
|
48
45
|
if eval_metric is not None:
|
openstef/pipeline/train_model.py
CHANGED
@@ -495,10 +495,9 @@ def train_pipeline_step_train_model(
|
|
495
495
|
train_x,
|
496
496
|
train_y,
|
497
497
|
eval_set=eval_set,
|
498
|
-
verbose=False,
|
499
498
|
)
|
500
499
|
# Gets the feature importance df or None if we don't have feature importance
|
501
|
-
model.feature_importance_dataframe = model.
|
500
|
+
model.feature_importance_dataframe = model.get_feature_importance()
|
502
501
|
|
503
502
|
logger.info("Fitted a new model, not yet stored")
|
504
503
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: openstef
|
3
|
-
Version: 3.4.
|
3
|
+
Version: 3.4.73
|
4
4
|
Summary: Open short term energy forecaster
|
5
5
|
Home-page: https://github.com/OpenSTEF/openstef
|
6
6
|
Author: Alliander N.V
|
@@ -16,7 +16,7 @@ Description-Content-Type: text/markdown
|
|
16
16
|
License-File: LICENSE
|
17
17
|
Requires-Dist: holidays==0.21
|
18
18
|
Requires-Dist: joblib==1.3.2
|
19
|
-
Requires-Dist: lightgbm
|
19
|
+
Requires-Dist: lightgbm>=4.0
|
20
20
|
Requires-Dist: matplotlib~=3.7
|
21
21
|
Requires-Dist: mlflow~=2.3
|
22
22
|
Requires-Dist: networkx~=3.1
|
@@ -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=4SiEoPfPmM_Vc9gwWleT_IRxHIk36bZaYRCdNf3ewoo,762
|
4
|
-
openstef/enums.py,sha256=
|
4
|
+
openstef/enums.py,sha256=kwAbEoMI_a--Ikk6RxeJmvR2JKYKDNHynhMUbbiczZs,2851
|
5
5
|
openstef/exceptions.py,sha256=dgnvZe5WWuJWCZm_GES6suEATbusPlwbiEUfNQKeExY,1993
|
6
6
|
openstef/settings.py,sha256=nSgkBqFxuqB3w7Rwo60i8j37c5ngDbt6vpjHS6QtJXQ,354
|
7
7
|
openstef/data/NL_terrestrial_radiation.csv,sha256=A4kbW56GDzWi4tWUwY2C-4PiOvcKJCwkWQQtdg4ekPE,820246
|
@@ -17,7 +17,7 @@ openstef/data/dazls_model_3.4.24/dazls_stored_3.4.24_model_card.md.license,sha25
|
|
17
17
|
openstef/data_classes/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
|
18
18
|
openstef/data_classes/data_prep.py,sha256=sANgFjfwmSWhLCfmLjfqXQnczuvVZfk2765jZd7LwuE,3691
|
19
19
|
openstef/data_classes/model_specifications.py,sha256=PZeBLfH_MrP9-QorL1r0Hklp0befE8Nw05vNhTX9Y20,1338
|
20
|
-
openstef/data_classes/prediction_job.py,sha256=
|
20
|
+
openstef/data_classes/prediction_job.py,sha256=omVzowGYUp5YD_7k3i3pKlDh1I7i_jU3-za7FJ3fK1s,6731
|
21
21
|
openstef/data_classes/split_function.py,sha256=K8y1dsQC5exeIDh37f7UwJ11tV71_uVSNbnKmwXpnOM,3435
|
22
22
|
openstef/feature_engineering/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
|
23
23
|
openstef/feature_engineering/apply_features.py,sha256=pro4eUmOFexX_9g9kJtDcbrQ1hWKzXjVpiJBmmBi89o,5326
|
@@ -46,8 +46,8 @@ openstef/model/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,16
|
|
46
46
|
openstef/model/basecase.py,sha256=caI6Q-8y0ymlxGK9Js_H3Vh0q6ruNHlGD5RG0_kE5M0,2878
|
47
47
|
openstef/model/confidence_interval_applicator.py,sha256=VOdHsDJhfeyaq_cnk9QMUaZ2IumbiBBoW1zo8AuqDg0,9559
|
48
48
|
openstef/model/fallback.py,sha256=g6TEuEhV4w07SCGkR_AvPf2up9f0ixGKQojYC-Ewl6Y,2812
|
49
|
-
openstef/model/model_creator.py,sha256=
|
50
|
-
openstef/model/objective.py,sha256=
|
49
|
+
openstef/model/model_creator.py,sha256=fnhcVGUHskbuAys5kjlJ4GXKxbi9Eq5eAA19ex11Vv0,6658
|
50
|
+
openstef/model/objective.py,sha256=0PZUbPzuyaYlpWEH_qPavO6ll7zwqTTUTfIrUzzFMbs,15585
|
51
51
|
openstef/model/objective_creator.py,sha256=3jJgcmY1sm-Yoe3SfjKrJukrsqtYyloUFaPbBWqswhQ,2208
|
52
52
|
openstef/model/serializer.py,sha256=k5GY8eRJdlii8mEY7Qheu4yb5USyIyxw77EYkSQJGYk,17034
|
53
53
|
openstef/model/standard_deviation_generator.py,sha256=OorRvX2wRScU7f4SIBoiT24yJeeM50sETP3xC6m5IG4,2865
|
@@ -56,7 +56,7 @@ openstef/model/metamodels/feature_clipper.py,sha256=DNsyYdjUT7ZNimJJIyTvv1nmwTwD
|
|
56
56
|
openstef/model/metamodels/grouped_regressor.py,sha256=yMN_a6TnQSyFaqlB_6Nifq-ydpb5hs6w_b97IaBbHj4,8337
|
57
57
|
openstef/model/metamodels/missing_values_handler.py,sha256=glgAlkeubLZFWbD8trTYBik7_qOJi4GCPGl1sSybSkQ,5257
|
58
58
|
openstef/model/regressors/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
|
59
|
-
openstef/model/regressors/arima.py,sha256=
|
59
|
+
openstef/model/regressors/arima.py,sha256=2MIcIvfxOAxYC5QtC00K9oQl2-qaOewm7P3gzoHgxgE,7587
|
60
60
|
openstef/model/regressors/custom_regressor.py,sha256=T4JdJ-oTTt1PHQV0DdIEIhALvEEh07WCFlWxl8EFih0,1765
|
61
61
|
openstef/model/regressors/dazls.py,sha256=Xt89yFHjkwpIUTkkhPmPZ74F8_tht_XV88INuP5GU2E,3994
|
62
62
|
openstef/model/regressors/flatliner.py,sha256=T9u-ukhqFcatQmlgUtBL_G-1b_wQzgdVRq0ac64GnjQ,2789
|
@@ -64,8 +64,9 @@ openstef/model/regressors/gblinear_quantile.py,sha256=PKQL_TAXa3Kw9oZrKC6Uvo_n2N
|
|
64
64
|
openstef/model/regressors/lgbm.py,sha256=zCdn1euEdSFxYJzH8XqQFFnb6R4JVUnmineKjX_Gy-g,800
|
65
65
|
openstef/model/regressors/linear.py,sha256=uOvZMLGZH_9nXfmS5honCMfyVeyGXP1Cza9A_BdXlVw,3665
|
66
66
|
openstef/model/regressors/linear_quantile.py,sha256=zIpGo9deMeTZdwFWoZ3FstX74mYdlAhfg-YOsPRFl0k,10534
|
67
|
-
openstef/model/regressors/
|
68
|
-
openstef/model/regressors/
|
67
|
+
openstef/model/regressors/median.py,sha256=ITM5QhqfvjMjfk8fuHbyVWyWgld1NTiWajaaWAugbis,2697
|
68
|
+
openstef/model/regressors/regressor.py,sha256=0um575rTEkzYb1E5IAOuTlsZDhmb7eI5byu5e062NRs,3469
|
69
|
+
openstef/model/regressors/xgb.py,sha256=uhV9Wm90aOkjByTm-O2xpt2kpANRxAqQvv5mA0H1uBc,1294
|
69
70
|
openstef/model/regressors/xgb_multioutput_quantile.py,sha256=xWzA7tymC_o-F1OS3I7vUKf9zP6RR1ZglEeY4NAgjU0,9146
|
70
71
|
openstef/model/regressors/xgb_quantile.py,sha256=PzKIxqN_CnEPFmzXACNuzLSmZSHbooTuiJ5ckJ9vh_E,7805
|
71
72
|
openstef/model_selection/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
|
@@ -79,7 +80,7 @@ openstef/pipeline/create_component_forecast.py,sha256=40fYKajdj4F9K7fzmL3euyvwTr
|
|
79
80
|
openstef/pipeline/create_forecast.py,sha256=mVbbu7jM31NEwfaDeQPqF3Okps9H1oLfjhPPiJRL4zg,5582
|
80
81
|
openstef/pipeline/optimize_hyperparameters.py,sha256=w5LpZhW3KVklCJzaogNzyHfpMJfNqeRAnvyV4vi35wg,10953
|
81
82
|
openstef/pipeline/train_create_forecast_backtest.py,sha256=hBJPxfDkbrmFSSGZrRH1vTiIVqJP-SWe0ibVpHT_8Qg,6048
|
82
|
-
openstef/pipeline/train_model.py,sha256=
|
83
|
+
openstef/pipeline/train_model.py,sha256=O1pyATMQUkNZQ01FlOwG8r3gtKwRcx7YD73f-91umuo,19948
|
83
84
|
openstef/pipeline/utils.py,sha256=23mB31p19FoGWelLJzxNmqlzGwEr3fCDBEA37V2kpYY,2167
|
84
85
|
openstef/plotting/__init__.py,sha256=KQjXzyafCt1bE7XDrSeV4TDUIO7MkwN_Br4ASOcNI2g,163
|
85
86
|
openstef/plotting/load_forecast_plotter.py,sha256=GWHVmUB2YosNj7TnSrMnxYAfM2Z1mNg5oRV9A_lJmQY,8129
|
@@ -103,8 +104,8 @@ openstef/tasks/utils/predictionjobloop.py,sha256=Ysy3zF5lzPMz_asYDKeF5m0qgVT3tCt
|
|
103
104
|
openstef/tasks/utils/taskcontext.py,sha256=O-LZ_wHEl5vbT8oB7EYtOeMkvk6EqCnI1-KiyER7Eu4,5407
|
104
105
|
openstef/validation/__init__.py,sha256=bIyGTSA4V5VoOLTwdaiJJAnozmpSzvQooVYlsf8H4eU,163
|
105
106
|
openstef/validation/validation.py,sha256=r6UqkdH5TMjsGfn8Ta07K1jkqmrVmwcPGfyQvMmZyO4,11459
|
106
|
-
openstef-3.4.
|
107
|
-
openstef-3.4.
|
108
|
-
openstef-3.4.
|
109
|
-
openstef-3.4.
|
110
|
-
openstef-3.4.
|
107
|
+
openstef-3.4.73.dist-info/licenses/LICENSE,sha256=7Pm2fWFFHHUG5lDHed1vl5CjzxObIXQglnYsEdtjo_k,14907
|
108
|
+
openstef-3.4.73.dist-info/METADATA,sha256=7Nxg4a2GePqCFf19ANnEIze222JfNmypS88wt05cdfg,8834
|
109
|
+
openstef-3.4.73.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
|
110
|
+
openstef-3.4.73.dist-info/top_level.txt,sha256=kD0H4PqrQoncZ957FvqwfBxa89kTrun4Z_RAPs_HhLs,9
|
111
|
+
openstef-3.4.73.dist-info/RECORD,,
|
File without changes
|
File without changes
|