kumoai 2.13.0.dev202511211730__cp313-cp313-win_amd64.whl → 2.14.0.dev202512211732__cp313-cp313-win_amd64.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.
Files changed (50) hide show
  1. kumoai/__init__.py +12 -0
  2. kumoai/_version.py +1 -1
  3. kumoai/client/pquery.py +6 -2
  4. kumoai/connector/utils.py +23 -2
  5. kumoai/experimental/rfm/__init__.py +52 -52
  6. kumoai/experimental/rfm/authenticate.py +3 -4
  7. kumoai/experimental/rfm/backend/__init__.py +0 -0
  8. kumoai/experimental/rfm/backend/local/__init__.py +42 -0
  9. kumoai/experimental/rfm/{local_graph_store.py → backend/local/graph_store.py} +57 -110
  10. kumoai/experimental/rfm/backend/local/sampler.py +315 -0
  11. kumoai/experimental/rfm/backend/local/table.py +114 -0
  12. kumoai/experimental/rfm/backend/snow/__init__.py +37 -0
  13. kumoai/experimental/rfm/backend/snow/sampler.py +252 -0
  14. kumoai/experimental/rfm/backend/snow/table.py +169 -0
  15. kumoai/experimental/rfm/backend/sqlite/__init__.py +32 -0
  16. kumoai/experimental/rfm/backend/sqlite/sampler.py +349 -0
  17. kumoai/experimental/rfm/backend/sqlite/table.py +154 -0
  18. kumoai/experimental/rfm/base/__init__.py +33 -0
  19. kumoai/experimental/rfm/base/column.py +68 -0
  20. kumoai/experimental/rfm/base/column_expression.py +50 -0
  21. kumoai/experimental/rfm/base/sampler.py +773 -0
  22. kumoai/experimental/rfm/base/source.py +19 -0
  23. kumoai/experimental/rfm/base/sql_sampler.py +84 -0
  24. kumoai/experimental/rfm/base/sql_table.py +229 -0
  25. kumoai/experimental/rfm/{local_table.py → base/table.py} +219 -189
  26. kumoai/experimental/rfm/{local_graph.py → graph.py} +510 -91
  27. kumoai/experimental/rfm/infer/__init__.py +8 -0
  28. kumoai/experimental/rfm/infer/dtype.py +79 -0
  29. kumoai/experimental/rfm/infer/pkey.py +128 -0
  30. kumoai/experimental/rfm/infer/stype.py +35 -0
  31. kumoai/experimental/rfm/infer/time_col.py +61 -0
  32. kumoai/experimental/rfm/pquery/executor.py +27 -27
  33. kumoai/experimental/rfm/pquery/pandas_executor.py +30 -32
  34. kumoai/experimental/rfm/rfm.py +313 -245
  35. kumoai/experimental/rfm/sagemaker.py +15 -7
  36. kumoai/kumolib.cp313-win_amd64.pyd +0 -0
  37. kumoai/pquery/predictive_query.py +10 -6
  38. kumoai/testing/decorators.py +1 -1
  39. kumoai/testing/snow.py +50 -0
  40. kumoai/utils/__init__.py +3 -2
  41. kumoai/utils/progress_logger.py +178 -12
  42. kumoai/utils/sql.py +3 -0
  43. {kumoai-2.13.0.dev202511211730.dist-info → kumoai-2.14.0.dev202512211732.dist-info}/METADATA +10 -8
  44. {kumoai-2.13.0.dev202511211730.dist-info → kumoai-2.14.0.dev202512211732.dist-info}/RECORD +47 -27
  45. kumoai/experimental/rfm/local_graph_sampler.py +0 -182
  46. kumoai/experimental/rfm/local_pquery_driver.py +0 -689
  47. kumoai/experimental/rfm/utils.py +0 -344
  48. {kumoai-2.13.0.dev202511211730.dist-info → kumoai-2.14.0.dev202512211732.dist-info}/WHEEL +0 -0
  49. {kumoai-2.13.0.dev202511211730.dist-info → kumoai-2.14.0.dev202512211732.dist-info}/licenses/LICENSE +0 -0
  50. {kumoai-2.13.0.dev202511211730.dist-info → kumoai-2.14.0.dev202512211732.dist-info}/top_level.txt +0 -0
@@ -1,16 +1,23 @@
1
1
  import base64
2
2
  import json
3
- from typing import Any, Dict, List, Tuple
3
+ from typing import Any
4
4
 
5
- import boto3
6
5
  import requests
7
- from mypy_boto3_sagemaker_runtime.client import SageMakerRuntimeClient
8
- from mypy_boto3_sagemaker_runtime.type_defs import InvokeEndpointOutputTypeDef
9
6
 
10
7
  from kumoai.client import KumoClient
11
8
  from kumoai.client.endpoints import Endpoint, HTTPMethod
12
9
  from kumoai.exceptions import HTTPException
13
10
 
11
+ try:
12
+ # isort: off
13
+ from mypy_boto3_sagemaker_runtime.client import SageMakerRuntimeClient
14
+ from mypy_boto3_sagemaker_runtime.type_defs import (
15
+ InvokeEndpointOutputTypeDef, )
16
+ # isort: on
17
+ except ImportError:
18
+ SageMakerRuntimeClient = Any
19
+ InvokeEndpointOutputTypeDef = Any
20
+
14
21
 
15
22
  class SageMakerResponseAdapter(requests.Response):
