pandas 数据系列的矢量化标准偏差计算
Vectorizing standard deviation calculations for pandas dataseries
我有一个pandas系列,像这样,
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)
有没有办法向量化标准差计算?
您可能对 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 循环以提高速度。
为了扩展@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
我有一个pandas系列,像这样,
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)
有没有办法向量化标准差计算?
您可能对 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 循环以提高速度。
为了扩展@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