函数内部 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)
我正在编写一个需要包含子函数的函数,以便 运行 来自 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)