test_feature_descriptors.py
1 import json 2 from typing import List 3 from typing import Optional 4 5 import pandas as pd 6 7 from evidently._pydantic_compat import parse_obj_as 8 from evidently.core.datasets import Dataset 9 from evidently.core.datasets import Descriptor 10 from evidently.core.datasets import FeatureDescriptor 11 from evidently.legacy.base_metric import ColumnName 12 from evidently.legacy.core import ColumnType 13 from evidently.legacy.features.generated_features import GeneratedFeatures 14 from evidently.legacy.options.base import Options 15 from evidently.legacy.utils.data_preprocessing import DataDefinition 16 17 18 class MockGeneratedFeature(GeneratedFeatures): 19 class Config: 20 type_alias = "mock_generated_feature" 21 22 column: str 23 field: str 24 25 def get_type(self, subcolumn: Optional[str] = None) -> ColumnType: 26 return ColumnType.Text 27 28 def generate_features(self, data: pd.DataFrame, data_definition: DataDefinition, options: Options) -> pd.DataFrame: 29 return pd.DataFrame({self.column: data[self.column].apply(lambda x: x + self.field)}) 30 31 def list_columns(self) -> List["ColumnName"]: 32 return [self._create_column(subcolumn=self.column)] 33 34 35 def test_deserialization(): 36 data = pd.DataFrame({"col": ["a", "b"]}) 37 d = FeatureDescriptor(feature=MockGeneratedFeature(column="col", field="c"), alias="col") 38 39 res = d.generate_data(Dataset.from_pandas(data), Options()) 40 display_name = d.feature.list_columns()[0].display_name 41 pd.testing.assert_series_equal(res[display_name].data, pd.DataFrame({display_name: ["ac", "bc"]})[display_name]) 42 43 payload = json.loads(d.json()) 44 d2 = parse_obj_as(Descriptor, payload) 45 46 res2 = d2.generate_data(Dataset.from_pandas(data), Options()) 47 pd.testing.assert_series_equal(res2[display_name].data, pd.DataFrame({display_name: ["ac", "bc"]})[display_name])