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?
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!
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