天天看點

《Python資料分析與挖掘實戰》第四章案例代碼總結與修改分析

《Python資料分析與挖掘實戰》第四章案例代碼總結與修改分析

第四章案例代碼總結與修改分析

每個案例代碼全部為書中源代碼,出現錯誤按照每個案例下面給出的代碼錯誤,原因,及怎樣修改進行修改即可解決每個案例錯誤

4-1

   #拉格朗日插值代碼
    import pandas as pd #導入資料分析庫Pandas
    from scipy.interpolate import lagrange #導入拉格朗日插值函數
    inputfile = 'F:/大二下合集/Python資料分析與挖掘/catering_sale.xls' #銷量資料路徑
    outputfile = 'F:/大二下合集/Python資料分析與挖掘/sales.xls' #輸出資料路徑
    data = pd.read_excel(inputfile) #讀入資料
    data[u'銷量'][(data[u'銷量'] < 400) | (data[u'銷量'] > 5000)] = None #過濾異常值,将其變為空值
    #自定義列向量插值函數
    #s為列向量,n為被插值的位置,k為取前後的資料個數,預設為5
    def ployinterp_column(s, n, k=5):
      y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取數
      y = y[y.notnull()] #剔除空值
      return lagrange(y.index, list(y))(n) #插值并傳回插值結果
    #逐個元素判斷是否需要插值
    for i in data.columns:
      for j in range(len(data)):
        if (data[i].isnull())[j]: #如果為空即插值。
          data[i][j] = ployinterp_column(data[i], j)
    data.to_excel(outputfile) #輸出結果,寫入檔案      
代碼錯誤:
《Python資料分析與挖掘實戰》第四章案例代碼總結與修改分析
第一個錯誤原因:
   data[u'銷量'][(data[u'銷量'] < 400) | (data[u'銷量'] > 5000)] = None #過濾異常值,将其變為空值
    修改為:
    row_indexs = (data[u'銷量'] < 400) | (data[u'銷量'] > 5000)
    data.loc[row_indexs, u'銷量'] = None  # 過濾異常值,将其變為空值      
第二個錯誤原因:(需要改兩個地方代碼)

第①處

   y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取數      
修改為:
   y = s.reindex(list(range(n - k, n)) + list(range(n + 1, n + 1 + k)))  # 取數      

第②處

   data[i][j] = ployinterp_column(data[i], j)      
   data[i, j] = ployinterp_column(data[i], j)      

4-2

   #-*- coding: utf-8 -*-
    #資料規範化
    import pandas as pd
    import numpy as np
    datafile = 'F:/大二下合集/Python資料分析與挖掘/normalization_data.xls' #參數初始化
    data = pd.read_excel(datafile, header = None) #讀取資料
    (data - data.min())/(data.max() - data.min()) #最小-最大規範化
    (data - data.mean())/data.std() #零-均值規範化
    data/10**np.ceil(np.log10(data.abs().max())) #小數定标規範化      
   沒有報錯,但是在idea中運作沒有結果      
原因:
(data - data.min())/(data.max() - data.min()) #最小-最大規範化
    (data - data.mean())/data.std() #零-均值規範化
    data/10**np.ceil(np.log10(data.abs().max())) #小數定标規範化      
print((data - data.min()) / (data.max() - data.min())) #最小-最大規範化
    print((data - data.mean()) / data.std()) #零-均值規範化
    print(data / 10 ** np.ceil(np.log10(data.abs().max()))) #小數定标規範化      

4-3

#-*- coding: utf-8 -*-
    #資料規範化
    import pandas as pd
    datafile = 'F:/大二下合集/Python資料分析與挖掘/discretization_data.xls'
    data = pd.read_excel(datafile)
    data = data[u'肝氣郁結證型系數'].copy()
    k = 4
    d1 = pd.cut(data, k, labels = range(k))
    #等頻率離散化
    w = [1.0*i/k for i in range(k+1)]
    w = data.describe(percentiles = w)[4:4+k+1]
    w[0] = w[0]*(1-1e-10)
    d2 = pd.cut(data, w, labels = range(k))
    from sklearn.cluster import KMeans
    kmodel = KMeans(n_clusters = k, n_jobs = 4)
    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:
