我有一个大型数据框>我正在执行滚动计算的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)]
之类的操作但是如果可能的话我希望将其保存在数据框中。有没有办法对不同大小的帧进行乘法运算,还是我需要重复数据集的长度I' m乘以?
答案 0 :(得分:7)
简单的方法是
w = np.arange(1, 6)
df.rolling(5).apply(lambda x: (x * w).sum())
使用strides
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)
天真时间测试