kumoai 2.13.0.dev202512031731__cp312-cp312-macosx_11_0_arm64.whl → 2.14.0.dev202512181731__cp312-cp312-macosx_11_0_arm64.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 (43) hide show
  1. kumoai/__init__.py +12 -0
  2. kumoai/_version.py +1 -1
  3. kumoai/client/pquery.py +6 -2
  4. kumoai/experimental/rfm/__init__.py +33 -8
  5. kumoai/experimental/rfm/authenticate.py +3 -4
  6. kumoai/experimental/rfm/backend/local/__init__.py +4 -0
  7. kumoai/experimental/rfm/{local_graph_store.py → backend/local/graph_store.py} +52 -91
  8. kumoai/experimental/rfm/backend/local/sampler.py +315 -0
  9. kumoai/experimental/rfm/backend/local/table.py +31 -14
  10. kumoai/experimental/rfm/backend/snow/__init__.py +2 -0
  11. kumoai/experimental/rfm/backend/snow/sampler.py +252 -0
  12. kumoai/experimental/rfm/backend/snow/table.py +75 -23
  13. kumoai/experimental/rfm/backend/sqlite/__init__.py +4 -2
  14. kumoai/experimental/rfm/backend/sqlite/sampler.py +349 -0
  15. kumoai/experimental/rfm/backend/sqlite/table.py +71 -28
  16. kumoai/experimental/rfm/base/__init__.py +24 -3
  17. kumoai/experimental/rfm/base/column.py +6 -12
  18. kumoai/experimental/rfm/base/column_expression.py +16 -0
  19. kumoai/experimental/rfm/base/sampler.py +773 -0
  20. kumoai/experimental/rfm/base/source.py +1 -0
  21. kumoai/experimental/rfm/base/sql_sampler.py +84 -0
  22. kumoai/experimental/rfm/base/sql_table.py +113 -0
  23. kumoai/experimental/rfm/base/table.py +136 -105
  24. kumoai/experimental/rfm/graph.py +296 -89
  25. kumoai/experimental/rfm/infer/dtype.py +46 -59
  26. kumoai/experimental/rfm/infer/pkey.py +4 -2
  27. kumoai/experimental/rfm/infer/time_col.py +1 -2
  28. kumoai/experimental/rfm/pquery/executor.py +27 -27
  29. kumoai/experimental/rfm/pquery/pandas_executor.py +30 -32
  30. kumoai/experimental/rfm/rfm.py +299 -230
  31. kumoai/experimental/rfm/sagemaker.py +4 -4
  32. kumoai/pquery/predictive_query.py +10 -6
  33. kumoai/testing/snow.py +50 -0
  34. kumoai/utils/__init__.py +3 -2
  35. kumoai/utils/progress_logger.py +178 -12
  36. kumoai/utils/sql.py +3 -0
  37. {kumoai-2.13.0.dev202512031731.dist-info → kumoai-2.14.0.dev202512181731.dist-info}/METADATA +4 -2
  38. {kumoai-2.13.0.dev202512031731.dist-info → kumoai-2.14.0.dev202512181731.dist-info}/RECORD +41 -34
  39. kumoai/experimental/rfm/local_graph_sampler.py +0 -223
  40. kumoai/experimental/rfm/local_pquery_driver.py +0 -689
  41. {kumoai-2.13.0.dev202512031731.dist-info → kumoai-2.14.0.dev202512181731.dist-info}/WHEEL +0 -0
  42. {kumoai-2.13.0.dev202512031731.dist-info → kumoai-2.14.0.dev202512181731.dist-info}/licenses/LICENSE +0 -0
  43. {kumoai-2.13.0.dev202512031731.dist-info → kumoai-2.14.0.dev202512181731.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  import base64
2
2
  import json
3
- from typing import Any, Dict, List, Tuple
3
+ from typing import Any
4
4
 
5
5
  import requests
6
6
 
@@ -48,8 +48,8 @@ class KumoClient_SageMakerAdapter(KumoClient):
48
48
 
49
49
  # Recording buffers.
50
50
  self._recording_active = False
51
- self._recorded_reqs: List[Dict[str, Any]] = []
52
- self._recorded_resps: List[Dict[str, Any]] = []
51
+ self._recorded_reqs: list[dict[str, Any]] = []
52
+ self._recorded_resps: list[dict[str, Any]] = []
53
53
 
54
54
  def authenticate(self) -> None:
55
55
  # TODO(siyang): call /ping to verify?
@@ -92,7 +92,7 @@ class KumoClient_SageMakerAdapter(KumoClient):
92
92
  self._recorded_reqs.clear()
93
93
  self._recorded_resps.clear()
94
94
 
95
- 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]]]:
96
96
  """Stop recording and return recorded requests/responses."""
