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 = 日付、y = 実行する作業量」なので、既に完了したスプリントがあり、将来のスプリントがどのようになるかを視覚化したいと考えています。今の状況が続けば行く。そして最後に、発売日を予測したいと思います。したがって、「実行する作業量」の性質は、バーンダウン チャートで常に低下することです。また、外挿されたリリース日: ボリュームがゼロになる日付も取得したいと考えています。

これはすべて、開発チームに状況を示すためのものです。ここでは正確さはそれほど重要ではありません:) 開発チームのモチベーションが主な要因です。つまり、非常に近似的な外挿法で問題ありません。

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

この場合、数学的モデルが有効です。たとえば、データ ポイントが 3 つしかない場合、トレンドがどのように展開するかについての兆候はまったくありません (2 つの放物線のいずれかである可能性があります)。

いくつかの統計コースを取得し、アルゴリズムを実装してみてください。ウィキブックを試してみてください。

于 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 に答える