1. 程式人生 > >python+matplotlib+web.py

python+matplotlib+web.py

我們 xlabel asc bsp ech http gen class chart

最近看了廈門大學數據庫實驗室林子雨老師的《大數據課程實驗案例:網站用戶行為分析》,可視化這塊是用的R語言,我決定用Python來實現一下。

參考文獻 http://dblab.xmu.edu.cn/post/7499/

數據來源 http://pan.baidu.com/s/1nuOSo7B

  1 # -*- coding: utf-8 -*-
  2 """
  3 Created on Wed Apr 19 17:26:53 2017
  4 
  5 @author: touristlee
  6 
  7 TO:Don‘t worry,be happy!
  8 """
  9 
 10 import pandas as pd
11 import numpy as np 12 import matplotlib.pylab as plt 13 import matplotlib.patches as mpatches 14 15 #數據下載地址https://pan.baidu.com/s/1nuOSo7B 16 #本案例采用的數據集為user.zip,包含了一個大規模數據集raw_user.csv(包含2000萬條記錄), 17 #和一個小數據集small_user.csv(只包含30萬條記錄)。 18 #小數據集small_user.csv是從大規模數據集raw_user.csv中抽取的一小部分數據。 19 #
之所以抽取出一少部分記錄單獨構成一個小數據集,是因為,在第一遍跑通整個實驗流程時, 20 #會遇到各種錯誤,各種問題,先用小數據集測試,可以大量節約程序運行時間。 21 #等到第一次完整實驗流程都順利跑通以後,就可以最後用大規模數據集進行最後的測試。 22 #user_id(用戶id) 23 #item_id(商品id) 24 #behaviour_type(包括瀏覽、收藏、加購物車、購買,對應取值分別是1、2、3、4) 25 #user_geohash(用戶地理位置哈希值,有些記錄中沒有這個字段值,所以後面我們做數據預處理時把這個字段全部刪除,用隨機生成的省份代替) 26 #item_category(商品分類)
27 #time(該記錄產生時間) 28 29 30 #讀取數據 31 df = pd.read_csv(small_user.csv,encoding=utf-8) 32 #隨機生成一個省份列表 33 def get_province(x): 34 youlist = [] 35 for i in x: 36 maplist = [u北京,u天津,u上海,u重慶,u河北,u山西,u遼寧,u吉林,u黑龍江,u江蘇,u浙江,u安徽,u福建,u江西,u山東,u河南,u湖北,u湖南,u廣東,u海南,u四川,u貴州,u雲南,u陜西,u甘肅,u青海,u臺灣,u內蒙古,u廣西,u西藏,u寧夏,u新疆,u香港,u澳門] 37 youlist.append(maplist[i]) 38 return youlist 39 #切割字符串 40 def format_time(x): 41 return str(x).split( )[0] 42 #格式化 43 df = df[[user_id,item_id,behavior_type,item_category,time]] 44 df[province] = get_province(np.random.randint(0,33,len(df))) 45 df[time] = df[time].map(format_time) 46 df.columns=[uid,itemid,behavior,itemcagegory,time,province] 47 df[time]=df[time].astype(datetime64) 48 print df.dtypes 49 50 #查詢 51 #查詢有多少條數據 52 print df.count() 53 #查詢有多少用戶 54 print df.drop_duplicates([uid]).count() 55 #查詢有多少不重復的數據 56 print df.drop_duplicates().count() 57 58 #條件查詢 59 #查詢2014年12月10日到2014年12月13日有多少人瀏覽了商品 60 print df[(2014-12-13>=df[time]) & (df[time] >= 2014-12-10) & (df[behavior]==1)].head() 61 #每天網站賣出去的商品的個數 62 df2=df.drop_duplicates() 63 print df2[df2[behavior]==4].groupby(time).itemcagegory.count() 64 #取給定時間和給定地點,求當天發出到該地點的貨物的數量 65 print df[(df[time]==2014-12-12) & (df[province]==u山西) & (df[behavior]==4)].itemcagegory.count() 66 67 68 69 #根據用戶行為分析 70 #查詢一件商品在某天的購買比例或瀏覽比例 71 print df[df[time]==2014-12-11].itemcagegory.count() 72 print df[(df[time]==2014-12-11) & (df[behavior]==4)].itemcagegory.count() 73 print float(df[(df[time]==2014-12-11) & (df[behavior]==4)].itemcagegory.count())/float(df[df[time]==2014-12-11].itemcagegory.count()) 74 75 76 77 ##查詢某個用戶在某一天點擊網站占該天所有點擊行為的比例(點擊行為包括瀏覽,加入購物車,收藏,購買) 78 print df[(df[uid]==10001082) & (df[time]==2014-12-12)].behavior.count() 79 print float(df[(df[uid]==10001082) & (df[time]==2014-12-12)].behavior.count())/float(df[df[time]==2014-12-12].behavior.count()) 80 81 #用戶實時查詢分析 82 #各個地區瀏覽網站的訪問次數 83 84 df2=df[df[behavior]==1] 85 df2=df2.drop_duplicates(uid) 86 print df2.groupby(province).uid.count() 87 88 89 90 #可視化 91 #分析各省份消費者對商品的行為(瀏覽) 92 fig=plt.figure(figsize=(8,4)) 93 ax1=fig.add_subplot(111) 94 plt.title(ubehavior by province) 95 plt.xlabel(province) 96 plt.ylabel(count) 97 df2=df[df[behavior]==1] 98 df2=df2.groupby(province).uid.count() 99 df2.plot(kind=bar) 100 #分析消費者對商品的行為 101 102 df3=df[[behavior]] 103 df3=df3.groupby(behavior).behavior.count() 104 fig2=plt.figure(figsize=(8,4)) 105 ax2=fig2.add_subplot(111) 106 plt.title(ubehavior) 107 plt.xlabel(behavior) 108 plt.ylabel(count) 109 df3.plot(kind=bar) 110 111 ##分析被購買最多的商品是哪一類 TOP10 112 df4=df[[behavior,itemcagegory]] 113 df4=df4[df4[behavior]==4] 114 df4=df4.groupby(itemcagegory).itemcagegory.count() 115 df5=df4.sort_values(ascending=False).head(10) 116 fig3=plt.figure(figsize=(8,4)) 117 ax3=fig3.add_subplot(1,1,1) 118 colors=[red,blue,yellow,green,white,black,magenta,cyan,yellowgreen,lightcoral] 119 ax3.scatter(df5.index,df5.values,c=colors) 120 plt.xlabel(var) 121 plt.ylabel(freq) 122 plt.title(TOP10 category) 123 plt.legend(handles=[mpatches.Patch(color=x, label=y,joinstyle=round) for (x,y) in zip(colors,df5.index)],bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) 124 plt.show() 125 126 ##分析每年的那個月份購買商品的量最多 127 #先增加一列 月份 128 df6=df[df[behavior]==4] 129 df7=df6.copy() 130 df7[month]=np.array([i.month for i in df7[time]]) 131 df7=df7[[behavior,month]] 132 df7=df7.groupby(month).count() 133 df7.plot(kind=bar) 134 135 ##分析每年的每個月份的行為習慣 136 df7=df.copy() 137 df7[month]=np.array([i.month for i in df7[time]]) 138 df7=df7[[behavior,month]] 139 tmp=df7.groupby([month,behavior]).behavior.count() 140 tmp.plot(kind=bar,color=[red,blue,green,yellow]) 141 142 143 #分析各省份消費者對商品的行為(收藏) 144 #分析國內哪個省份的消費者最有購買欲望 即收藏 147 df8=df[df[behavior]==3] 148 df8=df8.drop_duplicates(uid) 149 tmp8=df8.groupby(province).uid.count() 150 fig8=plt.figure(figsize=(8,4)) 151 ax8=fig.add_subplot(111) 152 plt.title(ubehavior by province) 153 plt.xlabel(province) 154 plt.ylabel(count) 155 tmp8.plot(kind=bar)

最後一個分析那個省份的消費者最有購買欲望的,原文用的是R語言的地圖,matplotlib畫地圖很麻煩。

我想到的辦法是用第三方模塊來替代。首先想到的是百度的echarts了,這可以說是百度的良心產品了。

使用這個可以用Django或者web.py,這裏我選擇最簡單的web.py。

代碼我上傳到了 https://github.com/touristlee/webpy.git

python+matplotlib+web.py