news 2026/4/18 9:18:56

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

作者头像

张小明

前端开发工程师

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/4/15 9:00:04

python榆林特色旅游纪念品商城网站的设计与实现_8f7p0_pycharm django vue flask

目录 已开发项目效果实现截图开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 已开发项目效果实现截图 同行可拿货,招校园代理 python榆林特色旅游纪念品商城网站的设计与实现_8f7p0_pych…

作者头像 李华
网站建设 2026/4/17 18:40:28

24、Git 合并操作与支持文件使用指南

Git 合并操作与支持文件使用指南 1. Git 交互式变基中的编辑提交 在 Git 的交互式变基中,编辑操作是一个强大的功能。当交互式变基执行到编辑操作并停止时,你可以在本地进行任何所需的更改,比如编辑或添加文件,然后将这些更改添加到暂存区。接着,你可以使用带有 --amen…

作者头像 李华
网站建设 2026/4/18 5:32:33

如何在机器学习项目中处理不平衡数据集

原文:towardsdatascience.com/how-to-handle-imbalanced-datasets-in-machine-learning-projects-a95fa2cd491a 想象一下,你已经训练了一个准确率高达 0.9 的预测模型。像精确度、召回率和 f1 分数这样的评估指标也看起来很有希望。但你的经验和直觉告诉…

作者头像 李华
网站建设 2026/4/18 3:58:08

3、C 入门:“Hello World” 程序详解

C# 入门:“Hello World” 程序详解 1. 类、对象和类型基础 在 C# 中,类型通常由类来定义,类的单个实例被称为对象。虽然 C# 中除了类还有其他类型,如枚举、结构体和委托,但这里我们主要关注类。 “Hello World” 程…

作者头像 李华
网站建设 2026/4/17 19:29:44

Go 性能分析的“新范式”:用关键路径分析破解高并发延迟谜题

大家好,我是Tony Bai。“如果你喜欢快速的软件,那么你来对地方了。”在 GopherCon 2025 上,来自 Datadog 的工程师、Go Performance and diagnostics小组成员 Felix Geisendrfer 以这样一句开场白,将我们带入了一个 Go 性能分析的…

作者头像 李华