16
23
  def __init__(self, sm_response: InvokeEndpointOutputTypeDef):
@@ -34,14 +41,15 @@ class SageMakerResponseAdapter(requests.Response):
34
41
 
35
42
  class KumoClient_SageMakerAdapter(KumoClient):
36
43
  def __init__(self, region: str, endpoint_name: str):
44
+ import boto3
37
45
  self._client: SageMakerRuntimeClient = boto3.client(
38
46
  service_name="sagemaker-runtime", region_name=region)
39
47
  self._endpoint_name = endpoint_name
40
48
 
41
49
  # Recording buffers.
42
50
  self._recording_active = False
43
- self._recorded_reqs: List[Dict[str, Any]] = []
44
- self._recorded_resps: List[Dict[str, Any]] = []
51
+ self._recorded_reqs: list[dict[str, Any]] = []
52
+ self._recorded_resps: list[dict[str, Any]] = []
45
53
 
46
54
  def authenticate(self) -> None:
47
55
  # TODO(siyang): call /ping to verify?
@@ -84,7 +92,7 @@ class KumoClient_SageMakerAdapter(KumoClient):
84
92
  self._recorded_reqs.clear()
85
93
  self._recorded_resps.clear()
86
94
 
87
- def end_recording(self) -> List[Tuple[Dict[str, Any], Dict[str, Any]]]:
95
+ def end_recording(self) -> list[tuple[dict[str, Any], dict[str, Any]]]:
88
96
  """Stop recording and return recorded requests/responses."""
89
97
  assert self._recording_active
90
98
  self._recording_active = False
Binary file
@@ -370,9 +370,11 @@ class PredictiveQuery:
370
370
  train_table_job_api = global_state.client.generate_train_table_job_api
371
371
  job_id: GenerateTrainTableJobID = train_table_job_api.create(
372
372
  GenerateTrainTableRequest(
373
- dict(custom_tags), pq_id, plan,
374
- graph_snapshot_id=self.graph.snapshot(
375
- non_blocking=non_blocking)))
373
+ dict(custom_tags),
374
+ pq_id,
375
+ plan,
376
+ None,
377
+ ))
376
378
 
377
379
  self._train_table = TrainingTableJob(job_id=job_id)
378
380
  if non_blocking:
@@ -451,9 +453,11 @@ class PredictiveQuery:
451
453
  bp_table_api = global_state.client.generate_prediction_table_job_api
452
454
  job_id: GeneratePredictionTableJobID = bp_table_api.create(
453
455
  GeneratePredictionTableRequest(
454
- dict(custom_tags), pq_id, plan,
455
- graph_snapshot_id=self.graph.snapshot(
456
- non_blocking=non_blocking)))
456
+ dict(custom_tags),
457
+ pq_id,
458
+ plan,
459
+ None,
460
+ ))
457
461
 
458
462
  self._prediction_table = PredictionTableJob(job_id=job_id)
459
463
  if non_blocking:
@@ -25,7 +25,7 @@ def onlyFullTest(func: Callable) -> Callable:
25
25
  def has_package(package: str) -> bool:
26
26
  r"""Returns ``True`` in case ``package`` is installed."""
27
27
  req = Requirement(package)
28
- if importlib.util.find_spec(req.name) is None:
28
+ if importlib.util.find_spec(req.name) is None: # type: ignore
29
29
  return False
30
30
 
31
31
  try:
kumoai/testing/snow.py ADDED
@@ -0,0 +1,50 @@
1
+ import json
2
+ import os
3
+
4
+ from kumoai.experimental.rfm.backend.snow import Connection
5
+ from kumoai.experimental.rfm.backend.snow import connect as _connect
6
+
7
+
8
+ def connect(
9
+ region: str,
10
+ id: str,
11
+ account: str,
12
+ user: str,
13
+ warehouse: str,
14
+ database: str | None = None,
15
+ schema: str | None = None,
16
+ ) -> Connection:
17
+
18
+ kwargs = dict(password=os.getenv('SNOWFLAKE_PASSWORD'))
19
+ if kwargs['password'] is None:
20
+ import boto3
21
+ from cryptography.hazmat.primitives import serialization
22
+
23
+ client = boto3.client(
24
+ service_name='secretsmanager',
25
+ region_name=region,
26
+ )
27
+ secret_id = (f'arn:aws:secretsmanager:{region}:{id}:secret:'
28
+ f'{account}.snowflakecomputing.com')
29
+ response = client.get_secret_value(SecretId=secret_id)['SecretString']
30
+ secret = json.loads(response)
31
+
32
+ private_key = serialization.load_pem_private_key(
33
+ secret['kumo_user_secretkey'].encode(),
34
+ password=None,
35
+ )
36
+ kwargs['private_key'] = private_key.private_bytes(
37
+ encoding=serialization.Encoding.DER,
38
+ format=serialization.PrivateFormat.PKCS8,
39
+ encryption_algorithm=serialization.NoEncryption(),
40
+ )
41
+
42
+ return _connect(
43
+ account=account,
44
+ user=user,
45
+ warehouse='WH_XS',
46
+ database='KUMO',
47
+ schema=schema,
48
+ session_parameters=dict(CLIENT_TELEMETRY_ENABLED=False),
49
+ **kwargs,
50
+ )
kumoai/utils/__init__.py CHANGED
@@ -1,10 +1,11 @@
1
- from .progress_logger import ProgressLogger, InteractiveProgressLogger
1
+ from .sql import quote_ident
2
+ from .progress_logger import ProgressLogger
2
3
  from .forecasting import ForecastVisualizer
