1. 程式人生 > 實用技巧 >【Python】【資料分析】缺失值處理——插值

【Python】【資料分析】缺失值處理——插值

題目連結

http://www.mathorcup.org/detail/2260
本文僅演示資料預處理環節

資料預處理

本文取每個水池中,A、B兩個取樣點各理化因子的實測值的均值作為各理化因子的計算值。總磷、總淡、氨氮15周的資料可以參考附件一。而附件二中COD、溶氧、PH值間隔兩週採集一次,與附件一資料不對稱,不足以建立合理的模型,因此考慮利用現有資料插值以補充資料。
插值方法選用三次B樣條插值,該方法可以很好的保持資料光滑性和連續性,減少資訊量的損失。最終得到的資料如下。


原始碼:(以輪蟲-時間為例)

#暫時手動匯入資料,下週開始學習自動從EXCEL表讀取資料
#輪蟲-時間
import numpy as np
import matplotlib.pyplot as plt
#進行樣條插值
import scipy.interpolate as spi

plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
#資料準備
X=[1,3,5,7,9,11,13,15]
Y1=[1913,1945,1920,2205,2260,2302,2385,2420]
Y2=[591,670,760,837,860,880,885,912]
Y3=[4.46,3.94,2.61,2.66,2.12,1.02,1.35,1.12]
Y4=[8.49,8.45,7.92,7.13,3.49,3.12,2.38,1.56]
#定義整週數點
xpoint=np.arange(1,15.1,1)
#定義曲線x點
xline=np.arange(1,15.1,0.1)

#進行三次樣條擬合點
xpoint_r=spi.splrep(X,Y1,k=3) #樣本點匯入,生成引數
ypoint1=spi.splev(xpoint,xpoint_r) #根據觀測點和樣條引數,生成插值
xpoint_r=spi.splrep(X,Y2,k=3) #樣本點匯入,生成引數
ypoint2=spi.splev(xpoint,xpoint_r) #根據觀測點和樣條引數,生成插值
xpoint_r=spi.splrep(X,Y3,k=3) #樣本點匯入,生成引數
ypoint3=spi.splev(xpoint,xpoint_r) #根據觀測點和樣條引數,生成插值
xpoint_r=spi.splrep(X,Y4,k=3) #樣本點匯入,生成引數
ypoint4=spi.splev(xpoint,xpoint_r) #根據觀測點和樣條引數,生成插值
#進行三次樣條擬合曲線
xline_r=spi.splrep(X,Y1,k=3) #樣本點匯入,生成引數
yline1=spi.splev(xline,xline_r) #根據觀測點和樣條引數,生成插值
xline_r=spi.splrep(X,Y2,k=3) #樣本點匯入,生成引數
yline2=spi.splev(xline,xline_r) #根據觀測點和樣條引數,生成插值
xline_r=spi.splrep(X,Y3,k=3) #樣本點匯入,生成引數
yline3=spi.splev(xline,xline_r) #根據觀測點和樣條引數,生成插值
xline_r=spi.splrep(X,Y4,k=3) #樣本點匯入,生成引數
yline4=spi.splev(xline,xline_r) #根據觀測點和樣條引數,生成插值
#輸出資料表格
plt.figure(figsize=(15,10))
cell_text=[np.round(ypoint1,2),np.round(ypoint2,2),np.round(ypoint3,2),np.round(ypoint4,2)]
the_table=plt.table(cellText=cell_text,
          rowLabels=["1號池","2號池","3號池","4號池"],
          colLabels=xpoint,
         )
#作圖
plt.scatter(xpoint,ypoint1)
plt.plot(xline,yline1,label='1號池')
plt.scatter(xpoint,ypoint2)
plt.plot(xline,yline2,label='2號池')
plt.scatter(xpoint,ypoint3)
plt.plot(xline,yline3,label='3號池')
plt.scatter(xpoint,ypoint4)
plt.plot(xline,yline4,label='4號池')
plt.xticks([])
#plt.xlabel('時間(周)')
plt.ylabel('輪蟲(10^6/L)')
plt.title('輪蟲-時間(周)曲線圖')
plt.legend()#顯示標籤
plt.show()