创建一个列,它是前 X 行的总和,其中 x 是由不同列行给出的参数

create a column that is the sum of previous X rows where x is a parm given by a different column row

我正在尝试创建一个列,其中我通过在不同列行中给定的参数对列的前 x 行求和。

我有一个解决方案,但它真的很慢,所以我想知道是否有人可以帮助更快地完成此操作。

| time                     |    price   |parm |
|--------------------------|------------|-----|
|2020-11-04 00:00:00+00:00 |    1.17600 |   1 |
|2020-11-04 00:01:00+00:00 |    1.17503 |   2 |
|2020-11-04 00:02:00+00:00 |    1.17341 |   3 |
|2020-11-04 00:03:00+00:00 |    1.17352 |   2 |
|2020-11-04 00:04:00+00:00 |    1.17422 |   3 |

和慢码


    @jit
    def rolling_sum(x,w):
        return np.convolve(x,np.ones(w,dtype=int),'valid')
    
    @jit
    def rol(x,y):
        for i in range(len(x)):
            res[i] = rolling_sum(x, y[i])[0]
        return res
    
    dfa = df[:500000]
    res = np.empty(len(dfa))
    
    r = rol(dfa.l_x.values, abs(dfa.mb).values+1)
    r

也许这样的方法可行。我编了一个例子,to_be_summed 是应该求和的值的列,looback 保存要回顾的行数

df = pd.DataFrame({"to_be_summed": range(10), "lookback":[0,1,2,3,2,1,4,2,1,2]})
summed =  df.to_be_summed.cumsum()
result = [summed[i] - summed[max(0,i - lookback - 1)] for i, lookback in enumerate(df.lookback)]

我在这里做的是先对应该求和的列做一个cumsum。现在,对于第 i 个条目,我可以取这个 cumsum 的条目,然后减去第 i + 1 步。请注意,这包括总和中的第 i 个值。如果你不想包含它,你只需要把 summed[i] 改为 summed[i - 1]。另请注意,这部分 max(0,i - lookback - 1) 将防止您不小心回顾太多行。