autogluon.timeseries 1.2.1b20250423__py3-none-any.whl → 1.2.1b20250424__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.
@@ -8,11 +8,12 @@ from collections.abc import Iterable
8
8
  from itertools import islice
9
9
  from pathlib import Path
10
10
  from pprint import pformat
11
- from typing import Any, List, Optional, Tuple, Type, Union
11
+ from typing import TYPE_CHECKING, Any, List, Optional, Tuple, Type, Union
12
12
 
13
13
  import pandas as pd
14
14
  from joblib.parallel import Parallel, delayed
15
15
  from pandas.core.internals import ArrayManager, BlockManager # type: ignore
16
+ from typing_extensions import Self, overload
16
17
 
17
18
  from autogluon.common.loaders import load_pd
18
19
 
@@ -1029,7 +1030,11 @@ class TimeSeriesDataFrame(pd.DataFrame):
1029
1030
 
1030
1031
  # Resampling time for 1 item < overhead time for a single parallel job. Therefore, we group items into chunks
1031
1032
  # so that the speedup from parallelization isn't dominated by the communication costs.
1032
- chunks = split_into_chunks(pd.DataFrame(self).groupby(level=ITEMID, sort=False), chunk_size)
1033
+ df = pd.DataFrame(self)
1034
+ # Make sure that timestamp index has dtype 'datetime64[ns]', otherwise index may contain NaT values.
1035
+ # See https://github.com/autogluon/autogluon/issues/4917
1036
+ df.index = df.index.set_levels(df.index.levels[1].astype("datetime64[ns]"), level=TIMESTAMP)
1037
+ chunks = split_into_chunks(df.groupby(level=ITEMID, sort=False), chunk_size)
1033
1038
  resampled_chunks = Parallel(n_jobs=num_cpus)(delayed(resample_chunk)(chunk) for chunk in chunks)
1034
1039
  resampled_df = TimeSeriesDataFrame(pd.concat(resampled_chunks))
1035
1040
  resampled_df.static_features = self.static_features
@@ -1038,3 +1043,13 @@ class TimeSeriesDataFrame(pd.DataFrame):
1038
1043
  def to_data_frame(self) -> pd.DataFrame:
1039
1044
  """Convert `TimeSeriesDataFrame` to a `pandas.DataFrame`"""
1040
1045
  return pd.DataFrame(self)
1046
+
1047
+ if TYPE_CHECKING:
1048
+
1049
+ @overload
1050
+ def __new__(cls, data: pd.DataFrame, static_features: Optional[pd.DataFrame] = None) -> Self: ... # type: ignore
1051
+
1052
+ @overload
1053
+ def __getitem__(self, items: List[str]) -> Self: ... # type: ignore
1054
+ @overload
1055
+ def __getitem__(self, item: str) -> pd.Series: ... # type: ignore
@@ -305,15 +305,32 @@ class TimeSeriesPredictor:
305
305
  df = df.convert_frequency(freq=self.freq)
306
306
  return df
307
307
 
308
- def _check_data_for_evaluation(self, data: TimeSeriesDataFrame, name: str = "data") -> None:
309
- """Make sure that provided evaluation data includes both historical and future time series values."""
310
- if data.num_timesteps_per_item().min() <= self.prediction_length:
308
+ def _check_and_prepare_data_frame_for_evaluation(
309
+ self, data: TimeSeriesDataFrame, cutoff: Optional[int] = None, name: str = "data"
310
+ ) -> TimeSeriesDataFrame:
311
+ """
312
+ Make sure that provided evaluation data includes both historical and future time series values.
313
+ Slices the dataframe based on cutoff, if needed.
314
+ """
315
+ cutoff = -1 * self.prediction_length if cutoff is None else cutoff
316
+ if not (isinstance(cutoff, int) and cutoff <= -self.prediction_length):
317
+ raise ValueError(f"`cutoff` should be a negative integer <= -prediction_length, got: {cutoff=}")
318
+
319
+ expected_length = -cutoff
320
+
321
+ if data.num_timesteps_per_item().min() <= expected_length:
322
+ var_name = "-cutoff" if expected_length > self.prediction_length else "prediction_length"
311
323
  raise ValueError(
312
- f"Cannot reserve last prediction_length={self.prediction_length} time steps for evaluation in some "
324
+ f"Cannot reserve last {expected_length} time steps for evaluation in some "
313
325
  f"time series in {name}. Please make sure that {name} includes both historical and future data, and that"
314
- f"all time series have length > prediction_length (at least {self.prediction_length + 1})"
326
+ f"all time series have length > {var_name} (at least {expected_length + 1})"
315
327
  )
