Sunday 26 March 2017

Matplotlib Gleit Durchschnitt Beispiel

Ich weiß, das ist eine alte Frage, aber hier ist eine Lösung, die keine zusätzlichen Datenstrukturen oder Bibliotheken verwendet. Es ist linear in der Anzahl der Elemente der Eingabeliste und ich kann nicht anders denken, um es effizienter zu machen (eigentlich, wenn jemand von einem besseren Weg, das Ergebnis zuzuteilen weiß, lass es mich wissen). HINWEIS: Das wäre viel schneller mit einem numpy Array anstelle einer Liste, aber ich wollte alle Abhängigkeiten beseitigen. Es wäre auch möglich, die Leistung durch Multithread-Ausführung zu verbessern. Die Funktion geht davon aus, dass die Eingabeliste eindimensional ist. Sei also vorsichtig. UPD: Es wurden effizientere Lösungen von Alleo und Jasaarim vorgeschlagen. Sie können np. convolve dafür verwenden: Das Modusargument gibt an, wie die Kanten behandelt werden sollen. Ich wählte den gültigen Modus hier, weil ich denke, das ist, wie die meisten Leute erwarten, dass das Laufen bedeutet, zu arbeiten, aber Sie können andere Prioritäten haben. Hier ist eine Handlung, die den Unterschied zwischen den Modi veranschaulicht: beantwortet Mar 24 14 um 22:01 Ich mag diese Lösung, weil es sauber ist (eine Zeile) und relativ effizient (Arbeit in numpy). Aber alleo39s quotEfficient solutionquot mit numpy. cumsum hat eine bessere Komplexität. Ndash Ulrich Stern Sep 25 15 bei 0:31 Sie können einen laufenden Mittelwert berechnen mit: Zum Glück enthält numpy eine Faltenfunktion, die wir verwenden können, um die Dinge zu beschleunigen. Das laufende Mittel ist äquivalent zum Falten von x mit einem Vektor, der N lang ist, wobei alle Glieder gleich 1N sind. Die numpy Implementierung von convolve beinhaltet den Start-Transient, also musst du die ersten N-1 Punkte entfernen: Auf meiner Maschine ist die schnelle Version 20-30 mal schneller, je nach Länge des Eingangsvektors und der Größe des Mittelungsfensters . Beachten Sie, dass convolve enthält einen gleichen Modus, der scheint, wie es sollte das Anfangsübergang Problem, aber es teilt es zwischen dem Anfang und Ende. Es entfernt den Übergang vom Ende, und der Anfang hat nichts. Nun, ich denke, es ist eine Frage von Prioritäten, ich brauche nicht die gleiche Anzahl von Ergebnissen auf Kosten des Erhaltens eines Hanges in Richtung Null, dass es hier in den Daten ist. BTW, hier ist ein Befehl, um den Unterschied zwischen den Modi zu zeigen: modes (39full39, 39same39, 39valid39) plot (convolve (one ((200,)), one ((50,)) 4750, modem)) für m in modi Achse (-10, 251, -1, 1.1) Legende (Modi, loc39lower center39) (mit pyplot und numpy importiert). Ndash lapis Mar 24 14 um 13:56 Pandas ist dafür besser geeignet als NumPy oder SciPy. Seine Funktion rollingmean macht den Job bequem. Es gibt auch ein NumPy-Array zurück, wenn die Eingabe ein Array ist. Es ist schwierig, Rollingmean in der Leistung mit jeder benutzerdefinierten reinen Python-Implementierung zu schlagen. Hier ist eine beispielhafte Leistung gegen zwei der vorgeschlagenen Lösungen: Es gibt auch schöne Möglichkeiten, wie man mit den Kantenwerten umgehen kann. I39m immer durch Signalverarbeitungsfunktion verärgert, die Ausgangssignale unterschiedlicher Form als die Eingangssignale zurückgibt, wenn beide Eingänge und Ausgänge von der gleichen Art sind (z. B. beide zeitlichen Signale). Es bricht die Korrespondenz mit verwandter unabhängiger Variable (z. B. Zeit, Frequenz), die das Plotten oder den Vergleich nicht eine direkte Substanz macht. Ohnehin, wenn ihr das Gefühl teilt, könnt ihr vielleicht die letzten Zeilen der vorgeschlagenen Funktion als ynp. convolve ändern (ww. sum (), s, mode39same39) return ywindowlen-1 :-( windowlen-1) ndash Christian O39Reilly Aug 25 15 at 19:56 Ein bisschen spät zur Party, aber Ive machte meine eigene kleine Funktion, die nicht um die Enden oder Pads mit Nullen, die dann verwendet werden, um den Durchschnitt auch zu finden. Als weiteres Verständnis ist, dass es auch das Signal an linear beabstandeten Punkten neu abtastet. Passen Sie den Code nach Belieben an, um andere Features zu erhalten. Die Methode ist eine einfache Matrixmultiplikation mit einem normalisierten Gaußschen Kern. Ein einfacher Gebrauch auf einem sinusförmigen Signal mit addiertem normalem verteiltem Rauschen: Diese Frage ist jetzt noch älter als wenn NeXuS darüber im letzten Monat geschrieben hat, aber ich mag, wie sich sein Code mit Randfällen befasst. Allerdings, weil es ein einfacher gleitender Durchschnitt ist, liegen seine Ergebnisse hinter den Daten, auf die sie sich beziehen. Ich dachte, dass der Umgang mit Randfällen in einer befriedigenderen Weise als NumPys Modi gültig ist. gleich. Und voll könnte durch die Anwendung eines ähnlichen Ansatzes zu einer Faltung () basierte Methode erreicht werden. Mein Beitrag nutzt einen zentralen Laufdurchschnitt, um seine Ergebnisse mit ihren Daten auszurichten. Wenn für das vollformatige Fenster zwei wenige Punkte zur Verfügung stehen, werden laufende Mittelwerte aus aufeinanderfolgend kleineren Fenstern an den Kanten des Arrays berechnet. Tatsächlich, von sukzessiv größeren Fenstern, aber das ist ein Implementierungsdetail. Es ist relativ langsam, weil es convolve () verwendet. Und könnte wahrscheinlich ziemlich viel von einem wahren Pythonista aufgeholt werden, aber ich glaube, dass die Idee steht. Antwortete Jan 2 bei 0:28 np. convolve ist schön, aber langsam, wenn die Fensterbreite groß wird. Einige Antworten liefern mehr effiziente Algorithmen mit np. cumsum aber scheinen nicht in der Lage, Randwerte zu behandeln. Ich selbst habe einen Algorithmus implementiert, der dieses Problem gut behandeln kann, wenn dieses Problem deklariert wird als: Eingabeparameter mergenum kann als 2 Fensterbreite 1 gedacht werden. Ich weiß, dieser Code ist ein wenig unleserlich, wenn Sie es nützlich finden und wollen einige Expanationen, lass es mich wissen und krank aktualisieren diese Antwort. (Denn das Schreiben einer Erklärung kann mir viel Zeit kosten, ich hoffe ich mache es nur, wenn jemand es braucht. Bitte verzeihen Sie mir für meine Faulheit :)) Wenn Sie sich nur für die Originalversion interessieren: Es ist noch unleserlicher: die erste Lösung Befreit das Randproblem durch das Ausfüllen von Nullen um das Array, aber die zweite Lösung, die hier gepostet wird, verarbeitet es in einer harten und direkten Weise :) Lapis ja, aber wir sagen, dass Sie Cumsum-Methode auf dem ersten Tick verwenden und speichern Sie Ihre rollende durchschnittliche Array für die Nächstes Häkchen Jeder Tick danach muss man nur den letzten gleitenden Mittelwert an Ihr Rolling Array im Speicher anhängen. Wenn du diese Methode verwende, kannst du die Dinge, die du bereits berechnet hast, nicht neu berechnen: Zuerst tickst du dir das Cumsum an, dann fügst du einfach das Zitat der letzten Periode ein, das 2x schneller für alle nachfolgenden Zecken ist. Ndash litepresence Wenn Sie sich entscheiden, Ihre eigenen zu rollen, anstatt eine vorhandene Bibliothek zu benutzen, bitte bewusst sein, Gleitpunkt Fehler und versuchen, seine Auswirkungen zu minimieren: Wenn alle Ihre Werte sind in etwa die gleiche Größenordnung , Dann wird dies dazu beitragen, die Präzision zu bewahren, indem man immer Werte von annähernd ähnlichen Größen addiert. In meinem letzten Satz habe ich versucht zu zeigen, warum es hilft Flimmerpunkt Fehler. Wenn zwei Werte annähernd die gleiche Größenordnung haben, dann fügt sie hinzu, dass sie weniger Präzision verliert, als wenn ihr eine sehr große Zahl zu einer sehr kleinen hinzugefügt habt. Der Code verknüpft quittierte Quottwerte in einer Weise, dass auch Zwischensummen immer in der Größenordnung vernünftig engen müssen, um den Gleitkomma-Fehler zu minimieren. Nichts ist narrensicher, aber diese Methode hat ein paar sehr schlecht umgesetzte Projekte in der Produktion gespeichert. Ndash Mayur Patel Dec 15 14 at 17:22 Alleo: Anstatt einen zusätzlichen Wert pro Wert zu machen, wirst du zwei machen. Der Beweis ist der gleiche wie das Bit-Flipping-Problem. Allerdings ist der Punkt dieser Antwort nicht unbedingt Leistung, sondern Präzision. Die Speicherverwendung für die Mittelwertbildung von 64-Bit-Werten würde im Cache nicht mehr als 64 Elemente überschreiten. Ndash Mayur Patel Dec 29 14 at 17: 04Die folgenden Beispiele erzeugen einen gleitenden Durchschnitt der vorangegangenen WINDOW-Werte. Wir trunkieren die ersten (WINDOW -1) Werte, da wir den Durchschnitt vor ihnen finden können. (Das Standardverhalten für die Faltung ist, dass die Werte vor dem Beginn unserer Sequenz 0 sind). (Formalerweise konstruieren wir die Sequenz y für die Folge x, wobei yi (xi x (i1) 8230. x (in)) n) Dies macht die numpy8217s-Faltungsfunktion aus. Dies ist ein allgemeiner bewegter durchschnittlicher Betrieb. Das Ändern von Gewichtungen macht einige Werte wichtiger, die Kompensation in geeigneter Weise ermöglicht es Ihnen, durchschnittlich wie um Punkt statt vor Punkt zu sehen. Anstatt die Werte zu verkürzen, können wir die anfänglichen Werte festlegen, wie in diesem Beispiel dargestellt: Wir haben zuvor eingeführt, wie man gleitende Durchschnitte mit Python erstellt. Dieses Tutorial wird eine Fortsetzung dieses Themas sein. Ein gleitender Durchschnitt im Kontext der Statistik, auch Rollingrunning-Durchschnitt genannt, ist eine Art von endlicher Impulsantwort. In unserem vorherigen Tutorial haben wir die Werte der Arrays x und y gezeichnet: Let8217s plot x gegen den gleitenden Durchschnitt von y, den wir yMA nennen werden: Erstens, let8217s entlasten die Länge beider Arrays: Und um dies im Kontext zu zeigen: Das Ergebnis Grafisch: Um dies zu verstehen, lassen Sie sich von den verschiedenen Beziehungen unterscheiden: x vs y und x vs MAY: Der gleitende Durchschnitt hier ist die grüne Handlung, die bei 3 beginnt: Teilen Sie diese: Wie folgt: Post Navigation Hinterlasse eine Antwort Antwort abbrechen Sehr nützlich I Möchte den letzten Teil auf großen Datensätzen lesen Hoffe, es wird bald kommen8230 d Blogger wie folgt: Mehr Indikatordaten mit Matplotlib In diesem Matplotlib Tutorial decken wir das Hinzufügen ein paar einfache Funktionen, um Daten zu berechnen, damit wir unsere Achse mit füllen können. Einer ist ein einfacher gleitender Durchschnitt, der andere ist eine einfache, hohe, minus niedrige Berechnung für die Preise. Diese neuen Funktionen sind: Sie müssen nicht zu konzentrieren, um zu verstehen, wie der gleitende Durchschnitt funktioniert, machten dies nur für einige Beispieldaten, so dass wir ein bisschen mehr über das Anpassen von Matplotlib lernen können. Wir wollen auch einige Werte für das Bewegen von Mittelwerten an der Spitze unseres Skripts definieren: Als nächstes berechnen wir in unserer graphdata-Funktion: Hier berechnen wir zwei gleitende Mittelwerte und das hohe Minus des Niedrigen. Wir definieren auch einen Startpunkt. Wir machen das, weil wir unsere Daten aufstellen wollen. Ein 20 gleitender Durchschnitt benötigt beispielsweise 20 Datenpunkte. Das bedeutet, dass wir am Tag 5 einen 20-Tage-Gleitender Durchschnitt nicht wirklich berechnen können. Aus diesem Grund müssen wir bei der Berechnung von gleitenden Durchschnitten einige Daten verlieren. Um diese Subtraktion von Daten zu behandeln, berechnen wir, wieviel Daten wir mit der Startvariablen haben sollen. Von hier aus können wir die bewegten Durchschnitte sicher mit - start :, und Line-up-Daten, indem Sie dies zu allen Plots, wenn wir wollen. Als nächstes können wir die High Minus Low auf ax1 mit: Schließlich können wir die gleitenden Durchschnitte zu ax3 mit hinzufügen: Unser voller Code, einschließlich der Erhöhung der Zeitspanne, die wir verwendet haben: Dieser Code gibt uns etwas wie: Fortschritte machen, aber wir Immer noch eine Menge clealning zu tun In der nächsten Tutorial, gut reinigen Dinge ein bisschen, und zeigt eine dynamische Füllung.


No comments:

Post a Comment