autogluon.timeseries 1.1.0b20240410__py3-none-any.whl → 1.1.0b20240412__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.

Potentially problematic release.


This version of autogluon.timeseries might be problematic. Click here for more details.

Files changed (25) hide show
  1. autogluon/timeseries/dataset/ts_dataframe.py +9 -9
  2. autogluon/timeseries/learner.py +8 -3
  3. autogluon/timeseries/models/abstract/abstract_timeseries_model.py +1 -1
  4. autogluon/timeseries/models/autogluon_tabular/mlforecast.py +3 -22
  5. autogluon/timeseries/models/chronos/model.py +1 -1
  6. autogluon/timeseries/models/gluonts/abstract_gluonts.py +4 -31
  7. autogluon/timeseries/models/gluonts/torch/models.py +1 -1
  8. autogluon/timeseries/models/local/abstract_local_model.py +1 -1
  9. autogluon/timeseries/predictor.py +2 -2
  10. autogluon/timeseries/utils/datetime/base.py +38 -20
  11. autogluon/timeseries/utils/datetime/lags.py +13 -12
  12. autogluon/timeseries/utils/datetime/seasonality.py +11 -11
  13. autogluon/timeseries/utils/datetime/time_features.py +12 -11
  14. autogluon/timeseries/utils/features.py +4 -1
  15. autogluon/timeseries/utils/forecast.py +7 -2
  16. autogluon/timeseries/version.py +1 -1
  17. {autogluon.timeseries-1.1.0b20240410.dist-info → autogluon.timeseries-1.1.0b20240412.dist-info}/METADATA +6 -6
  18. {autogluon.timeseries-1.1.0b20240410.dist-info → autogluon.timeseries-1.1.0b20240412.dist-info}/RECORD +25 -25
  19. /autogluon.timeseries-1.1.0b20240410-py3.8-nspkg.pth → /autogluon.timeseries-1.1.0b20240412-py3.8-nspkg.pth +0 -0
  20. {autogluon.timeseries-1.1.0b20240410.dist-info → autogluon.timeseries-1.1.0b20240412.dist-info}/LICENSE +0 -0
  21. {autogluon.timeseries-1.1.0b20240410.dist-info → autogluon.timeseries-1.1.0b20240412.dist-info}/NOTICE +0 -0
  22. {autogluon.timeseries-1.1.0b20240410.dist-info → autogluon.timeseries-1.1.0b20240412.dist-info}/WHEEL +0 -0
  23. {autogluon.timeseries-1.1.0b20240410.dist-info → autogluon.timeseries-1.1.0b20240412.dist-info}/namespace_packages.txt +0 -0
  24. {autogluon.timeseries-1.1.0b20240410.dist-info → autogluon.timeseries-1.1.0b20240412.dist-info}/top_level.txt +0 -0
  25. {autogluon.timeseries-1.1.0b20240410.dist-info → autogluon.timeseries-1.1.0b20240412.dist-info}/zip-safe +0 -0
@@ -134,7 +134,7 @@ class TimeSeriesDataFrame(pd.DataFrame, TimeSeriesDataFrameDeprecatedMixin):
134
134
  ----------
135
135
  freq : str
136
136
  A pandas-compatible string describing the frequency of the time series. For example ``"D"`` for daily data,
137
- ``"H"`` for hourly data, etc. This attribute is determined automatically based on the timestamps. For the full
137
+ ``"h"`` for hourly data, etc. This attribute is determined automatically based on the timestamps. For the full
138
138
  list of possible values, see `pandas documentation <https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases>`_.
139
139
  num_items : int
140
140
  Number of items (time series) in the data set.
@@ -759,12 +759,6 @@ class TimeSeriesDataFrame(pd.DataFrame, TimeSeriesDataFrameDeprecatedMixin):
759
759
  2019-02-07 4.0
760
760
 
761
761
  """
762
- if self.freq is None:
763
- raise ValueError(
764
- "Please make sure that all time series have a regular index before calling `fill_missing_values`"
765
- "(for example, using the `convert_frequency` method)."
766
- )
767
-
768
762
  # Convert to pd.DataFrame for faster processing
769
763
  df = pd.DataFrame(self)
770
764
 
@@ -772,6 +766,12 @@ class TimeSeriesDataFrame(pd.DataFrame, TimeSeriesDataFrameDeprecatedMixin):
772
766
  if not df.isna().any(axis=None):
773
767
  return self
774
768
 
769
+ if not self.index.is_monotonic_increasing:
770
+ logger.warning(
771
+ "Trying to fill missing values in an unsorted dataframe. "
772
+ "It is highly recommended to call `ts_df.sort_index()` before calling `ts_df.fill_missing_values()`"
773
+ )
774
+
775
775
  grouped_df = df.groupby(level=ITEMID, sort=False, group_keys=False)
776
776
  if method == "auto":
777
777
  filled_df = grouped_df.ffill()
@@ -961,12 +961,12 @@ class TimeSeriesDataFrame(pd.DataFrame, TimeSeriesDataFrameDeprecatedMixin):
961
961
  2021-06-30 6.0
962
962
  2021-09-30 7.0
963
963
  2021-12-31 8.0
964
- >>> ts_df.convert_frequency("Y")
964
+ >>> ts_df.convert_frequency("YE")
965
965
  target
966
966
  item_id timestamp
967
967
  0 2020-12-31 2.5
968
968
  2021-12-31 6.5
969
- >>> ts_df.convert_frequency("Y", agg_numeric="sum")
969
+ >>> ts_df.convert_frequency("YE", agg_numeric="sum")
970
970
  target
971
971
  item_id timestamp
972
972
  0 2020-12-31 10.0
@@ -43,6 +43,7 @@ class TimeSeriesLearner(AbstractLearner):
43
43
  self.prediction_length = prediction_length
44
44
  self.quantile_levels = kwargs.get("quantile_levels", [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
45
45
  self.cache_predictions = cache_predictions
46
+ self.freq: Optional[str] = None
46
47
 
47
48
  self.feature_generator = TimeSeriesFeatureGenerator(
48
49
  target=self.target, known_covariates_names=self.known_covariates_names
@@ -87,6 +88,8 @@ class TimeSeriesLearner(AbstractLearner):
87
88
  if val_data is not None:
88
89
  val_data = self.feature_generator.transform(val_data, data_frame_name="tuning_data")
89
90
 
91
+ self.freq = train_data.freq
92
+
90
93
  trainer_init_kwargs = kwargs.copy()
91
94
  trainer_init_kwargs.update(
92
95
  dict(
@@ -155,7 +158,9 @@ class TimeSeriesLearner(AbstractLearner):
155
158
  f"known_covariates are missing information for the following item_ids: {reprlib.repr(missing_item_ids.to_list())}."
156
159
  )
157
160
 
158
- forecast_index = get_forecast_horizon_index_ts_dataframe(data, prediction_length=self.prediction_length)
161
+ forecast_index = get_forecast_horizon_index_ts_dataframe(
162
+ data, prediction_length=self.prediction_length, freq=self.freq
163
+ )
159
164
  try:
160
165
  known_covariates = known_covariates.loc[forecast_index]
161
166
  except KeyError:
@@ -245,8 +250,8 @@ class TimeSeriesLearner(AbstractLearner):
245
250
  raise ValueError(f"Feature {fn} not found in covariate metadata or the dataset.")
246
251
 
247
252
  if len(set(features)) < len(features):
248
- logger.warning(
249
- "Duplicate feature names provided to compute feature importance. This will lead to unexpected behavior. "
253
+ raise ValueError(
254
+ "Duplicate feature names provided to compute feature importance. "
250
255
  "Please provide unique feature names across both static features and covariates."
251
256
  )
252
257
 
@@ -31,7 +31,7 @@ class AbstractTimeSeriesModel(AbstractModel):
31
31
  If None, a new unique time-stamped directory is chosen.
32
32
  freq: str
33
33
  Frequency string (cf. gluonts frequency strings) describing the frequency
34
- of the time series data. For example, "H" for hourly or "D" for daily data.
34
+ of the time series data. For example, "h" for hourly or "D" for daily data.
35
35
  prediction_length: int
36
36
  Length of the prediction horizon, i.e., the number of time steps the model
37
37
  is fit to forecast.
@@ -174,21 +174,6 @@ class AbstractMLForecastModel(AbstractTimeSeriesModel):
174
174
  """
