kumoai 2.7.0.dev202508201830__cp312-cp312-win_amd64.whl → 2.12.0.dev202511111731__cp312-cp312-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 (35) hide show
  1. kumoai/__init__.py +4 -2
  2. kumoai/_version.py +1 -1
  3. kumoai/client/client.py +10 -5
  4. kumoai/client/endpoints.py +1 -0
  5. kumoai/client/rfm.py +37 -8
  6. kumoai/connector/file_upload_connector.py +94 -85
  7. kumoai/connector/snowflake_connector.py +9 -0
  8. kumoai/connector/utils.py +1377 -209
  9. kumoai/experimental/rfm/__init__.py +5 -3
  10. kumoai/experimental/rfm/authenticate.py +8 -5
  11. kumoai/experimental/rfm/infer/timestamp.py +7 -4
  12. kumoai/experimental/rfm/local_graph.py +96 -82
  13. kumoai/experimental/rfm/local_graph_sampler.py +16 -8
  14. kumoai/experimental/rfm/local_graph_store.py +32 -10
  15. kumoai/experimental/rfm/local_pquery_driver.py +342 -46
  16. kumoai/experimental/rfm/local_table.py +142 -45
  17. kumoai/experimental/rfm/pquery/__init__.py +4 -4
  18. kumoai/experimental/rfm/pquery/{backend.py → executor.py} +28 -58
  19. kumoai/experimental/rfm/pquery/pandas_executor.py +532 -0
  20. kumoai/experimental/rfm/rfm.py +535 -125
  21. kumoai/experimental/rfm/utils.py +0 -3
  22. kumoai/jobs.py +27 -1
  23. kumoai/kumolib.cp312-win_amd64.pyd +0 -0
  24. kumoai/pquery/prediction_table.py +5 -3
  25. kumoai/pquery/training_table.py +5 -3
  26. kumoai/trainer/job.py +9 -30
  27. kumoai/trainer/trainer.py +19 -10
  28. kumoai/utils/__init__.py +2 -1
  29. kumoai/utils/progress_logger.py +96 -16
  30. {kumoai-2.7.0.dev202508201830.dist-info → kumoai-2.12.0.dev202511111731.dist-info}/METADATA +4 -5
  31. {kumoai-2.7.0.dev202508201830.dist-info → kumoai-2.12.0.dev202511111731.dist-info}/RECORD +34 -34
  32. kumoai/experimental/rfm/pquery/pandas_backend.py +0 -437
  33. {kumoai-2.7.0.dev202508201830.dist-info → kumoai-2.12.0.dev202511111731.dist-info}/WHEEL +0 -0
  34. {kumoai-2.7.0.dev202508201830.dist-info → kumoai-2.12.0.dev202511111731.dist-info}/licenses/LICENSE +0 -0
  35. {kumoai-2.7.0.dev202508201830.dist-info → kumoai-2.12.0.dev202511111731.dist-info}/top_level.txt +0 -0
@@ -14,9 +14,6 @@ from kumoai.experimental.rfm.infer import (
14
14
  contains_timestamp,
15
15
  )
16
16
 
17
- # Maximum number of rows to check for dtype inference in object columns
18
- _MAX_NUM_ROWS_FOR_DTYPE_INFERENCE = 100
19
-
20
17
  # Mapping from pandas/numpy dtypes to Kumo Dtypes
