天池新人实战赛o2o优惠券使用预测四(别家代码分析1)

弄了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。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值