我有一个数据框(让我们称之为“best_trades”),如下所示:
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
数据框表示交易列表。 第一列代表交易的进入时间,第二列代表退出时间,第三列代表我创建的自定义指标。
我想为时间重叠的交易计算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-01 09:00:00 2000-02-01 11:30:00 3.312500
)
我设法使用groupby函数检索这些行:
best_trades = best_trades.groupby(['MAE_ts'])['netgain_by_MAE'].transform('max')
然而,这会返回一个df,例如follow:
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
...
如何保留与原始数据帧相同的列,只保留每个groupby具有max netgain_by_mae值的行? (即我希望得到以下结果:
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
...
答案 0 :(得分:1)
如果我正确解释您的问题,那么您所要做的就是按退出时间和netgain_by_MAE降序对DataFrame进行排序,然后取出每个exit_time组的第一行。
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