如何将DataFrame传入函数,提升asteval、uncertainties批量计算公式的效率
问题解答
优化思路
- 移除重复的参数符号表加载操作:原代码每次计算单个公式都会遍历参数表重新写入符号表,属于完全不必要的重复开销,参数只需要写入一次即可长期复用
- 移除不必要的函数包装:直接将带不确定度的参数对象写入asteval符号表,计算后直接返回带误差的结果对象,不需要额外用
uncertainties.wrap封装计算函数 - 用pandas原生的
apply方法替代手写for循环,执行效率更高,代码更简洁
优化后可运行代码
import numpy as np import pandas as pd import uncertainties from uncertainties import unumpy import asteval from uncertainties.umath import * # 初始化输入数据 param = {"Name": ['x', 'alpha', 'y'], 'Value':[5, 1.76, -300], 'Error':[0.001, 0.08, 5]} df_param = pd.DataFrame(param) equations = {'Equations':['x*5', 'alpha+3', 'sin(alpha)+5', 'abs(y)']} df_equation = pd.DataFrame(equations) # 初始化asteval解释器 aeval = asteval.Interpreter() # 生成带不确定度的参数数组 u_params = unumpy.uarray(df_param['Value'], df_param['Error']) # 一次性将所有参数写入符号表,仅执行一次 for name, u_val in zip(df_param['Name'], u_params): aeval.symtable[name] = u_val # 定义单公式计算函数 def calc_single_eq(eq_str): u_result = aeval(eq_str) return pd.Series([u_result.nominal_value, u_result.std_dev], index=['result', 'error']) # 批量计算所有公式,直接写入结果列 df_equation[['result', 'error']] = df_equation['Equations'].apply(calc_single_eq) print(df_equation)
原修改方案报错原因
asteval.Interpreter的调用仅支持传入单个字符串格式的表达式,无法直接解析DataFrame/Series类型的多表达式集合,所以直接传入整个公式列会触发解析错误。
内容的提问来源于stack exchange,提问作者user16613865
相关产品推荐
相关产品推荐

