Wie berechne ich die Steigung in numpy
Wenn ich ein array mit 50 Elementen, wie würde ich berechnen 3 Zeit Steigung und 5 Zeit Steigung?
Die docs nicht hinzufügen viel.....
>>> from scipy import stats
>>> import numpy as np
>>> x = np.random.random(10)
>>> y = np.random.random(10)
>>> slope, intercept, r_value, p_value, std_err = stats.linregress(x,y)
Würde das funktionieren?
def slope(x, n):
if i<len(x)-n:
slope = stats.linregress(x[i:i+n],y[i:i+n])[0]
return slope
aber das würde den arrays die gleiche Länge
@joe:::
xx = [2.0 ,4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30]
x = np.asarray(xx, np.float)
s = np.diff(x[::3])/3
window = [1, 0, 0, 0, -1]
window2 = [1, 0, -1]
slope = np.convolve(x, window, mode='same') / (len(window) - 1)
slope2 = np.convolve(x, window2, mode='same') / (len(window2) - 1)
print x
print s
print slope
print slope2
Ergebnisse.....
[ 2. 4. 6. 8. 10. 12. 14. 16. 18. 20. 22. 24. 26. 28. 30.]
[ 2. 2. 2. 2.]
[ 1.5 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. -6. -6.5]
[ 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. -14.]
Den Hang und slope2 sind, was Im nach mit Ausnahme der -6, -6.5 und -14 sind nicht die Ergebnisse, die ich Suche.
dieser gearbeitet.......
window = [1, 0, 0, -1]
slope = np.convolve(xx, window, mode='valid') / float(len(window) - 1)
padlength = len(window) -1
slope = np.hstack([np.ones(padlength), slope])
print slope
Läuft der linearen regression auf den gesamten Satz von 50 Beobachtungen geben Ihnen eine Steigung und einen Achsenabschnitt. Könntest du erklären, was genau du meinst mit einem "N-Periode Hang"?
wenn Serie 1,2 ...........50, ich möchte Steigung von 46,47,48,49,50, und die Steigung der 48,49,50. Wie ein array. so, alle Elemente haben die entsprechenden Pisten
wenn Serie 1,2 ...........50, ich möchte Steigung von 46,47,48,49,50, und die Steigung der 48,49,50. Wie ein array. so, alle Elemente haben die entsprechenden Pisten
InformationsquelleAutor Merlin | 2011-09-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, du meinst die Steigung berechnet, die auf jedem 3. und 5. element, so dass Sie haben eine Reihe von (exakt, nicht mit least-squares) hängen?
Wenn dem so ist, solltest du nur tun, etwas entlang der Linien von:
Ich bin wohl völlig Missverständnis aber, was du meinst. Ich habe noch nie Kopf der Begriff "3 Zeit Steigung" vor...
Wenn du mehr willst von einem "moving window" - Berechnung (so dass Sie die gleiche Anzahl von Eingabe-Elemente als output-Elemente), nur Modell es als eine Faltung (convolution) mit einem Fenster von
[-1, 0, 1]
oder[-1, 0, 0, 0, 1]
.E. g.
Lesen, ein bisschen auf die Windungen, Sie bedanken sich für später auf. Sie sind vielmehr allgegenwärtig! 🙂 Der Unterschied zwischen den faltungs-und @tom, die Antwort oben ist, dass die Faltung wird mit nur der 1. und 3. Punkte, dann nur die 2 und 4 Punkte, etc, anstatt mit der 1., 2., und 3., dann 2., 3., und 4. Punkte, etc. Wie ich bereits sagte, gehe ich davon aus, dass Sie nicht wollen Sie eine lineare regression, sondern eher eine exakte Passform. (Die lineare regression ist ein paar Größenordnungen langsamer, aber wenn Sie nicht haben eine Tonne von Punkten, es gewann ' T Angelegenheit viel.)
was ist, wenn y ist nicht definiert, es ist nur ein array von x?
In diesem Fall können Sie nur dividieren Sie durch die Schritt-Größe. z.B.
slope = np.convolve(x, window, mode='same') / (len(window) - 1)
siehe edits bitte
InformationsquelleAutor Joe Kington
Verwenden Sie einfach die Teilmenge der Daten enthält, die die Punkte (Punkte -- ich nehme an, Sie sprechen über die finanziellen Daten hier), die Sie interessiert:
(Dies ist nicht der effizienteste Ansatz, btw, wenn alles, was Sie wollen, ist den Pisten, aber es ist einfach.)
siehe edit, für die Idee
Das ist die grundlegende Idee, außer in die def, was ich?, bei mir ist es die loop-variable, also jedes i gibt die Steigung der einen unterschiedlichen Satz von Punkten; und auch, linregress zurückkehren wird, ein Tupel, nicht einen einzigen Wert, so können Sie entweder ordnen Sie alle Variablen, oder nur weisen die Tupel-und pick-off der erste Eintrag, wie r = stats.linregress(x[i:i+n], y[i:i+n]), dann Hang = r[0], oder einfach nur Steigung = (stats.linregress(x[i:i+n],y[i:i+n]))[0].
kann man das lösen obige Antwort mit Kommentar-Lösung.
InformationsquelleAutor tom10