Jak uzyskać korelację między dwoma seriami czasowymi za pomocą pand

Mam dwa zestawy dat temperatury, które mają odczyty w regularnych (ale różnych) odstępach czasu. Próbuję ustalić korelację pomiędzy tymi dwoma zestawami danych.

Grałem z pandami , aby spróbować to zrobić. Stworzyłem dwa razy i używam TimeSeriesA.corr(TimeSeriesB). Jeśli jednak czasy w 2 timeSeries nie pasują dokładnie (zazwyczaj są wyłączone przez sekundy), otrzymuję Null jako odpowiedź. Mógłbym dostać przyzwoitą odpowiedź, gdybym mógł:

A) Interpoluj / wypełnij brakujące czasy za każdym razem (Wiem, że jest to możliwe w pandach, po prostu nie wiem jak to zrobić)

B) usuwa sekundy z obiektów DateTime Pythona(Ustawia sekundy na 00, bez zmiany minut). Traciłbym pewien stopień dokładności, ale nie ogromną ilość

C) użyj czegoś innego w Pandzie, aby uzyskać korelację między dwoma seriami czasowymi

D) użyj czegoś w Pythonie, aby uzyskać korelację między dwiema listami pływaków, z których każda ma odpowiedni obiekt datetime, biorąc pod uwagę czas.

Ktoś ma jakieś sugestie?

Author: catbot, 2011-06-24

1 answers

Masz wiele opcji za pomocą pand, ale musisz podjąć decyzję o tym, jak sensowne jest wyrównywanie danych, biorąc pod uwagę, że nie występują one w tych samych momentach.

Użyj wartości " od " czasów w jednym z szeregów czasowych , Oto przykład:

    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

Widać, że są wyłączone o 30 sekund. Funkcja reindex umożliwia wyrównanie danych podczas wypełniania wartości do przodu (uzyskanie wartości "od"):

    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

Zauważ, że 'pad' jest również aliasowany przez "ffill" (ale tylko w najnowszej wersji pandy na Githubie od tego czasu!).

Usuń sekundy ze wszystkich dat . Najlepszym sposobem na to jest użycie 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

Zauważ, że jeśli zmiana nazwy spowoduje, że będą duplikaty DAT, to Exception zostanie wyrzucona.

Dla czegoś bardziej zaawansowanego, Załóżmy, że chcesz skorelować średnią wartość dla każdej minuty (gdzie masz wiele obserwacji na sekundę):

    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

Te ostatnie fragmenty kodu mogą nie działać, jeśli nie masz najnowszego kodu z https://github.com/wesm/pandas. Jeśli .mean() nie działa na obiekcie GroupBy na powyższej próbie .agg(np.mean)

Mam nadzieję, że to pomoże!

 12
Author: Wes McKinney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-24 14:01:15