Индекс Герфиндаля с использованием значений за последние 5 лет - PullRequest
0 голосов
/ 15 октября 2019

У меня есть следующие данные:

gvkey   sic     firm                cusip       year    X       Y       Z       Class

61399   2835    MYRIAD GENETICS INC 62855J104   2001    5.3     4.8     9.7     356
61399   2835    MYRIAD GENETICS INC 62855J104   2002    5.3     4.8     9.7     358
61399   2835    MYRIAD GENETICS INC 62855J104   2003    5.3     4.8     9.7     358
61399   2835    MYRIAD GENETICS INC 62855J104   2004    5.66    6.22    11.1    548
61399   2835    MYRIAD GENETICS INC 62855J104   2005    5.54    6.90    11.18   72
61399   2835    MYRIAD GENETICS INC 62855J104   2005    5.54    6.90    11.18   156
61399   2835    MYRIAD GENETICS INC 62855J104   2006    5.545   6.90    11.18   206
61399   2835    MYRIAD GENETICS INC 62855J104   2007    5.5     9.3     12.7    53    
61399   2835    MYRIAD GENETICS INC 62855J104   2007    5.5     9.3     12.7    53      
61399   2835    MYRIAD GENETICS INC 62855J104   2007    5.5     9.3     12.7    53      

Я собираюсь найти индекс Херфиндаля для переменной класса за последние 5 лет. Например, нужно будет объединить все «классы» за последние 5 лет, а именно 2007, 2006, 2005, 2004, 2003, чтобы рассчитать индекс для 2018 года как:

 ((1/8)^2 + (1/8)^2 + (1/8)^2 + (1/8)^2 + (1/8)^2 + (3/8)^2) -  The higher index, the lesser a firm has diversified in patent classes. 
  53 is repeated 3 times, the rest only once

Я могу рассчитать этот индексдля каждой фирмы - каждый год, который говорит мне, насколько диверсифицирована фирма в данный год. Вот код:

import numpy as np

def hhi(series):
    _, cnt = np.unique(series, return_counts=True)
    return np.square(cnt/cnt.sum()).sum()    

new_df = df.groupby(['gvkey', 'year']).agg({'class': hhi})
print(new_df)

Однако теперь мне нужно объединить «классовые» значения за последние 5 лет, а затем вычислить индекс. Вероятно, нужно будет добавить «условие» в этот код, ориентированный на предыдущие годы.

Примечание 1: Можно спросить, что если пулы индекса будут длиться 5 лет, то в результатах первые 5 лет будут отсутствовать. Но я намерен рассчитать код, даже если в предыдущем году один . Другими словами, ячейка в новом столбце будет объединять все возможные годы и вычислять, но если в течение более 5 предыдущих лет ячейка будет учитывать только 5 из них (например, 7-й год фирмы).

Примечание 2: Есть много фирм и лет, поэтому код должен сделать то же самое для всех групп в панели.

Ожидаемый результат:

gvkey   sic         year    X       Y       Z       Class   HHI
61399   2835        2001    5.3     4.8     9.7     356     a  null
61399   2835        2002    5.3     4.8     9.7     358     b (class values in: 01)
61399   2835        2003    5.3     4.8     9.7     358     c (class values in: 02,01)
61399   2835        2004    5.66    6.22    11.1    548     d (class values in: 03,02,01)
61399   2835        2005    5.54    6.90    11.18   72      e (class values in: 04,03,02,01)
61399   2835        2005    5.54    6.90    11.18   156     e (class values in: 04,03,02,01)
61399   2835        2006    5.545   6.90    11.18   206     f (class values in: 05,04,03,02,01)
61399   2835        2007    5.5     9.3     12.7    53      g (class values in: 06,05,04,03,02)
61399   2835        2007    5.5     9.3     12.7    53      g (class values in: 06,05,04,03,02)
61399   2835        2007    5.5     9.3     12.7    53      g (class values in: 06,05,04,03,02)
61399   2835        2008    5.5     9.3     12.7    53      h (class values in: 07,06,05,04,03)

Примечание 3: лет можно повторить. Поэтому предыдущая строка не относится к предыдущему году.

Примечание 4: в переменной «class» отсутствуют значения. Если значение отсутствует, код должен игнорировать эту ячейку. Код должен будет создать своего рода портфель с использованием данных за последние 5 лет. Это не должно заботиться о пропущенных значениях

Извините, что это было немного длинным, но я хотел все прояснить. Если что-то еще не получено, сообщите мне.

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...