Пользовательские агрегирующие примитивы с дополнительными аргументами? - PullRequest
0 голосов
/ 01 июня 2018

Примитив преобразования отлично работает с дополнительными аргументами.Вот пример

def string_count(column, string=None):
    '''
    ..note:: this is a naive implementation used for clarity
    '''
    assert string is not None, "string to count needs to be defined"
    counts = [str(element).lower().count(string) for element in column]
    return counts


def string_count_generate_name(self):
    return u"STRING_COUNT(%s, %s)" % (self.base_features[0].get_name(),
                                      '"' + str(self.kwargs['string'] + '"'))


StringCount = make_trans_primitive(
    function=string_count,
    input_types=[Categorical],
    return_type=Numeric,
    cls_attributes={
        "generate_name": string_count_generate_name
    })

es = ft.demo.load_mock_customer(return_entityset=True)
count_the_feat = StringCount(es['transactions']['product_id'], string="5")
fm, fd = ft.dfs(
    entityset=es,
    target_entity='transactions',
    max_depth=1,
    features_only=False,
    seed_features=[count_the_feat])

Вывод:

                product_id  STRING_COUNT(product_id, "5")
transaction_id                                           
1                        5                              1
2                        4                              0
3                        3                              0
4                        3                              0
5                        4                              0

Однако, если я изменю и сделаю в Примитив агрегации примерно так:

def string_count(column, string=None):
    '''
    ..note:: this is a naive implementation used for clarity
    '''
    assert string is not None, "string to count needs to be defined"
    counts = [str(element).lower().count(string) for element in column]
    return sum(counts)


def string_count_generate_name(self):
    return u"STRING_COUNT(%s, %s)" % (self.base_features[0].get_name(),
                                      '"' + str(self.kwargs['string'] + '"'))


StringCount = make_agg_primitive(
    function=string_count,
    input_types=[Categorical],
    return_type=Numeric,
    cls_attributes={
        "generate_name": string_count_generate_name
    })

es = ft.demo.load_mock_customer(return_entityset=True)
count_the_feat = StringCount(es['transactions']['product_id'], string="5")

Я получаю следующую ошибку:

TypeError: new_class_init() missing 1 required positional argument: 'parent_entity'

Поддерживаются ли пользовательские примитивы агрегации с дополнительными аргументами в featuretools?

1 Ответ

0 голосов
/ 04 июня 2018

Проблема здесь в том, что отсутствует аргумент вашей исходной функции.Для примитива агрегации вам нужно указать сущность, на которой нужно агрегировать.В этом случае изменение конструкции вашего начального элемента агрегации на

count_the_feat = StringCount(es['transactions']['product_id'], es['sessions'], string="5")

создаст элемент

sessions.STRING_COUNT(product_id, "5")

, как и ожидалось.Функция покажет, как часто строка «5» отображается для каждого идентификатора сеанса.

...