97
97
  assert self._recording_active
98
98
  self._recording_active = False
@@ -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:
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.dev202512031731
3
+ Version: 2.14.0.dev202512181731
4
4
  Summary: AI on the Modern Data Stack
5
5
  Author-email: "Kumo.AI" <hello@kumo.ai>
6
6
  License-Expression: MIT
@@ -23,7 +23,7 @@ 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.48.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
@@ -41,7 +41,9 @@ Requires-Dist: requests-mock; extra == "test"
41
41
  Provides-Extra: sqlite
42
42
  Requires-Dist: adbc_driver_sqlite; extra == "sqlite"
43
43
  Provides-Extra: snowflake
44
+ Requires-Dist: numpy<2.0; extra == "snowflake"
44
45
  Requires-Dist: snowflake-connector-python; extra == "snowflake"
46
+ Requires-Dist: pyyaml; extra == "snowflake"
45
47
  Provides-Extra: sagemaker
46
48
  Requires-Dist: boto3<2.0,>=1.30.0; extra == "sagemaker"
47
49
  Requires-Dist: mypy-boto3-sagemaker-runtime<2.0,>=1.34.0; extra == "sagemaker"
@@ -1,8 +1,8 @@
1
1
  kumoai/_logging.py,sha256=U2_5ROdyk92P4xO4H2WJV8EC7dr6YxmmnM-b7QX9M7I,886
2
2
  kumoai/mixin.py,sha256=MP413xzuCqWhxAPUHmloLA3j4ZyF1tEtfi516b_hOXQ,812
3
- kumoai/_version.py,sha256=5E8jDfy-Cd90GKsXB2iph05yeJqiO4NclFrisgQkb80,39
3
+ kumoai/_version.py,sha256=x_VP--ZQYmARddiqEJCsKj7I1LaFz23DUBdstrPepwI,39
4
4
  kumoai/kumolib.cpython-312-darwin.so,sha256=xQvdWHx9xmQ11y3F3ywxJv6A0sDk6D3-2fQbxSdM1z4,232576
5
- kumoai/__init__.py,sha256=L3yOOtpSdwe3PYQlJBLkiQd3Ypp8iB5ChXkzprk3Si4,10546
5
+ kumoai/__init__.py,sha256=Nn9YH_x9kAeEFn8RWbP95slZow0qFnakPZZ1WADe1hY,10843
6
6
  kumoai/formatting.py,sha256=jA_rLDCGKZI8WWCha-vtuLenVKTZvli99Tqpurz1H84,953
7
7
  kumoai/futures.py,sha256=oJFIfdCM_3nWIqQteBKYMY4fPhoYlYWE_JA2o6tx-ng,3737
8
8
  kumoai/jobs.py,sha256=NrdLEFNo7oeCYSy-kj2nAvCFrz9BZ_xrhkqHFHk5ksY,2496
@@ -11,36 +11,41 @@ kumoai/databricks.py,sha256=e6E4lOFvZHXFwh4CO1kXU1zzDU3AapLQYMxjiHPC-HQ,476
11
11
  kumoai/spcs.py,sha256=N31d7rLa-bgYh8e2J4YzX1ScxGLqiVXrqJnCl1y4Mts,4139
