Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Как добавить в датафрейм столбец, с выполненной калькуляцией? Обрабатывая данные внутри мультииндекса

#python #pandas #dataframe #multi_index


Еще один вопрос, в продолжение вчерашнего. Мне нужно посчитать профит по каждой отдельной
сделке (tradeID). (tradeID и date - индексы)
Вопрос - как грамотно добавить в датафрейм столбец profit, с выполненной калькуляцией
(sell - buy просто например...)
Из-за маленького опыта я начал писать какие то ужасные вложенные циклы для этого.
Но уверен что с Pandas все может быть проще. Пожалуйста подскажите направление движения.



Исходный датафрейм:

                                             price   qty  side  status                 
 tradeID                date
 71ZNeXwSQUqkxhKR9trvrQ 2018-09-03 17:00:00  7282.5  10.0   Buy  filled 
                        2018-09-05 11:00:00  7111.0  10.0  Sell  filled  
 WYgKLRv+Q9CuXic4FNEh0A 2018-09-08 10:00:00  6448.0  10.0   Buy  filled  
                        2018-09-08 18:00:00  6377.0  10.0  Sell  filled  
 /6WmcfJ1QcWWwPcwkXeoSw 2018-09-09 14:00:00  6376.5  10.0   Buy  filled  


Хотелось бы получить что то такое:

                                             price   qty  side  status    profit
               
 tradeID                date
 71ZNeXwSQUqkxhKR9trvrQ 2018-09-03 17:00:00  7282.5  10.0   Buy  filled 
                        2018-09-05 11:00:00  7111.0  10.0  Sell  filled  -171.5
 WYgKLRv+Q9CuXic4FNEh0A 2018-09-08 10:00:00  6448.0  10.0   Buy  filled  
                        2018-09-08 18:00:00  6377.0  10.0  Sell  filled  -71
 /6WmcfJ1QcWWwPcwkXeoSw 2018-09-09 14:00:00  6376.5  10.0   Buy  filled  


Заранее большое спасибо!
    


Ответы

Ответ 1



Такой вариант устроит?: df['profit']= df.groupby(level=[0]).transform(lambda x: x.shift(-1) - x)['price'] print(df) price qty side status profit 71ZNeXwSQUqkxhKR9trvrQ 2018-09-03 17:00:00 7282.5 10.0 Buy filled -171.5 2018-09-05 11:00:00 7111.0 10.0 Sell filled NaN WYgKLRv+Q9CuXic4FNEh0A 2018-09-08 10:00:00 6448.0 10.0 Buy filled -71.0 2018-09-08 18:00:00 6377.0 10.0 Sell filled NaN

Ответ 2



Еще один рабочий вариант: In [277]: df['profit'] = (df.sort_values(['tradeID','date', 'side']) .groupby('tradeID') ['price'].diff()) In [278]: df Out[278]: price qty side status profit tradeID date 71ZNeXwSQUqkxhKR9trvrQ 2018-09-03 17:00:00 7282.5 10.0 Buy filled NaN 2018-09-05 11:00:00 7111.0 10.0 Sell filled -171.5 WYgKLRv+Q9CuXic4FNEh0A 2018-09-08 10:00:00 6448.0 10.0 Buy filled NaN 2018-09-08 18:00:00 6377.0 10.0 Sell filled -71.0 /6WmcfJ1QcWWwPcwkXeoSw 2018-09-09 14:00:00 6376.5 10.0 Buy filled NaN

Комментариев нет:

Отправить комментарий