autogluon.timeseries 1.0.1b20240304__py3-none-any.whl → 1.4.1b20251210__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 (108) hide show
  1. autogluon/timeseries/configs/__init__.py +3 -2
  2. autogluon/timeseries/configs/hyperparameter_presets.py +62 -0
  3. autogluon/timeseries/configs/predictor_presets.py +84 -0
  4. autogluon/timeseries/dataset/ts_dataframe.py +339 -186
  5. autogluon/timeseries/learner.py +192 -60
  6. autogluon/timeseries/metrics/__init__.py +55 -11
  7. autogluon/timeseries/metrics/abstract.py +96 -25
  8. autogluon/timeseries/metrics/point.py +186 -39
  9. autogluon/timeseries/metrics/quantile.py +47 -20
  10. autogluon/timeseries/metrics/utils.py +6 -6
  11. autogluon/timeseries/models/__init__.py +13 -7
  12. autogluon/timeseries/models/abstract/__init__.py +2 -2
  13. autogluon/timeseries/models/abstract/abstract_timeseries_model.py +533 -273
  14. autogluon/timeseries/models/abstract/model_trial.py +10 -10
  15. autogluon/timeseries/models/abstract/tunable.py +189 -0
  16. autogluon/timeseries/models/autogluon_tabular/__init__.py +2 -0
  17. autogluon/timeseries/models/autogluon_tabular/mlforecast.py +369 -215
  18. autogluon/timeseries/models/autogluon_tabular/per_step.py +513 -0
  19. autogluon/timeseries/models/autogluon_tabular/transforms.py +67 -0
  20. autogluon/timeseries/models/autogluon_tabular/utils.py +3 -51
  21. autogluon/timeseries/models/chronos/__init__.py +4 -0
  22. autogluon/timeseries/models/chronos/chronos2.py +361 -0
  23. autogluon/timeseries/models/chronos/model.py +738 -0
  24. autogluon/timeseries/models/chronos/utils.py +369 -0
  25. autogluon/timeseries/models/ensemble/__init__.py +35 -2
  26. autogluon/timeseries/models/ensemble/{abstract_timeseries_ensemble.py → abstract.py} +50 -26
  27. autogluon/timeseries/models/ensemble/array_based/__init__.py +3 -0
  28. autogluon/timeseries/models/ensemble/array_based/abstract.py +236 -0
  29. autogluon/timeseries/models/ensemble/array_based/models.py +73 -0
  30. autogluon/timeseries/models/ensemble/array_based/regressor/__init__.py +12 -0
  31. autogluon/timeseries/models/ensemble/array_based/regressor/abstract.py +88 -0
  32. autogluon/timeseries/models/ensemble/array_based/regressor/linear_stacker.py +167 -0
  33. autogluon/timeseries/models/ensemble/array_based/regressor/per_quantile_tabular.py +94 -0
  34. autogluon/timeseries/models/ensemble/array_based/regressor/tabular.py +107 -0
  35. autogluon/timeseries/models/ensemble/ensemble_selection.py +167 -0
  36. autogluon/timeseries/models/ensemble/per_item_greedy.py +162 -0
  37. autogluon/timeseries/models/ensemble/weighted/__init__.py +8 -0
  38. autogluon/timeseries/models/ensemble/weighted/abstract.py +40 -0
  39. autogluon/timeseries/models/ensemble/weighted/basic.py +78 -0
  40. autogluon/timeseries/models/ensemble/weighted/greedy.py +57 -0
  41. autogluon/timeseries/models/gluonts/__init__.py +3 -1
  42. autogluon/timeseries/models/gluonts/abstract.py +583 -0
  43. autogluon/timeseries/models/gluonts/dataset.py +109 -0
  44. autogluon/timeseries/models/gluonts/{torch/models.py → models.py} +185 -44
  45. autogluon/timeseries/models/local/__init__.py +1 -10
  46. autogluon/timeseries/models/local/abstract_local_model.py +150 -97
  47. autogluon/timeseries/models/local/naive.py +31 -23
  48. autogluon/timeseries/models/local/npts.py +6 -2
  49. autogluon/timeseries/models/local/statsforecast.py +99 -112
  50. autogluon/timeseries/models/multi_window/multi_window_model.py +99 -40
  51. autogluon/timeseries/models/registry.py +64 -0
  52. autogluon/timeseries/models/toto/__init__.py +3 -0
  53. autogluon/timeseries/models/toto/_internal/__init__.py +9 -0
  54. autogluon/timeseries/models/toto/_internal/backbone/__init__.py +3 -0
  55. autogluon/timeseries/models/toto/_internal/backbone/attention.py +196 -0
  56. autogluon/timeseries/models/toto/_internal/backbone/backbone.py +262 -0
  57. autogluon/timeseries/models/toto/_internal/backbone/distribution.py +70 -0
  58. autogluon/timeseries/models/toto/_internal/backbone/kvcache.py +136 -0
  59. autogluon/timeseries/models/toto/_internal/backbone/rope.py +89 -0
  60. autogluon/timeseries/models/toto/_internal/backbone/rotary_embedding_torch.py +342 -0
  61. autogluon/timeseries/models/toto/_internal/backbone/scaler.py +305 -0
  62. autogluon/timeseries/models/toto/_internal/backbone/transformer.py +333 -0
  63. autogluon/timeseries/models/toto/_internal/dataset.py +165 -0
  64. autogluon/timeseries/models/toto/_internal/forecaster.py +423 -0
  65. autogluon/timeseries/models/toto/dataloader.py +108 -0
  66. autogluon/timeseries/models/toto/hf_pretrained_model.py +118 -0
  67. autogluon/timeseries/models/toto/model.py +236 -0
  68. autogluon/timeseries/predictor.py +826 -305
  69. autogluon/timeseries/regressor.py +253 -0
  70. autogluon/timeseries/splitter.py +10 -31
  71. autogluon/timeseries/trainer/__init__.py +2 -3
  72. autogluon/timeseries/trainer/ensemble_composer.py +439 -0
  73. autogluon/timeseries/trainer/model_set_builder.py +256 -0
  74. autogluon/timeseries/trainer/prediction_cache.py +149 -0
  75. autogluon/timeseries/trainer/trainer.py +1298 -0
  76. autogluon/timeseries/trainer/utils.py +17 -0
  77. autogluon/timeseries/transforms/__init__.py +2 -0
  78. autogluon/timeseries/transforms/covariate_scaler.py +164 -0
  79. autogluon/timeseries/transforms/target_scaler.py +149 -0
  80. autogluon/timeseries/utils/constants.py +10 -0
  81. autogluon/timeseries/utils/datetime/base.py +38 -20
  82. autogluon/timeseries/utils/datetime/lags.py +18 -16
  83. autogluon/timeseries/utils/datetime/seasonality.py +14 -14
  84. autogluon/timeseries/utils/datetime/time_features.py +17 -14
  85. autogluon/timeseries/utils/features.py +317 -53
  86. autogluon/timeseries/utils/forecast.py +31 -17
  87. autogluon/timeseries/utils/timer.py +173 -0
  88. autogluon/timeseries/utils/warning_filters.py +44 -6
  89. autogluon/timeseries/version.py +2 -1
  90. autogluon.timeseries-1.4.1b20251210-py3.11-nspkg.pth +1 -0
  91. {autogluon.timeseries-1.0.1b20240304.dist-info → autogluon_timeseries-1.4.1b20251210.dist-info}/METADATA +71 -47
  92. autogluon_timeseries-1.4.1b20251210.dist-info/RECORD +103 -0
  93. {autogluon.timeseries-1.0.1b20240304.dist-info → autogluon_timeseries-1.4.1b20251210.dist-info}/WHEEL +1 -1
  94. autogluon/timeseries/configs/presets_configs.py +0 -11
  95. autogluon/timeseries/evaluator.py +0 -6
  96. autogluon/timeseries/models/ensemble/greedy_ensemble.py +0 -170
  97. autogluon/timeseries/models/gluonts/abstract_gluonts.py +0 -550
  98. autogluon/timeseries/models/gluonts/torch/__init__.py +0 -0
  99. autogluon/timeseries/models/presets.py +0 -325
  100. autogluon/timeseries/trainer/abstract_trainer.py +0 -1144
  101. autogluon/timeseries/trainer/auto_trainer.py +0 -74
  102. autogluon.timeseries-1.0.1b20240304-py3.8-nspkg.pth +0 -1
  103. autogluon.timeseries-1.0.1b20240304.dist-info/RECORD +0 -58
  104. {autogluon.timeseries-1.0.1b20240304.dist-info → autogluon_timeseries-1.4.1b20251210.dist-info/licenses}/LICENSE +0 -0
  105. {autogluon.timeseries-1.0.1b20240304.dist-info → autogluon_timeseries-1.4.1b20251210.dist-info/licenses}/NOTICE +0 -0
  106. {autogluon.timeseries-1.0.1b20240304.dist-info → autogluon_timeseries-1.4.1b20251210.dist-info}/namespace_packages.txt +0 -0
  107. {autogluon.timeseries-1.0.1b20240304.dist-info → autogluon_timeseries-1.4.1b20251210.dist-info}/top_level.txt +0 -0
  108. {autogluon.timeseries-1.0.1b20240304.dist-info → autogluon_timeseries-1.4.1b20251210.dist-info}/zip-safe +0 -0