12
12
  kumoai/_singleton.py,sha256=UTwrbDkoZSGB8ZelorvprPDDv9uZkUi1q_SrmsyngpQ,836
13
13
  kumoai/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- kumoai/experimental/rfm/local_graph_sampler.py,sha256=QmyEw1M6CsftQpwwGMaUgPog7lt4EUfp5Y_KXIOK_oo,7887
15
- kumoai/experimental/rfm/local_pquery_driver.py,sha256=aO7Jfwx9gxGKYvpqxZx1LLWdI1MhuZQOPtAITxoOQO0,26162
16
- kumoai/experimental/rfm/graph.py,sha256=5TZVbd4agFePPSazgqViAqWmLMpxHuDsX_DqHnqaNnM,36581
17
- kumoai/experimental/rfm/__init__.py,sha256=slliYcrh80xPtQQ_nnsp3ny9IbmHCyirmdZUfKTdME4,6064
18
- kumoai/experimental/rfm/sagemaker.py,sha256=_hTrFg4qfXe7uzwqSEG_wze-IFkwn7qde9OpUodCpbc,4982
19
- kumoai/experimental/rfm/rfm.py,sha256=FZRrYK9uoH4IoGI1hQunORp1zrpfeyi8dDqikt6Gfpk,47703
20
- kumoai/experimental/rfm/local_graph_store.py,sha256=l6HMQBNdSdDEL0xIGhTcmR3E_JOIfZJPHDbiD0E7GlA,13140
21
- kumoai/experimental/rfm/authenticate.py,sha256=FiuHMvP7V3zBZUlHMDMbNLhc-UgDZgz4hjVSTuQ7DRw,18888
14
+ kumoai/experimental/rfm/graph.py,sha256=4gtGKHgLVRMNQrbXieSWtImggX5KDRf4XrLk0LcF-AA,44446
15
+ kumoai/experimental/rfm/__init__.py,sha256=9aelcHodt2Oriw76vdEmtWrmAQ0CXTdFPrKgwVB9eKc,7124
16
+ kumoai/experimental/rfm/sagemaker.py,sha256=6fyXO1Jd_scq-DH7kcv6JcV8QPyTbh4ceqwQDPADlZ0,4963
17
+ kumoai/experimental/rfm/rfm.py,sha256=Yssmo-PaCfjT9hll0BKl8fahsuKpG-gViwFdKH1F3os,50247
18
+ kumoai/experimental/rfm/authenticate.py,sha256=G2RkRWznMVQUzvhvbKhn0bMCY7VmoNYxluz3THRqSdE,18851
22
19
  kumoai/experimental/rfm/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- kumoai/experimental/rfm/backend/sqlite/__init__.py,sha256=jYmZDNAVsojuPO1Q5idFmG5N0aCB8BDyrpAoS31n9bc,844