3
4
  from .datasets import from_relbench
4
5
 
5
6
  __all__ = [
7
+ 'quote_ident',
6
8
  'ProgressLogger',
7
- 'InteractiveProgressLogger',
8
9
  'ForecastVisualizer',
9
10
  'from_relbench',
10
11
  ]
@@ -1,6 +1,7 @@
1
+ import re
1
2
  import sys
2
3
  import time
3
- from typing import Any, List, Optional, Union
4
+ from typing import Any
4
5
 
5
6
  from rich.console import Console, ConsoleOptions, RenderResult
6
7
  from rich.live import Live
@@ -20,12 +21,22 @@ from typing_extensions import Self
20
21
 
21
22
 
22
23
  class ProgressLogger:
23
- def __init__(self, msg: str) -> None:
24
+ def __init__(self, msg: str, verbose: bool = True) -> None:
24
25
  self.msg = msg
25
- self.logs: List[str] = []
26
+ self.verbose = verbose
27
+
28
+ self.logs: list[str] = []
29
+
30
+ self.start_time: float | None = None
31
+ self.end_time: float | None = None
32
+
33
+ @classmethod
34
+ def default(cls, msg: str, verbose: bool = True) -> 'ProgressLogger':
35
+ from kumoai import in_snowflake_notebook
26
36
 
27
- self.start_time: Optional[float] = None
28
- self.end_time: Optional[float] = None
37
+ if in_snowflake_notebook():
38
+ return StreamlitProgressLogger(msg, verbose)
39
+ return RichProgressLogger(msg, verbose)
29
40
 
30
41
  @property
31
42
  def duration(self) -> float:
@@ -37,6 +48,12 @@ class ProgressLogger:
37
48
  def log(self, msg: str) -> None:
38
49
  self.logs.append(msg)
39
50
 
51
+ def init_progress(self, total: int, description: str) -> None:
52
+ pass
53
+
54
+ def step(self) -> None:
55
+ pass
56
+
40
57
  def __enter__(self) -> Self:
41
58
  self.start_time = time.perf_counter()
42
59
  return self
@@ -66,22 +83,21 @@ class ColoredTimeRemainingColumn(TimeRemainingColumn):
66
83
  return Text(str(super().render(task)), style=self.style)
67
84
 
68
85
 
69
- class InteractiveProgressLogger(ProgressLogger):
86
+ class RichProgressLogger(ProgressLogger):
70
87
  def __init__(
71
88
  self,
72
89
  msg: str,
73
90
  verbose: bool = True,
74
91
  refresh_per_second: int = 10,
75
92
  ) -> None:
76
- super().__init__(msg=msg)
93
+ super().__init__(msg=msg, verbose=verbose)
77
94
 
78
- self.verbose = verbose
79
95
  self.refresh_per_second = refresh_per_second
80
96
 
81
- self._progress: Optional[Progress] = None
82
- self._task: Optional[int] = None
97
+ self._progress: Progress | None = None
98
+ self._task: int | None = None
83
99
 
84
- self._live: Optional[Live] = None
100
+ self._live: Live | None = None
85
101
  self._exception: bool = False
86
102
 
87
103
  def init_progress(self, total: int, description: str) -> None:
@@ -151,7 +167,7 @@ class InteractiveProgressLogger(ProgressLogger):
151
167
 
152
168
  table = Table.grid(padding=(0, 1))
153
169
 
154
- icon: Union[Text, Padding]
170
+ icon: Text | Padding
155
171
  if self._exception:
156
172
  style = 'red'
157
173
  icon = Text('❌', style=style)
@@ -175,3 +191,153 @@ class InteractiveProgressLogger(ProgressLogger):
175
191
 
176
192
  if self.verbose and self._progress is not None:
177
193
  yield self._progress.get_renderable()
