缺失值處理常用方式
均值,中位數,衆數插補法
使用固定值(規定的標準值)
最近鄰插補法
迴歸方法:可以使用線性迴歸或者多項式迴歸(SVR)
插值法:拉格朗日差值和牛頓插值法。
拉格朗日插值法原理(看懂原理需要數學修煉):
拉格朗日插值法代碼示例
2月14號這一天存在空數據,下面我們使用拉格朗日插值法,對數據進行填充
#拉格朗日插值代碼
import pandas as pd
#拉格朗日插值函數
from scipy.interpolate import lagrange
#銷量數據路徑
inputfile = './catering_sale.xls'
#輸出數據路徑
outputfile = './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['日期'] = data['日期'].dt.date
#輸出結果,寫入文件
data.to_excel(outputfile)
插值後大家發現,2月14號插值成功,營收4156,符合實際情況,因爲2月14號是週六,客流量比較大,而且是情人節,所以基本符合情況。
大家同時也發現2月21號的數據之前特別大,多達6607,所以我們把這一數據假定成異常值,進行刪除,重新生成了,拉格朗日填充結果爲4275,也比較正常,因爲2月21號也是週六。
我們可以發現這樣一個規律,週一至週五營業額比較少,週六日比較多。
牛頓法,與拉格朗日類似,scipy沒有提供方法,如果項目中需要使用,需要自己根據原理實現代碼。
參考書目:
《Python數據分析與挖掘實戰》