pandas 如何使用curve_fit函数返回数据集上的dataFrame

pgky5nke  于 2022-11-20  发布在  其他
关注(0)|答案(1)|浏览(164)

我正在尝试将我定义的函数曲线拟合到一个数据集。我使用Pandas定义了我的函数,它打印了值。但是当我尝试使用Curve_fit优化它时,它给了我一个错误,“列表索引超出范围”。我不明白为什么?

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
ydata=np.array([1.2,1.21,1.2,1.19,1.21,1.22,1.8,2.47,2.49,2.49,2.5])
xdata = np.linspace(0,1,num=11).round(2)

def halfTrapz(x, m, a, tau1, tau2):
    y = np.zeros(len(x))
    dfy = pd.DataFrame(list(zip(x,y)),columns=['x','y'])
    ta1=dfy.index[dfy['x']==tau1].tolist()
    ta2=dfy.index[dfy['x']==tau2].tolist()
    # ta1=list(np.array(ta1)+1)
    # ta2=list(np.array(ta2)+1)   #In order to consider ta2 in [:ta2]
    dfy.iloc[:ta1[0],1] = a
    b = a - m*dfy.iloc[ta1[0],0] 
    dfy.iloc[ta1[0]:ta2[0],1] =  m * dfy.iloc[ta1[0]:ta2[0],0] + b 
    dfy.iloc[ta2[0]:,1] = m * dfy.iloc[ta2[0],0] + b
    return dfy['y']
    
z=(halfTrapz(xdata, 5,1.2,0.5,0.7))
plt.plot(xdata,z,'g--')
plt.plot(xdata,ydata)

第一部分(上面)对一些给定的值工作得很好,它可以绘制函数。但是,当我尝试使用curve_fit这个函数的第二部分时,它给了我错误。

enter image description here

from scipy.optimize import curve_fit
   
popt, pcov = curve_fit(halfTrapz, xdata, ydata)
print(popt)
print(pcov)

plt.plot(xdata, func(xdata, *popt), 'r-')
ohfgkhjo

ohfgkhjo1#

“list index out of range”(列表索引超出范围)消息的含义与其所述完全相同:您正试图访问一个不存在的列表元素。在这种情况下,这是因为ta1可以是一个空列表,而您正试图访问此处的第0个元素dfy.iloc[:ta1[0],1] = a
现在,为什么ta1会是空的呢?有问题的语句是dfy['x']==tau1。您在这里是基于比较进行过滤的,但是tau1可以是float,因此您将对浮点比较感到头疼。例如,1.0==1.0000001计算为False
我不假装理解这里的数学,但是如果你 * 真的 * 想过滤一个浮点字段,我建议使用类似np.isclose的东西。

相关问题