316
328
 
329
+ if cutoff < -self.prediction_length:
330
+ data = data.slice_by_timestep(None, cutoff + self.prediction_length)
331
+
332
+ return data
333
+
317
334
  def _get_dataset_stats(self, data: TimeSeriesDataFrame) -> str:
318
335
  ts_lengths = data.num_timesteps_per_item()
319
336
  median_length = ts_lengths.median()
@@ -701,7 +718,7 @@ class TimeSeriesPredictor:
701
718
 
702
719
  if tuning_data is not None:
703
720
  tuning_data = self._check_and_prepare_data_frame(tuning_data, name="tuning_data")
704
- self._check_data_for_evaluation(tuning_data, name="tuning_data")
721
+ tuning_data = self._check_and_prepare_data_frame_for_evaluation(tuning_data, name="tuning_data")
705
722
  logger.info(f"Provided tuning_data has {self._get_dataset_stats(tuning_data)}")
706
723
  # TODO: Use num_val_windows to perform multi-window backtests on tuning_data
707
724
  if num_val_windows > 0:
@@ -846,6 +863,7 @@ class TimeSeriesPredictor:
846
863
  data: Union[TimeSeriesDataFrame, pd.DataFrame, Path, str],
847
864
  model: Optional[str] = None,
848
865
  metrics: Optional[Union[str, TimeSeriesScorer, List[Union[str, TimeSeriesScorer]]]] = None,
866
+ cutoff: Optional[int] = None,
849
867
  display: bool = False,
850
868
  use_cache: bool = True,
851
869
  ) -> Dict[str, float]:
@@ -863,11 +881,13 @@ class TimeSeriesPredictor:
863
881
  Parameters
864
882
  ----------
865
883
  data : Union[TimeSeriesDataFrame, pd.DataFrame, Path, str]
866
- The data to evaluate the best model on. The last ``prediction_length`` time steps of each time series in
867
- ``data`` will be held out for prediction and forecast accuracy will be calculated on these time steps.
884
+ The data to evaluate the best model on. If a ``cutoff`` is not provided, the last ``prediction_length``
885
+ time steps of each time series in ``data`` will be held out for prediction and forecast accuracy will
886
+ be calculated on these time steps. When a ``cutoff`` is provided, the ``-cutoff``-th to the
887
+ ``-cutoff + prediction_length``-th time steps of each time series are used for evaluation.
868
888
 
869
889
  Must include both historical and future data (i.e., length of all time series in ``data`` must be at least
870
- ``prediction_length + 1``).
890
+ ``prediction_length + 1``, if ``cutoff`` is not provided, ``-cutoff + 1`` otherwise).
871
891
 
872
892
  The names and dtypes of columns and static features in ``data`` must match the ``train_data`` used to train
873
893
  the predictor.
@@ -880,6 +900,11 @@ class TimeSeriesPredictor:
880
900
  metrics : str, TimeSeriesScorer or List[Union[str, TimeSeriesScorer]], optional
881
901
  Metric or a list of metrics to compute scores with. Defaults to ``self.eval_metric``. Supports both
882
902
  metric names as strings and custom metrics based on TimeSeriesScorer.
903
+ cutoff : int, optional
904
+ A *negative* integer less than or equal to ``-1 * prediction_length`` denoting the time step in ``data``
905
+ where the forecast evaluation starts, i.e., time series are evaluated from the ``-cutoff``-th to the
906
+ ``-cutoff + prediction_length``-th time step. Defaults to ``-1 * prediction_length``, using the last
907
+ ``prediction_length`` time steps of each time series for evaluation.
883
908
  display : bool, default = False
884
909
  If True, the scores will be printed.
885
910
  use_cache : bool, default = True
@@ -893,8 +918,10 @@ class TimeSeriesPredictor:
893
918
  will have their signs flipped to obey this convention. For example, negative MAPE values will be reported.
