kumoai 2.13.0.dev202511211730__py3-none-any.whl → 2.15.0.dev202601131732__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.
Files changed (59) hide show
  1. kumoai/__init__.py +35 -26
  2. kumoai/_version.py +1 -1
  3. kumoai/client/client.py +6 -0
  4. kumoai/client/jobs.py +26 -0
  5. kumoai/client/pquery.py +6 -2
  6. kumoai/connector/utils.py +44 -9
  7. kumoai/experimental/rfm/__init__.py +70 -68
  8. kumoai/experimental/rfm/authenticate.py +3 -4
  9. kumoai/experimental/rfm/backend/__init__.py +0 -0
  10. kumoai/experimental/rfm/backend/local/__init__.py +42 -0
  11. kumoai/experimental/rfm/{local_graph_store.py → backend/local/graph_store.py} +65 -127
  12. kumoai/experimental/rfm/backend/local/sampler.py +312 -0
  13. kumoai/experimental/rfm/backend/local/table.py +113 -0
  14. kumoai/experimental/rfm/backend/snow/__init__.py +37 -0
  15. kumoai/experimental/rfm/backend/snow/sampler.py +407 -0
  16. kumoai/experimental/rfm/backend/snow/table.py +245 -0
  17. kumoai/experimental/rfm/backend/sqlite/__init__.py +32 -0
  18. kumoai/experimental/rfm/backend/sqlite/sampler.py +454 -0
  19. kumoai/experimental/rfm/backend/sqlite/table.py +184 -0
  20. kumoai/experimental/rfm/base/__init__.py +30 -0
  21. kumoai/experimental/rfm/base/column.py +152 -0
  22. kumoai/experimental/rfm/base/expression.py +44 -0
  23. kumoai/experimental/rfm/base/mapper.py +69 -0
  24. kumoai/experimental/rfm/base/sampler.py +783 -0
  25. kumoai/experimental/rfm/base/source.py +19 -0
  26. kumoai/experimental/rfm/base/sql_sampler.py +385 -0
  27. kumoai/experimental/rfm/base/table.py +722 -0
  28. kumoai/experimental/rfm/base/utils.py +36 -0
  29. kumoai/experimental/rfm/{local_graph.py → graph.py} +581 -154
  30. kumoai/experimental/rfm/infer/__init__.py +8 -0
  31. kumoai/experimental/rfm/infer/dtype.py +84 -0
  32. kumoai/experimental/rfm/infer/multicategorical.py +1 -1
  33. kumoai/experimental/rfm/infer/pkey.py +128 -0
  34. kumoai/experimental/rfm/infer/stype.py +35 -0
  35. kumoai/experimental/rfm/infer/time_col.py +63 -0
  36. kumoai/experimental/rfm/pquery/executor.py +27 -27
  37. kumoai/experimental/rfm/pquery/pandas_executor.py +30 -32
  38. kumoai/experimental/rfm/relbench.py +76 -0
  39. kumoai/experimental/rfm/rfm.py +783 -481
  40. kumoai/experimental/rfm/sagemaker.py +15 -7
  41. kumoai/experimental/rfm/task_table.py +292 -0
  42. kumoai/pquery/predictive_query.py +10 -6
  43. kumoai/pquery/training_table.py +16 -2
  44. kumoai/testing/decorators.py +1 -1
  45. kumoai/testing/snow.py +50 -0
  46. kumoai/trainer/distilled_trainer.py +175 -0
  47. kumoai/utils/__init__.py +3 -2
  48. kumoai/utils/display.py +87 -0
  49. kumoai/utils/progress_logger.py +192 -13
  50. kumoai/utils/sql.py +3 -0
  51. {kumoai-2.13.0.dev202511211730.dist-info → kumoai-2.15.0.dev202601131732.dist-info}/METADATA +10 -8
  52. {kumoai-2.13.0.dev202511211730.dist-info → kumoai-2.15.0.dev202601131732.dist-info}/RECORD +55 -30
  53. kumoai/experimental/rfm/local_graph_sampler.py +0 -182
  54. kumoai/experimental/rfm/local_pquery_driver.py +0 -689
  55. kumoai/experimental/rfm/local_table.py +0 -545
  56. kumoai/experimental/rfm/utils.py +0 -344
  57. {kumoai-2.13.0.dev202511211730.dist-info → kumoai-2.15.0.dev202601131732.dist-info}/WHEEL +0 -0
  58. {kumoai-2.13.0.dev202511211730.dist-info → kumoai-2.15.0.dev202601131732.dist-info}/licenses/LICENSE +0 -0
  59. {kumoai-2.13.0.dev202511211730.dist-info → kumoai-2.15.0.dev202601131732.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,87 @@
1
+ from collections.abc import Sequence
2
+
3
+ import pandas as pd
4
+ from rich import box
5
+ from rich.console import Console
6
+ from rich.table import Table
7
+ from rich.text import Text
8
+
9
+ from kumoai import in_notebook, in_snowflake_notebook
10
+
11
+
12
+ def message(msg: str) -> None:
13
+ if in_snowflake_notebook():
14
+ import streamlit as st
15
+ st.markdown(msg)
16
+ elif in_notebook():
17
+ from IPython.display import Markdown, display
18
+ display(Markdown(msg))
19
+ else:
20
+ print(msg.replace("`", "'"))
21
+
22
+
23
+ def title(msg: str) -> None:
24
+ if in_notebook():
25
+ message(f"### {msg}")
26
+ else:
27
+ msg = msg.replace("`", "'")
28
+ Console().print(f"[bold]{msg}[/bold]", highlight=False)
29
+
30
+
31
+ def italic(msg: str) -> None:
32
+ if in_notebook():
33
+ message(f"*{msg}*")
34
+ else:
35
+ msg = msg.replace("`", "'")
36
+ Console().print(
37
+ f"[italic]{msg}[/italic]",
38
+ highlight=False,
39
+ style='dim',
40
+ )
41
+
42
+
43
+ def unordered_list(items: Sequence[str]) -> None:
44
+ if in_notebook():
45
+ msg = '\n'.join([f"- {item}" for item in items])
46
+ message(msg)
47
+ else:
48
+ text = Text('\n').join(
49
+ Text.assemble(
50
+ Text(' • ', style='yellow'),
51
+ Text(item.replace('`', '')),
52
+ ) for item in items)
53
+ Console().print(text, highlight=False)
54
+
55
+
56
+ def dataframe(df: pd.DataFrame) -> None:
57
+ if in_snowflake_notebook():
58
+ import streamlit as st
59
+ st.dataframe(df, hide_index=True)
60
+ elif in_notebook():
61
+ from IPython.display import display
62
+ try:
63
+ if hasattr(df.style, 'hide'):
64
+ display(df.style.hide(axis='index')) # pandas=2
65
+ else:
66
+ display(df.style.hide_index()) # pandas<1.3
67
+ except ImportError:
68
+ print(df.to_string(index=False)) # missing jinja2
69
+ else:
70
+ Console().print(to_rich_table(df))
71
+
72
+
73
+ def to_rich_table(df: pd.DataFrame) -> Table:
74
+ table = Table(box=box.ROUNDED)
75
+ for column in df.columns:
76
+ table.add_column(str(column))
77
+ for _, row in df.iterrows():
78
+ values: list[str | Text] = []
79
+ for value in row:
80
+ if str(value) == 'True':
81
+ values.append('✅')
82
+ elif str(value) in {'False', '-'}:
83
+ values.append(Text('-', style='dim'))
84
+ else:
85
+ values.append(str(value))
86
+ table.add_row(*values)
87
+ return table
@@ -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,23 @@ 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
+ self.depth = 0
28
+
29
+ self.logs: list[str] = []
30
+
31
+ self.start_time: float | None = None
32
+ self.end_time: float | None = None
33
+
34
+ @classmethod
35
+ def default(cls, msg: str, verbose: bool = True) -> 'ProgressLogger':
36
+ from kumoai import in_snowflake_notebook
26
37
 
27
- self.start_time: Optional[float] = None
28
- self.end_time: Optional[float] = None
38
+ if in_snowflake_notebook():
39
+ return StreamlitProgressLogger(msg, verbose)
40
+ return RichProgressLogger(msg, verbose)
29
41
 
30
42
  @property
31
43
  def duration(self) -> float:
@@ -37,11 +49,20 @@ class ProgressLogger:
37
49
  def log(self, msg: str) -> None:
38
50
  self.logs.append(msg)
39
51
 
52
+ def init_progress(self, total: int, description: str) -> None:
53
+ pass
54
+
55
+ def step(self) -> None:
56
+ pass
57
+
40
58
  def __enter__(self) -> Self:
41
- self.start_time = time.perf_counter()
59
+ self.depth += 1
60
+ if self.depth == 1:
61
+ self.start_time = time.perf_counter()
42
62
  return self
43
63
 
44
64
  def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
65
+ self.depth -= 1
45
66
  self.end_time = time.perf_counter()
46
67
 
47
68
  def __repr__(self) -> str:
@@ -66,22 +87,21 @@ class ColoredTimeRemainingColumn(TimeRemainingColumn):
66
87
  return Text(str(super().render(task)), style=self.style)
67
88
 
68
89
 
69
- class InteractiveProgressLogger(ProgressLogger):
90
+ class RichProgressLogger(ProgressLogger):
70
91
  def __init__(
71
92
  self,
72
93
  msg: str,
73
94
  verbose: bool = True,
74
95
  refresh_per_second: int = 10,
75
96
  ) -> None:
76
- super().__init__(msg=msg)
97
+ super().__init__(msg=msg, verbose=verbose)
77
98
 
78
- self.verbose = verbose
79
99
  self.refresh_per_second = refresh_per_second
80
100
 
81
- self._progress: Optional[Progress] = None
82
- self._task: Optional[int] = None
101
+ self._progress: Progress | None = None
102
+ self._task: int | None = None
83
103
 
84
- self._live: Optional[Live] = None
104
+ self._live: Live | None = None
85
105
  self._exception: bool = False
86
106
 
87
107
  def init_progress(self, total: int, description: str) -> None:
@@ -107,6 +127,9 @@ class InteractiveProgressLogger(ProgressLogger):
107
127
 
108
128
  super().__enter__()
109
129
 
130
+ if self.depth > 1:
131
+ return self
132
+
110
133
  if not in_notebook(): # Render progress bar in TUI.
111
134
  sys.stdout.write("\x1b]9;4;3\x07")
112
135
  sys.stdout.flush()
@@ -126,6 +149,9 @@ class InteractiveProgressLogger(ProgressLogger):
126
149
 
127
150
  super().__exit__(exc_type, exc_val, exc_tb)
128
151
 
152
+ if self.depth > 1:
153
+ return
154
+
129
155
  if exc_type is not None:
130
156
  self._exception = True
131
157
 
@@ -151,7 +177,7 @@ class InteractiveProgressLogger(ProgressLogger):
151
177
 
152
178
  table = Table.grid(padding=(0, 1))
153
179
 
154
- icon: Union[Text, Padding]
180
+ icon: Text | Padding
155
181
  if self._exception:
156
182
  style = 'red'
157
183
  icon = Text('❌', style=style)
@@ -175,3 +201,156 @@ class InteractiveProgressLogger(ProgressLogger):
175
201
 
176
202
  if self.verbose and self._progress is not None:
177
203
  yield self._progress.get_renderable()
204
+
205
+
206
+ class StreamlitProgressLogger(ProgressLogger):
207
+ def __init__(
208
+ self,
209
+ msg: str,
210
+ verbose: bool = True,
211
+ ) -> None:
212
+ super().__init__(msg=msg, verbose=verbose)
213
+
214
+ self._status: Any = None
215
+
216
+ self._total = 0
217
+ self._current = 0
218
+ self._description: str = ''
219
+ self._progress: Any = None
220
+
221
+ def __enter__(self) -> Self:
222
+ super().__enter__()
223
+
224
+ import streamlit as st
225
+
226
+ if self.depth > 1:
227
+ return self
228
+
229
+ # Adjust layout for prettier output:
230
+ st.markdown(STREAMLIT_CSS, unsafe_allow_html=True)
231
+
232
+ if self.verbose:
233
+ self._status = st.status(
234
+ f':blue[{self._sanitize_text(self.msg)}]',
235
+ expanded=True,
236
+ )
237
+
238
+ return self
239
+
240
+ def log(self, msg: str) -> None:
241
+ super().log(msg)
242
+ if self.verbose and self._status is not None:
243
+ self._status.write(self._sanitize_text(msg))
244
+
245
+ def init_progress(self, total: int, description: str) -> None:
246
+ if self.verbose and self._status is not None:
247
+ self._total = total
248
+ self._current = 0
249
+ self._description = self._sanitize_text(description)
250
+ percent = min(self._current / self._total, 1.0)
251
+ self._progress = self._status.progress(
252
+ value=percent,
253
+ text=f'{self._description} [{self._current}/{self._total}]',
254
+ )
255
+
256
+ def step(self) -> None:
257
+ self._current += 1
258
+
259
+ if self.verbose and self._progress is not None:
260
+ percent = min(self._current / self._total, 1.0)
261
+ self._progress.progress(
262
+ value=percent,
263
+ text=f'{self._description} [{self._current}/{self._total}]',
264
+ )
265
+
266
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
267
+ super().__exit__(exc_type, exc_val, exc_tb)
268
+
269
+ if not self.verbose or self._status is None or self.depth > 1:
270
+ return
271
+
272
+ label = f'{self._sanitize_text(self.msg)} ({self.duration:.2f}s)'
273
+
274
+ if exc_type is not None:
275
+ self._status.update(
276
+ label=f':red[{label}]',
277
+ state='error',
278
+ expanded=True,
279
+ )
280
+ else:
281
+ self._status.update(
282
+ label=f':green[{label}]',
283
+ state='complete',
284
+ expanded=True,
285
+ )
286
+
287
+ @staticmethod
288
+ def _sanitize_text(msg: str) -> str:
289
+ return re.sub(r'\[/?bold\]', '**', msg)
290
+
291
+
292
+ STREAMLIT_CSS = """
293
+ <style>
294
+ /* Fix horizontal scrollbar */
295
+ .stExpander summary {
296
+ width: auto;
297
+ }
298
+
299
+ /* Fix paddings/margins */
300
+ .stExpander summary {
301
+ padding: 0.75rem 1rem 0.5rem;
302
+ }
303
+ .stExpander p {
304
+ margin: 0px 0px 0.2rem;
305
+ }
306
+ .stExpander [data-testid="stExpanderDetails"] {
307
+ padding-bottom: 1.45rem;
308
+ }
309
+ .stExpander .stProgress div:first-child {
310
+ padding-bottom: 4px;
311
+ }
312
+
313
+ /* Fix expand icon position */
314
+ .stExpander summary svg {
315
+ height: 1.5rem;
316
+ }
317
+
318
+ /* Fix summary icons */
319
+ .stExpander summary [data-testid="stExpanderIconCheck"] {
320
+ font-size: 1.8rem;
321
+ margin-top: -3px;
322
+ color: rgb(21, 130, 55);
323
+ }
324
+ .stExpander summary [data-testid="stExpanderIconError"] {
325
+ font-size: 1.8rem;
326
+ margin-top: -3px;
327
+ color: rgb(255, 43, 43);
328
+ }
329
+ .stExpander summary span:first-child span:first-child {
330
+ width: 1.6rem;
331
+ }
332
+
333
+ /* Add border between title and content */
334
+ .stExpander [data-testid="stExpanderDetails"] {
335
+ border-top: 1px solid rgba(30, 37, 47, 0.2);
336
+ padding-top: 0.5rem;
337
+ }
338
+
339
+ /* Fix title font size */
340
+ .stExpander summary p {
341
+ font-size: 1rem;
342
+ }
343
+
344
+ /* Gray out content */
345
+ .stExpander [data-testid="stExpanderDetails"] {
346
+ color: rgba(30, 37, 47, 0.5);
347
+ }
348
+
349
+ /* Fix progress bar font size */
350
+ .stExpander .stProgress p {
351
+ line-height: 1.6;
352
+ font-size: 1rem;
353
+ color: rgba(30, 37, 47, 0.5);
354
+ }
355
+ </style>
356
+ """
kumoai/utils/sql.py ADDED
@@ -0,0 +1,3 @@
1
+ def quote_ident(ident: str, char: str = '"') -> str:
2
+ r"""Quotes a SQL identifier."""
3
+ return char + ident.replace(char, char + char) + char
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kumoai
3
- Version: 2.13.0.dev202511211730
3
+ Version: 2.15.0.dev202601131732
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<1.0.0,>=0.53.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,7 +1,7 @@
1
- kumoai/__init__.py,sha256=L3yOOtpSdwe3PYQlJBLkiQd3Ypp8iB5ChXkzprk3Si4,10546
1
+ kumoai/__init__.py,sha256=x6Emn6VesHQz0wR7ZnbddPRYO9A5-0JTHDkzJ3Ocq6w,10907
2
2
  kumoai/_logging.py,sha256=U2_5ROdyk92P4xO4H2WJV8EC7dr6YxmmnM-b7QX9M7I,886
3
3
  kumoai/_singleton.py,sha256=UTwrbDkoZSGB8ZelorvprPDDv9uZkUi1q_SrmsyngpQ,836
4
- kumoai/_version.py,sha256=SG9nFVn5zQGjYC2bJHf14ClhCtvj0GzhN9puMBHh-sE,39
4
+ kumoai/_version.py,sha256=Hq_kK7x7ph_b-K95H99SqQPLFzGzVzFrAXutHVJqj00,39
5
5
  kumoai/databricks.py,sha256=e6E4lOFvZHXFwh4CO1kXU1zzDU3AapLQYMxjiHPC-HQ,476
6
6
  kumoai/exceptions.py,sha256=b-_sdbAKOg50uaJZ65GmBLdTo4HANdjl8_R0sJpwaN0,833
7
7
  kumoai/formatting.py,sha256=jA_rLDCGKZI8WWCha-vtuLenVKTZvli99Tqpurz1H84,953
@@ -13,13 +13,13 @@ kumoai/artifact_export/__init__.py,sha256=BsfDrc3mCHpO9-BqvqKm8qrXDIwfdaoH5UIoG4
13
13
  kumoai/artifact_export/config.py,sha256=jOPDduduxv0uuB-7xVlDiZglfpmFF5lzQhhH1SMkGvw,8024
14
14
  kumoai/artifact_export/job.py,sha256=GEisSwvcjK_35RgOfsLXGgxMTXIWm765B_BW_Kgs-V0,3275
15
15
  kumoai/client/__init__.py,sha256=MkyOuMaHQ2c8GPxjBDQSVFhfRE2d2_6CXQ6rxj4ps4w,64
16
- kumoai/client/client.py,sha256=Jda8V9yiu3LbhxlcgRWPeYi7eF6jzCKcq8-B_vEd1ik,8514
16
+ kumoai/client/client.py,sha256=npTLooBtmZ9xOo7AbEiYQTh9wFktsGSEpSEfdB7vdB4,8715
17
17
  kumoai/client/connector.py,sha256=x3i2aBTJTEMZvYRcWkY-UfWVOANZjqAso4GBbcshFjw,3920
18
18
  kumoai/client/endpoints.py,sha256=iF2ZD25AJCIVbmBJ8tTZ8y1Ch0m6nTp18ydN7h4WiTk,5382
19
19
  kumoai/client/graph.py,sha256=zvLEDExLT_RVbUMHqVl0m6tO6s2gXmYSoWmPF6YMlnA,3831
20
- kumoai/client/jobs.py,sha256=iu_Wrta6BQMlV6ZtzSnmhjwNPKDMQDXOsqVVIyWodqw,17074
20
+ kumoai/client/jobs.py,sha256=Aq-JO5yfU5BvD5_8ZXJ8NYxsE4yFXj_NdG9-ilymsr4,18164
21
21
  kumoai/client/online.py,sha256=pkBBh_DEC3GAnPcNw6bopNRlGe7EUbIFe7_seQqZRaw,2720
22
- kumoai/client/pquery.py,sha256=R2hc-M8vPoyIDH0ywLwFVxCznVAqpZz3w2HszjdNW-o,6891
22
+ kumoai/client/pquery.py,sha256=IQ8As-OOJOkuMoMosphOsA5hxQYLCbzOQJO7RezK8uY,7091
23
23
  kumoai/client/rfm.py,sha256=NxKk8mH2A-B58rSXhDWaph4KeiSyJYDq-RO-vAHh7es,3726
24
24
  kumoai/client/source_table.py,sha256=VCsCcM7KYcnjGP7HLTb-AOSEGEVsJTWjk8bMg1JdgPU,2101
25
25
  kumoai/client/table.py,sha256=cQG-RPm-e91idEgse1IPJDvBmzddIDGDkuyrR1rq4wU,3235
@@ -49,50 +49,75 @@ kumoai/connector/glue_connector.py,sha256=HivT0QYQ8-XeB4QLgWvghiqXuq7jyBK9G2R1py
49
49
  kumoai/connector/s3_connector.py,sha256=3kbv-h7DwD8O260Q0h1GPm5wwQpLt-Tb3d_CBSaie44,10155
50
50
  kumoai/connector/snowflake_connector.py,sha256=K0s-H9tW3rve8g2x1PbyxvzSpkROfGQZz-Qa4PoT4UE,9022
51
51
  kumoai/connector/source_table.py,sha256=QLT8bEYaxeMwy-b168url0VfnkTrs5K6VKLbxTI4hEY,17539
52
- kumoai/connector/utils.py,sha256=PUjunLpfqMZsrPDo2EmnyJRBl_mt-E6ugv2kNkf5Rn8,64011
52
+ kumoai/connector/utils.py,sha256=sD3_Dmf42FobMfVayzMVkDHIfXzPN-htD3RHd6Kw8hQ,65055
53
53
  kumoai/encoder/__init__.py,sha256=VPGs4miBC_WfwWeOXeHhFomOUocERFavhKf5fqITcds,182
54
54
  kumoai/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- kumoai/experimental/rfm/__init__.py,sha256=wKfMKTxfuJNH1GCWGZ7-288HXil0tsCuXqg-BAFctZE,6812
56
- kumoai/experimental/rfm/authenticate.py,sha256=FiuHMvP7V3zBZUlHMDMbNLhc-UgDZgz4hjVSTuQ7DRw,18888
57
- kumoai/experimental/rfm/local_graph.py,sha256=2iJDlsGVzqCe1bD_puXWlhwGkn7YnQyJ4p4C-fwCZNE,30076
58
- kumoai/experimental/rfm/local_graph_sampler.py,sha256=5DbhL9h0usFKSJfnx7HjLMPcG54qwJ48M2tmONqxXyY,6672
59
- kumoai/experimental/rfm/local_graph_store.py,sha256=8BqonuaMftAAsjgZpB369i5AeNd1PkisMbbEqc0cKBo,13847
60
- kumoai/experimental/rfm/local_pquery_driver.py,sha256=aO7Jfwx9gxGKYvpqxZx1LLWdI1MhuZQOPtAITxoOQO0,26162
61
- kumoai/experimental/rfm/local_table.py,sha256=r8xZ33Mjs6JD8ud6h23tZ99Dag2DvZ4h6tWjmGrKQg4,19605
62
- kumoai/experimental/rfm/rfm.py,sha256=8SvGWfMuRYJgiz5OTplu7m47mDrHAjQ2mRZtRASnSCk,48136
63
- kumoai/experimental/rfm/sagemaker.py,sha256=e0rRQ28WcgAk_ALqUyU20d193c8_68rCkSengZIHu3Y,4823
64
- kumoai/experimental/rfm/utils.py,sha256=3IiBvT_aLBkkcJh3H11_50yt_XlEzHR0cm9Kprrtl8k,11123
65
- kumoai/experimental/rfm/infer/__init__.py,sha256=xQ8_SuejIzXyn2J7bIKX3pXumFtRuEfBtE5oEDUDJjI,293
55
+ kumoai/experimental/rfm/__init__.py,sha256=bW2XyYtkbdiu_iICYFF2Fu1Fx5fyGbqne6m_6c1P-fY,7016
56
+ kumoai/experimental/rfm/authenticate.py,sha256=G2RkRWznMVQUzvhvbKhn0bMCY7VmoNYxluz3THRqSdE,18851
57
+ kumoai/experimental/rfm/graph.py,sha256=JtpnP-NIowKgtEggif_MzgXjbc6mi3tUyBGi1WuzsI0,46346
58
+ kumoai/experimental/rfm/relbench.py,sha256=cVsxxV3TIL3PLEoYb-8tAVW3GSef6NQAd3rxdHJL63I,2276
59
+ kumoai/experimental/rfm/rfm.py,sha256=dCDHR-yNhtdH2Ja1yasbwSYYstDxlEkVOUNCUEOCTLM,60002
60
+ kumoai/experimental/rfm/sagemaker.py,sha256=6fyXO1Jd_scq-DH7kcv6JcV8QPyTbh4ceqwQDPADlZ0,4963
61
+ kumoai/experimental/rfm/task_table.py,sha256=n_gZNQlCqHOiAkbeaa18nnQ-amt1oWKA9riO2rkrZuw,9847
62
+ kumoai/experimental/rfm/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
+ kumoai/experimental/rfm/backend/local/__init__.py,sha256=2s9sSA-E-8pfkkzCH4XPuaSxSznEURMfMgwEIfYYPsg,1014
64
+ kumoai/experimental/rfm/backend/local/graph_store.py,sha256=RHhkI13KpdPxqb4vXkwEwuFiX5DkrEsfZsOLywNnrvU,11294
65
+ kumoai/experimental/rfm/backend/local/sampler.py,sha256=UKxTjsYs00sYuV_LAlDuZOvQq0BZzPCzZK1Fki2Fd70,10726
66
+ kumoai/experimental/rfm/backend/local/table.py,sha256=GKeYGcu52ztCU8EBMqp5UVj85E145Ug41xiCPiTCXq4,3489
67
+ kumoai/experimental/rfm/backend/snow/__init__.py,sha256=BYfsiuJ4Ee30GjG9EuUtitMHXnRfvVKi85zNlIwldV4,993
68
+ kumoai/experimental/rfm/backend/snow/sampler.py,sha256=Ti1zO68CDt3ueHVp_uGRyKSu2jeuj9LD1jSelv2fh7Y,16296
69
+ kumoai/experimental/rfm/backend/snow/table.py,sha256=1RXpPiTxawTTOFprXvu7jDLG0ZGio_vE9lSfB6wqbWM,9078
70
+ kumoai/experimental/rfm/backend/sqlite/__init__.py,sha256=jl-DBbhsqQ-dUXyWhyQTM1AU2qNAtXCmi1mokdhtBTg,902
71
+ kumoai/experimental/rfm/backend/sqlite/sampler.py,sha256=G5INoEAvoPlg8pSN_QlJIOy2B-2D40eTDPZJxU0Dr0g,18651
72
+ kumoai/experimental/rfm/backend/sqlite/table.py,sha256=WqYtd_rwlawItRMXZUfv14qdyU6huQmODuFjDo483dI,6683
73
+ kumoai/experimental/rfm/base/__init__.py,sha256=rjmMux5lG8srw1bjQGcFQFv6zET9e5riP81nPkw28Jg,724
74
+ kumoai/experimental/rfm/base/column.py,sha256=GXzLC-VpShr6PecUzaj1MJKc_PHzfW5Jn9bOYPA8fFA,4965
75
+ kumoai/experimental/rfm/base/expression.py,sha256=Y7NtLTnKlx6euG_N3fLTcrFKheB6P5KS_jhCfoXV9DE,1252
76
+ kumoai/experimental/rfm/base/mapper.py,sha256=WbWXSF8Vkdeud7UeQ2JgSX7z4d27b_b6o7nR4zET1aw,2420
77
+ kumoai/experimental/rfm/base/sampler.py,sha256=2G6VmgAGV1mSQWHK4wUgf5Ngr8nnH8Hg6_D3sPZZx1A,31951
78
+ kumoai/experimental/rfm/base/source.py,sha256=bwu3GU2TvIXR2fwKAmJ1-5BDoNXMnI1SU3Fgdk8lWnc,301
79
+ kumoai/experimental/rfm/base/sql_sampler.py,sha256=_go8TnH7AHki-0gg_pB7xd228VYhogQh10OkxT7PEnI,15682
80
+ kumoai/experimental/rfm/base/table.py,sha256=eJuOUM64VWDkHaslNgeR5A_FZjlPF_4czC8OfFGR62E,26015
81
+ kumoai/experimental/rfm/base/utils.py,sha256=Easg1bvjPLR8oZIoxIQCtCyl92pp2dUskdnSv1eayxQ,1133
82
+ kumoai/experimental/rfm/infer/__init__.py,sha256=8GDxQKd0pxZULdk7mpwl3CsOpL4v2HPuPEsbi2t_vzc,519
66
83
  kumoai/experimental/rfm/infer/categorical.py,sha256=VwNaKwKbRYkTxEJ1R6gziffC8dGsEThcDEfbi-KqW5c,853
84
+ kumoai/experimental/rfm/infer/dtype.py,sha256=fbRRyyKSzO4riqX3RlhvBK7DhnjhwTgZVUjQ9inVPYI,2811
67
85
  kumoai/experimental/rfm/infer/id.py,sha256=ZIO0DWIoiEoS_8MVc5lkqBfkTWWQ0yGCgjkwLdaYa_Q,908
68
- kumoai/experimental/rfm/infer/multicategorical.py,sha256=0-cLpDnGryhr76QhZNO-klKokJ6MUSfxXcGdQ61oykY,1102
86
+ kumoai/experimental/rfm/infer/multicategorical.py,sha256=lNO_8aJw1whO6QVEMB3PRWMNlEEiX44g3v4tP88TSQY,1119
87
+ kumoai/experimental/rfm/infer/pkey.py,sha256=IaJI5GHK8ds_a3AOr3YYVgUlSmYYEgr4Nu92s2RyBV4,4412
88
+ kumoai/experimental/rfm/infer/stype.py,sha256=fu4zsOB-C7jNeMnq6dsK4bOZSewe7PtZe_AkohSRLoM,894
89
+ kumoai/experimental/rfm/infer/time_col.py,sha256=iw_aUcHD2bHr7uRa3E7uDC30kU37aLIRTVAFdQEpt68,1818
69
90
  kumoai/experimental/rfm/infer/timestamp.py,sha256=vM9--7eStzaGG13Y-oLYlpNJyhL6f9dp17HDXwtl_DM,1094
70
91
  kumoai/experimental/rfm/pquery/__init__.py,sha256=X0O3EIq5SMfBEE-ii5Cq6iDhR3s3XMXB52Cx5htoePw,152
71
- kumoai/experimental/rfm/pquery/executor.py,sha256=f7-pJhL0BgFU9E4o4gQpQyArOvyrZtwxFmks34-QOAE,2741
72
- kumoai/experimental/rfm/pquery/pandas_executor.py,sha256=kiBJq7uVGbasG7TiqsubEl6ey3UYzZiM4bwxILqp_54,18487
92
+ kumoai/experimental/rfm/pquery/executor.py,sha256=gs5AVNaA50ci8zXOBD3qt5szdTReSwTs4BGuEyx4BEE,2728
93
+ kumoai/experimental/rfm/pquery/pandas_executor.py,sha256=MwSvFRwLq-z19LEdF0G0AT7Gj9tCqu-XLEA7mNbqXwc,18454
73
94
  kumoai/graph/__init__.py,sha256=n8X4X8luox4hPBHTRC9R-3JzvYYMoR8n7lF1H4w4Hzc,228
74
95
  kumoai/graph/column.py,sha256=t7wBmcx0VYKXjIoESU9Nq-AisiJOdlqd80t8zby1R8Y,4189
75
96
  kumoai/graph/graph.py,sha256=iyp4klPIMn2ttuEqMJvsrxKb_tmz_DTnvziIhCegduM,38291
76
97
  kumoai/graph/table.py,sha256=nZqYX8xlyAz6kVtlE2vf9BAIOCoWeFNIfbGbReDCb7k,33888
77
98
  kumoai/pquery/__init__.py,sha256=uTXr7t1eXcVfM-ETaM_1ImfEqhrmaj8BjiIvy1YZTL8,533
78
99
  kumoai/pquery/prediction_table.py,sha256=QPDH22X1UB0NIufY7qGuV2XW7brG3Pv--FbjNezzM2g,10776
79
- kumoai/pquery/predictive_query.py,sha256=oUqwdOWLLkPM-G4PhpUk_6mwSJGBtaD3t37Wp5Oow8M,24971
80
- kumoai/pquery/training_table.py,sha256=elmPDZx11kPiC_dkOhJcBUGtHKgL32GCBvZ9k6U0pMg,15809
100
+ kumoai/pquery/predictive_query.py,sha256=UXn1s8ztubYZMNGl4ijaeidMiGlFveb1TGw9qI5-TAo,24901
101
+ kumoai/pquery/training_table.py,sha256=QsZbqA1o-hFSi8GygtDQgYKFi8-3Ur2PftnpgAMqAec,16566
81
102
  kumoai/testing/__init__.py,sha256=goHIIo3JE7uHV7njo4_aTd89mVVR74BEAZ2uyBaOR0w,170
82
- kumoai/testing/decorators.py,sha256=RiFrJcP-ym-mB1BYSGC26bBiryxoR9-GwL1G4EHc2sc,1591
103
+ kumoai/testing/decorators.py,sha256=83tMifuPTpUqX7zHxMttkj1TDdB62EBtAP-Fjj72Zdo,1607
104
+ kumoai/testing/snow.py,sha256=S2ayiJ0WCZQdPKYiAKqT8OkQEw0xjYjOgDtGcjs3o7Q,1526
83
105
  kumoai/trainer/__init__.py,sha256=zUdFl-f-sBWmm2x8R-rdVzPBeU2FaMzUY5mkcgoTa1k,939
84
106
  kumoai/trainer/baseline_trainer.py,sha256=LlfViNOmswNv4c6zJJLsyv0pC2mM2WKMGYx06ogtEVc,4024
85
107
  kumoai/trainer/config.py,sha256=-2RfK10AsVVThSyfWtlyfH4Fc4EwTdu0V3yrDRtIOjk,98
108
+ kumoai/trainer/distilled_trainer.py,sha256=2pPs5clakNxkLfaak7uqPJOrpTWe1RVVM7ztDSqQZvU,6484
86
109
  kumoai/trainer/job.py,sha256=Wk69nzFhbvuA3nEvtCstI04z5CxkgvQ6tHnGchE0Lkg,44938
87
110
  kumoai/trainer/online_serving.py,sha256=9cddb5paeZaCgbUeceQdAOxysCtV5XP-KcsgFz_XR5w,9566
88
111
  kumoai/trainer/trainer.py,sha256=hBXO7gwpo3t59zKFTeIkK65B8QRmWCwO33sbDuEAPlY,20133
89
112
  kumoai/trainer/util.py,sha256=bDPGkMF9KOy4HgtA-OwhXP17z9cbrfMnZGtyGuUq_Eo,4062
90
- kumoai/utils/__init__.py,sha256=wGDC_31XJ-7ipm6eawjLAJaP4EfmtNOH8BHzaetQ9Ko,268
113
+ kumoai/utils/__init__.py,sha256=6S-UtwjeLpnCYRCCIEWhkitPYGaqOGXC1ChE13DzXiU,256
91
114
  kumoai/utils/datasets.py,sha256=ptKIUoBONVD55pTVNdRCkQT3NWdN_r9UAUu4xewPa3U,2928
115
+ kumoai/utils/display.py,sha256=gnQR8QO0QQYfusefr7lObVEwZ3xajsv0XhhjAqOlz1A,2432
92
116
  kumoai/utils/forecasting.py,sha256=-nDS6ucKNfQhTQOfebjefj0wwWH3-KYNslIomxwwMBM,7415
93
- kumoai/utils/progress_logger.py,sha256=pngEGzMHkiOUKOa6fbzxCEc2xlA4SJKV4TDTVVoqObM,5062
94
- kumoai-2.13.0.dev202511211730.dist-info/licenses/LICENSE,sha256=TbWlyqRmhq9PEzCaTI0H0nWLQCCOywQM8wYH8MbjfLo,1102
95
- kumoai-2.13.0.dev202511211730.dist-info/METADATA,sha256=S4KjjwNYqtLxfkX6vqdiOoo-iUPcfoXnKGJif23K9jU,2475
96
- kumoai-2.13.0.dev202511211730.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
97
- kumoai-2.13.0.dev202511211730.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
98
- kumoai-2.13.0.dev202511211730.dist-info/RECORD,,
117
+ kumoai/utils/progress_logger.py,sha256=x3AlM_QMw3M26QOlZe29SlIbJm5yXrymgRCMwrbw8oY,9537
118
+ kumoai/utils/sql.py,sha256=CNKa-M56QiWoCSe9WLuumahsu3_ugQGr2YoTbveFHq0,147
119
+ kumoai-2.15.0.dev202601131732.dist-info/licenses/LICENSE,sha256=TbWlyqRmhq9PEzCaTI0H0nWLQCCOywQM8wYH8MbjfLo,1102
120
+ kumoai-2.15.0.dev202601131732.dist-info/METADATA,sha256=9SYgz7rxNCFES9FHWa9PzKEdGoMSGgbLSoF9liGQs0Y,2564
121
+ kumoai-2.15.0.dev202601131732.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
122
+ kumoai-2.15.0.dev202601131732.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
123
+ kumoai-2.15.0.dev202601131732.dist-info/RECORD,,