optimize.curve_fit с DataFrames - PullRequest
0 голосов
/ 13 июля 2020

Я работаю с несколькими DataFrames (здесь я буду использовать только 2 из них в качестве примера). Я хочу выполнить подгонку на основе данных их обоих, используя scipy.optimize.curve_fit.

В основном, я хочу, чтобы столбцы из фрейма данных с именем ' new_freqs ' были моими x- переменная или независимая переменная, а столбцы из фрейма данных с именем ' Tans ' будут моими значениями y или зависимой переменной. Оба фрейма данных имеют форму (12,6), где первый столбец « new_freqs » (значения x) соответствует первому столбцу « Tans » (y- значения) и т. д.

Я включаю ниже наиболее важную часть кода.

In[1]:
print(type(Tans), Tans.shape)
print(type(new_freqs), new_freqs.shape)
Out[1]:
<class 'pandas.core.frame.DataFrame'> (12, 6)
<class 'pandas.core.frame.DataFrame'> (12, 6)

Я пытаюсь подогнать его под прямую линию

def linear(frequencies,tau):
    return 2*np.pi*new_freqs*tau

popt, pcov = scipy.optimize.curve_fit(linear, new_freqs, Tans, p0=None, maxfev=1000)
tau = popt
fit = lambda frequencies: 2*np.pi*new_freqs*tau
fitted = linear(new_freqs,tau)
print(popt, pcov)

Я хотел бы получить прямую линию из подгонки, чтобы построить ее вместе с данными и значениями 'tau' в массиве каждого набора (x, y).

Я получаю эту ошибку :

ValueError: object too deep for desired array

Traceback (most recent call last):
  File "\\XXXXXXXXX.py", line 210, in <module>
    popt, pcov = scipy.optimize.curve_fit(linear, new_freqs, Tans, p0=None, maxfev=1000)
  File "C:\ProgramData\Anaconda3\Lib\site-packages\scipy\optimize\minpack.py", line 763, in curve_fit
    res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
  File "C:\ProgramData\Anaconda3\Lib\site-packages\scipy\optimize\minpack.py", line 401, in leastsq
    gtol, maxfev, epsfcn, factor, diag)
minpack.error: Result from function call is not a proper array of floats.

Буду очень признателен за ваши подсказки и помощь. Заранее спасибо

1 Ответ

0 голосов
/ 15 июля 2020

Я решил проблему следующим кодом (если он может быть кому-то полезен):

cols_name = list(Tan.columns.values)
def linear(new_freqs, tau):
    return 2.0*np.pi*new_freqs*tau

def fit_linear(new_freqs, Tan):
    Taus_lin = []
    Fit_tang_lin = []
    count = 0
    for count in range(len(cols_names)):
        popt, pcov = scipy.optimize.curve_fit(linear, new_freqs.iloc[:,count], Tan.iloc[:,count], p0=None, maxfev=5000)
        tau = popt
        fitted_Tan = linear(new_freqs.iloc[:,count],tau)
        Taus_lin.append(tau)
        Fit_tang_lin.append(fitted_Tan)
    Taus_lin = pd.DataFrame(np.transpose(Taus_lin), columns=cols_names)
    Fit_tang_lin = pd.DataFrame(np.transpose(Fit_tang_lin), columns=cols_names)
    return Taus_lin, Fit_tang_lin
...