函数

时间:2019-05-13 19:16:04

标签: python exec

我正在编写一个函数,该函数需要包含一个子函数才能从curve_fit模块运行scipy.optimize函数。问题在于进入子功能(称为fitFunc)的变量的数量取决于输入主函数的数据框中有多少列。下面是我的代码:

def function(mod_data):
    import numpy as np
    i = 0
    ps = len(mod_data.columns) - 7
    temp = '(xdat[0]**b)'

    while i != (ps-1):
        dummypy = '(xdat[' + str(i+1) + ']'
        temp = temp + '+' + dummypy + '**b)'
        i += 1

    xdat = mod_data.iloc[:,7:].values
    xdat = np.transpose(xdat)
    ydat = mod_data.iloc[:,1].values

    form = 'def fitFunc(xdat, a, b): return (a/ps) * (%s)' % temp
    exec(form)
    result = curve_fit(fitFunc, xdat, ydat, 
                       p0 = np.array([100000,.75]))
    return result

mod_data上方是包含建模过程变量的数据框。如果form分别有两行或三行,则xdat应该是以下字符串:

# xdat has 2 rows
form = 'def fitFunc(xdat, a, b): return (a/ps) * ((xdat[0]**b)+(xdat[1]**b))'

# xdat has 3 rows
form = 'def fitFunc(xdat, a, b): return (a/ps) * ((xdat[0]**b)+(xdat[1]**b)+(xdat[2]**b))'

我意识到我只能定义函数,但是问题是我不知道在将数据帧输入到函数之前数据框中实际上有多少个变量,因此我遍历最后几列以查找该数字,然后编写代码,具体取决于将要存储的变量数量。

从上一个问题中我知道,exec在函数Why doesn't exec work in a function with a subfunction?中有子功能时不起作用。因此,我的目标是找到另一种方法来定义fitFunc子函数,具体取决于xdat数据框中有mod_data个变量。预先感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

无需动态创建函数并使用exec。只需遍历xdat

def fitFunc(xdat, a, b):
    return (a/ps) * sum(x**b for x in xdat)