Как нормализовать подмножество скользящего кадра данных pandas?

Итак, у меня есть датафрейм, полный целой вселенной биржевых тикеров. Они мультииндексируются по тикеру, а затем по дате. Я пытаюсь нормализовать один из столбцов индикатора только для этого подмножества данных. Например, я хотел бы нормализовать данные о скользящем Zscore для ind1 только на основе тикера A, затем то же самое для тикера B и так далее и тому подобное. Я могу итеративно применить эту нормализацию к срезу фрейма данных, но я ищу способ легко применить эту скользящую нормализацию без нарезки по тикеру.

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

df['normalizedInd1'] = (df['ind1'] - df['ind1'].rolling(30).mean()) / df['ind1'].rolling(30).std()

И это образец структуры фрейма данных

                  secid       ind1       ind2
ticker  date            
A   2011-01-03  101149.0    100792.5533  177960.0
    2011-01-04  101149.0    127658.3339  304624.0
    2011-01-05  101149.0    122648.9491  77050.0
B   2011-01-06  101150.0    110161.8415  151825.0
    2011-01-10  101150.0    112800.4117  378804.0
    2011-01-11  101150.0    79074.8645   525628.0

Каков ваш ожидаемый результат, можете ли вы добавить больше выборочных строк и изменить rolling(30) на rolling(2) или rolling(x), где x меньше, чем максимальное количество строк в группе, и показать ожидаемый результат?

David Erickson 21.12.2020 07:57
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
1
543
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Можете ли вы попытаться .groupby проиндексировать первый столбец с помощью level=0 ИЛИ ticker? Затем используйте .groupby объект g, чтобы выполнить расчет для каждой группы. Я изменил с rolling(30) на rolling(2), чтобы был вывод:

g = df.groupby(level=0)['ind1'].rolling(2)
df['normalizedInd1'] = (df['ind1'] - g.mean().droplevel(0)) / g.std().droplevel(0)
df
Out[1]: 
                      secid         ind1      ind2  normalizedInd1
ticker date                                                       
A      2011-01-03  101149.0  100792.5533  177960.0             NaN
       2011-01-04  101149.0  127658.3339  304624.0        0.707107
       2011-01-05  101149.0  122648.9491   77050.0       -0.707107
B      2011-01-06  101150.0  110161.8415  151825.0             NaN
       2011-01-10  101150.0  112800.4117  378804.0        0.707107
       2011-01-11  101150.0   79074.8645  525628.0       -0.707107

Кажется, это именно то, что я искал! Спасибо !

David Eccles 24.12.2020 18:45

Другие вопросы по теме