用傅里叶变换解码时间序列:从频域视角解析季节性模式

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 本文介绍了如何使用傅里叶变换和周期图分析来识别时间序列中的季节性模式,特别是在能源消耗数据中。通过Python实现傅里叶变换和周期图,可以有效提取并量化时间序列中的主要和次要频率成分,克服传统可视化分析的局限性。这对于准确捕捉时间序列中的季节性变化具有重要意义。文章以AEP能源消耗数据为例,展示了如何应用这些方法识别日、周、半年等周期模式。

在众多时间序列模型中,SARIMA(seasonal autoregressive integrated moving average,季节性自回归积分滑动平均模型)能够有效处理时间序列中的季节性成分。但是在实际应用中,如何准确识别和提取这些季节性模式一直是一个挑战。

传统上,识别季节性模式往往依赖于数据的可视化分析。但是我们可以使用傅里叶变换以及周期图(Periodogram)这一强大工具,用一种更系统的方法来解决这个问题。

本文将详细介绍一些基础但重要的概念,这些方法对于每位研究时间序列的数据科学家都具有实用价值。

  1. 傅里叶变换的基本原理
  2. Python实现傅里叶变换
  3. 周期图分析方法

问题概述

我们以AEP(American Electric Power)能源消耗数据集为例(数据集使用CC0许可):

 importpandasaspd
 importmatplotlib.pyplotasplt

 df=pd.read_csv("data/AEP_hourly.csv", index_col=0)
 df.index=pd.to_datetime(df.index)
 df.sort_index(inplace=True)

 fig, ax=plt.subplots(figsize=(20,4))
 df.plot(ax=ax)
 plt.tight_layout()
 plt.show()

从数据的初步可视化中可以明显观察到季节性模式的存在,但要精确捕获所有这些模式并非易事。

传统的手动分析方法通常需要多个时间尺度的可视化,如下所示:

 fig, ax=plt.subplots(3, 1, figsize=(20,9))

 df_3y=df[(df.index>='2006–01–01') & (df.index<'2010–01–01')]
 df_3M=df[(df.index>='2006–01–01') & (df.index<'2006–04–01')]
 df_7d=df[(df.index>='2006–01–01') & (df.index<'2006–01–08')]

 ax[0].set_title('AEP energy consumption 3Y')
 df_3y[['AEP_MW']].groupby(pd.Grouper(freq='D')).sum().plot(ax=ax[0])
 fordateindf_3y[[Trueifx% (24*365.25/2) ==0elseFalseforxinrange(len(df_3y))]].index.tolist():
     ax[0].axvline(date, color='r', alpha=0.5)

 ax[1].set_title('AEP energy consumption 3M')
 df_3M[['AEP_MW']].plot(ax=ax[1])
 fordateindf_3M[[Trueifx% (24*7) ==0elseFalseforxinrange(len(df_3M))]].index.tolist():
     ax[1].axvline(date, color='r', alpha=0.5)

 ax[2].set_title('AEP energy consumption 7D')
 df_7d[['AEP_MW']].plot(ax=ax[2])
 fordateindf_7d[[Trueifx%24==0elseFalseforxinrange(len(df_7d))]].index.tolist():
     ax[2].axvline(date, color='r', alpha=0.5)

 plt.tight_layout()
 plt.show()

不同时间尺度下的AEP能源消耗模式

通过多尺度分析,我们可以观察到以下主要周期:

  • 半年度周期(约180天)
  • 周度周期(7天)
  • 日度周期(24小时)

虽然对于能源消耗数据而言,这些季节性模式可以通过领域知识推断,但仅依靠人工检查存在以下局限性:

  • 主观性:容易忽略不明显的模式
  • 低效率:需要逐一检查不同时间窗口
  • 扩展性差:难以应用于大规模数据分析

作为数据科学家,我们需要一个能够快速、准确识别时间序列中关键频率的工具。这正是傅里叶变换发挥作用的地方。

1、傅里叶变换的基本原理

傅里叶变换是一种将信号从时域转换到频域的数学工具。在时域中,我们观察数据随时间的变化;而在频域中,我们可以看到构成信号的各个频率及其相对重要性。

