我想对大量组进行滚动求和计算,但我无法以可接受的速度完成它。
Pandas有内置的滚动和扩展计算方法。
这是一个例子:
我可以使用“滚动求和”和“扩展求和”来进行计算。
但是,对于非常大的组,这需要很长时间。对于扩展总和,使用pandas方法cumsum代替几乎快了60倍(对于上面的示例,16秒与280毫秒),可以将几小时缩短为几分钟。
有没有 pandas 中实现滚动求和的快速方法,就像 cumsum 用于扩展求和一样?如果没有,我能否使用 numpy 来完成这个任务?
Pandas有内置的滚动和扩展计算方法。
这是一个例子:
import pandas as pd
import numpy as np
obs_per_g = 20
g = 10000
obs = g * obs_per_g
k = 20
df = pd.DataFrame(
data=np.random.normal(size=obs * k).reshape(obs, k),
index=pd.MultiIndex.from_product(iterables=[range(g), range(obs_per_g)]),
)
我可以使用“滚动求和”和“扩展求和”来进行计算。
df.groupby(level=0).expanding().sum()
df.groupby(level=0).rolling(window=5).sum()
但是,对于非常大的组,这需要很长时间。对于扩展总和,使用pandas方法cumsum代替几乎快了60倍(对于上面的示例,16秒与280毫秒),可以将几小时缩短为几分钟。
df.groupby(level=0).cumsum()
有没有 pandas 中实现滚动求和的快速方法,就像 cumsum 用于扩展求和一样?如果没有,我能否使用 numpy 来完成这个任务?
.rolling()
比我的方法更快,%timeit
为 242 微秒,而我的方法为 371 微秒。我的经验是,对于我的数据集来说,它要快大约10倍,不知道为什么。 - Markdf.groupby(level=0).cumsum().shift(5)
难道不会将所有行都移位并混合不同组的累加和吗?也就是说,下一组的第一个结果被移回到了上一组?我认为你需要在apply中包含shift。像这样:df.groupby(level=0).cumsum() - df.groupby(level=0).apply(lambda x: x.cumsum().shift(10).fillna(0))
我的基准测试显示,这比pandas rolling快约两倍。(与上面的答案相比,速度相当慢,而且输出不同)。 - user2175850