175
175
  return df
176
176
 
177
- def _add_scale_as_static_feature(self, data: TimeSeriesDataFrame) -> TimeSeriesDataFrame:
178
- """Add mean/std of the target column for each series as a static feature."""
179
- data = data.copy(deep=False)
180
- scale_features = (
181
- data[self.target]
182
- .groupby(ITEMID, sort=False)
183
- .agg(["mean", "std"])
184
- .rename(columns={"mean": "__target_mean", "std": "__target_scale"})
185
- )
186
- if data.static_features is None:
187
- data.static_features = scale_features
188
- else:
189
- data.static_features = pd.concat([data.static_features, scale_features], axis=1)
190
- return data
191
-
192
177
  @staticmethod
193
178
  def _shorten_all_series(mlforecast_df: pd.DataFrame, max_length: int):
194
179
  logger.debug(f"Shortening all series to at most {max_length}")
@@ -285,8 +270,6 @@ class AbstractMLForecastModel(AbstractTimeSeriesModel):
285
270
  ) -> None:
286
271
  from mlforecast import MLForecast
287
272
 
288
- train_data = self._add_scale_as_static_feature(train_data)
289
-
290
273
  self._check_fit_params()
291
274
  fit_start_time = time.time()
292
275
  self._train_target_median = train_data[self.target].median()
@@ -485,7 +468,6 @@ class DirectTabularModel(AbstractMLForecastModel):
485
468
  known_covariates: Optional[TimeSeriesDataFrame] = None,
486
469
  **kwargs,
487
470
  ) -> TimeSeriesDataFrame:
488
- data = self._add_scale_as_static_feature(data)
489
471
  original_item_id_order = data.item_ids
490
472
  data, known_covariates, forecast_for_short_series = self._remove_short_ts_and_generate_fallback_forecast(
491
473
  data=data, known_covariates=known_covariates
@@ -497,12 +479,12 @@ class DirectTabularModel(AbstractMLForecastModel):
497
479
  if known_covariates is not None:
498
480
  data_future = known_covariates.copy()
499
481
  else:
500
- future_index = get_forecast_horizon_index_ts_dataframe(data, self.prediction_length)
482
+ future_index = get_forecast_horizon_index_ts_dataframe(data, self.prediction_length, freq=self.freq)
501
483
  data_future = pd.DataFrame(columns=[self.target], index=future_index, dtype="float32")
502
484
  # MLForecast raises exception of target contains NaN. We use inf as placeholder, replace them by NaN afterwards
503
485
  data_future[self.target] = float("inf")
504
486
  data_extended = pd.concat([data, data_future])
505
- mlforecast_df = self._to_mlforecast_df(data_extended, data_extended.static_features)
487
+ mlforecast_df = self._to_mlforecast_df(data_extended, data.static_features)
506
488
  if self._max_ts_length is not None:
507
489
  # We appended `prediction_length` time steps to each series, so increase length
508
490
  mlforecast_df = self._shorten_all_series(mlforecast_df, self._max_ts_length + self.prediction_length)
@@ -617,7 +599,6 @@ class RecursiveTabularModel(AbstractMLForecastModel):
617
599
  known_covariates: Optional[TimeSeriesDataFrame] = None,
618
600
  **kwargs,
619
601
  ) -> TimeSeriesDataFrame:
620
- data = self._add_scale_as_static_feature(data)
621
602
  original_item_id_order = data.item_ids
