创建一个列,它是前 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) 将防止您不小心回顾太多行。
我正在尝试创建一个列,其中我通过在不同列行中给定的参数对列的前 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) 将防止您不小心回顾太多行。