是否有矢量化操作来计算Python DataFrame的累积和滚动标准偏差(SD)?
例如,我想添加一个列'c',它根据列'a'计算累积SD,即在索引0中,它显示由于1个数据点的NaN,在索引1中,它根据2个数据计算SD点,等等。
同样的问题也适用于推动SD。有没有一种有效的计算方法而不通过df.itertuples()进行迭代?
import numpy as np
import pandas as pd
def main():
np.random.seed(123)
df = pd.DataFrame(np.random.randn(10, 2), columns=['a', 'b'])
print(df)
if __name__ == '__main__':
main()
对于columna'a'的累积SD基数,让我们使用rolling
,其窗口大小是数据帧和min_periods = 2
的长度:
df['a'].rolling(len(df),min_periods=2).std()
输出:
a b c
0 -1.085631 0.997345 NaN
1 0.282978 -1.506295 0.967753
2 -0.578600 1.651437 0.691916
3 -2.426679 -0.428913 1.133892
4 1.265936 -0.866740 1.395750
5 -0.678886 -0.094709 1.250335
6 1.491390 -0.638902 1.374933
7 -0.443982 -0.434351 1.274843
8 2.205930 2.186786 1.450563
9 1.004054 0.386186 1.403721
并且一次基于两个值滚动SD:
df['c'] = df['a'].rolling(2).std()
输出:
a b c
0 -1.085631 0.997345 NaN
1 0.282978 -1.506295 0.967753
2 -0.578600 1.651437 0.609228
3 -2.426679 -0.428913 1.306789
4 1.265936 -0.866740 2.611073
5 -0.678886 -0.094709 1.375197
6 1.491390 -0.638902 1.534617
7 -0.443982 -0.434351 1.368514
8 2.205930 2.186786 1.873771
9 1.004054 0.386186 0.849855
我认为,如果通过滚动你的意思是累积,那么熊猫中的正确术语是expanding
:
它也接受min_periods
论证。
df['c'] = df['a'].expanding(2).std()
rolling
的案例由斯科特波士顿处理,毫不奇怪,在熊猫中称为rolling
。
如果expanding
超过rolling(len(df), ...)
的优势是,你不需要提前知道len
。它非常有用,例如在groupby
数据帧中。