如何动态实现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
相关产品推荐
相关产品推荐

