我需要使用asteval和不确定性库从dataframe计算方程。我找到了使它工作的方法,通过迭代方程并将每个方程分别传递给求值函数。有没有一种方法可以提高效率并一起评估所有方程,而不是迭代每个方程? 代码如下:
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)
aeval = asteval.Interpreter()
result = unumpy.uarray(df_param['Value'], df_param['Error'])
def evaluate(*result, **kwargs):
_df_param = kwargs.get('df')
_eq = kwargs.get('eq')
j=0
for row in zip(*_df_param.to_dict("list").values()):
aeval.symtable[row[_df_param.columns.get_loc("Name")]] = result[j]
j+=1
return aeval(_eq)
wrap_eval = uncertainties.wrap(evaluate)
j=0
for row in zip(*df_equation.to_dict("list").values()):
index_list = df_equation.index.to_list()
equation = row[df_equation.columns.get_loc("Equations")]
uval = wrap_eval(*result, eq = equation, df=df_param)
df_equation.loc[index_list[j], 'result'] = uval.nominal_value
df_equation.loc[index_list[j], 'error'] = uval.std_dev
j+=1
print(df_equation)
在上面的代码中,我尝试使用以下行,而不是final for循环:
uval = wrap_eval(*result, eq = df_equation, df=df_param)
在evaluate函数中,我将返回值更改为:
return aeval(_eq['Equations'])
但它不工作,并返回一个错误。有什么改进的建议吗
作为evaluate函数的输入,我有两个pandas数据帧:一个数据帧(df_方程)包含基于字符串的方程,我需要使用另一个pandas数据帧(df_参数)的参数进行不确定性评估
df_方程:
Equations
0 x*5
1 alpha+3
2 sin(alpha)+5
3 abs(y)
df_参数:
Name Value Error
0 x 5.00 0.001
1 alpha 1.76 0.080
2 y -300.00 5.000
对于输出,我需要在df_方程数据框中添加“result”和“error”列,分别包含方程评估和不确定性的结果
预期产出:
Equations result error
0 x*5 25.000000 0.005000
1 alpha+3 4.760000 0.080000
2 sin(alpha)+5 5.982154 0.015046
3 abs(y) 300.000000 5.000000
目前没有回答
相关问题 更多 >
编程相关推荐