0

我的数据框[11 x 300],其中列标题等于'x'([0.75,1,1.25,1.5,1.75,2,2.25,2.5,2.75,3,3.25]),每个行值代表'y ' 为了。每行可以用以下格式的指数函数来描述:a * x ^k + b。

目标是添加三个额外的列,描述该特定行的 a、k 和 b。就像:Python 曲线拟合 pandas 数据框然后将 coef 添加到新列

而不是多项式函数,我的数据需要用以下格式描述:a * x **k + b。

由于我找不到使用 np.polyfit 导出系数的任何解决方案,因此我将数据框拆分为不同的列表。


x  = np.array([0.75,1,1.25,1.5,1.75,2,2.25,2.5,2.75,3,3.25])
y1  = np.array([288.79,238.32,199.42,181.22,165.50,154.74,152.25,152.26,144.81,144.81,144.81])
y2 = np.array([309.92,255.75,214.02,194.48,177.61,166.06,163.40,163.40,155.41,155.41,155.41])
...
y300 = np.array([352.18,290.63,243.20,221.00,201.83,188.71,185.68,185.68,176.60,176.60,176.60])

def func(x,a,k,b):
    return a * (x**k) + b

popt1, pcov = curve_fit(func,x,y1, p0 = (300,-0.5,0))
...
popt300, pcov = curve_fit(func,x,y300, p0 = (300,-0.5,0))

output: 
popt1 
[107.73727907  -1.545475   123.48621504]
...
popt300
[131.38411712  -1.5454452  150.59522147

这有效,当我将所有数据框行拆分为列表并为每个列表/行定义 popt 时。避免拆分所有 300 列 - 我更喜欢在 pandas 数据帧上应用与 Python 曲线拟合相同的方法,然后将 coef 添加到新列


my_coep_array = pd.DataFrame(np.polyfit(x, df.values,1)).T


但是如何定义我的 np.polyfit - a * x **k + b?

4

0 回答 0