194
+
195
+
196
+ class StreamlitProgressLogger(ProgressLogger):
197
+ def __init__(
198
+ self,
199
+ msg: str,
200
+ verbose: bool = True,
201
+ ) -> None:
202
+ super().__init__(msg=msg, verbose=verbose)
203
+
204
+ self._status: Any = None
205
+
206
+ self._total = 0
207
+ self._current = 0
208
+ self._description: str = ''
209
+ self._progress: Any = None
210
+
211
+ def __enter__(self) -> Self:
212
+ super().__enter__()
213
+
214
+ import streamlit as st
215
+
216
+ # Adjust layout for prettier output:
217
+ st.markdown(STREAMLIT_CSS, unsafe_allow_html=True)
218
+
219
+ if self.verbose:
220
+ self._status = st.status(
221
+ f':blue[{self._sanitize_text(self.msg)}]',
222
+ expanded=True,
223
+ )
224
+
225
+ return self
226
+
227
+ def log(self, msg: str) -> None:
228
+ super().log(msg)
229
+ if self.verbose and self._status is not None:
230
+ self._status.write(self._sanitize_text(msg))
231
+
232
+ def init_progress(self, total: int, description: str) -> None:
233
+ if self.verbose and self._status is not None:
234
+ self._total = total
235
+ self._current = 0
236
+ self._description = self._sanitize_text(description)
237
+ percent = min(self._current / self._total, 1.0)
238
+ self._progress = self._status.progress(
239
+ value=percent,
240
+ text=f'{self._description} [{self._current}/{self._total}]',
241
+ )
242
+
243
+ def step(self) -> None:
244
+ self._current += 1
245
+
246
+ if self.verbose and self._progress is not None:
247
+ percent = min(self._current / self._total, 1.0)
248
+ self._progress.progress(
249
+ value=percent,
250
+ text=f'{self._description} [{self._current}/{self._total}]',
251
+ )
252
+
253
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
254
+ super().__exit__(exc_type, exc_val, exc_tb)
255
+
256
+ if not self.verbose or self._status is None:
257
+ return
258
+
259
+ label = f'{self._sanitize_text(self.msg)} ({self.duration:.2f}s)'
260
+
261
+ if exc_type is not None:
262
+ self._status.update(
263
+ label=f':red[{label}]',
264
+ state='error',
265
+ expanded=True,
266
+ )
267
+ else:
268
+ self._status.update(
269
+ label=f':green[{label}]',
270
+ state='complete',
271
+ expanded=True,
272
+ )
273
+
274
+ @staticmethod
275
+ def _sanitize_text(msg: str) -> str:
276
+ return re.sub(r'\[/?bold\]', '**', msg)
277
+
278
+
279
+ STREAMLIT_CSS = """
280
+ <style>
281
+ /* Fix horizontal scrollbar */
282
+ .stExpander summary {
283
+ width: auto;
284
+ }
285
+
286
+ /* Fix paddings/margins */
287
+ .stExpander summary {
288
+ padding: 0.75rem 1rem 0.5rem;
289
+ }
290
+ .stExpander p {
291
+ margin: 0px 0px 0.2rem;
292
+ }
293
+ .stExpander [data-testid="stExpanderDetails"] {
294
+ padding-bottom: 1.45rem;
295
+ }
296
+ .stExpander .stProgress div:first-child {
297
+ padding-bottom: 4px;
298
+ }
299
+
300
+ /* Fix expand icon position */
301
+ .stExpander summary svg {
302
+ height: 1.5rem;
303
+ }
304
+
305
+ /* Fix summary icons */
306
+ .stExpander summary [data-testid="stExpanderIconCheck"] {
307
+ font-size: 1.8rem;
308
+ margin-top: -3px;
309
+ color: rgb(21, 130, 55);
310
+ }
311
+ .stExpander summary [data-testid="stExpanderIconError"] {
312
+ font-size: 1.8rem;
313
+ margin-top: -3px;
314
+ color: rgb(255, 43, 43);
315
+ }
316
+ .stExpander summary span:first-child span:first-child {
317
+ width: 1.6rem;
318
+ }
319
+
320
+ /* Add border between title and content */
321
+ .stExpander [data-testid="stExpanderDetails"] {
322
+ border-top: 1px solid rgba(30, 37, 47, 0.2);
323
+ padding-top: 0.5rem;
324
+ }
325
+
326
+ /* Fix title font size */
327
+ .stExpander summary p {
328
+ font-size: 1rem;
329
+ }
330
+
331
+ /* Gray out content */
332
+ .stExpander [data-testid="stExpanderDetails"] {
333
+ color: rgba(30, 37, 47, 0.5);
334
+ }
335
+
336
+ /* Fix progress bar font size */
337
+ .stExpander .stProgress p {
338
+ line-height: 1.6;
339
+ font-size: 1rem;
340
+ color: rgba(30, 37, 47, 0.5);
341
+ }
342
+ </style>
343
+ """
kumoai/utils/sql.py ADDED
@@ -0,0 +1,3 @@
1
+ def quote_ident(name: str) -> str:
2
+ r"""Quotes a SQL identifier."""
3
+ return '"' + name.replace('"', '""') + '"'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kumoai
3
- Version: 2.13.0.dev202511211730
3
+ Version: 2.14.0.dev202512211732
4
4
  Summary: AI on the Modern Data Stack
5
5
  Author-email: "Kumo.AI" <hello@kumo.ai>
6
6
  License-Expression: MIT
@@ -23,13 +23,11 @@ Requires-Dist: requests>=2.28.2
23
23
  Requires-Dist: urllib3
24
24
  Requires-Dist: plotly
25
25
  Requires-Dist: typing_extensions>=4.5.0
26
- Requires-Dist: kumo-api==0.46.0
26
+ Requires-Dist: kumo-api==0.49.0
27
27
  Requires-Dist: tqdm>=4.66.0
28
28
  Requires-Dist: aiohttp>=3.10.0
29
29
  Requires-Dist: pydantic>=1.10.21
30
30
  Requires-Dist: rich>=9.0.0
31
- Requires-Dist: mypy-boto3-sagemaker-runtime
32
- Requires-Dist: boto3
33
31
  Provides-Extra: doc
34
32
  Requires-Dist: sphinx; extra == "doc"
35
33
  Requires-Dist: sphinx-book-theme; extra == "doc"
@@ -40,13 +38,17 @@ Provides-Extra: test
40
38
  Requires-Dist: pytest; extra == "test"
41
39
  Requires-Dist: pytest-mock; extra == "test"
42
40
  Requires-Dist: requests-mock; extra == "test"
