Question

Je simple tableau numpy, pour chaque jour il y a un point de données. Quelque chose comme ceci:

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

Y at-il moyen facile d'extrapoler les points de données à l'avenir: la date (2008,5,1), la date (2008, 5, 20) etc? Je comprends qu'il peut être fait avec des algorithmes mathématiques. Mais ici, je suis à la recherche de certains fruits mûrs. En fait, j'aime ce numpy.linalg.solve fait, mais il ne semble pas applicable pour l'extrapolation. Peut-être que je suis tout à fait tort.

En fait, pour être plus précis que je construis un tableau burn-down (terme xp): x = date et y = volume de travail à faire », donc j'ai les sprints déjà fait et je veux visualiser comment les futurs sprints iront si la situation actuelle persiste. Et enfin, je veux prédire la date de sortie. Ainsi, la nature du « volume de travail à faire » est-il va toujours vers le bas sur les cartes de burn-down. Aussi je veux obtenir la date de sortie extrapolée: date à laquelle le volume devient nul

.

Ceci est tout pour montrer à l'équipe dev comment les choses vont. Le preciseness est pas si important ici :) La motivation de l'équipe de dev est le principal facteur. Cela signifie que je suis tout à fait bien avec la technique d'extrapolation très approximative.

Était-ce utile?

La solution

Il est trop facile pour l'extrapolation pour générer des déchets; essaye ça. De nombreux extrapolations sont bien sûr possibles; certains produisent des déchets évidents, des ordures non évidente, beaucoup sont mal définis.

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

Ajout: un billet Scipy dit, « Le comportement des classes dans FITPACK scipy.interpolate est beaucoup plus complexe que la documentation conduirait à croire » - IMHO vrai d'autres logiciels doc aussi.

Autres conseils

Une façon simple de faire des extrapolations est d'utiliser interpoler polynômes ou splines: il y a beaucoup de routines pour cela dans scipy.interpolate , et il y a très facile à utiliser (juste donner les (x, y) des points, et vous obtenez une fonction [callable, précisément]).

Maintenant, comme comme cela a été souligné dans ce fil, vous ne pouvez pas attendre l'extrapolation d'être toujours significative (surtout quand vous êtes loin de vos points de données) si vous ne disposez pas d'un modèle pour vos données. Cependant, je vous encourage à jouer avec les interpolations polynôme ou splines de scipy.interpolate pour voir si les résultats que vous obtenez vous conviennent le mieux.

Les modèles mathématiques sont la voie à suivre dans ce cas. Par exemple, si vous avez seulement trois points de données, vous pouvez avoir absolument aucune indication sur la façon dont la tendance va se dérouler (pourrait être l'un des deux parabola.)

Obtenez des cours de statistiques et d'essayer de mettre en œuvre les algorithmes. Essayez Wikibooks .

Vous devez swpecify sur la fonction que vous avez besoin d'extrapolation. Que vous pouvez utiliser la régression http://en.wikipedia.org/wiki/Regression_analysis pour trouver paratmeters de fonction. Et extrapoler à l'avenir.

Par exemple: traduire les dates en valeurs x et utiliser premier jour comme x = 0 pour votre problème les valeurs shoul être aproximatly (0,1.2), (400,1.8), (900,5.3)

Maintenant, vous décidez que ses points de fonction se trouve sur le type de a + b x + c x ^ 2

Utiliser la méthode des moindres squers trouver a, b et c http://en.wikipedia.org/wiki/Linear_least_squares (Je fournirai la source complète, mais plus tard, beacuase je n'ai pas le temps)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top