微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个大型数据框>我正在执行滚动计算的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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