24
- kumoai/experimental/rfm/backend/sqlite/table.py,sha256=fnw6whxUmzjycFatlHqwVP64tujNY8RE20ZnAaZ9TJc,3417
25
- kumoai/experimental/rfm/backend/local/__init__.py,sha256=9rupbsPadaOqrEInv2nh9KEQ9mK8dSkbteMXwZmsGbU,896
26
- kumoai/experimental/rfm/backend/local/table.py,sha256=wQU28OX6-vtdBvrHcoRt8XTBDScSahVIql-evINkS6Y,3014
27
- kumoai/experimental/rfm/backend/snow/__init__.py,sha256=B-tG-p8WA-mBuwvK1f0S2gdRPEGwApdxlnyeVSnY2xg,927
28
- kumoai/experimental/rfm/backend/snow/table.py,sha256=vUqUJUfphmZIm7h1a8X0IvX-jf_wT1Oh3YRuhqT_7M8,3460
20
+ kumoai/experimental/rfm/backend/sqlite/__init__.py,sha256=jl-DBbhsqQ-dUXyWhyQTM1AU2qNAtXCmi1mokdhtBTg,902
21
+ kumoai/experimental/rfm/backend/sqlite/table.py,sha256=PhBMj2vwChCxsTHrDzeiau8xs3EHgxA8t-uc6_JcREY,5221
22
+ kumoai/experimental/rfm/backend/sqlite/sampler.py,sha256=pBCj0bXnh1PMg9cYJw-K983FzJX1_SLOe3QuOxkmvBQ,14242
23
+ kumoai/experimental/rfm/backend/local/__init__.py,sha256=2s9sSA-E-8pfkkzCH4XPuaSxSznEURMfMgwEIfYYPsg,1014
24
+ kumoai/experimental/rfm/backend/local/table.py,sha256=fCtLuBSvCSlTbrl77Pe1Aas4GQIC1TXfpuneBSv_wwI,3662
25
+ kumoai/experimental/rfm/backend/local/graph_store.py,sha256=cY9KeLir9Xsp4MJl_K0VZckNa_LMKiiWCZG14uu21JI,11854
26
+ kumoai/experimental/rfm/backend/local/sampler.py,sha256=85HoHCDiFOiuD_vFPZRx9JCyQUlLsqgsuB3NAw50wNw,10836
27
+ kumoai/experimental/rfm/backend/snow/__init__.py,sha256=BYfsiuJ4Ee30GjG9EuUtitMHXnRfvVKi85zNlIwldV4,993
28
+ kumoai/experimental/rfm/backend/snow/table.py,sha256=-LIumOr3jvd2Kww1gBUcFkZN_xaZEUGzhsLb2sRDMe8,5491
29
+ kumoai/experimental/rfm/backend/snow/sampler.py,sha256=oNiBTo-Dr6LNCFJ9uHzLfKFYtx0rZq-Do2UOluwWWt0,10010
29
30
  kumoai/experimental/rfm/pquery/__init__.py,sha256=X0O3EIq5SMfBEE-ii5Cq6iDhR3s3XMXB52Cx5htoePw,152
30
- kumoai/experimental/rfm/pquery/pandas_executor.py,sha256=kiBJq7uVGbasG7TiqsubEl6ey3UYzZiM4bwxILqp_54,18487
31
- kumoai/experimental/rfm/pquery/executor.py,sha256=f7-pJhL0BgFU9E4o4gQpQyArOvyrZtwxFmks34-QOAE,2741
31
+ kumoai/experimental/rfm/pquery/pandas_executor.py,sha256=MwSvFRwLq-z19LEdF0G0AT7Gj9tCqu-XLEA7mNbqXwc,18454
32
+ kumoai/experimental/rfm/pquery/executor.py,sha256=gs5AVNaA50ci8zXOBD3qt5szdTReSwTs4BGuEyx4BEE,2728
32
33
  kumoai/experimental/rfm/infer/multicategorical.py,sha256=0-cLpDnGryhr76QhZNO-klKokJ6MUSfxXcGdQ61oykY,1102
33
34
  kumoai/experimental/rfm/infer/categorical.py,sha256=VwNaKwKbRYkTxEJ1R6gziffC8dGsEThcDEfbi-KqW5c,853
34
- kumoai/experimental/rfm/infer/time_col.py,sha256=7R5Itl8RRBOr61qLpRTanIqrUVZFZcAXzDA9lCw4nx4,1820
35
- kumoai/experimental/rfm/infer/pkey.py,sha256=ubNqW1LIjLKiXbjXELAY3g6n2f3u2Eis_uC2DEiXFiU,4393
35
+ kumoai/experimental/rfm/infer/time_col.py,sha256=oNenUK6P7ql8uwShodtQ73uG1x3fbFWT78jRcF9DLTI,1789
36
+ kumoai/experimental/rfm/infer/pkey.py,sha256=IaJI5GHK8ds_a3AOr3YYVgUlSmYYEgr4Nu92s2RyBV4,4412
36
37
  kumoai/experimental/rfm/infer/id.py,sha256=ZIO0DWIoiEoS_8MVc5lkqBfkTWWQ0yGCgjkwLdaYa_Q,908
