如何标准化滚动熊猫数据框的子集?

时间:2020-12-21 06:50:29

标签: python-3.x pandas dataframe stock

所以我有一个充满整个股票行情的数据框。它们按代码和日期进行多重索引。我想要做的是仅针对该数据子集标准化指标列之一。例如,我希望仅根据股票代码 A 对 ind1 的滚动 Zscore 上的数据进行标准化,然后对股票代码 B 进行相同的处理,依此类推。我能够以迭代方式将此归一化应用于数据帧的切片,但我正在寻找一种方法来轻松应用此滚动归一化n,而无需按代码进行切片。

这是我正在使用的 Zscore 规范化,但我想将其应用于数据帧中的每个股票代码子集,而不需要切片然后重新附加到新的数据帧。

JTable

这是数据帧结构的示例

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

1 个答案:

答案 0 :(得分:2)

您可以尝试使用 .groupbylevel=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