spotforecast2-safe 0.0.1__py3-none-any.whl → 0.0.2__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,13 +9,8 @@ from .outlier import (
9
9
  mark_outliers,
10
10
  manual_outlier_removal,
11
11
  get_outliers,
12
- visualize_outliers_hist,
13
- visualize_outliers_plotly_scatter,
14
- )
15
- from .time_series_visualization import (
16
- visualize_ts_plotly,
17
- visualize_ts_comparison,
18
12
  )
13
+
19
14
  from .imputation import custom_weights, get_missing_weights, WeightFunction
20
15
  from .split import split_abs_train_val_test, split_rel_train_val_test
21
16
  from ._differentiator import TimeSeriesDifferentiator
@@ -31,10 +26,6 @@ __all__ = [
31
26
  "mark_outliers",
32
27
  "manual_outlier_removal",
33
28
  "get_outliers",
34
- "visualize_outliers_hist",
35
- "visualize_outliers_plotly_scatter",
36
- "visualize_ts_plotly",
37
- "visualize_ts_comparison",
38
29
  "custom_weights",
39
30
  "get_missing_weights",
40
31
  "WeightFunction",
@@ -1,14 +1,8 @@
1
- from typing import Optional, Dict, Any
1
+ from typing import Optional, Dict
2
2
 
3
3
  from sklearn.ensemble import IsolationForest
4
4
  import numpy as np
5
5
  import pandas as pd
6
- import matplotlib.pyplot as plt
7
-
8
- try:
9
- import plotly.graph_objects as go
10
- except ImportError:
11
- go = None
12
6
 
13
7
 
14
8
  def mark_outliers(
@@ -192,244 +186,3 @@ def get_outliers(
192
186
  outliers_dict[col] = data.loc[outlier_mask, col]
193
187
 
194
188
  return outliers_dict
195
-
196
-
197
- def visualize_outliers_hist(
198
- data: pd.DataFrame,
199
- data_original: pd.DataFrame,
200
- columns: Optional[list[str]] = None,
201
- contamination: float = 0.01,
202
- random_state: int = 1234,
203
- figsize: tuple[int, int] = (10, 5),
204
- bins: int = 50,
205
- **kwargs: Any,
206
- ) -> None:
207
- """Visualize outliers in DataFrame using stacked histograms.
208
-
209
- Creates a histogram for each specified column, displaying both regular data
210
- and detected outliers in different colors. Uses IsolationForest for outlier
211
- detection.
212
-
213
- Args:
214
- data: The DataFrame with cleaned data (outliers may be NaN).
215
- data_original: The original DataFrame before outlier detection.
216
- columns: List of column names to visualize. If None, all columns are used.
217
- Default: None.
218
- contamination: The estimated proportion of outliers in the dataset.
219
- Default: 0.01.
220
- random_state: Random seed for reproducibility. Default: 1234.
221
- figsize: Figure size as (width, height). Default: (10, 5).
222
- bins: Number of histogram bins. Default: 50.
223
- **kwargs: Additional keyword arguments passed to plt.hist() (e.g., color,
224
- alpha, edgecolor, etc.).
225
-
226
- Returns:
227
- None. Displays matplotlib figures.
228
-
229
- Raises:
230
- ValueError: If data or data_original is empty, or if specified columns
231
- don't exist.
232
- ImportError: If matplotlib is not installed.
233
-
234
- Examples:
235
- >>> import pandas as pd
236
- >>> import numpy as np
237
- >>> from spotforecast2.preprocessing.outlier import visualize_outliers_hist
238
- >>>
239
- >>> # Create sample data
240
- >>> np.random.seed(42)
241
- >>> data_original = pd.DataFrame({
242
- ... 'temperature': np.concatenate([
243
- ... np.random.normal(20, 5, 100),
244
- ... [50, 60, 70] # outliers
245
- ... ]),
246
- ... 'humidity': np.concatenate([
247
- ... np.random.normal(60, 10, 100),
248
- ... [95, 98, 99] # outliers
249
- ... ])
250
- ... })
251
- >>> data_cleaned = data_original.copy()
252
- >>>
253
- >>> # Visualize outliers
254
- >>> visualize_outliers_hist(
255
- ... data_cleaned,
256
- ... data_original,
257
- ... contamination=0.03,
258
- ... figsize=(12, 5),
259
- ... alpha=0.7
260
- ... )
261
- """
262
- if data.empty or data_original.empty:
263
- raise ValueError("Input data is empty")
264
-
265
- columns_to_plot = columns if columns is not None else data.columns
266
-
267
- # Validate columns exist
268
- missing_cols = set(columns_to_plot) - set(data.columns)
269
- if missing_cols:
270
- raise ValueError(f"Columns not found in data: {missing_cols}")
271
-
272
- # Detect outliers
273
- outliers = get_outliers(
274
- data_original,
275
- data_original=data_original,
276
- contamination=contamination,
277
- random_state=random_state,
278
- )
279
-
280
- for col in columns_to_plot:
281
- # Get inliers (non-NaN values in cleaned data)
282
- inliers = data[col].dropna()
283
-
284
- # Get outlier values
285
- outlier_vals = outliers[col]
286
-
287
- # Calculate percentage
288
- pct_outliers = (len(outlier_vals) / len(data_original)) * 100
289
-
290
- # Create figure
291
- plt.figure(figsize=figsize)
292
- plt.hist(
293
- [inliers, outlier_vals],
294
- bins=bins,
295
- stacked=True,
296
- color=["lightgrey", "red"],
297
- label=["Regular Data", "Outliers"],
298
- **kwargs,
299
- )
300
- plt.grid(True, alpha=0.3)
301
- plt.title(f"{col} Distribution with Outliers ({pct_outliers:.2f}%)")
302
- plt.xlabel("Value")
303
- plt.ylabel("Frequency")
304
- plt.legend()
305
- plt.tight_layout()
306
- plt.show()
307
-
308
-
309
- def visualize_outliers_plotly_scatter(
310
- data: pd.DataFrame,
311
- data_original: pd.DataFrame,
312
- columns: Optional[list[str]] = None,
313
- contamination: float = 0.01,
314
- random_state: int = 1234,
315
- **kwargs: Any,
316
- ) -> None:
317
- """Visualize outliers in time series using Plotly scatter plots.
318
-
319
- Creates an interactive time series plot for each specified column, showing
320
- regular data as a line and detected outliers as scatter points. Uses
321
- IsolationForest for outlier detection.
322
-
323
- Args:
324
- data: The DataFrame with cleaned data (outliers may be NaN).
325
- data_original: The original DataFrame before outlier detection.
326
- columns: List of column names to visualize. If None, all columns are used.
327
- Default: None.
328
- contamination: The estimated proportion of outliers in the dataset.
329
- Default: 0.01.
330
- random_state: Random seed for reproducibility. Default: 1234.
331
- **kwargs: Additional keyword arguments passed to go.Figure.update_layout()
332
- (e.g., template, height, etc.).
333
-
334
- Returns:
335
- None. Displays Plotly figures.
336
-
337
- Raises:
338
- ValueError: If data or data_original is empty, or if specified columns
339
- don't exist.
340
- ImportError: If plotly is not installed.
341
-
342
- Examples:
343
- >>> import pandas as pd
344
- >>> import numpy as np
345
- >>> from spotforecast2.preprocessing.outlier import visualize_outliers_plotly_scatter
346
- >>>
347
- >>> # Create sample time series data
348
- >>> np.random.seed(42)
349
- >>> dates = pd.date_range('2024-01-01', periods=103, freq='h')
350
- >>> data_original = pd.DataFrame({
351
- ... 'temperature': np.concatenate([
352
- ... np.random.normal(20, 5, 100),
353
- ... [50, 60, 70] # outliers
354
- ... ]),
355
- ... 'humidity': np.concatenate([
356
- ... np.random.normal(60, 10, 100),
357
- ... [95, 98, 99] # outliers
358
- ... ])
359
- ... }, index=dates)
360
- >>> data_cleaned = data_original.copy()
361
- >>>
362
- >>> # Visualize outliers
363
- >>> visualize_outliers_plotly_scatter(
364
- ... data_cleaned,
365
- ... data_original,
366
- ... contamination=0.03,
367
- ... template='plotly_white'
368
- ... )
369
- """
370
- if go is None:
371
- raise ImportError(
372
- "plotly is required for this function. " "Install with: pip install plotly"
373
- )
374
-
375
- if data.empty or data_original.empty:
376
- raise ValueError("Input data is empty")
377
-
378
- columns_to_plot = columns if columns is not None else data.columns
379
-
380
- # Validate columns exist
381
- missing_cols = set(columns_to_plot) - set(data.columns)
382
- if missing_cols:
383
- raise ValueError(f"Columns not found in data: {missing_cols}")
384
-
385
- # Detect outliers
386
- outliers = get_outliers(
387
- data_original,
388
- data_original=data_original,
389
- contamination=contamination,
390
- random_state=random_state,
391
- )
392
-
393
- for col in columns_to_plot:
394
- fig = go.Figure()
395
-
396
- # Add regular data as line
397
- fig.add_trace(
398
- go.Scatter(
399
- x=data.index,
400
- y=data[col],
401
- mode="lines",
402
- name="Regular Data",
403
- line=dict(color="lightgrey"),
404
- )
405
- )
406
-
407
- # Add outliers as scatter points
408
- outlier_vals = outliers[col]
409
- if not outlier_vals.empty:
410
- fig.add_trace(
411
- go.Scatter(
412
- x=outlier_vals.index,
413
- y=outlier_vals,
414
- mode="markers",
415
- name="Outliers",
416
- marker=dict(color="red", size=8, symbol="x"),
417
- )
418
- )
419
-
420
- # Calculate percentage
421
- pct_outliers = (len(outlier_vals) / len(data_original)) * 100
422
-
423
- # Update layout with custom kwargs
424
- layout_kwargs = {
425
- "title": f"{col} Time Series with Outliers ({pct_outliers:.2f}%)",
426
- "xaxis_title": "Time",
427
- "yaxis_title": "Value",
428
- "template": "plotly_white",
429
- "legend": dict(
430
- orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1
431
- ),
432
- }
433
- layout_kwargs.update(kwargs)
434
- fig.update_layout(**layout_kwargs)
435
- fig.show()
@@ -0,0 +1,107 @@
1
+ Metadata-Version: 2.3
2
+ Name: spotforecast2-safe
3
+ Version: 0.0.2
4
+ Summary: spotforecast2-safe (Core): Safety-critical time series forecasting for production
5
+ Author: bartzbeielstein
6
+ Author-email: bartzbeielstein <32470350+bartzbeielstein@users.noreply.github.com>
7
+ Requires-Dist: astral>=3.2
8
+ Requires-Dist: feature-engine>=1.9.3
9
+ Requires-Dist: flake8>=7.3.0
10
+ Requires-Dist: holidays>=0.90
11
+ Requires-Dist: lightgbm>=4.6.0
12
+ Requires-Dist: numba>=0.63.1
13
+ Requires-Dist: pandas>=3.0.0
14
+ Requires-Dist: pyarrow>=23.0.0
15
+ Requires-Dist: scikit-learn>=1.8.0
16
+ Requires-Dist: tqdm>=4.67.2
17
+ Requires-Dist: pytest>=9.0.2 ; extra == 'dev'
18
+ Requires-Dist: pytest-cov>=6.0.0 ; extra == 'dev'
19
+ Requires-Dist: black>=24.1.0 ; extra == 'dev'
20
+ Requires-Dist: isort>=5.13.0 ; extra == 'dev'
21
+ Requires-Dist: ruff>=0.3.0 ; extra == 'dev'
22
+ Requires-Dist: mkdocs>=1.6.1 ; extra == 'dev'
23
+ Requires-Dist: mkdocs-material>=9.7.1 ; extra == 'dev'
24
+ Requires-Dist: mkdocstrings>=1.0.2 ; extra == 'dev'
25
+ Requires-Dist: mkdocstrings-python>=2.0.1 ; extra == 'dev'
26
+ Requires-Dist: safety>=3.0.0 ; extra == 'dev'
27
+ Requires-Dist: bandit>=1.8.0 ; extra == 'dev'
28
+ Requires-Python: >=3.13
29
+ Project-URL: Documentation, https://sequential-parameter-optimization.github.io/spotforecast2-safe/
30
+ Project-URL: Repository, https://github.com/sequential-parameter-optimization/spotforecast2-safe
31
+ Project-URL: Issues, https://github.com/sequential-parameter-optimization/spotforecast2-safe/issues
32
+ Provides-Extra: dev
33
+ Description-Content-Type: text/markdown
34
+
35
+ <div align="left">
36
+ <img src="logo/spotlogo.png" alt="spotforecast2-safe Logo" width="300">
37
+ </div>
38
+
39
+ # spotforecast2-safe (Core)
40
+
41
+ [![Python Version](https://img.shields.io/badge/python-3.13%2B-blue)](https://www.python.org/downloads/)
42
+ [![EU AI Act](https://img.shields.io/badge/EU%20AI%20Act-Ready-success)](MODEL_CARD.md)
43
+ [![Dependencies](https://img.shields.io/badge/dependencies-minimal-blue)](pyproject.toml)
44
+ [![Audit](https://img.shields.io/badge/audit-whitebox-brightgreen)](MODEL_CARD.md)
45
+ [![License](https://img.shields.io/github/license/sequential-parameter-optimization/spotforecast2-safe)](LICENSE)
46
+
47
+ **Testing & Quality**
48
+
49
+ [![Build Status](https://img.shields.io/github/actions/workflow/status/sequential-parameter-optimization/spotforecast2-safe/ci.yml?branch=main&label=Tests)](https://github.com/sequential-parameter-optimization/spotforecast2-safe/actions/workflows/ci.yml)
50
+ [![Documentation](https://img.shields.io/badge/docs-passing-brightgreen)](https://sequential-parameter-optimization.github.io/spotforecast2-safe/)
51
+ [![Reliability](https://img.shields.io/badge/robustness-fail--safe-orange)](MODEL_CARD.md)
52
+
53
+ **Status**
54
+
55
+ [![Maintenance](https://img.shields.io/badge/maintenance-active-green)](https://github.com/sequential-parameter-optimization/spotforecast2-safe)
56
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
57
+
58
+
59
+
60
+ ## Safety-Critical Design Goals
61
+
62
+ `spotforecast2-safe` is a specialized Python library designed to **facilitate** time series forecasting in safety-critical production environments and embedded systems.
63
+
64
+ Unlike standard machine and dep learning libraries, it follows a strict **"Safety-First"** architecture by design. **However, users must independently verify that these features meet their specific regulatory requirements:**
65
+
66
+ - **Zero Dead Code**: We aim to minimize the attack surface by excluding visualization and training logic.
67
+ - **Deterministic Logic**: The algorithms are designed to be purely mathematical and deterministic.
68
+ - **Fail-Safe Operation**: The system is designed to favor explicit errors over silent failures when encountering invalid data.
69
+ - **EU AI Act Support**: The architecture supports transparency and data governance, helping users build compliant high-risk AI components.
70
+
71
+ For a detailed technical overview of our safety mechanisms, see our **[MODEL_CARD.md](MODEL_CARD.md)**.
72
+
73
+ ## ⚠️ Disclaimer & Liability
74
+
75
+ **IMPORTANT**: This software is provided "as is" and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed.
76
+
77
+ In no event shall the authors, copyright holders, or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.
78
+
79
+ **The use of this software in safety-critical systems is at the sole risk of the user.**
80
+
81
+ ## Attributions
82
+
83
+ Parts of the code are ported from `skforecast` to reduce external dependencies.
84
+ Many thanks to the [skforecast team](https://skforecast.org/0.20.0/more/about-skforecast.html) for their great work!
85
+
86
+ ## Documentation
87
+
88
+ Documentation (API) is available at: [https://sequential-parameter-optimization.github.io/spotforecast2-safe/](https://sequential-parameter-optimization.github.io/spotforecast2-safe/)
89
+
90
+ ## License
91
+
92
+ `spotforecast2-safe` software: [BSD-3-Clause License](LICENSE)
93
+
94
+
95
+ # References
96
+
97
+ ## spotforecast2
98
+
99
+ The "full" version of `spotforecast2-safe`, which is named `spotforecast`, is available at: [https://sequential-parameter-optimization.github.io/spotforecast2/](https://sequential-parameter-optimization.github.io/spotforecast2/)
100
+
101
+ ## skforecast
102
+
103
+ * Amat Rodrigo, J., & Escobar Ortiz, J. (2026). skforecast (Version 0.20.0) [Computer software]. https://doi.org/10.5281/zenodo.8382788
104
+
105
+ ## spotoptim
106
+
107
+ * [spotoptim documentation](https://sequential-parameter-optimization.github.io/spotoptim/)
@@ -5,39 +5,25 @@ spotforecast2_safe/data/fetch_data.py,sha256=q2_f_GGjNWX2sb6aVlCKfOLShcdBTGkyx7r
5
5
  spotforecast2_safe/exceptions.py,sha256=GaEIZMrdx0in3laIxwpB3KcFOovim6KznZt-oE4MfU8,20516
6
6
  spotforecast2_safe/forecaster/__init__.py,sha256=BbCOS2ouKcPC9VzcdprllVyqlZIyAWXCOvUAiInxDi4,140
7
7
  spotforecast2_safe/forecaster/base.py,sha256=_Asa5yCGz4zaMpqcjAuxPy9nnH4P387T24RnYM0dPc8,16755
8
- spotforecast2_safe/forecaster/metrics.py,sha256=MiZs9MAvT5JjPEGEks1uWR0nFuzYucCWuu4bMV_4HPQ,19316
9
8
  spotforecast2_safe/forecaster/recursive/__init__.py,sha256=YNVxLReLEwSFDasmjXXMSKJqNL_Y4lVEZ696UksjVVE,184
10
9
  spotforecast2_safe/forecaster/recursive/_forecaster_equivalent_date.py,sha256=PEu9aCW0UT_gdA0PzGEMijXSQW1Yz1Af57ieRyyjYtI,48252
11
10
  spotforecast2_safe/forecaster/recursive/_forecaster_recursive.py,sha256=uMVNqLTjGytVxq1jgUDhVbot9yvzqQvtucstKuIMAxY,44256
12
11
  spotforecast2_safe/forecaster/recursive/_warnings.py,sha256=BtZ3UoycywjEQ0ceXe4TL1WEdFcLAi1EnDMvZXHw_U8,325
13
12
  spotforecast2_safe/forecaster/utils.py,sha256=uc7jusIzhjVRTH-8kRip6BPiILr-nARUDWUwNaWtPws,38159
14
- spotforecast2_safe/model_selection/__init__.py,sha256=uP60TkgDzs_x5V60rnKanc12S9-yXx2ZLsXsXdqAYEA,208
15
- spotforecast2_safe/model_selection/bayesian_search.py,sha256=94zYTFjlhG5FuMxeR4H1R_s5cAyTrYVYZPE1cBod4L8,17447
16
- spotforecast2_safe/model_selection/grid_search.py,sha256=kK2cS6sZg3nUBEJEPtAkuqxO_AJrh2wwVuRIvMwywOo,11038
17
- spotforecast2_safe/model_selection/random_search.py,sha256=ZaLZo7ibOZUC40JB8ycgLQv3rGWoiSOx3K-FFr1eGUk,6282
18
- spotforecast2_safe/model_selection/split_base.py,sha256=zpIl8CnWhM526GkIT2XlSJ5cQQZTjt2F-E97ycK0sT4,15002
19
- spotforecast2_safe/model_selection/split_one_step.py,sha256=tc3oOkbXxLUXd3mwjo2NVVW3PgbOR7slSQnRxinxAsc,9412
20
- spotforecast2_safe/model_selection/split_ts_cv.py,sha256=pV0eCqTLipC7aBezAvz15zuAJ8dNAPXT0VwpYGKF3_s,29977
21
- spotforecast2_safe/model_selection/utils_common.py,sha256=AujMGU4G3nncQ8Ym_eXPu6IbXCcYq3vgitAEWaRS4kE,31819
22
- spotforecast2_safe/model_selection/utils_metrics.py,sha256=mMVKh03-yAvRjEnZlbg3CsktXNcHo7yiTkI5VMg5wQk,3842
23
- spotforecast2_safe/model_selection/validation.py,sha256=9IU76Hymh6WPqcEunZwOIvYF72LJ-D5HFHfX8GWaht4,30063
24
- spotforecast2_safe/preprocessing/__init__.py,sha256=UkwleNM-ue_YbaCLcYywW-qLqd8SFJ08-qKuv4tbaDs,1212
13
+ spotforecast2_safe/preprocessing/__init__.py,sha256=xbRMD0zEr3hhxfXD-7sOjtdJDdG6LWeOe6-pumkPCU0,918
25
14
  spotforecast2_safe/preprocessing/_binner.py,sha256=2bWGMh_Ytyphxb_5j2VlIT8w3tx24GZs_g53o0Nb390,13848
26
15
  spotforecast2_safe/preprocessing/_common.py,sha256=aP8EIYIg3iBXnijXByHedGEdcubXu-ciRtEgqdDfO_8,3141
27
16
  spotforecast2_safe/preprocessing/_differentiator.py,sha256=otka_TO1edM3zgp16zOjeSKxa61arbmPPsr96_GfgLI,4646
28
17
  spotforecast2_safe/preprocessing/_rolling.py,sha256=eYBOH2QRDbue8MYtitcOFLQS0PMdNi6v9I0nu07XexY,9057
29
18
  spotforecast2_safe/preprocessing/curate_data.py,sha256=4VV8aYwShyrUc9lqWVx_ckIH-moK0B8ONEMb2i463ag,9603
30
19
  spotforecast2_safe/preprocessing/imputation.py,sha256=wXHXcIwWb7_XqW9JdBjaRA7NxWhbKWoQyW5z0KkPLd8,5201
31
- spotforecast2_safe/preprocessing/outlier.py,sha256=SubBnZTXyJM01zSdll__4iCUA5dDwxF5rIXgMe5iOFQ,15144
20
+ spotforecast2_safe/preprocessing/outlier.py,sha256=uXb9QIYmYM4h3e7tZkdGUF1rVl-Df3E__g9IcDCiuE0,6996
32
21
  spotforecast2_safe/preprocessing/split.py,sha256=mzzt5ltUZdVzfWtBBTQjp8E2MyqVdWUFtz7nN11urbU,5011
33
- spotforecast2_safe/preprocessing/time_series_visualization.py,sha256=KBneOjJVE_uajm5v-28GdYhf6vkMCBUreGfl1GQlJAA,27706
34
22
  spotforecast2_safe/processing/__init__.py,sha256=IJ5jTWRvI7V6MCtFpKL1j7tY9VUXwqPiDtfghmfI6Lg,294
35
23
  spotforecast2_safe/processing/agg_predict.py,sha256=4iFGm5leCefnBROcBCfwNrOZ7qFC43NIXZ9TxH6QhrA,2471
36
24
  spotforecast2_safe/processing/n2n_predict.py,sha256=S4TjuAaKZWjHg9thxVSPr0wneZYeAEJ4jiCoiJ-3d_U,15369
37
25
  spotforecast2_safe/processing/n2n_predict_with_covariates.py,sha256=IDoEMOAOOacagJRbNJb1ki64bozNJBprUP9PQyGGe_E,41379
38
26
  spotforecast2_safe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- spotforecast2_safe/stats/__init__.py,sha256=9KVh7ZQD_48AJ0bTNQyYWMT2mBaOrX26W-iA3r-IppE,166
40
- spotforecast2_safe/stats/autocorrelation.py,sha256=5T-GydM5EfBaLU1iM7F8A9bdc__u_0I9zEonQpT-dos,6854
41
27
  spotforecast2_safe/utils/__init__.py,sha256=BSzSzgm10C3h_0qQKSlEtTBtzHD-qjbG9L599Ulx_9c,1043
42
28
  spotforecast2_safe/utils/convert_to_utc.py,sha256=hz8mJUHK9jDLUiN5LdNX5l3KZuOKlklyycB4zFdB9Ng,1405
43
29
  spotforecast2_safe/utils/data_transform.py,sha256=PhLeZoimM0TLfp34Fp56dQrxlCYNWGVU8h8RZHdZSlo,7294
@@ -46,6 +32,6 @@ spotforecast2_safe/utils/generate_holiday.py,sha256=SHaPvPMt-abis95cChHf5ObyPwCT
46
32
  spotforecast2_safe/utils/validation.py,sha256=YfFn4OW-SJeJDioY0opkhY9ISGnZ075KIXdfxlSKlyw,21623
47
33
  spotforecast2_safe/weather/__init__.py,sha256=1Jco88pl0deNESgNATin83Nf5i9c58pxN7G-vNiOiu0,120
48
34
  spotforecast2_safe/weather/weather_client.py,sha256=Ec_ywug6uoa71MfXM8RNbXEvtBtBzr-SUS5xq_HKtZE,9837
49
- spotforecast2_safe-0.0.1.dist-info/WHEEL,sha256=iHtWm8nRfs0VRdCYVXocAWFW8ppjHL-uTJkAdZJKOBM,80
50
- spotforecast2_safe-0.0.1.dist-info/METADATA,sha256=plPc6Nuae8Gt9rv5C-NbjzRv2qJuNfcgQ5amPuedvYw,4073
51
- spotforecast2_safe-0.0.1.dist-info/RECORD,,
35
+ spotforecast2_safe-0.0.2.dist-info/WHEEL,sha256=iHtWm8nRfs0VRdCYVXocAWFW8ppjHL-uTJkAdZJKOBM,80
36
+ spotforecast2_safe-0.0.2.dist-info/METADATA,sha256=saUC8IP6_mxcusND1eyyKk-MPYrz7j-FTpPaSZPkkVs,5779
37
+ spotforecast2_safe-0.0.2.dist-info/RECORD,,