Pandas -计算所有列的滚动标准差

ifsvaxew  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(64)

假设我有一个pd.DataFrame,想要计算滚动标准差。在pandas中,我可以使用rolling(window=x).std(),但它会给我列的SD。然而,我想要给定行中所有列的标准差。
作为一个例子,考虑pd框架

df = pd.DataFrame({'col1': [1,2,3,4,5,6], 'col2': [-1,-2,-3,-4,-5,-6], 'col3': [1,2,3,4,5,6]})
df
   col1  col2  col3
0     1    -1     1
1     2    -2     2
2     3    -3     3
3     4    -4     4
4     5    -5     5
5     6    -6     6

字符串
例如,当计算窗口大小为2时,我希望将第2行的标准差作为两行之和除以6(或6-1),所以:np.std([2,-2,2,1,-1,1])。
我试着在一个融化的格子上计算它,但我没有得到预期的结果:

df.reset_index().melt(id_vars='index').set_index('index')['value'].rolling(2).std()


有人知道怎么做吗?我很感激你的反馈。

kdfy810k

kdfy810k1#

n = len(df.columns)
window = 2
out = df.stack().rolling(window * n).std().xs(df.columns[-1], level=-1)

字符串
输出:

0         NaN
1    1.643168
2    2.639444
3    3.656045
4    4.679744
5    5.706721
dtype: float64


out是标准的。
你说除以6或5,所以我不除以任何东西给你选择。

v8wbuo2f

v8wbuo2f2#

在我看来,最有效的是使用numpysliding_window_view来形成一个3D中间体,并在其上使用std(要知道numpy的std默认有ddof=0和pandas ddof=1):

from numpy.lib.stride_tricks import sliding_window_view as swv

N = 2
out = pd.Series(swv(df.to_numpy(), N, axis=0).std((1,2), ddof=1),
                index=df.index[N-1:])

字符串
输出量:
作为新列:

from numpy.lib.stride_tricks import sliding_window_view as swv

N = 2
df.loc[df.index[N-1:], 'out'] = (swv(df.to_numpy(), N, axis=0)
                                 .std((1,2), ddof=1)
                                )


输出量:

col1  col2  col3       out
0     1    -1     1       NaN
1     2    -2     2  1.643168
2     3    -3     3  2.639444
3     4    -4     4  3.656045
4     5    -5     5  4.679744
5     6    -6     6  5.706721

相关问题