Cómo obtener la correlación entre dos series temporales utilizando Pandas

Tengo dos series de fecha de temperatura, que tienen lecturas a intervalos de tiempo regulares (pero diferentes). Estoy tratando de obtener la correlación entre estos dos conjuntos de datos.

He estado jugando con Pandas para tratar de hacer esto. He creado dos series TimeSeriesA.corr(TimeSeriesB) y estoy usando TimeSeriesA.corr(TimeSeriesB) . Sin embargo, si los tiempos en las 2 series de tiempo no coinciden exactamente (generalmente están apagados por segundos), obtengo Null como respuesta. Podría obtener una respuesta decente si pudiera:

a) Interpolar / completar los tiempos faltantes en cada TimeSeries (Sé que esto es posible en Pandas, simplemente no sé cómo hacerlo)

b) elimine los segundos de los objetos datetime de Python (establezca los segundos en 00, sin cambiar los minutos). Perdería un grado de precisión, pero no una cantidad enorme

c) Usar algo más en Pandas para obtener la correlación entre dos series de tiempo

d) Use algo en python para obtener la correlación entre dos listas de flotadores, cada flotador tiene un objeto de fecha y hora correspondiente, teniendo en cuenta el tiempo.

¿Alguien tiene alguna sugerencia?

Tiene varias opciones para usar pandas, pero tiene que tomar una decisión acerca de cómo tiene sentido alinear los datos, dado que no ocurren en los mismos instantes.

Use los valores “a partir de” los tiempos en una de las series de tiempo , aquí hay un ejemplo:

  In [15]: ts Out[15]: 2000-01-03 00:00:00 -0.722808451504 2000-01-04 00:00:00 0.0125041039477 2000-01-05 00:00:00 0.777515530539 2000-01-06 00:00:00 -0.35714026263 2000-01-07 00:00:00 -1.55213541118 2000-01-10 00:00:00 -0.508166334892 2000-01-11 00:00:00 0.58016097981 2000-01-12 00:00:00 1.50766289013 2000-01-13 00:00:00 -1.11114968643 2000-01-14 00:00:00 0.259320239297 In [16]: ts2 Out[16]: 2000-01-03 00:00:30 1.05595278907 2000-01-04 00:00:30 -0.568961755792 2000-01-05 00:00:30 0.660511172645 2000-01-06 00:00:30 -0.0327384421979 2000-01-07 00:00:30 0.158094407533 2000-01-10 00:00:30 -0.321679671377 2000-01-11 00:00:30 0.977286027619 2000-01-12 00:00:30 -0.603541295894 2000-01-13 00:00:30 1.15993249209 2000-01-14 00:00:30 -0.229379534767 

Puedes ver que estos están apagados por 30 segundos. La función de reindex permite alinear los datos mientras llena los valores de avance (obteniendo el valor “a partir de”):

  In [17]: ts.reindex(ts2.index, method='pad') Out[17]: 2000-01-03 00:00:30 -0.722808451504 2000-01-04 00:00:30 0.0125041039477 2000-01-05 00:00:30 0.777515530539 2000-01-06 00:00:30 -0.35714026263 2000-01-07 00:00:30 -1.55213541118 2000-01-10 00:00:30 -0.508166334892 2000-01-11 00:00:30 0.58016097981 2000-01-12 00:00:30 1.50766289013 2000-01-13 00:00:30 -1.11114968643 2000-01-14 00:00:30 0.259320239297 In [18]: ts2.corr(ts.reindex(ts2.index, method='pad')) Out[18]: -0.31004148593302283 

tenga en cuenta que ‘pad’ también tiene un alias ‘ffill’ (¡pero solo en la versión más reciente de pandas en GitHub a partir de este momento!).

Quita los segundos de todas tus fechas . La mejor manera de hacer esto es usar rename

  In [25]: ts2.rename(lambda date: date.replace(second=0)) Out[25]: 2000-01-03 00:00:00 1.05595278907 2000-01-04 00:00:00 -0.568961755792 2000-01-05 00:00:00 0.660511172645 2000-01-06 00:00:00 -0.0327384421979 2000-01-07 00:00:00 0.158094407533 2000-01-10 00:00:00 -0.321679671377 2000-01-11 00:00:00 0.977286027619 2000-01-12 00:00:00 -0.603541295894 2000-01-13 00:00:00 1.15993249209 2000-01-14 00:00:00 -0.229379534767 

Tenga en cuenta que si cambiar el nombre hace que haya fechas duplicadas, se lanzará una Exception .

Para algo un poco más avanzado , suponga que desea correlacionar el valor medio para cada minuto (donde tiene múltiples observaciones por segundo):

  In [31]: ts_mean = ts.groupby(lambda date: date.replace(second=0)).mean() In [32]: ts2_mean = ts2.groupby(lambda date: date.replace(second=0)).mean() In [33]: ts_mean.corr(ts2_mean) Out[33]: -0.31004148593302283 

Es posible que estos últimos fragmentos de código no funcionen si no tiene el último código de https://github.com/wesm/pandas . Si .mean() no funciona en un objeto GroupBy por el bash anterior .agg(np.mean)

¡Espero que esto ayude!