iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0

今天要來解決空缺的部份,我們要使用的素材如下,是一張每隔五分鐘就紀錄溫度的資料表,我結圖整張表最上面的一小部份,可以看出表中有幾格空缺

解決空缺的部份有許多手段,有些會把當筆資料直接刪除,更極端一點有整欄刪除的這種作法,這種好處是可以最大的保留資料原始性跟真實度,不過在時間序列分析是很少採用這種方式的,因為時間序列必須確保時間的連續性,所以比起刪除有問題的資料,我們更常使用填補遺漏值這種方這種方式,又稱為插補技術,就是使用其他樣本的值所估計出的數值來填補遺漏值,在這裡會介紹一個有名的套件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")

各位可以發現補是補回來了,但是效果欠佳,補值不準確是因為拿來推估缺值的樣本太多了,我們需要縮小樣本數,僅保留對現在有估測意義的數值即可
說到縮小樣本,就不得不提到鼎鼎大名的KNN演算法,又稱為K-近鄰演算法最近鄰居法,相關理論很複雜,我們先跳過,總而言之就是是用空缺鄰近的數值來推估缺值,以下示範多款比較高端的插值法

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt 


if __name__ == "__main__":
    data = pd.read_csv("./temp.csv")

    # 有些插值法是時間序列專用,所以最好先將索引轉成時間
    data["time"] = pd.to_datetime(data["time"])
    data = data.set_index("time")

    # 線性插值法
    data["linear_imputed"] = data["temp"].interpolate(method="linear")

    # 最近鄰居插值法
    data["nearest_imputed"] = data["temp"].interpolate(method="nearest")

    # 導數插值法
    data["from_derivatives_imputed"] = data["temp"].interpolate(method="from_derivatives")

    # 以下這些方法會使用到索引,請加上一個順序參數,其中多項式跟樣條一定要加
    # 時間插值法,時間序列專用
    data["time_imputed"] = data["temp"].interpolate(method="time", order=10)

    # 線性插值法
    data["slinear_imputed"] = data["temp"].interpolate(method="slinear", order=10)

    # 二次插值法
    data["quadratic’_imputed"] = data["temp"].interpolate(method="quadratic", order=10)

    # 三次插值法
    data["cubic_imputed"] = data["temp"].interpolate(method="cubic", order=10)

    # 零插值法
    data["zero_imputed"] = data["temp"].interpolate(method="zero", order=10)

    # 樣條插值法
    data["spline_imputed"] = data["temp"].interpolate(method="spline", order=2)

    # 多項式插值法
    data["polynomial_imputed"] = data["temp"].interpolate(method="polynomial", order=2)

    data.to_csv("./OK.csv")


上一篇
#13 資料清理教學
下一篇
#15 ARIMA教學
系列文
終極大數據地獄24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言