2017-01-31 5 views
3

У меня есть временная ряд нижеКак удалить частотные компоненты из временных рядов?

enter image description here

Я хочу, чтобы проверить циклы, чтобы удалить их (как часть обычной предварительной обработки временных рядов), поэтому я применяю 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) 

Приведенный ниже результат.

enter image description here

Я хочу, чтобы удалить четыре большие компоненты. Для этого я реализую приведенную ниже формулу.

enter image description here

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 снова легко видеть, что это не работает.

enter image description here

Почему?

+0

Вы пытались использовать модуль statsmodel? Как показано здесь http://stackoverflow.com/questions/20672236/time-series-decomposition-function-in-python? –

+0

Проверьте этот хороший пример, который я нашел в другом посте: http://stackoverflow.com/questions/36968418/python-designing-a-time-series-filter-after-fourier-analysis –

+0

В массиве FFT 'yf 'установите значения, соответствующие пикам, равным нулю. Поскольку эти пики не являются одиночными точками, вам нужно будет установить малые диапазоны значений в ноль. После этого просто возьмите обратный БПФ, и у вас будет желаемый результат. –

ответ

0

Я думаю, что проблема заключается в следующем:

T = 1.0 # 1 day

Частота дискретизации определяется как число выборок в секунду, если у вас есть один образец в день ваша частота дискретизации F = (1/24 * 60 * 60), что составляет приблизительно 11,57407 мкг (микро-Герц), а частота вашего Nyquist будет равна 5,7787035 мкг, составляет приблизительно 2 дня. Это означает, что вы не можете проверять наличие циклов чаще, чем раз в два дня.

+0

Не могли бы вы описать ваши ответы более кратко? –