Python資料分析與挖掘實戰程式碼糾錯 程式碼3-1
阿新 • • 發佈:2019-01-05
我是通過這本書來開始學習資料探勘和分析,在目前學的內容中,發現了書上的程式碼有些地方是錯誤了,在此希望分享下我除錯好的程式碼,供大家參考,相互學習。
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啦!