弄了2天,发现还是对python不够熟悉,完全不能实现我的各种设想,所以,还是先参考别人的代码,先明白别人的思路和python的写法再说吧。
源代码地址请直接在CSDN上搜索,原文说未经许可不得转载,所以我也不放地址了,就记录下自己的一些阅读的想法。
首先将数据集合分为3个部分:
看看这3个部分是什么样子的:
print(feature1.shape)
print(dataset1.shape)
print(feature2.shape)
print(dataset2.shape)
print(feature3.shape)
print(dataset3.shape)
输出结果:
(995240, 7)
(182078, 7)
(812779, 7)
(258446, 7)
(1036975, 7)
(113640, 6)
处理dataset3,将用户ID提取出来:这个时候t是113640行的
t = t.groupby('user_id').agg('sum').reset_index()
因为dataset3是最终的test集,这个集合中没有不领取优惠券的情况,所以只要有一条记录,就说明此用户领取了一次优惠券,所以设置了初值为1,然后按照用户id做个sum,这样就得到了每个用户领取优惠券的次数。这个时候,t为76309行
t = 用户ID+领取优惠券总数
t1为test集合的用户ID+优惠券ID,113640条
同样的方法:
t1 = t1.groupby(['user_id','coupon_id']).agg('sum').reset_index()
最终得到的是t1 = 用户ID+优惠券ID+次数
这里其实产生了个疑问,就是这个优惠券ID有什么用?训练集和测试集又不会有重复优惠券ID的,这个待以后实验认证。
t1为105958行。
t2是同样用户ID,优惠ID不止1个的集合
先提取出和t1类似的集合,再将接收时间字段修改为str类型
再统计用户ID,同样优惠券ID,不同接收时间
t2 = t2[t2.receive_number > 1]
这样筛选出>1的集合,再统计最大接收时间,最小接收时间
t3选择用户ID,优惠券ID、接收时间,然后和t2合并
t3 = pd.merge(t3,t2,on=['user_id','coupon_id'],how='left')
得到的结果如下:
user_id coupon_id date_received max_date_received min_date_received
0 4129537 9983 20160712 NaN NaN
1 6949378 3429 20160706 NaN NaN
2 2166529 6928 20160727 NaN NaN
3 2166529 1808 20160727 NaN NaN
4 6172162 6500 20160708 NaN NaN
t3.shape= (113640, 5)
这样相当于加上了2个属性,没有这2个属性的为NaN
后续又调用自己写的函数,二值化为0、1、-1
t3.this_month_user_receive_same_coupon_lastone = t3.this_month_user_receive_same_coupon_lastone.apply(is_firstlastone)
t4一个用户接收到的所有优惠券的个数
看到这里,我总算明白了,怎么能统计个数了!
t4 = dataset3[['user_id','date_received']]
t4['this_day_receive_all_coupon_count'] = 1
t4 = t4.groupby(['user_id','date_received']).agg('sum').reset_index()
t5,一个用户不同时间接收到的优惠券的个数
t6,一个用户不同优惠券的接收时间
我还是没有明白,为什么什么都和优惠券ID挂在一起,有什么用呢?
这里是修改列名称的代码
t6.rename(columns={'date_received':'dates'},inplace = True)
t7是领取不同优惠券的数量?
最后同意merge到一起,保存为csv文件
整个过程看的晕,主要是不了解为什么总吧优惠券ID挂上,个人猜测是因为虽然预测集和测试集的优惠券ID不一样,但是领取同一优惠券ID数量、领取不同的优惠券ID这些行为都是一样的,所以把这些数量作为特征。
最后的模型建立和预测肯定不会基于这个优惠券ID。