Source code for tempor.models.clairvoyance2.data.feature
# mypy: ignore-errorsimportwarningsfromtypingimportSequencefrom..utils.commonimportNP_EQUIVALENT_TYPES_MAP,python_type_from_np_pd_dtypefrom.constantsimport(T_CategoricalDtype,T_CategoricalDtype_AsTuple,T_ElementsObjectType_AsTuple,T_FeatureContainer,T_NumericDtype_AsTuple,)from.internal_utilsimportall_items_are_of_typesWARN_TOO_MANY_CATEGORIES_THRESHOLD=100PD_SERIES_OBJECT_DTYPE_ALLOWED_TYPES=T_ElementsObjectType_AsTuple# May change.def_infer_dtype(series:T_FeatureContainer)->type:ifseries.dtype!=object:returnpython_type_from_np_pd_dtype(series.dtype)# type: ignoreelse:ifall_items_are_of_types(series,str):returnstrelse:returnobjectdef_infer_categories(data:T_FeatureContainer)->Sequence[T_CategoricalDtype]:unique=data.unique()ifunique.dtypeinNP_EQUIVALENT_TYPES_MAP:result:Sequence[T_CategoricalDtype]=tuple([NP_EQUIVALENT_TYPES_MAP[unique.dtype](x)forxinunique])else:result=tuple(unique)returnresult
[docs]classFeature:def__init__(self,name:str,series:T_FeatureContainer)->None:self.name=nameself.series=series@propertydefinferred_dtype(self)->type:inferred_dtype=_infer_dtype(self.series)ifself.series.dtype==objectandinferred_dtypenotinPD_SERIES_OBJECT_DTYPE_ALLOWED_TYPES:raiseTypeError(f"Series of dtype object must contain homogeneous elements of one of types: "f"{PD_SERIES_OBJECT_DTYPE_ALLOWED_TYPES}")return_infer_dtype(self.series)@propertydefnumeric_compatible(self)->bool:returnself.inferred_dtypeinT_NumericDtype_AsTuple@propertydefcategorical_compatible(self)->bool:_=self._get_categories()# To raise warning.returnself.inferred_dtypeinT_CategoricalDtype_AsTuple@propertydefbinary_compatible(self)->bool:cats=self._get_categories()returnself.categorical_compatibleandlen(cats)<=2def_get_categories(self)->Sequence[T_CategoricalDtype]:categories=_infer_categories(self.series)iflen(categories)>=WARN_TOO_MANY_CATEGORIES_THRESHOLD:warnings.warn(f"The number of categories in feature {self.name} was >={WARN_TOO_MANY_CATEGORIES_THRESHOLD}. ""Check this feature was intended to be used as a categorical feature",category=UserWarning,)returncategories@propertydefcategories(self)->Sequence[T_CategoricalDtype]:ifself.inferred_dtypenotinT_CategoricalDtype_AsTuple:raiseTypeError(f"Feature '{self.name}' is does not have the right inferred dtype ({self.inferred_dtype}) ""to be a categorical feature")categories=self._get_categories()returncategoriesdef_members_repr(self)->str:# pragma: no coverreturnf"name={self.name}, dtype={self.inferred_dtype}"def_build_repr(self,members_repr:str)->str:# pragma: no coverreturnf"{self.__class__.__name__}({members_repr}, series={str(object.__repr__(self.series))})"def__repr__(self)->str:returnself._build_repr(members_repr=self._members_repr())def__eq__(self,__o:object)->bool:ifisinstance(__o,Feature):return(self.name==__o.nameandself.inferred_dtype==__o.inferred_dtypeand(self.series==__o.series).all())else:returnFalse