news 2026/9/3 4:21:04

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

作者头像

张小明

前端开发工程师

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进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 21:37:40

工业自动化中CCS20配置:操作指南

工业自动化中的CCS20配置实战:从入门到高效调试在现代工厂的控制柜里,你可能已经不再只看到一个PLC和几根信号线。取而代之的是复杂的分布式I/O网络、高速PROFINET通信环路,以及与MES系统实时交互的数据流。面对这种复杂度,传统的…

作者头像 李华
网站建设 2026/9/2 21:31:29

15、Drupal主题开发全攻略

Drupal主题开发全攻略 1. 主题调试工具 在图形用户界面中创建可视化表示时,需要一套与编写代码、开发和测试算法不同的调试工具。虽然在主题开发的某些部分仍可使用Visual Studio中的单步调试器,但可能更希望确切了解发送到浏览器的代码类型,以便进行调整,使其符合预期。…

作者头像 李华
网站建设 2026/9/2 22:27:49

如何用GPT-SoVITS生成儿童语音?年龄特征控制技巧分享

如何用 GPT-SoVITS 生成儿童语音?音色与年龄特征的精准控制实战指南 在智能教育、动画配音和儿童陪伴机器人日益普及的今天,一个真实自然、富有“童趣”的 AI 声音,往往能极大提升产品的亲和力与用户体验。然而,大多数现成的文本转…

作者头像 李华
网站建设 2026/9/2 21:37:55

33、Git远程操作与冲突解决全解析

Git远程操作与冲突解决全解析 1. 远程仓库同步与拉取操作 在Git中,当我们从远程仓库获取更新后,需要同步本地分支。通过合并操作,我们可以让本地仓库、本地分支以及工作目录中的文件都拥有来自远程的最新更新。例如,在一次合并前后的本地仓库状态变化如下: origin/mas…

作者头像 李华
网站建设 2026/9/2 21:36:45

38、Git 中工作树、子模块和子树的使用指南

Git 中工作树、子模块和子树的使用指南 在本地环境中管理多个工作区和仓库实例时,Git 提供了多种实用功能,如工作树(Worktrees)、子模块(Submodules)和子树(Subtrees)。下面将详细介绍这些功能的使用方法。 1. 添加子树 在 Git 中添加子项目作为子树,最基本的操作是…

作者头像 李华
网站建设 2026/9/3 2:14:45

基于SEGGER工具链的jscope使用教程核心要点

如何用 jScope 实现嵌入式系统的“软件示波器”级调试? 在调试电机控制算法时,你是否曾为无法实时观察 PID 输出波动而反复插拔示波器探头? 在优化滤波器参数时,是否因串口打印延迟太高而错过关键瞬态响应? 如果你手…

作者头像 李华