tabpfn-time-series 1.0.3__tar.gz → 1.0.4__tar.gz

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.
Files changed (25) hide show
  1. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/PKG-INFO +2 -1
  2. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/demo.ipynb +8 -13
  3. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/pyproject.toml +1 -0
  4. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/tabpfn_time_series/predictor.py +6 -1
  5. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/tabpfn_time_series/tabpfn_worker.py +87 -21
  6. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/tests/test_predictor.py +5 -1
  7. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/uv.lock +102 -13
  8. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/.github/workflows/publish-release.yml +0 -0
  9. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/.github/workflows/publish-test.yml +0 -0
  10. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/.github/workflows/pull_request.yml +0 -0
  11. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/.gitignore +0 -0
  12. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/.pre-commit-config.yaml +0 -0
  13. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/LICENSE.txt +0 -0
  14. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/README.md +0 -0
  15. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/ruff.toml +0 -0
  16. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/tabpfn_time_series/__init__.py +0 -0
  17. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/tabpfn_time_series/data_preparation.py +0 -0
  18. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/tabpfn_time_series/defaults.py +0 -0
  19. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/tabpfn_time_series/features/__init__.py +0 -0
  20. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/tabpfn_time_series/features/auto_features.py +0 -0
  21. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/tabpfn_time_series/features/basic_features.py +0 -0
  22. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/tabpfn_time_series/features/feature_generator_base.py +0 -0
  23. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/tabpfn_time_series/features/feature_transformer.py +0 -0
  24. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/tabpfn_time_series/plot.py +0 -0
  25. {tabpfn_time_series-1.0.3 → tabpfn_time_series-1.0.4}/tabpfn_time_series/ts_dataframe.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tabpfn_time_series
3
- Version: 1.0.3
3
+ Version: 1.0.4
4
4
  Summary: Zero-shot time series forecasting with TabPFNv2
5
5
  Project-URL: Homepage, https://github.com/liam-sbhoo/tabpfn-time-series
6
6
  Project-URL: Bug Tracker, https://github.com/liam-sbhoo/tabpfn-time-series/issues
@@ -10,6 +10,7 @@ Classifier: License :: OSI Approved :: Apache Software License
10
10
  Classifier: Operating System :: OS Independent
11
11
  Classifier: Programming Language :: Python :: 3
12
12
  Requires-Python: >=3.10
13
+ Requires-Dist: backoff>=2.2.1
13
14
  Requires-Dist: datasets>=4.0
14
15
  Requires-Dist: gluonts>=0.16.0
15
16
  Requires-Dist: pandas<2.2.0,>=2.1.2
@@ -35,7 +35,14 @@
35
35
  },
36
36
  "outputs": [],
37
37
  "source": [
38
- "# !pip install tabpfn-time-series>=1.0.0"
38
+ "# !uv pip install tabpfn-time-series>=1.0.3"
39
+ ]
40
+ },
41
+ {
42
+ "cell_type": "markdown",
43
+ "metadata": {},
44
+ "source": [
45
+ "***Note: remember to restart the runtime after the installation.***"
39
46
  ]
40
47
  },
41
48
  {
@@ -1058,18 +1065,6 @@
1058
1065
  "display_name": "Python 3 (ipykernel)",
1059
1066
  "language": "python",
1060
1067
  "name": "python3"
1061
- },
1062
- "language_info": {
1063
- "codemirror_mode": {
1064
- "name": "ipython",
1065
- "version": 3
1066
- },
1067
- "file_extension": ".py",
1068
- "mimetype": "text/x-python",
1069
- "name": "python",
1070
- "nbconvert_exporter": "python",
1071
- "pygments_lexer": "ipython3",
1072
- "version": "3.12.11"
1073
1068
  }
1074
1069
  },
1075
1070
  "nbformat": 4,