37
- kumoai/experimental/rfm/infer/dtype.py,sha256=IYhLyf4UoPZ-qqcUIt-enydRTnnNqY-sSim56V7uuUU,2979
38
+ kumoai/experimental/rfm/infer/dtype.py,sha256=zjQ6Dhvb2QKv7A-c8mDxBnK5Dijhmn4fCgavIw4UH8Y,2582
38
39
  kumoai/experimental/rfm/infer/__init__.py,sha256=krdMFN8iKZlSFOl-M5MW1KuSviQV3H1E18jj2uB8g6Q,469
39
40
  kumoai/experimental/rfm/infer/timestamp.py,sha256=vM9--7eStzaGG13Y-oLYlpNJyhL6f9dp17HDXwtl_DM,1094
40
- kumoai/experimental/rfm/base/__init__.py,sha256=-f3Ap-eUG1_JIX6NwRTZ2E3Rn0KTwt_PRYz8UcajWvg,189
41
- kumoai/experimental/rfm/base/table.py,sha256=CLC66JMBSJcvtvF8lecZywK-50_EzDHN6dc9ZekzpV0,19573
42
- kumoai/experimental/rfm/base/source.py,sha256=8_waFQVsctryHkm9BwmFZ9-vw5cXAXfjk7KDmcl_kic,272
43
- kumoai/experimental/rfm/base/column.py,sha256=izCJmufJcd1RSi-ptFMfrue-JYag38MJxizka7ya0-A,2319
41
+ kumoai/experimental/rfm/base/sql_sampler.py,sha256=-2dyftqvfbzMceIhE6i4wYFt7-p7FDeqlfH4P--qjWw,2598
42
+ kumoai/experimental/rfm/base/__init__.py,sha256=ZWG3HDJfxlu0JZ6cdAbd9hmUCN1irLMrAXitMKmGlxs,799
43
+ kumoai/experimental/rfm/base/sql_table.py,sha256=fX3aBvTgpt_S3XLGsUsWafeyV_SlO1Twah2ZbcI07GY,3764
44
+ kumoai/experimental/rfm/base/table.py,sha256=5T52J_qNL8af84tZQZTD-9K4tDOtArWJRDH6jXOsdrQ,19888
45
+ kumoai/experimental/rfm/base/column_expression.py,sha256=pYjM3nVsdBgsSFUlmx2nBfRj-0pch2ED6EfdS2WOUqk,336
46
+ kumoai/experimental/rfm/base/sampler.py,sha256=aCD98t0CUhAvGXEFv24Vq2g4otuclpKkkyL1rMR_mFg,31449
47
+ kumoai/experimental/rfm/base/source.py,sha256=RqlI_kBoRV0ADb8KdEKn15RNHMdFUzEVzb57lIoyBM4,294
48
+ kumoai/experimental/rfm/base/column.py,sha256=Yc7oX8OUYJdnJmgD9Mz4jKSChjMXqJYRFybHWGVcDHE,2133
44
49
  kumoai/encoder/__init__.py,sha256=VPGs4miBC_WfwWeOXeHhFomOUocERFavhKf5fqITcds,182
45
50
  kumoai/graph/graph.py,sha256=iyp4klPIMn2ttuEqMJvsrxKb_tmz_DTnvziIhCegduM,38291
46
51
  kumoai/graph/__init__.py,sha256=n8X4X8luox4hPBHTRC9R-3JzvYYMoR8n7lF1H4w4Hzc,228
