FeatureTools: работа с отношениями многие ко многим - PullRequest
0 голосов
/ 03 октября 2018

У меня есть дата-кадр покупок с несколькими столбцами, в том числе тремя ниже:

 PURCHASE_ID (index of purchase)
 WORKER_ID (index of worker)
 ACCOUNT_ID (index of account)

Работник может иметь несколько связанных учетных записей, а учетная запись может иметь несколько работников.

Если я создаю сущности WORKER и ACCOUNT и добавляю связи, то получаю ошибку:

KeyError: 'Variable: ACCOUNT_ID not found in entity'

Вот мой код:

import pandas as pd
import featuretools as ft
import featuretools.variable_types as vtypes

d = {'PURCHASE_ID': [1, 2], 
     'WORKER_ID': [0, 0], 
     'ACCOUNT_ID': [1, 2], 
     'COST': [5, 10], 
     'PURCHASE_TIME': ['2018-01-01 01:00:00', '2016-01-01 02:00:00']}
df = pd.DataFrame(data=d)

data_variable_types = {'PURCHASE_ID': vtypes.Id,
                       'WORKER_ID': vtypes.Id,
                       'ACCOUNT_ID': vtypes.Id,
                       'COST': vtypes.Numeric,
                       'PURCHASE_TIME': vtypes.Datetime}

es = ft.EntitySet('Purchase')
es = es.entity_from_dataframe(entity_id='purchases',
                               dataframe=df,
                               index='PURCHASE_ID',
                               time_index='PURCHASE_TIME',
                               variable_types=data_variable_types)

es.normalize_entity(base_entity_id='purchases',
                   new_entity_id='workers',
                   index='WORKER_ID',
                   additional_variables=['ACCOUNT_ID'],
                   make_time_index=False)

es.normalize_entity(base_entity_id='purchases',
                   new_entity_id='accounts',
                   index='ACCOUNT_ID',
                   additional_variables=['WORKER_ID'],
                   make_time_index=False)

fm, features = ft.dfs(entityset=es,
                     target_entity='purchases',
                     agg_primitives=['mean'],
                     trans_primitives=[],
                     verbose=True)
features

Как мне отделить сущности отвключать отношения многие ко многим?

1 Ответ

0 голосов
/ 04 октября 2018

Ваш подход правильный, однако вам не нужно использовать аргумент additional_variables variable.Если вы опустите его, ваш код будет работать без проблем.

Цель additional_variables - EntitySet.normalize_entity - включить другие переменные, которые вы хотите, в новую родительскую сущность, которую вы создаете.Например, скажем, у вас были переменные о дате найма, зарплате, месте и т. Д. Вы бы указали их как дополнительные переменные, потому что они статичны по отношению к работнику.В этом случае я не думаю, что у вас есть такие переменные.

Вот код и вывод, который я вижу

import pandas as pd
import featuretools as ft
import featuretools.variable_types as vtypes

d = {'PURCHASE_ID': [1, 2], 
     'WORKER_ID': [0, 0], 
     'ACCOUNT_ID': [1, 2], 
     'COST': [5, 10], 
     'PURCHASE_TIME': ['2018-01-01 01:00:00', '2016-01-01 02:00:00']}
df = pd.DataFrame(data=d)

data_variable_types = {'PURCHASE_ID': vtypes.Id,
                       'WORKER_ID': vtypes.Id,
                       'ACCOUNT_ID': vtypes.Id,
                       'COST': vtypes.Numeric,
                       'PURCHASE_TIME': vtypes.Datetime}

es = ft.EntitySet('Purchase')
es = es.entity_from_dataframe(entity_id='purchases',
                               dataframe=df,
                               index='PURCHASE_ID',
                               time_index='PURCHASE_TIME',
                               variable_types=data_variable_types)

es.normalize_entity(base_entity_id='purchases',
                   new_entity_id='workers',
                   index='WORKER_ID',
                   make_time_index=False)

es.normalize_entity(base_entity_id='purchases',
                   new_entity_id='accounts',
                   index='ACCOUNT_ID',
                   make_time_index=False)

fm, features = ft.dfs(entityset=es,
                     target_entity='purchases',
                     agg_primitives=['mean'],
                     trans_primitives=[],
                     verbose=True)
features

это выводит

[<Feature: WORKER_ID>,
 <Feature: ACCOUNT_ID>,
 <Feature: COST>,
 <Feature: workers.MEAN(purchases.COST)>,
 <Feature: accounts.MEAN(purchases.COST)>]

Если мы изменим целевой объект и увеличим глубину

fm, features = ft.dfs(entityset=es,
                     target_entity='workers',
                     agg_primitives=['mean', 'count'],
                     max_depth=3,
                     trans_primitives=[],
                     verbose=True)
features

вывод теперь функции для рабочего объекта

[<Feature: COUNT(purchases)>,
 <Feature: MEAN(purchases.COST)>,
 <Feature: MEAN(purchases.accounts.MEAN(purchases.COST))>,
 <Feature: MEAN(purchases.accounts.COUNT(purchases))>]

Давайте объясним функцию с именем MEAN(purchases.accounts.COUNT(purchases))>

  1. Для данного работника найдите каждую покупку, связанную сэтого работника.
  2. Для каждой из этих покупок рассчитайте общее количество покупок, совершенных учетной записью, которая участвовала в этой конкретной покупке.
  3. Среднее это число по всем покупкам данного работника.

Другими словами, «каково среднее количество покупок, совершенных по счетам, связанным с покупками, совершенными этим работником».

...