python中有没有简单的方法可以将数据点外推到未来?

python中有没有简单的方法可以将数据点外推到未来?,python,numpy,interpolation,spline,burndowncharts,Python,Numpy,Interpolation,Spline,Burndowncharts,我有一个简单的numpy数组,每个日期都有一个数据点。大概是这样的: >>> import numpy as np >>> from datetime import date >>> from datetime import date >>> x = np.array( [(date(2008,3,5), 4800 ), (date(2008,3,15), 4000 ), (date(2008,3, 20), 3500 ),

我有一个简单的numpy数组,每个日期都有一个数据点。大概是这样的:

>>> import numpy as np
>>> from datetime import date
>>> from datetime import date
>>> x = np.array( [(date(2008,3,5), 4800 ), (date(2008,3,15), 4000 ), (date(2008,3,
20), 3500 ), (date(2008,4,5), 3000 ) ] )
有没有简单的方法来推断未来的数据点:日期(2008,5,1),日期(2008,5,20)等等?我知道这可以通过数学算法来实现。但我在这里寻找一些低垂的果实。实际上,我喜欢numpy.linalg.solve的功能,但它看起来不适用于外推。也许我完全错了

实际上,更具体地说,我正在建立一个消耗图表(xp术语):“x=日期,y=要完成的工作量”,因此我已经完成了冲刺,我想想象一下如果当前情况持续下去,未来的冲刺将如何进行。最后我想预测发布日期。所以“要完成的工作量”的本质是,它总是在消耗图表上下降。我还想得到外推的发布日期:卷变为零的日期


这一切都是为了向开发团队展示事情的进展。精确性在这里并不重要:)开发团队的动机是主要因素。这意味着我完全可以使用非常近似的外推技术。

在这种情况下,数学模型是可行的。例如,如果只有三个数据点,则绝对无法指示趋势将如何展开(可以是两条抛物线中的任意一条)


学习一些统计学课程,并尝试实现算法。试试。

您必须指定需要外推的函数。 然后,您可以使用回归来查找函数的参数。并在未来进行推断

例如: 将日期转换为x值,并将第一天用作x=0。对于您的问题,这些值应该是近似值 (0,1.2)、(400,1.8)、(900,5.3)

现在你们决定他的观点是关于类型的函数 a+bx+cx^2

用最小静噪法求a、b和c
(我将提供完整的源代码,但稍后,因为我没有时间来做这件事)

进行外推的一种简单方法是使用插值多项式或样条曲线:在中有许多用于此的例程,而且非常容易使用(只需给出(x,y)点,就可以得到一个函数[可调用的,精确地])


现在,正如本线程中所指出的,如果您没有数据模型,您不能期望外推总是有意义的(特别是当您远离数据点时)。但是,我鼓励您使用scipy.interpolate中的多项式或样条插值,看看您获得的结果是否适合您。

外推很容易产生垃圾;试试这个。 当然,许多不同的推断是可能的; 一些产生明显的垃圾,一些不明显的垃圾,许多是不明确的

补充:a说, “中FITPACK类的行为 scipy.interpolate比文档中让人相信的要复杂得多。”--
其他软件文档也是如此。

完全同意,确实理解,但想澄清一下,我只是在检查是否有numpy.extraction函数已经存在,参数为“选择外推方法”:)这就是为什么当你搜索“统计python”时我称之为“低垂果实”的原因。你发现了什么?关于你发现的任何统计数据包有什么问题吗?如果不知道这些数据的性质,很难谈论任何外推。就我们所见,上述情况可能是任何情况(不排除随机值),因此谈论任何实际方法都只是猜测。完善这个问题。你完全正确!精确。插值不是外推,相反。
""" extrapolate y,m,d data with scipy UnivariateSpline """
import numpy as np
from scipy.interpolate import UnivariateSpline
    # pydoc scipy.interpolate.UnivariateSpline -- fitpack, unclear
from datetime import date
from pylab import *  # ipython -pylab

__version__ = "denis 23oct"


def daynumber( y,m,d ):
    """ 2005,1,1 -> 0  2006,1,1 -> 365 ... """
    return date( y,m,d ).toordinal() - date( 2005,1,1 ).toordinal()

days, values = np.array([
    (daynumber(2005,1,1), 1.2 ),
    (daynumber(2005,4,1), 1.8 ),
    (daynumber(2005,9,1), 5.3 ),
    (daynumber(2005,10,1), 5.3 )
    ]).T
dayswanted = np.array([ daynumber( year, month, 1 )
        for year in range( 2005, 2006+1 )
        for month in range( 1, 12+1 )])

np.set_printoptions( 1 )  # .1f
print "days:", days
print "values:", values
print "dayswanted:", dayswanted

title( "extrapolation with scipy.interpolate.UnivariateSpline" )
plot( days, values, "o" )
for k in (1,2,3):  # line parabola cubicspline
    extrapolator = UnivariateSpline( days, values, k=k )
    y = extrapolator( dayswanted )
    label = "k=%d" % k
    print label, y
    plot( dayswanted, y, label=label  )  # pylab

legend( loc="lower left" )
grid(True)
savefig( "extrapolate-UnivariateSpline.png", dpi=50 )
show()