如何在 featuretools 中通过多个 id 创建新变量?
How to create new variables by multiple ids in featuretools?
我有一个数据集,每个成员和每个交易都有一行,并且购买可能来自不同的商店 'brand_id'。我想使用 featuretools 生成每个成员一行的输出,每个品牌 ID 的总和为 'revenue'。
我想要的:
import featuretools as ft
import pandas as pd
df = pd.DataFrame({'member_id': [1,1,1,1,2,2,3,4,4,4,4,5,5,5],
'transaction_id': [1,2,3,4,5,6,7,8,9,10,11,12,13,14],
'brand_id': ['A','A','B','B','B','B','A','B','A','B','B','A','B','A'],
'revenue': [32,124,54,12,512,51,12,4,12,412,512,14,89,12]
})
df2 = df.groupby(
['member_id',
'brand_id']
).agg({
'transaction_id': 'count',
'revenue' :['sum', 'mean']}
).reset_index()
df2.columns = ['member_id', 'brand_id', 'transactions', 'revenue_sum', 'revenue_mean']
df2 = df2.pivot(index='member_id',
columns='brand_id',
values=['transactions',
'revenue_sum',
'revenue_mean']
).fillna(0
).reset_index()
groups = ['A', 'B']
df2.columns = ['memberid'] + \
[x + '_transactions_count' for x in groups] + \
[x + '_revenue_sum' for x in groups] + \
[x + '_revenue_mean' for x in groups]
输出结果如下:
这是我使用特征工具的尝试,但无论我尝试过什么,我都无法让它创建由 'brand_id' 的每个唯一值分解的新变量。
es = ft.EntitySet(id = 'my_set')
es.entity_from_dataframe(entity_id='members',
index='member_id',
dataframe = pd.DataFrame({'member_id':[1,2,3,4,5]})
)
es.entity_from_dataframe(entity_id='trans',
index='transaction_id',
variable_types = {'brand_id': ft.variable_types.Id},
dataframe=df.copy()
)
# create the relationship
r_member_accrual = ft.Relationship(es['members']['member_id'],
es['trans']['member_id'])
# add the relationship to the entity set
es = es.add_relationship(r_member_accrual)
fm, fl = ft.dfs(target_entity='members',
entityset=es,
agg_primitives=['sum','mean','count'],
groupby_trans_primitives=["cum_sum"],
primitive_options={
'cum_sum': {
'ignore_groupby_variables': {'trans':['member_id']}
}
}
)
这是我得到的结果,这不是我想要的。
您可以使用 interesting_values
和 where_primitives
来汇总每个会员和品牌的收入。我将介绍这个例子。首先,我们使用交易作为基础实体来创建实体集。
es = ft.EntitySet()
es.entity_from_dataframe(
entity_id='transactions',
index='transaction_id',
dataframe=df,
)
然后,我们规范化会员和品牌的实体。这将自动创建关系。
es.normalize_entity(
base_entity_id='transactions',
new_entity_id='brands',
index='brand_id',
)
es.normalize_entity(
base_entity_id='transactions',
new_entity_id='members',
index='member_id',
)
现在,我们将有趣的值添加到交易中的 brand_id
。这使我们能够创建以品牌价值为条件的功能。
es['transactions']['brand_id'].interesting_values = ['A', 'B']
最后,我们 运行 DFS 使用 where_primitives
指定哪些聚合基元可以创建以有趣值为条件的特征。
fm, fl = ft.dfs(
target_entity='members',
entityset=es,
agg_primitives=['sum', 'mean', 'count'],
where_primitives=['sum', 'mean', 'count'],
)
fm.filter(regex='WHERE').round(1).T
member_id 1 2 3 4 5
COUNT(transactions WHERE brand_id = A) 2.0 0.0 1.0 1.0 2.0
COUNT(transactions WHERE brand_id = B) 2.0 2.0 0.0 3.0 1.0
SUM(transactions.revenue WHERE brand_id = A) 156.0 0.0 12.0 12.0 26.0
SUM(transactions.revenue WHERE brand_id = B) 66.0 563.0 0.0 928.0 89.0
MEAN(transactions.revenue WHERE brand_id = A) 78.0 NaN 12.0 12.0 13.0
MEAN(transactions.revenue WHERE brand_id = B) 33.0 281.5 NaN 309.3 89.0
如果有帮助请告诉我。
我有一个数据集,每个成员和每个交易都有一行,并且购买可能来自不同的商店 'brand_id'。我想使用 featuretools 生成每个成员一行的输出,每个品牌 ID 的总和为 'revenue'。
我想要的:
import featuretools as ft
import pandas as pd
df = pd.DataFrame({'member_id': [1,1,1,1,2,2,3,4,4,4,4,5,5,5],
'transaction_id': [1,2,3,4,5,6,7,8,9,10,11,12,13,14],
'brand_id': ['A','A','B','B','B','B','A','B','A','B','B','A','B','A'],
'revenue': [32,124,54,12,512,51,12,4,12,412,512,14,89,12]
})
df2 = df.groupby(
['member_id',
'brand_id']
).agg({
'transaction_id': 'count',
'revenue' :['sum', 'mean']}
).reset_index()
df2.columns = ['member_id', 'brand_id', 'transactions', 'revenue_sum', 'revenue_mean']
df2 = df2.pivot(index='member_id',
columns='brand_id',
values=['transactions',
'revenue_sum',
'revenue_mean']
).fillna(0
).reset_index()
groups = ['A', 'B']
df2.columns = ['memberid'] + \
[x + '_transactions_count' for x in groups] + \
[x + '_revenue_sum' for x in groups] + \
[x + '_revenue_mean' for x in groups]
输出结果如下:
这是我使用特征工具的尝试,但无论我尝试过什么,我都无法让它创建由 'brand_id' 的每个唯一值分解的新变量。
es = ft.EntitySet(id = 'my_set')
es.entity_from_dataframe(entity_id='members',
index='member_id',
dataframe = pd.DataFrame({'member_id':[1,2,3,4,5]})
)
es.entity_from_dataframe(entity_id='trans',
index='transaction_id',
variable_types = {'brand_id': ft.variable_types.Id},
dataframe=df.copy()
)
# create the relationship
r_member_accrual = ft.Relationship(es['members']['member_id'],
es['trans']['member_id'])
# add the relationship to the entity set
es = es.add_relationship(r_member_accrual)
fm, fl = ft.dfs(target_entity='members',
entityset=es,
agg_primitives=['sum','mean','count'],
groupby_trans_primitives=["cum_sum"],
primitive_options={
'cum_sum': {
'ignore_groupby_variables': {'trans':['member_id']}
}
}
)
这是我得到的结果,这不是我想要的。
您可以使用 interesting_values
和 where_primitives
来汇总每个会员和品牌的收入。我将介绍这个例子。首先,我们使用交易作为基础实体来创建实体集。
es = ft.EntitySet()
es.entity_from_dataframe(
entity_id='transactions',
index='transaction_id',
dataframe=df,
)
然后,我们规范化会员和品牌的实体。这将自动创建关系。
es.normalize_entity(
base_entity_id='transactions',
new_entity_id='brands',
index='brand_id',
)
es.normalize_entity(
base_entity_id='transactions',
new_entity_id='members',
index='member_id',
)
现在,我们将有趣的值添加到交易中的 brand_id
。这使我们能够创建以品牌价值为条件的功能。
es['transactions']['brand_id'].interesting_values = ['A', 'B']
最后,我们 运行 DFS 使用 where_primitives
指定哪些聚合基元可以创建以有趣值为条件的特征。
fm, fl = ft.dfs(
target_entity='members',
entityset=es,
agg_primitives=['sum', 'mean', 'count'],
where_primitives=['sum', 'mean', 'count'],
)
fm.filter(regex='WHERE').round(1).T
member_id 1 2 3 4 5
COUNT(transactions WHERE brand_id = A) 2.0 0.0 1.0 1.0 2.0
COUNT(transactions WHERE brand_id = B) 2.0 2.0 0.0 3.0 1.0
SUM(transactions.revenue WHERE brand_id = A) 156.0 0.0 12.0 12.0 26.0
SUM(transactions.revenue WHERE brand_id = B) 66.0 563.0 0.0 928.0 89.0
MEAN(transactions.revenue WHERE brand_id = A) 78.0 NaN 12.0 12.0 13.0
MEAN(transactions.revenue WHERE brand_id = B) 33.0 281.5 NaN 309.3 89.0
如果有帮助请告诉我。