агрегация на основе условий

подскажите как можно посчитать процент колонки '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 шт):

Автор решения: strawdog

Если я правильно понял вопрос, то, возможно, вам нужно просто это:

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}
→ Ссылка
Автор решения: CrazyElf

Ну как-то так, например. Просто вычитаем из последней цены первую, делим на первую цену и умножаем на 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
→ Ссылка