在上一章節咱們聊了python大數據分析的基本模塊,下面就說說2個項目吧,第一個是進行淘寶商品數據的挖掘,第二個是進行文本類似度匹配。好了,廢話很少說,趕忙上車。html
本身寫個爬蟲爬吧,爬到後入庫(mysql)。python
所謂的數據清洗,就是把一些異常的、缺失的數據處理掉,處理掉不必定是說刪除,而是說經過某些方法將這個值補充上去,數據清洗目的在於爲了讓咱們數據的可靠,由於髒數據會對數據分析產生影響。
拿到數據後,咱們進行數據清洗分爲兩方面:mysql
這兩方面的處理方法以下:算法
方法解釋:sql
淘寶商品表結構以下:大數據
mysql> desc taob; +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | title | varchar(50) | YES | | NULL | | | link | varchar(60) | NO | PRI | NULL | | | price | int(30) | YES | | NULL | | | comment | int(30) | YES | | NULL | | +---------+-------------+------+-----+---------+-------+
對於上面四個字段,比較好處理的就是價錢和評論數,好比價錢是0(沒有采集到的數據),能夠經過剛纔平均值或者中位數來填充,對於異常值,好比某個評論10W+,那麼也能夠採用平均值修正。url
依賴於pymysql,numpy,pandas,matplotlib,請本身先安裝。能夠參考我上篇博文:http://www.cnblogs.com/liaojiafa/p/6239262.htmlcode
conn = pymysql.connect(host='192.168.56.4',user='root',passwd='123456',db='csdn',charset='utf8') sql='select * from taob' data = pandas.read_sql(sql,conn) print(data.head(1)) #數據樣例以下,和mysql字段相匹配的: 0 買2袋減2元 印尼進口菲那菲娜蝦味木薯片油炸大龍蝦片零食品400g link price comment 0 https://item.taobao.com/item.htm?id=44350560220 50 2577
能夠看看數據的中位數和均值:htm
print(data.describe()) price comment count 9616.00000 9616.000000 mean 64.49324 562.239601 # 均值 std 176.10901 6078.909643 min 0.00000 0.000000 25% 20.00000 16.000000 50% 36.00000 58.000000 # 中位數 75% 66.00000 205.000000 max 7940.00000 454037.000000
咱們先了解下這樣的判斷方法:blog
a={1:'a',2:'b'} print([a[1]=='a'])
上述代碼打印結果必然是True,小括號([])至關於if判斷了,返回的值爲布爾值。
下面對price爲0的值(也就是缺失值)進行處理。
data['price'][(data['price']==0)]=None # 對price的缺失值通通賦值爲None,方便下面處理 data['price'][(data['price']==0)]=64 # 也能夠這樣寫,直接把price的缺失值設置爲price的平均數64.那麼下面的for循環設置price的缺失值就不須要寫。
對上面這段代碼拆分來看:
for i in data.columns: # 遍歷data的每列 for j in range(len(data)): # 遍歷data的每一行了。 if data[i].isnull()[j]: # i在這是一維(列),data[i]等於把這一列的值取出來了,j在這裏是二維(行),i至關於XY軸的X軸,j至關於XY軸的Y軸,data[i].isnull是判斷整列的某一個值是nan那麼就返回True,data[i].isnull[j]是逐行逐行的判斷是否爲nan了,是的話返回True從而進行下面代碼塊的處理。 data[i][j]=64 # 缺失值設置爲均值
1.找到異常值:經過畫散點圖(橫軸:價格,縱軸:評論數)
咱們這裏的話要選取評論數,價錢。一般的方法就是說經過遍歷每一行的數據,取每一行中的price值,可是呢這個方法效率低下。
對此咱們能夠採用轉置方法,把price列轉置爲一行,這樣就可以快速取到這價錢的數據,還有評論數。
下面請看代碼:
dataT=data.T # 轉置下數據 prices = dataT.values[2] # 取第3行數據 comments = dataT.values[3] # 取第4行數據 pylab.plot(prices,comments,'o') # 畫散點圖 pylab.xlabel('prices') pylab.ylabel('comments') pylab.title(" The Good's price and comments") pylab.show()
處理異常數據,我這裏定義的異常數據就是評論數超過20W,價格大於2000,請看代碼:
line = len(data.values) # 取行數 col = len(data.values[0]) # 取列數 davalues = data.values #取data的全部值 for i in range(0,line): # 遍歷行數 for j in range(0,col): #遍歷列數 if davalues[i][3]>200000: #判斷評論數 #print('comments==i,j',i,j,davalues[i][j]) davalues[i][j] = 562 # 評論數取平均值 if davalues[i][2]>2000: davalues[i][j] = 64 # 價錢取平均值 prices2=davalues.T[2] comments2=davalues.T[3] pylab.plot(prices2,comments2,'or') pylab.xlabel('prices') pylab.ylabel('comments') pylab.title(" The Good's price and comments") pylab.show()
此時,咱們看圖:
顯然咱們已經對評論數超過20W,價格大於2000的數據處理了,可是呢上圖顯示的仍是不夠漂亮,由於異常點與正常點的差距太大了,致使正常點與正常點之間的間隔很是小,小到黏在一塊了,因此咱們還須要在處理下,把評論數超過2000,價格大於300的處理掉,這樣的話,正常點就可以很好的展示在圖上,代碼以下:
line = len(data.values) # 取行數 col = len(data.values[0]) # 取列數 davalues = data.values #取data的全部值 for i in range(0,line): # 遍歷行數 for j in range(0,col): #遍歷列數 if davalues[i][3]>2000: #判斷評論數,===主要修改這行 #print('comments==i,j',i,j,davalues[i][j]) davalues[i][j] = 562 # 評論數取平均值 if davalues[i][2]>300: # ====主要修改這行 davalues[i][j] = 64 # 價錢取平均值 prices2=davalues.T[2] comments2=davalues.T[3] pylab.plot(prices2,comments2,'or') pylab.xlabel('prices') pylab.ylabel('comments') pylab.title(" The Good's price and comments") pylab.show()
full example:
import pymysql import numpy import pandas from matplotlib import pylab #缺失值處理 #====== data['price'][(data['price']==0)]=64 # 對price的缺失值通通賦值爲平均數 # 異常值處理: # 1.找到異常值:經過畫散點圖(橫軸:價格,縱軸:評論數) # 咱們這裏的話要選取評論數,價錢。一般的方法就是說經過遍歷每一行的數據,取每一行中的price值,可是呢這個方法效率低下, # 對此咱們能夠採用轉置方法,把price列轉置爲一行,這樣就可以快速取到這價錢的數據,還有評論數 # 處理異常數據,我這裏定義的異常數據就是評論數超過20W,價格大於2000 conn = pymysql.connect(host='192.168.56.4',user='root',passwd='123456',db='csdn',charset='utf8') sql='select * from taob' data = pandas.read_sql(sql,conn) line = len(data.values) # 取行數 col = len(data.values[0]) # 取列數 davalues = data.values #取data的全部值 for i in range(0,line): # 遍歷行數 for j in range(0,col): #遍歷列數 if davalues[i][3]>2000: #判斷評論數 #print('comments==i,j',i,j,davalues[i][j]) davalues[i][j] = 562 # 評論數取平均值 if davalues[i][2]>300: davalues[i][j] = 64 # 價錢取平均值 prices2=davalues.T[2] comments2=davalues.T[3] pylab.plot(prices2,comments2,'or') pylab.xlabel('prices') pylab.ylabel('comments') pylab.title(" The Good's price and comments") pylab.show()
生成的圖以下:
這張圖就很直觀的看出,價錢和評論數的關係了,價錢在100之內的,評論數也比較多,價錢越高,評論數相對來講越少。
數據集成:不一樣來源的數據集合在一塊兒,須要注意格式保持一致。
for example:
我這裏有2個表數據,淘寶與京東的,淘寶的表就如上面所述的同樣,標題,url,價錢,評論,那麼京東的下標爲2的列也必須是價錢,只有數據格式保持一致,才能分析。
數據離散化:處理連續數據較好的方法。離散化就是指數據不集中,分散了。
for example:
一個班的考試成績就是從0-100分之間,這個數據是在100之內連續的,那麼咱們對這個數據分析的時候就能夠這麼作,把連續的數據或者近似連續的數據整合在一個點附近,好比0-60分爲及格,60-80爲良好.....
咱們在這裏要分析商品數據的分佈,看評論數與價錢的在哪一個數量段的分佈最多。
首先咱們須要計算出價錢和評論的最值,其次在計算最值之間的極差,最後計算組距(極差/組數,組數本身根據狀況定義)。下面請看代碼:
# 數據分佈: # 1 求最值 # 2 計算極差 # 3 組距: 極差/組數 da2=davalues.T # print('=======') # print(data['price']) pricemax = da2[2].max() pricemin = da2[2].min() commentmax = da2[3].max() commentmin = da2[3].min() # 極差 pricerg = pricemax - pricemin commentrg = commentmax -commentmin # 組距 pricedst = pricerg/10 commentdst = pricerg/10 # 繪製直方圖 # numpy.arrange(最小值,最大值,組距) # 價錢直方圖 pricesty = numpy.arange(pricemin,pricemax,pricedst) pylab.hist(da2[2],pricesty) pylab.show() # 評論直方圖 commentty = numpy.arange(commentmin,commentmax,commentdst) pylab.hist(da2[3],pricesty) pylab.show()
評論直方圖以下:
從上圖中咱們能夠看出,評論數最多的集中在100元之內的商品,評論數也間接的說明了購買數,由於購買後纔可以評論。
因此能夠根據這個來直方圖來給商品訂價。
價錢直方圖以下:
從上圖中咱們能夠看出,商品價錢最多的集中在50元之內的商品
code full example:
#!/usr/bin/env python # __author__:Leo import pymysql import numpy import pandas from matplotlib import pylab conn = pymysql.connect(host='192.168.56.4',user='root',passwd='123456',db='csdn',charset='utf8') sql='select * from taob' data = pandas.read_sql(sql,conn) # 缺失值處理 data['price'][(data['price']==0)]=64 # 對price的缺失值通通賦值爲price的平均數 # 異常值處理: # 1.找到異常值:經過畫散點圖(橫軸:價格,縱軸:評論數) # 咱們這裏的話要選取評論數,價錢。一般的方法就是說經過遍歷每一行的數據,取每一行中的price值,可是呢這個方法效率低下, # 對此咱們能夠採用轉置方法,把price列轉置爲一行,這樣就可以快速取到這價錢的數據,還有評論數 line = len(data.values) # 取行數 col = len(data.values[0]) # 取列數 davalues = data.values #取data的全部值 for i in range(0,line): # 遍歷行數 for j in range(0,col): #遍歷列數 if davalues[i][3]>2000: #判斷評論數 #print('comments==i,j',i,j,davalues[i][j]) davalues[i][j] = 562 # 評論數取平均值 if davalues[i][2]>300: davalues[i][j] = 64 # 價錢取平均值 prices2=davalues.T[2] comments2=davalues.T[3] pylab.plot(prices2,comments2,'or') pylab.xlabel('prices') pylab.ylabel('comments') pylab.title(" The Good's price and comments") pylab.show() # 數據分佈: # 1 求最值 # 2 計算極差 # 3 組距: 極差/組數 da2=davalues.T # print('=======') # print(data['price']) pricemax = da2[2].max() pricemin = da2[2].min() commentmax = da2[3].max() commentmin = da2[3].min() # 極差 pricerg = pricemax - pricemin commentrg = commentmax -commentmin # 組距 pricedst = pricerg/10 commentdst = pricerg/10 # 繪製直方圖 # numpy.arrange(最小值,最大值,組距) # 價錢直方圖 pricesty = numpy.arange(pricemin,pricemax,pricedst) pylab.hist(da2[2],pricesty) pylab.show() # 評論直方圖 commentty = numpy.arange(commentmin,commentmax,commentdst) pylab.hist(da2[3],pricesty) pylab.show()
好了,淘寶商城數據預處理實戰到此告一段落,下面我將繼續搞文本類似度匹配。