如何从傅立叶变换中获取峰值?

How do I get peak values back from fourier transform?

我怀疑我对傅里叶变换的理解有什么遗漏,所以我正在寻找一些修正(如果是这样的话)。我应该如何从下面的第一个图中收集峰值信息?

数据集是过去 17 年(特定城市)911 呼叫的每小时数据。

我已经从我的数据中删除了趋势,现在正在删除季节性。当我 运行 傅里叶变换时,我得到以下图:

我相信数据集确实有一些季节性(查看每周数据,我有这种模式):

如何在第一个图中找出峰的值?大概对于所有 "peaks" 以下,比如第一个图中的 5000,我可能会忽略在我的最终模型中包含的季节性,但只会损失准确性,对吗?

这是我目前正在使用的部分代码:

from scipy import fftpack
fft = fftpack.fft(calls_grouped_hour.detrended_residuals - calls_grouped_hour.detrended_residuals.mean())
plt.plot(1./(17*365)*np.arange(len(fft)), np.abs(fft))
plt.xlim([-.1, 23/2]);

编辑: 在 Mark Snider 的初步回答之后,我有以下情节:

添加代码尝试从 fft 获取峰值:

我需要先使用 ifft 将值转换回来吗?

fft_x_y = np.stack((fft.real, fft.imag), -1)
peaks = []
for x, y in np.abs(fft_x_y):
    if (y >= 0): 
        spipeakskes.append(x)

peaks = np.unique(peaks)
print('Length: ', len(peaks))
print('Peak values: ', '\n', np.sort(peaks))
threshold = 5000
fft[np.abs(fft)<threshold] = 0

这将为您提供一个 fft 忽略除峰值以外的所有内容的结果。不,我不认为 "noise" 代表实际的季节性。 fft[0] 处的峰值也不代表季节性 - 它是数据平均值的倍数,因此如果您打算减去峰值的 ifft,我不会包括 fft[0] 除非您希望数据居中。

如果你想要只是峰值而不是你可以反转的完整fft,你可以这样做:

peaks = [np.abs(value) for value in fft if np.abs(value)>threshold]