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.