@@ -1,12 +1,12 @@
1
- from typing import Optional
1
+ from typing import Sequence
2
2
 
3
3
  import numpy as np
4
4
  import pandas as pd
5
5
 
6
- from autogluon.timeseries.dataset.ts_dataframe import ITEMID, TimeSeriesDataFrame
6
+ from autogluon.timeseries.dataset import TimeSeriesDataFrame
7
7
 
8
8
  from .abstract import TimeSeriesScorer
9
- from .utils import _in_sample_abs_seasonal_error
9
+ from .utils import in_sample_abs_seasonal_error
10
10
 
11
11
 
12
12
  class WQL(TimeSeriesScorer):
@@ -25,6 +25,7 @@ class WQL(TimeSeriesScorer):
25
25
  - scale-dependent (time series with large absolute value contribute more to the loss)
26
26
  - equivalent to WAPE if ``quantile_levels = [0.5]``
27
27
 
28
+ If ``horizon_weight`` is provided, both the errors and the target time series in the denominator will be re-weighted.
28
29
 
29
30
  References
30
31
  ----------
@@ -34,16 +35,25 @@ class WQL(TimeSeriesScorer):
34
35
  needs_quantile = True
35
36
 
36
37
  def compute_metric(
37
- self, data_future: TimeSeriesDataFrame, predictions: TimeSeriesDataFrame, target: str = "target", **kwargs
38
+ self,
39
+ data_future: TimeSeriesDataFrame,
40
+ predictions: TimeSeriesDataFrame,
41
+ target: str = "target",
42
+ **kwargs,
38
43
  ) -> float:
