我正在编写一个函数,它需要包含一个子函数,以便从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))'
我意识到我可以只定义函数,但问题是,在进入函数之前,我不知道数据帧中实际会有多少个变量,所以我遍历了最后一列,以便找到那个数字,然后让代码根据变量的数量为我编写函数。
从前面的问题中我知道,当Why doesn't exec work in a function with a subfunction?函数中有子函数时,exec
就不能工作了。因此,我在这里的目标是找到另一种方法来定义fitFunc
子函数,这取决于xdat
将从mod_data
数据帧中获得多少变量。提前感谢您的建议。
https://stackoverflow.com/questions/56118603
复制相似问题