Обходной путь для подфункции, определенной в exec () внутри функции - PullRequest
1 голос
/ 13 мая 2019

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

1 Ответ

1 голос
/ 13 мая 2019

Нет необходимости создавать функцию динамически и использовать exec.Просто переберите xdat.

def fitFunc(xdat, a, b):
    return (a/ps) * sum(x**b for x in xdat)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...