一種分析代金券使用分布情況的方法python實現版(上)

來源:互聯網
上載者:User

          先描述一下情境,市場部的同事最近在搞活動,前一個周的總的代金券領取量不及最後一天領取量,於是讓我來查一下此次代金券的詳細情況,包括但不限於:1、十萬張代金券都被哪些使用者領取了?2、根據使用者領取的從多到少排一下序。3、已經有哪些代金券使用了?4、使用代金券的交易總額多少?附件中是一個十萬行的文本,每行是一個代金券的編號。

        首先要做的是分析市場部同事的要求,我大約需要做如下幾件事:第一,找出哪些代金券已經被使用者領取。第二,根據使用者算出領取的使用者各自領取了多少張代金券。第三,哪些代金券在交易中已經使用了,交易的詳情。第四,領取代金券的使用者哪些在黑名單中?第五,黑名單以外的使用者註冊的時間及註冊使用的IP資訊。

        由於代金券編號是按行存的,所以寫個按行讀取編號的PY檔案,組織成查詢哪些被使用者領取的SQL語句,再批量執行SQL語句,於是第一個py檔案getIdCountSql.py產生了:

#!/usr/bin/env python#coding=utf-8import sysimport 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取得結果如下:1113222123統計使用者資訊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)
這樣就有了使用者的統計資訊了,下次講交易的資訊

  • 上一篇:Mysql初始化root密碼和允許遠端存取
  • 下一篇:CSDN資源頁面掛掉了?
  • 2
    0
    相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.