43
- Provides-Extra: test-sagemaker
44
- Requires-Dist: sagemaker; extra == "test-sagemaker"
45
- Requires-Dist: pandas==2.1.4; extra == "test-sagemaker"
46
- Requires-Dist: pyarrow==12.0.1; extra == "test-sagemaker"
41
+ Provides-Extra: sqlite
42
+ Requires-Dist: adbc_driver_sqlite; extra == "sqlite"
43
+ Provides-Extra: snowflake
44
+ Requires-Dist: numpy<2.0; extra == "snowflake"
45
+ Requires-Dist: snowflake-connector-python; extra == "snowflake"
46
+ Requires-Dist: pyyaml; extra == "snowflake"
47
47
  Provides-Extra: sagemaker
48
48
  Requires-Dist: boto3<2.0,>=1.30.0; extra == "sagemaker"
49
49
  Requires-Dist: mypy-boto3-sagemaker-runtime<2.0,>=1.34.0; extra == "sagemaker"
50
+ Provides-Extra: test-sagemaker
51
+ Requires-Dist: sagemaker<3.0; extra == "test-sagemaker"
50
52
  Dynamic: license-file
51
53
  Dynamic: requires-dist
52
54
 
@@ -1,13 +1,13 @@
1
- kumoai/__init__.py,sha256=qu-qohU2cQlManX1aZIlzA3ivKl52m-cSQBPSW8urUU,10837
1
+ kumoai/__init__.py,sha256=aDhb7KGetDnOz54u1Fd45zfM2N8oAha6XT2CvJqOvgc,11146
2
2
  kumoai/_logging.py,sha256=qL4JbMQwKXri2f-SEJoFB8TY5ALG12S-nobGTNWxW-A,915
3
3
  kumoai/_singleton.py,sha256=i2BHWKpccNh5SJGDyU0IXsnYzJAYr8Xb0wz4c6LRbpo,861
4
- kumoai/_version.py,sha256=SG9nFVn5zQGjYC2bJHf14ClhCtvj0GzhN9puMBHh-sE,39
4
+ kumoai/_version.py,sha256=r_ZJN4_1Q2z42px3GUoxeFu6s1G0ZVF0s5q_k2WJWS8,39
5
5
  kumoai/databricks.py,sha256=ahwJz6DWLXMkndT0XwEDBxF-hoqhidFR8wBUQ4TLZ68,490
6
6
  kumoai/exceptions.py,sha256=7TMs0SC8xrU009_Pgd4QXtSF9lxJq8MtRbeX9pcQUy4,859
7
7
  kumoai/formatting.py,sha256=o3uCnLwXPhe1KI5WV9sBgRrcU7ed4rgu_pf89GL9Nc0,983
8
8
  kumoai/futures.py,sha256=J8rtZMEYFzdn5xF_x-LAiKJz3KGL6PT02f6rq_2bOJk,3836
9
9
  kumoai/jobs.py,sha256=dCi7BAdfm2tCnonYlGU4WJokJWbh3RzFfaOX2EYCIHU,2576
10
- kumoai/kumolib.cp313-win_amd64.pyd,sha256=zGjPGB2ZMjNhMO36idf5SlFWF4OREd1Jn1YeQ2ul7WY,198144
10
+ kumoai/kumolib.cp313-win_amd64.pyd,sha256=Etr0FROvpwYRpjsHqdfGr7kmcROvj273xJnJxK1B2ew,198144
11
11
  kumoai/mixin.py,sha256=IaiB8SAI0VqOoMVzzIaUlqMt53-QPUK6OB0HikG-V9E,840
12
12
  kumoai/spcs.py,sha256=KWfENrwSLruprlD-QPh63uU0N6npiNrwkeKfBk3EUyQ,4260
13
13
  kumoai/artifact_export/__init__.py,sha256=UXAQI5q92ChBzWAk8o3J6pElzYHudAzFZssQXd4o7i8,247
@@ -20,7 +20,7 @@ kumoai/client/endpoints.py,sha256=DpEKEQ1yvL15iHZadXZKO94t-qXrYLaeV1sknX4IuPg,55
20
20
  kumoai/client/graph.py,sha256=6MFyPYxDPfGTWeAI_84RUgWx9rVvqbLnR0Ourtgj5rg,3951
21
21
  kumoai/client/jobs.py,sha256=Y8wKiTk1I5ywc-2cxR72LaBjfhPTCVOezSCTeDpTs8Q,17521
22
22
  kumoai/client/online.py,sha256=4s_8Sv8m_k_tty4CO7RuAt0e6BDMkGvsZZ3VX8zyDb8,2798
23
- kumoai/client/pquery.py,sha256=0pXgQLxjoaFWDif0XRAuC_P-X3OSnXNWsiVrXej9uMk,7094
23
+ kumoai/client/pquery.py,sha256=8hBT44-1gc2QoO-tjdDsJXJA4mLO1thmS27b4XDlUUY,7298
24
24
  kumoai/client/rfm.py,sha256=Gmt_dqoXekBCLiF0eQPgpoJ1cbnhnU8VbINF3U13qbQ,3838
25
25
  kumoai/client/source_table.py,sha256=mMHJtQ_yUHRI9LdHLVHxNGt83bbzmC1_d-NmXjbiTuI,2154
26
26
  kumoai/client/table.py,sha256=VhjLEMLQS1Z7zjcb2Yt3gZfiVqiD7b1gj-WNux_504A,3336
@@ -50,37 +50,56 @@ kumoai/connector/glue_connector.py,sha256=kqT2q53Da7PeeaZrvLVzFXC186E7glh5eGitKL
50
50
  kumoai/connector/s3_connector.py,sha256=AUzENbQ20bYXh3XOXEOsWRKlaGGkm3YrW9JfBLm-LqY,10433
