Der effizienteste Weg, überlappende Zeitreihen in Python zu bestimmen

8

Ich versuche herauszufinden, wie viel Zeit zwei Zeitreihen mit der Panda-Pandas-Bibliothek überlappen. Die Daten sind nicht synchron, so dass die Zeiten für jeden Datenpunkt nicht aufeinander abgestimmt sind. Hier ist ein Beispiel:

Zeitreihe 1

%Vor%

Zeitreihe 2

%Vor%

Unter der Annahme, dass die Reihe ihren Wert bis zur nächsten Änderung behält, was ist der effizienteste Weg, um den Prozentsatz der Zeit zu bestimmen, dass sie denselben Wert haben?

Beispiel

Berechnen wir die Zeit, in der sich diese Zeitreihen überschneiden, beginnend bei 11: 50: 07.000537 und endend bei 2016-10-05 11: 50: 57.000444 0.75, da wir Daten für beide Zeitreihen für diesen Zeitraum haben. Zeit, dass es Überschneidungen gibt:

  • 11: 50: 10.000479 - 11: 50: 15.000234 (beide haben einen Wert von 0,5) 4.999955 Sekunden
  • 11: 50: 37.000199 - 11: 50: 49.000295 (beide haben einen Wert von 0,5) 12.000096 Sekunden
  • 11: 50: 53.000424 - 11: 50: 53.000982 (beide haben einen Wert von 0,75) 0,000558 Sekunden
  • 11: 50: 55.000792 - 11: 50: 55.000904 (beide haben einen Wert von 0,25) 0,000112 Sekunden

Das Ergebnis (4.997955 + 12.000096 + 0.000558 + 0.000112) / 49.999907 = 34%

Eines der Probleme ist, dass meine aktuelle Zeitreihe viel mehr Daten wie 1000 - 10000 Beobachtungen hat und ich viel mehr Paare führen muss. Ich dachte daran, eine Reihe vorwärts zu füllen und dann einfach die Zeilen zu vergleichen und die Gesamtzahl der Übereinstimmungen über die Gesamtzahl der Zeilen zu teilen, aber ich denke nicht, dass dies sehr effizient wäre.

    
klib 06.10.2016, 00:40
quelle

2 Antworten

5

Setup
Erstellen Sie 2 Zeitreihen

%Vor%

TL; DR

%Vor%

Erklärung

Buildbasis pd.DataFrame df

  • Verwenden Sie pd.concat zum Ausrichten von Indizes
  • Verwenden Sie ffill , um Werte nach vorne zu propagieren
  • Verwenden Sie dropna , um die Werte einer Reihe vor der anderen zu löschen
%Vor%

berechnen 'duration'
vom aktuellen Zeitstempel zum nächsten

%Vor%

Überlappung berechnen

  • df.s1.eq(df.s2) gibt boolesche Reihen von s1 überlappt mit s2
  • Verwenden Sie groupby über der booleschen Reihe, um die Gesamtdauer zu aggregieren, wenn True und False
%Vor%

Prozentsatz der Zeit mit demselben Wert

%Vor%     
piRSquared 11.10.2016, 20:43
quelle
3

Cooles Problem. Ich Brute gezwungen dies ohne Verwendung von Pandas oder numpy, aber ich habe Ihre Antwort (danke für die Ausarbeitung). Ich habe es an nichts anderem getestet. Ich weiß auch nicht, wie schnell es ist, da es nur einmal jeden Datenrahmen durchläuft, aber keine Vektorisierung durchführt.

%Vor%

Ausgabe:

%Vor%     
mitoRibo 06.10.2016 01:39
quelle