我有时间序列
我想检查周期以便删除它们(作为通常的时间序列预处理的一部分),所以我应用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时,很容易看出它不起作用。
为什么?
答案 0 :(得分:0)
我认为问题如下:
T = 1.0 # 1 day
如果您的采样频率为f =(1/24 * 60 * 60),即大约11.57407 uHz(微赫兹)和您的奈奎斯特,那么采样频率定义为每秒采样数。频率为5.787035 uHz约为2天。这意味着您不能每两天检查一次周期的发生频率。