51
51
  kumoai/connector/snowflake_connector.py,sha256=tQzIWxC4oDGqxFt0212w5eoIPT4QBP2nuF9SdKRNwNI,9274
52
52
  kumoai/connector/source_table.py,sha256=fnqwIKY6qYo4G0EsRzchb6FgZ-dQyU6aRaD9UAxsml0,18010
53
- kumoai/connector/utils.py,sha256=SlkjPJS_wqfwFzIaQOHZtENQnbOz5sgLbvvvPDXE1ww,65786
53
+ kumoai/connector/utils.py,sha256=5K9BMdWiIP3hhdkUc6Xt1e0xv5YyziXtZ4PnBqq0Ehw,66490
54
54
  kumoai/encoder/__init__.py,sha256=8FeP6mUyCeXxr1b8kUIi5dxe5vEXQRft9tPoaV1CBqg,186
55
55
  kumoai/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
- kumoai/experimental/rfm/__init__.py,sha256=gpjpeN8PT3ZESi6kUaeyZqYnoJnysRVXDaY9hrycJA4,7020
57
- kumoai/experimental/rfm/authenticate.py,sha256=G89_4TMeUpr5fG_0VTzMF5sdNhaciitA1oc2loTlTmo,19321
58
- kumoai/experimental/rfm/local_graph.py,sha256=nZ9hDfyWg1dHFLoTEKoLt0ZJPvf9MUA1MNyfTRzJThg,30886
59
- kumoai/experimental/rfm/local_graph_sampler.py,sha256=3JNpktW__nwxVKZxP4cQBgsIin7J_LNXYS7YlV36xbU,6854
60
- kumoai/experimental/rfm/local_graph_store.py,sha256=eUuIMFcdIRqN1kRxnqOdJpKEt-S_oyupAyHr7YuQoSU,14206
61
- kumoai/experimental/rfm/local_pquery_driver.py,sha256=Yd_yHIrvuDj16IC1pvsqiQvZS41vvOOCRMiuDGtN6Fk,26851
62
- kumoai/experimental/rfm/local_table.py,sha256=5H08657TIyH7n_QnpFKr2g4BtVqdXTymmrfhSGaDmkU,20150
63
- kumoai/experimental/rfm/rfm.py,sha256=R48eqqCvHin7Knms6sptsmAQSpMm2v-PlyPD3dxj6wY,49268
64
- kumoai/experimental/rfm/sagemaker.py,sha256=eebpZtASqiIGF2FpY53bbWLj6p-u5hkK4RLgBNAvEzg,4953
65
- kumoai/experimental/rfm/utils.py,sha256=dLx2wdyTWg7vZI_7R-I0z_lA-2aV5M8h9n3bnnLyylI,11467
66
- kumoai/experimental/rfm/infer/__init__.py,sha256=fPsdDr4D3hgC8snW0j3pAVpCyR-xrauuogMnTOMrfok,304
56
+ kumoai/experimental/rfm/__init__.py,sha256=Hws948dE_YfBSR2GEEHiZMcqctahIqH7CrlRRhdgIVU,7332
57
+ kumoai/experimental/rfm/authenticate.py,sha256=odKaqOAEkdC_wB340cs_ozjSvQLTce45WLiJSEzQaL8,19283
58
+ kumoai/experimental/rfm/graph.py,sha256=hJuZrNF5xC03REY06W-985fuXzI1Kll8hpbtgUt4UCE,47499
59
+ kumoai/experimental/rfm/rfm.py,sha256=OWFKebezAkGpEzZCf4DgyepCVbpzpZxhiUYZ0V9g60o,51447
60
+ kumoai/experimental/rfm/sagemaker.py,sha256=7Yk4um0gBBn7u-Bz8JRv53z0__FcD0uESoiImJhxsBw,5101
61
+ kumoai/experimental/rfm/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
+ kumoai/experimental/rfm/backend/local/__init__.py,sha256=8JbLaai0yhtldFcDkddphIJKMiKc0XnodvYBWkrGPXI,1056
63
+ kumoai/experimental/rfm/backend/local/graph_store.py,sha256=Nx9cDZG_Fi1fMUPi1R9xZ3k0vAOky8UutRiQdyAo-9w,12160
64
+ kumoai/experimental/rfm/backend/local/sampler.py,sha256=p59f6pU4g2GpyXh8EP9eWHDsL17Ck3xX_0bZ-R68PHI,11151
65
+ kumoai/experimental/rfm/backend/local/table.py,sha256=vEuvtett3oaO-AhlrJMMhqsA87IgQRfqnAI-vesD5D0,3933
66
+ kumoai/experimental/rfm/backend/snow/__init__.py,sha256=lsF0sJXZ0Pc3NvBTBXJHudp-iZJXdidrhyqFQKEU5_Q,1030
67
+ kumoai/experimental/rfm/backend/snow/sampler.py,sha256=v3dGIK4RKxNUULlmwa7UKwa8H8ap4dh4lzHWHzTVsDk,10262
68
+ kumoai/experimental/rfm/backend/snow/table.py,sha256=9BZXCiqySU2Cq_dNdv1wsc09MfDWr_uOuKYgXBM_1G0,6451
69
+ kumoai/experimental/rfm/backend/sqlite/__init__.py,sha256=wkSr2D_E5VCH4RGW8FCN2iJp-6wb_RTCMO8R3p5lkiw,934
70
+ kumoai/experimental/rfm/backend/sqlite/sampler.py,sha256=fGU6r0X0sAZ-OFkZOyK94kKuW4KduRJZX8KIE8viQRU,14591
71
+ kumoai/experimental/rfm/backend/sqlite/table.py,sha256=hrxaNVX9KEVa27htdvDseLVcch8RboEiLkwthFj9OXk,6137
72
+ kumoai/experimental/rfm/base/__init__.py,sha256=YE9E5x5DUT-RQxpanlNl5WZiSeYaxJbzc_uRVMV39UY,918
73
+ kumoai/experimental/rfm/base/column.py,sha256=5t4UBANg-Se3BXL4uiXbAfI-C9DQV_iAiM8sglUjFDA,2356
74
+ kumoai/experimental/rfm/base/column_expression.py,sha256=CBD5LXBdVDYjSiUM42FXCObKNEF8V4u9upVOpU5VTAk,1311
75
+ kumoai/experimental/rfm/base/sampler.py,sha256=Pi_UcdCxpoIXIYDDGTn0hYYQZbMbvC75dwEjPz_wMic,32222
76
+ kumoai/experimental/rfm/base/source.py,sha256=-I_yBCGWuCpD4j2I7hzfl3Cj8A25rXAGCpih5_0ShwY,313
77
+ kumoai/experimental/rfm/base/sql_sampler.py,sha256=4soPQ50g4jJhMb-EZyOsxrIXdPOx4-vppJalAd8l4fg,2682
78
+ kumoai/experimental/rfm/base/sql_table.py,sha256=DT9D0pHJc4oQERNL3hVdzzjd1vR_faEnLc_OSG8d-Xg,8480
79
+ kumoai/experimental/rfm/base/table.py,sha256=FTnv6AOMRTsZToQNcl7ACAL__aR6mCh9BurAOe6sEx8,21021
80
+ kumoai/experimental/rfm/infer/__init__.py,sha256=Uf4Od7B2G80U61mkkxsnxHPGu1Hh2RqOazTkOYtNLvA,538
67
81
  kumoai/experimental/rfm/infer/categorical.py,sha256=bqmfrE5ZCBTcb35lA4SyAkCu3MgttAn29VBJYMBNhVg,893
