pandas 获取趋势线方程(多项式,2阶)

piwo6bdm  于 2023-03-11  发布在  其他
关注(0)|答案(1)|浏览(155)

一个简单的 Dataframe ,我想用它的趋势线(多项式,阶2)。然而,我得到的方程显然是错误的:

y = 1.4x**2 + 6.6x + 0.9

它应当是:

y = 0.22x2 - 1.45x + 11.867  # the "2" after x is square

我怎样才能得到正确的方程式?

import matplotlib.pyplot as plot
from scipy import stats
import numpy as np

data = [["2020-03-03",9.727273],
["2020-03-04",9.800000],
["2020-03-05",9.727273],
["2020-03-06",10.818182],
["2020-03-07",9.500000],
["2020-03-08",10.909091],
["2020-03-09",15.000000],
["2020-03-10",14.333333],
["2020-03-11",15.333333],
["2020-03-12",16.000000],
["2020-03-13",21.000000],
["2020-03-14",28.833333]]

fig, ax = plot.subplots()

dates = [x[0] for x in data]
usage = [x[1] for x in data]

bestfit = stats.linregress(range(len(usage)),usage)

equation = str(round(bestfit[0],1)) + "x**2 + " + str(round(bestfit[1],1)) + "x + " + str(round(bestfit[2],1)) 

ax.plot(range(len(usage)), usage)
ax.plot(range(len(usage)), np.poly1d(np.polyfit(range(len(usage)), usage, 2))(range(len(usage))), '--',label=equation)

plot.show()

print (equation)

ql3eal8s

ql3eal8s1#

你应该更好地界定你的问题,我会解释的。
您正在尝试拟合二次多项式(二次多项式函数),使用一系列日期作为输入,一系列值作为输出。问题是,你必须定义什么是“零”-你的日期值的参考点。你在代码中处理它的方式,这是合理的-但你需要验证它是否适合你试图解决的问题,就是只查看日期的“索引”,从0开始。
当我将计算'bestfit'的方法替换为生成图形时使用的相同函数时,我得到的结果与您想要的结果相似:
多项式方程:0.22倍平方+-1.02倍+10.63
有两种方法可以帮助您了解我得到的结果与您想要的结果之间的差异:
1.可添加到计算中的可选参数rcond(numpy.polyfit documation
1.也许你用的y值是四舍五入的,在你计算的原始数据中有更多的小数点。
下面是更新后的代码:

import matplotlib.pyplot as plot
from scipy import stats
import numpy as np

data = [["2020-03-03",9.727273],
["2020-03-04",9.800000],
["2020-03-05",9.727273],
["2020-03-06",10.818182],
["2020-03-07",9.500000],
["2020-03-08",10.909091],
["2020-03-09",15.000000],
["2020-03-10",14.333333],
["2020-03-11",15.333333],
["2020-03-12",16.000000],
["2020-03-13",21.000000],
["2020-03-14",28.833333]]

fig, ax = plot.subplots()

dates = [x[0] for x in data]
usage = [x[1] for x in data]

bestfit = np.polyfit(range(len(usage)), usage, 2)

equation = str(round(bestfit[0],2)) + "x**2 + " + str(round(bestfit[1],2)) + "x + " + str(round(bestfit[2],2)) 

ax.plot(range(len(usage)), usage)
ax.plot(range(len(usage)), np.poly1d(np.polyfit(range(len(usage)), usage, 2))(range(len(usage))), '--',label=equation)

plot.show()

print (equation)

相关问题