我正在编写一个函数,该函数需要包含一个子函数才能从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
个变量。预先感谢您的任何建议。
答案 0 :(得分:1)
无需动态创建函数并使用exec
。只需遍历xdat
。
def fitFunc(xdat, a, b):
return (a/ps) * sum(x**b for x in xdat)