python - FeatureTools:处理多对多关系
问题描述
我有一个包含多列的购买数据框,包括以下三列:
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
如何分离实体以包含多对多关系?
解决方案
您的方法是正确的,但是您不需要使用additional_variables
variables 参数。如果您省略它,您的代码将毫无问题地运行。
additional_variables
to的目的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))>
- 对于给定的工人,找到与该工人相关的每个购买。
- 对于这些购买中的每一个,计算参与该特定购买的帐户的购买总数。
- 在所有给定工人的购买中平均该计数。
换句话说,“与该工人进行的购买相关的帐户的平均购买次数是多少”。
推荐阅读
- javascript - 这个数组索引被错误地更改是否有原因?
- timezone - 如何在 Windows 10 上为 Mariadb 10.3 设置 system_time_zone
- flutter - 为什么元素使用旧索引而不是更新后的索引调用函数?
- ios - Swift 5,具有多个主体参数的 multipart/form-data
- c# - 堆叠尝试使用 C# 反序列化来自 API 的 JSON 响应
- r - 我们如何对数据集进行线性回归并将其逐列回归到一个向量?
- r - R创建新列,其中值取决于其他两列的匹配
- javascript - 使用模板文字在没有 eval() 的 React 中动态添加值到 setState
- asn.1 - CRLDistributionPoints.ReasonFlags 的 ASN.1 位串编码
- sql - 无法获取具有不同年份 SQLite 的两个日期之间的数据