【发布时间】:2018-10-07 16:38:54
【问题描述】:
我正在尝试使用快速傅立叶变换来评估 Google 趋势时间序列的幅度谱。如果您查看here 提供的数据中的“饮食”数据,它会显示出非常强烈的季节性模式:
我想我可以使用 FFT 来分析这种模式,它大概应该在 1 年内有一个强劲的峰值。
但是,当我应用这样的 FFT 时(a_gtrend_ham 是时间序列乘以汉明窗):
import matplotlib.pyplot as plt
import numpy as np
from numpy.fft import fft, fftshift
import pandas as pd
gtrend = pd.read_csv('multiTimeline.csv',index_col=0)
gtrend.index = pd.to_datetime(gtrend.index, format='%Y-%m')
# Sampling rate
fs = 12 #Points per year
a_gtrend_orig = gtrend['diet: (Worldwide)']
N_gtrend_orig = len(a_gtrend_orig)
length_gtrend_orig = N_gtrend_orig / fs
t_gtrend_orig = np.linspace(0, length_gtrend_orig, num = N_gtrend_orig, endpoint = False)
a_gtrend_sel = a_gtrend_orig.loc['2005-01-01 00:00:00':'2017-12-01 00:00:00']
N_gtrend = len(a_gtrend_sel)
length_gtrend = N_gtrend / fs
t_gtrend = np.linspace(0, length_gtrend, num = N_gtrend, endpoint = False)
a_gtrend_zero_mean = a_gtrend_sel - np.mean(a_gtrend_sel)
ham = np.hamming(len(a_gtrend_zero_mean))
a_gtrend_ham = a_gtrend_zero_mean * ham
N_gtrend = len(a_gtrend_ham)
ampl_gtrend = 1/N_gtrend * abs(fft(a_gtrend_ham))
mag_gtrend = fftshift(ampl_gtrend)
freq_gtrend = np.linspace(-0.5, 0.5, len(ampl_gtrend))
response_gtrend = 20 * np.log10(mag_gtrend)
response_gtrend = np.clip(response_gtrend, -100, 100)
我得到的幅度谱没有显示任何主峰:
我对如何使用 FFT 获取数据序列的频谱的误解在哪里?
【问题讨论】:
-
能否请您包括读取数据并应用汉明窗口的代码行?我很确定我可以为你回答这个问题。一个完整(但最少)的代码示例将为我节省一些时间。
-
嗨@DrM,感谢您的评论。我添加了缺失的行。
-
好的,知道了。您的 gtrend.csv 只是来自网站的 multiTimeline.csv 的副本吗?此外,大概您有一些针对 pandas 和 numpy 的导入语句。假设数据文件开箱即用,我会尽快回复您。
-
是的,gtrend.csv 只是 multiTimeline.csv 的一个副本。我将在一秒钟内添加导入语句。
-
你还需要一个 skiprows=2,我得到一个运行时错误除以零在 log10 移位后。但这可能没关系,作为一个起点。我得把东西收起来,几分钟后看看。应该不会花很长时间来整理它。