如何标准化滚动 pandas 数据帧的子集?
How to normalize subset of rolling pandas dataframe?
所以我有一个数据框,里面装满了整个股票代码。它们按代码和日期进行多重索引。我想要做的是仅针对该数据子集规范化其中一个指标列。例如,我希望 a 仅基于代码 A 对 ind1 的滚动 Zscore 上的数据进行标准化,然后对代码 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
所以我有一个数据框,里面装满了整个股票代码。它们按代码和日期进行多重索引。我想要做的是仅针对该数据子集规范化其中一个指标列。例如,我希望 a 仅基于代码 A 对 ind1 的滚动 Zscore 上的数据进行标准化,然后对代码 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