Finden gleitenden Durchschnitt von Datenpunkten in Python
Spiele ich in Python ein bisschen wieder, und ich fand ein ordentliches Buch mit Beispielen. Eines der Beispiele ist die Handlung einige Daten. Ich habe eine .txt-Datei mit zwei Spalten und ich habe die Daten. Ich geplottet den Daten ganz gut, aber in der übung heißt es: Ändern Sie Ihr Programm weiter zu berechnen und Plotten Sie den Laufenden Durchschnitt der Daten, definiert durch:
$Y_k=\frac{1}{2r}\sum_{m=-r}^r y_{k+m}$
wo r=5
in diesem Fall (und das y_k
ist die zweite Spalte in der Daten-Datei). Haben Sie das Programm plot sowohl die original-Daten und der laufende Durchschnitt auf der gleichen Kurve.
Bisher habe ich dieses:
from pylab import plot, ylim, xlim, show, xlabel, ylabel
from numpy import linspace, loadtxt
data = loadtxt("sunspots.txt", float)
r=5.0
x = data[:,0]
y = data[:,1]
plot(x,y)
xlim(0,1000)
xlabel("Months since Jan 1749.")
ylabel("No. of Sun spots")
show()
So, wie berechne ich die Summe? In Mathematica ist es einfach, da es die symbolische manipulation (Sum[i, {i,0,10}] zum Beispiel), aber wie berechne Summe in python die alle zehn Punkte in den Daten und Durchschnitte, und tut dies bis zum Ende der Punkte?
Ich schaute auf das Buch, aber nichts gefunden, was erklären würde :\
heltonbiker code war der trick ^^ 😀
from __future__ import division
from pylab import plot, ylim, xlim, show, xlabel, ylabel, grid
from numpy import linspace, loadtxt, ones, convolve
import numpy as numpy
data = loadtxt("sunspots.txt", float)
def movingaverage(interval, window_size):
window= numpy.ones(int(window_size))/float(window_size)
return numpy.convolve(interval, window, 'same')
x = data[:,0]
y = data[:,1]
plot(x,y,"k.")
y_av = movingaverage(y, 10)
plot(x, y_av,"r")
xlim(0,1000)
xlabel("Months since Jan 1749.")
ylabel("No. of Sun spots")
grid(True)
show()
Und ich habe diese:
Vielen Dank ^^ 🙂
xlim
Zeile sollte nicht verwendet werden (nur für den Fall)Ich habe die Punkte von hier: www-personal.umich.edu/~mejn/computational physics/Sonnenflecken.dat Und abnehmen xlim nicht helfen :\
Ich habe einen Fehler im code! führen Sie die Durchschnittliche auf dem y-array, nicht x:
y_av = movingaverage(y, r)
plot(x, y_av)
. Und Sie können xlim wieder, denke ich.Genial! 😀 Danke ^^
Ich denke, wir müssen Sie nutzen "gilt" statt "gleichen" hier - return numpy.convolve(Intervall -, Fenster -, 'gleiche')
InformationsquelleAutor dingo_d | 2012-07-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
BestenEine gemeinsame Methode für einen beweglichen/gleitenden Durchschnitt (oder andere Schiebe-Fenster-Funktion), um ein signal wird durch die Verwendungnumpy.convolve()
.Hier, Intervall ist Ihre
x
array, undwindow_size
ist die Anzahl der Proben zu berücksichtigen. Das Fenster wird zentriert auf jeder Probe, so nimmt Stichproben vor und nach der aktuellen Probe, um den Durchschnitt berechnen. Dein code würde so Aussehen:Hoffe, das hilft!
Gut, das bedeutet, dass Sie nicht import numpy. In der Tat, man importiert nur einige Funktionen von es:
linspace
undloadtxt
. Sollten Sieones
undconvolve
; o)Ich bearbeitete meinen code und jetzt habe ich das Bild, aber der Durchschnitt ist nur auf den letzten Teil der Kurve, sollte ich manuell ändern Intervall die aus zu Sortieren?
Das problem ist, dass convolve ist extrem langsam. Unten finden Sie eine viel schnellere Lösung basiert auf numpy.cumsum().
Ich finde, dass diese Lösung funktioniert sehr gut, aber nicht an den Kanten der Daten. Es fügt unechte niedrige Werte.
InformationsquelleAutor heltonbiker
Als numpy.convolve ist ziemlich langsam, diejenigen, die benötigen eine schnelle und leistungsstarke Lösung vielleicht lieber ein einfacher zu verstehen cumsum Ansatz. Hier ist der code:
wo Daten Ihre Daten enthält, und ma_vec enthalten gleitenden durchschnitten von window_width Länge.
Durchschnittlich cumsum wird etwa 30-40 mal schneller als convolve.
wo ist der "Schritt" - parameter?
Ich würde schätzen, wenn Sie konnten haben Sie einen Blick auf diese und Dank. stackoverflow.com/questions/45839123/...
Dies ist ein Duplikat dieser älteren Frage:stackoverflow.com/a/27681394/1391441
InformationsquelleAutor Roman Kh
Ist ein gleitender Durchschnitt ist ein convolution-und numpy wird schneller sein als die meisten reinen python-Operationen. Dies wird geben Sie die 10-Punkt-gleitenden Durchschnitt.
Ich würde auch stark schlage vor, mit den großen pandas Paket", wenn Sie die Arbeit mit timeseries Daten. Es gibt einige schöne gleitender Durchschnitt Operationen gebaut.
Das ist b/c, die Daten in Ihrem Fall ist eine mehrfache dimension numpy-array, und Sie sollten die übergabe eines one-dimension array. In Ihrem Fall wäre es geglättet = np.convolve(y, np.diejenigen/10)
+10 "Nutzung pandas" Vorschlag. Nicht perfekt für jeden Fall, aber wahrscheinlich erspart einem viele Kopfschmerzen für den Mittelwert bei jemand diesen Beitrag Lesen.
dies scheint cool zu sein, aber es scheint nicht zu verbessern, ein ähnliches problem, das habe ich hier und ich würde schätzen, wenn Sie konnten haben Sie einen Blick auf diese. stackoverflow.com/questions/45839123/...
InformationsquelleAutor reptilicus
Dies ist nicht der effizienteste Ansatz, aber es wird geben Sie Ihre Antwort, und ich bin mir unklar, wenn das Fenster 5 Punkte oder 10. Wenn die 10 ersetzen jeweils 5 mit 10 und die 4 mit der 9.
InformationsquelleAutor sizzzzlerz
Gibt es ein problem mit der akzeptierten Antwort. Ich denke, wir müssen "gültig" statt "gleichen" hier -
return numpy.convolve(interval, window, 'same')
.Als ein Beispiel, versuchen, die MA dieses Daten-set =
[1,5,7,2,6,7,8,2,2,7,8,3,7,3,7,3,15,6]
- das Ergebnis sollte[4.2,5.4,6.0,5.0,5.0,5.2,5.4,4.4,5.4,5.6,5.6,4.6,7.0,6.8]
, aber mit "gleichen" gibt uns eine falsche Ausgabe von[2.6,3.0,4.2,5.4,6.0,5.0,5.0,5.2,5.4,4.4,5.4,5.6,5.6, 4.6,7.0,6.8,6.2,4.8]
Rusty-code, um zu versuchen, diese out -:
Versuchen, diese mit Gültiger & gleichen, und sehen, ob die Mathematik Sinn macht.
Siehe auch: http://sentdex.com/sentiment-analysisbig-data-and-python-tutorials-algorithmic-trading/how-to-chart-stocks-and-forex-doing-your-own-financial-charting/calculate-simple-moving-average-sma-python/
Warum gehst du nicht zu schnell versuchen, diese mit der rostigen code (und die sample-Daten-set(als einfache Liste), die ich gepostet ? Für einige faule Leute(wie ich war auf den ersten) - seine Masken aus der Tatsache, dass der gleitende Mittelwert ist falsch.Wahrscheinlich sollten Sie prüfen, Bearbeiten Sie Ihre ursprüngliche Antwort. Ich versuchte es gerade gestern und doppelte überprüfung hat mich gerettet Gesicht sah aus schlecht an die Berichterstattung zur Cxo-Ebene. Alles, was Sie tun müssen, ist zu versuchen, die den gleichen gleitenden Durchschnitt einmal mit "gültig" und das andere mal mit "gleichen" - und wenn Sie davon überzeugt sind, geben Sie mir einige Liebe(aka-up-Stimmen)
Ich bin bei der Arbeit, die derzeit, damit ich nicht haben Zugang zu Python, aber wenn ich zu Hause bin werde ich es versuchen 🙂
Tut mir Leid, ich habe nicht bekommen, zurück zu dir, hätte ich nicht die Python auf meinem comp damals so vergaß ich diese. Ich installierte es wieder, und ich versuchte, um die
'valid'
imconvolve
, und habe den FehlerValueError: x and y must have same first dimension
. Ich überprüfte die Länge der mein array und Sie waren die gleichen. Ich selbst hatte diex = numpy.array(data[:,0]) y = numpy.array(data[:,1])
, aber ich habe immer noch den gleichen Fehler.InformationsquelleAutor ekta
Meine Moving Average-Funktion, ohne numpy-Funktion:
Sie können erzwingen, float-division in Python 2 durch die Verwendung eines dezimalpunktes in der
1
:m = (m * i + A[i])/(i+1.)
InformationsquelleAutor Armanda_An
Ich denke, so etwas wie:
Aber ich muss immer doppelt überprüfen Sie die Indizes sind zu tun, was ich erwarte. Den Bereich, den Sie wollen, ist (0, 5, 10, ...) und Daten[0:6] geben Sie Daten[0]...data[5]
ETA: Oh, und Sie wollen ave eher als Summe natürlich. Also wirklich, die mit Ihrem code und die Formel:
Sorry, nicht fix einen Tippfehler, sollte y1[i-r:i+r] anstelle von Daten
Und sowieso, y1, hat len(y1) Punkte und y2 hat len(y1)/2r Punkten, so...wollen Sie Sie einzeln hinzufügen, um das Diagramm. Gehen Sie mit der convolve Lösungen statt!
Wieder, für y2 ich bekommen, dass Sie [array[number, number], array[number, number]...] :\ ich brauche, um die zahlen zu zeichnen :\
InformationsquelleAutor dreadsci