Pandas Панель данных - Определение годового разрыва и расчет прибыли - PullRequest
0 голосов
/ 13 апреля 2020

Я работаю с большой панелью данных финансовой информации, однако значения немного нестабильны. Я пытаюсь рассчитать доходность каждого года по каждой акции в моей панели данных. Однако из-за пропущенных значений иногда фирмы имеют разрывы в годах, что делает невозможным практическое применение df['stock_ret'] = df.groupby(['tic'])['stock_price'].pct_change(), поскольку это было бы неправильно. Df выглядит примерно так (просто приводя пример):

       datadate      month     fyear    ticker    price
0    31/12/1998         12      1998      AAPL   188.92
1    31/12/1999         12      1999      AAPL   197.44
2    31/12/2002         12      2002      AAPL   268.13
3    31/12/2003         12      2003      AAPL   278.06
4    31/12/2004         12      2004      AAPL   288.35
5    31/12/2005         12      2005      AAPL   312.23
6    31/05/2008          5      2008      TSLA    45.67
7    31/05/2009          5      2009      TSLA    38.29
8    31/05/2010          5      2010      TSLA    42.89
9    31/05/2011          5      2011      TSLA    56.03
10   31/05/2014          5      2014      TSLA   103.45
..       ...            ..       ..        ..      ..

Я ищу фрагмент кода, который позволил бы мне понять (для каждой отдельной фирмы), есть ли пробел в данные и рассчитать доходность для двух разных серий. Точно так же:

       datadate      month     fyear    ticker    price   return
0    31/12/1998         12      1998      AAPL   188.92      NaN 
1    31/12/1999         12      1999      AAPL   197.44   0.0451
2    31/12/2002         12      2002      AAPL   268.13      NaN
3    31/12/2003         12      2003      AAPL   278.06   0.0370
4    31/12/2004         12      2004      AAPL   288.35   0.0370
5    31/12/2005         12      2005      AAPL   312.23   0.0828
6    31/05/2008          5      2008      TSLA    45.67      NaN
7    31/05/2009          5      2009      TSLA    38.29  -0.1616
8    31/05/2010          5      2010      TSLA    42.89   0.1201
9    31/05/2011          5      2011      TSLA    56.03   0.3063
10   31/05/2014          5      2014      TSLA   103.45      NaN
..       ...            ..       ..        ..      ..

Если у вас есть какие-либо другие предложения о том, как решить эту проблему, пожалуйста, не стесняйтесь делиться своими знаниями :) Я немного неопытен, поэтому я уверен, что ваш совет может помочь!

Заранее спасибо, ребята!

1 Ответ

1 голос
/ 13 апреля 2020

Вы можете создать маску, которая скажет, существовал ли последний год, и просто обновить эти годы с изменением pct:

df['return'] = np.nan
mask = df.groupby('ticker')['fyear'].apply(lambda x: x.shift(1)==x-1)
df.loc[mask,'return'] = df.groupby('ticker')['price'].pct_change()
...