是否有矢量化操作来计算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()
答案 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
:
它也接受min_periods
自变量。
df['c'] = df['a'].expanding(2).std()
rolling
的案件由斯科特·波士顿(Scott Boston)处理,在熊猫中被称为rolling
不足为奇。
如果expanding
比rolling(len(df), ...)
的优势在于,您不需要事先知道len
。这是非常有用的,例如在groupby
数据框中。