2009-10-21 11 views
8

나는 간단한 데이터 정렬을 가지고있다. 날짜마다 데이터 포인트가있다. 이런 식으로 뭔가 :파이썬에서 데이터 포인트를 추측 할 수있는 쉬운 방법이 있습니까?

>>> 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 = 작업량'입니다. 따라서 이미 수행 된 스프린트가 있고 시각화하고 싶습니다. 현재 상황이 지속되면 미래 스프린트가 어떻게 움직일 것인가. 그리고 마지막으로 출시일을 예측하고 싶습니다. 따라서 '수행해야 할 업무량'의 본질은 언제나 번 - 다운 차트에 기록됩니다. 또한 외삽 된 릴리스 날짜를 얻으려고합니다. 볼륨이 0이되는 날짜입니다.

이것은 모든 일이 어떻게 진행되는지 개발자 팀에 보여주기위한 것입니다. 정확성은 여기에 그렇게 중요하지 않습니다 :) dev 팀의 동기가 주요 요인입니다. 즉, 나는 아주 근사한 외삽 기법으로 절대적으로 괜찮음을 의미합니다.

+1

"통계 파이썬"으로 인터넷 검색을 하셨을 때 무엇을 찾으셨습니까? 발견 한 통계 패키지에 대한 질문이 있으십니까? –

+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 클래스의 동작은 믿을 하나를 이어질 것이 훨씬 더 복잡한 문서보다"라고 -의 이 이럴 사실 다른 소프트웨어 문서도.

+0

아주 좋은 예! 고맙습니다! – maplpro

+0

보간은 외삽 법이 아니며 그 반대의 경우입니다. – tagoma

3

이 경우 수학 모델을 사용할 수 있습니다. 예를 들어 데이터 포인트가 3 개인 경우 트렌드가 어떻게 전개되는지 전혀 알 수 없습니다 (두 포물선 중 하나 일 수 있음).

일부 통계 코스를 가져 와서 알고리즘을 구현하십시오. Wikibooks을 시도하십시오.

+0

절대적으로 동의하지만, 이해하고 있지만 명확히하기를 원한다. 나는 numpy.extrapolate 함수가 이미있는 곳에서, "외삽 법 선택"이라는 인수로 이미 체크하고 있는지 확인하고있다. 그래서 그것이 "낮은 교수형 과일"이라고한다. – maplpro

1

어떤 함수를 외삽해야 하는지를 지정해야합니다. 회귀 함수 http://en.wikipedia.org/wiki/Regression_analysis을 사용하여 함수의 매개 변수를 찾을 수 있습니다. 그리고 이것을 미래에 추정하십시오. 예를 들어

는 : X 값으로 날짜를 번역하고 값이 될 말아야 문제에 대한 X = 0로 첫 날 사용 aproximatly (0,1.2), (400,1.8), (900,5.3)

이제 자신의 포인트 유형 A + B X + C X^2

사용 http://en.wikipedia.org/wiki/Linear_least_squares (내가 제공 할, b와 c를 찾을 수 적어도 squers의 방법 전체 소스의 기능에 놓여 있다고 결정 ,하지만 나중에, beacuase 난이 시간이 없어)

4

보간법을 적용하는 간단한 방법은 보간 다항식 또는 스플라인을 사용하는 것입니다. 여기에 많은 루틴이 scipy.interpolate에 있으며 아주 쉽게 사용할 수 있습니다 (그냥 (x, y) 점을주고 함수를 얻을 수 있습니다 [ 호출 가능, 정확하게]).

이제이 스레드에서 지적했듯이 데이터 모델이없는 경우 외삽 법이 항상 의미가 있다고 기대할 수 없습니다 (특히 데이터 포인트와 멀리 떨어져있을 때). 그러나 scipy.interpolate의 다항식 또는 스플라인 보간법을 사용하여 얻은 결과가 자신에게 적합한 지 여부를 확인하는 것이 좋습니다.

+0

이것 같이, 확실히 시도하기 위하여려고하고있다, 감사합니다 제비! – maplpro