894
919
  To get the ``eval_metric`` score, do ``output[predictor.eval_metric.name]``.
895
920
  """
921
+
896
922
  data = self._check_and_prepare_data_frame(data)
897
- self._check_data_for_evaluation(data)
923
+ data = self._check_and_prepare_data_frame_for_evaluation(data, cutoff=cutoff)
924
+
898
925
  scores_dict = self._learner.evaluate(data, model=model, metrics=metrics, use_cache=use_cache)
899
926
  if display:
900
927
  logger.info("Evaluations on test data:")
@@ -1010,7 +1037,7 @@ class TimeSeriesPredictor:
1010
1037
  """
1011
1038
  if data is not None:
1012
1039
  data = self._check_and_prepare_data_frame(data)
1013
- self._check_data_for_evaluation(data)
1040
+ data = self._check_and_prepare_data_frame_for_evaluation(data)
1014
1041
 
1015
1042
  fi_df = self._learner.get_feature_importance(
1016
1043
  data=data,
@@ -1188,6 +1215,7 @@ class TimeSeriesPredictor:
1188
1215
  def leaderboard(
1189
1216
  self,
1190
1217
  data: Optional[Union[TimeSeriesDataFrame, pd.DataFrame, Path, str]] = None,
1218
+ cutoff: Optional[int] = None,
1191
1219
  extra_info: bool = False,
1192
1220
  extra_metrics: Optional[List[Union[str, TimeSeriesScorer]]] = None,
1193
1221
  display: bool = False,
@@ -1216,13 +1244,19 @@ class TimeSeriesPredictor:
1216
1244
  ----------
1217
1245
  data : Union[TimeSeriesDataFrame, pd.DataFrame, Path, str], optional
1218
1246
  dataset used for additional evaluation. Must include both historical and future data (i.e., length of all
1219
- time series in ``data`` must be at least ``prediction_length + 1``).
1247
+ time series in ``data`` must be at least ``prediction_length + 1``, if ``cutoff`` is not provided,
1248
+ ``-cutoff + 1`` otherwise).
1220
1249
 
1221
1250
  The names and dtypes of columns and static features in ``data`` must match the ``train_data`` used to train
1222
1251
  the predictor.
1223
1252
 
1224
1253
  If provided data is a `pandas.DataFrame`, AutoGluon will attempt to convert it to a `TimeSeriesDataFrame`.
1225
1254
  If a `str` or a `Path` is provided, AutoGluon will attempt to load this file.
1255
+ cutoff : int, optional
1256
+ A *negative* integer less than or equal to ``-1 * prediction_length`` denoting the time step in ``data``
1257
+ where the forecast evaluation starts, i.e., time series are evaluated from the ``-cutoff``-th to the
1258
+ ``-cutoff + prediction_length``-th time step. Defaults to ``-1 * prediction_length``, using the last
1259
+ ``prediction_length`` time steps of each time series for evaluation.
1226
1260
  extra_info : bool, default = False
1227
1261
  If True, the leaderboard will contain an additional column `hyperparameters` with the hyperparameters used
1228
1262
  by each model during training. An empty dictionary `{}` means that the model was trained with default
@@ -1258,10 +1292,12 @@ class TimeSeriesPredictor:
1258
1292
  raise TypeError(f"TimeSeriesPredictor.leaderboard() got an unexpected keyword argument '{key}'")
1259
1293
  if data is None and extra_metrics is not None:
1260
1294
  raise ValueError("`extra_metrics` is only valid when `data` is specified.")
1295
+ if data is None and cutoff is not None:
1296
+ raise ValueError("`cutoff` is only valid when `data` is specified.")
1261
1297
 
1262
1298
  if data is not None:
1263
1299
  data = self._check_and_prepare_data_frame(data)
1264
- self._check_data_for_evaluation(data)
1300
+ data = self._check_and_prepare_data_frame_for_evaluation(data, cutoff=cutoff)
1265
1301
 
1266
1302
  leaderboard = self._learner.leaderboard(
1267
1303
  data, extra_info=extra_info, extra_metrics=extra_metrics, use_cache=use_cache
@@ -1430,7 +1466,7 @@ class TimeSeriesPredictor:
1430
1466
  return cast(TimeSeriesDataFrame, ts_df[[self.target]])
1431
1467
 
1432
1468
  test_data = self._check_and_prepare_data_frame(test_data)
1433
- self._check_data_for_evaluation(test_data, name="test_data")
1469
+ test_data = self._check_and_prepare_data_frame_for_evaluation(test_data, name="test_data")
1434
1470
  test_data = self._learner.feature_generator.transform(test_data)
1435
1471
 
1436
1472
  trainer = self._trainer
@@ -398,7 +398,7 @@ class AbstractFeatureImportanceTransform:
398
398
  """Transforms a series with the same index as the pandas DataFrame"""
399
399
  raise NotImplementedError
400
400
 
401
- def _transform_series(self, feature_data: pd.Series, is_categorical: bool) -> TimeSeriesDataFrame:
401
+ def _transform_series(self, feature_data: pd.Series, is_categorical: bool) -> pd.Series:
402
402
  """Transforms a series with the same index as the pandas DataFrame"""
403
403
  raise NotImplementedError
404
404
 
@@ -420,6 +420,7 @@ class AbstractFeatureImportanceTransform:
420
420
  with warning_filter():
421
421
  data[feature_name].update(self._transform_series(feature_data, is_categorical=is_categorical))
422
422
  elif feature_name in self.covariate_metadata.static_features:
423
+ assert data.static_features is not None
423
424
  feature_data = data.static_features[feature_name].copy()
424
425
  feature_data.reset_index(drop=True, inplace=True)
425
426
  data.static_features[feature_name] = self._transform_static_series(
@@ -459,6 +460,8 @@ class PermutationFeatureImportanceTransform(AbstractFeatureImportanceTransform):
459
460
  )
460
461
  elif self.shuffle_type == "naive":
461
462
  return pd.Series(feature_data.sample(frac=1, random_state=rng).values, index=feature_data.index)
463
+ else:
464
+ raise ValueError(f"Unknown shuffle_type: {self.shuffle_type}")
462
465
 
463
466
 
464
467
  class ConstantReplacementFeatureImportanceTransform(AbstractFeatureImportanceTransform):
@@ -57,7 +57,7 @@ def disable_tqdm():
57
57
  from tqdm import tqdm
58
58
 
59
59
  _init = tqdm.__init__
60
- tqdm.__init__ = functools.partialmethod(tqdm.__init__, disable=True)
60
+ tqdm.__init__ = functools.partialmethod(tqdm.__init__, disable=True) # type: ignore
61
61
  yield
62
62
  except ImportError:
63
63
  yield
@@ -1,4 +1,4 @@
1
1
  """This is the autogluon version file."""
2
2
 
3
- __version__ = "1.2.1b20250423"
3
+ __version__ = "1.2.1b20250424"
4
4
  __lite__ = False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: autogluon.timeseries
3
- Version: 1.2.1b20250423
3
+ Version: 1.2.1b20250424
4
4
  Summary: Fast and Accurate ML in 3 Lines of Code
5
5
  Home-page: https://github.com/autogluon/autogluon
6
6
  Author: AutoGluon Community
@@ -55,9 +55,10 @@ Requires-Dist: fugue>=0.9.0
55
55
  Requires-Dist: tqdm<5,>=4.38
56
56
  Requires-Dist: orjson~=3.9
57
57
  Requires-Dist: tensorboard<3,>=2.9
58
- Requires-Dist: autogluon.core[raytune]==1.2.1b20250423
59
- Requires-Dist: autogluon.common==1.2.1b20250423
60
- Requires-Dist: autogluon.tabular[catboost,lightgbm,xgboost]==1.2.1b20250423
58
+ Requires-Dist: autogluon.core[raytune]==1.2.1b20250424
59
+ Requires-Dist: autogluon.common==1.2.1b20250424
60
+ Requires-Dist: autogluon.features==1.2.1b20250424
61
+ Requires-Dist: autogluon.tabular[catboost,lightgbm,xgboost]==1.2.1b20250424
61
62
  Provides-Extra: all
62
63
  Provides-Extra: chronos-onnx
63
64
  Requires-Dist: optimum[onnxruntime]<1.23,>=1.17; extra == "chronos-onnx"
@@ -1,16 +1,16 @@
1
- autogluon.timeseries-1.2.1b20250423-py3.9-nspkg.pth,sha256=cQGwpuGPqg1GXscIwt-7PmME1OnSpD-7ixkikJ31WAY,554
1
+ autogluon.timeseries-1.2.1b20250424-py3.9-nspkg.pth,sha256=cQGwpuGPqg1GXscIwt-7PmME1OnSpD-7ixkikJ31WAY,554
2
2
  autogluon/timeseries/__init__.py,sha256=_CrLLc1fkjen7UzWoO0Os8WZoHOgvZbHKy46I8v_4k4,304
3
3
  autogluon/timeseries/evaluator.py,sha256=l642tYfTHsl8WVIq_vV6qhgAFVFr9UuZD7gLra3A_Kc,250
4
4
  autogluon/timeseries/learner.py,sha256=7dqSHKCIX2osjv9cmWWLwaGvdrPvla0HTnsR75bdenY,14112
5
- autogluon/timeseries/predictor.py,sha256=eklp1Qils6f4vIex8KhLD6nVsUQwZ6Jt9UKkTsSyErM,85739
5
+ autogluon/timeseries/predictor.py,sha256=AIgThzVtqjytEbNZjKM5SdmDJ3PtD-4hyjGBWnI2ot8,88012
6
6
  autogluon/timeseries/regressor.py,sha256=xw5VPrXS-NQ_Ts4ppDjoNV0TdqUYjW4VINUtb_BZdiI,11868
7
7
  autogluon/timeseries/splitter.py,sha256=yzPca9p2bWV-_VJAptUyyzQsxu-uixAdpMoGQtDzMD4,3205
8
8
  autogluon/timeseries/trainer.py,sha256=-8UBCe_uzwOoMk8wHgVEEhN7mN2biumUzGrf5YY6n4w,58131
9
- autogluon/timeseries/version.py,sha256=5cHaVBGEbXKlEyQMJ8g3TzPJ5O8xRFYaKM8gVl6YgvE,91
9
+ autogluon/timeseries/version.py,sha256=loINeigkP0uoD8mSz8xCUY3ZkGa6XAO4_zkczMDg1so,91
10
10
  autogluon/timeseries/configs/__init__.py,sha256=BTtHIPCYeGjqgOcvqb8qPD4VNX-ICKOg6wnkew1cPOE,98
11
11
  autogluon/timeseries/configs/presets_configs.py,sha256=cLat8ecLlWrI-SC5KLBDCX2SbVXaucemy2pjxJAtSY0,2543
12
12
  autogluon/timeseries/dataset/__init__.py,sha256=UvnhAN5tjgxXTHoZMQDy64YMDj4Xxa68yY7NP4vAw0o,81
13
- autogluon/timeseries/dataset/ts_dataframe.py,sha256=uX639T0zD6DDmsO4PbCY_X2gI_4M95Gf4oYCy4etGhk,47169
13
+ autogluon/timeseries/dataset/ts_dataframe.py,sha256=K-rC4pgy-QjPf3WBgpqxTLsxbmJeWb0Su_1C5wiOx3I,47873
14
14
  autogluon/timeseries/metrics/__init__.py,sha256=dJCrZ2cHwqhqNctwQjwG-FHgGUmzIFT-D0z72f4RAVM,2104
15
15
  autogluon/timeseries/metrics/abstract.py,sha256=CHUZB6xt9oF9yijSOjgGtjLuKo2X0mT6dQDuwg4ZzpU,8192
16
16
  autogluon/timeseries/metrics/point.py,sha256=2nlieQcPBCI9hXMT3v0Oe802ykZDuzvEtDpunzt0IVA,15785
@@ -52,19 +52,19 @@ autogluon/timeseries/transforms/__init__.py,sha256=fkFc4Q1Dlh0vVRgO7nPD7BgNL9dOk
52
52
  autogluon/timeseries/transforms/covariate_scaler.py,sha256=G56PTHKqCFKiXRKLkLun7mN3-T09jxN-5oI1ISADJdQ,7042
53
53
  autogluon/timeseries/transforms/target_scaler.py,sha256=BeT1aP51Wq9EidxC0dVg6dHvampKafpG1uKu4ZaaJPs,6050
54
54
  autogluon/timeseries/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- autogluon/timeseries/utils/features.py,sha256=IahkFgY3zzBqldrBtx4WTmxhUTb1CklZQA8RbTOzc48,22527
55
+ autogluon/timeseries/utils/features.py,sha256=7gyRkuD2sMwJivF6O_bW7kADJBnCbBM055CnwkoU94I,22658
56
56
  autogluon/timeseries/utils/forecast.py,sha256=vd0Y5YsHU6awu4E7xyDXQGe21P1aB26gwFsA3m09mKw,2197
57
- autogluon/timeseries/utils/warning_filters.py,sha256=FyXvYW_ylULcZP4R9xNBxojKtvadW3uygXwHK_xHq5g,2522
57
+ autogluon/timeseries/utils/warning_filters.py,sha256=tHvhj9y7c3MP6JrjAedc7UiFFw0_mKYziDQupw8NhiQ,2538
58
58
  autogluon/timeseries/utils/datetime/__init__.py,sha256=bTMR8jLh1LW55vHjbOr1zvWRMF_PqbvxpS-cUcNIDWI,173
59
59
  autogluon/timeseries/utils/datetime/base.py,sha256=3NdsH3NDq4cVAOSoy3XpaNixyNlbjy4DJ_YYOGuu9x4,1341
60
60
  autogluon/timeseries/utils/datetime/lags.py,sha256=gQDk5_zmsY5DUWDUpSaCKYkQ9nHKKY-LsywJQRAoYSk,5988
61
61
  autogluon/timeseries/utils/datetime/seasonality.py,sha256=YK_2k8hvYIMW-sJPnjGWRtCnvIOthwA2hATB3nwVoD4,834
62
62
  autogluon/timeseries/utils/datetime/time_features.py,sha256=MjLi3zQ00uWWJtXH9oGX2GJkTbvjdSiuabSa4kcVuxE,2672
63
- autogluon.timeseries-1.2.1b20250423.dist-info/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142
64
- autogluon.timeseries-1.2.1b20250423.dist-info/METADATA,sha256=vs0Qvp4NFtgEq_tw4OkGPvAwv8EPGJWseJ7StCv_cU4,12687
65
- autogluon.timeseries-1.2.1b20250423.dist-info/NOTICE,sha256=7nPQuj8Kp-uXsU0S5so3-2dNU5EctS5hDXvvzzehd7E,114
66
- autogluon.timeseries-1.2.1b20250423.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
67
- autogluon.timeseries-1.2.1b20250423.dist-info/namespace_packages.txt,sha256=giERA4R78OkJf2ijn5slgjURlhRPzfLr7waIcGkzYAo,10
68
- autogluon.timeseries-1.2.1b20250423.dist-info/top_level.txt,sha256=giERA4R78OkJf2ijn5slgjURlhRPzfLr7waIcGkzYAo,10
69
- autogluon.timeseries-1.2.1b20250423.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
70
- autogluon.timeseries-1.2.1b20250423.dist-info/RECORD,,
63
+ autogluon.timeseries-1.2.1b20250424.dist-info/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142
64
+ autogluon.timeseries-1.2.1b20250424.dist-info/METADATA,sha256=UAKQzIEQ7dyWUtNzTZez2aSAa2tvwpMflldTFzY4hOw,12737
65
+ autogluon.timeseries-1.2.1b20250424.dist-info/NOTICE,sha256=7nPQuj8Kp-uXsU0S5so3-2dNU5EctS5hDXvvzzehd7E,114
66
+ autogluon.timeseries-1.2.1b20250424.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
67
+ autogluon.timeseries-1.2.1b20250424.dist-info/namespace_packages.txt,sha256=giERA4R78OkJf2ijn5slgjURlhRPzfLr7waIcGkzYAo,10
68
+ autogluon.timeseries-1.2.1b20250424.dist-info/top_level.txt,sha256=giERA4R78OkJf2ijn5slgjURlhRPzfLr7waIcGkzYAo,10
69
+ autogluon.timeseries-1.2.1b20250424.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
70
+ autogluon.timeseries-1.2.1b20250424.dist-info/RECORD,,