[docs]classLessThan(TransformPrimitive):"""Determines if values in one list are less than another list. Description: Given a list of values X and a list of values Y, determine whether each value in X is less than each corresponding value in Y. Equal pairs will return `False`. Examples: >>> less_than = LessThan() >>> less_than([2, 1, 2], [1, 2, 2]).tolist() [False, True, False] """name="less_than"input_types=[[ColumnSchema(semantic_tags={"numeric"}),ColumnSchema(semantic_tags={"numeric"}),],[ColumnSchema(logical_type=Datetime),ColumnSchema(logical_type=Datetime)],[ColumnSchema(logical_type=Ordinal),ColumnSchema(logical_type=Ordinal)],]return_type=ColumnSchema(logical_type=BooleanNullable)description_template="whether {} is less than {}"defget_function(self):defless_than(val1,val2):val1_is_categorical=isinstance(val1.dtype,pd.CategoricalDtype)val2_is_categorical=isinstance(val2.dtype,pd.CategoricalDtype)ifval1_is_categoricalandval2_is_categorical:ifnotall(val1.cat.categories==val2.cat.categories):returnval1.where(pd.isnull,np.nan)elifval1_is_categoricalorval2_is_categorical:# This can happen because CFM does not set proper dtypes for intermediate# features, so some agg features that should be Ordinal don't yet have correct type.returnval1.where(pd.isnull,np.nan)returnval1<val2returnless_thandefgenerate_name(self,base_feature_names):return"%s < %s"%(base_feature_names[0],base_feature_names[1])