1. 程式人生 > >Python資料分析與挖掘實戰程式碼糾錯 程式碼3-1

Python資料分析與挖掘實戰程式碼糾錯 程式碼3-1

我是通過這本書來開始學習資料探勘和分析,在目前學的內容中,發現了書上的程式碼有些地方是錯誤了,在此希望分享下我除錯好的程式碼,供大家參考,相互學習。
1、程式碼清單3-1 餐飲銷額資料異常值檢測程式碼
書上的程式碼如下:

#-*- coding: utf-8 -*-
import pandas as pd

catering_sale = '../data/catering_sale.xls' #餐飲資料
data = pd.read_excel(catering_sale, index_col = u'日期') #讀取資料,指定“日期”列為索引列

import matplotlib.pyplot as
plt #匯入影象庫 plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標籤 plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號 plt.figure() #建立影象 p = data.boxplot() #畫箱線圖,直接使用DataFrame的方法 x = p['fliers'][0].get_xdata() # 'flies'即為異常值的標籤 y = p['fliers'][0].get_ydata() y.sort() #從小到大排序,該方法直接改變原物件 #用annotate添加註釋
#其中有些相近的點,註解會出現重疊,難以看清,需要一些技巧來控制。 #以下引數都是經過除錯的,需要具體問題具體除錯。 for i in range(len(x)): if i>0: plt.annotate(y[i], xy = (x[i],y[i]), xytext=(x[i]+0.05 -0.8/(y[i]-y[i-1]),y[i])) else: plt.annotate(y[i], xy = (x[i],y[i]), xytext=(x[i]+0.08,y[i])) plt.show() #展示箱線圖

出現如下錯誤提示
這個錯誤的具體意思不是很清楚,大概意思就是因為它不是個字典型別,所以在使用字典索引時會報錯。
具體的改法:

p = data.boxplot(return_type='dict')

修正好的程式碼如下:

import pandas as pd
import matplotlib.pyplot as plt


#開啟資料檔案
catering_sale = 'C:/Users/Qhy/Desktop/catering_sale.xls'
#使用read_excel方法從檔案中讀取資料
data = pd.read_excel(catering_sale,index_col=u'日期')
#將資料轉化為DataFrame物件
data = pd.DataFrame(data)
#輸出資料的描述性統計,非空值數,平均數,標準差,最小值,最大值,1/4,1/2,3/4分位數
#print(data.describe())

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


#建立影象
plt.figure('異常值檢測箱線圖')
#呼叫boxplot方法直接繪製箱線圖
p = data.boxplot(return_type='dict')


#得到資料的x座標,fliers為異常值的標籤
x = p['fliers'][0].get_xdata()
#得到資料的值同也可看成y座標
y = p['fliers'][0].get_ydata()
#將異常值從小到大排序
y.sort()

#添加註釋
#由於有些相近的點註釋時會出現重疊,所以要控制他們的位置
for i in range(len(x)):
    if i > 0:
        #annotate()中,xy設定註釋的中心位置,xytext設定註釋的開始位置,第一個引數表示註釋的內容
        plt.annotate(y[i],xy=(x[i],y[i]),xytext=(x[i]+0.05-0.8/(y[i]-y[i-1]),y[i]))
    else:
        plt.annotate(y[i],xy=(x[i],y[i]),xytext=(x[i]+0.08,y[i]))


#顯示繪製的影象
plt.show()

這樣執行還會出現如下警告:
這裡寫圖片描述
這個時候是設定中文顯示字型出現了問題

plt.rcParams['font.sans-serif'] = ['SeiHei']

最後更改一下里面的字型(如更改成FangSong)就OK啦!