622
603
  data, known_covariates, forecast_for_short_series = self._remove_short_ts_and_generate_fallback_forecast(
623
604
  data=data, known_covariates=known_covariates
@@ -630,7 +611,7 @@ class RecursiveTabularModel(AbstractMLForecastModel):
630
611
  if self._max_ts_length is not None:
631
612
  new_df = self._shorten_all_series(new_df, self._max_ts_length)
632
613
  if known_covariates is None:
633
- future_index = get_forecast_horizon_index_ts_dataframe(data, self.prediction_length)
614
+ future_index = get_forecast_horizon_index_ts_dataframe(data, self.prediction_length, freq=self.freq)
634
615
  known_covariates = pd.DataFrame(columns=[self.target], index=future_index, dtype="float32")
635
616
  X_df = self._to_mlforecast_df(known_covariates, data.static_features, include_target=False)
636
617
  # If both covariates & static features are missing, set X_df = None to avoid exception from MLForecast
@@ -330,7 +330,7 @@ class ChronosModel(AbstractTimeSeriesModel):
330
330
  df = pd.DataFrame(
331
331
  np.concatenate([mean, quantiles], axis=1),
332
332
  columns=["mean"] + [str(q) for q in self.quantile_levels],
333
- index=get_forecast_horizon_index_ts_dataframe(data, self.prediction_length),
333
+ index=get_forecast_horizon_index_ts_dataframe(data, self.prediction_length, freq=self.freq),
334
334
  )
335
335
 
336
336
  return TimeSeriesDataFrame(df)
@@ -15,7 +15,6 @@ from gluonts.dataset.field_names import FieldName
15
15
  from gluonts.model.estimator import Estimator as GluonTSEstimator
16
16
  from gluonts.model.forecast import Forecast, QuantileForecast, SampleForecast
17
17
  from gluonts.model.predictor import Predictor as GluonTSPredictor
18
- from pandas.tseries.frequencies import to_offset
19
18
  from sklearn.compose import ColumnTransformer
20
19
  from sklearn.preprocessing import QuantileTransformer, StandardScaler
21
20
 
@@ -26,7 +25,6 @@ from autogluon.tabular.models.tabular_nn.utils.categorical_encoders import (
26
25
  )
27
26
  from autogluon.timeseries.dataset.ts_dataframe import ITEMID, TIMESTAMP, TimeSeriesDataFrame
28
27
  from autogluon.timeseries.models.abstract import AbstractTimeSeriesModel
29
- from autogluon.timeseries.utils.datetime import norm_freq_str
30
28
  from autogluon.timeseries.utils.forecast import get_forecast_horizon_index_ts_dataframe
31
29
  from autogluon.timeseries.utils.warning_filters import disable_root_logger, warning_filter
32
30
 
@@ -37,12 +35,11 @@ logger = logging.getLogger(__name__)
37
35
  gts_logger = logging.getLogger(gluonts.__name__)
38
36
 
39
37
 
40
- GLUONTS_SUPPORTED_OFFSETS = ["Y", "Q", "M", "W", "D", "B", "H", "T", "min", "S"]
41
-
42
-
43
38
  class SimpleGluonTSDataset(GluonTSDataset):
44
39
  """Wrapper for TimeSeriesDataFrame that is compatible with the GluonTS Dataset API."""
45
40
 
41
+ _dummy_gluonts_freq = "D"
42
+
46
43
  def __init__(
47
44
  self,
48
45
  target_df: TimeSeriesDataFrame,
@@ -57,7 +54,6 @@ class SimpleGluonTSDataset(GluonTSDataset):
57
54
  prediction_length: int = None,
58
55
  ):
59
56
  assert target_df is not None
60
- assert target_df.freq, "Initializing GluonTS data sets without freq is not allowed"
61
57
  # Convert TimeSeriesDataFrame to pd.Series for faster processing
62
58
  self.target_array = target_df[target_column].to_numpy(np.float32)
63
59
  self.feat_static_cat = self._astype(feat_static_cat, dtype=np.int64)
@@ -66,7 +62,6 @@ class SimpleGluonTSDataset(GluonTSDataset):
66
62
  self.feat_dynamic_real = self._astype(feat_dynamic_real, dtype=np.float32)
67
63
  self.past_feat_dynamic_cat = self._astype(past_feat_dynamic_cat, dtype=np.int64)
68
64
  self.past_feat_dynamic_real = self._astype(past_feat_dynamic_real, dtype=np.float32)
69
- self.freq = self._to_gluonts_freq(target_df.freq)
70
65
 
71
66
  # Necessary to compute indptr for known_covariates at prediction time
72
67
  self.includes_future = includes_future
@@ -88,21 +83,6 @@ class SimpleGluonTSDataset(GluonTSDataset):
88
83
  else:
89
84
  return array.astype(dtype)
90
85
 
91
- @staticmethod
92
- def _to_gluonts_freq(freq: str) -> str:
93
- # FIXME: GluonTS expects a frequency string, but only supports a limited number of such strings
94
- # for feature generation. If the frequency string doesn't match or is not provided, it raises an exception.
95
- # Here we bypass this by issuing a default "yearly" frequency, tricking it into not producing
96
- # any lags or features.
97
- pd_offset = to_offset(freq)
98
-
99
- # normalize freq str to handle peculiarities such as W-SUN
100
- offset_base_alias = norm_freq_str(pd_offset)
101
- if offset_base_alias not in GLUONTS_SUPPORTED_OFFSETS:
102
- return "A"
103
- else:
104
- return f"{pd_offset.n}{offset_base_alias}"
105
-
106
86
  def __len__(self):
107
87
  return len(self.indptr) - 1 # noqa
108
88
 
@@ -113,7 +93,7 @@ class SimpleGluonTSDataset(GluonTSDataset):
113
93
  # GluonTS expects item_id to be a string
114
94
  ts = {
115
95
  FieldName.ITEM_ID: str(self.item_ids[j]),
116
- FieldName.START: pd.Period(self.start_timestamps.iloc[j], freq=self.freq),
96
+ FieldName.START: pd.Period(self.start_timestamps.iloc[j], freq=self._dummy_gluonts_freq),
117
97
  FieldName.TARGET: self.target_array[start_idx:end_idx],
118
98
  }
119
99
  if self.feat_static_cat is not None:
@@ -234,13 +214,6 @@ class AbstractGluonTSModel(AbstractTimeSeriesModel):
234
214
 
235
215
  def _deferred_init_params_aux(self, dataset: TimeSeriesDataFrame) -> None:
236
216
  """Update GluonTS specific parameters with information available only at training time."""
237
- self.freq = dataset.freq or self.freq
238
- if not self.freq:
239
- raise ValueError(
240
- "Dataset frequency not provided in the dataset, fit arguments or "
241
- "during initialization. Please provide a `freq` string to `fit`."
242
- )
243
-
244
217
  model_params = self._get_model_params()
245
218
  disable_static_features = model_params.get("disable_static_features", False)
246
219
  if not disable_static_features:
@@ -592,7 +565,7 @@ class AbstractGluonTSModel(AbstractTimeSeriesModel):
592
565
  predicted_targets = self._predict_gluonts_forecasts(data, known_covariates=known_covariates, **kwargs)
593
566
  df = self._gluonts_forecasts_to_data_frame(
594
567
  predicted_targets,
595
- forecast_index=get_forecast_horizon_index_ts_dataframe(data, self.prediction_length),
568
+ forecast_index=get_forecast_horizon_index_ts_dataframe(data, self.prediction_length, freq=self.freq),
596
569
  )
597
570
  return df
598
571
 
@@ -424,5 +424,5 @@ class WaveNetModel(AbstractGluonTSModel):
424
424
  init_kwargs.setdefault("time_features", get_time_features_for_frequency(self.freq))
425
425
  init_kwargs.setdefault("num_parallel_samples", self.default_num_samples)
426
426
  # WaveNet model fails if an unsupported frequency such as "SM" is provided. We provide a dummy freq instead
427
- init_kwargs["freq"] = "H"
427
+ init_kwargs["freq"] = "D"
428
428
  return init_kwargs
@@ -166,7 +166,7 @@ class AbstractLocalModel(AbstractTimeSeriesModel):
166
166
  f"({fraction_failed_models:.1%}). Fallback model SeasonalNaive was used for these time series."
167
167
  )