@@ -50,8 +55,9 @@ kumoai/artifact_export/config.py,sha256=jOPDduduxv0uuB-7xVlDiZglfpmFF5lzQhhH1SMk
50
55
  kumoai/artifact_export/job.py,sha256=GEisSwvcjK_35RgOfsLXGgxMTXIWm765B_BW_Kgs-V0,3275
51
56
  kumoai/artifact_export/__init__.py,sha256=BsfDrc3mCHpO9-BqvqKm8qrXDIwfdaoH5UIoG4eQkc4,238
52
57
  kumoai/utils/datasets.py,sha256=ptKIUoBONVD55pTVNdRCkQT3NWdN_r9UAUu4xewPa3U,2928
53
- kumoai/utils/__init__.py,sha256=wGDC_31XJ-7ipm6eawjLAJaP4EfmtNOH8BHzaetQ9Ko,268
54
- kumoai/utils/progress_logger.py,sha256=pngEGzMHkiOUKOa6fbzxCEc2xlA4SJKV4TDTVVoqObM,5062
58
+ kumoai/utils/__init__.py,sha256=6S-UtwjeLpnCYRCCIEWhkitPYGaqOGXC1ChE13DzXiU,256
59
+ kumoai/utils/progress_logger.py,sha256=3aYOoVSbQv5i9m2T8IqMydofKf6iNB1jxsl1uGjHZz8,9265
60
+ kumoai/utils/sql.py,sha256=f6lR6rBEW7Dtk0NdM26dOZXUHDizEHb1WPlBCJrwoq0,118
55
61
  kumoai/utils/forecasting.py,sha256=-nDS6ucKNfQhTQOfebjefj0wwWH3-KYNslIomxwwMBM,7415
56
62
  kumoai/codegen/generate.py,sha256=SvfWWa71xSAOjH9645yQvgoEM-o4BYjupM_EpUxqB_E,7331
57
63
  kumoai/codegen/naming.py,sha256=_XVQGxHfuub4bhvyuBKjltD5Lm_oPpibvP_LZteCGk0,3021
@@ -69,6 +75,7 @@ kumoai/codegen/handlers/__init__.py,sha256=k8TB_Kn-1BycBBi51kqFS2fZHCpCPgR9-3J9g
69
75
  kumoai/codegen/handlers/utils.py,sha256=58b2GCgaTBUp2aId7BLMXMV0ENrusbNbfw7mlyXAXPE,1447
70
76
  kumoai/codegen/handlers/connector.py,sha256=afGf_GreyQ9y6qF3QTgSiM416qtUcP298SatNqUFhvQ,3828
71
77
  kumoai/codegen/handlers/table.py,sha256=POHpA-GFYFGTSuerGmtigYablk-Wq1L3EBvsOI-iFMQ,3956
78
+ kumoai/testing/snow.py,sha256=ubx3yJP0UHxsNiar1-jNdv8ZfszKc8Js3_Gg70uf008,1487
72
79
  kumoai/testing/__init__.py,sha256=goHIIo3JE7uHV7njo4_aTd89mVVR74BEAZ2uyBaOR0w,170
73
80
  kumoai/testing/decorators.py,sha256=83tMifuPTpUqX7zHxMttkj1TDdB62EBtAP-Fjj72Zdo,1607
74
81
  kumoai/connector/glue_connector.py,sha256=HivT0QYQ8-XeB4QLgWvghiqXuq7jyBK9G2R1py_NnE4,4697
@@ -82,10 +89,10 @@ kumoai/connector/utils.py,sha256=wlqQxMmPvnFNoCcczGkKYjSu05h8OhWh4fhTzQm_2bQ,646
82
89
  kumoai/connector/s3_connector.py,sha256=3kbv-h7DwD8O260Q0h1GPm5wwQpLt-Tb3d_CBSaie44,10155
83
90
  kumoai/connector/base.py,sha256=cujXSZF3zAfuxNuEw54DSL1T7XCuR4t0shSMDuPUagQ,5291
