#14 补值教学

今天要来解决空缺的部份,我们要使用的素材如下,是一张每隔五分钟就纪录温度的资料表,我结图整张表最上面的一小部份,可以看出表中有几格空缺

解决空缺的部份有许多手段,有些会把当笔资料直接删除,更极端一点有整栏删除的这种作法,这种好处是可以最大的保留资料原始性跟真实度,不过在时间序列分析是很少采用这种方式的,因为时间序列必须确保时间的连续性,所以比起删除有问题的资料,我们更常使用填补遗漏值这种方这种方式,又称为插补技术,就是使用其他样本的值所估计出的数值来填补遗漏值,在这里会介绍一个有名的套件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")


<<:  IT铁人DAY 14-Decorator 装饰者模式

>>:  Day 14 - 函数与物件互动 - 制作蜜蜂靠近花朵

Day12 - [丰收款] 为BackendURL中收到PayToken铺路,Django来了。

昨天遇到的找不到情境被触发ReturnURL,由於测试环境Message中解开的两个网址:WebAt...

[Day12] Flutter - 场景路径与转换 ( Auto Router )

前言 Hi, 我是鱼板伯爵今天要教大家 Auto Router 这个套件,教学内容只会撷取片段程序码...

用html和css做出网页的标题栏

今天来说如何用html和css做出网页上方的标题栏,就像iT邦帮忙网页中蓝色的那栏 首先我们新增一个...

[Day 27] Final Project (3/5) — 让 App 在本机端运行

Prerequisites 为了让接下来的步骤可以顺利进行,我们首先要完成以下的前置作业,但因为每个...

Day4:Coroutine 的四大特点

在前一篇文章中,我们完成了一个 Coroutine 的程序,并且在最後我们发现了两个特点: 用 Co...