函数内部 exec() 中定义的子函数的解决方法

Workaround for subfunction defined in exec() inside of a function

我正在编写一个需要包含子函数的函数,以便 运行 来自 scipy.optimize 模块的 curve_fit 函数。问题是进入子函数的变量数量(我们称之为 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 是包含建模过程变量的数据框。如果xdat分别有两行或三行,form应该是如下字符串:

# 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 数据帧中获得多少变量。在此先感谢您的任何建议。

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

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