首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >平滑时间序列数据,别再用移动平均线了

平滑时间序列数据,别再用移动平均线了

作者头像
数据STUDIO
发布于 2024-08-01 01:02:45
发布于 2024-08-01 01:02:45
65400
代码可运行
举报
文章被收录于专栏:数据STUDIO数据STUDIO
运行总次数:0
代码可运行
在分析时间序列数据时,去除噪声平滑数据是非常重要的一步,因为噪声会掩盖真实的数据趋势。目前最流行的两种平滑技术是移动平均线和Savitzky-Golay滤波器。虽然移动平均线一直是快速平滑数据的首选方法,但Savitzky-Golay滤波器通常能够更准确地反映数据的真实趋势。

本文将解释为什么Savitzky-Golay滤波器能够比移动平均线更好地平滑时间序列数据,并附带Python代码示例。

时间序列平滑的本质

想象你正在分析传感器数据或股票价格数据,原始数据由于噪声的存在,其起伏波动很大,就像过山车一样。平滑的目的就是抑制这些波动噪声,从而发现潜在的真实数据趋势信号。

加载时间序列数据

我们首先需要导入必要的Python库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
from scipy.signal import savgol_filter
import plotly.express as px
from statsforecast import StatsForecast
train = pd.read_csv('https://auto-arima-results.s3.amazonaws.com/M4-Hourly.csv')
test = pd.read_csv('https://auto-arima-results.s3.amazonaws.com/M4-Hourly-test.csv').rename(columns={'y': 'y_test'})
uid = np.array(['H386'])
df_train = train.query('unique_id in @uid')
df_test = test.query('unique_id in @uid')
StatsForecast.plot(df_train, df_test, plot_random = False, engine='plotly')

该时间序列取自 M4 竞赛数据集,我选择这个是因为它具有重复性(季节性)但不平滑的行为

平滑时间序列

平滑窗口大小的重要性

在平滑时间序列数据时,"窗口大小"是一个非常重要的参数,它决定了在任意给定点附近,我们考虑多大范围的数据来进行平滑。这就好比相机镜头的光圈大小 - 光圈越大,捕获的图像画面就越多,从而影响最终图像的清晰度和细节程度。

对于移动平均线来说,窗口大小定义了计算某个平滑点时,需要平均多少个相邻数据点。而对于Savitzky-Golay滤波器,除了能平均数据点外,它还可以将多项式拟合到窗口内的数据,从而在平滑和保留数据细节之间取得平衡。如果你对 Savitzky-Golay 滤波器的详细信息感兴趣,可以阅读: https://inst.eecs.berkeley.edu/~ee123/sp16/docs/SGFilter.pdf。代码如下:

因此,窗口大小对于平滑的效果有着重大影响。选择一个合适的窗口大小是使用这些平滑技术的关键所在。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
computed_features = [] # 我稍后需要此列表来绘制 window_size 在 [ 10 , 25 ] 中的平for window_size in [10, 25]:
  df_train.loc[:,f'moving_average_{window_size}'] = df_train['y'].rolling(window=window_size, , center=True).mean()
  df_train.loc[:,f'savgol_filter_{window_size}'] = savgol_filter(df_train['y'], window_size, 2)
  computed_features.append(f'moving_average_{window_size}')
  computed_features.append(f'savgol_filter_{window_size}')

我们计算了原始时间序列的总共 4 个平滑版本,使用窗口大小 10 和 25。

窗口大小为 10

现在让我们看看第一个窗口大小与原始时间序列的结果对比。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fig = px.line(df_train[df_train.ds>500], x='ds', y=['y'] + computed_features[:2], title='Different moving average estimators',
              labels={'Value': 'y', 'Date': 'Date'},
              line_shape='linear')

# Improve layout
fig.update_layout(
    xaxis_title='Date',
    yaxis_title='Sensor Value',
    hovermode='x'
)

fig.show()

使用 Savitzky-Golay 滤波器和移动平均线(窗口大小为 10)的原始和平滑时间序列

移动平均线的缺陷

移动平均线虽然简单,但它存在一些明显的缺陷。首先,它对数据变化的反应相对滞后。当数据趋势发生改变时,移动平均线往往无法及时跟上。

另外,移动平均线在计算时,对窗口内所有数据点的重视程度是完全一样的,忽视了它们之间的细微差别和相关性。

相比之下,Savitzky-Golay滤波器利用最小二乘法,将低阶多项式拟合到局部相邻数据点上,从而能更好地保留原始数据的形状和特征,包括峰值和谷值等重要细节。这些细节在使用移动平均线时可能会被过度平滑掉。

如下图所示,随着窗口大小的增加,Savitzky-Golay滤波器能通过预测峰值的方式,更好地捕捉数据的变化趋势,而移动平均线则往往无法做到这一点。

