2

以下の 3 つを含む複数の列を持つ購入のデータフレームがあります。

 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

エンティティを分離して多対多の関係を含めるにはどうすればよいですか?

4

1 に答える 1

3

additional_variablesあなたのアプローチは正しいですが、変数引数を使用する必要はありません。省略した場合、コードは問題なく実行されます。

additional_variablestoの目的は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

出力は、workers エンティティの 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. 指定されたワーカーのすべての購入でこの数を平均します。

つまり、「このワーカーが行った購入に関連するアカウントで行われた平均購入数は?」ということです。

于 2018-10-04T13:52:28.240 に答える