gpt4 book ai didi

python - 如何对滚动数据的子集应用滚动聚合函数?

转载 作者:行者123 更新时间:2023-12-01 07:57:44 24 4
gpt4 key购买 nike

假设我有一个很大的数据集,并且我想在很长一段时间内应用滚动操作,但只想对少量数据点应用聚合。我可以用 pandas 来做到这一点吗? ?

当我尝试将切片器应用于聚合函数的结果时,似乎为时已晚,整个计算已经发生:

small = 10
big = 1000
bigger = 10000000
s = pd.Series(np.arange(bigger))

%time x = s.rolling(big).mean()
%time x = s.rolling(big).mean()[:-small]

其输出是:

CPU times: user 306 ms, sys: 162 ms, total: 467 ms
Wall time: 468 ms
CPU times: user 291 ms, sys: 127 ms, total: 418 ms
Wall time: 418 ms

在上面的示例中,我希望第二个定时表达式运行得更快,因为我只需要计算最后 10 个数据点的聚合,但它花费的时间与计算 1000 万个数据点的时间相同.

我在这里做错了什么?

在我的实际场景中,我同时使用 rollingexpanding ,所以我正在寻找适用于两者的解决方案。另外,在我的实际例子中big几乎与 bigger 相同.

编辑:下面说明了计算滚动平均值与没有冗余计算的计算的性能差异。它计算了朴素情况,解决方案为 3UqU57GnaX ,以及“手动”计算。请注意,手动计算是我希望在一般情况下实现的(显然我不想手动实现每个聚合函数):

import pandas as pd
import numpy as np

small = 10
big = 10000000
bigger = 100000000
s = pd.Series(np.arange(bigger))

def adjusted_mean(current_mean, removed_element, new_element, length):
return current_mean + (new_element - removed_element) / length

def rolling_mean_optimisation(small, big):
current_mean = s[-big-small:-small].mean()

return [adjusted_mean(current_mean, s.values[-big-x], s.values[-x], big) for x in range(small, 0, -1)]

%time naive = s.rolling(big).mean()[-small:]
%time answer_by_3UqU57GnaX = s[-big-small:].rolling(big).mean()[-small:]
%time manual_mean_optimisation = rolling_mean_optimisation(small, big)

同时3UqU57GnaX的答案比天真的情况有了很大的改进,手动实现几乎快了一个数量级(实际数量取决于 bigbigger 的大小:

CPU times: user 3.31 s, sys: 1.56 s, total: 4.87 s
Wall time: 4.88 s
CPU times: user 292 ms, sys: 154 ms, total: 446 ms
Wall time: 445 ms
CPU times: user 60.3 ms, sys: 21.2 ms, total: 81.4 ms
Wall time: 81.2 ms

最佳答案

自从您首次在整个系列上应用滚动平均值以来,花费的时间相同。

如果您仅将其应用于最后 10 个数据点 (s[-10:]),那么速度会更快:

s[-10:].rolling(1000).mean()

但是,这将为您提供 NaN 值,因为您只使用最后 10 个数据点,但需要 1000 个数据点作为滚动平均值。

编辑:这不会给你 NaN 并且应该更快:

s[-big-small:].rolling(big).mean()[-small:]

关于python - 如何对滚动数据的子集应用滚动聚合函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55881025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com