(时间)序列数据处理过程中往往会有缺失值(例如9999、NaN或其他的异常值),对这些数据的处理是下一步分析、研究和应用的基础。

  本文以 2018年 MOD09A01 地表反射率数据计算的 8天合成 46期 NDVI 数据为基础(已完成去云处理,有云时段的数据已赋值为 NaN,部分数据做了微调,以符合本文的内容),选取 一个样点(样点经度:123°4′0.87″,纬度:42°56′45.75″),完成时序有云数据(缺失值)的插补。

0 基本思路

#mermaid-svg-pPPj4ag1sPhLvSFs {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-pPPj4ag1sPhLvSFs .error-icon{fill:#552222;}#mermaid-svg-pPPj4ag1sPhLvSFs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pPPj4ag1sPhLvSFs .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-pPPj4ag1sPhLvSFs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pPPj4ag1sPhLvSFs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pPPj4ag1sPhLvSFs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pPPj4ag1sPhLvSFs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pPPj4ag1sPhLvSFs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pPPj4ag1sPhLvSFs .marker.cross{stroke:#333333;}#mermaid-svg-pPPj4ag1sPhLvSFs svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pPPj4ag1sPhLvSFs .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pPPj4ag1sPhLvSFs .cluster-label text{fill:#333;}#mermaid-svg-pPPj4ag1sPhLvSFs .cluster-label span{color:#333;}#mermaid-svg-pPPj4ag1sPhLvSFs .label text,#mermaid-svg-pPPj4ag1sPhLvSFs span{fill:#333;color:#333;}#mermaid-svg-pPPj4ag1sPhLvSFs .node rect,#mermaid-svg-pPPj4ag1sPhLvSFs .node circle,#mermaid-svg-pPPj4ag1sPhLvSFs .node ellipse,#mermaid-svg-pPPj4ag1sPhLvSFs .node polygon,#mermaid-svg-pPPj4ag1sPhLvSFs .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pPPj4ag1sPhLvSFs .node .label{text-align:center;}#mermaid-svg-pPPj4ag1sPhLvSFs .node.clickable{cursor:pointer;}#mermaid-svg-pPPj4ag1sPhLvSFs .arrowheadPath{fill:#333333;}#mermaid-svg-pPPj4ag1sPhLvSFs .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pPPj4ag1sPhLvSFs .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pPPj4ag1sPhLvSFs .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-pPPj4ag1sPhLvSFs .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-pPPj4ag1sPhLvSFs .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pPPj4ag1sPhLvSFs .cluster text{fill:#333;}#mermaid-svg-pPPj4ag1sPhLvSFs .cluster span{color:#333;}#mermaid-svg-pPPj4ag1sPhLvSFs div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pPPj4ag1sPhLvSFs :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

开始
读取时序NDVI数据
标记缺失值
缺失值插补
结束

1 读取数据

  本文的样例数据为EXECL格式,已上传至百度网盘,下载链接如下:

链接:https://pan.baidu.com/s/1PR4MXMIIihRyv_7GQMl9VQ
提取码:ynyv

  目标:将需要插补的原始数据读取为数组。

# 导入库
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 读取原始数据
InFile = r'D:\xxxx\NDVI.xlsx'
Data = pd.read_excel(InFile)['NDVI'].values
print(Data)
[     nan      nan 0.223985 0.233396 0.227466 0.229259      1.2 0.2313990.22672       nan 0.224726 0.212029 0.236226 0.229548 0.236484 0.2488940.266551 0.275269 0.274135 0.270156      nan 0.478553 0.590506 0.721067nan 0.799064 0.742108 0.804224 0.83514  0.777888 0.734315 0.7009150.602857 0.553114 0.397294 0.318083 0.289676 0.253421  0.25891  0.246010.23812  0.238319 0.238759 0.232261 0.253731 0.236231]

  简单做个图,我们看一下原始数据的样式。

# 定义一个横坐标
X = np.array(range(len(Data)))plt.plot(X, Data, color = 'r')

  其中截断的部分是有缺失值的部分(即NaN)。下一步,我们对缺失值进行插值填充。

2 缺失值插补