82
+ kumoai/experimental/rfm/infer/dtype.py,sha256=enZ-b8NmSlY687P59y7Kelq9vZJjq3Q-h7EyrPNfRRc,2714
68
83
  kumoai/experimental/rfm/infer/id.py,sha256=xaJBETLZa8ttzZCsDwFSwfyCi3VYsLc_kDWT_t_6Ih4,954
69
84
  kumoai/experimental/rfm/infer/multicategorical.py,sha256=D-1KwYRkOSkBrOJr4Xa3eTCoAF9O9hPGa7Vg67V5_HU,1150
85
+ kumoai/experimental/rfm/infer/pkey.py,sha256=GCAUN8Hz5-leVv2-H8soP3k-DsXJ1O_uQU25-CsSWN0,4540
86
+ kumoai/experimental/rfm/infer/stype.py,sha256=lOgiGJ_rsaeiFWyVUw0IMwn_7hGOqL8mvy2rGzXfi3Q,929
87
+ kumoai/experimental/rfm/infer/time_col.py,sha256=-OJbjHxD05UuSF2ePBkywzm-h2Qd9kC4BEFaHuglUbs,1850
70
88
  kumoai/experimental/rfm/infer/timestamp.py,sha256=L2VxjtYTSyUBYAo4M-L08xSQlPpqnHMAVF5_vxjh3Y0,1135
71
89
  kumoai/experimental/rfm/pquery/__init__.py,sha256=RkTn0I74uXOUuOiBpa6S-_QEYctMutkUnBEfF9ztQzI,159
72
- kumoai/experimental/rfm/pquery/executor.py,sha256=S8wwXbAkH-YSnmEVYB8d6wyJF4JJ003mH_0zFTvOp_I,2843
73
- kumoai/experimental/rfm/pquery/pandas_executor.py,sha256=QQpOZ_ArH3eSAkenaY3J-gW1Wn5A7f85RiqZxaO5u1Q,19019
90
+ kumoai/experimental/rfm/pquery/executor.py,sha256=mz5mqhHbgZM0f5oNFLyThWGM4UePx_kd1O4zyJ_8ToQ,2830
91
+ kumoai/experimental/rfm/pquery/pandas_executor.py,sha256=awZSp41i0qTPzMowWJ1-FY4rbpTH7hxMeV91drEPfUQ,18984
74
92
  kumoai/graph/__init__.py,sha256=QGk3OMwRzQJSGESdcc7hcQH6UDmNVJYTdqnRren4c7Q,240
75
93
  kumoai/graph/column.py,sha256=cQhioibTbIKIBZ-bf8-Bt4F4Iblhidps-CYWrkxRPnE,4295
76
94
  kumoai/graph/graph.py,sha256=Pq-dxi4MwoDtrrwm3xeyUB9Hl7ryNfHq4rMHuvyNB3c,39239
77
95
  kumoai/graph/table.py,sha256=BB-4ezyd7hrrj6QZwRBa80ySH0trwYb4fmhRn3xoK-k,34726
