【学习记录】阿里天池SQL练习题_08 python和SQL方式

合并数据,汇总统计

数据来源:天池新人实战赛o2o优惠券使用预测赛题与数据-天池大赛-阿里云天池

使用Coupon Usage Data for O2O中的数据集《ccf_online_stage1_train.csv》和《ccf_offline_stage1_train.csv》 试找出在2016年6月期间,线上线下累计优惠券使用次数最多的顾客。

概要:此题卡壳比较严重,乍看要求很简单,用python很实现容易。但过程中发现python相比SQL有一些不同,导致在处理此题反而不容易理解

先导入数据。此次数量较大,同时需要导入2个数据集,直接从本地下载导入。

import pandas as pd
import numpy as np
df_online=pd.read_csv('../data/阿里天池/ccf_online_stage1_train.csv')
df_offline=pd.read_csv('../data/阿里天池/ccf_offline_stage1_train.csv')

先处理数据量较小的offline数据集

首先把NaN数据进行处理,筛出2016年6月期间的数据集

同时新增一列number,并统一赋值1。原因是这样的,此题是要求按User_id作为分组索引,然后汇总统计优惠券的使用次数,但数据集中没有对应的优惠券ID的list(见数据集字段详情)无法直接用count函数。而在SQL中没有此困恼,SQL中可以直接group by User_id,接着order by count(User_id)。这样就把User_id出现的次数汇总,其实就等同于优惠券的使用次数。但python里不能这么写,python中groupby User_id后是无法再次对User_id用count汇总的。

这里卡壳很久一度不能理解。后面对比了SQL代码,再仔细看了题目要求:优惠券使用次数

最后我理解成:当一个User_id每用一次优惠券,就等于新增1行(User_id可以重复),用笨办法等于计数1,等同于使用了1次优惠券,这样汇总计数后再Sum求和得到总数即是每个User_id的使用次数,而不用count直接汇总。等于我自己新增了一列叫做‘优惠券ID’。最终用笨办法解决这个汇总问题

s1=df_offline[df_offline['Date'].notnull()]
s2=s1['Date'].astype('int')
df1=s1.set_index(s2).sort_index(ascending=False).loc[20160631:20160601]
df1['number']=1
offline_users=df1.groupby('User_id')[['number']].sum().sort_values(by='number',ascending=False)

 接下来online数据就比较容易处理

a1=df_online[df_online['Date'].notnull()]
a2=a1['Date'].astype('int')
df2=a1.set_index(a2).sort_index(ascending=False).loc[20160631:20160601]
df2['number']=1
online_users=df2.groupby('User_id')[['number']].sum().sort_values(by='number',ascending=False)

然后把两组数据拼接,最后筛选最大值

累计优惠券使用次数最多的顾客id=pd.concat([online_users,offline_users]).head(1).index[0]
print('累计优惠券使用次数最多的顾客id:',累计优惠券使用次数最多的顾客id)

SQL代码

SELECT User_id,COUNT(user_id) FROM 
(SELECT User_id FROM `ccf_online_stage1_train`
WHERE YEAR(DATE)=2016 AND MONTH(DATE)=6
UNION ALL
sELECT User_id FROM `ccf_offline_stage1_train`
WHERE YEAR(DATE)=2016 AND MONTH(DATE)=6) AS union_talbe
GROUP BY user_id
ORDER By COUNT(user_id) DESC
LIMIT 1


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部