【问题标题】:Vectorizing standard deviation calculations for pandas dataseries熊猫数据系列的矢量化标准差计算
【发布时间】:2015-01-15 22:32:34
【问题描述】:

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

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)

有没有办法向量化标准差计算?

【问题讨论】:

    标签: python pandas dataframe vectorization standard-deviation


    【解决方案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
    

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

    【讨论】:

    • 谢谢..这就是我要找的。我对这两种方式进行了性能比较……性能提高了 1000 倍。
    • 没问题。其中有几个“扩展”函数(均值、方差、最大值等)通常会派上用场。
    【解决方案2】:

    为了扩展@ajcr 的答案,我针对这两种方法运行了 %timeit。我认为使用 expand_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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-03
      • 2014-02-16
      • 2017-08-13
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多