020优惠券数据工程--简单特征提取--新增用户领券数量特征

新增用户领券数量特征代码

def get_simple_feature(cff):
    
    #预处理
    #原数据'Coupon_id'中含有空值,所以在python读入的过程中会将'Coupon_id'变成float,
    #因此要对'Coupon_id'进行处理变成int型['Date_received']同理
    cff['Coupon_id']=cff['Coupon_id'].map(int)
    cff['Date_received']=cff['Date_received'].map(int)
    
    #新增一列'count'--方便特征提取,如果要计数,可以直接计算cnt出现了多少次
    cff['count']=1
    
    #特征一:用户领券数'simple_User_id_receive'
    #定义一个包含主键 'User_id' 的列表 keys,表示要按照 'User_id' 分组计算每个用户领取的优惠券数。
    keys = ['User_id'] 
    #特征名的前缀,表示新特征的名字以 'simple_User_id_' 开头,后面会加上 'received'
    prefixs='simple_'+'_'.join(keys)+'_'
    
    #使用 pd.pivot_table() 方法对数据集 cff 进行透视,将其按照 'User_id' 列分组,并计算每个用户领取的优惠券数量
    #aggfunc=len 表示计算出每组的记录数,即优惠券的数量。
    pivot = pd.pivot_table(cff,index=keys,values='count',aggfunc=len)
    
    #将透视结果转换为 DataFrame,并将计算出的特征列名由 'count' 改为前缀加上 'received',然后将透视结果中的 'User_id' 列也重命名为 'User_id'
    pivot = pd.DataFrame(pivot).rename(columns={'count':prefixs + 'received'}).reset_index()
    
    #使用 pd.merge() 方法将 cff 数据集与透视结果合并,使用主键 'User_id' 进行合并,合并方式为左连接(how='left'),
    #表示以 cff 为基础,保留 cff 数据集中所有的记录。这样,新的特征列 'simple_User_id_receive' 就添加到了 cff 数据集中。
    cff = pd.merge(cff,pivot,on=keys,how='left')
    print(" pivot :\n", pivot )
        
    return cff

举例说明上述代码的具体作用:

假设有一个数据集 cff,记录了每个用户在某个时间段内领取的优惠券情况。数据集中的每条记录都包含三个字段:User_id(用户ID)、Coupon_id(优惠券ID)和Date_received(领券日期)。数据集如下:
在这里插入图片描述
现在我们想要计算每个用户领取的优惠券数量,并添加一个名为 ‘simple_User_id_receive’ 的特征列。代码实现:

# 特征一:用户领券数'simple_User_id_receive'
# 主键
keys = ['User_id'] 
# 特征名的前缀
prefixs='simple_'+'_'.join(keys)+'_'
# 透视表,按 User_id 分组,计算每个用户领取的优惠券数量
pivot = pd.pivot_table(cff,index=keys,values='Coupon_id',aggfunc=len)
# 重命名特征列和主键列,并添加前缀
pivot = pd.DataFrame(pivot).rename(columns={'Coupon_id':prefixs + 'received'}).reset_index()
# 合并数据集和透视结果
cff = pd.merge(cff,pivot,on=keys,how='left')

经过上面的代码处理之后,数据集 cff 变成了下面这样:
在这里插入图片描述

为什么要keys = [‘User_id’]?

设置keys的作用是为了按照 User_id 这个主键进行分组聚合,计算每个用户领取的优惠券数量。如果不设置keys,那么就会将整个数据集视为一个分组进行聚合,得到的结果就不是我们想要的了。

keys = ['User_id']
//透视表,按 User_id 分组,计算每个用户领取的优惠券数量
pivot = pd.pivot_table(cff,index=keys,values='Coupon_id',aggfunc=len)

特征名前缀

keys = ['User_id'] 
# 特征名的前缀
prefixs='simple_'+'_'.join(keys)+'_'

