2017-10-29 1 views
2

Ich analysiere Power Systems Zeitreihendaten, und ich versuche, die zusammenhängenden Datenpunkte zu finden, die über einen bestimmten Schwellenwert hinausgehen.pandas groupby timeseries Daten nach Funktion Ergebnis

Ich verwende derzeit Excel-Formel Zeile für Zeile manuell, um dies zu tun, aber ich, wie ich versuche, effizientere Methoden zu suchen erkannte ich, dass dies in Python Pandas Groupby-Funktion getan werden könnte.

Soweit die Beispiele, die ich gelesen habe, gruppiert die groupby -Funktion nur die Zeilen, wenn sie die gleiche Bezeichnung haben. Was ich tun möchte, ist, eine bestimmte Funktion an groupby zu übergeben, die prüfen könnte, ob der Wert => 3 ist, und dann diese Werte zu indizieren, beginnend mit der Start- und Endzeit des Schwellenwerts => 3.

Input:

+-------+---------+------+ 
| Index | Time | Value| 
+-------+---------+------+ 
|  0 | 00:00:01| 3 | 
|  1 | 00:00:02| 4 | 
|  2 | 00:00:03| 5 | 
|  3 | 00:00:04| 2 | 
|  4 | 00:00:05| 6 | 
|  5 | 00:00:06| 7 | 
|  6 | 00:00:07| 1 | 
|  7 | 00:00:08| 9 | 
+-------+---------+------+ 

Ausgang:

+-------+-----------+----------+--------+ 
| Index | TimeStart | TimeEnd | Value | 
+-------+-----------+----------+--------+ 
|  0 | 00:00:01 | 00:00:03 | 3,4,5 | 
|  1 | 00:00:05 | 00:00:06 | 6,7 | 
|  2 | 00:00:08 | 00:00:08 | 9  | 
+-------+-----------+----------+--------+ 

Antwort

2
  • eine Maske erstellen, in dem weniger als 3
  • kumulative Summe auf cre aßen Gruppen, in denen mehr als oder gleich 3
  • Filter der df durch die Maske, dann groupby
  • Verwenden agg auf mehrere Funktionen auf einmal
  • Umbenennen Spalten

mask = df.Value.lt(3) 
grp = mask.cumsum() 

d1 = df[~mask].groupby(grp[~mask]).agg(dict(
    Time=['first', 'last'], 
    Value=lambda x: ','.join(map(str, x)) 
)) 

d1.columns = ['TimeStart', 'TimeEnd', 'Value'] 

d1 

     TimeStart TimeEnd Value 
Value       
0  00:00:01 00:00:03 3,4,5 
1  00:00:05 00:00:06 6,7 
2  00:00:08 00:00:08  9 
+0

Sir diesen Pass ist super, ich wünschte, es würde mehr Stimmen bekommen. – Dark

+0

Wow, vielen Dank! Ich bin mir der Funktionen, die du benutzt hast, wie Cumsum und Maske, nicht bewusst, das ist weit weg von meinem derzeitigen Wissen in Python. Will tiefer in diese graben. Danke nochmal. –