You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何动态实现Python中非相邻行的Rolling Product计算?

优化非相邻行滚动乘积计算方案

需求说明

计算非相邻行的滚动乘积,例如每隔5行取数据计算乘积(如指定行与其前5、10、15行的数据乘积)。

原实现的问题

原代码通过手动创建多个shift列再求乘积,当需要调整间隔步长或改变回溯的间隔次数时,必须手动修改shift的参数和列名,扩展性极差,无法快速适配动态调整的需求。

原代码:

temp = pd.DataFrame([range(20)]).transpose()
df = temp.copy()
df['shift1'] = temp.shift(5)
df['shift2'] = temp.shift(10)
df['shift3'] = temp.shift(15)

result = df.product(axis=1)

优化方案

方案1:参数化动态生成间隔列

通过定义步长和回溯次数,动态生成所有需要的间隔列,再统一计算乘积,无需手动新增列。

import pandas as pd

temp = pd.DataFrame([range(20)]).transpose()
step = 5  # 自定义间隔步长
num_backtracks = 3  # 自定义回溯次数(即取当前行+前3次间隔行)

# 生成包含当前行及所有间隔行的DataFrame
shifted_frames = [temp.shift(i * step) for i in range(num_backtracks + 1)]
combined_df = pd.concat(shifted_frames, axis=1)

# 计算每行的乘积
result = combined_df.product(axis=1)

只需修改step和num_backtracks两个参数,就能快速调整间隔规则,适配不同场景。

方案2:自动取所有历史间隔行乘积

如果需要计算当前行及所有符合间隔规则的历史行的乘积(无需限制回溯次数),可以用apply结合索引范围实现:

import pandas as pd

temp = pd.DataFrame([range(20)]).transpose()
step = 5  # 自定义间隔步长

# 对每行取当前行及所有间隔step的历史行,计算乘积
result = temp.apply(lambda row: row.iloc[range(row.name, -1, -step)].prod(), axis=1)

该方案会自动遍历当前行之前所有间隔step的行,直到索引为0,无需手动指定回溯次数,灵活性更强。

内容的提问来源于stack exchange,提问作者Mango

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:25:33