mloda 0.4.3__py3-none-any.whl → 0.4.5__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.
@@ -3,18 +3,31 @@ from typing import Any
3
3
 
4
4
 
5
5
  class Domain:
6
- """
7
- Documentation domain:
8
-
9
- default value is default_domain. The purpose of this is to allow for a default domain to be used if no domain is given.
10
- Usecase: Testing, POCS etc. This is a tool to make life easier for the user.
11
-
12
- can be defined by:
13
- feature.domain: either by options or by domain
14
- feature_group.domain: returns the domain name rule for the feature group
15
-
16
- We validate in IdentifyFeatureGroupClass that there is atleast one feature group with the same domain as the feature.
17
- If the feature does not have a domain, and we have not exactly one matching feature group to the feature, we raise an error.
6
+ """Represents a domain for isolating features across business contexts.
7
+
8
+ Domains enable data isolation between different contexts (Sales, Finance, Test, etc.).
9
+ The framework matches feature domains to feature group domains for resolution.
10
+
11
+ Definition:
12
+ - Feature: via `domain` parameter or `options={"domain": "..."}`
13
+ - FeatureGroup: via `get_domain()` classmethod (default: "default_domain")
14
+
15
+ Propagation:
16
+ When a parent feature has a domain, child features inherit it automatically.
17
+ You can override this by setting an explicit domain on each dependent feature.
18
+
19
+ +------------------------------------------+---------------+------------------+
20
+ | Child Definition | Parent Domain | Result |
21
+ +------------------------------------------+---------------+------------------+
22
+ | "child" (string) | "Sales" | Inherits "Sales" |
23
+ | Feature("child") | "Sales" | Inherits "Sales" |
24
+ | Feature("child", domain="Finance") | "Sales" | Keeps "Finance" |
25
+ | Any | None | No domain |
26
+ +------------------------------------------+---------------+------------------+
27
+
28
+ Validation:
29
+ IdentifyFeatureGroupClass ensures at least one feature group matches the feature's domain.
30
+ If a feature has no domain and multiple groups match, an error is raised.
18
31
  """
19
32
 
20
33
  def __init__(self, name: str):
@@ -92,11 +92,8 @@ class FeatureChainParser:
92
92
  """Internal method for matching pattern-based features - used by match_configuration_feature_chain_parser."""
93
93
  _feature_name: FeatureName = FeatureName(feature_name) if isinstance(feature_name, str) else feature_name
94
94
 
95
- try:
96
- has_prefix_configuration, source_feature = cls.parse_feature_name(_feature_name, prefix_patterns, pattern)
97
- if has_prefix_configuration is None or source_feature is None:
98
- return False
99
- except ValueError:
95
+ has_prefix_configuration, source_feature = cls.parse_feature_name(_feature_name, prefix_patterns, pattern)
96
+ if has_prefix_configuration is None or source_feature is None:
100
97
  return False
101
98
  return True
102
99
 
@@ -304,7 +301,6 @@ class FeatureChainParser:
304
301
  return True
305
302
 
306
303
  # configuration-based
307
-
308
304
  if property_mapping is not None:
309
305
  return cls._validate_options_against_property_mapping(options, property_mapping)
310
306
 
@@ -131,13 +131,16 @@ class FeatureChainParserMixin:
131
131
  prefix_patterns = cls._get_prefix_patterns()
132
132
  property_mapping = cls._get_property_mapping()
133
133
 
134
- # Use the unified parser for basic matching
135
- result = FeatureChainParser.match_configuration_feature_chain_parser(
136
- _feature_name,
137
- options,
138
- property_mapping=property_mapping,
139
- prefix_patterns=prefix_patterns,
140
- )
134
+ try:
135
+ # Use the unified parser for basic matching
136
+ result = FeatureChainParser.match_configuration_feature_chain_parser(
137
+ _feature_name,
138
+ options,
139
+ property_mapping=property_mapping,
140
+ prefix_patterns=prefix_patterns,
141
+ )
142
+ except ValueError:
143
+ return False
141
144
 
142
145
  # If basic match succeeded and it's a string-based feature, call validation hook
143
146
  if result:
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
  from typing import Generator, List, Optional, Set, Union
3
3
  from uuid import UUID
4
+ from mloda.core.abstract_plugins.components.domain import Domain
4
5
  from mloda.core.abstract_plugins.components.feature import Feature
5
6
  from mloda.core.abstract_plugins.components.options import Options
6
7
  from mloda_plugins.feature_group.experimental.default_options_key import DefaultOptionKeys
@@ -17,9 +18,11 @@ class Features:
17
18
  features: List[Union[Feature, str]],
18
19
  child_options: Optional[Options] = None,
19
20
  child_uuid: Optional[UUID] = None,
21
+ parent_domain: Optional[str] = None,
20
22
  ) -> None:
21
23
  self.collection: List[Feature] = []
22
24
  self.child_uuid: Optional[UUID] = child_uuid
25
+ self.parent_domain: Optional[str] = parent_domain
23
26
 
24
27
  self.parent_uuids: set[UUID] = set()
25
28
 
@@ -36,7 +39,11 @@ class Features:
36
39
  if child_options.group == {} and child_options.context == {}:
37
40
  child_options = Options({})
38
41
 
39
- feature = Feature(name=feature, options=child_options) if isinstance(feature, str) else feature
42
+ if isinstance(feature, str):
43
+ feature = Feature(name=feature, options=child_options, domain=self.parent_domain)
44
+ else:
45
+ if feature.domain is None and self.parent_domain is not None:
46
+ feature.domain = Domain(self.parent_domain)
40
47
  if child_uuid:
41
48
  self.parent_uuids.add(feature.uuid)
42
49
  self.child_uuid = child_uuid
mloda/core/core/engine.py CHANGED
@@ -116,7 +116,10 @@ class Engine:
116
116
  added = self.add_feature_to_collection(feature_group_class, feature, features.child_uuid)
117
117
 
118
118
  if added:
119
- self._handle_input_features_recursion(feature_group_class, feature.uuid, feature.options, feature.name)
119
+ parent_domain = feature.domain.name if feature.domain else None
120
+ self._handle_input_features_recursion(
121
+ feature_group_class, feature.uuid, feature.options, feature.name, parent_domain=parent_domain
122
+ )
120
123
 
121
124
  if self.global_filter:
122
125
  self._add_filter_feature(feature_group_class, feature_group, feature, features)
@@ -265,7 +268,12 @@ class Engine:
265
268
  self.feature_link_parents[child_uuid].add(wanted_uuid)
266
269
 
267
270
  def _handle_input_features_recursion(
268
- self, feature_group_class: Type[FeatureGroup], uuid: UUID, options: Options, feature_name: FeatureName
271
+ self,
272
+ feature_group_class: Type[FeatureGroup],
273
+ uuid: UUID,
274
+ options: Options,
275
+ feature_name: FeatureName,
276
+ parent_domain: Optional[str] = None,
269
277
  ) -> None:
270
278
  """Handles recursion for input features of a feature group."""
271
279
  feature_group = feature_group_class()
@@ -278,7 +286,9 @@ class Engine:
278
286
  input_features = None
279
287
 
280
288
  if input_features:
281
- features = Features(list(input_features), child_options=options, child_uuid=uuid)
289
+ features = Features(
290
+ list(input_features), child_options=options, child_uuid=uuid, parent_domain=parent_domain
291
+ )
282
292
  if features.child_uuid is None:
283
293
  raise ValueError(f"Features {features} has no parent uuid although it should have one.")
284
294
  self.feature_link_parents[features.child_uuid] = features.parent_uuids
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mloda
3
- Version: 0.4.3
4
- Summary: mloda: One Data Access for ML and AI
3
+ Version: 0.4.5
4
+ Summary: mloda.ai: Open Data Access for ML and AI
5
5
  Author-email: Tom Kaltofen <info@mloda.ai>
6
6
  License: Apache-2.0
7
7
  Project-URL: Bug Tracker, https://github.com/mloda-ai/mloda/issues
@@ -306,6 +306,17 @@ Built-in and custom extenders give you full lineage - trace any result back to i
306
306
 
307
307
  ---
308
308
 
309
+ ## Ecosystem
310
+
311
+ Most plugins currently live in `mloda_plugins/` within this repository. The goal is to gradually migrate them to standalone packages in the registry.
312
+
313
+ | Repository | Description |
314
+ |------------|-------------|
315
+ | [mloda-registry](https://github.com/mloda-ai/mloda-registry) | Official plugin packages and 40+ development guides |
316
+ | [mloda-plugin-template](https://github.com/mloda-ai/mloda-plugin-template) | Cookiecutter template for creating standalone plugins |
317
+
318
+ ---
319
+
309
320
  ## Contributing
310
321
 
311
322
  We welcome contributions! Build plugins, improve docs, or add features.
@@ -10,9 +10,9 @@ mloda/core/abstract_plugins/components/base_feature_group_version.py,sha256=JNnr
10
10
  mloda/core/abstract_plugins/components/base_validator.py,sha256=-8sING9RE9vl5BuZZHtqaMbhF8w1WTS-fjXK5VwMuYY,2363
11
11
  mloda/core/abstract_plugins/components/data_access_collection.py,sha256=PVO6w8UOV6qyyYtlkzXAs-qM7WXsyrHqQP5CYCYu3G8,1551
12
12
  mloda/core/abstract_plugins/components/data_types.py,sha256=uiq26Z7pikUiZIfdi28VbWoxLQUQ1wCH2rp7uI5XrvA,5033
13
- mloda/core/abstract_plugins/components/domain.py,sha256=AzVvWgG3oeHUCXJDtN2heyiUQ1zRK7u5O6az5kWxj_I,1226
13
+ mloda/core/abstract_plugins/components/domain.py,sha256=Jr1bRpaJP3-tYF0ii0tIYv_bpJUqv8SDAk6LljyAAfo,2099
14
14
  mloda/core/abstract_plugins/components/feature.py,sha256=WHK_FIe5EMq1v4ORod3ae8oaDHt4J1uktb9H-0v5m08,10478
15
- mloda/core/abstract_plugins/components/feature_collection.py,sha256=vT4vlZyCRM3G9PtAJHovLoER4ElY08PlTlFzYPcCVyo,4636
15
+ mloda/core/abstract_plugins/components/feature_collection.py,sha256=OfLCspXxAHBBeLri6zIwXs17KWciv1tvXrPq4n3ixqM,4995
16
16
  mloda/core/abstract_plugins/components/feature_name.py,sha256=AgWceOqyHNYGVM5XE1NrGFeZKf9AKtLRoRRaxL7tHzk,673
17
17
  mloda/core/abstract_plugins/components/feature_set.py,sha256=hVJ_t4p30BNOknkMKiyDkYRWbbEd_GtpGf2lW9n3PdM,4226
18
18
  mloda/core/abstract_plugins/components/hashable_dict.py,sha256=xzUIn2wbujo3jwwGayHnSbrrADSiVYU_xUV1nt5Yk8M,426
@@ -21,8 +21,8 @@ mloda/core/abstract_plugins/components/options.py,sha256=z2hzPSl-B-trh1UELdBekAe
21
21
  mloda/core/abstract_plugins/components/parallelization_modes.py,sha256=QeU83qUlg4smUW9Q_cs0XaaBcKDxI7vh8pILUHZd_YM,143
22
22
  mloda/core/abstract_plugins/components/utils.py,sha256=_ofeiOBQLwYU3_p9JBe61Ihps4dpFUcsrqI6XrA92Yo,530
23
23
  mloda/core/abstract_plugins/components/feature_chainer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- mloda/core/abstract_plugins/components/feature_chainer/feature_chain_parser.py,sha256=aGO10OgAfaVs-y4kgSbAtVL2jI7E3EDsfWOkuWlPgDA,14149
25
- mloda/core/abstract_plugins/components/feature_chainer/feature_chain_parser_mixin.py,sha256=yOyWmVd560pV6hL02PyiShNqi6-hMhkME7U80EHWdC8,7444
24
+ mloda/core/abstract_plugins/components/feature_chainer/feature_chain_parser.py,sha256=kjLO0VSGXh53L8HBXWO5bYmaqLmek917AA_qqPLrZBo,14071
25
+ mloda/core/abstract_plugins/components/feature_chainer/feature_chain_parser_mixin.py,sha256=NQfipxPQ6LPN2zXuJAbMj6JaGa6voTBnvb34vp0Y1og,7537
26
26
  mloda/core/abstract_plugins/components/framework_transformer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  mloda/core/abstract_plugins/components/framework_transformer/base_transformer.py,sha256=3eRSOzYZZ4OHRezvUnw4RLTUjirMGtcZCKQYJ1MuuZU,5793
28
28
  mloda/core/abstract_plugins/components/framework_transformer/cfw_transformer.py,sha256=xuK3DSuSdmos1w639ZRQEO6ZwihjQmBG3RSp5jU1gk4,4298
@@ -63,7 +63,7 @@ mloda/core/api/prepare/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
63
63
  mloda/core/api/prepare/setup_compute_framework.py,sha256=In6o7YuBpJFKa6Brrrtsjf1bxhiv43toJr9NBQCAiH4,2658
64
64
  mloda/core/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
65
  mloda/core/core/cfw_manager.py,sha256=DNmbEOIhjKX_G0lva6XqCL0GJIIKy9PfOTXT4g8N9FM,8769
66
- mloda/core/core/engine.py,sha256=yXNbV4LZZaAro1iSEmeFNOKgt5m8P9IIotTjT8jixg4,13690
66
+ mloda/core/core/engine.py,sha256=jQRDyjmDyhGT-LmWyTX_qS87NBz7-xC0ZK0-Ti6OtEo,13962
67
67
  mloda/core/core/step/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
68
  mloda/core/core/step/abstract_step.py,sha256=hIsvJ21hvDXDH1HJSc76WL22FtEvSEN5g7pVpQBEoEU,1304
69
69
  mloda/core/core/step/feature_group_step.py,sha256=3lGaaF0r4FhsSUhdAN7hh3QiNz_0dpW3cRBoKOtaTus,5293
@@ -106,8 +106,8 @@ mloda/steward/__init__.py,sha256=PPXY3o4OM_daV6wD3DJNuPPCEEQg5NeETlG6cAmkzRE,696
106
106
  mloda/steward/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
107
  mloda/user/__init__.py,sha256=TG00kApwQzj8FCRIsTy-PomisoULbSTh5CgqlUT6Wvc,1879
108
108
  mloda/user/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
- mloda-0.4.3.dist-info/licenses/LICENSE.TXT,sha256=gmhQwSkHxjiShsqQ1FpJ-20YFtaa4vRCE7aCx55-6nk,11366
110
- mloda-0.4.3.dist-info/licenses/NOTICE.md,sha256=Hu10B2sPnGLIHxZ4QhACSLLxukJpeJzjvkzCu48q5fY,520
109
+ mloda-0.4.5.dist-info/licenses/LICENSE.TXT,sha256=gmhQwSkHxjiShsqQ1FpJ-20YFtaa4vRCE7aCx55-6nk,11366
110
+ mloda-0.4.5.dist-info/licenses/NOTICE.md,sha256=Hu10B2sPnGLIHxZ4QhACSLLxukJpeJzjvkzCu48q5fY,520
111
111
  mloda_plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
112
  mloda_plugins/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
113
  mloda_plugins/compute_framework/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -154,7 +154,7 @@ mloda_plugins/feature_group/experimental/aggregated_feature_group/pandas.py,sha2
154
154
  mloda_plugins/feature_group/experimental/aggregated_feature_group/polars_lazy.py,sha256=NM59vF9A1m-i3zSvz8DwaSJ4a284iMGsf17CCIdridY,6224
155
155
  mloda_plugins/feature_group/experimental/aggregated_feature_group/pyarrow.py,sha256=9VcD7wLWt57z9z9uRwwl22qVgwMBYFoeZ3iGsBvBBns,5656
156
156
  mloda_plugins/feature_group/experimental/clustering/__init__.py,sha256=769NSapfi48V7BBh8zoo-ale2We6K4OV6ocNlzAhfEw,59
157
- mloda_plugins/feature_group/experimental/clustering/base.py,sha256=vlxEg_8g6wc-CPC55_SEdy3A6j0anCWOX3nmHvYRnRQ,16391
157
+ mloda_plugins/feature_group/experimental/clustering/base.py,sha256=CCIi5ohOTkY4os3Ah0V09Ht4hPMXZc1NXMiN7ME42wc,16411
158
158
  mloda_plugins/feature_group/experimental/clustering/pandas.py,sha256=qZhlnC5L96wPo4PfkwJJzG0_dZ8CCFEq38eyG5nIYJ0,19239
159
159
  mloda_plugins/feature_group/experimental/data_quality/__init__.py,sha256=ga8jdKaLl4bxkxMqNtRbrkHFnRWZIp8f3bR7DVG5d-I,45
160
160
  mloda_plugins/feature_group/experimental/data_quality/missing_value/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -162,12 +162,12 @@ mloda_plugins/feature_group/experimental/data_quality/missing_value/base.py,sha2
162
162
  mloda_plugins/feature_group/experimental/data_quality/missing_value/pandas.py,sha256=QGdIHohILRmHrjk6WrNobn5jSz7H_aLK83_bxzCN9RE,8510
163
163
  mloda_plugins/feature_group/experimental/data_quality/missing_value/pyarrow.py,sha256=H8yMtnCf3Z4BZde676YwIPSpsjUGfi1pU2HXNoSRArw,14204
164
164
  mloda_plugins/feature_group/experimental/data_quality/missing_value/python_dict.py,sha256=Dnh0WcT1xjNETkDa7Wd5u-zCu_g20-fa_QEuh_-eK-Y,13856
165
- mloda_plugins/feature_group/experimental/dimensionality_reduction/base.py,sha256=x1IfNtebathgYFc4j5NKcXuoH_7HcpKl3o8sWxmd0s0,15859
165
+ mloda_plugins/feature_group/experimental/dimensionality_reduction/base.py,sha256=Dul6GdYLgRe_DAcoMWM6KYrjYE9iwBNCuX90VNFvHhQ,15899
166
166
  mloda_plugins/feature_group/experimental/dimensionality_reduction/pandas.py,sha256=Bl3xVPyQTuDAtxBVuS09tAWE4RVbh5i15z0h3l6UYLI,13690
167
167
  mloda_plugins/feature_group/experimental/dynamic_feature_group_factory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
168
168
  mloda_plugins/feature_group/experimental/dynamic_feature_group_factory/dynamic_feature_group_factory.py,sha256=Gn6dvrWQ2ldNWRMsuEhlT3jp_tqC1FVlr0pGpJnkrVs,12982
169
169
  mloda_plugins/feature_group/experimental/forecasting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
170
- mloda_plugins/feature_group/experimental/forecasting/base.py,sha256=CquLd04XX6wBroTxT0lYIQ3GkYKblbWPG6sXP-sGvFg,23095
170
+ mloda_plugins/feature_group/experimental/forecasting/base.py,sha256=or_y_sryVjN_D2v3W2Fx1EQRi-bQSUBcEye1X7xX2Ws,23085
171
171
  mloda_plugins/feature_group/experimental/forecasting/forecasting_artifact.py,sha256=9i9Eg5PEFEl6Nq12RTPxCeVlZZ9u-Xmju-lJRARqOVI,4215
172
172
  mloda_plugins/feature_group/experimental/forecasting/pandas.py,sha256=sJaZmBCISr68kB5yGuTXzN9gpa60VF4DPQDIkJBgugM,28719
173
173
  mloda_plugins/feature_group/experimental/geo_distance/__init__.py,sha256=wqp7I3j87AmrVBi2rlqcz4Sj-R1QMe3EasmNFb_Zxg4,85
@@ -220,7 +220,7 @@ mloda_plugins/feature_group/experimental/text_cleaning/base.py,sha256=fJyMZfg_qe
220
220
  mloda_plugins/feature_group/experimental/text_cleaning/pandas.py,sha256=VUlFcyeMENBUJu_Mm-dHn5Xwj0SlUhTiyIjhXri4-jE,7307
221
221
  mloda_plugins/feature_group/experimental/text_cleaning/python_dict.py,sha256=doE7juFYH809_YV_p-yKj1ZTqJWFGLu55OXMJ0kk7B4,7797
222
222
  mloda_plugins/feature_group/experimental/time_window/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
223
- mloda_plugins/feature_group/experimental/time_window/base.py,sha256=6MJGJoDP_Vu18rQ6bvVpwgwRuaez--55KhH_LTWq9ro,17699
223
+ mloda_plugins/feature_group/experimental/time_window/base.py,sha256=Y2XaU3mmxmaBFwAAdMB0-KAxfwmvfoAVHQiqCtsIwm8,17719
224
224
  mloda_plugins/feature_group/experimental/time_window/pandas.py,sha256=4Ydj5R-Cb4_W6RmxSUUYkmcPSbu2ePOtCLt53VTd_8g,7801
225
225
  mloda_plugins/feature_group/experimental/time_window/pyarrow.py,sha256=DxryfWGjJl6InR_6Bisr9HAZQxreWL25TgnOmquJhss,10718
226
226
  mloda_plugins/feature_group/input_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -244,8 +244,8 @@ mloda_plugins/function_extender/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
244
244
  mloda_plugins/function_extender/base_implementations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
245
245
  mloda_plugins/function_extender/base_implementations/otel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
246
246
  mloda_plugins/function_extender/base_implementations/otel/otel_extender.py,sha256=cKFWuVHOzk78Jm4zFfHxdTYcNVAzaM-ORSV0QCkScQM,660
247
- mloda-0.4.3.dist-info/METADATA,sha256=tSdRa18yEbeReTT2oa0iRzbnPfVJWtPpO6RpjvggB2E,11712
248
- mloda-0.4.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
249
- mloda-0.4.3.dist-info/entry_points.txt,sha256=f7hp7s4laABj9eN5YwEjQAyInF-fa687MXdz-hKYMIA,80
250
- mloda-0.4.3.dist-info/top_level.txt,sha256=zImHD-7ilfeB7QZ6Bd9Htwwx5O-Z84D0T2pUgKrGDdc,20
251
- mloda-0.4.3.dist-info/RECORD,,
247
+ mloda-0.4.5.dist-info/METADATA,sha256=GLEbX7dVW2UqWlG57Mn-_umPJcXvD0v3mVqJTIWNTtw,12199
248
+ mloda-0.4.5.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
249
+ mloda-0.4.5.dist-info/entry_points.txt,sha256=f7hp7s4laABj9eN5YwEjQAyInF-fa687MXdz-hKYMIA,80
250
+ mloda-0.4.5.dist-info/top_level.txt,sha256=zImHD-7ilfeB7QZ6Bd9Htwwx5O-Z84D0T2pUgKrGDdc,20
251
+ mloda-0.4.5.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -121,8 +121,9 @@ class ClusteringFeatureGroup(FeatureChainParserMixin, FeatureGroup):
121
121
  "explanation": "Number of clusters or 'auto' for automatic determination",
122
122
  DefaultOptionKeys.context: True, # Mark as context parameter
123
123
  DefaultOptionKeys.strict_validation: True, # Enable strict validation
124
- DefaultOptionKeys.validation_function: lambda value: value == "auto"
125
- or (isinstance(value, (int, str)) and str(value).isdigit() and int(value) > 0),
124
+ DefaultOptionKeys.validation_function: lambda value: (
125
+ value == "auto" or (isinstance(value, (int, str)) and str(value).isdigit() and int(value) > 0)
126
+ ),
126
127
  },
127
128
  DefaultOptionKeys.in_features: {
128
129
  "explanation": "Source features to use for clustering",
@@ -130,9 +130,9 @@ class DimensionalityReductionFeatureGroup(FeatureChainParserMixin, FeatureGroup)
130
130
  "explanation": "Target dimension for the reduction (positive integer)",
131
131
  DefaultOptionKeys.context: True,
132
132
  DefaultOptionKeys.strict_validation: True,
133
- DefaultOptionKeys.validation_function: lambda value: isinstance(value, (int, str))
134
- and str(value).isdigit()
135
- and int(value) > 0,
133
+ DefaultOptionKeys.validation_function: lambda value: (
134
+ isinstance(value, (int, str)) and str(value).isdigit() and int(value) > 0
135
+ ),
136
136
  },
137
137
  DefaultOptionKeys.in_features: {
138
138
  "explanation": "Source features to use for dimensionality reduction",
@@ -145,18 +145,18 @@ class DimensionalityReductionFeatureGroup(FeatureChainParserMixin, FeatureGroup)
145
145
  DefaultOptionKeys.context: True,
146
146
  DefaultOptionKeys.strict_validation: False,
147
147
  "default": 250,
148
- DefaultOptionKeys.validation_function: lambda value: isinstance(value, (int, str))
149
- and str(value).isdigit()
150
- and int(value) > 0,
148
+ DefaultOptionKeys.validation_function: lambda value: (
149
+ isinstance(value, (int, str)) and str(value).isdigit() and int(value) > 0
150
+ ),
151
151
  },
152
152
  TSNE_N_ITER_WITHOUT_PROGRESS: {
153
153
  "explanation": "Maximum iterations without progress before early stopping (t-SNE)",
154
154
  DefaultOptionKeys.context: True,
155
155
  DefaultOptionKeys.strict_validation: False,
156
156
  "default": 50,
157
- DefaultOptionKeys.validation_function: lambda value: isinstance(value, (int, str))
158
- and str(value).isdigit()
159
- and int(value) > 0,
157
+ DefaultOptionKeys.validation_function: lambda value: (
158
+ isinstance(value, (int, str)) and str(value).isdigit() and int(value) > 0
159
+ ),
160
160
  },
161
161
  TSNE_METHOD: {
162
162
  "barnes_hut": "Barnes-Hut approximation (faster, O(n log n))",
@@ -183,9 +183,9 @@ class DimensionalityReductionFeatureGroup(FeatureChainParserMixin, FeatureGroup)
183
183
  DefaultOptionKeys.context: True,
184
184
  DefaultOptionKeys.strict_validation: False,
185
185
  "default": 200,
186
- DefaultOptionKeys.validation_function: lambda value: isinstance(value, (int, str))
187
- and str(value).isdigit()
188
- and int(value) > 0,
186
+ DefaultOptionKeys.validation_function: lambda value: (
187
+ isinstance(value, (int, str)) and str(value).isdigit() and int(value) > 0
188
+ ),
189
189
  },
190
190
  # Isomap specific parameters
191
191
  ISOMAP_N_NEIGHBORS: {
@@ -193,9 +193,9 @@ class DimensionalityReductionFeatureGroup(FeatureChainParserMixin, FeatureGroup)
193
193
  DefaultOptionKeys.context: True,
194
194
  DefaultOptionKeys.strict_validation: False,
195
195
  "default": 5,
196
- DefaultOptionKeys.validation_function: lambda value: isinstance(value, (int, str))
197
- and str(value).isdigit()
198
- and int(value) > 0,
196
+ DefaultOptionKeys.validation_function: lambda value: (
197
+ isinstance(value, (int, str)) and str(value).isdigit() and int(value) > 0
198
+ ),
199
199
  },
200
200
  }
201
201
 
@@ -145,9 +145,8 @@ class ForecastingFeatureGroup(FeatureChainParserMixin, FeatureGroup):
145
145
  DefaultOptionKeys.context: True,
146
146
  DefaultOptionKeys.strict_validation: True,
147
147
  DefaultOptionKeys.validation_function: lambda x: (
148
- isinstance(x, int) or (isinstance(x, str) and x.isdigit())
149
- )
150
- and int(x) > 0,
148
+ (isinstance(x, int) or (isinstance(x, str) and x.isdigit())) and int(x) > 0
149
+ ),
151
150
  },
152
151
  TIME_UNIT: {
153
152
  **TIME_UNITS,
@@ -134,8 +134,9 @@ class TimeWindowFeatureGroup(FeatureChainParserMixin, FeatureGroup):
134
134
  "explanation": "Size of the time window (must be positive integer)",
135
135
  DefaultOptionKeys.context: True, # Mark as context parameter
136
136
  DefaultOptionKeys.strict_validation: True, # Enable strict validation
137
- DefaultOptionKeys.validation_function: lambda x: (isinstance(x, int) and x > 0)
138
- or (isinstance(x, str) and x.isdigit() and int(x) > 0),
137
+ DefaultOptionKeys.validation_function: lambda x: (
138
+ (isinstance(x, int) and x > 0) or (isinstance(x, str) and x.isdigit() and int(x) > 0)
139
+ ),
139
140
  },
140
141
  # Time unit parameter (context parameter)
141
142
  TIME_UNIT: {