78
96
  kumoai/pquery/__init__.py,sha256=FF6QUTG_xrz2ic1I8NcIa8O993Ae98eZ9gkvQ4rapgo,558
79
97
  kumoai/pquery/prediction_table.py,sha256=hWG4L_ze4PLgUoxCXNKk8_nkYxVXELQs8_X8KGOE9yk,11063
80
- kumoai/pquery/predictive_query.py,sha256=GWhQpQxf6apyyu-bvE3z63mX6NLd8lKbyu_jzj7rNms,25608
98
+ kumoai/pquery/predictive_query.py,sha256=I5Ntc7YO1qEGxKrLuhAzZO3SySr8Wnjhde8eDbbB7zk,25542
81
99
  kumoai/pquery/training_table.py,sha256=L1QjaVlY4SAPD8OUmTaH6YjZzBbPOnS9mnAT69znWv0,16233
82
100
  kumoai/testing/__init__.py,sha256=XBQ_Sa3WnOYlpXZ3gUn8w6nVfZt-nfPhytfIBeiPt4w,178
83
- kumoai/testing/decorators.py,sha256=yznguzsdkL0UaZtBbnO6oaUrXisJvziaiO3dmN41UXE,1648
101
+ kumoai/testing/decorators.py,sha256=p79ZCQqPY_MHWy0_l7-xQ6wUIqFTn4AbrGWTHLvpbQY,1664
102
+ kumoai/testing/snow.py,sha256=i0m8y7ciqUnQeP1Xe_-bOxVh_xyAuuyz_rTEHJFkYY0,1537
84
103
  kumoai/trainer/__init__.py,sha256=uCFXy9bw_byn_wYd3M-BTZCHTVvv4XXr8qRlh-QOvag,981
85
104
  kumoai/trainer/baseline_trainer.py,sha256=oXweh8j1sar6KhQfr3A7gmQxcDq7SG0Bx3jIenbtyC4,4117
86
105
  kumoai/trainer/config.py,sha256=7_Jv1w1mqaokCQwQdJkqCSgVpmh8GqE3fL1Ky_vvttI,100
@@ -88,12 +107,13 @@ kumoai/trainer/job.py,sha256=IBP2SeIk21XpRK1Um1NIs2dEKid319cHu6UkCjKO6jc,46130
88
107
  kumoai/trainer/online_serving.py,sha256=T1jicl-qXiiWGQWUCwlfQsyxWUODybj_975gx9yglH4,9824
89
108
  kumoai/trainer/trainer.py,sha256=AKumc3X2Vm3qxZSA85Dv_fSLC4JQ3rM7P0ixOWbEex0,20608
90
109
  kumoai/trainer/util.py,sha256=LCXkY5MNl6NbEVd2OZ0aVqF6fvr3KiCFh6pH0igAi_g,4165
91
- kumoai/utils/__init__.py,sha256=wAKgmwtMIGuiauW9D_GGKH95K-24Kgwmld27mm4nsro,278
110
+ kumoai/utils/__init__.py,sha256=lazi9gAl5YBg1Nk121zSDg-BIKTVETjFTZwTFUlGngo,267
92
111
  kumoai/utils/datasets.py,sha256=UyAII-oAn7x3ombuvpbSQ41aVF9SYKBjQthTD-vcT2A,3011
93
112
  kumoai/utils/forecasting.py,sha256=ZgKeUCbWLOot0giAkoigwU5du8LkrwAicFOi5hVn6wg,7624
94
- kumoai/utils/progress_logger.py,sha256=MZsWgHd4UZQKCXiJZgQeW-Emi_BmzlCKPLPXOL_HqBo,5239
95
- kumoai-2.13.0.dev202511211730.dist-info/licenses/LICENSE,sha256=ZUilBDp--4vbhsEr6f_Upw9rnIx09zQ3K9fXQ0rfd6w,1111
96
- kumoai-2.13.0.dev202511211730.dist-info/METADATA,sha256=JbulCS6_zQVpQyDUZB_Jd54dNAVY-w-3A-JADPFZC9s,2544
97
- kumoai-2.13.0.dev202511211730.dist-info/WHEEL,sha256=qV0EIPljj1XC_vuSatRWjn02nZIz3N1t8jsZz7HBr2U,101
98
- kumoai-2.13.0.dev202511211730.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
99
- kumoai-2.13.0.dev202511211730.dist-info/RECORD,,
113
+ kumoai/utils/progress_logger.py,sha256=OR_4Yh__8ZPhBtSTMESFuFQbyennfWZuD6zjiaqzaLw,9608
114
+ kumoai/utils/sql.py,sha256=a9HT5IIUaXfbQaLbZ2HuuYHLBDev_cer1Tzif7xE-R4,121
115
+ kumoai-2.14.0.dev202512211732.dist-info/licenses/LICENSE,sha256=ZUilBDp--4vbhsEr6f_Upw9rnIx09zQ3K9fXQ0rfd6w,1111
116
+ kumoai-2.14.0.dev202512211732.dist-info/METADATA,sha256=iepUeGFV0MlqovuT7wkyO0LWyhcCH30pDoKoO-VVM4s,2628
117
+ kumoai-2.14.0.dev202512211732.dist-info/WHEEL,sha256=qV0EIPljj1XC_vuSatRWjn02nZIz3N1t8jsZz7HBr2U,101
118
+ kumoai-2.14.0.dev202512211732.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
119
+ kumoai-2.14.0.dev202512211732.dist-info/RECORD,,