因此,尽管移动平均线简单易用,但它反应迟钝且容易失去数据细节,这就是它的致命缺陷所在。

窗口大小为 25

正如我们在上图中看到的,Savitzky-Golay 滤波器仍然报告了峰值,这可能是我们想要消除它们的情况。所以让我们看看增加窗口大小是否能得到这个结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fig = px.line(df_train[df_train.ds>500], x='ds', y=['y'] + computed_features[2:4], title='Different moving average estimators',
              labels={'Value': 'y', 'Date': 'Date'},
              line_shape='linear')

# Improve layout
fig.update_layout(
    xaxis_title='Date',
    yaxis_title='Sensor Value',
    hovermode='x'
)

fig.show()

使用 Savitzky-Golay 滤波器和移动平均线(窗口大小为 25)的原始和平滑时间序列

在这里,Savitzky-Golay 滤波器非常出色地捕捉了时间序列的季节性,没有延迟,并消除了尖峰,而移动平均线将所有注意力集中在长期平均值上,丢失了信号中包含的许多信息。

结论

总体而言,当窗口大小适当调整时,Savitzky-Golay 滤波器倾向于保持更高的信号保真度,同时消除不必要的尖峰。无论如何,移动平均线仍然可以用于计算时间序列的平均值,即使通过扩大 Savitzky-Golay 滤波器的窗口大小可以获得相同的结果(并且可能具有更好的精度),但如果有兴趣捕捉过程围绕的底层平均值,则可以评估使用它。但对于大多数平滑用例,Savitzky-Golay 滤波器的表现要好得多。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据STUDIO 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python时间序列平滑技术完全指南:6种主流方法原理与实战应用
在时间序列数据分析中,噪声问题是不可避免的挑战。即使在信号质量良好的情况下,原始数据仍可能包含各种干扰因素。这些噪声可能来源于传感器硬件缺陷、人工测量过程中的随机误差,或者数据本身固有的统计波动特性,这些因素都会对有效趋势信息的提取造成显著影响。
deephub
2025/08/20
310
Python时间序列平滑技术完全指南:6种主流方法原理与实战应用
数据平滑9大妙招
对数据进行平滑处理的方法有很多种,具体的选择取决于数据的性质和处理的目的。今天给大家分享9大常见数据平滑方法:
皮大大
2023/10/13
4.8K0
【6】python生成数据曲线平滑处理——(Savitzky-Golay 滤波器、convolve滑动平均滤波)方法介绍,推荐玩强化学习的小伙伴收藏
 由于高频某些点的波动导致高频曲线非常难看,为了降低噪声干扰,需要对曲线做平滑处理,让曲线过渡更平滑,可以看出经过平滑处理后更明显去除噪声且更加美观。