168
168
  predictions_df = pd.concat([pred for pred, _ in predictions_with_flags])
169
- predictions_df.index = get_forecast_horizon_index_ts_dataframe(data, self.prediction_length)
169
+ predictions_df.index = get_forecast_horizon_index_ts_dataframe(data, self.prediction_length, freq=self.freq)
170
170
  return TimeSeriesDataFrame(predictions_df)
171
171
 
172
172
  def score_and_cache_oof(
@@ -69,7 +69,7 @@ class TimeSeriesPredictor(TimeSeriesPredictorDeprecatedMixin):
69
69
  models that predict up to 3 days into the future from the most recent observation.
70
70
  freq : str, optional
71
71
  Frequency of the time series data (see `pandas documentation <https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases>`_
72
- for available frequencies). For example, ``"D"`` for daily data or ``"H"`` for hourly data.
72
+ for available frequencies). For example, ``"D"`` for daily data or ``"h"`` for hourly data.
73
73
 
74
74
  By default, the predictor will attempt to automatically infer the frequency from the data. This argument should
75
75
  only be set in two cases:
@@ -195,7 +195,7 @@ class TimeSeriesPredictor(TimeSeriesPredictorDeprecatedMixin):
195
195
  self._min_train_length = max(self.prediction_length + 1, 5)
196
196
  self.freq = freq
197
197
  if self.freq is not None:
198
- # Standardize frequency string (e.g., "min" -> "T", "Y" -> "A-DEC")
198
+ # Standardize frequency string (e.g., "T" -> "min", "Y" -> "YE")
199
199
  std_freq = pd.tseries.frequencies.to_offset(self.freq).freqstr
200
200
  if std_freq != str(self.freq):
201
201
  logger.info(f"Frequency '{self.freq}' stored as '{std_freq}'")
@@ -1,31 +1,46 @@
1
1
  import pandas as pd
2
2
 
3
3
  TO_MAJOR_FREQ = {
4
- "min": "T",
5
- "ms": "L",
6
- "us": "U",
4
+ # sub-daily
5
+ "H": "h",
6
+ "BH": "bh",
7
+ "cbh": "bh",
8
+ "CBH": "bh",
9
+ "T": "min",
10
+ "S": "s",
11
+ "L": "ms",
12
+ "U": "us",
13
+ "N": "ns",
7
14
  # business day
8
15
  "C": "B",
9
16
  # month
10
- "BM": "M",
11
- "CBM": "M",
12
- "MS": "M",
13
- "BMS": "M",
14
- "CBMS": "M",
17
+ "M": "ME",
18
+ "BM": "ME",
19
+ "BME": "ME",
20
+ "CBM": "ME",
21
+ "CBME": "ME",
22
+ "MS": "ME",
23
+ "BMS": "ME",
24
+ "CBMS": "ME",
15
25
  # semi-month
16
- "SMS": "SM",
26
+ "SM": "SME",
27
+ "SMS": "SME",
17
28
  # quarter
18
- "BQ": "Q",
19
- "QS": "Q",
20
- "BQS": "Q",
29
+ "Q": "QE",
30
+ "BQ": "QE",
31
+ "BQE": "QE",
32
+ "QS": "QE",
33
+ "BQS": "QE",
21
34
  # annual
22
- "Y": "A",
23
- "BA": "A",
24
- "BY": "A",
25
- "AS": "A",
26
- "YS": "A",
27
- "BAS": "A",
28
- "BYS": "A",
35
+ "A": "YE",
36
+ "Y": "YE",
37
+ "BA": "YE",
38
+ "BY": "YE",
39
+ "BYE": "YE",
40
+ "AS": "YE",
41
+ "YS": "YE",
42
+ "BAS": "YE",
43
+ "BYS": "YE",
29
44
  }
30
45
 
31
46
 
@@ -33,7 +48,10 @@ def norm_freq_str(offset: pd.DateOffset) -> str:
33
48
  """Obtain frequency string from a pandas.DateOffset object.
34
49
 
35
50
  "Non-standard" frequencies are converted to their "standard" counterparts. For example, MS (month start) is mapped
36
- to M (month) since both correspond to the same seasonality, lags and time features.
51
+ to ME (month end) since both correspond to the same seasonality, lags and time features.
52
+
53
+ The frequencies are always mapped to the new non-deprecated aliases (pandas>=2.2), e.g., "H" is mapped to "h". The
54
+ downstream functions like `get_seasonality` handle the new aliases even if older version of pandas is used.
37
55
  """
38
56
  base_freq = offset.name.split("-")[0]
