Python 如何在featuretools中通过多个ID创建新变量?

Python 如何在featuretools中通过多个ID创建新变量?,python,pandas,group-by,feature-engineering,featuretools,Python,Pandas,Group By,Feature Engineering,Featuretools,我有一个数据集,每个会员和每笔交易都有一行,并且有不同的商店可以从“品牌id”购买。我想使用featuretools生成每个成员一行的输出,每个品牌id的“收入”合计 我想要的是: 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

我有一个数据集,每个会员和每笔交易都有一行,并且有不同的商店可以从“品牌id”购买。我想使用featuretools生成每个成员一行的输出,每个品牌id的“收入”合计

我想要的是:

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]
以下是输出结果:

这是我使用功能工具的尝试,但无论我尝试了什么,我都无法通过“品牌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']}
                   }
               }
               )
这是我得到的结果,这不是我想要的。

您可以使用
有趣的\u值
元素
来聚合每个会员和品牌的收入。我将介绍这个例子。首先,我们使用事务作为基本实体来创建实体集

es=ft.EntitySet()
es.entity_from_数据帧(
实体_id='transactions',
index='transaction\u id',
数据帧=df,
)
然后,我们为会员和品牌规范实体。这将自动创建关系

es.normalize\u实体(
基本实体id='transactions',
新实体id='brands',
索引='brand_id',
)
规范化实体(
基本实体id='transactions',
新实体id='members',
index='member\u id',
)
现在,我们将有趣的值添加到事务中的
brand\u id
。这使我们能够创建以品牌价值为条件的功能

es['transactions']['brand\u id'].有趣的\u值=['A','B']
最后,我们使用
where_primitives
运行DFS,以指定哪些聚合原语可以根据感兴趣的值创建特征

fm,fl=ft.dfs(
目标实体='成员',
entityset=es,
agg_原语=['sum','mean','count'],
其中_原语=['sum','mean','count'],
)
fm.filter(regex='WHERE').round(1.T)

如果有帮助,请告诉我。

这真是太好了,谢谢杰夫。作为一个额外的评论,分类特性在featuretools空间中的作用是什么?我最初的想法是,如果我将特性分类,它将自动执行聚合之类的操作。它基本上只允许它们出现在“count”之类的东西中吗?有一些原语只能应用于分类类型。将特征分类将允许将相应的原语应用于特征。
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