Python数据框中的滚动和累积标准偏差

问题描述 投票:1回答:2

是否有矢量化操作来计算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()
python pandas dataframe standard-deviation
2个回答
2
投票

对于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

0
投票

我认为,如果通过滚动你的意思是累积,那么熊猫中的正确术语是expanding

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.expanding.html#pandas.DataFrame.expanding

它也接受min_periods论证。

df['c'] = df['a'].expanding(2).std()

rolling的案例由斯科特波士顿处理,毫不奇怪,在熊猫中称为rolling

如果expanding超过rolling(len(df), ...)的优势是,你不需要提前知道len。它非常有用,例如在groupby数据帧中。

© www.soinside.com 2019 - 2024. All rights reserved.