《Python資料分析與挖掘實戰》第四章案例代碼總結與修改分析
錯誤原因:(需要改兩個地方代碼)

第①個地方

kmodel.fit(data.reshape((len(data), 1)))      
kmodel.fit(data.values.reshape((len(data),1)))      

第②個地方

c = pd.DataFrame(kmodel.cluster_centers_).sort(0)      
c=pd.DataFrame(kmodel.cluster_centers_).sort_values(0)      
解決完第一個錯誤再次運作發現錯誤2:
《Python資料分析與挖掘實戰》第四章案例代碼總結與修改分析
原因:
w = pd.rolling_mean(c, 2).iloc[1:]      
w=c.rolling(2).mean().iloc[1:]      

4-4

#線損率屬性構造
    import pandas as pd
    inputfile= 'F:/大二下合集/Python資料分析與挖掘/electricity_data.xls' #供入供出電量資料
    outputfile = 'F:/大二下合集/Python資料分析與挖掘/electricity_data.xls' #屬性構造後資料檔案
    data = pd.read_excel(inputfile) #讀入資料
    data[u'線損率'] = (data[u'供入電量'] - data[u'供出電量'])/data[u'供入電量']
    data.to_excel(outputfile, index = False) #儲存結果      
這個案例代碼沒問題

4-5

#-*- coding: utf-8 -*-
    #利用小波分析進行特征分析
    #參數初始化
    inputfile= 'F:/大二下合集/Python資料分析與挖掘/leleccum.mat' #提取自Matlab的信号檔案
    from scipy.io import loadmat #mat是MATLAB專用格式,需要用loadmat讀取它
    mat = loadmat(inputfile)
    signal = mat['leleccum'][0]
    import pywt #導入PyWavelets
    coeffs = pywt.wavedec(signal, 'bior3.7', level = 5)
    #傳回結果為level+1個數字,第一個數組為逼近系數數組,後面的依次是細節系數數組      
代碼整體沒有錯誤,但是運作沒有結果需要在代碼最後加一行
print(coeffs)      

4-6

import pandas as pd
    inputfile = 'F:/大二下合集/Python資料分析與挖掘/principal_component.xls'
    outputfile = 'F:/大二下合集/Python資料分析與挖掘/1.xls'
    data = pd.read_excel(inputfile, header = None)
    from sklearn.decomposition import PCA
    pca = PCA()
    pca.fit(data)
    pca.components_
    pca.explained_variance_ratio_
    print("-----------4-6.2-----------------")
    pca=PCA(3)
    pca.fit(data)
    low_d=pca.transform(data)
    pd.DataFrame(low_d).to_excel(outputfile)
    low_d
    pca.inverse_transform(low_d)      
代碼錯誤: 沒有報錯,但是在idea中運作沒有結果,而且最後兩行标紅

①将:

pca.components_
    pca.explained_variance_ratio_      
修改為:(即添加print)
print(pca.components_)
    print(pca.explained_variance_ratio_)      

②将:

low_d
    pca.inverse_transform(low_d)      
print(low_d)
    print(pca.inverse_transform(low_d))      

4-7(即預處理函數的兩個執行個體)

import numpy as np
    import pandas as pd
    print("-----------------unique---------------------")
    D=pd.Series([1,1,2,3,5])
    D.unique()
    np.unique(D)
    print("---------------isnull/notnull---------------------")
    from sklearn.decomposition import PCA
    D=np.random.rand(10,4)
    pca=PCA()
    pca.fit(D)
    pca.components_        #傳回模型的各個特征向量
    pca.explained_variance_ratio_      
D.unique()
    np.unique(D)      
print(D.unique())
    print(np.unique(D))      
pca.fit(D)
    pca.components_        #傳回模型的各個特征向量
    pca.explained_variance_ratio_      
print(pca.fit(D))
    print(pca.components_)        #傳回模型的各個特征向量
    print(pca.explained_variance_ratio_)