python - rápida - Usando el análisis de Fourier para la predicción de series de tiempo
time series python (4)
Cuando ejecuta una FFT en datos de series temporales, la transforma en el dominio de la frecuencia. Los coeficientes multiplican los términos en la serie (senos y cosenos o exponenciales complejos), cada uno con una frecuencia diferente.
La extrapolación siempre es algo peligroso, pero puedes intentarlo. Está utilizando información del pasado para predecir el futuro cuando hace esto: "Predecir el clima del mañana mirando hoy". Solo se consciente de los riesgos.
Recomiendo leer "Black Swan" .
Para los datos que se sabe que tienen patrones estacionales o diarios, me gustaría usar el análisis de Fourier para hacer predicciones. Después de ejecutar fft en series de tiempo, obtengo coeficientes. ¿Cómo puedo usar estos coeficientes para la predicción?
Creo que FFT asume que todos los datos que recibe constituyen un período, entonces, si simplemente regenero datos usando ifft, también estoy regenerando la continuación de mi función, entonces ¿puedo usar estos valores para valores futuros?
En pocas palabras: corro fft para t = 0,1,2, .. 10 y luego usando ifft en coef, ¿puedo usar series de tiempo regeneradas para t = 11,12, .. 20?
Parece que quieres una combinación de extrapolación y eliminación de ruido.
Usted dice que quiere repetir los datos observados en múltiples períodos. Bueno, entonces solo repite los datos observados. No es necesario el análisis de Fourier.
Pero también quieres encontrar "patrones". Supongo que eso significa encontrar los componentes de frecuencia dominantes en los datos observados. Entonces sí, tome la transformada de Fourier, preserve los coeficientes más grandes y elimine el resto.
X = scipy.fft(x)
Y = scipy.zeros(len(X))
Y[important frequencies] = X[important frequencies]
En cuanto a la repetición periódica: sea z = [x, x]
, es decir, dos períodos de la señal x
. Entonces Z[2k] = X[k]
para todo k
en {0, 1, ..., N-1}, y ceros en caso contrario.
Z = scipy.zeros(2*len(X))
Z[::2] = X
Soy consciente de que esta pregunta puede no ser real para ti, pero para otros que están buscando respuestas escribí un ejemplo muy simple de extrapolación de Fourier en Python https://gist.github.com/tartakynov/83f3cd8f44208a1856ce
Antes de ejecutar el script, asegúrese de tener todas las dependencias instaladas (numpy, matplotlib). Siéntase libre de experimentar con eso. PS Wavelet estacionario localmente puede ser mejor que la extrapolación de Fourier. LSW se usa comúnmente para predecir series de tiempo. La principal desventaja de la extrapolación de fourier es que simplemente repite su serie con el período N, donde N es la longitud de su serie temporal.
puede usar la biblioteca que @tartakynov publicó y, para no repetir exactamente la misma serie de tiempo en forcast (overfitting), puede agregar un nuevo parámetro a la función llamada n_param
y fijar un límite inferior h
para las amplitudes de las frecuencias.
def fourierExtrapolation(x, n_predict,n_param):
generalmente encontrará que, en una señal, hay algunas frecuencias que tienen una amplitud significativamente más alta que otras, por lo tanto, si selecciona estas frecuencias podrá aislar la naturaleza periódica de la señal
puedes agregar estas dos líneas que están determinadas por cierto número n_param
h=np.sort(x_freqdom)[-n_param]
x_freqdom=[ x_freqdom[i] if np.absolute(x_freqdom[i])>=h else 0 for i in range(len(x_freqdom)) ]
simplemente agregando esto, podrá pronosticar agradable y suave
Otro artículo útil sobre FFt: pronostica FFt en R