21
18
  PANDAS_TO_DTYPE: Dict[Any, Dtype] = {
22
19
  np.dtype('bool'): Dtype.bool,
kumoai/jobs.py CHANGED
@@ -2,6 +2,7 @@ from abc import ABC, abstractmethod
2
2
  from typing import Generic, Mapping, Optional, TypeVar
3
3
 
4
4
  from kumoapi.jobs import JobStatusReport
5
+ from typing_extensions import Self
5
6
 
6
7
  from kumoai.client.jobs import CommonJobAPI, JobRequestType, JobResourceType
7
8
 
@@ -9,12 +10,37 @@ IDType = TypeVar('IDType', bound=str)
9
10
 
10
11
 
11
12
  class JobInterface(ABC, Generic[IDType, JobRequestType, JobResourceType]):
12
- r"""Defines a standard interface for job objects"""
13
+ r"""Defines a standard interface for job objects."""
13
14
  @staticmethod
14
15
  @abstractmethod
15
16
  def _api() -> CommonJobAPI[JobRequestType, JobResourceType]:
16
17
  pass
17
18
 
19
+ @classmethod
20
+ def search_by_tags(cls, tags: Mapping[str, str],
21
+ limit: int = 10) -> list[Self]:
22
+ r"""Returns a list of job instances from a set of job tags.
23
+
24
+ Args:
25
+ tags (Mapping[str, str]): Tags by which to search.
26
+ limit (int): Max number of jobs to list, default 10.
27
+
28
+ Example:
29
+ >>> # doctest: +SKIP
30
+ >>> tags = {'pquery_name': 'my_pquery_name'}
31
+ >>> jobs = BatchPredictionJob.search_by_tags(tags)
32
+ Search limited to 10 results based on the `limit` parameter.
33
+ Found 2 jobs.
34
+ """
35
+ print(f"Search limited to {limit} results based on the `limit` "
36
+ "parameter.")
37
+
38
+ jobs = cls._api().list(limit=limit, additional_tags=tags)
39
+
40
+ print(f"Found {len(jobs)} jobs.")
41
+
42
+ return [cls(j.job_id) for j in jobs] # type: ignore
43
+
18
44
  @property
19
45
  @abstractmethod
20
46
  def id(self) -> IDType:
Binary file
@@ -4,6 +4,7 @@ import asyncio
4
4
  import logging
5
5
  from concurrent.futures import Future
6
6
  from datetime import datetime
7
+ from functools import cached_property
7
8
  from typing import List, Optional, Union
8
9
 
9
10
  import pandas as pd
@@ -217,9 +218,10 @@ class PredictionTableJob(JobInterface[GeneratePredictionTableJobID,
217
218
  ) -> None:
218
219
  self.job_id = job_id
219
220
  self.job: Optional[GeneratePredictionTableJobResource] = None
220
- # A training table holds a reference to the future that tracks the
221
- # execution of its generation.
222
- self._fut: Future = create_future(self._poll())
221
+
222
+ @cached_property
223
+ def _fut(self) -> Future:
224
+ return create_future(self._poll())
223
225
 
224
226
  @override
225
227
  @property
@@ -5,6 +5,7 @@ import logging
5
5
  import os
6
6
  import time
7
7
  from concurrent.futures import Future
8
+ from functools import cached_property
8
9
  from typing import List, Optional, Tuple, Union
9
10
 
10
11
  import pandas as pd
@@ -308,9 +309,10 @@ class TrainingTableJob(JobInterface[GenerateTrainTableJobID,
308
309
  job_id: GenerateTrainTableJobID,
309
310
  ) -> None:
310
311
  self.job_id = job_id
311
- # A training table holds a reference to the future that tracks the
312
- # execution of its generation.
313
- self._fut: Future[TrainingTable] = create_future(_poll(job_id))
312
+
313
+ @cached_property
314
+ def _fut(self) -> Future[TrainingTable]:
315
+ return create_future(_poll(self.job_id))
314
316
 
315
317
  @override
316
318
  @property
kumoai/trainer/job.py CHANGED
@@ -4,7 +4,7 @@ import concurrent.futures
4
4
  import time
5
5
  from datetime import datetime, timezone
6
6
  from functools import cached_property
7
- from typing import TYPE_CHECKING, Dict, List, Mapping, Optional, Union
7
+ from typing import TYPE_CHECKING, Dict, List, Optional, Union
8
8
  from urllib.parse import urlparse, urlunparse
9
9
 
10
10
  import pandas as pd
@@ -600,8 +600,10 @@ class TrainingJob(JobInterface[TrainingJobID, TrainingJobRequest,
600
600
 
601
601
  def __init__(self, job_id: TrainingJobID) -> None:
602
602
  self.job_id = job_id
603
- self._fut: concurrent.futures.Future = create_future(
604
- _poll_training(job_id))
603
+
604
+ @cached_property
605
+ def _fut(self) -> concurrent.futures.Future:
606
+ return create_future(_poll_training(self.job_id))
605
607
 
606
608
  @override
607
609
  @property
@@ -1002,31 +1004,6 @@ class BatchPredictionJob(JobInterface[BatchPredictionJobID,
1002
1004
  """
1003
1005
  return self._api().get_config(self.job_id)
1004
1006
 
1005
- @classmethod
1006
- def search_by_tags(cls, tags: Mapping[str, str],
1007
- limit: int = 10) -> list['BatchPredictionJob']:
1008
- r"""Returns a list of :class:`~kumoai.trainer.job.BatchPredictionJob`
1009
- instances from a set of job tags.
1010
-
1011
- Args:
1012
- tags (Mapping[str, str]): Tags by which to search.
1013
- limit (int): Max number of jobs to list, default 10.
1014
-
1015
- Example:
1016
- >>> tags = {'pquery_name': 'my_pquery_name'}
1017
- >>> jobs = BatchPredictionJob.search_by_tags(tags)
1018
- Search limited to 10 results based on the `limit` parameter.
1019
- Found 2 jobs.
1020
- """
1021
- print(f"Search limited to {limit} results based on the `limit` "
1022
- "parameter.")
1023
-
1024
- jobs = cls._api().list(limit=limit, additional_tags=tags)
1025
-
1026
- print(f"Found {len(jobs)} jobs.")
1027
-
1028
- return [cls(j.job_id) for j in jobs]
1029
-
1030
1007
 
1031
1008
  def _get_batch_prediction_job(job_id: str) -> BatchPredictionJobResource:
1032
1009
  api = global_state.client.batch_prediction_job_api
@@ -1097,8 +1074,10 @@ class BaselineJob(JobInterface[BaselineJobID, BaselineJobRequest,
1097
1074
 
1098
1075
  def __init__(self, job_id: BaselineJobID) -> None:
1099
1076
  self.job_id = job_id
1100
- self._fut: concurrent.futures.Future = create_future(
1101
- _poll_baseline(job_id))
1077
+
1078
+ @cached_property
1079
+ def _fut(self) -> concurrent.futures.Future:
1080
+ return create_future(_poll_baseline(self.job_id))
1102
1081
 
1103
1082
  @override
1104
1083
  @property
kumoai/trainer/trainer.py CHANGED
@@ -20,7 +20,6 @@ from kumoapi.jobs import (
20
20
  TrainingJobResource,
21
21
  )
22
22
  from kumoapi.model_plan import ModelPlan
23
- from kumoapi.task import TaskType
24
23
 
25
24
  from kumoai import global_state
26
25
  from kumoai.artifact_export.config import OutputConfig
@@ -190,6 +189,7 @@ class Trainer:
190
189
  *,
191
190
  non_blocking: bool = False,
192
191
  custom_tags: Mapping[str, str] = {},
192
+ warm_start_job_id: Optional[TrainingJobID] = None,
193
193
  ) -> Union[TrainingJob, TrainingJobResult]:
194
194
  r"""Fits a model to the specified graph and training table, with the
195
195
  strategy defined by this :class:`Trainer`'s :obj:`model_plan`.
@@ -207,6 +207,11 @@ class Trainer:
207
207
  custom_tags: Additional, customer defined k-v tags to be associated
208
208
  with the job to be launched. Job tags are useful for grouping
209
209
  and searching jobs.
210
+ warm_start_job_id: Optional job ID of a completed training job to
211
+ warm start from. Initializes the new model with the best
212
+ weights from the specified job, using its model
213
+ architecture, column processing, and neighbor sampling
214
+ configurations.
210
215
 
211
216
  Returns:
212
217
  Union[TrainingJobResult, TrainingJob]:
@@ -241,6 +246,7 @@ class Trainer:
241
246
  graph_snapshot_id=graph.snapshot(non_blocking=non_blocking),
242
247
  train_table_job_id=job_id,
243
248
  custom_train_table=custom_table,
249
+ warm_start_job_id=warm_start_job_id,
244
250
  ))
245
251
 
246
252
  out = TrainingJob(job_id=self._training_job_id)
@@ -353,6 +359,9 @@ class Trainer:
353
359
  'deprecated. Please use output_config to specify these '
354
360
  'parameters.')
355
361
  assert output_config is not None
362
+ # Be able to pass output_config as a dictionary
363
+ if isinstance(output_config, dict):
364
+ output_config = OutputConfig(**output_config)
356
365
  output_table_name = to_db_table_name(output_config.output_table_name)
357
366
  validate_output_arguments(
358
367
  output_config.output_types,
@@ -395,15 +404,15 @@ class Trainer:
395
404
  pred_table_data_path = prediction_table.table_data_uri
396
405
 
397
406
  api = global_state.client.batch_prediction_job_api
398
-
399
- from kumoai.pquery.predictive_query import PredictiveQuery
400
- pquery = PredictiveQuery.load_from_training_job(training_job_id)
401
- if pquery.get_task_type() == TaskType.BINARY_CLASSIFICATION:
402
- if binary_classification_threshold is None:
403
- logger.warning("No binary classification threshold provided. "
404
- "Using default threshold of 0.5.")
405
- binary_classification_threshold = 0.5
406
-
407
+ # Remove to resolve https://github.com/kumo-ai/kumo/issues/24250
408
+ # from kumoai.pquery.predictive_query import PredictiveQuery
409
+ # pquery = PredictiveQuery.load_from_training_job(training_job_id)
410
+ # if pquery.get_task_type() == TaskType.BINARY_CLASSIFICATION:
411
+ # if binary_classification_threshold is None:
412
+ # logger.warning(
413
+ # "No binary classification threshold provided. "
414
+ # "Using default threshold of 0.5.")
415
+ # binary_classification_threshold = 0.5
407
416
  job_id, response = api.maybe_create(
408
417
  BatchPredictionRequest(
409
418
  dict(custom_tags),
kumoai/utils/__init__.py CHANGED
@@ -1,9 +1,10 @@
1
- from .progress_logger import ProgressLogger
1
+ from .progress_logger import ProgressLogger, InteractiveProgressLogger
2
2
  from .forecasting import ForecastVisualizer
3
3
  from .datasets import from_relbench
4
4
 
5
5
  __all__ = [
6
6
  'ProgressLogger',
7
+ 'InteractiveProgressLogger',
7
8
  'ForecastVisualizer',
8
9
  'from_relbench',
9
10
  ]
@@ -1,9 +1,18 @@
1
+ import sys
1
2
  import time
2
3
  from typing import Any, List, Optional, Union
3
4
 
4
5
  from rich.console import Console, ConsoleOptions, RenderResult
5
6
  from rich.live import Live
6
7
  from rich.padding import Padding
8
+ from rich.progress import (
9
+ BarColumn,
10
+ MofNCompleteColumn,
11
+ Progress,
12
+ Task,
13
+ TextColumn,
14
+ TimeRemainingColumn,
15
+ )
7
16
  from rich.spinner import Spinner
8
17
  from rich.table import Table
9
18
  from rich.text import Text
@@ -11,27 +20,13 @@ from typing_extensions import Self
11
20
 
12
21
 
13
22
  class ProgressLogger:
14
- def __init__(
15
- self,
16
- msg: str,
17
- verbose: bool = True,
18
- refresh_per_second: int = 10,
19
- ) -> None:
20
-
23
+ def __init__(self, msg: str) -> None:
21
24
  self.msg = msg
22
- self.verbose = verbose
23
- self.refresh_per_second = refresh_per_second
24
25
  self.logs: List[str] = []
25
26
 
26
27
  self.start_time: Optional[float] = None
27
28
  self.end_time: Optional[float] = None
28
29
 
29
- self._live: Optional[Live] = None
30
- self._exception: bool = False
31
-
32
- def __repr__(self) -> str:
33
- return f'{self.__class__.__name__}({self.msg})'
34
-
35
30
  @property
36
31
  def duration(self) -> float:
37
32
  assert self.start_time is not None
@@ -44,6 +39,77 @@ class ProgressLogger:
44
39
 
45
40
  def __enter__(self) -> Self:
46
41
  self.start_time = time.perf_counter()
42
+ return self
43
+
44
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
45
+ self.end_time = time.perf_counter()
46
+
47
+ def __repr__(self) -> str:
48
+ return f'{self.__class__.__name__}({self.msg})'
49
+
50
+
51
+ class ColoredMofNCompleteColumn(MofNCompleteColumn):
52
+ def __init__(self, style: str = 'green') -> None:
53
+ super().__init__()
54
+ self.style = style
55
+
56
+ def render(self, task: Task) -> Text:
57
+ return Text(str(super().render(task)), style=self.style)
58
+
59
+
60
+ class ColoredTimeRemainingColumn(TimeRemainingColumn):
61
+ def __init__(self, style: str = 'cyan') -> None:
62
+ super().__init__()
63
+ self.style = style
64
+
65
+ def render(self, task: Task) -> Text:
66
+ return Text(str(super().render(task)), style=self.style)
67
+
68
+
69
+ class InteractiveProgressLogger(ProgressLogger):
70
+ def __init__(
71
+ self,
72
+ msg: str,
73
+ verbose: bool = True,
74
+ refresh_per_second: int = 10,
75
+ ) -> None:
76
+ super().__init__(msg=msg)
77
+
78
+ self.verbose = verbose
79
+ self.refresh_per_second = refresh_per_second
80
+
81
+ self._progress: Optional[Progress] = None
82
+ self._task: Optional[int] = None
83
+
84
+ self._live: Optional[Live] = None
85
+ self._exception: bool = False
86
+
87
+ def init_progress(self, total: int, description: str) -> None:
88
+ assert self._progress is None
89
+ if self.verbose:
90
+ self._progress = Progress(
91
+ TextColumn(f' ↳ {description}', style='dim'),
92
+ BarColumn(bar_width=None),
93
+ ColoredMofNCompleteColumn(style='dim'),
94
+ TextColumn('•', style='dim'),
95
+ ColoredTimeRemainingColumn(style='dim'),
96
+ )
97
+ self._task = self._progress.add_task("Progress", total=total)
98
+
99
+ def step(self) -> None:
100
+ if self.verbose:
101
+ assert self._progress is not None
102
+ assert self._task is not None
103
+ self._progress.update(self._task, advance=1) # type: ignore
104
+
105
+ def __enter__(self) -> Self:
106
+ from kumoai import in_notebook
107
+
108
+ super().__enter__()
109
+
110
+ if not in_notebook(): # Render progress bar in TUI.
111
+ sys.stdout.write("\x1b]9;4;3\x07")
112
+ sys.stdout.flush()
47
113
 
48
114
  if self.verbose:
49
115
  self._live = Live(
@@ -56,16 +122,27 @@ class ProgressLogger:
56
122
  return self
57
123
 
58
124
  def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
59
- self.end_time = time.perf_counter()
125
+ from kumoai import in_notebook
126
+
127
+ super().__exit__(exc_type, exc_val, exc_tb)
60
128
 
61
129
  if exc_type is not None:
62
130
  self._exception = True
63
131
 
132
+ if self._progress is not None:
133
+ self._progress.stop()
134
+ self._progress = None
135
+ self._task = None
136
+
64
137
  if self._live is not None:
65
138
  self._live.update(self, refresh=True)
66
139
  self._live.stop()
67
140
  self._live = None
68
141
 
142
+ if not in_notebook():
143
+ sys.stdout.write("\x1b]9;4;0\x07")
144
+ sys.stdout.flush()
145
+
69
146
  def __rich_console__(
70
147
  self,
71
148
  console: Console,
@@ -95,3 +172,6 @@ class ProgressLogger:
95
172
  table.add_row('', Text(f'↳ {log}', style='dim'))
96
173
 
97
174
  yield table
175
+
176
+ if self.verbose and self._progress is not None:
177
+ yield self._progress.get_renderable()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kumoai
3
- Version: 2.7.0.dev202508201830
3
+ Version: 2.12.0.dev202511111731
4
4
  Summary: AI on the Modern Data Stack
5
5
  Author-email: "Kumo.AI" <hello@kumo.ai>
6
6
  License-Expression: MIT
@@ -9,13 +9,12 @@ Project-URL: documentation, https://kumo.ai/docs
9
9
  Keywords: deep-learning,graph-neural-networks,cloud-data-warehouse
10
10
  Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Programming Language :: Python
12
- Classifier: Programming Language :: Python :: 3.9
13
12
  Classifier: Programming Language :: Python :: 3.10
14
13
  Classifier: Programming Language :: Python :: 3.11
15
14
  Classifier: Programming Language :: Python :: 3.12
16
15
  Classifier: Programming Language :: Python :: 3.13
17
16
  Classifier: Programming Language :: Python :: 3 :: Only
18
- Requires-Python: >=3.9
17
+ Requires-Python: >=3.10
19
18
  Description-Content-Type: text/markdown
20
19
  License-File: LICENSE
21
20
  Requires-Dist: pandas
@@ -24,7 +23,7 @@ Requires-Dist: requests>=2.28.2
24
23
  Requires-Dist: urllib3
25
24
  Requires-Dist: plotly
26
25
  Requires-Dist: typing_extensions>=4.5.0
27
- Requires-Dist: kumo-api==0.31.0
26
+ Requires-Dist: kumo-api==0.45.0
28
27
  Requires-Dist: tqdm>=4.66.0
29
28
  Requires-Dist: aiohttp>=3.10.0
30
29
  Requires-Dist: pydantic>=1.10.21
@@ -54,7 +53,7 @@ interact with the Kumo machine learning platform
54
53
 
55
54
  ## Installation
56
55
 
57
- The Kumo SDK is available for Python 3.9 to Python 3.13. To install, simply run
56
+ The Kumo SDK is available for Python 3.10 to Python 3.13. To install, simply run
58
57
 
59
58
  ```
60
59
  pip install kumoai
@@ -1,27 +1,27 @@
1
- kumoai/__init__.py,sha256=7YoN_aogTFbuPKHjwvu8Pr8DqkZGCSUTqXj-yofcUFM,10965
1
+ kumoai/__init__.py,sha256=4efagNAotP3c8mj8yyDGfVFcbgQ9l4wRC4FP-Yt0J3E,11002
2
2
  kumoai/_logging.py,sha256=qL4JbMQwKXri2f-SEJoFB8TY5ALG12S-nobGTNWxW-A,915
3
3
  kumoai/_singleton.py,sha256=i2BHWKpccNh5SJGDyU0IXsnYzJAYr8Xb0wz4c6LRbpo,861
4
- kumoai/_version.py,sha256=6cFaCcjuJE6ReB2itnbx3yJr0LcjfkYCtktWp4RwAuQ,38
4
+ kumoai/_version.py,sha256=EmBJ4U0JvENPiq7lq8M80mpSdMDFEwNkBsjWDdzaLT4,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
- kumoai/jobs.py,sha256=u_GJe1kfd8f-HNJ6i7xxJ6JY7Z5CZ2NtKueARAUs_Wo,1622
10
- kumoai/kumolib.cp312-win_amd64.pyd,sha256=hIHIoYpEXWf6hz40vcIM64ZuX4TRqi4aSTLiJsFVrO4,198144
9
+ kumoai/jobs.py,sha256=dCi7BAdfm2tCnonYlGU4WJokJWbh3RzFfaOX2EYCIHU,2576
10
+ kumoai/kumolib.cp312-win_amd64.pyd,sha256=7yurkZQvIf0TXW94voE5HRJy9zH36cqSkjvmz8VVLgk,198144
11
11
  kumoai/mixin.py,sha256=IaiB8SAI0VqOoMVzzIaUlqMt53-QPUK6OB0HikG-V9E,840
12
12
  kumoai/spcs.py,sha256=SWvfkeJvb_7sGkjSqyMBIuPbMTWCP6v0BC9HBXM1uSI,4398
13
13
  kumoai/artifact_export/__init__.py,sha256=UXAQI5q92ChBzWAk8o3J6pElzYHudAzFZssQXd4o7i8,247
14
14
  kumoai/artifact_export/config.py,sha256=PRoUByzu5l-nyBKFR4vnRlq19b53ExGVy8YDCD7zMuI,8233
15
15
  kumoai/artifact_export/job.py,sha256=lOFIdPCrvhwdfvvDhQ2yzW8J4qIdYQoHZO1Rz3kJky4,3383
16
16
  kumoai/client/__init__.py,sha256=v0ISO1QD8JJhIJS6IzWz5-SL3EhtNCPeX3j1b2HBY0s,69
17
- kumoai/client/client.py,sha256=5AI-m7MhXgZm68GdX_J4YBoaR0fdFlqgcmA8rq1eYDQ,8416
17
+ kumoai/client/client.py,sha256=IoZ6WH-VIAdwpwmd5DhP4HqjQL_YpB5vaWjtaWrNECk,8801
18
18
  kumoai/client/connector.py,sha256=CO2LG5aDpCLxWNYYFRXGZs1AhYH3dRcbqBEUGwHQGzQ,4030
19
- kumoai/client/endpoints.py,sha256=gyVxVkdlO7FMR_UHof3RWsoTY-87JTD7y1lLIw1kh8A,5464
19
+ kumoai/client/endpoints.py,sha256=DpEKEQ1yvL15iHZadXZKO94t-qXrYLaeV1sknX4IuPg,5532
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
23
  kumoai/client/pquery.py,sha256=0pXgQLxjoaFWDif0XRAuC_P-X3OSnXNWsiVrXej9uMk,7094
24
- kumoai/client/rfm.py,sha256=wr2CXFdtvu5wGJz7iQ2OBzhQRu_EyMESH8KJZ0dsBMo,2965
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
27
27
  kumoai/client/utils.py,sha256=RSD5Ia0lQQDR1drRFBJFdo2KVHfQqhJuk6m6du7Kl4E,3979
@@ -45,54 +45,54 @@ kumoai/connector/__init__.py,sha256=yPE3TVLCKdVKhsqPsYVSA290eIZCOTtHtylxm2I5U6Q,
45
45
  kumoai/connector/base.py,sha256=AYCtcYuncLyMl0FLLUMu5z4qFBWury5jhK2D9sZJIgA,5444
46
46
  kumoai/connector/bigquery_connector.py,sha256=KMgXEyN6PCM5RV5fvKx0ZPubucf43LEz7KvDtKCHXbM,7282
47
47
  kumoai/connector/databricks_connector.py,sha256=oJ2GHp_CFOeMWGPOHqpxmotquAobWV9iGZ-__Rpdr5o,7787
48
- kumoai/connector/file_upload_connector.py,sha256=cXdbabNGwQX4N4GpK00SJnzF54QUGMSAhFRVTBs-kAc,7078
48
+ kumoai/connector/file_upload_connector.py,sha256=13dWWXd_RNosWNHmZYasHDsVfpDS9qVCIYeST-7zljA,7197
49
49
  kumoai/connector/glue_connector.py,sha256=kqT2q53Da7PeeaZrvLVzFXC186E7glh5eGitKL26lYY,4847
50
50
  kumoai/connector/s3_connector.py,sha256=AUzENbQ20bYXh3XOXEOsWRKlaGGkm3YrW9JfBLm-LqY,10433
51
- kumoai/connector/snowflake_connector.py,sha256=7e9yM1RgwF58wmVqVQzWkfmUHbN8OA-Y6-GsNqucOPk,8793
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=nR0fSjuu9s7uWJ8aZlTkvA9Rh3fHBecNrEhJuA1w_UI,21636
53
+ kumoai/connector/utils.py,sha256=SlkjPJS_wqfwFzIaQOHZtENQnbOz5sgLbvvvPDXE1ww,65786
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=miVZCXdMdGxtjSgOcBSUZ79bNZ6CMM0z3LOcv5zlDXs,1706
57
- kumoai/experimental/rfm/authenticate.py,sha256=qDgy_k0LoW5gy46TquQDqHiJa7WOlH-trNCE-BkSYKA,19237
58
- kumoai/experimental/rfm/local_graph.py,sha256=kXl6mZ1MW_0FadFt_WIRnuK52SfaaLmQAwYIj8kdQYQ,30080
59
- kumoai/experimental/rfm/local_graph_sampler.py,sha256=fyAAf2L2WZnre8WQw148V2PZN1ASNIR3CPUVAO8MpOg,6371
60
- kumoai/experimental/rfm/local_graph_store.py,sha256=6cSL52YC9NK6ju5f4_DWKz0eUm4igvxs58m88jsrMEU,13410
61
- kumoai/experimental/rfm/local_pquery_driver.py,sha256=68Y9TIdoqIK3pgEsRVtrnTBIWctw4WRzba7gk184qV4,15398
62
- kumoai/experimental/rfm/local_table.py,sha256=F9jxLs5oHFevH5sY-u1JO8qFZy3hS4i-1qg_eoWNmDQ,16283
63
- kumoai/experimental/rfm/rfm.py,sha256=98RLN0awzqGlQNzGGWIz-VJL7vdnN3iZUQUMj90Ictc,31581
64
- kumoai/experimental/rfm/utils.py,sha256=aJNoUGApZ-TaRBFzV6AfscsnE-snzpwOvgtlMcbiPfU,11583
56
+ kumoai/experimental/rfm/__init__.py,sha256=qVFanPZTF_HiXlRfqpBSqlcD9sTSmFAMmM_o8tbuzNY,1776
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=ZCnILozG95EzpgMqhGTG2AF85JphLvAhj-3YPaTqoaQ,6922
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=G7qXENLu-VAT9804zu9bz-1sts0n33t98suIXvDlksc,49231
64
+ kumoai/experimental/rfm/utils.py,sha256=dLx2wdyTWg7vZI_7R-I0z_lA-2aV5M8h9n3bnnLyylI,11467
65
65
  kumoai/experimental/rfm/infer/__init__.py,sha256=fPsdDr4D3hgC8snW0j3pAVpCyR-xrauuogMnTOMrfok,304
66
66
  kumoai/experimental/rfm/infer/categorical.py,sha256=bqmfrE5ZCBTcb35lA4SyAkCu3MgttAn29VBJYMBNhVg,893
67
67
  kumoai/experimental/rfm/infer/id.py,sha256=xaJBETLZa8ttzZCsDwFSwfyCi3VYsLc_kDWT_t_6Ih4,954
68
68
  kumoai/experimental/rfm/infer/multicategorical.py,sha256=D-1KwYRkOSkBrOJr4Xa3eTCoAF9O9hPGa7Vg67V5_HU,1150
69
- kumoai/experimental/rfm/infer/timestamp.py,sha256=36SKjRNhyjNnfYd4_9_7vbzFxSx4z7GIbEt5tKVWszQ,954
70
- kumoai/experimental/rfm/pquery/__init__.py,sha256=XMpRh6-fahTU8XMXSxn8zbJQvYD1HkELh2su_YJvSmU,153
71
- kumoai/experimental/rfm/pquery/backend.py,sha256=iprPBozsEdmcCWJ9DRg4nHujkxNPuXbP2fksbWt06BU,3291
72
- kumoai/experimental/rfm/pquery/pandas_backend.py,sha256=Vrxba7vG9S6AiMLtxTvbTFHr6pQQtqAHUAEEprVQ-ho,14317
69
+ kumoai/experimental/rfm/infer/timestamp.py,sha256=L2VxjtYTSyUBYAo4M-L08xSQlPpqnHMAVF5_vxjh3Y0,1135
70
+ kumoai/experimental/rfm/pquery/__init__.py,sha256=RkTn0I74uXOUuOiBpa6S-_QEYctMutkUnBEfF9ztQzI,159
71
+ kumoai/experimental/rfm/pquery/executor.py,sha256=S8wwXbAkH-YSnmEVYB8d6wyJF4JJ003mH_0zFTvOp_I,2843
72
+ kumoai/experimental/rfm/pquery/pandas_executor.py,sha256=QQpOZ_ArH3eSAkenaY3J-gW1Wn5A7f85RiqZxaO5u1Q,19019
73
73
  kumoai/graph/__init__.py,sha256=QGk3OMwRzQJSGESdcc7hcQH6UDmNVJYTdqnRren4c7Q,240
74
74
  kumoai/graph/column.py,sha256=cQhioibTbIKIBZ-bf8-Bt4F4Iblhidps-CYWrkxRPnE,4295
75
75
  kumoai/graph/graph.py,sha256=Pq-dxi4MwoDtrrwm3xeyUB9Hl7ryNfHq4rMHuvyNB3c,39239
76
76
  kumoai/graph/table.py,sha256=BB-4ezyd7hrrj6QZwRBa80ySH0trwYb4fmhRn3xoK-k,34726
77
77
  kumoai/pquery/__init__.py,sha256=FF6QUTG_xrz2ic1I8NcIa8O993Ae98eZ9gkvQ4rapgo,558
78
- kumoai/pquery/prediction_table.py,sha256=i6uOMiS24MuiJKnpzHyS8h0Vd4h1vOe0Wp-ufG6rPVQ,11098
78
+ kumoai/pquery/prediction_table.py,sha256=hWG4L_ze4PLgUoxCXNKk8_nkYxVXELQs8_X8KGOE9yk,11063
79
79
  kumoai/pquery/predictive_query.py,sha256=GWhQpQxf6apyyu-bvE3z63mX6NLd8lKbyu_jzj7rNms,25608
80
- kumoai/pquery/training_table.py,sha256=mM4H6jQtR1FSuPPOeQV8zAyTsKjig8X2qpJNIgRaXNQ,16263
80
+ kumoai/pquery/training_table.py,sha256=L1QjaVlY4SAPD8OUmTaH6YjZzBbPOnS9mnAT69znWv0,16233
81
81
  kumoai/testing/__init__.py,sha256=XBQ_Sa3WnOYlpXZ3gUn8w6nVfZt-nfPhytfIBeiPt4w,178
82
82
  kumoai/testing/decorators.py,sha256=yznguzsdkL0UaZtBbnO6oaUrXisJvziaiO3dmN41UXE,1648
83
83
  kumoai/trainer/__init__.py,sha256=uCFXy9bw_byn_wYd3M-BTZCHTVvv4XXr8qRlh-QOvag,981
84
84
  kumoai/trainer/baseline_trainer.py,sha256=oXweh8j1sar6KhQfr3A7gmQxcDq7SG0Bx3jIenbtyC4,4117
85
85
  kumoai/trainer/config.py,sha256=7_Jv1w1mqaokCQwQdJkqCSgVpmh8GqE3fL1Ky_vvttI,100
86
- kumoai/trainer/job.py,sha256=ErQ-dAYpOq0s1yKu-2LKuKXgcrtBiJ8BcsJOZ4XF5vg,47009
86
+ kumoai/trainer/job.py,sha256=IBP2SeIk21XpRK1Um1NIs2dEKid319cHu6UkCjKO6jc,46130
87
87
  kumoai/trainer/online_serving.py,sha256=T1jicl-qXiiWGQWUCwlfQsyxWUODybj_975gx9yglH4,9824
88
- kumoai/trainer/trainer.py,sha256=J3PrMBqh5B1sarpJ0FXaC26hrAQWycmOfWwKmpPqkgI,19972
88
+ kumoai/trainer/trainer.py,sha256=AKumc3X2Vm3qxZSA85Dv_fSLC4JQ3rM7P0ixOWbEex0,20608
89
89
  kumoai/trainer/util.py,sha256=LCXkY5MNl6NbEVd2OZ0aVqF6fvr3KiCFh6pH0igAi_g,4165
90
- kumoai/utils/__init__.py,sha256=rWH6YhGmjIQv2Lip_lAYoDaxk9SUVBdzIB3bLOFj9J4,217
90
+ kumoai/utils/__init__.py,sha256=wAKgmwtMIGuiauW9D_GGKH95K-24Kgwmld27mm4nsro,278
91
91
  kumoai/utils/datasets.py,sha256=UyAII-oAn7x3ombuvpbSQ41aVF9SYKBjQthTD-vcT2A,3011
92
92
  kumoai/utils/forecasting.py,sha256=ZgKeUCbWLOot0giAkoigwU5du8LkrwAicFOi5hVn6wg,7624
93
- kumoai/utils/progress_logger.py,sha256=Nqz_1joFyLa535PPSYYq7C3pupK1GwCRlyGvroumP24,2726
94
- kumoai-2.7.0.dev202508201830.dist-info/licenses/LICENSE,sha256=ZUilBDp--4vbhsEr6f_Upw9rnIx09zQ3K9fXQ0rfd6w,1111
95
- kumoai-2.7.0.dev202508201830.dist-info/METADATA,sha256=jgixX2dD_CTkdyq9CLd3bL9hiiXDAfxm3Dxj0fbs8Yc,2160
96
- kumoai-2.7.0.dev202508201830.dist-info/WHEEL,sha256=8UP9x9puWI0P1V_d7K2oMTBqfeLNm21CTzZ_Ptr0NXU,101
97
- kumoai-2.7.0.dev202508201830.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
98
- kumoai-2.7.0.dev202508201830.dist-info/RECORD,,
93
+ kumoai/utils/progress_logger.py,sha256=MZsWgHd4UZQKCXiJZgQeW-Emi_BmzlCKPLPXOL_HqBo,5239
94
+ kumoai-2.12.0.dev202511111731.dist-info/licenses/LICENSE,sha256=ZUilBDp--4vbhsEr6f_Upw9rnIx09zQ3K9fXQ0rfd6w,1111
95
+ kumoai-2.12.0.dev202511111731.dist-info/METADATA,sha256=jzJ48WREUXuz0KURtu9rJdiG1pJQDc3eapSN74Su1EI,2112
96
+ kumoai-2.12.0.dev202511111731.dist-info/WHEEL,sha256=8UP9x9puWI0P1V_d7K2oMTBqfeLNm21CTzZ_Ptr0NXU,101
97
+ kumoai-2.12.0.dev202511111731.dist-info/top_level.txt,sha256=YjU6UcmomoDx30vEXLsOU784ED7VztQOsFApk1SFwvs,7
98
+ kumoai-2.12.0.dev202511111731.dist-info/RECORD,,