《Python數據分析與挖掘實戰》代碼問題

本文轉自:http://blog.csdn.net/qq_27469517/article/details/53482563

整個第四章都是數據預處理。

4.1是數據清洗。就是處理無關數據,缺失或者異常數據等等。

具體看書,就不贅述了,還是上代碼實踐。

書上給的代碼是有問題的!

[python] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #拉格朗日插值代碼  
  2. import pandas as pd #導入數據分析庫Pandas  
  3. from scipy.interpolate import lagrange #導入拉格朗日插值函數  
  4.   
  5. inputfile = 'data/catering_sale.xls' #銷量數據路徑  
  6. outputfile = 'tmp/sales.xls' #輸出數據路徑  
  7.   
  8. data = pd.read_excel(inputfile) #讀入數據  
  9. data[u'銷量'][(data[u'銷量'] < 400) | (data[u'銷量'] > 5000)] = None #過濾異常值,將其變爲空值  
  10.   
  11. #自定義列向量插值函數  
  12. #s爲列向量,n爲被插值的位置,k爲取前後的數據個數,默認爲5  
  13. def ployinterp_column(s, n, k=5):  
  14.   y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取數  
  15.   y = y[y.notnull()] #剔除空值  
  16.   return lagrange(y.index, list(y))(n) #插值並返回拉格朗日插值結果  
  17.   
  18. #逐個元素判斷是否需要插值  
  19. for i in data.columns:  
  20.   for j in range(len(data)):  
  21.     if (data[i].isnull())[j]: #如果爲空即插值。  
  22.       data[i][j] = ployinterp_column(data[i], j)  
  23.   
  24. data.to_excel(outputfile) #輸出結果,寫入文件  

究其原因,應該是

[python] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. data[u'銷量'][(data[u'銷量'] < 400) | (data[u'銷量'] > 5000)] = None #過濾異常值,將其變爲空值  
這句話有問題。

改正方法主要是 .loc 函數進行修改。

.loc 函數主要是選定指定列操作,參見 http://blog.csdn.net/chixujohnny/article/details/51095817


參考下面這個鏈接

http://blog.csdn.net/o1101574955/article/details/51627401

給出了修改版:

[python] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. # -*- coding:utf-8 -*-  
  2. #拉格朗日插值代碼  
  3. import pandas as pd #導入數據分析庫Pandas  
  4. from scipy.interpolate import lagrange #導入拉格朗日插值函數  
  5.   
  6. inputfile = 'data/catering_sale.xls' #銷量數據路徑  
  7. outputfile = 'tmp/sales.xls' #輸出數據路徑  
  8.   
  9. data = pd.read_excel(inputfile) #讀入數據  
  10. #data[u'銷量'][(data[u'銷量'] < 400) | (data[u'銷量'] > 5000)] = None #過濾異常值,將其變爲空值  
  11. row_indexs = (data[u'銷量'] < 400) | (data[u'銷量'] > 5000)  #得到過濾數據的索引  
  12. data.loc[row_indexs,u'銷量'] = None  #過濾數據  
  13.   
  14. #自定義列向量插值函數  
  15. #s爲列向量,n爲被插值的位置,k爲取前後的數據個數,默認爲5  
  16. def ployinterp_column(s, n, k=5):  
  17.     y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取數  
  18.     y = y[y.notnull()] #剔除空值  
  19.     return lagrange(y.index, list(y))(n) #插值並返回拉格朗日插值結果  
  20.   
  21. #逐個元素判斷是否需要插值  
  22. for i in data.columns:  
  23.     for j in range(len(data)):  
  24.         if (data[i].isnull())[j]: #如果爲空即插值。  
  25. #       data[i][j] = ployinterp_column(data[i], j)  
  26.             data.loc[j,i] = ployinterp_column(data[i], j)  
  27. data.to_excel(outputfile) #輸出結果,寫入文件  



這時候我在 http://blog.csdn.net/aq_cainiao_aq/article/details/53257136 也看見一篇,我沒試過,可以參考。


def那段代碼應該要結合拉格朗日插值法具體看,現在簡單分析一下:

s爲列向量,n爲被插值的位置,k爲取前後的數據個數,默認爲5。

返回的拉格朗日函數有兩個值,y.index應該是插值位置,list(y) 就是結果吧。

可惜沒找到關於 lagrange 函數的說明,只能猜。 


現在的問題是,日期全變成了 ######,想想怎麼修改呢?

其實日期是沒問題的,但是後面多了時分秒,太長了就變成了######。我不想要這個東西。

去百度搜索了很久,http://blog.csdn.net/dm_vincent/article/details/48696857 參考了一下這個,但是感覺沒看懂。


不過呢,插值算是處理好了。

===================================================================================================

4.3講的是數據變換


主要是數據的規範化處理,把數據轉換成“適當的”形式。

代碼就是狗屎,我自己補充了一下,給的代碼不僅沒有 print ,還tm少了一個 import,真的服了

