一种分析代金券使用分布情况的方法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)


这样就有了用户的统计信息了,下次讲交易的信息

 

相关内容

    暂无相关文章

评论关闭