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

时间:2015-08-20 15:06:03

标签: 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]

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

y = 9.2347 * (x ^ 1.1294)

我想在Python中这样做,所以我可以在我的软件中使用公式中的系数。

谢谢!

3 个答案:

答案 0 :(得分:1)

我意识到这个问题是2年,目前3个月,但目前的答案还不完整。这是一个完整的答案。

首先必须了解动力公式的结构。

y = some_number*x^(-another_number)

示例:

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()

生成以下图表: power plot

用于说明功率曲线的更好示例可能是:

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()

power plot decaying

如果你想显示一条平滑的线而不是锯齿状的线,请导入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()

smoothed power plot

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

答案 1 :(得分:0)

如果不确切知道'Power Trendline'是什么,我会假设您可以通过以下方式解决您的问题:

x = [5.5, 6.0, 6.5, 7, 9]
y = []

def formula(arg):
    return (9.2347 * (arg ** 1.1294))

for number in x:
    y.append(formula(x))

答案 2 :(得分:0)

创建一个函数来定义你想要适合的等式,然后使用scipy中的curvefit(funx,x,y)来获得基于你的x和y参数的拟合值。

def func(x, C, m): return C*x**m

popt, pcov = scipy.optimize.curve_fit(func,  x,  y)

popt将返回func中的C和m值,pcov我认为是界限但我不太确定。

希望这有点帮助。