Я пишу функцию, которая должна содержать подфункцию для запуска функции 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
не работает, если в функции есть подфункции: Почему не выполняется работа в функции с подфункцией? . Поэтому моя цель здесь - найти другой способ определения подфункции fitFunc
в зависимости от того, сколько переменных xdat
будет иметь из mod_data
фрейма данных. Заранее спасибо за любой совет.