Ошибка при создании набора объектов в Featuretools Ошибка TypeError: объект 'str' не поддерживает назначение элементов - PullRequest
0 голосов
/ 25 июня 2018

У меня есть 3 кадра данных:

df_train cortado:____________________ 
    SK_ID_CURR  TARGET  NAME_CONTRACT_TYPE_Cash loans  \
0      100002       1                              1   
1      100003       0                              1   
2      100004       0                              0   
3      100006       0                              1   
4      100007       0                              1   

   NAME_CONTRACT_TYPE_Revolving loans  CODE_GENDER_F  CODE_GENDER_M  
0                                   0              0              1  
1                                   0              1              0  
2                                   1              0              1  
3                                   0              1              0  
4                                   0              0              1  

df_bureau cortado:____________________ 
    SK_ID_CURR  SK_ID_BUREAU  CREDIT_ACTIVE_Active
0      100002       5714464                     1
1      100002       5714465                     1
2      215354       5714466                     1
3      215354       5714467                     1
4      215354       5714468                     1

bureau_balance cortado 3:____________________ 
    SK_ID_BUREAU  MONTHS_BALANCE  STATUS_C
0       5715448               0         1
1       5715448              -1         1
2       5715448              -2         1
3       5715448              -3         1
4       5715448              -4         1 

И это сценарий, который я пытаюсь запустить для синтеза функций:

entities = {
    "train"          : (df_train,         "SK_ID_CURR"),
    "bureau"         : (df_bureau,        "SK_ID_BUREAU"),
    "bureau_balance" : (df_bureau_balance,"MONTHS_BALANCE", "STATUS", "SK_ID_BUREAU")                       , 
    }

relationships = [
    ("bureau", "SK_ID_BUREAU", "bureau_balance", "SK_ID_BUREAU"),
    ("train", "SK_ID_CURR", "bureau", "SK_ID_CURR")
             ]

feature_matrix_customers, features_defs = ft.dfs(entities=entities,
                                             relationships=relationships,
                                             target_entity="train"
                                             )

Но, где бы я ни вводил столбец "СОСТОЯНИЕmsgstr "эта ошибка происходит: TypeError: объект 'str' не поддерживает назначение элементов

Если я не поставлю столбец" STATUS ", это нормально с несколькими строками кадра данных.Когда количество строк увеличивается (и только решение STATUS в качестве ключа решит его), возникает другая ошибка: AssertionError: Индекс не уникален для фрейма данных (Entity bureau_balance)

Заранее спасибо !!

Ответы [ 2 ]

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

caseWestern's answer - это рекомендуемый способ создания EntitySet в Featuretools.

Как говорится, ошибка, которую вы видите, заключается в том, что Featuretools ожидает, что 4 значения для сущности будут находиться там, где переменные типов являются словарем dict [str -> Variable]. Прямо сейчас вы передаете только строку для 4-го параметра, поэтому Featuretools завершается неудачно, когда пытается добавить записи, потому что на самом деле это не словарь.

Для получения дополнительной информации см. Документацию для набора сущностей .

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

Вы правы в том, что для создания фреймов данных нужен уникальный индекс.Один простой вариант - добавить уникальный индекс к 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 хороша для ознакомления с основами использования наборов сущностей, и я бы рекомендовал прочитать ее.

...