39
57
  return TO_MAJOR_FREQ.get(base_freq, base_freq)
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Generate lag indices based on frequency string. Adapted from gluonts.time_feature.lag.
3
3
  """
4
+
4
5
  from typing import List, Optional
5
6
 
6
7
  import numpy as np
@@ -96,13 +97,13 @@ def get_lags_for_frequency(
96
97
  offset = pd.tseries.frequencies.to_offset(freq)
97
98
  offset_name = norm_freq_str(offset)
98
99
 
99
- if offset_name == "A":
100
+ if offset_name == "YE":
100
101
  lags = []
101
- elif offset_name == "Q":
102
+ elif offset_name == "QE":
102
103
  lags = _make_lags_for_quarter(offset.n)
103
- elif offset_name == "M":
104
+ elif offset_name == "ME":
104
105
  lags = _make_lags_for_month(offset.n)
105
- elif offset_name == "SM":
106
+ elif offset_name == "SME":
106
107
  lags = _make_lags_for_semi_month(offset.n)
107
108
  elif offset_name == "W":
108
109
  lags = _make_lags_for_week(offset.n)
@@ -110,21 +111,21 @@ def get_lags_for_frequency(
110
111
  lags = _make_lags_for_day(offset.n) + _make_lags_for_week(offset.n / 7.0)
111
112
  elif offset_name == "B":
112
113
  lags = _make_lags_for_day(offset.n, days_in_week=5, days_in_month=22) + _make_lags_for_week(offset.n / 5.0)
113
- elif offset_name == "H":
114
+ elif offset_name == "h":
114
115
  lags = (
115
116
  _make_lags_for_hour(offset.n)
116
117
  + _make_lags_for_day(offset.n / 24)
117
118
  + _make_lags_for_week(offset.n / (24 * 7))
118
119
  )
119
120
  # business hour
120
- elif offset_name == "BH":
121
+ elif offset_name == "bh":
121
122
  lags = (
122
123
  _make_lags_for_business_hour(offset.n)
123
124
  + _make_lags_for_day(offset.n / 9)
124
125
  + _make_lags_for_week(offset.n / (9 * 7))
125
126
  )
126
127
  # minutes
127
- elif offset_name == "T":
128
+ elif offset_name == "min":
128
129
  lags = (
129
130
  _make_lags_for_minute(offset.n)
130
131
  + _make_lags_for_hour(offset.n / 60)
@@ -132,32 +133,32 @@ def get_lags_for_frequency(
132
133
  + _make_lags_for_week(offset.n / (60 * 24 * 7))
133
134
  )
134
135
  # second
135
- elif offset_name == "S":
136
+ elif offset_name == "s":
136
137
  lags = (
137
138
  _make_lags_for_second(offset.n)
138
139
  + _make_lags_for_minute(offset.n / 60)
139
140
  + _make_lags_for_hour(offset.n / (60 * 60))
140
141
  )
141
- elif offset_name == "L":
142
+ elif offset_name == "ms":
142
143
  lags = (
143
144
  _make_lags_for_second(offset.n / 1e3)
144
145
  + _make_lags_for_minute(offset.n / (60 * 1e3))
145
146
  + _make_lags_for_hour(offset.n / (60 * 60 * 1e3))
146
147
  )
147
- elif offset_name == "U":
148
+ elif offset_name == "us":
148
149
  lags = (
149
150
  _make_lags_for_second(offset.n / 1e6)
150
151
  + _make_lags_for_minute(offset.n / (60 * 1e6))
151
152
  + _make_lags_for_hour(offset.n / (60 * 60 * 1e6))
152
153
  )
153
- elif offset_name == "N":
154
+ elif offset_name == "ns":
154
155
  lags = (
155
156
  _make_lags_for_second(offset.n / 1e9)
156
157
  + _make_lags_for_minute(offset.n / (60 * 1e9))
157
158
  + _make_lags_for_hour(offset.n / (60 * 60 * 1e9))
158
159
  )
159
160
  else:
160
- raise Exception(f"invalid frequency {freq}")
161
+ raise Exception(f"Cannot get lags for unsupported frequency {freq}")
161
162
 
162
163
  # flatten lags list and filter
163
164
  lags = [int(lag) for sub_list in lags for lag in sub_list if 7 < lag <= lag_ub]
@@ -5,20 +5,20 @@ import pandas as pd
5
5
  from .base import norm_freq_str
6
6
 
7
7
  DEFAULT_SEASONALITIES = {
8
- "A": 1,
9
- "Q": 4,
10
- "M": 12,
11
- "SM": 24,
8
+ "YE": 1,
9
+ "QE": 4,
10
+ "ME": 12,
11
+ "SME": 24,
12
12
  "W": 1,
13
13
  "D": 7,
14
14
  "B": 5,
15
- "BH": 9,
16
- "H": 24,
17
- "T": 60 * 24,
18
- "S": 1,
19
- "L": 1,
20
- "U": 1,
21
- "N": 1,
15
+ "bh": 9,
16
+ "h": 24,
17
+ "min": 60 * 24,
18
+ "s": 1,
19
+ "ms": 1,
20
+ "us": 1,
21
+ "ns": 1,
22
22
  }
23
23
 
24
24
 
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Generate time features based on frequency string. Adapted from gluonts.time_feature.time_feature.
3
3
  """
4
+
4
5
  from typing import Callable, List
5
6
 
6
7
  import numpy as np
@@ -57,20 +58,20 @@ def second_of_minute(index: pd.DatetimeIndex) -> np.ndarray:
57
58
 
58
59
  def get_time_features_for_frequency(freq) -> List[Callable]:
59
60
  features_by_offset_name = {
60
- "A": [],
61
- "Q": [quarter_of_year],
62
- "M": [month_of_year],
63
- "SM": [day_of_month, month_of_year],
61
+ "YE": [],
62
+ "QE": [quarter_of_year],
63
+ "ME": [month_of_year],
64
+ "SME": [day_of_month, month_of_year],
64
65
  "W": [day_of_month, week_of_year],
65
66
  "D": [day_of_week, day_of_month, day_of_year],
66
67
  "B": [day_of_week, day_of_month, day_of_year],
67
- "BH": [hour_of_day, day_of_week, day_of_month, day_of_year],
68
- "H": [hour_of_day, day_of_week, day_of_month, day_of_year],
69
- "T": [minute_of_hour, hour_of_day, day_of_week, day_of_month, day_of_year],
70
- "S": [second_of_minute, minute_of_hour, hour_of_day, day_of_week, day_of_month, day_of_year],
71
- "L": [second_of_minute, minute_of_hour, hour_of_day, day_of_week, day_of_month, day_of_year],
72
- "U": [second_of_minute, minute_of_hour, hour_of_day, day_of_week, day_of_month, day_of_year],
73
- "N": [second_of_minute, minute_of_hour, hour_of_day, day_of_week, day_of_month, day_of_year],
68
+ "bh": [hour_of_day, day_of_week, day_of_month, day_of_year],
69
+ "h": [hour_of_day, day_of_week, day_of_month, day_of_year],
70
+ "min": [minute_of_hour, hour_of_day, day_of_week, day_of_month, day_of_year],
71
+ "s": [second_of_minute, minute_of_hour, hour_of_day, day_of_week, day_of_month, day_of_year],
72
+ "ms": [second_of_minute, minute_of_hour, hour_of_day, day_of_week, day_of_month, day_of_year],
73
+ "us": [second_of_minute, minute_of_hour, hour_of_day, day_of_week, day_of_month, day_of_year],
74
+ "ns": [second_of_minute, minute_of_hour, hour_of_day, day_of_week, day_of_month, day_of_year],
74
75
  }
75
76
  offset = pd.tseries.frequencies.to_offset(freq)
76
77
  offset_name = norm_freq_str(offset)
@@ -14,6 +14,7 @@ from autogluon.features.generators import (
14
14
  PipelineFeatureGenerator,
15
15
  )
