2009-10-21 4 views
8

私はシンプルな配列を持っています。日付ごとにデータポイントがあります。このような何か:日付(2008,5,1)、日付(2008年、5、20)など:Pythonでデータポイントを将来に推論する簡単な方法はありますか?

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

は、将来へのデータポイントを推定する簡単な方法はありますか?私はそれが数学的なアルゴリズムでできることを理解しています。しかしここで私はいくつかの低いぶら下がっている果物を求めています。実際にはnumpy.linalg.solveのようなものが好きですが、外挿には当てはまりません。たぶん私は絶対に間違っています。

具体的には、私はバーンダウンチャート(xp用語)を作成しています。「x = dateとy =作業量」ですので、既に実行済みのスプリントを取得しています。現在の状況が続く場合、将来のスプリントがどのように進むか。そして最終的にリリース日を予測したいと思います。だから、「仕事の量」の性質は、いつもバーンダウン・チャートに落ちるということです。また、私は外挿されたリリース日を取得したい:ボリュームがゼロになる日付。

これは、デベロッパーチームに何が起こるかを示すためのものです。精密さはそれほど重要ではありません:)デベロッパーチームのモチベーションが主な要因です。これは、私が非常におおよその外挿法を使っても大丈夫だということを意味します。

+1

"統計情報のpython"のためにグーグルであなたは何を見つけましたか?あなたが見つけた統計パッケージのいずれかに関する質問はありますか? –

+0

問題のデータの性質を知らなくても、外挿について話すのは難しいです。上記のように、見ることができる限り、何か(無作為な値を除外しない)になる可能性があるので、実用的なアプローチについて話すのはちょうど推測に過ぎません。質問を洗練させる。 – Rook

+0

あなたは絶対に正しいです!洗練された。 – maplpro

答えて

16

ガベージを生成するのは外挿では非常に簡単です。これを試して。 多くの異なる外挿がもちろん可能です。 いくつかは明白なゴミを生成しますが、明白でないゴミを生成するものもあります。

alt text http://i39.tinypic.com/am62wp.png

""" 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 ticketは言う、 「 scipy.interpolateでFITPACKクラスの振る舞いははるかに複雑なドキュメントよりもすると信じるように1を導くだろう」 - の私見真他のソフトウェアのdocも。

+0

非常に良い例!ありがとうございました! – maplpro

+0

補間は外挿法ではなく、その逆もありません。 – tagoma

3

この場合、数学的モデルがあります。たとえば、データポイントが3つしかない場合は、傾向がどのように展開されるかについては全く示さない(2つの放物線のいずれかになる可能性があります)。

いくつかの統計コースを取得し、アルゴリズムを実装してください。試してくださいWikibooks

+0

絶対に同意する、理解しているが、明確にしたい、私はちょうどnumpy.extrapolate関数が既にある場所で、引数を "外挿法を選択"であるかどうかをチェックしている:)それは私がそれを "ぶら下がっている果物"と呼ぶ理由 – maplpro

1

どの関数を外挿する必要があるのか​​を特定しなければなりません。 回帰http://en.wikipedia.org/wiki/Regression_analysisを使用すると、関数のパラメタを見つけることができます。そしてこれを将来推論する。例えば

: 値はaproximatly (0,1.2)、(400,1.8)、(900,5.3)

ことshoul xの値に日付を変換し、あなたの問題のためのx = 0として最初の日の使用

は今、あなたは彼のポイントはタイプ + B X + Cのx^2

使用http://en.wikipedia.org/wiki/Linear_least_squares (私が提供する、a、b及びcを見つけるために少なくともsquersの方法完全なソースの機能にあると判断しましたしかし、後で、私はこれのための時間がないbeacuase

4

補間多項式またはスプラインを使用するのは、補間多項式またはスプラインを使用することです:scipy.interpolateには多くのルーチンがあり、使い方が簡単です((x、y)点を与えれば関数[コール可能、正確に])。

今、このスレッドで指摘したように、データのモデルがない場合は、外挿を常に意味のあるものにすることはできません(特にデータポイントから遠い場合)。しかし、scipy.interpolateの多項式補間やスプライン補間を使って、得られる結果があなたに合っているかどうかを確認することをお勧めします。

+0

このように、間違いなく試してみると、ありがとう! – maplpro

関連する問題