汀丶人工智能
2022/12/21
4.1K0
【6】python生成数据曲线平滑处理——(Savitzky-Golay 滤波器、convolve滑动平均滤波)方法介绍,推荐玩强化学习的小伙伴收藏
时间序列异常检测的方法总结
时间序列数据是按一定时间间隔记录的一系列观测结果。它经常在金融、天气预报、股票市场分析等各个领域遇到。分析时间序列数据可以提供有价值的见解,并有助于做出明智的决策。
算法进阶
2023/08/28
2K0
时间序列异常检测的方法总结
最全总结【时间序列】时间序列的预处理和特征工程
时间序列(Time Series)是按时间顺序排列的一组数据点,通常用于描述和分析随时间变化的现象。时间序列数据在许多领域中都有广泛应用,如金融市场、气象学、经济学、医学等。
机器学习司猫白
2025/01/21
1.8K0
最全总结【时间序列】时间序列的预处理和特征工程
使用Transformer 模型进行时间序列预测的Pytorch代码示例
时间序列预测是一个经久不衰的主题,受自然语言处理领域的成功启发,transformer模型也在时间序列预测有了很大的发展。本文可以作为学习使用Transformer 模型的时间序列预测的一个起点。
deephub
2024/01/29
1.5K1
使用Transformer 模型进行时间序列预测的Pytorch代码示例
使用TensorFlow.js进行时间序列预测
机器学习现在越来越受欢迎,越来越多的世界人口认为它是一个神奇的水晶球:预测未来何时以及将会发生什么。该实验使用人工神经网络揭示股市趋势,并展示时间序列预测根据过去的历史数据预测未来股票价格的能力。
代码医生工作室
2019/06/22
2K0
【年度系列】使用LSTM预测股票市场基于Tensorflow
在本文开始前,作者并没有提倡LSTM是一种高度可靠的模型,它可以很好地利用股票数据中的内在模式,或者可以在没有任何人参与的情况下使用。写这篇文章,纯粹是出于对机器学习的热爱。在我看来,该模型已经观察到了数据中的某些模式,因此它可以在大多数时候正确预测股票的走势。但是,这个模型是否可以用于实际,有待用更多回测和实践去验证。
量化投资与机器学习微信公众号
2018/10/25
2K0
【年度系列】使用LSTM预测股票市场基于Tensorflow
基于趋势和季节性的时间序列预测
时间序列预测是基于时间数据进行预测的任务。它包括建立模型来进行观测,并在诸如天气、工程、经济、金融或商业预测等应用中推动未来的决策。
deephub
2022/11/11
1.4K0
基于趋势和季节性的时间序列预测
PyTimeTK: 一个简单有效的时间序列分析库
时间序列分析是数据科学的重要组成部分,特别是在金融、经济、天气预报等领域。它包括分析随时间收集或索引的数据点,以确定趋势、周期或季节变化。由于时间序列数据的复杂性所以分析时间序列需要复杂统计方法,我最近在Github上发现了一个刚刚发布不久的Python时间工具包PyTimeTK ,它可以帮我们简化时间序列分析的很多步骤。
deephub
2024/03/01
3270
PyTimeTK: 一个简单有效的时间序列分析库
使用2D卷积技术进行时间序列预测
在这个项目中使用的数据是来自北卡罗来纳州夏洛特分校的全球能源预测竞赛的数据。您可以在这里找到更多信息:http://www.drhongtao.com/gefcom/2017
deephub
2020/09/14
7800
Google earth engine——SG滤波算法更新了
SG滤波(Savitzky-Golay滤波)是一种常用的数字信号处理技术,用于平滑数据和降低噪音。它是一种线性滤波方法,通过在局部区域内拟合多项式来对数据进行平滑处理。
此星光明
2024/04/15
7250
多窗口大小和Ticker分组的Pandas滚动平均值
最近一个学弟在在进行数据分析时,经常需要计算不同时间窗口的滚动平均线。当数据是多维度的,比如包含多个股票或商品的每日价格时,我们可能需要为每个维度计算滚动平均线。然而,如果我们使用传统的groupby和apply方法,可能会遇到一些问题。而且也是常见得问题。
华科云商小徐
2024/01/24
5260
时间序列平滑法中边缘数据的处理技术
金融市场的时间序列数据是出了名的杂乱,并且很难处理。这也是为什么人们都对金融数学领域如此有趣的部分原因!
deephub
2022/11/11
1.4K0
时间序列平滑法中边缘数据的处理技术
Python中TensorFlow的长短期记忆神经网络(LSTM)、指数移动平均法预测股票市场和可视化|附代码数据
本文探索Python中的长短期记忆(LSTM)网络,以及如何使用它们来进行股市预测
拓端
2023/01/30
1.3K0
Python中TensorFlow的长短期记忆神经网络(LSTM)、指数移动平均法预测股票市场和可视化|附代码数据
本文探索Python中的长短期记忆(LSTM)网络,以及如何使用它们来进行股市预测 ( 点击文末“阅读原文”获取完整代码数据******** )。
拓端
2023/05/18
7162
独家 | Python时间序列分析:一项基于案例的全面指南
作者: Selva Prabhakaran 翻译:陈超校对:王可汗 本文约7500字,建议阅读20+分钟本文介绍了时间序列的定义、特征并结合实例给出了时间序列在Python中评价指标和方法。
数据派THU
2021/07/16
3.4K0
基于树模型的时间序列预测实战
现在,我们将了解一个与经典ARIMA时间序列建模不同的新领域。在监督学习模型中,仅仅使用单变量时间序列似乎信息有限,预测也比较困难。因此,为了生成足够的特征,我们需要采取一些方法,例如创建大量的滞后变量。此外,关于预测目标值,我们需要用过去的项来预测未来的项,而且需要决定是一步领先还是多步领先。
数据STUDIO
2024/04/18
6170
基于树模型的时间序列预测实战
使用TensorFlow和深度混合学习进行时间序列预测
在本文中,我们将看到深度混合学习如何应用于时间序列数据,以及它是否与图像数据一样有效。
deephub
2021/01/12
1.3K0
使用TensorFlow和深度混合学习进行时间序列预测
探索XGBoost:时间序列数据建模
XGBoost是一种强大的机器学习算法,广泛应用于各种领域的数据建模任务中。但是,在处理时间序列数据时,需要特别注意数据的特点和模型的选择。本教程将深入探讨如何在Python中使用XGBoost建模时间序列数据,包括数据准备、特征工程和模型训练等方面,并提供相应的代码示例。
Echo_Wish
2024/02/12
8680
推荐阅读
相关推荐
Python时间序列平滑技术完全指南:6种主流方法原理与实战应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档