加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 使用不同长度的pandas数据帧计算滚动窗口的加权和

发布时间:2020-12-20 11:59:05 所属栏目:Python 来源:网络整理
导读:我有一个大型数据框我正在执行滚动计算的5000000行. df = pd.DataFrame(np.randn(10000,1),columns = ['rand'])sum_abs = df.rolling(5).sum() 我想做同样的计算,但加上一个加权和. df2 = pd.DataFrame(pd.Series([1,2,3,4,5]),name ='weight'))df3 = df.mul
我有一个大型数据框>我正在执行滚动计算的5000000行.

df = pd.DataFrame(np.randn(10000,1),columns = ['rand'])
sum_abs = df.rolling(5).sum()

我想做同样的计算,但加上一个加权和.

df2 = pd.DataFrame(pd.Series([1,2,3,4,5]),name ='weight'))
df3 = df.mul(df2.set_index(df.index)).rolling(5).sum()

但是,我得到一个长度不匹配的预期轴有5个元素错误.
我知道我可以做一些像[a * b for a,b in zip(L,weight)]的东西,如果我将所有内容转换为列表但我想尽可能保留在数据框中.有没有办法乘以不同大小的帧或我需要重复数字集合我乘以的数据集的长度?

解决方法

简单的方法是这样做

w = np.arange(1,6)
df.rolling(5).apply(lambda x: (x * w).sum())

使用步幅不太容易的方法

from numpy.lib.stride_tricks import as_strided as strided 

v = df.values
n,m = v.shape
s1,s2 = v.strides
k = 5
w = np.arange(1,6).reshape(1,1,k)
pd.DataFrame(
    (strided(v,(n - k + 1,m,k),(s1,s2,s1)) * w).sum(-1),df.index[k - 1:],df.columns)

天真的时间测试

enter image description here

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读