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

时间:2017-07-03 07:00:25

标签: python pandas dataframe standard-deviation

是否有矢量化操作来计算Python DataFrame的累积和滚动标准差(SD)?

例如,我想添加一个列' c'它根据列'计算累积SD,即在索引0中,它显示由于1个数据点引起的NaN,在索引1中,它根据2个数据点计算SD,依此类推。 / p>

同样的问题也适用于推动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()

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我认为,如果用滚动表示累积,那么Pandas中的正确术语是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的案件由斯科特·波士顿(Scott Boston)处理,在熊猫中被称为rolling不足为奇。

如果expandingrolling(len(df), ...)的优势在于,您不需要事先知道len。这是非常有用的,例如在groupby数据框中。