2.1 标记异常值

  由于NDVI的最大值不可能大于1,则原始数据中 第 7 个值 1.2 明显为异常值。我们将异常值统一标记为缺失值。

Data[6] = np.nan
print(Data)
[     nan      nan 0.223985 0.233396 0.227466 0.229259      nan 0.2313990.22672      nan 0.224726 0.212029 0.236226 0.229548 0.236484 0.2488940.266551 0.275269 0.274135 0.270156      nan 0.478553 0.590506 0.721067nan 0.799064 0.742108 0.804224 0.83514  0.777888 0.734315 0.7009150.602857 0.553114 0.397294 0.318083 0.289676 0.253421  0.25891  0.246010.23812  0.238319 0.238759 0.232261 0.253731 0.236231]

  简单做个图,我们看一下标记完异常值后的结果。

plt.plot(X, Data, color = 'y')

2.2 处理首末端缺失值

  首末端缺失值我们采用最邻近法填充(当然,也可以采用其他方法,这里不做示例)。

# 标记正常数据的位置
ValidDataIndex = X[np.where(np.isnan(Data) == 0)]# 如果最后一个正常数据的序号比序列长度小,则表明最后一个正常数据后存在缺失数据
if ValidDataIndex[-1] < len(Data) - 1: Data[ValidDataIndex[-1] + 1:] = Data[ValidDataIndex[-1]]  # 如果第一个正常数据的序号不是0,则表明第一个正常数据前存在缺失数据
if ValidDataIndex[0] >= 1:Data[:ValidDataIndex[0]] = Data[ValidDataIndex[0]]
print(Data)
[0.223985 0.223985 0.223985 0.233396 0.227466 0.229259      nan 0.2313990.22672       nan 0.224726 0.212029 0.236226 0.229548 0.236484 0.2488940.266551 0.275269 0.274135 0.270156      nan 0.478553 0.590506 0.721067nan 0.799064 0.742108 0.804224 0.83514  0.777888 0.734315 0.7009150.602857 0.553114 0.397294 0.318083 0.289676 0.253421 0.25891  0.246010.23812  0.238319 0.238759 0.232261 0.253731 0.236231]

  简单做个图,我们看一下首末端缺失值处理后的结果。

plt.plot(X, Data, color = 'g')

2.3 缺失值插补

  插值过程我们使用scipy库插值模块的一维插值interp1d方法进行拟合,然后填充缺失值。

# 引入库(方法)
from scipy.interpolate import interp1d

  缺失数据不参与拟合,首先把缺失数据去除,对正常数据进行拟合。

# 步骤1:提取参与拟合的数据(X_0,Y_0)。由于缺失数据不能参与拟合,在拟合前,拟合数据需要先剔除异常值。
Y_0 = Data[np.where(np.isnan(Data) != 1)]
print(Y_0)
[0.223985 0.223985 0.223985 0.233396 0.227466 0.229259 0.231399 0.226720.224726 0.212029 0.236226 0.229548 0.236484 0.248894 0.266551 0.2752690.274135 0.270156 0.478553 0.590506 0.721067 0.799064 0.742108 0.8042240.83514  0.777888 0.734315 0.700915 0.602857 0.553114 0.397294 0.3180830.289676 0.253421 0.25891  0.24601  0.23812  0.238319 0.238759 0.2322610.253731 0.236231]
X_0 = X[np.where(np.isnan(Data) != 1)]
print(X_0)
[ 0  1  2  3  4  5  7  8 10 11 12 13 14 15 16 17 18 19 21 22 23 25 26 2728 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45]

  利用拟合函数,根据缺失数据的标签,拟合缺失位置的数据。

