使用Python查找增值税账户中已知结果Z的构成运算及对应数值
增值税账户数值匹配运算的Python实现
前置准备
- 安装依赖库:
pip install pandas openpyxl(读取.xlsx文件需用到) - 确认Excel文件中包含待分析的数值列(示例中列名为
金额,可根据实际修改)
完整代码
import pandas as pd import numpy as np # ---------------------- 配置参数 ---------------------- EXCEL_PATH = "你的增值税账户数据.xlsx" # 替换为你的文件实际路径 VALUE_COLUMN = "金额" # 替换为Excel中数值列的真实列名 TARGET_Z = 31004 # 目标结果值 ERROR_TOLERANCE = 0.01 # 浮点误差容忍度,适配货币计算的分位误差 COMMON_TAX_RATES = [0.03, 0.06, 0.09, 0.13, 0.15, 0.2] # 常见税率(小数形式,可按需添加) # ------------------------------------------------------ # 读取Excel数据并提取数值列 df = pd.read_excel(EXCEL_PATH) values = df[VALUE_COLUMN].dropna().tolist() # 过滤空值,转为列表 value_indices = df[VALUE_COLUMN].dropna().index.tolist() # 保留原始行索引,方便回溯原数据 # 存储匹配到的运算组合 matches = [] # 1. 单值运算匹配 for idx, num in zip(value_indices, values): # 情况1:数值直接等于Z if np.isclose(num, TARGET_Z, atol=ERROR_TOLERANCE): matches.append(f"行索引{idx}:{num} = {TARGET_Z}(直接匹配)") # 情况2:数值的某一百分比等于Z(反推税率) if num != 0: calc_rate = TARGET_Z / num if any(np.isclose(calc_rate, rate, atol=0.001) for rate in COMMON_TAX_RATES): matched_rate = next(r for r in COMMON_TAX_RATES if np.isclose(calc_rate, r, atol=0.001)) matches.append(f"行索引{idx}:{num} × {matched_rate*100}% = {TARGET_Z}") # 2. 双值组合运算匹配 for i in range(len(values)): a = values[i] a_idx = value_indices[i] for j in range(i+1, len(values)): # 避免重复计算同一组数值(如a+b和b+a只算一次加法) b = values[j] b_idx = value_indices[j] # 加法 if np.isclose(a + b, TARGET_Z, atol=ERROR_TOLERANCE): matches.append(f"行索引{a_idx}({a}) + 行索引{b_idx}({b}) = {TARGET_Z}") # 减法(两种顺序) if np.isclose(a - b, TARGET_Z, atol=ERROR_TOLERANCE): matches.append(f"行索引{a_idx}({a}) - 行索引{b_idx}({b}) = {TARGET_Z}") if np.isclose(b - a, TARGET_Z, atol=ERROR_TOLERANCE): matches.append(f"行索引{b_idx}({b}) - 行索引{a_idx}({a}) = {TARGET_Z}") # 乘法 if np.isclose(a * b, TARGET_Z, atol=ERROR_TOLERANCE): matches.append(f"行索引{a_idx}({a}) × 行索引{b_idx}({b}) = {TARGET_Z}") # 税务常见的百分比组合运算 # 情况1:两数之和的某一百分比等于Z sum_ab = a + b if sum_ab != 0: calc_rate = TARGET_Z / sum_ab if any(np.isclose(calc_rate, rate, atol=0.001) for rate in COMMON_TAX_RATES): matched_rate = next(r for r in COMMON_TAX_RATES if np.isclose(calc_rate, r, atol=0.001)) matches.append(f"(行索引{a_idx}({a}) + 行索引{b_idx}({b})) × {matched_rate*100}% = {TARGET_Z}") # 情况2:两数之差的某一百分比等于Z(两种顺序) diff_ab = a - b if diff_ab != 0: calc_rate = TARGET_Z / diff_ab if any(np.isclose(calc_rate, rate, atol=0.001) for rate in COMMON_TAX_RATES): matched_rate = next(r for r in COMMON_TAX_RATES if np.isclose(calc_rate, r, atol=0.001)) matches.append(f"(行索引{a_idx}({a}) - 行索引{b_idx}({b})) × {matched_rate*100}% = {TARGET_Z}") diff_ba = b - a if diff_ba != 0: calc_rate = TARGET_Z / diff_ba if any(np.isclose(calc_rate, rate, atol=0.001) for rate in COMMON_TAX_RATES): matched_rate = next(r for r in COMMON_TAX_RATES if np.isclose(calc_rate, r, atol=0.001)) matches.append(f"(行索引{b_idx}({b}) - 行索引{a_idx}({a})) × {matched_rate*100}% = {TARGET_Z}") # 输出匹配结果 if matches: print("找到以下匹配的运算组合:") for match in matches: print("-", match) else: print("未找到匹配的运算组合,可尝试扩展税率范围或检查参数配置。")
关键说明
- 误差处理:用
np.isclose替代直接相等判断,避免浮点计算的精度误差(比如货币分位的微小差异) - 税率扩展:
COMMON_TAX_RATES可根据业务场景添加更多税率,比如0.05(5%)、0.25(25%)等 - 溯源便捷:输出结果包含Excel原始行索引,可直接对应回原数据定位数值
- 性能优化:双值循环使用
i+1避免重复计算同一组数值,减少冗余运算
注意事项
- 若Excel文件与代码在同一目录,可直接填写文件名;否则需填写完整路径
- 若数值列存在非数值数据,可添加
pd.to_numeric(df[VALUE_COLUMN], errors='coerce')强制转换为数值型 - 若数据量极大,可提前筛选出接近
TARGET_Z范围的数值,减少循环计算量
内容的提问来源于stack exchange,提问作者Calvin
相关产品推荐
相关产品推荐

