Вы правы в том, что для создания фреймов данных нужен уникальный индекс.Один простой вариант - добавить уникальный индекс к df_bureau_balance
, используя
df_bureau_balance.reset_index(inplace = True)
, а затем сделать сущности:
entities = {
"train" : (df_train, "SK_ID_CURR"),
"bureau" : (df_bureau, "SK_ID_BUREAU"),
"bureau_balance" : (df_bureau_balance, "index")
}
Гораздо лучший вариант - использовать наборы сущностей для представления ваших данных .Когда мы создаем сущность из df_bureau_balance
, поскольку у нее нет уникального индекса, мы передаем make_index = True
и имя для индекса (это может быть любое имя, если оно еще не является столбцом в данных.)отдых очень похож на вашу работу только с немного другим синтаксисом!Вот полный рабочий пример:
# Create the entityset
es = ft.EntitySet('customers')
# Add the entities to the entityset
es = es.entity_from_dataframe('train', df_train, index = 'SK_ID_CURR')
es = es.entity_from_dataframe('bureau', df_bureau, index = 'SK_ID_BUREAU')
es = es.entity_from_dataframe('bureau_balance', df_bureau_balance,
make_index = True, index = 'bureau_balance_index')
# Define the relationships
r_train_bureau = ft.Relationship(es['train']['SK_ID_CURR'], es['bureau']['SK_ID_CURR'])
r_bureau_balance = ft.Relationship(es['bureau']['SK_ID_BUREAU'],
es['bureau_balance']['SK_ID_BUREAU'])
# Add the relationships
es = es.add_relationships([r_train_bureau, r_bureau_balance])
# Deep feature synthesis
feature_matrix_customers, feature_defs = ft.dfs(entityset=es, target_entity = 'train')
Наборы сущностей помогут вам отслеживать все ваши данные в единой структуре!Документация Featuretools хороша для ознакомления с основами использования наборов сущностей, и я бы рекомендовал прочитать ее.