news 2026/1/12 17:21:31

如何处理时间序列缺失数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何处理时间序列缺失数据

原文:towardsdatascience.com/how-to-handle-time-series-missing-data-d45e9aaae72c


简介

数据收集中的问题可能导致缺失数据。这个问题可能由于各种原因出现,例如传感器维护或传输故障。

缺失数据通常通过数据插补策略来解决,例如用中心统计量替换缺失值。对于时间序列,插补过程更具挑战性,因为观测值是有序的。此外,选择考虑导致缺失数据机制的策略可能是有用的。

在这篇文章中,你将了解时间序列缺失数据的主要模式以及如何处理它们。


缺失数据的原因及其重要性

缺失数据的模式,例如它们的频率,取决于导致缺失的机制。

通常,缺失数据的原因可以分为以下几类:

  • 完全随机缺失:当没有导致观测值缺失的系统过程。因此,缺失与 1)观测值的值和 2)过去或未来的值以及这些值是否也缺失无关。许多例子属于这一类别,例如随机传感器故障或传输过程中的数据损坏。

  • 随机缺失:当缺失值与序列中的其他值相关,尽管与该值本身无关(即,如果它高或低)。一个例子是当设备因维护而关闭时,传感器会停止传输数据一段时间,这段时间跨越了几个观测值。

  • 非随机缺失:缺失观测值取决于其值,它也可以取决于其他变量或观测值。例如,温度传感器在极端高温条件下会失效。

了解导致缺失数据的机制可以帮助你选择合适的插补策略。这可以提高模型和分析的稳健性。


如何在时间序列中处理缺失数据

在深入研究处理缺失值的不同方法之前,让我们准备一个时间序列来运行一些示例:

importnumpyasnpfromdatasetsforecast.m3importM3# loading a time series from M3dataset,*_=M3.load('./data','Quarterly')series=dataset.query(f'unique_id=="Q1"')# simulating some missing values## in this case, completely at randomseries_with_nan=series.copy()n=len(series)na_size=int(0.3*n)idx=np.random.choice(a=range(n),size=na_size,replace=False)series_with_nan[idx]=np.nan

在前面的代码中,我们使用datasetsforecast库加载一个时间序列。然后,我们删除一些观测值来模拟缺失数据。在这种情况下,我们完全随机地删除观测值。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f748d3b3730fa8d5a2eaa3c14fade2ad.png

时间序列中的缺失数据。图片由作者提供

让我们了解一些处理缺失值的方法。

前向和后向传播

向前填充是一种简单的插补策略,它依赖于时间序列的顺序性。它通过使用最近的已知观测值来填充缺失值。

# forward propagationseries_with_nan.ffill()

向后填充是一个类似的方法,但使用下一个非缺失观测值来填充缺失值。

# backward propagationseries_with_nan.bfill()

前向版本更可取,以避免数据泄露,因为它不引入未来信息。

如果您的序列包含季节性部分,您也可以尝试使用同一季节的已知值。或者,在填充缺失值之前分解序列。

如果缺失与未观察到的值相关,则前向或后向填充可能会引入偏差。也就是说,当缺失数据机制为非随机缺失时。

通常,如果您可以使用过去和未来的数据,插补效果最佳。以下是一些示例,但您应谨慎,不要通过使用未来信息引入偏差或数据泄露。

使用平均值进行插补

对于时间序列和其他类型的数据,一种简单的插补技术是计算平均值。

series_with_nan.fillna(series_with_nan.mean())

在处理时间序列时,通常避免使用平均值插补,因为时间方面被忽略了。此外,还存在一个隐含的平稳性假设,可能无法满足。

您可以通过使用移动平均来减轻此方法的局限性。以下是一个示例:

series_with_nan.fillna(series_with_nan.rolling(window=5,min_periods=1).mean()).plot()

移动平均通过考虑几个附近的数据点来计算平均值,更好地适应变化。然而,如果数据不是随机缺失,它仍然可能导致偏差。

插值

您可以使用插值来插补缺失数据。插值方法旨在估计介于已知值之间的观测值的值。

线性插值方法通过假设观测点之间存在线性关系,并据此绘制直线来实现。以下是它是如何用于时间序列插补的:

series_with_nan.interpolate(method='linear')

除了线性插值之外,还有其他插值方法,例如多项式曲线或样条。

series_with_nan.interpolate(method='polynomial',order=2)series_with_nan.interpolate(method='spline')

您可以从 pandas 的插值方法文档中探索插值方法的列表。

插值是填充时间序列中缺失值的有效方法。如果时间序列相对平滑,效果最佳。如果存在突然变化或异常值,则简单的向前填充可能是一个更好的选择。