# 步骤2:构造拟合函数,这里使用线性插值('linear')
IRFunction = interp1d(X_0, Y_0, kind = 'linear')# 步骤3:提取缺失值数据的标签值
Fill_X = X[np.where(np.isnan(Data) == 1)]# 步骤4:拟合缺失数据,并用拟合值替换缺失值
Fill_Y = IRFunction(Fill_X)
Data[Fill_X] = Fill_Y print(Data)
[0.223985  0.223985  0.223985  0.233396  0.227466  0.229259  0.2303630.231399  0.22672   0.225723  0.224726  0.212029  0.236226  0.2295480.236484  0.248894  0.266551  0.275269  0.274135  0.270156  0.37435450.478553  0.590506  0.721067  0.7600655 0.799064  0.742108  0.8042240.83514   0.777888  0.734315  0.700915  0.602857  0.553114  0.3972940.318083  0.289676  0.253421  0.25891   0.24601   0.23812   0.2383190.238759  0.232261  0.253731  0.236231 ]

  简单做个图,我们看一下插值结果。

plt.plot(X, Data, color = 'b')

3 利用gma.math.FillNoData进行插补

  gma为自建的一个Python库,并已上传至pypi。详见:自建 | 地理与气象数据分析(geographic and meteorological data analysis)(gma)的说明与使用。欢迎大家下载试用。

  首先查看函数帮助

import gma
help(gma.math.FillNoData)
Help on function FillNoData in module gma.math:FillNoData(Data, FillValue=None, Method='linear', **kwargs)'''简介----------对缺失值或异常值值进行【插补】。参数----------Data: list, tuple, Series, DataFrame。需要插补的数据。**可选参数----------FillValue = number 或 list。标记需要进行插补的缺失值。可为数字(number)或数字列表(list)。默认不标记缺失值(None)。注:1.当 FillValue 为列表时,列表内所有值都将被插补。2.数据内原有的NAN、INF以及不能被转化为数字的字符串等异常值也将被插补。Method = str。插补方法。默认线性插值('linear')。其他的插补方法还包括:'time'(时间), 'index'(索引), 'values'(序列值), 'pad'(前向填充), 'nearest'(最邻近), 'zero'(零值), 'slinear'(滑动线性), 'quadratic'(2次插值), 'cubic'(3次插值), 'spline'(样条函数),'barycentric'(重心), 'polynomial'(分段多项式), 'from_derivatives'(衍生), 'krogh'(克罗格), 'piecewise_polynomial'(分段多项式),'pchip'(分段三次Hermite多项式插值), 'akima'(akima光滑插值), 'cubicspline'(3次样条)。**kwargs。传递给插值函数的其他参数。例如: Method 为 'polynomial' 或 'spline' 需要设置 order(阶数),默认阶数为 3。返回----------类型: Series,DataFrame 返回输入类型;list, tuple 返回 array。'''

  根据帮助说明,我们只需带入原始数据(Data),设置异常值(FillValue)和插值方法(Method)即可获得相应结果。

Data = gma.math.FillNoData(Data, FillValue = 1.2, Method = 'linear')
print(Data)

  插值结果与 < 2 缺失值插补 > 结果一致。

[0.223985  0.223985  0.223985  0.233396  0.227466  0.229259  0.2303290.231399  0.22672   0.225723  0.224726  0.212029  0.236226  0.2295480.236484  0.248894  0.266551  0.275269  0.274135  0.270156  0.37435450.478553  0.590506  0.721067  0.7600655 0.799064  0.742108  0.8042240.83514   0.777888  0.734315  0.700915  0.602857  0.553114  0.3972940.318083  0.289676  0.253421  0.25891   0.24601   0.23812   0.2383190.238759  0.232261  0.253731  0.236231 ]

  简单做个图,我们看一下插值结果。

plt.plot(X, Data, color = 'gray')

4 总结

  本文使用了简单的 interp1d(scipy) 的插值方法(不考虑gma),当然,如果专门做数据处理,其实pandas的interpolate也非常好用。

相关链接:
1、自建 | 地理与气象数据分析(geographic and meteorological data analysis)(gma)的说明与使用
2、自建 | gma库详细帮助
3、自建 | gma库更新日志

