矢量化pandas数据集的标准差计算

时间:2015-01-15 22:32:35

标签: python pandas dataframe vectorization standard-deviation

我有一个像这样的熊猫系列,

data = [1,2,3,2,4,5,6,3,5]
ds = pd.Series(data)
print (ds)

0    1
1    2
2    3
3    2
4    4
5    5
6    6
7    3
8    5

我有兴趣获得每个索引的标准偏差。例如,当我在索引5时,我想计算ds[0:4]的标准偏差。

我使用以下代码

完成了这项工作
df = pd.DataFrame(columns = ['data', 'avreturns', 'sd'])
df.data = data        

for i in df.index:
    dataslice = df.ix[0:i]
    df['avreturns'].loc[i] = dataslice.data.mean()
    df['sd'].loc[i] = dataslice.data.std()
print (df)

   data avreturns         sd
0     1         1        NaN
1     2       1.5  0.7071068
2     3         2          1
3     2         2  0.8164966
4     4       2.4   1.140175
5     5  2.833333    1.47196
6     6  3.285714   1.799471
7     3      3.25   1.669046
8     5  3.444444   1.666667

这样可行,但我使用循环并且速度很慢。有没有办法对此进行矢量化?

我能够使用cumsum()函数对平均值计算进行矢量化:

df.data.cumsum()/(df.index+1)

有没有办法对标准差计算进行矢量化?

2 个答案:

答案 0 :(得分:1)

您可能对pd.expanding_std感兴趣,>>> pd.expanding_std(ds) 0 NaN 1 0.707107 2 1.000000 3 0.816497 4 1.140175 5 1.471960 6 1.799471 7 1.669046 8 1.666667 dtype: float64 会为您计算累积标准偏差:

{{1}}

对于它的价值,这种类型的累积操作可能非常繁琐地进行矢量化:the Pandas implementation似乎循环使用Cython来提高速度。

答案 1 :(得分:1)

为了扩展@ ajcr的回答,我针对这两种方式运行了%timeit。我认为使用expanding_stds ...

可以提高1000倍
data = [x for x in range(1000)]
ds = pd.Series(data)
df = pd.DataFrame(columns = ['data', 'avreturns', 'sd'])
df.data = data        

def foo(df):
    for i in df.index:
        dataslice = df.ix[0:i]
        df['avreturns'].loc[i] = dataslice.data.mean()
        df['sd'].loc[i] = dataslice.data.std()
    return (df)

%timeit foo(df)
1 loops, best of 3: 1min 36s per loop

%timeit pd.expanding_std(df.data)
10000 loops, best of 3: 126 µs per loop