【问题标题】:How to remove frequency components from time series?如何从时间序列中去除频率分量?
【发布时间】:2017-06-17 13:18:42
【问题描述】:

我有下面的时间序列

我想检查周期以删除它们(作为通常的时间序列预处理的一部分),所以我应用了 FFT。

# Number of samplepoints
N = len(y)
# sample spacing
T = 1.0 # 1 day
x = np.linspace(0.0, N*T, N)
yf = scipy.fftpack.fft(y)
xf = np.linspace(0.0, 1.0/(2.0*T), N/2)
components = 2.0/N * np.abs(yf[:N//2])

fig, ax = plt.subplots(1, 1, figsize=(10, 5))
ax.plot(xf, components)

这会产生以下情节。

我想删除四个最大的组件。为了做到这一点,我正在实施下面的公式。

max_components = sorted(components, reverse=True)[:4]
idx_max_comp = []

for comp in max_components:
    for i in range(len(components)):
        if components[i] == comp:
            idx_max_comp.append(i)
            break

cycle_signal = np.zeros(len(y))
for idx in idxs:
    a, b = (2.0/N) * np.real(yf[idx]), (2.0/N) * np.imag(yf[idx])
    fi = xf[idx]
    cycle_signal += (a * np.cos(2 * np.pi * fi * x)) + (b * np.sin(2 * np.pi * fi * x))

y = y - cycle_signal

但是当我再次应用 FFT 时,很容易发现它不起作用。

为什么?

【问题讨论】:

  • 您是否尝试过使用 statsmodel 模块?就像这里显示的一样stackoverflow.com/questions/20672236/…
  • 查看我在另一篇文章中找到的这个很好的例子:stackoverflow.com/questions/36968418/…
  • 在 FFT 数组yf 中将对应于峰值的值设置为零。由于这些峰值不是单点,因此您必须将小范围的值设置为零。之后,只需进行逆 FFT,您就会得到想要的结果。
  • 我面临同样的问题,我想出了同样的解决方案。我想知道的是,有什么数学方法可以计算出要移除的带宽,还是通过目测来完成?

标签: python scipy time-series fft


【解决方案1】:

我认为问题如下:

T = 1.0 # 1 day

如果您每天有一个样本,则采样频率定义为每秒的采样数,您的采样频率为 f = (1/24*60*60),大约为 11.57407 uHz(微赫兹),而您的奈奎斯特频率将在 5.787035 uHz 大约 2 天。这意味着您不能比每两天更频繁地检查周期的发生。

【讨论】:

  • 您能否简单描述一下您的回答?
猜你喜欢
  • 1970-01-01
  • 2017-02-09
  • 2019-11-28
  • 1970-01-01
  • 2020-09-21
  • 2012-08-22
  • 2013-11-13
  • 1970-01-01
  • 2014-06-18
相关资源
最近更新 更多