[python] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #-*- coding: utf-8 -*-  
  2. #數據規範化  
  3. import pandas as pd  
  4. import numpy as np  
  5.   
  6. datafile = 'data/normalization_data.xls' #參數初始化  
  7. data = pd.read_excel(datafile, header = None#讀取數據  
  8.   
  9. print (data - data.min())/(data.max() - data.min()) #最小-最大規範化  
  10. print (data - data.mean())/data.std() #零-均值規範化  
  11. print data/10**np.ceil(np.log10(data.abs().max())) #小數定標規範化  


就是如此。

==================================================================================================


4.3.3講的是連續屬性離散化。                                                                                                                                                                                         但是這代碼都是什麼鬼???

[python] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #-*- coding: utf-8 -*-  
  2. #數據規範化  
  3. import pandas as pd  
  4.   
  5. datafile = 'data/discretization_data.xls' #參數初始化  
  6. data = pd.read_excel(datafile) #讀取數據  
  7. data = data[u'肝氣鬱結證型係數'].copy()  
  8. k = 4  
  9.   
  10. d1 = pd.cut(data, k, labels = range(k)) #等寬離散化,各個類比依次命名爲0,1,2,3  
  11. # http://pandas.pydata.org/pandas-docs/stable/generated/pandas.cut.html pd.cut  
  12.   
  13. #等頻率離散化  
  14. w = [1.0*i/k for i in range(k+1)]  
  15. w = data.describe(percentiles = w)[4:4+k+1#使用describe函數自動計算分位數  
  16. w[0] = w[0]*(1-1e-10)  
  17. d2 = pd.cut(data, w, labels = range(k))  
  18.   
  19. from sklearn.cluster import KMeans #引入KMeans  
  20. kmodel = KMeans(n_clusters = k, n_jobs = 4#建立模型,n_jobs是並行數,一般等於CPU數較好  
  21. kmodel.fit(data.reshape((len(data), 1))) #訓練模型  
  22. c = pd.DataFrame(kmodel.cluster_centers_).sort(0#輸出聚類中心,並且排序(默認是隨機序的)  
  23. w = pd.rolling_mean(c, 2).iloc[1:] #相鄰兩項求中點,作爲邊界點  
  24. w = [0] + list(w[0]) + [data.max()] #把首末邊界點加上  
  25. d3 = pd.cut(data, w, labels = range(k))  
  26.   
  27. def cluster_plot(d, k): #自定義作圖函數來顯示聚類結果  
  28.   import matplotlib.pyplot as plt  
  29.   plt.rcParams['font.sans-serif'] = ['SimHei'#用來正常顯示中文標籤  
  30.   plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號  
  31.     
  32.   plt.figure(figsize = (83))  
  33.   for j in range(0, k):  
  34.     plt.plot(data[d==j], [j for i in d[d==j]], 'o')  
  35.     
  36.   plt.ylim(-0.5, k-0.5)  
  37.   return plt  
  38.   
  39. cluster_plot(d1, k).show()  
  40.   
  41. cluster_plot(d2, k).show()  
  42. cluster_plot(d3, k).show()  

運行無限報錯。回頭再來試試。                         

以下內容轉自http://blog.csdn.net/xuyaoqiaoyaoge/article/details/52678307

2.連續屬性離散化

首先是確定分成幾個區間,每個區間的範圍多大,然後是將每個區間用符號或者整數值來表示。 
1.等寬法 
相同寬度的區間 
2.等頻法 
將相同數量的記錄放入每個區間 
3.基於聚類的方法 
先聚類,用K-Means,然後對簇進行處理,每個簇一個標記。 
總之,區間的數量自己決定。

#-*- coding: utf-8 -*-
#數據離散化
import pandas as pd

datafile = 'E:/PythonMaterial/chapter4/demo/data/discretization_data.xls' #參數初始化
data = pd.read_excel(datafile) #讀取數據
data = data[u'肝氣鬱結證型係數'].copy()#將這一列的數據抓出來
k = 4#分成4個區間

d1 = pd.cut(data, k, labels = range(k)) #等寬離散化,各個類比依次命名爲0,1,2,3
# print d1
print pd.value_counts(d1)

#等頻率離散化,qcut函數就是用來做按照分位數切割的
#如果是分成4個區間,可以使用qcut函數,4表示按照4分位數進行切割
d2=pd.qcut(data,4,labels = range(k))
# print d2
print pd.value_counts(d2)
#如果想分成10個等份,則如下
w=[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]
d3 = pd.qcut(data, w, labels = range(10))
# print d3
print pd.value_counts(d3)
#也可以按照任意的分位數進行分割,使得每個區間按照自己設定的個數展示
w=[0,0.1,0.5,0.9,1]
d4 = pd.qcut(data, w, labels = range(4))#labels是可以替換的,如:labels=['hao','zhong','yiban','huai']
# print d4
print pd.value_counts(d4)

#基於聚類的劃分
from sklearn.cluster import KMeans #引入KMeans
kmodel = KMeans(n_clusters = k, n_jobs = 1) #建立模型,n_jobs是並行數,一般等於CPU數較好
kmodel.fit(data.reshape((len(data), 1))) #訓練模型
c = pd.DataFrame(kmodel.cluster_centers_).sort(0) #輸出聚類中心,並且排序(默認是隨機序的)
w = pd.rolling_mean(c, 2).iloc[1:] #相鄰兩項求中點,作爲邊界點
w = [0] + list(w[0]) + [data.max()] #把首末邊界點加上
d3 = pd.cut(data, w, labels = range(k))

def cluster_plot(d, k): #自定義作圖函數來顯示聚類結果

    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標籤
    plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號

    plt.figure(figsize = (8, 3))
    for j in range(0, k):
        plt.plot(data[d==j], [j for i in d[d==j]], 'o')

    plt.ylim(-0.5, k-0.5)
    return plt

cluster_plot(d1, k).show()

cluster_plot(d2, k).show()
cluster_plot(d3, k).show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
1    508
2    275
0    112
3     35
Name: 肝氣鬱結證型係數, dtype: int64
1    234
3    233
0    233
2    230
Name: 肝氣鬱結證型係數, dtype: int64
6    97
0    97
4    95
2    94
8    93
9    92
1    92
5    91
7    90
3    89
Name: 肝氣鬱結證型係數, dtype: int64
2    371
1    370
0     97
3     92
Name: 肝氣鬱結證型係數, dtype: int64
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

這裏寫圖片描述 
這裏寫圖片描述 
這裏寫圖片描述

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章