如何在 Python 中复制 Excel 的“Power Trendline”?

Tra*_*VOX 3 python

如何在 Python 中重新创建“Excel Power Trendline”并获取系数?

在 Excel 中,这些数据...

x = [5.5, 6.0, 6.5, 7, 9]
y = [64.0575, 69.656, 75.781, 82.7023, 111.156866]
Run Code Online (Sandbox Code Playgroud)

...创建产生回归公式的趋势线:

y = 9.2347 * (x ^ 1.1294)
Run Code Online (Sandbox Code Playgroud)

我想在 Python 中执行此操作,以便稍后在我的软件中利用公式中的系数。

谢谢!

Jar*_*rad 5

我意识到这个问题目前已有 2 年零 3 个月的历史,但目前的答案并不完整。这是一个完整的答案。

您必须首先了解幂公式的结构。

y = some_number*x^(-another_number)
Run Code Online (Sandbox Code Playgroud)

例子:

from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

x = [5.5, 6.0, 6.5, 7, 9]
y = [64.0575, 69.656, 75.781, 82.7023, 111.156866]
popt, pcov = curve_fit(lambda fx,a,b: a*fx**-b,  x,  y)
power_y = popt[0]*x**-popt[1]

plt.scatter(x, y, label='actual data')
plt.plot(x, power_y, label='power-fit')
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

生成以下图表: 功率图

说明功效曲线的更好示例可能是:

x = [5.5, 6.0, 6.5, 7, 9]
y = [100, 80, 40, 10, 5]
popt, pcov = curve_fit(lambda fx,a,b: a*fx**-b,  x,  y)
power_y = popt[0]*x**-popt[1]

plt.scatter(x, y, label='actual data')
plt.plot(x, power_y, label='power-fit')
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

功率图衰减

如果要显示平滑的线条而不是锯齿状的线条,请导入 numpy 并执行以下操作:

# make the line smooth instead of jagged
import numpy as np

x = [5.5, 6.0, 6.5, 7, 9]
y = [100, 80, 40, 10, 5]
popt, pcov = curve_fit(lambda fx,a,b: a*fx**-b,  x,  y)
x_linspace = np.linspace(min(x), max(x), 100)
power_y = popt[0]*x_linspace**-popt[1]

plt.scatter(x, y, label='actual data')
plt.plot(x_linspace, power_y, label='smooth-power-fit')
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

平滑的功率图

所有这一切的关键是使用scipy.optimize.curve_fit并在数学上了解幂函数的结构来找到正确的系数。