установка первого значения groupby на Nan - PullRequest
1 голос
/ 07 июля 2019

У меня есть временные ряды для разных категорий

cat date        price
A   2000-01-01  100
A   2000-02-01  101
...
A   2010-12-01  140
B   2000-01-01  10
B   2000-02-01  10.4
...
B   2010-12-01  11.1
...
Z   2010-12-01  13.1    

Мне нужно рассчитать доходность по всем активам, что очень быстро, используя

df['ret'] = df['price'] / df['price'].shift(1) - 1

Однако это также вычисляет неверные доходы дляпервый элемент каждой компании (кроме A) основан на последнем наблюдении предыдущей компании.Поэтому я хочу получить первое наблюдение в каждой категории.

Эти наблюдения легко получить, используя

df.groupby('cat')['ret'].first()

, но я немного растерялся, как их установить.

df.groupby('cat')['ret'].first() = np.NaN

и

df.loc[df.groupby('cat')['ret'].first(), 'ret']=np.NaN

никуда не вели.

Ответы [ 2 ]

2 голосов
/ 07 июля 2019

Попробуйте это

df.sort_values('date').groupby('cat')['price'].pct_change()

2 голосов
/ 07 июля 2019

для установки первого значения для групп на пропущенные значения используйте Series.duplicated:

df.loc[~df['cat'].duplicated(), 'ret']=np.NaN

Но, похоже, нужно DataFrame.sort_values с GroupBy.pct_change:

df = df.sort_values(['cat','date'])
df['ret1'] = df.groupby('cat')['price'].pct_change()

Ваше решение должно быть изменено на DataFrameGroupBy.shift:

df['ret2'] = df['price'] / df.groupby('cat')['price'].shift(1) - 1
print (df)
  cat        date  price      ret1      ret2
0   A  2000-01-01  100.0       NaN       NaN
1   A  2000-02-01  101.0  0.010000  0.010000
2   A  2010-12-01  140.0  0.386139  0.386139
3   B  2000-01-01   10.0       NaN       NaN
4   B  2000-02-01   10.4  0.040000  0.040000
5   B  2010-12-01   11.1  0.067308  0.067308
6   Z  2010-12-01   13.1       NaN       NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...