агрегация на основе условий
подскажите как можно посчитать процент колонки 'price' группируя по 'ticker'.Т.е. на сколько процентов цена увеличилась или уменьшилась.Представлял себе так: сгруппировать данные по 'ticker', взять первый и последний индекс группировки - найти разницу между ними.Потом я хотел добавить условие если сумма диффов положительная или отрицательная то приминить pct_change к колонке pcrice.Только вот не понятно как сделать проверку на условие по диффу, и как применить pct_change если цена упала или выросла
import pandas as pd
df = pd.DataFrame([['sel', 3, 'axs'],
['sel', 2, 'axs'],
['sel', 6, 'axs'],
['buy', 8, 'avax'],
['buy', 3, 'avax'],
['sel', 4, 'avax'],
['sel', 3, 'xec'],
['sel', 1000, 'xec'],
['sel', 50, 'xec']],
columns=['side', 'price', 'ticker'],
index=pd.date_range(start='1/1/2018/20', end='1/08/2018/20', periods=9)) \
.reset_index().sort_values('index')
print(df)
df = (df.groupby(['ticker'])['price'].take([0, -1]).reset_index().drop('level_1', axis=1).assign(
diff_pr=lambda x: x.groupby('ticker')['price'].diff().fillna(0)))
print(df)
Ответы (2 шт):
Если я правильно понял вопрос, то, возможно, вам нужно просто это:
df.groupby("ticker")["price"].agg(['first', 'last']).T.pct_change().T["last"]*100
ticker
avax -50.000000
axs 100.000000
xec 1566.666667
Name: last, dtype: float64
UPDATE
для получения результата в виде словаря:
res = (df.groupby("ticker")["price"].agg(['first', 'last']).T.pct_change().T["last"]*100).to_dict()
res:
{'avax': -50.0, 'axs': 100.0, 'xec': 1566.6666666666667}
Ну как-то так, например. Просто вычитаем из последней цены первую, делим на первую цену и умножаем на 100. Получается процент изменения:
df2 = df.groupby(['ticker'])['price'] \
.agg(lambda x: 100*(x.iloc[-1] - x.iloc[0])/x.iloc[0]) \
.reset_index() \
.rename(columns={'price': 'pct_change'})
df2
Вывод:
ticker pct_change
0 avax -50.000000
1 axs 100.000000
2 xec 1566.666667