У меня есть следующие данные:
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 лет. Это не должно заботиться о пропущенных значениях
Извините, что это было немного длинным, но я хотел все прояснить. Если что-то еще не получено, сообщите мне.
Заранее спасибо.