Итак, у меня есть датафрейм, полный целой вселенной биржевых тикеров. Они мультииндексируются по тикеру, а затем по дате. Я пытаюсь нормализовать один из столбцов индикатора только для этого подмножества данных. Например, я хотел бы нормализовать данные о скользящем 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
Можете ли вы попытаться .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
Кажется, это именно то, что я искал! Спасибо !
Каков ваш ожидаемый результат, можете ли вы добавить больше выборочных строк и изменить rolling(30) на rolling(2) или rolling(x), где x меньше, чем максимальное количество строк в группе, и показать ожидаемый результат?