Pandas如何使用iloc自动化实现不同列数的批量连乘计算
Pandas自动匹配乘数列实现跨节点预测值连乘计算
原始数据
持有的DataFrame结构如下:
import pandas as pd df = pd.DataFrame({ 'date' : ['2020-6','2020-07','2020-8'], 'd3_real':[1.2,1.3,0.8], 'd7_real' : [1.5,1.8,1.2], 'd14_real':[1.9,2.1,1.5], 'd30_real' : [2.1, 2.2, 1.8], 'd7_mul':[1.12,1.1,1.15], 'd14_mul':[1.08, 1.1, 1.14], 'd30_mul':[1.23,1.25,1.12] })
列含义说明:
dX_real:第X天节点的实际值dX_mul:对应区间的乘数系数
计算需求
计算从各前置节点推导到d30的预测值,规则为:取起始节点的实际值,依次乘上该节点之后到d30为止所有区间的乘数。
手动实现的参考代码如下:
df['d30_from_d3'] = df.iloc[:,1] * df.iloc[:,5] * df.iloc[:,6] * df.iloc[:,7] df['d30_from_d7'] = df.iloc[:,2] * df.iloc[:,6] * df.iloc[:,7] df['d30_from_d14'] = df.iloc[:,3] * df.iloc[:,7]
由于不同起始节点需要乘的乘数数量不一致,硬编码每列计算逻辑扩展性差,需要通过循环自动匹配每个起始节点对应的乘数范围,完成批量计算。之前尝试的嵌套循环写法逻辑错误,仅能赋值起始实际值,无法完成对应范围乘数的连乘。
实现代码
直接利用列位置的偏移关系,切片取出每个起始节点对应的后续所有乘数列,用pandas内置的按行乘积方法计算,不需要嵌套循环:
# 配置项:实际值列的索引位置、第一个乘数列的索引位置、节点名称 real_col_pos = [1, 2, 3] first_mul_pos = 5 node_list = ['d3', 'd7', 'd14'] for i, pos in enumerate(real_col_pos): # 切片取当前节点之后的所有乘数列 target_mul_cols = df.iloc[:, first_mul_pos + i :].columns # 计算:起始实际值 * 后续所有乘数的行乘积 df[f'd30_from_{node_list[i]}'] = df.iloc[:, pos] * df[target_mul_cols].prod(axis=1)
逻辑说明
列位置的偏移和遍历索引完全匹配,不需要额外写条件判断:
- 起始节点为d3(遍历索引i=0):乘数列从第5列开始取,覆盖
d7_mul/d14_mul/d30_mul三列 - 起始节点为d7(遍历索引i=1):乘数列从第6列开始取,覆盖
d14_mul/d30_mul两列 - 起始节点为d14(遍历索引i=2):乘数列从第7列开始取,覆盖
d30_mul一列
后续如果要新增d60等更长周期的节点,只需要在DataFrame中追加对应列,同时在配置项中添加对应的实际值列位置、节点名称即可,不需要修改核心计算逻辑。
内容的提问来源于stack exchange,提问作者MatmataHi
相关产品推荐
相关产品推荐