下图展示了上述方法中的一些应用到示例时间序列中的应用。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/64bafedc257b75087bba1019c1ddf983.png

不同插补方法之间的比较。图由作者提供。

除了插补之外,您还可以考虑删除缺失值。

删除缺失数据

删除不完整观测值是处理缺失数据的一个简单解决方案。

如果样本量足够大,以至于没有显著的信息损失,删除缺失值可能是一个合理的选项。您需要确保删除缺失数据不会引入某种选择偏差。再次强调,在数据不是随机缺失的情况下。

让我们看看一个例子,其中我们在构建预测模型之前,将缺失值作为预处理步骤的一部分删除。首先,我们使用滑动窗口将时间序列转换为表格格式:

# transforming time series using a sliding windowdf=series_as_supervised(series_with_nan,n_lags=5,horizon=1)# dropping instances with missing valuesdf.dropna()

在前面的代码中,我们使用 dropna 删除包含至少一个缺失值的任何时间步。

这里是一个数据集的样本,包含和不含缺失数据:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a62ee8292fd9b1a100406be4b6cf53e0.png

转换后的时间序列样本,包含和不含缺失数据。图片由作者提供。

您可以阅读之前的文章了解更多关于为监督学习转换时间序列的信息。


要点

缺失数据困扰着所有类型的数据集,包括时间序列。这个问题可能由不同的因素引起,这些因素可能是随机的,也可能不是。

在选择处理缺失值的策略时,应考虑导致缺失数据的机制。在本文中,我们概述了几种插补方法,例如:

  • 前向或后向填充

  • 平均插补

  • 插值

我们还探讨了何时删除缺失值可以是一个合理的解决方案,以及如何进行操作。

感谢您的阅读,我们下次故事再见。


代码

  • 缺失数据笔记本

参考文献

  • Moritz, Steffen, 和 Thomas Bartz-Beielstein. “imputeTS: time series missing value imputation in R.” R J. 9.1 (2017): 207.

  • Jamshidian, Mortaza, Siavash Jala Jalal, 和 Camden Jansen. “MissMech: An R package for testing homoscedasticity, multivariate normality, and missing completely at random (MCAR).”《统计软件杂志》56.6 (2014): 1–31.

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/25 2:25:07

RS485和RS232在STM32上的应用实战案例

从调试到组网:STM32上的RS232与RS485实战全解析 在工业现场,你是否遇到过这样的场景?设备之间距离几十米,信号干扰严重,数据时断时续;或者调试阶段串口输出乱码,换根线就好了——背后往往就是通…

作者头像 李华
网站建设 2026/1/4 9:17:10

从零实现:通过元件对照表添加自定义IC模型(Proteus 8.9)

手把手教你用元件对照表在 Proteus 8.9 中添加自定义 IC 模型你有没有遇到过这种情况:手头正在设计一款基于新型传感器的嵌入式系统,原理图画得差不多了,准备仿真验证功能时却发现——Proteus 根本找不到这个芯片?别慌。这不是你的…

作者头像 李华
网站建设 2025/12/25 2:22:33

GPT-SoVITS在虚拟偶像领域的应用前景分析

GPT-SoVITS在虚拟偶像领域的应用前景分析 在一场虚拟演唱会的直播中,观众几乎无法分辨舞台上那位“歌姬”是真人还是AI——她不仅拥有细腻动人的声线,还能实时回应弹幕提问,语调自然、情感充沛。这背后,正是以GPT-SoVITS为代表的少…

作者头像 李华
网站建设 2025/12/25 2:22:21

用GPT-SoVITS打造专属语音助手,仅需少量音频数据即可完成

用GPT-SoVITS打造专属语音助手,仅需少量音频数据即可完成 在智能语音产品日益普及的今天,你是否曾想过——只需一段一分钟的录音,就能训练出一个“声音分身”,让它替你朗读文章、播报消息,甚至扮演你的虚拟形象与人对话…

作者头像 李华
网站建设 2025/12/30 21:30:39

语音克隆还能这么玩?GPT-SoVITS带你体验AI声线定制

语音克隆还能这么玩?GPT-SoVITS带你体验AI声线定制 在短视频、虚拟偶像和个性化内容爆发的今天,一个让人“耳熟”的声音可能比一张脸更具辨识度。你有没有想过,只需一段几十秒的录音,就能让AI完美复刻你的声线,替你说出…

作者头像 李华
网站建设 2025/12/25 2:20:39

Proteus8.9下载安装教程:从零实现仿真环境搭建全流程

从零搭建Proteus仿真环境:一次搞定8.9版本安装与实战配置 你是不是也遇到过这样的情况?想做个单片机实验,却发现手头没有开发板;或者电路刚焊好,通电就冒烟……别急,在动手之前,完全可以用仿真…

作者头像 李华