16
16
  from autogluon.timeseries.dataset.ts_dataframe import ITEMID, TimeSeriesDataFrame
17
+ from autogluon.timeseries.utils.warning_filters import warning_filter
17
18
 
18
19
  logger = logging.getLogger(__name__)
19
20
 
@@ -335,7 +336,9 @@ class AbstractFeatureImportanceTransform:
335
336
  # we'll have to work on the history of the data alone
336
337
  data[feature_name] = data[feature_name].copy()
337
338
  feature_data = data[feature_name].groupby(level=ITEMID, sort=False).head(-self.prediction_length)
338
- data[feature_name].update(self._transform_series(feature_data, is_categorical=is_categorical))
339
+ # Silence spurious FutureWarning raised by DataFrame.update https://github.com/pandas-dev/pandas/issues/57124
340
+ with warning_filter():
341
+ data[feature_name].update(self._transform_series(feature_data, is_categorical=is_categorical))
339
342
  elif feature_name in self.covariate_metadata.static_features:
340
343
  feature_data = data.static_features[feature_name].copy()
341
344
  feature_data.reset_index(drop=True, inplace=True)
@@ -1,4 +1,5 @@
1
1
  import warnings
2
+ from typing import Optional
2
3
 
3
4
  import numpy as np
4
5
  import pandas as pd