84
91
  kumoai/pquery/__init__.py,sha256=uTXr7t1eXcVfM-ETaM_1ImfEqhrmaj8BjiIvy1YZTL8,533
85
- kumoai/pquery/predictive_query.py,sha256=oUqwdOWLLkPM-G4PhpUk_6mwSJGBtaD3t37Wp5Oow8M,24971
92
+ kumoai/pquery/predictive_query.py,sha256=UXn1s8ztubYZMNGl4ijaeidMiGlFveb1TGw9qI5-TAo,24901
86
93
  kumoai/pquery/prediction_table.py,sha256=QPDH22X1UB0NIufY7qGuV2XW7brG3Pv--FbjNezzM2g,10776
87
94
  kumoai/pquery/training_table.py,sha256=elmPDZx11kPiC_dkOhJcBUGtHKgL32GCBvZ9k6U0pMg,15809
88
- kumoai/client/pquery.py,sha256=R2hc-M8vPoyIDH0ywLwFVxCznVAqpZz3w2HszjdNW-o,6891
95
+ kumoai/client/pquery.py,sha256=IQ8As-OOJOkuMoMosphOsA5hxQYLCbzOQJO7RezK8uY,7091
89
96
  kumoai/client/client.py,sha256=Jda8V9yiu3LbhxlcgRWPeYi7eF6jzCKcq8-B_vEd1ik,8514
90
97
  kumoai/client/graph.py,sha256=zvLEDExLT_RVbUMHqVl0m6tO6s2gXmYSoWmPF6YMlnA,3831
91
98
  kumoai/client/online.py,sha256=pkBBh_DEC3GAnPcNw6bopNRlGe7EUbIFe7_seQqZRaw,2720
@@ -104,8 +111,8 @@ kumoai/trainer/baseline_trainer.py,sha256=LlfViNOmswNv4c6zJJLsyv0pC2mM2WKMGYx06o
104
111
  kumoai/trainer/__init__.py,sha256=zUdFl-f-sBWmm2x8R-rdVzPBeU2FaMzUY5mkcgoTa1k,939
105
112
  kumoai/trainer/online_serving.py,sha256=9cddb5paeZaCgbUeceQdAOxysCtV5XP-KcsgFz_XR5w,9566
106
113
  kumoai/trainer/trainer.py,sha256=hBXO7gwpo3t59zKFTeIkK65B8QRmWCwO33sbDuEAPlY,20133
107
- kumoai-2.13.0.dev202512031731.dist-info/RECORD,,
108
- kumoai-2.13.0.dev202512031731.dist-info/WHEEL,sha256=V1loQ6TpxABu1APUg0MoTRBOzSKT5xVc3skizX-ovCU,136
109
- kumoai-2.13.0.dev202512031731.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
110
- kumoai-2.13.0.dev202512031731.dist-info/METADATA,sha256=M7NK6i4Wz55zU6rHvkhts9ewT2dMeXtMIYnH5of8U-o,2466
111
- kumoai-2.13.0.dev202512031731.dist-info/licenses/LICENSE,sha256=TbWlyqRmhq9PEzCaTI0H0nWLQCCOywQM8wYH8MbjfLo,1102
114
+ kumoai-2.14.0.dev202512181731.dist-info/RECORD,,
115
+ kumoai-2.14.0.dev202512181731.dist-info/WHEEL,sha256=V1loQ6TpxABu1APUg0MoTRBOzSKT5xVc3skizX-ovCU,136
116
+ kumoai-2.14.0.dev202512181731.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
117
+ kumoai-2.14.0.dev202512181731.dist-info/METADATA,sha256=6DXWj2B67vLO-HDJaPEOX7fw4P5PqDzPDxRgf-o-UMY,2557
118
+ kumoai-2.14.0.dev202512181731.dist-info/licenses/LICENSE,sha256=TbWlyqRmhq9PEzCaTI0H0nWLQCCOywQM8wYH8MbjfLo,1102