如何将数据帧传递给函数(提高代码效率)

2024-09-19 23:50:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要使用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


Tags: importalphadfgetparamresultlistrow