Индексирование цены акций возвращается к 100 на дату начала - PullRequest
1 голос
/ 27 января 2020

У меня есть набор данных, который содержит ежедневные процентные доходы для различных фондовых отраслей. Полный набор данных слишком велик, чтобы показать его здесь, но вот фиктивный фрейм данных с более или менее одинаковой структурой:

df = pd.DataFrame(np.array([['01/01/2020', 'energy', 0.25], ['01/02/2020', 'energy', -2], ['01/01/2020', 'technology', 1.5], ['01/02/2020', 'technology', 1], ['01/01/2020', 'healthcare', -1], ['01/02/2020', 'healthcare', 0.5]]),
                       columns=['date', 'industry', 'return'])
         date    industry return
0  01/01/2020      energy   0.25
1  01/02/2020      energy     -2
2  01/01/2020  technology    1.5
3  01/02/2020  technology      1
4  01/01/2020  healthcare     -1
5  01/02/2020  healthcare    0.5

Я хотел бы создать индекс для каждой отдельной отрасли, который начинается с 100 для первая дата кадра данных, а затем увеличивается / уменьшается в зависимости от процента возврата этого дня до последней даты в кадре данных. Я могу заполнить начальное значение 100 для самых ранних дат:

df['index'] = np.where(df['date'] == df['date'].min(), 100, 0)
         date    industry return  index
0  01/01/2020      energy   0.25    100
1  01/02/2020      energy     -2      0
2  01/01/2020  technology    1.5    100
3  01/02/2020  technology      1      0
4  01/01/2020  healthcare     -1    100
5  01/02/2020  healthcare    0.5      0

Но я действительно не знаю, как продолжить заполнение других значений индекса отсюда. Вывод должен выглядеть следующим образом:

         date    industry return  index
0  01/01/2020      energy   0.25    100
1  01/02/2020      energy     -2     98
2  01/01/2020  technology    1.5    100
3  01/02/2020  technology      1    101
4  01/01/2020  healthcare     -1    100
5  01/02/2020  healthcare    0.5  100.5

Кто-нибудь здесь знает, как это сделать / может указать мне правильное направление? * уточнение: мне нужно значение индекса «составной», а не кумулятивный. Например, допустим, у меня есть 3 даты для отрасли, и процентные доходы равны 0,5, 0,1 и 1,2 соответственно, выходной индекс должен быть 100 (начальная дата), 100,1 (100 * 1,001) и 101,3012 100 (100,1 * 1,012). )

1 Ответ

1 голос
/ 27 января 2020

Используйте GroupBy.cumsum, устанавливая первое значение return для каждой отрасли с Series.mask:

#df['return']=df['return'].astype(float) #if necessary
df['index'] = (df['return'].mask(df['industry'].ne(df['industry'].shift()),0)
                           .groupby(df['industry'])
                           .cumsum().add(100))
print(df)
         date    industry  return  index
0  01/01/2020      energy    0.25  100.0
1  01/02/2020      energy   -2.00   98.0
2  01/01/2020  technology    1.50  100.0
3  01/02/2020  technology    1.00  101.0
4  01/01/2020  healthcare   -1.00  100.0
5  01/02/2020  healthcare    0.50  100.5

ОБНОВЛЕНО

df['index'] =  (df['return'].astype(float)
                            .div(100)
                            .add(1)
                            .mask(df['industry'].ne(df['industry'].shift()),100)
                            .groupby(df['industry'])
                            .cumprod())
print(df)
         date    industry  return  index
0  01/01/2020      energy     0.5  100.0
1  01/02/2020      energy     0.1  100.1
2  01/01/2020  technology     1.2  100.0
3  01/02/2020  technology     0.5  100.5
4  01/01/2020  healthcare     0.1  100.0
5  01/02/2020  healthcare     1.2  101.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...