/ tests / future / descriptors / test_feature_descriptors.py
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])