序列数据缺失值插补(线性插值)相关推荐

  1. MATLAB数据预处理之缺失值插补

    文章目录 前言 1 加载原始数据 2 查找缺失值并填充缺失值 总结 2021年4月5日09:51:56更新 2021年5月18日10:46:15更新 2022年10月15日07:25:01更新 参考资 ...

  2. python多重插补_5.4 缺失值插补

    5.4 缺失值插补 因为各种各样的原因,真实世界中的许多数据集都包含缺失数据,这类数据经常被编码成空格.NaNs,或者是其他的占位符.但是这样的数据集并不能scikit-learn学习算法兼容,因为大 ...

  3. 应用预测建模第六章线性回归习题6.3【缺失值插补,分层抽样,预测变量重要性,重要预测变量如何影响响应变量,多元线性回归,稳健回归,偏最小二乘回归,岭回归,lasso回归,弹性网】

    模型:多元线性回归,稳健回归,偏最小二乘回归,岭回归,lasso回归,弹性网 语言:R语言 参考书:应用预测建模 Applied Predictive Modeling (2013) by Max K ...

  4. R语言缺失值插补之simputation包

    获取更多R语言和生信知识,请欢迎关注公众号:医学和生信笔记 医学和生信笔记 公众号主要分享:1.医学小知识.肛肠科小知识:2.R语言和Python相关的数据分析.可视化.机器学习等:3.生物信息学学习 ...

  5. 多通道时序数据读取matlab,科学网—卫星时序数据-平滑-插补-MATLAB - 李雷的博文...

    %程序用于平滑处理数据,以及将间隔时间数据插值成每天 clc clear %光学卫星获取的数据存在受云影响的情况,通过滤波的方式将极低或极高等不合理值进行处理(以MODIS中的LAI为例) [a,b] ...

  6. python时间序列缺失值_时间序列数据如何插补缺失值?

    在多元时间序列中,数据缺失的情况十分普遍.最近我在做这方面的literature review,在这里回顾总结一下 . 时间序列缺失值处理方法主要分为三大类: 第一类是直接删除法,该方法可能会舍弃数据 ...

  7. 独家 | 在机器学习中利用统计插补来处理缺失值(附代码)

    作者:Jason Brownlee 翻译:吴振东 校对:冯羽 本文约4500字,建议阅读10分钟 本文以病马数据集为例,帮助你了解在机器学习领域如何利用统计策略来处理缺失值,对代码进行了较为详细的讲解 ...

  8. 数据预处理 第3篇:数据预处理(使用插补法处理缺失值)

    插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...

  9. python 线性回归回归 缺失值 忽略_机器学习 第3篇:数据预处理(使用插补法处理缺失值)...

    插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...

最新文章

  1. ASP.NET Web API 基本操作(CRUD)
  2. 绘制业务流程图:流程图绘制工具
  3. 一行命令同时修改maven项目中多个mudule的版本号
  4. python程序练习题第三章_python核心编程-第三章-习题
  5. 自从Python数据可视化出了这个模块后,数据可视化就再简单不过了
  6. [MyBatisPlus]入门案例
  7. Java 中创建对象方式
  8. JS天气插件(最全)
  9. java保护表格_读密码保护的工作表(版本 - Excel中95,97-2003)的Java
  10. 618“后高考经济”数据:3C数码依旧是毕业季的首选礼品
  11. Google maps API开发(一)(转)
  12. 正则表达式在python中的应用_正则表达式:Python3中的应用简介
  13. 【UVA1339】古老的密码(巧妙思路+(q)sort降序排列的三种方法)
  14. Android记事本定时功能,Android如何实现记事本功能
  15. 墨卡托经纬度坐标转换
  16. C语言统计多个闰年,C语言统计闰年
  17. 《自己动手写cpu》读书笔记
  18. 新买的电脑是win11系统,找不到DirectX工具?教你如何操作打开
  19. cesium实现场景导出图片功能
  20. 【DeepLearning】【环境配置】Ubuntu 下手动调节 Nvidia 显卡风扇转速

热门文章

  1. Mobicents JAIN SLEE
  2. 工程开发之系统设计方案论
  3. debian < iptables >
  4. PT@多维随机变量@联合分布函数@联合分布律@边缘分布律@二维离散型随机变量和分布律
  5. xp,win7,win10系统安装GHO镜像下载
  6. 不同体质的中医养生方法
  7. com.sun.mail.util.MailConnectException: Couldn't connect to host异常解决
  8. Windows 启动命令行的三种方式
  9. Normalization Methods
  10. Datawhale 零基础入门数据挖掘- 建模与调参