#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
Комментариев нет:
Отправить комментарий