一种分析代金券使用分布情况的方法python实现版(上)
一种分析代金券使用分布情况的方法python实现版(上)
print?
先描述一下场景,市场部的同事最近在搞活动,前一个周的总的代金券领取量不及最后一天领取量,于是让我来查一下此次代金券的详细情况,包括但不限于:1、十万张代金券都被哪些用户领取了?2、根据用户领取的从多到少排一下序。3、已经有哪些代金券使用了?4、使用代金券的交易总额多少?附件中是一个十万行的文本,每行是一个代金券的编号。
首先要做的是分析市场部同事的要求,我大约需要做如下几件事:第一,找出哪些代金券已经被用户领取。第二,根据用户算出领取的用户各自领取了多少张代金券。第三,哪些代金券在交易中已经使用了,交易的详情。第四,领取代金券的用户哪些在黑名单中?第五,黑名单以外的用户注册的时间及注册使用的IP信息。
由于代金券编号是按行存的,所以写个按行读取编号的PY文件,组织成查询哪些被用户领取的SQL语句,再批量执行SQL语句,于是第一个py文件getIdCountSql.py产生了:
[python]
!/usr/bin/env python
#coding=utf-8
import sys
import os
if __name__ == "__main__":
if len(sys.argv) != 2:
print "Usage: python getNum.py [target file]\n"
print "Example: python ", sys.argv[0] , "code.txt"
sys.exit(1)
filename = sys.argv[1]
if os.path.exists(filename):
file_object = open(filename)
lines = file_object.readlines()
for line in lines:
line = line.strip('\n') # 去掉尾部的换行
print "select id, count from tb_gift where code='%s' ;" % line
file_object.close()
#!/usr/bin/env python
#coding=utf-8
import sys
import os
if __name__ == "__main__":
if len(sys.argv) != 2:
print "Usage: python getNum.py [target file]\n"
print "Example: python ", sys.argv[0] , "code.txt"
sys.exit(1)
filename = sys.argv[1]
if os.path.exists(filename):
file_object = open(filename)
lines = file_object.readlines()
for line in lines:
line = line.strip('\n') # 去掉尾部的换行
print "select id, count from tb_gift where code='%s' ;" % line
file_object.close()
执行 python getIdCountSql.py code.txt >getIdCount.sql
于是产生了一个sql脚本如下:
select id, count from tb_gift where code='code123' ;
select id, count from tb_gift where code='code12' ;
select id, count from tb_gift where code='code456' ;
执行SQL脚本,并把结果写入一个文本文件:
mysql -h192.168.1.12 -P3307 -ussergsw -p123pwd -DsserDB < getIdCount.sql > giftIdCount.txt
此时会生成一个带列头的文本文件类似:
id count
code123 1
id count
code12 1
此时虽然可以处理,但是每行都存在的列名让人总觉得不爽,于是查阅资料,把列名去掉了:
mysql -h192.168.1.12 -P3307 -ussergsw -p123pwd -DsserDB --disable-column-names < getIdCount.sql > giftIdCount.txt
这样文本文件行数成了刚才文件的一半
code123 1
code121
下面统计被激活的代金券,即第二列为1的,于是有了第二个PY文件:
#!/usr/bin/env python
#coding=utf-8
import sys
import os
if __name__ == "__main__":
if len(sys.argv) != 2:
print "Usage: python getNum.py [target file]\n"
print "Example: python ", sys.argv[0] , "a.txt"
sys.exit(1)
filename = sys.argv[1]
map = {}
if os.path.exists(filename):
file_object = open(filename)
lines = file_object.readlines()
for line in lines:
line = line.strip('\n') # 去掉尾部的换行
cols = line.split('\t') # 文本是以Tab为分隔符
if len(cols) == 2 and cols[0] != "id" and cols[1] == '1':
print "select user_id from tb_user_gift where id = %s ;" % cols[0]
file_object.close()
执行python getUserIdSql.py giftIdCount.txt > getUserId.sql生成第二批sql语句,
执行mysql -h192.168.1.12 -P3307 -ussergsw -p123pwd -DsserDB --disable-column-names < getUserId.sql > userId.txt
取得结果如下:
11132
22123
统计用户信息statisticUserIds.py:
#!/usr/bin/env python
#coding=utf-8
import sys
import os
def parse_line(line):
# user_id
#11132
# 第一行忽略,针对带列名的数据,不带列名的没有第一行,第二行为用户的id,数量为1
try:
result = {}
if not line or line.find("user_id") != -1 :
return 0,0
else:
line = line.strip('\n')
productId = line
num = 1
return productId, num
except Exception, msg:
print msg,',line = ', line
return 0, 0
def reverse_numeric(x, y):
return y[1]- x[1]
if __name__ == "__main__":
if len(sys.argv) != 2:
print "Usage: python getNum.py [target file]\n"
print "Example: python ", sys.argv[0] , "a.txt"
sys.exit(1)
filename = sys.argv[1]
map = {}
if os.path.exists(filename):
file_object = open(filename)
lines = file_object.readlines()
for line in lines:
#print 'current line =', line
productId, num = parse_line(line)
count = map.get(productId)
if count:
map[productId] = count + int(num)
else:
map[productId] = int(num)
arr = [ v for v in sorted(map.items(), cmp=reverse_numeric)]
print arr
执行python statisticUserIds.py userId.txt > userCount.txt
统计信息如下:
('11132', 5), ('22123', 3), ('110', 1)
这样就有了用户的统计信息了,下次讲交易的信息
相关内容
- 暂无相关文章
评论关闭