2016-12-13 4 views
0

Ich habe einen Datenrahmen (läßt es „best_trades“ nennen), die solche wie folgt lautet:Python Pandas - Funktionen aus dem groupby

       exit_time netgain_by_MAE 
2000-02-01 07:00:00 2000-02-01 11:30:00  2.083333 
2000-02-01 08:30:00 2000-02-01 11:30:00  2.625000 
2000-02-01 09:00:00 2000-02-01 11:30:00  3.312500 
2000-02-01 09:30:00 2000-02-01 11:30:00  2.000000 
2000-02-01 10:30:00 2000-02-01 11:30:00  2.312500 
2000-02-02 13:30:00 2000-02-02 15:00:00  2.000000 
2000-02-02 14:00:00 2000-02-02 15:00:00  2.428571 
2000-02-02 15:00:00 2000-02-03 00:00:00  3.000000 
2000-02-03 02:30:00 2000-02-03 07:30:00  2.000000 
2000-02-03 10:00:00 2000-02-03 15:00:00  2.222222 
2000-02-03 10:30:00 2000-02-04 00:00:00  3.259259 
2000-02-03 11:00:00 2000-02-04 00:00:00  4.666667 
2000-02-03 11:00:00 2000-02-04 01:00:00  2.629630 
2000-02-03 11:00:00 2000-02-04 01:30:00  14.500000 
2000-02-03 12:30:00 2000-02-04 01:30:00  11.600000 
2000-02-03 13:00:00 2000-02-04 01:30:00  5.300000 
2000-02-03 13:30:00 2000-02-04 01:30:00  2.700000 
2000-02-03 14:00:00 2000-02-04 03:30:00  4.100000 
2000-02-03 14:30:00 2000-02-04 03:30:00  2.600000 

Der Datenrahmen eine Liste von Geschäften vertreten. Die erste Spalte repräsentiert die Eintrittszeit des Handels, die zweite die Austrittszeit, die dritte Spalte eine benutzerdefinierte Metrik, die ich erstellt habe.

Ich möchte den höchsten Wert von netgain_by_MAE für Trades berechnen, die in der Zeit überlappen, zum Beispiel jene diejenigen:

2000-02-01 07:00:00 2000-02-01 11:30:00  2.083333 
2000-02-01 08:30:00 2000-02-01 11:30:00  2.625000 
2000-02-01 09:00:00 2000-02-01 11:30:00  3.312500 
2000-02-01 09:30:00 2000-02-01 11:30:00  2.000000 
2000-02-01 10:30:00 2000-02-01 11:30:00  2.312500 

(hier das Ergebnis wäre 2000-02-01 09:00:00 2000-02-01 11:30:00 3.312500)

ich es geschafft abrufen die Zeilen mit der groupby Funktion: best_trades = best_trades.groupby(['MAE_ts'])['netgain_by_MAE'].transform('max')

jedoch gibt diese eine df wie folgt:

2000-02-01 07:00:00  2.083333 
2000-02-01 08:30:00  3.312500 
2000-02-01 09:00:00  3.312500 
2000-02-01 09:30:00  3.312500 
2000-02-01 10:30:00  3.312500 
2000-02-02 13:30:00  2.428571 
... 

Wie behält man die gleichen Spalten wie der ursprüngliche Datenrahmen, nur die Zeilen behalten, die den maximalen Wert von netgain_by_mae für jede Gruppe haben? (dh würde Ich mag die folgende Ausgabe haben:

2000-02-01 09:00:00 2000-02-01 11:30:00  3.312500 
2000-02-02 14:00:00 2000-02-02 15:00:00  2.428571 
2000-02-02 15:00:00 2000-02-03 00:00:00  3.000000 
... 

Antwort

1

Wenn ich Ihre Frage bin Interpretation richtig dann alles, was Sie tun müssen, ist eine Art der Datenrahmen von Austrittszeit und netgain_by_MAE absteigend und dann die erste Zeile jeder exit_time nehmen Gruppe.

df = best_trades.sort_values(['exit_time', 'netgain_by_MAE'], ascending=[True,False])\ 
       .groupby('exit_time')\ 
       .first()\ 
       .reset_index() 

print(df[['entry_time', 'exit_time', 'netgain_by_MAE']]) 

      entry_time   exit_time netgain_by_MAE 
0 2000-02-01 09:00:00 2000-02-01 11:30:00  3.312500 
1 2000-02-02 14:00:00 2000-02-02 15:00:00  2.428571 
2 2000-02-02 15:00:00 2000-02-03 00:00:00  3.000000 
3 2000-02-03 02:30:00 2000-02-03 07:30:00  2.000000 
4 2000-02-03 10:00:00 2000-02-03 15:00:00  2.222222 
5 2000-02-03 11:00:00 2000-02-04 00:00:00  4.666667 
6 2000-02-03 11:00:00 2000-02-04 01:00:00  2.629630 
7 2000-02-03 11:00:00 2000-02-04 01:30:00  14.500000 
8 2000-02-03 14:00:00 2000-02-04 03:30:00  4.100000 
+0

, die große thx ist! aber in meinem Beispiel die erste Spalte der Index (der „ENTRY_TIME“). wenn ich laufe das Ergebnis Code irgendwie ist einfach fehlt, dass erste Spalte (es so etwas gibt): '0 2000-01-03 04:00:00 2.200000' Jeder Gedanke, wie man diesen ersten Zeitstempel-Index als Index behält? –

+0

benutze' reset_index' b Bevor Sie den Code oben und dann nach dem obigen Code ausführen, führen Sie 'df.set_index ('entry_time')' aus –

Verwandte Themen