Python下结合PRODUCT、AVERAGE公式基于流量DataFrame制作损失率表的方法
Loss Rate表生成可直接复用代码
完全匹配你整理的Excel计算规则,可直接对接现有Flow Rate DataFrame使用,无需调整核心公式逻辑。
核心计算逻辑对齐说明
- 逐格累乘规则:复现Excel中
PRODUCT(当前列:$最右列)的绝对引用乘积逻辑,即每一行从对应列位置开始,向右连续乘到该行的最后一列,计算结果和Excel原公式无偏差 - 列方向平均规则:复现Excel中
AVERAGE(累乘结果行范围)的简单平均逻辑,无额外加权计算
可直接运行的代码
import pandas as pd import numpy as np def build_loss_rate_table(flow_rate_df: pd.DataFrame, product_row_start: int, product_row_end: int) -> pd.DataFrame: # 拷贝原始数据,避免修改源Flow Rate DataFrame loss_df = flow_rate_df.copy() # 逐行计算从当前列到最右列的累计乘积 for row_pos in range(product_row_start, product_row_end + 1): row_arr = loss_df.iloc[row_pos].to_numpy(dtype=np.float64) # 反向累计乘积后反转,实现从当前列到最右列的乘积效果 right_cumprod = np.cumprod(row_arr[::-1])[::-1] loss_df.iloc[row_pos] = right_cumprod # 计算每列的累乘结果平均值,对应Excel第13行的平均行 col_avg = loss_df.iloc[product_row_start:product_row_end + 1].mean(axis=0) # 将平均行插入到累乘计算行的下一行(对应Excel平均行的位置) loss_df = pd.concat([ loss_df.iloc[:product_row_end + 1], pd.DataFrame([col_avg], columns=loss_df.columns, index=[product_row_end + 1]), loss_df.iloc[product_row_end + 1:] ]) return loss_df
使用方法
- 参数转换:Excel行号从1开始计数,使用前需转换为Python的0起始索引。比如你提到的Excel中累乘范围是第8行到第12行,对应Python的索引就是7到11,直接传入对应参数即可:
# 替换为你自己的Flow Rate DataFrame变量名 final_loss_table = build_loss_rate_table( flow_rate_df=your_flow_rate_dataframe, product_row_start=7, product_row_end=11 ) - 结果校验:可随机抽取单个单元格的计算结果和Excel公式结果做对比,因累乘、平均的计算逻辑和Excel完全一致,数值偏差会控制在常规浮点误差范围内
内容的提问来源于stack exchange,提问作者Mohsin Jamil
相关产品推荐
相关产品推荐