根据傅里叶理论,任何满足一定条件的函数f(x)都可以表示为不同频率、振幅和相位的正弦函数的叠加。换言之,每个时间序列都可以分解为一系列基本波形的组合

其中:

  • F(f)表示频域中的函数
  • f(x)表示时域中的原始函数
  • exp(-i2πf(x))是复指数函数,用作频率分析器

函数F(f)的值表明频率f在原始信号中的贡献程度。

考虑一个由三个不同频率(2Hz、3Hz和5Hz)的正弦波组成的复合信号:

应用傅里叶变换后,我们可以提取这些基本频率:

频域表示清晰地显示出信号中存在的三个基本频率(2Hz、3Hz和5Hz)。将信号分解为基本波形:

原始信号(蓝色)是三个基本波形(红色)的叠加。这种分解方法可以应用于任何时间序列,用于识别其主要频率成分。

2、Python中的傅里叶变换实现

现在我们将这个理论应用到之前的AEP能源消耗数据中。

Python的numpy.fft模块提供了计算离散信号傅里叶变换的工具。FFT(快速傅里叶变换)是一种高效的算法,用于将离散信号分解为频率成分:

 fromnumpyimportfft

 X=fft.fft(df['AEP_MW'])
 N=len(X)
 frequencies=fft.fftfreq(N, 1)
 periods=1/frequencies
 fft_magnitude=np.abs(X) /N

 mask=frequencies>=0

 # 绘制傅里叶变换结果
 fig, ax=plt.subplots(figsize=(20, 3))
 ax.step(periods[mask], fft_magnitude[mask]) # 仅绘制正频率
 ax.set_xscale('log')
 ax.xaxis.set_major_formatter('{x:,.0f}')
 ax.set_title('AEP energy consumption - Frequency-Domain')
 ax.set_xlabel('Frequency (Hz)')
 ax.set_ylabel('Magnitude')
 plt.show()

频域可视化显示了某些频率具有较高的幅值,表明这些频率在原始信号中具有重要作用。

3、周期图分析

周期图是信号功率谱密度(Power Spectral Density, PSD)的频域表示。相比简单的傅里叶变换,周期图能更好地量化各频率分量的强度,并且可以有效降低次要频率的噪声影响。

周期图的数学定义为:

其中:

  • P(f)是频率f处的功率谱密度
  • X(f)是信号的傅里叶变换
  • N是样本数量

Python实现如下:

 power_spectrum=np.abs(X)**2/N  # 计算每个频率的功率

 fig, ax=plt.subplots(figsize=(20, 3))
 ax.step(periods[mask], power_spectrum[mask])
 ax.set_title('AEP energy consumption Periodogram')
 ax.set_xscale('log')
 ax.xaxis.set_major_formatter('{x:,.0f}')
 plt.xlabel('Frequency (Hz)')
 plt.ylabel('Power')
 plt.show()

从周期图分析中,我们可以清晰地识别出以下主要频率:

  • 24Hz:对应24小时周期
  • 4,380Hz:对应6个月周期
  • 168Hz:对应每星期

除此之外,还发现了三个次要周期:

  • 12Hz周期
  • 84Hz周期(对应半周)
  • 8,760Hz周期(对应年度周期)

我们也可以使用scipy.signal模块中的periodogram函数获得相同的结果:

 fromscipy.signalimportperiodogram

 frequencies, power_spectrum=periodogram(df['AEP_MW'], return_onesided=False)
 periods=1/frequencies

 fig, ax=plt.subplots(figsize=(20, 3))
 ax.step(periods, power_spectrum)
 ax.set_title('Periodogram')
 ax.set_xscale('log')
 ax.xaxis.set_major_formatter('{x:,.0f}')
 plt.xlabel('Frequency (Hz)')
 plt.ylabel('Power')
 plt.show()

总结

在时间序列分析中,准确识别季节性模式是一个关键任务。本文介绍的周期图分析方法为我们提供了一个系统、高效的工具,可以准确识别时间序列中的各种周期性成分。这种方法不仅克服了传统视觉分析的局限性,还能发现可能被忽略的次要周期模式,为时间序列分析提供了更全面的视角。

https://avoid.overfit.cn/post/e459dbb3b4f8461c9224eefee2672d77

