2016-12-13 2 views
0

У меня есть dataframe (назовем его «best_trades»), который, например следующим образом:питона панды - functionning из 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 

dataframe представляют список профессий. Первый столбец представляет собой время входа в торговлю, второе - время выхода, третий столбец, пользовательскую метрику, созданную мной.

Я хотел бы, чтобы вычислить максимальное значение 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, такие как следующие:

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 
... 

Как сохранить те же столбцы, что и исходный фреймворк данных, сохраняя только строки, которые имеют максимальное значение 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

Если я интерпретирую ваш вопрос правильно, то все, что вам нужно сделать, это Сортируйте DataFrame по времени выхода и netgain_by_MAE убыванию, а затем взять первую строку каждого 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 
+0

что большое ТНХ! Однако в моем примере первый столбец индекса (далее «entry_time»). так или иначе, когда я запускаю свой код, результат просто отсутствует, что первый столбец (это дает что-то подобное): '0 2000-01-03 04:00:00 2.200000'. Любая мысль о том, как сохранить этот первый индекс временной метки как индекс? –

+0

использовать' reset_index' b прежде чем делать код выше, а затем после запуска вышеперечисленного кода 'df.set_index ('entry_time')' –

Смежные вопросы