其实prefixs=‘simple_’+‘User_id’+‘’ 也可以实现添加前缀的效果。不过,使用 join(keys) 的方式可以更加灵活,可以在需要使用多个键进行聚合的情况下快速修改代码,而不需要手动更改前缀字符串。
具体来说,假设我们有如下的数据集:
在这里插入图片描述
我们希望按照 User_id 和 Date 进行聚合,并且添加前缀 'simple
’,那么可以使用如下的代码:

keys = ['User_id', 'Date']
prefixs = 'simple_' + '_'.join(keys) + '_'
pivot = pd.pivot_table(cff, index=keys, values='Count', aggfunc=len)
pivot = pd.DataFrame(pivot).rename(columns={'Count': prefixs + 'received'}).reset_index()
cff = pd.merge(cff, pivot, on=keys, how='left')

在这里插入图片描述
可以看到,使用 join(keys) 的方式可以快速修改代码,实现对多个键进行聚合,并添加指定前缀的功能。

pd.pivot_table()–数据透视表

keys = ['User_id']
//透视表,按 User_id 分组,计算每个用户领取的优惠券数量
pivot = pd.pivot_table(cff,index=keys,values='Coupon_id',aggfunc=len)

这段代码使用 pandas 库的 pivot_table() 函数,将数据集 cff 按照指定的键(keys)进行分组,并计算每组中 Coupon_id 列的长度(即该组中 Coupon_id 列的非缺失值数量)。

  • pd.pivot_table(): 这个函数是 pandas 库提供的一个数据透视表函数,可以方便地进行数据透视分析。
  • cff:表示要进行数据透视分析的数据集。
  • index=keys:表示按照 keys 列进行分组。
  • values=‘Coupon_id’:表示对 Coupon_id 列进行计算。
  • aggfunc=len:表示使用 len 函数计算每组中非缺失值的数量。也就是说,对于每组,统计其 Coupon_id 列的非缺失值数量。
    例如,假设我们有如下的数据集 cff:
    在这里插入图片描述
    若设 keys=[‘User_id’],则该代码会将 cff 按照 User_id 进行分组,然后统计每组中的 Coupon_id 列的非缺失值数量。得到的结果如下:
    在这里插入图片描述

为什么是len函数?aggfunc是什么含义?

pivot = pd.pivot_table(cff,index=keys,values='count',aggfunc=len)
  • aggfunc 是一个参数,表示对每个 group 中的数据进行聚合操作的函数。
  • aggfunc=len 表示对每个 group 计算该 group 中元素的数量(也就是行数)
  • pivot_table() 函数创建了一个透视表,index 参数用来指定分组的列,values 参数指定了聚合计算的列。因此,对于每个 group,aggfunc 参数指定了如何计算该 group 中的数据,以便在透视表中显示该 group 的统计结果。
  • pivot = pd.pivot_table(cff,index=keys,values=‘count’,aggfunc=len) 表示对 cff DataFrame 按照 keys 列分组,统计 count 列的数量,并将结果存储在名为 pivot 的新 DataFrame 中。
  • 需要注意的是,原始数据表 cff 中的 ‘count’ 列中存储的应该是原始数据,而不是经过 len 函数统计后的结果。

怎么把这个分组打印出来呢?-- pandas 库的 groupby() 方法来进行分组操作,并使用 for 循环遍历每个分组并打印出来

groups = cff.groupby(['User_id'])
for user_id, group in groups:
    print("User_id: ", user_id)
    print(group)

  • 这段代码是将一个名为cff的数据框按照User_id这一列进行分组。 groupby函数将数据框cff按照User_id列中不同的值进行分组,并返回一个可迭代的对象。
  • for user_id, group in groups:语句用于遍历这个可迭代的对象,每次迭代将返回一对元素,其中user_id表示分组的依据,即User_id列中的一个唯一值,而group则表示这个分组的所有行(数据框中所有User_id值等于当前user_id的行),group也是一个数据框。因此,在循环中可以分别访问每个分组的User_id和对应的所有行。
  • 结果: 每个分组的内容被打印为一个 DataFrame,包含该分组中所有列的数据。
    在这里插入图片描述