@@ -15,7 +16,9 @@ def get_forecast_horizon_index_single_time_series(
15
16
 
16
17
 
17
18
  def get_forecast_horizon_index_ts_dataframe(
18
- ts_dataframe: TimeSeriesDataFrame, prediction_length: int
19
+ ts_dataframe: TimeSeriesDataFrame,
20
+ prediction_length: int,
21
+ freq: Optional[str] = None,
19
22
  ) -> pd.MultiIndex:
20
23
  """For each item in the dataframe, get timestamps for the next prediction_length many time steps into the future.
21
24
 
@@ -26,7 +29,9 @@ def get_forecast_horizon_index_ts_dataframe(
26
29
  last = ts_dataframe.reset_index()[[ITEMID, TIMESTAMP]].groupby(by=ITEMID, sort=False, as_index=False).last()
27
30
  item_ids = np.repeat(last[ITEMID], prediction_length)
28
31
 
29
- offset = pd.tseries.frequencies.to_offset(ts_dataframe.freq)
32
+ if freq is None:
33
+ freq = ts_dataframe.freq
34
+ offset = pd.tseries.frequencies.to_offset(freq)
30
35
  last_ts = pd.DatetimeIndex(last[TIMESTAMP])
31
36
  # Non-vectorized offsets like BusinessDay may produce a PerformanceWarning - we filter them
32
37
  with warnings.catch_warnings():
@@ -1,3 +1,3 @@
1
1
  """This is the autogluon version file."""
2
- __version__ = '1.1.0b20240410'
2
+ __version__ = '1.1.0b20240412'
3
3
  __lite__ = False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: autogluon.timeseries
3
- Version: 1.1.0b20240410
3
+ Version: 1.1.0b20240412
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
@@ -37,14 +37,14 @@ Description-Content-Type: text/markdown
37
37
  Requires-Dist: joblib <2,>=1.1
38
38
  Requires-Dist: numpy <1.29,>=1.21
39
39
  Requires-Dist: scipy <1.13,>=1.5.4
40
- Requires-Dist: pandas <2.2.0,>=2.0.0
40
+ Requires-Dist: pandas <2.3.0,>=2.0.0
41
41
  Requires-Dist: torch <2.2,>=2.1
42
42
  Requires-Dist: lightning <2.2,>=2.1
43
43
  Requires-Dist: pytorch-lightning <2.2,>=2.1
44
44
  Requires-Dist: transformers[sentencepiece] <4.39.0,>=4.38.0
45
45
  Requires-Dist: accelerate <0.22.0,>=0.21.0
46
46
  Requires-Dist: statsmodels <0.15,>=0.13.0
47
- Requires-Dist: gluonts <0.15,>=0.14.0
47
+ Requires-Dist: gluonts <0.14.4,>=0.14.0
48
48
  Requires-Dist: networkx <4,>=3.0
49
49
  Requires-Dist: statsforecast <1.5,>=1.4.0
50
50
  Requires-Dist: mlforecast <0.10.1,>=0.10.0
@@ -52,9 +52,9 @@ Requires-Dist: utilsforecast <0.0.11,>=0.0.10
52
52
  Requires-Dist: tqdm <5,>=4.38
53
53
  Requires-Dist: orjson ~=3.9
54
54
  Requires-Dist: tensorboard <3,>=2.9
55
- Requires-Dist: autogluon.core[raytune] ==1.1.0b20240410
56
- Requires-Dist: autogluon.common ==1.1.0b20240410
57
- Requires-Dist: autogluon.tabular[catboost,lightgbm,xgboost] ==1.1.0b20240410
55
+ Requires-Dist: autogluon.core[raytune] ==1.1.0b20240412
56
+ Requires-Dist: autogluon.common ==1.1.0b20240412
57
+ Requires-Dist: autogluon.tabular[catboost,lightgbm,xgboost] ==1.1.0b20240412
58
58
  Provides-Extra: all
59
59
  Requires-Dist: optimum[onnxruntime] <1.19,>=1.17 ; extra == 'all'
60
60
  Provides-Extra: chronos-onnx
@@ -1,14 +1,14 @@
1
- autogluon.timeseries-1.1.0b20240410-py3.8-nspkg.pth,sha256=cQGwpuGPqg1GXscIwt-7PmME1OnSpD-7ixkikJ31WAY,554
1
+ autogluon.timeseries-1.1.0b20240412-py3.8-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
- autogluon/timeseries/learner.py,sha256=fPIV2p0BMWcZr5fwOkNsJrk8RxK-IYUH_VON3_YXKOQ,13750
5
- autogluon/timeseries/predictor.py,sha256=A-YkJGKrYGXGlmtIHd9CDMmudBSKcBdnOCJK4oGsQr8,81222
4
+ autogluon/timeseries/learner.py,sha256=IYXpJSDyTzjZXjKL_SrTujt5Uke83mSJFA0sMj25_sM,13828
5
+ autogluon/timeseries/predictor.py,sha256=w9YWluyCVoFabeKOvfV7GiPNe7Z7pV2JDjOt8mXUdJo,81219
6
6
  autogluon/timeseries/splitter.py,sha256=eghGwAAN2_cxGk5aJBILgjGWtLzjxJcytMy49gg_q18,3061
7
- autogluon/timeseries/version.py,sha256=Vl4mL3oO6llldJibuRCV0k8vPCryw3LzBE-RXX5eIE8,90
7
+ autogluon/timeseries/version.py,sha256=x3pjPHRSXvEKGk0gDn7ARHXnZxx2LjH9RjumNUkaoeY,90
8
8
  autogluon/timeseries/configs/__init__.py,sha256=BTtHIPCYeGjqgOcvqb8qPD4VNX-ICKOg6wnkew1cPOE,98
9
9
  autogluon/timeseries/configs/presets_configs.py,sha256=ZVV8BsnGnnHPgjBtJBqF-H35MYUdzRBQ8FP7zA3_11g,1949
10
10
  autogluon/timeseries/dataset/__init__.py,sha256=UvnhAN5tjgxXTHoZMQDy64YMDj4Xxa68yY7NP4vAw0o,81
11
- autogluon/timeseries/dataset/ts_dataframe.py,sha256=Laa7g_4ssScjNlCCBJgW6R6NLLt3cu8rVElL6FtvlrE,45567
11
+ autogluon/timeseries/dataset/ts_dataframe.py,sha256=QgCwzRx10CRzeWzQREX_zUDAl77-lkdNjM0bT3kK8NU,45595
12
12
  autogluon/timeseries/metrics/__init__.py,sha256=KzgXNj5or7RB_uadjgC8p5gxyV26zjj2hT58OmvnfmA,1875
13
13
  autogluon/timeseries/metrics/abstract.py,sha256=9xCFQ3NaR1C0hn01M7oBd72a_CiNV-w6QFcRjwUbKYI,8183
14
14
  autogluon/timeseries/metrics/point.py,sha256=xy8sKrBbuxZ7yTW21TDPayKnEj2FBj1AEseJxUdneqE,13399
@@ -17,24 +17,24 @@ autogluon/timeseries/metrics/utils.py,sha256=eJ63TCR-UwbeJ1c2Qm7B2q-8B3sFthPgioo
17
17
  autogluon/timeseries/models/__init__.py,sha256=HFjDOYKQWaGlgQWiLlOvfwE2dH0uDmeKJFC8GDL987c,1271
18
18
  autogluon/timeseries/models/presets.py,sha256=p36ROcuOnixgGsI1zBdr9VM-MH2pKCiJCS2Ofb4xT8o,11243
19
19
  autogluon/timeseries/models/abstract/__init__.py,sha256=wvDsQAZIV0N3AwBeMaGItoQ82trEfnT-nol2AAOIxBg,102
20
- autogluon/timeseries/models/abstract/abstract_timeseries_model.py,sha256=q5yVFyFJPaMVtW48tr2Pw-hgedM5upvc-93qjN4Li68,23435
20
+ autogluon/timeseries/models/abstract/abstract_timeseries_model.py,sha256=MvLF529b3fo0icgle-qmS0oce-ftiiQ1jPBLnY-39fk,23435
21
21
  autogluon/timeseries/models/abstract/model_trial.py,sha256=ENPg_7nsdxIvaNM0o0UShZ3x8jFlRmwRc5m0fGPC0TM,3720
22
22
  autogluon/timeseries/models/autogluon_tabular/__init__.py,sha256=r9i6jWcyeLHYClkcMSKRVsfrkBUMxpDrTATNTBc_qgQ,136
23
- autogluon/timeseries/models/autogluon_tabular/mlforecast.py,sha256=aWH9r9wJGey8pzFDV_BWOuIx-L6Z40SED0y_clP5PBo,32111
23
+ autogluon/timeseries/models/autogluon_tabular/mlforecast.py,sha256=lnHzCoMF6x9jZOzRM4zSlcXmx0XmtRlsPoiE-LWmqQ0,31299
24
24
  autogluon/timeseries/models/autogluon_tabular/utils.py,sha256=4-gTrBtizxeMVQlsuscugPqw9unaXWXhS1TVVssfzYY,2125
25
25
  autogluon/timeseries/models/chronos/__init__.py,sha256=wT77HzTtmQxW3sw2k0mA5Ot6PSHivX-Uvn5fjM05EU4,60
26
- autogluon/timeseries/models/chronos/model.py,sha256=wG4tlTwpFiADu-KQ3TYg-hz7hGz1vPBU__DzyQrikdI,14643
26
+ autogluon/timeseries/models/chronos/model.py,sha256=0ZxOpGyx7MmXYDr9zeDt6-rIu50Bm7ssR9zTIvd6vmQ,14659
27
27
  autogluon/timeseries/models/chronos/pipeline.py,sha256=caR4tx-MZnrPeiU_Rra566-OP_SpodtOgcU7P0Hw0Vc,20784
28
28
  autogluon/timeseries/models/chronos/utils.py,sha256=dl7pytUFmosFVfBcBAGA0JqMJp4cTQ3DmM9Mdjap9no,2124
29
29
  autogluon/timeseries/models/ensemble/__init__.py,sha256=kFr11Gmt7lQJu9Rr8HuIPphQN5l1TsoorfbJm_O3a_s,128
30
30
  autogluon/timeseries/models/ensemble/abstract_timeseries_ensemble.py,sha256=tifETwmiEGt-YtQ9eNK7ojJ3fBvtFMUJvisbfkIJ7gw,3393
31
31
  autogluon/timeseries/models/ensemble/greedy_ensemble.py,sha256=5HvZuW5osgsZg3V69k82nKEOy_YgeH1JTfQa7F3cU7s,7220
32
32
  autogluon/timeseries/models/gluonts/__init__.py,sha256=M8PV9ZE4WpteScMobXM6RH1Udb1AZiHHtj2g5GQL3TU,329
33
- autogluon/timeseries/models/gluonts/abstract_gluonts.py,sha256=X1l_MexAoyBNMGiJrWreHQHLDSmZV_OSrhjhJ7MA0JM,34348
33
+ autogluon/timeseries/models/gluonts/abstract_gluonts.py,sha256=iB3-VNZeg2Wf7rW1WeKDAOJyh2ZGuq2BU309OirBFqc,33055
34
34
  autogluon/timeseries/models/gluonts/torch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- autogluon/timeseries/models/gluonts/torch/models.py,sha256=PVDns7CnZtJTbPiCw-FJxahKrDjC-wj0VkwIGsodYY0,19930
35
+ autogluon/timeseries/models/gluonts/torch/models.py,sha256=vzR-FRHSQDC76z2cK37eVDzs7tCXvGpZtrvtZptyP5Y,19930
36
36
  autogluon/timeseries/models/local/__init__.py,sha256=JyckWWgMG1BTIWJqFTW6e1O-eb0LPPOwtXwmb1ErohQ,756
37
- autogluon/timeseries/models/local/abstract_local_model.py,sha256=6uxR97dbSmevS-mZK0zVBYFnO2Ce-S9ZxVlc0qrFLqo,11820
37
+ autogluon/timeseries/models/local/abstract_local_model.py,sha256=5wvwt7d99kw-PTDnuT45uoCeXk6POjUArCAwUj8mSok,11836
38
38
  autogluon/timeseries/models/local/naive.py,sha256=iwRcFMFmJKPWPbD9TWaIUS51oav69F_VAp6-jb_5SUE,7249
39
39
  autogluon/timeseries/models/local/npts.py,sha256=Bp74doKnfpGE8ywP4FWOCI_RwRMsmgocYDfGtq764DA,4143
40
40
  autogluon/timeseries/models/local/statsforecast.py,sha256=oDYKKM2LZXEQLhPLEgZZWhvSEC1iE1wBexpl8P-Cxwc,32991
@@ -44,19 +44,19 @@ autogluon/timeseries/trainer/__init__.py,sha256=lxiOT-Gc6BEnr_yWQqra85kEngeM_wtH
44
44
  autogluon/timeseries/trainer/abstract_trainer.py,sha256=2nPLskmbOGRzkj6ttX0tHVkj9h2Y72MHaZy7L78MBZQ,59100
45
45
  autogluon/timeseries/trainer/auto_trainer.py,sha256=psJFZBwWWPlLjNwAgvO4OUJXsRW1sTN2YS9a4pdoeoE,3344
46
46
  autogluon/timeseries/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
- autogluon/timeseries/utils/features.py,sha256=OvBxLIWKR7fPOIlifonVKXUdaWazH_WbdLssJtFCpGs,19261
48
- autogluon/timeseries/utils/forecast.py,sha256=Thjt6yTPSe3V4s5cQ9UbW3ysTJb1lkqxtZiCqgBSt3w,1776
47
+ autogluon/timeseries/utils/features.py,sha256=kG1xin3VCjtLwfaDkxlGKaesS7Ah-hIvsUNdwToLxYY,19492
48
+ autogluon/timeseries/utils/forecast.py,sha256=p0WKM9Q0nLAwwmCgYZI1zi9mCOWXWJfllEt2lPRQl4M,1882
49
49
  autogluon/timeseries/utils/warning_filters.py,sha256=ngjmfv21zIwTG-7VNZT-NkaSR7ssnoNtUwcXCXANZ4A,2076
50
50
  autogluon/timeseries/utils/datetime/__init__.py,sha256=bTMR8jLh1LW55vHjbOr1zvWRMF_PqbvxpS-cUcNIDWI,173
51
- autogluon/timeseries/utils/datetime/base.py,sha256=MsqIHY14m3QMjSwwtE7Uo1oNwepWUby_nxlWm4DlqKU,848
52
- autogluon/timeseries/utils/datetime/lags.py,sha256=kcU4liKbHj7KP2ajNU-KLZ8OYSU35EgT4kJjZNSw0Zg,5875
53
- autogluon/timeseries/utils/datetime/seasonality.py,sha256=kgK_ukw2wCviEB7CZXRVC5HZpBJZu9IsRrvCJ9E_rOE,755
54
- autogluon/timeseries/utils/datetime/time_features.py,sha256=pROkYyxETQ8rHKfPGhf2paB73C7rWJ2Ui0cCswLqbBg,2562
55
- autogluon.timeseries-1.1.0b20240410.dist-info/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142
56
- autogluon.timeseries-1.1.0b20240410.dist-info/METADATA,sha256=_jsgskC0x-qRzDFtP6speD7lqYiqOSukkA3O34fLz1o,12528
57
- autogluon.timeseries-1.1.0b20240410.dist-info/NOTICE,sha256=7nPQuj8Kp-uXsU0S5so3-2dNU5EctS5hDXvvzzehd7E,114
58
- autogluon.timeseries-1.1.0b20240410.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
59
- autogluon.timeseries-1.1.0b20240410.dist-info/namespace_packages.txt,sha256=giERA4R78OkJf2ijn5slgjURlhRPzfLr7waIcGkzYAo,10
60
- autogluon.timeseries-1.1.0b20240410.dist-info/top_level.txt,sha256=giERA4R78OkJf2ijn5slgjURlhRPzfLr7waIcGkzYAo,10
61
- autogluon.timeseries-1.1.0b20240410.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
62
- autogluon.timeseries-1.1.0b20240410.dist-info/RECORD,,
51
+ autogluon/timeseries/utils/datetime/base.py,sha256=3NdsH3NDq4cVAOSoy3XpaNixyNlbjy4DJ_YYOGuu9x4,1341
52
+ autogluon/timeseries/utils/datetime/lags.py,sha256=GoLtvcZ8oKb3QkoBJ9E59LSPLOP7Qjxrr2UmMSZgjyw,5909
53
+ autogluon/timeseries/utils/datetime/seasonality.py,sha256=h_4w00iEytAz_N_EpCENQ8RCXy7KQITczrYjBgVqWkQ,764
54
+ autogluon/timeseries/utils/datetime/time_features.py,sha256=PAXbYbQ0z_5GFbkxSNi41zLY_2-U3x0Ynm1m_WhdtGc,2572
55
+ autogluon.timeseries-1.1.0b20240412.dist-info/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142
56
+ autogluon.timeseries-1.1.0b20240412.dist-info/METADATA,sha256=KsqIZCL5sRlmJ90KadBcOSXKeL2XazvcaT1LLw1FF1Y,12530
57
+ autogluon.timeseries-1.1.0b20240412.dist-info/NOTICE,sha256=7nPQuj8Kp-uXsU0S5so3-2dNU5EctS5hDXvvzzehd7E,114
58
+ autogluon.timeseries-1.1.0b20240412.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
59
+ autogluon.timeseries-1.1.0b20240412.dist-info/namespace_packages.txt,sha256=giERA4R78OkJf2ijn5slgjURlhRPzfLr7waIcGkzYAo,10
60
+ autogluon.timeseries-1.1.0b20240412.dist-info/top_level.txt,sha256=giERA4R78OkJf2ijn5slgjURlhRPzfLr7waIcGkzYAo,10
61
+ autogluon.timeseries-1.1.0b20240412.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
62
+ autogluon.timeseries-1.1.0b20240412.dist-info/RECORD,,