Saltar al contenido

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

El paso a paso o código que hallarás en este post es la solución más sencilla y válida que encontramos a esta duda o problema.

Solución:

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

Utilice los valores “a partir de” los tiempos en una de las series de tiempohe aquí 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

puede ver que están apagados por 30 segundos. Él reindex La función le permite alinear datos mientras completa valores hacia adelante (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 el alias de ‘ffill’ (¡pero solo en la última versión de pandas en GitHub a partir de este momento!).

Elimina segundos de todas tus fechas y horas. 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 y Exception será arrojado.

Para algo un poco más avanzadosuponga que desea correlacionar el valor medio de cada minuto (donde tiene varias 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 código más reciente de https://github.com/wesm/pandas. Si .mean() no funciona en un GroupBy objeto por intento anterior .agg(np.mean)

¡Espero que esto ayude!

Al cambiar sus marcas de tiempo, es posible que pierda algo de precisión. Simplemente puede realizar una unión externa en su serie de tiempo llenando los valores de NaN con 0 y luego tendrá las marcas de tiempo completas (ya sea compartida o pertenezca solo a uno de los conjuntos de datos). Luego, es posible que desee hacer la función de correlación para las columnas de su nuevo conjunto de datos que le dará el resultado que está buscando sin perder precisión. Este es mi código una vez que estaba trabajando con series de tiempo:

t12 = t1.join(t2, lsuffix='_t1', rsuffix='_t2', how ='outer').fillna(0)

t12.corr()

De esta manera tendrás todas las marcas de tiempo.

Si para ti ha sido provechoso nuestro post, agradeceríamos que lo compartas con el resto programadores de este modo contrubuyes a dar difusión a nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *