You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:12:00