У меня есть временная ряд нижеКак удалить частотные компоненты из временных рядов?
Я хочу, чтобы проверить циклы, чтобы удалить их (как часть обычной предварительной обработки временных рядов), поэтому я применяю 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? Как показано здесь http://stackoverflow.com/questions/20672236/time-series-decomposition-function-in-python? –
Проверьте этот хороший пример, который я нашел в другом посте: http://stackoverflow.com/questions/36968418/python-designing-a-time-series-filter-after-fourier-analysis –
В массиве FFT 'yf 'установите значения, соответствующие пикам, равным нулю. Поскольку эти пики не являются одиночными точками, вам нужно будет установить малые диапазоны значений в ноль. После этого просто возьмите обратный БПФ, и у вас будет желаемый результат. –