@@ -24,6 +24,7 @@ dependencies = [
24
24
  "datasets>=4.0",
25
25
  "python-dotenv>=1.1.0",
26
26
  "pyyaml>=6.0.1",
27
+ "backoff>=2.2.1",
27
28
  ]
28
29
 
29
30
  [project.optional-dependencies]
@@ -2,7 +2,11 @@ import logging
2
2
  from enum import Enum
3
3
 
4
4
  from tabpfn_time_series.ts_dataframe import TimeSeriesDataFrame
5
- from tabpfn_time_series.tabpfn_worker import TabPFNClient, LocalTabPFN, MockTabPFN
5
+ from tabpfn_time_series.tabpfn_worker import (
6
+ TabPFNClient,
7
+ LocalTabPFN,
8
+ MockTabPFN,
9
+ )
6
10
  from tabpfn_time_series.defaults import TABPFN_TS_DEFAULT_CONFIG
7
11
 
8
12
  logger = logging.getLogger(__name__)
@@ -29,6 +33,7 @@ class TabPFNTimeSeriesPredictor:
29
33
  TabPFNMode.LOCAL: lambda: LocalTabPFN(config),
30
34
  TabPFNMode.MOCK: lambda: MockTabPFN(config),
31
35
  }
36
+ self.tabpfn_mode = tabpfn_mode
32
37
  self.tabpfn_worker = worker_mapping[tabpfn_mode]()
33
38
 
