Ваш подход правильный, однако вам не нужно использовать аргумент 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))>
- Для данного работника найдите каждую покупку, связанную сэтого работника.
- Для каждой из этих покупок рассчитайте общее количество покупок, совершенных учетной записью, которая участвовала в этой конкретной покупке.
- Среднее это число по всем покупкам данного работника.
Другими словами, «каково среднее количество покупок, совершенных по счетам, связанным с покупками, совершенными этим работником».