将数据透视表转换为dataframe模式

keys = ['User_id']
//透视表,按 User_id 分组,计算每个用户领取的优惠券数量
pivot = pd.pivot_table(cff,index=keys,values='Coupon_id',aggfunc=len)
# 重命名特征列和主键列,并添加前缀
pivot = pd.DataFrame(pivot).rename(columns={'Coupon_id':prefixs + 'received'}).reset_index()
  • pd.DataFrame() --转换为 DataFrame 格式。原因是前一步生成的结果是一个 pandas.Series 类型,而在后续的数据处理中,需要使用 DataFrame 格式的数据。 pd.DataFrame()
  • rename() --修改列名。将原来的 Count 列名修改为 prefixs + ‘received’。其中,prefixs 是代码中定义的一个前缀字符串,用于标记该特征的名称。因此,生成的新列名为 simple_User_id_received。
  • reset_index()–重置索引。由于 pivot 中的索引是按照 keys 列进行分组得到的,因此需要使用 reset_index() 方法将索引重置为普通的整数序列。这样可以方便后续的数据处理。
    例如:
    数据透视表:

在这里插入图片描述
dataframe:
在这里插入图片描述

pandas的rename()函数

 pivot = pd.DataFrame(pivot).rename(columns={'count':prefixs + 'received'}).reset_index()
  • rename()方法用于重命名数据框的列名,其中columns参数是一个字典,指定了需要修改的列名和新的列名,这里字典中的’count’表示需要修改的原始列名;
  • prefixs + 'received’表示新的列名,其中prefixs是一个字符串变量,代表前缀,+符号用于将前缀和’received’拼接在一起。执行这个语句后,数据框中原来名为’count’的列名将被修改为prefixs + ‘received’。
  • reset_index()方法用于将数据框的行索引重置,并将原来的索引值作为一列新的列添加到数据框中,以便对数据进行进一步的处理。例如,在对数据进行透视操作时,往往需要对数据进行重置索引。执行reset_index()后,数据框中原来的索引列将被转换为一个普通列,新的索引列将从0开始自动编号。

pandas 库的 merge() 函数

keys = ['User_id']
//透视表,按 User_id 分组,计算每个用户领取的优惠券数量
pivot = pd.pivot_table(cff,index=keys,values='Coupon_id',aggfunc=len)
# 重命名特征列和主键列,并添加前缀
pivot = pd.DataFrame(pivot).rename(columns={'Coupon_id':prefixs + 'received'}).reset_index()
//将 pivot 表格中的结果与原始数据集 cff 进行合并
cff = pd.merge(cff,pivot,on=keys,how='left')

pd.merge(): 这个函数是 pandas 库提供的一个数据合并函数,可以将两个数据集(dataframe)按照指定的键(keys)进行合并。

  • cff:表示要合并的原始数据集。
  • pivot:表示要合并的数据集,即上一步生成的按照指定键分组后的统计结果。
  • on=keys:表示按照 keys 列进行合并。也就是说,将原始数据集 cff 和分组统计结果 pivot 按照 keys 列进行合并。
  • how=‘left’:表示使用左连接方式进行合并。左连接是指,以原始数据集 cff 为基准,对于分组统计结果 pivot 中没有的数据,用 NaN 进行填充。这样,就能保证原始数据集中的所有数据都能被保留。
    例如,假设我们有如下的数据集 cff:
    在这里插入图片描述
    按照 User_id 分组,并计算每个用户领取的优惠券数量,结果如下:
    在这里插入图片描述
    合并的结果如下:
    在这里插入图片描述
    原始数据集中的每一行都被保留了下来,同时新增了一个名为 simple_User_id_received 的列,用来记录每个用户领取的优惠券数量。如果原始数据集中的某些行在 pivot 表格中没有对应的统计结果,那么对应的 simple_User_id_received 列就会填充 NaN 值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值