滚动平均 pandas DataFrame 的所有值

2024-04-29

我有一个 pandas DataFrame,我想在滚动的基础上计算所有值的平均值:对于所有列,对于滚动窗口中的所有观察值。

我有一个带循环的解决方案,但感觉效率很低。请注意,我可以有NaNs在我的数据中,因此计算总和并除以窗口的形状并不安全(因为我想要一个nanmean).

还有更好的方法吗?

Setup

import numpy as np
import pandas as pd

np.random.seed(1)

df = pd.DataFrame(np.random.randint(0, 10, size=(10, 2)), columns=['A', 'B'])

df[df>5] = np.nan  # EDIT: add nans

我的尝试

n_roll = 2

df_stacked = df.values
roll_avg = {}
for idx in range(n_roll, len(df_stacked)+1):
    roll_avg[idx-1] = np.nanmean(df_stacked[idx - n_roll:idx, :].flatten())

roll_avg = pd.Series(roll_avg)
roll_avg.index = df.index[n_roll-1:]
roll_avg = roll_avg.reindex(df.index)

期望的结果

roll_avg
Out[33]: 
0         NaN
1    5.000000
2    1.666667
3    0.333333
4    1.000000
5    3.000000
6    3.250000
7    3.250000
8    3.333333
9    4.000000

Thanks!


这是一种关闭滑动窗口的 NumPy 解决方案view_as_windows -

from skimage.util.shape import view_as_windows

# Setup o/p array
out = np.full(len(df),np.nan)

# Get sliding windows of length n_roll along axis=0
w = view_as_windows(df.values,(n_roll,1))[...,0]

# Assign nan-ignored mean values computed along last 2 axes into o/p
out[n_roll-1:] = np.nanmean(w, (1,2))

内存效率views -

In [62]: np.shares_memory(df,w)
Out[62]: True
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

滚动平均 pandas DataFrame 的所有值 的相关文章

随机推荐