34
39
  def predict(
@@ -1,6 +1,8 @@
1
+ import contextvars
1
2
  import logging
2
3
  from abc import ABC, abstractmethod
3
- from joblib import Parallel, delayed
4
+ from joblib import Parallel, delayed, parallel_config
5
+ import backoff
4
6
 
5
7
  from tqdm import tqdm
6
8
  import pandas as pd
@@ -14,6 +16,9 @@ from tabpfn_time_series.defaults import TABPFN_TS_DEFAULT_QUANTILE_CONFIG
14
16
 
15
17
  logger = logging.getLogger(__name__)
16
18
 
19
+ # Per-call attempt counter, isolated per thread & task
20
+ _retry_attempts = contextvars.ContextVar("predict_attempts", default=0)
21
+
17
22
 
18
23
  class TabPFNWorker(ABC):
19
24
  def __init__(
@@ -29,24 +34,7 @@ class TabPFNWorker(ABC):
29
34
  train_tsdf: TimeSeriesDataFrame,
30
35
  test_tsdf: TimeSeriesDataFrame,
31
36
  ):
32
- predictions = Parallel(
33
- n_jobs=self.num_workers,
34
- backend="loky",
35
- )(
36
- delayed(self._prediction_routine)(
37
- item_id,
38
- train_tsdf.loc[item_id],
39
- test_tsdf.loc[item_id],
40
- )
41
- for item_id in tqdm(train_tsdf.item_ids, desc="Predicting time series")
42
- )
43
-
44
- predictions = pd.concat(predictions)
45
-
46
- # Sort predictions according to original item_ids order (important for MASE and WQL calculation)
47
- predictions = predictions.loc[train_tsdf.item_ids]
48
-
49
- return TimeSeriesDataFrame(predictions)
37
+ raise NotImplementedError("Predict method must be implemented in subclass")
50
38
 
51
39
  def _prediction_routine(
52
40
  self,
@@ -54,8 +42,6 @@ class TabPFNWorker(ABC):
54
42
  single_train_tsdf: TimeSeriesDataFrame,
55
43
  single_test_tsdf: TimeSeriesDataFrame,
56
44
  ) -> pd.DataFrame:
57
- # logger.debug(f"Predicting on item_id: {item_id}")
58
-
59
45
  test_index = single_test_tsdf.index
60
46
  train_X, train_y = split_time_series_to_X_y(single_train_tsdf.copy())
61
47
  test_X, _ = split_time_series_to_X_y(single_test_tsdf.copy())
@@ -116,6 +102,39 @@ class TabPFNWorker(ABC):
116
102
  return result
117
103
 
118
104
 
105
+ def _reset_attempts(_details=None):
106
+ """Convenience function to reset the attempt counter."""
107
+ _retry_attempts.set(0)
108
+
109
+
110
+ def _predict_giveup_mixed(exc: Exception) -> bool:
111
+ """Determine whether to give up on a prediction call or not.
112
+
113
+ Returns:
114
+ True if the prediction call should be given up on, False otherwise.
115
+ """
116
+ if _is_tabpfn_gcs_429(exc):
117
+ return False
118
+
119
+ # Stop after first retry for non-429
120
+ return _retry_attempts.get() >= 2
121
+
122
+
123
+ def _is_tabpfn_gcs_429(err: Exception) -> bool:
124
+ """Determine if an error is a 429 error raised from TabPFN API
125
+ and relates to GCS 429 errors.
126
+
127
+ Returns:
128
+ True if the error is a 429 error raised from TabPFN API.
129
+ """
130
+ markers = (
131
+ "TooManyRequests: 429",
132
+ "rateLimitExceeded",
133
+ "cloud.google.com/storage/docs/gcs429",
134
+ )
135
+ return any(m in str(err) for m in markers)
136
+
137
+
119
138
  class TabPFNClient(TabPFNWorker):
120
139
  def __init__(
121
140
  self,
@@ -135,6 +154,53 @@ class TabPFNClient(TabPFNWorker):
135
154
 
136
155
  super().__init__(config, num_workers)
137
156
 
157
+ def predict(
158
+ self,
159
+ train_tsdf: TimeSeriesDataFrame,
160
+ test_tsdf: TimeSeriesDataFrame,
161
+ ):
162
+ # Run the predictions in parallel
163
+ with parallel_config(backend="threading"):
164
+ results = Parallel(
165
+ n_jobs=self.num_workers,
166
+ )(
167
+ delayed(self._prediction_routine)(
168
+ item_id,
169
+ train_tsdf.loc[item_id],
170
+ test_tsdf.loc[item_id],
171
+ )
172
+ for item_id in tqdm(train_tsdf.item_ids, desc="Predicting time series")
173
+ )
174
+
175
+ # Convert list to DataFrame
176
+ predictions = pd.concat(results)
177
+
178
+ # Sort predictions according to original item_ids order (important for MASE and WQL calculation)
179
+ predictions = predictions.loc[train_tsdf.item_ids]
180
+
181
+ return TimeSeriesDataFrame(predictions)
182
+
183
+ @backoff.on_exception(
184
+ backoff.expo,
185
+ Exception,
186
+ base=1,
187
+ factor=2,
188
+ max_tries=5,
189
+ jitter=backoff.full_jitter,
190
+ giveup=_predict_giveup_mixed,
191
+ on_success=_reset_attempts,
192
+ )
193
+ def _prediction_routine(
194
+ self,
195
+ item_id: str,
196
+ single_train_tsdf: TimeSeriesDataFrame,
197
+ single_test_tsdf: TimeSeriesDataFrame,
198
+ ) -> pd.DataFrame:
199
+ # Increment attempt count at start of each try
200
+ _retry_attempts.set(_retry_attempts.get() + 1)
201
+
202
+ return super()._prediction_routine(item_id, single_train_tsdf, single_test_tsdf)
203
+
138
204
  def _get_tabpfn_engine(self):
139
205
  from tabpfn_client import TabPFNRegressor
140
206
 
@@ -84,7 +84,11 @@ class TestTabPFNTimeSeriesPredictor(unittest.TestCase):
84
84
  _ = TabPFNTimeSeriesPredictor(tabpfn_mode=TabPFNMode.LOCAL)
85
85
 
86
86
  @patch("torch.cuda.is_available", return_value=True)
87
- def test_init_with_local_mode_with_gpu(self, mock_is_available):
87
+ @patch("torch.cuda.device_count", return_value=1)
88
+ @patch("tabpfn_time_series.tabpfn_worker.LocalTabPFN._download_model")
89
+ def test_init_with_local_mode_with_gpu(
90
+ self, mock_download, mock_device_count, mock_is_available
91
+ ):
88
92
  """Test that the predictor initializes with LOCAL mode"""
89
93
  predictor = TabPFNTimeSeriesPredictor(tabpfn_mode=TabPFNMode.LOCAL)
90
94
  self.assertIsNotNone(predictor.tabpfn_worker)
@@ -1,5 +1,5 @@
1
1
  version = 1
2
- revision = 2
2
+ revision = 3
3
3
  requires-python = ">=3.10"
4
4
  resolution-markers = [
5
5
  "python_full_version >= '3.13' and sys_platform == 'linux'",
@@ -256,6 +256,15 @@ wheels = [
256
256
  { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" },
257
257
  ]
258
258
 
259
+ [[package]]
260
+ name = "backoff"
261
+ version = "2.2.1"
262
+ source = { registry = "https://pypi.org/simple" }
263
+ sdist = { url = "https://files.pythonhosted.org/packages/47/d7/5bbeb12c44d7c4f2fb5b56abce497eb5ed9f34d85701de869acedd602619/backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", size = 17001, upload-time = "2022-10-05T19:19:32.061Z" }
264
+ wheels = [
265
+ { url = "https://files.pythonhosted.org/packages/df/73/b6e24bd22e6720ca8ee9a85a0c4a2971af8497d8f3193fa05390cbd46e09/backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8", size = 15148, upload-time = "2022-10-05T19:19:30.546Z" },
266
+ ]
267
+
259
268
  [[package]]
260
269
  name = "backports-tarfile"
261
270
  version = "1.2.0"
@@ -612,6 +621,15 @@ wheels = [
612
621
  { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973, upload-time = "2024-10-09T18:35:44.272Z" },
613
622
  ]
614
623
 
624
+ [[package]]
625
+ name = "distro"
626
+ version = "1.9.0"
627
+ source = { registry = "https://pypi.org/simple" }
628
+ sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" }
629
+ wheels = [
630
+ { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" },
631
+ ]
632
+
615
633
  [[package]]
616
634
  name = "docutils"
617
635
  version = "0.21.2"
@@ -630,6 +648,15 @@ wheels = [
630
648
  { url = "https://files.pythonhosted.org/packages/87/62/9773de14fe6c45c23649e98b83231fffd7b9892b6cf863251dc2afa73643/einops-0.8.1-py3-none-any.whl", hash = "sha256:919387eb55330f5757c6bea9165c5ff5cfe63a642682ea788a6d472576d81737", size = 64359, upload-time = "2025-02-09T03:17:01.998Z" },
631
649
  ]
632
650
 
651
+ [[package]]
652
+ name = "eval-type-backport"
653
+ version = "0.2.2"
654
+ source = { registry = "https://pypi.org/simple" }
655
+ sdist = { url = "https://files.pythonhosted.org/packages/30/ea/8b0ac4469d4c347c6a385ff09dc3c048c2d021696664e26c7ee6791631b5/eval_type_backport-0.2.2.tar.gz", hash = "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1", size = 9079, upload-time = "2024-12-21T20:09:46.005Z" }
656
+ wheels = [
657
+ { url = "https://files.pythonhosted.org/packages/ce/31/55cd413eaccd39125368be33c46de24a1f639f2e12349b0361b4678f3915/eval_type_backport-0.2.2-py3-none-any.whl", hash = "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a", size = 5830, upload-time = "2024-12-21T20:09:44.175Z" },
658
+ ]
659
+
633
660
  [[package]]
634
661
  name = "exceptiongroup"
635
662
  version = "1.3.0"
@@ -662,11 +689,11 @@ wheels = [
662
689
 
663
690
  [[package]]
664
691
  name = "filelock"
665
- version = "3.18.0"
692
+ version = "3.19.1"
666
693
  source = { registry = "https://pypi.org/simple" }
667
- sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload-time = "2025-03-14T07:11:40.47Z" }
694
+ sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload-time = "2025-08-14T16:56:03.016Z" }
668
695
  wheels = [
669
- { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload-time = "2025-03-14T07:11:39.145Z" },
696
+ { url = "https://files.pythonhosted.org/packages/42/14/42b2651a2f46b022ccd948bca9f2d5af0fd8929c4eec235b8d6d844fbe67/filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d", size = 15988, upload-time = "2025-08-14T16:56:01.633Z" },
670
697
  ]
671
698
 
672
699
  [[package]]
@@ -2173,11 +2200,11 @@ wheels = [
2173
2200
 
2174
2201
  [[package]]
2175
2202
  name = "platformdirs"
2176
- version = "4.3.8"
2203
+ version = "4.4.0"
2177
2204
  source = { registry = "https://pypi.org/simple" }
2178
- sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" }
2205
+ sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" }
2179
2206
  wheels = [
2180
- { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" },
2207
+ { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" },
2181
2208
  ]
2182
2209
 
2183
2210
  [[package]]
@@ -2189,6 +2216,23 @@ wheels = [
2189
2216
  { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
2190
2217
  ]
2191
2218
 
2219
+ [[package]]
2220
+ name = "posthog"
2221
+ version = "6.7.5"
2222
+ source = { registry = "https://pypi.org/simple" }
2223
+ dependencies = [
2224
+ { name = "backoff" },
2225
+ { name = "distro" },
2226
+ { name = "python-dateutil" },
2227
+ { name = "requests" },
2228
+ { name = "six" },
2229
+ { name = "typing-extensions" },
2230
+ ]
2231
+ sdist = { url = "https://files.pythonhosted.org/packages/1f/f3/d9055bcd190980730bdc600318b34290e85fcb0afb1e31f83cdc33f92615/posthog-6.7.5.tar.gz", hash = "sha256:f4f32b4a4b0df531ae8f80f255a33a49e8880c8c1b62712e6b640535e33a905f", size = 118558, upload-time = "2025-09-16T12:40:34.431Z" }
2232
+ wheels = [
2233
+ { url = "https://files.pythonhosted.org/packages/42/b4/b40f8467252b4ff481e54a9767b211b4ff83114e6d0b6f481852d0ef3e46/posthog-6.7.5-py3-none-any.whl", hash = "sha256:95b00f915365939e63fa183635bad1caaf89cf4a24b63c8bb6983f2a22a56cb3", size = 136766, upload-time = "2025-09-16T12:40:32.741Z" },
2234
+ ]
2235
+
2192
2236
  [[package]]
2193
2237
  name = "pre-commit"
2194
2238
  version = "4.2.0"
@@ -2556,6 +2600,20 @@ wheels = [
2556
2600
  { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" },
2557
2601
  ]
2558
2602
 
2603
+ [[package]]
2604
+ name = "pydantic-settings"
2605
+ version = "2.10.1"
2606
+ source = { registry = "https://pypi.org/simple" }
2607
+ dependencies = [
2608
+ { name = "pydantic" },
2609
+ { name = "python-dotenv" },
2610
+ { name = "typing-inspection" },
2611
+ ]
2612
+ sdist = { url = "https://files.pythonhosted.org/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", size = 172583, upload-time = "2025-06-24T13:26:46.841Z" }
2613
+ wheels = [
2614
+ { url = "https://files.pythonhosted.org/packages/58/f0/427018098906416f580e3cf1366d3b1abfb408a0652e9f31600c24a1903c/pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796", size = 45235, upload-time = "2025-06-24T13:26:45.485Z" },
2615
+ ]
2616
+
2559
2617
  [[package]]
2560
2618
  name = "pygments"
2561
2619
  version = "2.19.2"
@@ -3357,25 +3415,30 @@ wheels = [
3357
3415
 
3358
3416
  [[package]]
3359
3417
  name = "tabpfn"
3360
- version = "2.0.9"
3418
+ version = "2.2.1"
3361
3419
  source = { registry = "https://pypi.org/simple" }
3362
3420
  dependencies = [
3363
3421
  { name = "einops" },
3422
+ { name = "eval-type-backport" },
3364
3423
  { name = "huggingface-hub" },
3424
+ { name = "joblib" },
3365
3425
  { name = "pandas" },
3426
+ { name = "pydantic" },
3427
+ { name = "pydantic-settings" },
3366
3428
  { name = "scikit-learn" },
3367
3429
  { name = "scipy" },
3430
+ { name = "tabpfn-common-utils", extra = ["telemetry-interactive"] },
3368
3431
  { name = "torch" },
3369
3432
  { name = "typing-extensions" },
3370
3433
  ]
3371
- sdist = { url = "https://files.pythonhosted.org/packages/cb/32/a705d6b426800e79338ed641cb7d96877e069289309455cb215df14126b6/tabpfn-2.0.9.tar.gz", hash = "sha256:7e6e006a61e8b08011c1a6761eef3c514c4ff16f5698ed655443c0704a3f93a6", size = 139991, upload-time = "2025-05-07T13:21:36.067Z" }
3434
+ sdist = { url = "https://files.pythonhosted.org/packages/e5/8b/ab7e3c71fc5fb6be61295ca1fb880b09df567257e9e4228d77cd79a4e1ec/tabpfn-2.2.1.tar.gz", hash = "sha256:706c03c3d3dc478118561761c29fa95727b6e239671922c4c40a8e4b3cc28fbf", size = 200487, upload-time = "2025-09-17T10:42:15.649Z" }
3372
3435
  wheels = [
3373
- { url = "https://files.pythonhosted.org/packages/35/f8/b0e7ff83484acfbe670b2f56c28c6bcf09ae84284e624cd45755a8b7073c/tabpfn-2.0.9-py3-none-any.whl", hash = "sha256:04e3bb989e9328d510ea4fccb6c6a36c8269630685d460af4df5eb268206bf21", size = 128881, upload-time = "2025-05-07T13:21:34.227Z" },
3436
+ { url = "https://files.pythonhosted.org/packages/91/e9/085c60d5e447083ac6705b7b8bfac90773eb4191c00ddc70607f4d8b339b/tabpfn-2.2.1-py3-none-any.whl", hash = "sha256:9aa3a0df8ecebcae5f426b1fec9bb2e2a690880bc8ad079191e8d959bf0f157b", size = 173723, upload-time = "2025-09-17T10:42:14.435Z" },
3374
3437
  ]
3375
3438
 
3376
3439
  [[package]]
3377
3440
  name = "tabpfn-client"
3378
- version = "0.1.7"
3441
+ version = "0.1.9"
3379
3442
  source = { registry = "https://pypi.org/simple" }
3380
3443
  dependencies = [
3381
3444
  { name = "httpx" },
@@ -3385,17 +3448,42 @@ dependencies = [
3385
3448
  { name = "scikit-learn" },
3386
3449
  { name = "sseclient-py" },
3387
3450
  { name = "tqdm" },
3451
+ { name = "typing-extensions" },
3388
3452
  { name = "xxhash" },
3389
3453
  ]
3390
- sdist = { url = "https://files.pythonhosted.org/packages/e2/cc/97be739da8d4113c13b8c9fa031908d59210005d38f944e0d678717cf91c/tabpfn_client-0.1.7.tar.gz", hash = "sha256:f8b82318ce22240b7622a05bea2422204ddd5374df335a19284eea0e2252924e", size = 17066065, upload-time = "2025-03-18T12:58:03.737Z" }
3454
+ sdist = { url = "https://files.pythonhosted.org/packages/50/8f/1bbca5db6561bc54f91ce41de99835a962a7a16c53bcfae0a7c5593f16a2/tabpfn_client-0.1.9.tar.gz", hash = "sha256:b68b27154686c37119a53b5063de79b45f4c0074fddf47b8813c5cd738b723cf", size = 1877401, upload-time = "2025-07-28T15:09:43.134Z" }
3455
+ wheels = [
3456
+ { url = "https://files.pythonhosted.org/packages/67/a5/82be418a16d7330eac880659b1ce7fbcff5c976ff79240b1446235e4ed40/tabpfn_client-0.1.9-py3-none-any.whl", hash = "sha256:51826f3a464b2d52d9c2772a6171c55a4c0ab22d9693f5bd2eb9fd5b0fd24640", size = 1895907, upload-time = "2025-07-28T15:09:41.605Z" },
3457
+ ]
3458
+
3459
+ [[package]]
3460
+ name = "tabpfn-common-utils"
3461
+ version = "0.1.9"
3462
+ source = { registry = "https://pypi.org/simple" }
3463
+ dependencies = [
3464
+ { name = "filelock" },
3465
+ { name = "numpy" },
3466
+ { name = "pandas" },
3467
+ { name = "platformdirs" },
3468
+ { name = "posthog" },
3469
+ { name = "scikit-learn" },
3470
+ { name = "typing-extensions" },
3471
+ ]
3472
+ sdist = { url = "https://files.pythonhosted.org/packages/4b/57/cecff3eed1c8068a7af14baf7dd2b3ae93c8f0770bce9402f2a3f74cdd68/tabpfn_common_utils-0.1.9.tar.gz", hash = "sha256:dd5213dc9736ff362826d46de9c54475ab3f7a4b4df73289d42edda088611b39", size = 1919585, upload-time = "2025-09-16T22:45:25.39Z" }
3391
3473
  wheels = [
3392
- { url = "https://files.pythonhosted.org/packages/5b/55/ba50a32b222616eb5653958fc94d91f54ab74109417ada52bb2aecb89a15/tabpfn_client-0.1.7-py3-none-any.whl", hash = "sha256:84245c893b06aa084795c31c04ec3f58186499dfcd7f6f2b8821f9a0a6028136", size = 1902270, upload-time = "2025-03-18T12:57:52.842Z" },
3474
+ { url = "https://files.pythonhosted.org/packages/cb/e0/04774d303b9ccb72c3aae9242fca55c0b8f540363a707612963ce55ed989/tabpfn_common_utils-0.1.9-py3-none-any.whl", hash = "sha256:69f0ee7a2f2689aa262e87b46d6d342002d68241711286a6917bf83ca51cadfd", size = 24872, upload-time = "2025-09-16T22:45:22.689Z" },
3475
+ ]
3476
+
3477
+ [package.optional-dependencies]
3478
+ telemetry-interactive = [
3479
+ { name = "requests" },
3393
3480
  ]
3394
3481
 
3395
3482
  [[package]]
3396
3483
  name = "tabpfn-time-series"
3397
3484
  source = { editable = "." }
3398
3485
  dependencies = [
3486
+ { name = "backoff" },
3399
3487
  { name = "datasets" },
3400
3488
  { name = "gluonts" },
3401
3489
  { name = "pandas" },
@@ -3424,6 +3512,7 @@ dev = [
3424
3512
 
3425
3513
  [package.metadata]
3426
3514
  requires-dist = [
3515
+ { name = "backoff", specifier = ">=2.2.1" },
3427
3516
  { name = "build", marker = "extra == 'dev'" },
3428
3517
  { name = "datasets", specifier = ">=4.0" },
3429
3518
  { name = "gluonts", specifier = ">=0.16.0" },