python pandas - groupby的功能

时间:2016-12-13 01:18:40

标签: python pandas

我有一个数据框(让我们称之为“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
...

1 个答案:

答案 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