39
44
  y_true, q_pred, quantile_levels = self._get_quantile_forecast_score_inputs(data_future, predictions, target)
40
- values_true = y_true.values[:, None] # shape [N, 1]
41
- values_pred = q_pred.values # shape [N, len(quantile_levels)]
45
+ y_true = y_true.to_numpy()[:, None] # shape [N, 1]
46
+ q_pred = q_pred.to_numpy() # shape [N, len(quantile_levels)]
42
47
 
43
- return 2 * np.mean(
44
- np.abs((values_true - values_pred) * ((values_true <= values_pred) - quantile_levels)).sum(axis=0)
45
- / np.abs(values_true).sum()
48
+ errors = (
49
+ np.abs((q_pred - y_true) * ((y_true <= q_pred) - quantile_levels))
50
+ .mean(axis=1)
51
+ .reshape([-1, self.prediction_length])
46
52
  )
53
+ if self.horizon_weight is not None:
54
+ errors *= self.horizon_weight
55
+ y_true = y_true.reshape([-1, self.prediction_length]) * self.horizon_weight
56
+ return 2 * np.nansum(errors) / np.nansum(np.abs(y_true))
47
57
 
48
58
 
49
59
  class SQL(TimeSeriesScorer):
@@ -51,13 +61,13 @@ class SQL(TimeSeriesScorer):
51
61
 
52
62
  Also known as scaled pinball loss.
53
63
 
54
- Normalizes the quantile loss for each time series by the historic seasonal error of this time series.
64
+ Normalizes the quantile loss for each time series by the historical seasonal error of this time series.
55
65
 
56
66
  .. math::
57
67
 
58
68
  \operatorname{SQL} = \frac{1}{N} \frac{1}{H} \sum_{i=1}^{N} \frac{1}{a_i} \sum_{t=T+1}^{T+H} \sum_{q} \rho_q(y_{i,t}, f^q_{i,t})
59
69
 
60
- where :math:`a_i` is the historic absolute seasonal error defined as
70
+ where :math:`a_i` is the historical absolute seasonal error defined as
61
71
 
62
72
  .. math::
63
73
 
@@ -79,13 +89,21 @@ class SQL(TimeSeriesScorer):
79
89
 
80
90
  needs_quantile = True
81
91
 
82
- def __init__(self):
83
- self._past_abs_seasonal_error: Optional[pd.Series] = None
92
+ def __init__(
93
+ self,
94
+ prediction_length: int = 1,
95
+ seasonal_period: int | None = None,
96
+ horizon_weight: Sequence[float] | None = None,
97
+ ):
98
+ super().__init__(
99
+ prediction_length=prediction_length, seasonal_period=seasonal_period, horizon_weight=horizon_weight
100
+ )
101
+ self._past_abs_seasonal_error: pd.Series | None = None
84
102
 
85
103
  def save_past_metrics(
86
104
  self, data_past: TimeSeriesDataFrame, target: str = "target", seasonal_period: int = 1, **kwargs
87
105
  ) -> None:
88
- self._past_abs_seasonal_error = _in_sample_abs_seasonal_error(
106
+ self._past_abs_seasonal_error = in_sample_abs_seasonal_error(
89
107
  y_past=data_past[target], seasonal_period=seasonal_period
90
108
  )
91
109
 
@@ -93,15 +111,24 @@ class SQL(TimeSeriesScorer):
93
111
  self._past_abs_seasonal_error = None
94
112
 
95
113
  def compute_metric(
96
- self, data_future: TimeSeriesDataFrame, predictions: TimeSeriesDataFrame, target: str = "target", **kwargs
114
+ self,
115
+ data_future: TimeSeriesDataFrame,
116
+ predictions: TimeSeriesDataFrame,
117
+ target: str = "target",
118
+ **kwargs,
97
119
  ) -> float:
98
120
  if self._past_abs_seasonal_error is None:
99
121
  raise AssertionError("Call `save_past_metrics` before `compute_metric`")
100
122
 
101
123
  y_true, q_pred, quantile_levels = self._get_quantile_forecast_score_inputs(data_future, predictions, target)
102
- values_true = y_true.values[:, None] # shape [N, 1]
124
+ q_pred = q_pred.to_numpy()
125
+ y_true = y_true.to_numpy()[:, None] # shape [N, 1]
103
126
 
104
- ql = ((q_pred - values_true) * ((values_true <= q_pred) - quantile_levels)).mean(axis=1).abs()
105
- # TODO: Speed up computation by using np.arrays & replace groupby with reshapes [-1, prediction_length]?
106
- ql_per_item = ql.groupby(level=ITEMID, sort=False).mean()
107
- return 2 * self._safemean(ql_per_item / self._past_abs_seasonal_error)
127
+ errors = (
128
+ np.abs((q_pred - y_true) * ((y_true <= q_pred) - quantile_levels))
129
+ .mean(axis=1)
130
+ .reshape([-1, self.prediction_length])
131
+ )
132
+ if self.horizon_weight is not None:
133
+ errors *= self.horizon_weight
134
+ return 2 * self._safemean(errors / self._past_abs_seasonal_error.to_numpy()[:, None])
@@ -1,18 +1,18 @@
1
1
  import pandas as pd
2
2
 
3
- from autogluon.timeseries.dataset.ts_dataframe import ITEMID
3
+ from autogluon.timeseries.dataset import TimeSeriesDataFrame
4
4
 
5
5
 
6
6
  def _get_seasonal_diffs(*, y_past: pd.Series, seasonal_period: int = 1) -> pd.Series:
7
- return y_past.groupby(level=ITEMID, sort=False).diff(seasonal_period).abs()
7
+ return y_past.groupby(level=TimeSeriesDataFrame.ITEMID, sort=False).diff(seasonal_period).abs()
8
8
 
9
9
 
10
- def _in_sample_abs_seasonal_error(*, y_past: pd.Series, seasonal_period: int = 1) -> pd.Series:
10
+ def in_sample_abs_seasonal_error(*, y_past: pd.Series, seasonal_period: int = 1) -> pd.Series:
11
11
  """Compute seasonal naive forecast error (predict value from seasonal_period steps ago) for each time series."""
12
12
  seasonal_diffs = _get_seasonal_diffs(y_past=y_past, seasonal_period=seasonal_period)
13
- return seasonal_diffs.groupby(level=ITEMID, sort=False).mean().fillna(1.0)
13
+ return seasonal_diffs.groupby(level=TimeSeriesDataFrame.ITEMID, sort=False).mean().fillna(1.0)
14
14
 
15
15
 
16
- def _in_sample_squared_seasonal_error(*, y_past: pd.Series, seasonal_period: int = 1) -> pd.Series:
16
+ def in_sample_squared_seasonal_error(*, y_past: pd.Series, seasonal_period: int = 1) -> pd.Series:
17
17
  seasonal_diffs = _get_seasonal_diffs(y_past=y_past, seasonal_period=seasonal_period)
18
- return seasonal_diffs.pow(2.0).groupby(level=ITEMID, sort=False).mean().fillna(1.0)
18
+ return seasonal_diffs.pow(2.0).groupby(level=TimeSeriesDataFrame.ITEMID, sort=False).mean().fillna(1.0)
@@ -1,10 +1,12 @@
1
- from .autogluon_tabular import DirectTabularModel, RecursiveTabularModel
1
+ from .autogluon_tabular import DirectTabularModel, PerStepTabularModel, RecursiveTabularModel
2
+ from .chronos import Chronos2Model, ChronosModel
2
3
  from .gluonts import (
3
4
  DeepARModel,
4
5
  DLinearModel,
5
6
  PatchTSTModel,
6
7
  SimpleFeedForwardModel,
7
8
  TemporalFusionTransformerModel,
9
+ TiDEModel,
8
10
  WaveNetModel,
9
11
  )
10
12
  from .local import (
@@ -14,9 +16,7 @@ from .local import (
14
16
  AutoCESModel,
15
17
  AutoETSModel,
16
18
  AverageModel,
17
- CrostonClassicModel,
18
- CrostonOptimizedModel,
19
- CrostonSBAModel,
19
+ CrostonModel,
20
20
  DynamicOptimizedThetaModel,
21
21
  ETSModel,
22
22
  IMAPAModel,
@@ -27,6 +27,8 @@ from .local import (
27
27
  ThetaModel,
28
28
  ZeroModel,
29
29
  )
30
+ from .registry import ModelRegistry
31
+ from .toto import TotoModel
30
32
 
31
33
  __all__ = [
32
34
  "ADIDAModel",
@@ -35,24 +37,28 @@ __all__ = [
35
37
  "AutoCESModel",
36
38
  "AutoETSModel",
37
39
  "AverageModel",
38
- "CrostonClassicModel",
39
- "CrostonSBAModel",
40
- "CrostonOptimizedModel",
40
+ "CrostonModel",
41
41
  "DLinearModel",
42
42
  "DeepARModel",
43
43
  "DirectTabularModel",
44
44
  "DynamicOptimizedThetaModel",
45
45
  "ETSModel",
46
46
  "IMAPAModel",
47
+ "ChronosModel",
48
+ "Chronos2Model",
49
+ "ModelRegistry",
47
50
  "NPTSModel",
48
51
  "NaiveModel",
49
52
  "PatchTSTModel",
53
+ "PerStepTabularModel",
50
54
  "RecursiveTabularModel",
51
55
  "SeasonalAverageModel",
52
56
  "SeasonalNaiveModel",
53
57
  "SimpleFeedForwardModel",
54
58
  "TemporalFusionTransformerModel",
55
59
  "ThetaModel",
60
+ "TiDEModel",
61
+ "TotoModel",
56
62
  "WaveNetModel",
57
63
  "ZeroModel",
58
64
  ]
@@ -1,3 +1,3 @@
1
- from .abstract_timeseries_model import AbstractTimeSeriesModel
1
+ from .abstract_timeseries_model import AbstractTimeSeriesModel, TimeSeriesModelBase
2
2
 
3
- __all__ = ["AbstractTimeSeriesModel"]
3
+ __all__ = ["AbstractTimeSeriesModel", "TimeSeriesModelBase"]