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

简介: 本文介绍了如何使用傅里叶变换和周期图分析来识别时间序列中的季节性模式,特别是在能源消耗数据中。通过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

目录
相关文章
|
7天前
|
云安全 人工智能 运维
阿里云联动百位企业安全专家,共识Agent防御最佳实践
当Agent成为新员工,你的安全边界在哪里?
1922 6
阿里云联动百位企业安全专家,共识Agent防御最佳实践
|
5天前
|
存储 人工智能 关系型数据库
阿里云AI产品与云产品最新组合套餐:Token Plan、AI coding及云服务器和建站等组合优惠价
阿里云推出全新“算力+模型+应用”一站式云与AI组合套餐活动,覆盖从个人开发者到中大型企业的全场景需求。核心亮点为分三档定价的Token Plan订阅服务,支持Qwen3.8-Max-Preview大模型调用,错峰时段最低可享0.2折优惠。活动同步推出AI Coding、智能体部署、云电脑托管、0代码建站等十余类场景化组合,搭配99元/年的普惠云服务器、88元/年的入门数据库等经典特惠产品,还为企业提供1V1定制化AI转型方案,大幅降低了不同用户群体拥抱AI的技术门槛与采购成本。
652 111
|
15天前
|
人工智能 JSON 安全
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
阿里云AI安全产品联动防御Fastjson攻击
2556 13
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
|
7天前
|
人工智能 弹性计算 数据库
阿里云优惠券种类解析:主要券种区别和适用群体及领取和使用指南
2026年阿里云构建了覆盖全用户的七类优惠券,本文逐一拆解了每类优惠券的核心规则、适用人群与使用技巧:大促限定的阶梯满减券分个人、企业双通道,最高可减800元;学生专属300元无门槛券支持全品类通用;按量付费用户可参与消费达标返券形成循环优惠;新用户有低门槛专享满减券尝鲜;老用户可领取系统自动发放的随机福利券;中大型企业迁云可申请最高100万元的专项补贴;云产品通用券还能在活动价基础上实现折上折。不同身份、不同采购场景的用户均可通过精准匹配对应优惠券,最大化享受优惠力度。
460 110
阿里云优惠券种类解析:主要券种区别和适用群体及领取和使用指南
|
13天前
|
人工智能 前端开发 Linux
Codex 桌面版安装 + CC Switch 接入第三方 API 完整教程(2026 最新)
2026最新教程:手把手教你安装Codex桌面版,通过CC Switch v3.17.0一键接入Fenno等国产API(兼容OpenAI Responses格式),跳过账号登录,完整启用代码审查、多步任务与上下文感知功能。零基础友好,全程图文实操。(239字)
1611 2
|
15天前
|
人工智能 自然语言处理 数据挖掘
Qwen3.8-Max-Preview深度全解析:2.4万亿参数旗舰MoE模型+Token Plan限时优惠完整落地指南
2026年7月,全新旗舰级混合专家大模型Qwen3.8-Max-Preview正式开放抢先体验,作为通义千问Qwen3系列规格最高、综合推理能力顶尖的新一代模型,该模型总参数量达到2.4万亿(2.4T),是当前线上可调用的原生多模态旗舰模型,综合推理水准对标海外顶级Fable 5模型,在复杂工程开发、长文档深度分析、多步骤智能体自治、跨境多语言创作、海量数据挖掘五大高难度业务场景实现跨越式性能提升。
1426 2
|
17天前
|
人工智能
Qwen3.8抢先体验!正式版即将发布并开源!
千问Qwen3.8即将开源,参数达2.4T,进化速度以“天”计,实力媲美Fable 5。预览版Qwen3.8-Max已上线阿里Token Plan等平台,限时优惠:日间Credits低至1折,夜间更优,个人/团队版月付仅35元起!
1498 55
|
2天前
Qoder 一周年 × Qwen3.8-Max 正式上线,多重好礼限时领
8月3日,Qwen3.8-Max 正式上线Qoder,迎来Qoder一周年。新老用户可领800次免费调用,下单再赠2000次;夜间(22:00–08:00)调用5折;邀请好友双方得积分与调用额度。
246 0

热门文章

最新文章