Python实现购销合同与收发货匹配的问题排查及代码修改咨询
S&P合同与C&D记录匹配的Python实现问题
背景
- 需求:实现购销合同(S&P合同)与实际收发货记录(C&D记录)的多维度匹配,匹配维度包含产品类型、买卖双方信息、价格、合同月份等
- 痛点:人工匹配效率极低,现有Python脚本存在两处关键问题
现存问题
- 已完成匹配的合同重复参与匹配:当合同初始规模已匹配至净头寸为0时,仍会被重复纳入匹配流程。例如合同编号30831总规模6.17,已完成匹配但仍被再次匹配
- 数值小数部分匹配错误:匹配结果中数值整数部分正确,但小数部分常出现偏差
代码修改方向
解决已匹配合同重复匹配问题
- 在匹配循环前添加过滤逻辑,排除净头寸为0的合同:
# 过滤掉净头寸为0的S&P合同 active_sp_contracts = [contract for contract in sp_contracts if contract["net_position"] != 0] - 若采用面向对象设计,可为合同类新增
is_completely_matched布尔属性,匹配完成后标记为True,后续匹配遍历仅处理is_completely_matched为False的合同 - 检查匹配完成后的状态更新代码,确保合同的净头寸或匹配状态被正确保存,不会在后续循环中被意外重置
修复小数部分匹配错误
- 替换浮点类型为
decimal.Decimal处理所有计量数值(货物量、价格等),避免二进制浮点精度误差:from decimal import Decimal, getcontext # 设置精度,根据业务需求调整 getcontext().prec = 10 # 转换数值为Decimal类型 contract_quantity = Decimal(str(contract["quantity"])) cd_quantity = Decimal(str(cd_record["quantity"])) - 数值比较时避免直接使用
==,改用精度阈值判断相等:# 设置合理的精度阈值,例如0.000001 if abs(contract_quantity - cd_quantity) < Decimal("0.000001"): # 执行匹配逻辑 - 检查数据读取环节,确保从数据源(如CSV、Excel)读取的小数数值被正确解析,未因类型转换丢失精度
内容的提问来源于stack exchange,提问作者scc
相关产品推荐
相关产品推荐

