2016-01-29 3 views
1

У меня есть DataFrame и вам нужно рассчитать процентное изменение по сравнению с началом года компаниями. Есть ли способ использовать pct_change() или другим способом для выполнения этой задачи? Благодаря!Как рассчитать процентное изменение по сравнению с начальным значением с использованием панд?

df выглядит

security date  price 
IBM   1/1/2016 100 
IBM   1/2/2016 102 
IBM   1/3/2016 108 
AAPL  1/1/2016 1000 
AAPL  1/2/2016 980 
AAPL  1/3/2016 1050 
AAPL  1/4/2016 1070 

результаты, которые я хочу

security date  price change 
IBM   1/1/2016 100  NA 
IBM   1/2/2016 102  2% 
IBM   1/3/2016 108  8% 
AAPL  1/1/2016 1000 NA 
AAPL  1/2/2016 980  -2% 
AAPL  1/3/2016 1050 5% 
AAPL  1/4/2016 1070 7% 
+0

Сначала разделите свой фрейм данных, а затем используйте pct_change(), чтобы рассчитать процентное изменение для каждой даты. –

+0

Если я делаю df.groupby ('security') ['price']. Pct_change(), это даст мне процентное изменение по сравнению с предыдущими днями. Тем не менее, мне нужно процентное изменение по сравнению с 100 и 1000. Любые идеи? –

ответ

3

Похоже, вы ищете expanding_window версии pct_change(). Это не существует из коробки AFAIK, но вы можете свернуть свой собственный:

df.groupby('security')['price'].apply(lambda x: x.div(x.iloc[0]).subtract(1).mul(100)) 
+0

Мне нравится ваш один лайнер! Я думаю, что это «по сравнению с началом» может быть приятной особенностью для 'pct_change()' –

+0

Либо это, либо добавление 'expand_pct_change()' к расширяющимся функциям окна, упомянутым в документах. Существует также 'expand_apply', кстати, см.« Поваренная книга »: http://pandas.pydata.org/pandas-docs/stable/cookbook.html – Stefan

1

Это работает, если вы уже упорядочены по дате в каждой возможной группировки.

def pct_change(df): 
    df['pct'] = 100 * (1 - df.iloc[0].price/df.price) 
    return df 

df.groupby('security').apply(pct_change) 
+0

Хорошо, groupby + iloc [0] был трюком. Благодаря! –

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