【问题标题】:How to create new variables by multiple ids in featuretools?如何在功能工具中通过多个 id 创建新变量?
【发布时间】:2020-05-29 15:43:48
【问题描述】:

我有一个数据集,每个成员和每个交易都有一行,并且购买可能来自“brand_id”的不同商店。我想使用功能工具来制作每个成员一行的输出,每个品牌 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]

这是输出的样子:

这是我使用功能工具的尝试,但无论我尝试了什么,我都无法创建由“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']}
                   }
               }
               )

这是我得到的结果,这不是我想要的。

【问题讨论】:

    标签: python pandas group-by feature-engineering featuretools


    【解决方案1】:

    您可以使用interesting_valueswhere_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']
    

    最后,我们使用where_primitives 运行 DFS 来指定哪些聚合原语可以创建以有趣值为条件的特征。

    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
    

    如果这有帮助,请告诉我。

    【讨论】:

    • 这真的很棒,谢谢杰夫。作为一个额外的评论,分类特征在特征工具空间中的作用是什么?我最初的想法是,如果我将特征设为分类,它会自动执行诸如聚合之类的事情。它基本上只允许他们出现在“计数”之类的东西中吗?
    • 有些原语只能应用于分类类型。使特征分类将允许将相应的原语应用于特征。
    猜你喜欢
    • 2022-10-21
    • 2021-10-02
    • 2020-01-27
    • 2021-11-26
    • 2015-08-17
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多