Skip to content

Commit 089e364

Browse files
Adding feature set operations for list materialization, backfill and get feature (Azure#29270)
* Adding tags for feature, and feature set operations * Adding unit tests for feature set operations * Lint fix * Update feature schema * Updating properties of Metadata schema based on the service properties name * update to_dict to create dictionary based on service properties * Adding deserialize callback for feature set and feature store entity * fix black * update properties name * Updating properties and schema metadata class * update progress * Remove kind property from worksace for release * Remove kind from constructor * Default kind for workspace * Update Default to default * Update get to pop method * update progress * Add _ prefix in load functions for feature store * Adding feature store classes for private preview * Fix Feature transformation code schema * Fix names for feature set operations * Removing feature set operations and load functions * Remove from init files * Removing experimental for feature store operation classes * import operations from nested path in ml client * Remove load functions from init files * Fix tests * fix import in feature set test * Remove properties from feature store entity constructor * update feature_schema
1 parent d82e2b7 commit 089e364

17 files changed

+382
-57
lines changed

sdk/ml/azure-ai-ml/azure/ai/ml/_schema/_feature_set/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from .delay_metadata_schema import DelayMetadataSchema
88
from .feature_schema import FeatureSchema
99
from .feature_set_schema import FeatureSetSchema
10-
from .featureset_spec_schema import FeaturesetSpecSchema
10+
from .featureset_spec_metadata_schema import FeaturesetSpecMetadataSchema
1111
from .feature_set_specification_schema import FeatureSetSpecificationSchema
1212
from .materialization_settings_schema import MaterializationSettingsSchema
1313
from .source_metadata_schema import SourceMetadataSchema
@@ -17,7 +17,7 @@
1717
"DelayMetadataSchema",
1818
"FeatureSchema",
1919
"FeatureSetSchema",
20-
"FeaturesetSpecSchema",
20+
"FeaturesetSpecMetadataSchema",
2121
"FeatureSetSpecificationSchema",
2222
"MaterializationSettingsSchema",
2323
"SourceMetadataSchema",

sdk/ml/azure-ai-ml/azure/ai/ml/_schema/_feature_set/feature_schema.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,17 @@ class FeatureSchema(metaclass=PatchedSchemaMeta):
1414
required=True,
1515
allow_none=False,
1616
)
17-
type = fields.Str(
17+
data_type = fields.Str(
1818
validate=validate.OneOf(["string", "integer", "long", "float", "double", "binary", "datetime", "boolean"]),
1919
required=True,
2020
allow_none=False,
21+
data_key="type",
2122
)
2223
description = fields.Str(required=False)
24+
tags = fields.Dict(keys=fields.Str(), values=fields.Str(), required=False)
2325

2426
@post_load
2527
def make(self, data, **kwargs):
2628
from azure.ai.ml.entities._feature_set.feature import _Feature
2729

28-
return _Feature(data_type=type, description=data.pop("description", None), **data)
30+
return _Feature(description=data.pop("description", None), **data)

sdk/ml/azure-ai-ml/azure/ai/ml/_schema/_feature_set/feature_set_schema.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,4 @@ class FeatureSetSchema(YamlFileSchema):
2121
stage = fields.Str()
2222
description = fields.Str()
2323
tags = fields.Dict(keys=fields.Str(), values=fields.Str())
24-
properties = fields.Dict(keys=fields.Str(), values=fields.Str())
2524
materialization_settings = NestedField(MaterializationSettingsSchema)

sdk/ml/azure-ai-ml/azure/ai/ml/_schema/_feature_set/feature_transformation_code_schema.py renamed to sdk/ml/azure-ai-ml/azure/ai/ml/_schema/_feature_set/feature_transformation_code_metadata_schema.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@
99
from azure.ai.ml._schema.core.schema import PatchedSchemaMeta
1010

1111

12-
class FeatureTransformationCodeSchema(metaclass=PatchedSchemaMeta):
12+
class FeatureTransformationCodeMetadataSchema(metaclass=PatchedSchemaMeta):
1313
path = fields.Str(required=False)
1414
transformer_class = fields.Str(required=False)
1515

1616
@post_load
1717
def make(self, data, **kwargs):
18-
from azure.ai.ml.entities._feature_set.feature_transformation_code import FeatureTransformationCode
18+
from azure.ai.ml.entities._feature_set.feature_transformation_code_metadata import (
19+
FeatureTransformationCodeMetadata,
20+
)
1921

20-
return FeatureTransformationCode(**data)
22+
return FeatureTransformationCodeMetadata(**data)

sdk/ml/azure-ai-ml/azure/ai/ml/_schema/_feature_set/featureset_spec_schema.py renamed to sdk/ml/azure-ai-ml/azure/ai/ml/_schema/_feature_set/featureset_spec_metadata_schema.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,19 @@
1515
from .source_metadata_schema import SourceMetadataSchema
1616
from .delay_metadata_schema import DelayMetadataSchema
1717
from .feature_schema import FeatureSchema
18-
from .feature_transformation_code_schema import FeatureTransformationCodeSchema
18+
from .feature_transformation_code_metadata_schema import FeatureTransformationCodeMetadataSchema
1919

2020

21-
class FeaturesetSpecSchema(YamlFileSchema):
21+
class FeaturesetSpecMetadataSchema(YamlFileSchema):
2222
source = fields.Nested(SourceMetadataSchema, required=True)
23-
feature_transformation_code = fields.Nested(FeatureTransformationCodeSchema, required=False)
23+
feature_transformation_code = fields.Nested(FeatureTransformationCodeMetadataSchema, required=False)
2424
features = fields.List(NestedField(FeatureSchema), required=True, allow_none=False)
2525
index_columns = fields.List(NestedField(DataColumnSchema), required=True, allow_none=False)
2626
source_lookback = fields.Nested(DelayMetadataSchema, required=False)
2727
temporal_join_lookback = fields.Nested(DelayMetadataSchema, required=False)
2828

2929
@post_load
3030
def make(self, data: Dict, **kwargs):
31-
from azure.ai.ml.entities._feature_set.featureset_spec import FeaturesetSpec
31+
from azure.ai.ml.entities._feature_set.featureset_spec_metadata import FeaturesetSpecMetadata
3232

33-
return FeaturesetSpec(**data)
33+
return FeaturesetSpecMetadata(**data)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# ---------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# ---------------------------------------------------------
4+
5+
# pylint: disable=unused-argument,no-self-use
6+
7+
8+
from marshmallow import fields
9+
10+
from azure.ai.ml._schema.core.fields import NestedField
11+
from azure.ai.ml._schema.core.schema import YamlFileSchema, PatchedSchemaMeta
12+
from azure.ai.ml._schema._feature_store_entity.data_column_schema import DataColumnSchema
13+
14+
from .source_metadata_schema import SourceMetadataSchema
15+
16+
17+
class FeatureTransformationCodePropertiesSchema(metaclass=PatchedSchemaMeta):
18+
path = fields.Str(data_key="Path")
19+
transformer_class = fields.Str(data_key="TransformerClass")
20+
21+
22+
class DelayMetadataPropertiesSchema(metaclass=PatchedSchemaMeta):
23+
days = fields.Int(data_key="Days")
24+
hours = fields.Int(data_key="Hours")
25+
minutes = fields.Int(data_key="Minutes")
26+
27+
28+
class FeaturePropertiesSchema(metaclass=PatchedSchemaMeta):
29+
name = fields.Str(data_key="FeatureName")
30+
data_type = fields.Str(data_key="DataType")
31+
description = fields.Str(data_key="Description")
32+
tags = fields.Dict(keys=fields.Str(), values=fields.Str(), data_key="Tags")
33+
34+
35+
class FeaturesetSpecPropertiesSchema(YamlFileSchema):
36+
source = fields.Nested(SourceMetadataSchema, data_key="source")
37+
feature_transformation_code = fields.Nested(
38+
FeatureTransformationCodePropertiesSchema, data_key="featureTransformationCode"
39+
)
40+
features = fields.List(NestedField(FeaturePropertiesSchema), data_key="features")
41+
index_columns = fields.List(NestedField(DataColumnSchema), data_key="indexColumns")
42+
source_lookback = fields.Nested(DelayMetadataPropertiesSchema, data_key="sourceLookback")
43+
temporal_join_lookback = fields.Nested(DelayMetadataPropertiesSchema, data_key="temporalJoinLookback")

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_assets/_artifacts/feature_set.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ def __init__(
4444
description: Optional[str] = None,
4545
materialization_settings: Optional[_MaterializationSettings] = None,
4646
tags: Optional[Dict] = None,
47-
properties: Optional[Dict[str, str]] = None,
4847
**kwargs,
4948
):
5049
"""FeatureSet
@@ -61,8 +60,6 @@ def __init__(
6160
:type description: str
6261
:param tags: Tag dictionary. Tags can be added, removed, and updated.
6362
:type tags: dict[str, str]
64-
:param properties: The asset property dictionary.
65-
:type properties: dict[str, str]
6663
:param materialization_settings: Specifies the materialization settings.
6764
:type materialization_settings: ~azure.ai.ml.entities._MaterializationSettings
6865
:param kwargs: A dictionary of additional configuration parameters.
@@ -73,7 +70,6 @@ def __init__(
7370
version=version,
7471
description=description,
7572
tags=tags,
76-
properties=properties,
7773
path=specification.path,
7874
**kwargs,
7975
)
@@ -109,7 +105,6 @@ def _from_rest_object(cls, featureset_rest_object: FeaturesetVersion) -> "_Featu
109105
version=arm_id_object.asset_version,
110106
description=featureset_rest_object_details.description,
111107
tags=featureset_rest_object_details.tags,
112-
properties=featureset_rest_object_details.properties,
113108
entities=featureset_rest_object_details.entities,
114109
materialization_settings=_MaterializationSettings._from_rest_object(
115110
featureset_rest_object_details.materialization_settings
@@ -127,7 +122,6 @@ def _from_container_rest_object(cls, rest_obj: FeaturesetContainer) -> "_Feature
127122
name=arm_id_object.asset_name,
128123
description=rest_object_details.description,
129124
tags=rest_object_details.tags,
130-
properties=rest_object_details.properties,
131125
entities=[],
132126
specification=_FeatureSetSpecification(),
133127
version="",

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_feature_set/feature.py

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,40 @@
22
# Copyright (c) Microsoft Corporation. All rights reserved.
33
# ---------------------------------------------------------
44

5-
# pylint: disable=unused-argument
5+
# pylint: disable=redefined-builtin,disable=unused-argument
66

7-
from typing import Optional
7+
from typing import Dict, Optional
8+
9+
from azure.ai.ml._restclient.v2023_02_01_preview.models import (
10+
Feature as RestFeature,
11+
)
12+
13+
from azure.ai.ml.entities._mixins import RestTranslatableMixin
814
from azure.ai.ml.entities._feature_store_entity.data_column_type import _DataColumnType
15+
from azure.ai.ml._utils._experimental import experimental
916

1017

11-
class _Feature(object):
12-
def __init__(self, *, name: str, data_type: _DataColumnType, description: Optional[str], **kwargs):
18+
@experimental
19+
class _Feature(RestTranslatableMixin):
20+
def __init__(
21+
self,
22+
*,
23+
name: str,
24+
data_type: _DataColumnType,
25+
description: Optional[str] = None,
26+
tags: Optional[Dict[str, str]] = None,
27+
**kwargs
28+
):
1329
self.name = name
14-
self.type = data_type
30+
self.data_type = data_type
1531
self.description = description
32+
self.tags = tags
33+
34+
@classmethod
35+
def _from_rest_object(cls, obj: RestFeature) -> "_Feature":
36+
return _Feature(
37+
name=obj.feature_name,
38+
data_type=obj.data_type,
39+
description=obj.description,
40+
tags=obj.tags,
41+
)
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# ---------------------------------------------------------
2+
# Copyright (c) Microsoft Corporation. All rights reserved.
3+
# ---------------------------------------------------------
4+
5+
from datetime import datetime, timedelta
6+
from typing import Dict, Optional, Union
7+
8+
from azure.ai.ml._restclient.v2023_02_01_preview.models import (
9+
FeaturesetJob as RestFeaturesetJob,
10+
)
11+
from azure.ai.ml.entities._mixins import RestTranslatableMixin
12+
from azure.ai.ml.entities._system_data import SystemData
13+
from azure.ai.ml._utils._experimental import experimental
14+
15+
from .materialization_type import _MaterializationType
16+
17+
FeaturestoreJobTypeMap: Dict[str, _MaterializationType] = {
18+
"BackfillMaterialization": _MaterializationType.BackfillMaterialization,
19+
"RecurrentMaterialization": _MaterializationType.RecurrentMaterialization,
20+
}
21+
22+
23+
@experimental
24+
class _FeatureSetMaterializationResponse(RestTranslatableMixin):
25+
def __init__(
26+
self,
27+
*,
28+
type: Union[_MaterializationType, str], # pylint: disable=redefined-builtin
29+
feature_window_start_time: Optional[Union[str, datetime]],
30+
feature_window_end_time: Optional[Union[str, datetime]],
31+
name: Optional[str],
32+
display_name: Optional[str],
33+
creation_context: Optional[SystemData],
34+
duration: Optional[Union[str, timedelta]],
35+
status: Optional[str],
36+
tags: Optional[Dict[str, str]],
37+
**kwargs # pylint: disable=unused-argument
38+
):
39+
self.type = type
40+
self.feature_window_start_time = feature_window_start_time
41+
self.feature_window_end_time = feature_window_end_time
42+
self.name = name
43+
self.display_name = display_name
44+
self.creation_context = creation_context
45+
self.duration = duration
46+
self.status = status
47+
self.tags = tags
48+
49+
@classmethod
50+
def _from_rest_object(cls, obj: RestFeaturesetJob) -> "_FeatureSetMaterializationResponse":
51+
if not obj:
52+
return None
53+
return _FeatureSetMaterializationResponse(
54+
type=FeaturestoreJobTypeMap.get(obj.type, obj.type),
55+
feature_window_start_time=obj.feature_window.feature_window_start,
56+
feature_window_end_time=obj.feature_window.feature_window_end,
57+
name=obj.job_id,
58+
display_name=obj.display_name,
59+
creation_context=SystemData(created_at=obj.created_date),
60+
duration=obj.duration,
61+
status=obj.status,
62+
tags=obj.tags,
63+
)

sdk/ml/azure-ai-ml/azure/ai/ml/entities/_feature_set/feature_transformation_code.py renamed to sdk/ml/azure-ai-ml/azure/ai/ml/entities/_feature_set/feature_transformation_code_metadata.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from typing import Optional
88

99

10-
class FeatureTransformationCode(object):
10+
class FeatureTransformationCodeMetadata(object):
1111
def __init__(self, *, path: str, transformer_class: Optional[str] = None, **kwargs):
1212
self.path = path
1313
self.transformer_class = transformer_class

0 commit comments

Comments
 (0)