作者:Lorenzo Mezzini

目录
相关文章
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
|
5天前
|
人工智能 搜索推荐 Docker
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
DeepSeek R1 + LobeChat + Ollama:快速本地部署模型,创建个性化 AI 助手
2330 108
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
|
12天前
|
Linux iOS开发 MacOS
deepseek部署的详细步骤和方法,基于Ollama获取顶级推理能力!
DeepSeek基于Ollama部署教程,助你免费获取顶级推理能力。首先访问ollama.com下载并安装适用于macOS、Linux或Windows的Ollama版本。运行Ollama后,在官网搜索“deepseek”,选择适合你电脑配置的模型大小(如1.5b、7b等)。通过终端命令(如ollama run deepseek-r1:1.5b)启动模型,等待下载完成即可开始使用。退出模型时输入/bye。详细步骤如下图所示,轻松打造你的最强大脑。
9078 86
|
1月前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
阿里云与企业共筑容器供应链安全
171373 17
|
1月前
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
随着云计算和DevOps的兴起,容器技术和自动化在软件开发中扮演着愈发重要的角色,但也带来了新的安全挑战。阿里云针对这些挑战,组织了一场关于云上安全的深度访谈,邀请了内部专家穆寰、匡大虎和黄竹刚,深入探讨了容器安全与软件供应链安全的关系,分析了当前的安全隐患及应对策略,并介绍了阿里云提供的安全解决方案,包括容器镜像服务ACR、容器服务ACK、网格服务ASM等,旨在帮助企业构建涵盖整个软件开发生命周期的安全防护体系。通过加强基础设施安全性、技术创新以及倡导协同安全理念,阿里云致力于与客户共同建设更加安全可靠的软件供应链环境。
150312 32
|
3天前
|
人工智能 自然语言处理 JavaScript
宜搭上新,DeepSeek 插件来了!
钉钉宜搭近日上线了DeepSeek插件,无需编写复杂代码,普通用户也能轻松调用强大的AI大模型能力。安装后,平台新增「AI生成」组件,支持创意内容生成、JS代码编译、工作汇报等场景,大幅提升工作效率。快来体验这一高效智能的办公方式吧!
1155 5
|
4天前
|
API 开发工具 Python
阿里云PAI部署DeepSeek及调用
本文介绍如何在阿里云PAI EAS上部署DeepSeek模型,涵盖7B模型的部署、SDK和API调用。7B模型只需一张A10显卡,部署时间约10分钟。文章详细展示了模型信息查看、在线调试及通过OpenAI SDK和Python Requests进行调用的步骤,并附有测试结果和参考文档链接。
951 5
阿里云PAI部署DeepSeek及调用
|
5天前
|
机器学习/深度学习 人工智能 并行计算
一文了解火爆的DeepSeek R1 | AIGC
DeepSeek R1是由DeepSeek公司推出的一款基于强化学习的开源推理模型,无需依赖监督微调或人工标注数据。它在数学、代码和自然语言推理任务上表现出色,具备低成本、高效率和多语言支持等优势,广泛应用于教育辅导、金融分析等领域。DeepSeek R1通过长链推理、多语言支持和高效部署等功能,显著提升了复杂任务的推理准确性,并且其创新的群体相对策略优化(GRPO)算法进一步提高了训练效率和稳定性。此外,DeepSeek R1的成本低至OpenAI同类产品的3%左右,为用户提供了更高的性价比。
903 10
|
4天前
|
缓存 自然语言处理 安全
快速调用 Deepseek API!【超详细教程】
Deepseek 强大的功能,在本教程中,将指导您如何获取 DeepSeek API 密钥,并演示如何使用该密钥调用 DeepSeek API 以进行调试。
|
3天前
|
JavaScript 前端开发 API
低代码+阿里云部署版 DeepSeek,10 分钟速成编剧大师
阿里云部署版DeepSeek重磅发布,钉钉宜搭低代码平台已首发适配,推出官方连接器。用户可轻松调用DeepSeek R1、V3及蒸馏系列模型。通过宜搭低代码技术,结合DeepSeek大模型,仅需10分钟即可制作编剧大师应用。
479 19