10

我有一个简单的 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 ) ] )

有没有简单的方法可以将数据点推断到未来:date(2008,5,1), date(2008, 5, 20) 等?我知道它可以用数学算法来完成。但在这里,我正在寻找一些低悬的果实。实际上我喜欢 numpy.linalg.solve 所做的,但它看起来不适用于外推。也许我完全错了。

实际上,更具体地说,我正在构建一个燃尽图(xp 术语):'x=date 和 y=要完成的工作量',所以我已经完成了 sprint,我想可视化未来的 sprint如果目前的情况持续下去,就会去。最后我想预测发布日期。所以“要完成的工作量”的本质是它总是在燃尽图上下降。我还想获得推断的发布日期:音量变为零的日期。

这一切都是为了向开发团队展示事情的进展。在这里,精确性并不是那么重要:) 开发团队的动力是主要因素。这意味着我对非常近似的外推技术非常满意。

4

4 回答 4

17

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

替代文字

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

补充:一张Scipy 票说,“scipy.interpolate 中 FITPACK 类的行为比文档让人相信的要复杂得多”——恕我直言,其他软件文档也是如此。

于 2009-10-23T15:15:12.050 回答
4

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

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

于 2009-10-21T13:04:11.223 回答
3

在这种情况下,数学模型是要走的路。例如,如果您只有三个数据点,则您完全无法了解趋势将如何展开(可能是两条抛物线中的任何一条。)

学习一些统计课程并尝试实施算法。试试Wikibooks

于 2009-10-21T09:47:42.563 回答
1

您必须指定需要外推的函数。你可以使用回归http://en.wikipedia.org/wiki/Regression_analysis来查找函数的参数。并在未来推断这一点。

例如:将日期转换为 x 值并使用第一天作为 x=0 来解决您的问题,值应近似为 (0,1.2)、(400,1.8)、(900,5.3)

现在你决定他的观点在于 a+b x+c x^2类型的函数

使用最小平方的方法找到 a、b 和 c http://en.wikipedia.org/wiki/Linear_least_squares (我将提供完整的源代码,但稍后,因为我没有时间)

于 2009-10-21T10:39:00.500 回答