今天我們要來解決空缺的部份,我們要使用的素材如下,是一張每隔五分鐘就紀錄溫度的資料表,我結圖整張表最上面的一小部份,可以看出表中有幾格空缺
解決空缺的部份有許多手段,有些會把當筆資料直接刪除,更極端一點有整欄刪除的這種作法,這種好處是可以最大的保留資料原始性跟真實度,不過在時間序列分析是很少採用這種方式的,因為時間序列必須確保時間的連續性,所以比起刪除有問題的資料,我們更常使用填補遺漏值這種方這種方式,又稱為插補技術,就是使用其他樣本的值所估計出的數值來填補遺漏值,在這裡會介紹一個有名的套件scikit-learn,它是個免費的機器學習套件,我們今天只會使用裡面的補值功能,範例如下
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
# 載入scikit-learn
# from sklearn.preprocessing import Imputer
from sklearn.impute import SimpleImputer
if __name__ == "__main__":
data = pd.read_csv("./temp.csv")
arg = np.array(data["temp"])
arg = arg.reshape([-1, 1])
# 平均插補
imr = SimpleImputer(missing_values=np.nan, strategy='mean')
imr = imr.fit(arg)
imputed_data = imr.transform(arg)
data["mean_imputed_data"] = imputed_data
# 中位數插補
imr = SimpleImputer(missing_values=np.nan, strategy='median')
imr = imr.fit(arg)
imputed_data = imr.transform(arg)
data["median_imputed_data"] = imputed_data
# 眾數插補
imr = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
imr = imr.fit(arg)
imputed_data = imr.transform(arg)
data["most_frequent_imputed_data"] = imputed_data
data.to_csv("./OK.csv")
各位可以發現補是補回來了,但是效果欠佳,補值不準確是因為拿來推估缺值的樣本太多了,舉個例子,其實要推算現在的溫度,我們大概只需要使用過去半小時的溫度就能夠大概估計現在溫室是幾度了,為了估計現在的溫度還使用過去兩三天的資料,實在是大費周章,而且上個禮拜寒流來,豈不是會對現在要估測的數值造成拉低的影響嘛?簡而言之,我們需要縮小樣本數,僅保留對現在有估測意義的數值即可,這個方式我們會在明天做分享