Wednesday 15 November 2017

Moving Average Numpy


Hmmm, es scheint, diese quoteasy to implementquot Funktion ist eigentlich ziemlich einfach, falsch zu bekommen und hat eine gute Diskussion über Speicher-Effizienz gefördert. I39m glücklich, aufblasen zu haben, wenn es bedeutet, dass etwas nach rechts gemacht worden ist. Ndash Richard NumPys Mangel an einer bestimmten Domain-spezifische Funktion ist vielleicht aufgrund der Core Teams Disziplin und Treue zu NumPys Prime-Direktive: bieten einen N-dimensionalen Array-Typ. Sowie Funktionen zum Erstellen und Indizieren dieser Arrays. Wie viele grundlegende Ziele, diese ist nicht klein, und NumPy macht es brillant. Das (viel) grßere SciPy enthält eine viel grßere Sammlung von domänenspezifischen Bibliotheken (sogenannte Unterpakete von SciPy-Devs), beispielsweise numerische Optimierung (Optimierung), Signalverarbeitung (Signal) und Integralrechnung (integrieren). Meine Vermutung ist, dass die Funktion, die Sie nach ist in mindestens einem der SciPy-Unterpakete (scipy. signal vielleicht) aber ich würde zuerst in der Sammlung von SciPy Scikits suchen. Identifizieren die relevanten Scikit (s) und suchen die Funktion von Interesse dort. Scikits sind unabhängig voneinander entwickelte Pakete, die auf NumPy / SciPy basieren und auf eine bestimmte technische Disziplin gerichtet sind (z. B. scikits-image, scikits-learn etc.) Mehrere davon waren (insbesondere das geniale OpenOpt für numerische Optimierung) hoch angesehen, reif Projekte lange vor der Wahl, um unter der relativ neuen Scikits Rubrik wohnen. Auf der Homepage der Scikits sind über 30 solcher Scikits aufgelistet. Obwohl mindestens einige von ihnen nicht mehr unter aktiver Entwicklung sind. Nach diesem Rat würden Sie zu scikits-timeseries führen, aber das Paket ist nicht mehr unter aktiver Entwicklung In Wirklichkeit ist Pandas geworden, AFAIK, die de facto NumPy-basierte Zeitreihen-Bibliothek. Pandas hat mehrere Funktionen, die verwendet werden können, um einen gleitenden Durchschnitt zu berechnen, der einfachste ist wahrscheinlich rollingmean. Die Sie so verwenden: Nun, rufen Sie einfach die Funktion Rolling Mean Passing in der Serie Objekt und eine Fenstergröße. Die in meinem Beispiel unten ist 10 Tage. Ob es funktioniert hat - z. Verglichen Werte 10-15 in der ursprünglichen Serie gegenüber der neuen Serie geglättet mit rollenden Mittel Die Funktion Rolling Mean, zusammen mit etwa ein Dutzend oder so andere Funktion sind informell gruppiert in der Pandas-Dokumentation unter der Rubrik Moving-Fenster-Funktionen eine zweite, verwandte Gruppe von Funktionen In Pandas wird als exponentiell gewichtete Funktionen bezeichnet (zB ewma, die einen exponentiell verschobenen gewichteten Durchschnitt berechnet). Die Tatsache, dass diese zweite Gruppe nicht in der ersten (Moving-Fenster-Funktionen) enthalten ist, ist vielleicht, weil die exponentiell gewichteten Transformationen nicht auf einem festen Länge Fenster verlassen Ich weiß, das ist eine alte Frage, aber hier ist eine Lösung, die keine zusätzlichen verwendet Datenstrukturen oder Bibliotheken. Es ist linear in der Anzahl der Elemente der Eingabe-Liste und ich kann nicht anders denken, um es effizienter (eigentlich, wenn jemand weiß, eine bessere Möglichkeit, das Ergebnis zuzuteilen, lass es mich wissen). HINWEIS: das wäre viel schneller mit einem numpy-Array anstelle einer Liste, aber ich wollte alle Abhängigkeiten zu beseitigen. Es wäre auch möglich, die Leistung durch Multi-Thread-Ausführung zu verbessern Die Funktion geht davon aus, dass die Eingabeliste eindimensional ist, also seien Sie vorsichtig. UPD: Effizientere Lösungen wurden von Alleo und jasaarim vorgeschlagen. Sie können np. convolve dafür verwenden: Das Argument mode 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, laufen zu arbeiten, aber Sie können andere Prioritäten haben. Hier ist eine Handlung, die den Unterschied zwischen den Modi veranschaulicht: Ich mag diese Lösung, weil es sauber ist (eine Zeile) und relativ effizient (Arbeit getan in numpy). Aber Alleo39s quotEfficient solutionquot mit numpy. cumsum hat eine bessere Komplexität. Ndash Ulrich Stern Sie können einen laufenden Mittelwert mit berechnen: Glücklicherweise schließt numpy eine Faltenfunktion ein, die wir verwenden können, um Sachen oben zu beschleunigen. Der laufende Mittelwert entspricht dem Falten von x mit einem Vektor, der N lang ist, wobei alle Elemente gleich 1 / N sind. Die numpy-Implementierung von convolve beinhaltet den Start-Transient, also müssen Sie die ersten N-1 Punkte entfernen: Auf meiner Maschine ist die schnelle Version 20-30 mal schneller, abhängig von der Länge des Eingabevektors und der Größe des Mittelungsfensters . Beachten Sie, dass Convolve enthält einen gleichen Modus, der scheint, wie es die vorübergehende Frage ansprechen sollte, aber es teilt es zwischen Anfang und Ende. Es entfernt den Übergang vom Ende, und der Anfang doesn39t haben eine. Nun, ich denke, es ist eine Frage der Prioritäten, ich don39t brauchen die gleiche Anzahl von Ergebnissen auf Kosten der eine Steigung in Richtung Null, die isn39t gibt es in den Daten. BTW, hier ist ein Befehl, um den Unterschied zwischen den Modi: Modi (39full39, 39same39, 39valid39) Diagramm (convolve (one ((200,)), diejenigen ((50,)) 4750, Modem) für m in den Modi zu zeigen Achse (-10, 251, -.1, 1.1) Legende (Modi, loc39Lower center39) (mit pyplot und numpy importiert). Ndash lapis Mar 24 14 am 13:56 pandas ist dafür besser geeignet als NumPy oder SciPy. Seine Funktion Rollingmean macht die Arbeit bequem. Es gibt auch ein NumPy-Array, wenn die Eingabe ein Array ist. Es ist schwierig, Rollingmean in der Leistung mit einer benutzerdefinierten reinen Python-Implementierung zu schlagen. Hier ist ein Beispiel Leistung gegen zwei der vorgeschlagenen Lösungen: Es gibt auch schöne Optionen, wie man mit den Randwerten umgehen. I39m immer durch eine Signalverarbeitungsfunktion geärgert, die Ausgangssignale unterschiedlicher Form zurückgeben als die Eingangssignale, wenn beide Eingänge und Ausgänge dieselbe Natur haben (z. B. beide Zeitsignale). Es bricht die Korrespondenz mit der zugehörigen unabhängigen Variablen (z. B. Zeit, Frequenz), die Plotten oder Vergleichen nicht direkt macht. Wenn Sie das Gefühl teilen, können Sie die letzten Zeilen der vorgeschlagenen Funktion als ynp. convolve (w / w. sum (), s, mode39same39) zurückgeben ywindowlen-1 :-( windowlen-1) ndash Christian O39Reilly Ein bisschen spät, um die Partei, aber Ive machte meine eigene kleine Funktion, die nicht Wrap um die Enden oder Pads mit Nullen, die dann verwendet werden, um den Durchschnitt zu finden. Als weitere Behandlung gilt, dass sie auch das Signal an linear beabstandeten Punkten neu abtastet. Fertigen Sie den Code an, um andere Eigenschaften zu erhalten. Das Verfahren ist eine einfache Matrixmultiplikation mit einem normalisierten Gaußschen Kern. Ein einfacher Gebrauch auf einem sinusförmigen Signal mit addiertem normalem verteiltem Rauschen: lapis ja, aber lässt Sie sagen, dass Sie Cumsummethode auf dem ersten Häckchen benutzen und Ihr Rollen mittleres Array für das folgende Häckchen speichern. Jeder Tick danach müssen Sie nur die neuesten gleitenden Mittelwert an Ihre rollende Array im Speicher anhängen. Mit dieser Methode können Sie nicht neu berechnen Dinge, die Sie bereits berechnet haben: Am ersten ticken Sie cumsum danach fügen Sie nur das quotmean der letzten Periode elementsquot, die 2x schneller für alle nachfolgenden Zecken ist. Ndash litepresence Wenn Sie sich entscheiden, Ihre eigenen rollen, anstatt eine vorhandene Bibliothek, bitte bewusst sein, Gleitkomma-Fehler und versuchen, ihre Auswirkungen zu minimieren: Wenn alle Ihre Werte sind etwa die gleiche Größenordnung, Dann wird dies dazu beitragen, die Genauigkeit zu bewahren, indem immer Werte von annähernd ähnlichen Größen addiert werden. In meinem letzten Satz habe ich versucht zu zeigen, warum es Gleitkomma-Fehler hilft. Wenn zwei Werte annähernd dieselbe Größenordnung sind, dann verliert das Addieren weniger Genauigkeit, als wenn Sie eine sehr große Zahl zu einem sehr kleinen hinzugefügt haben. Der Code kombiniert quadratweise benachbarte Quotwerte in einer Weise, daß gerade Zwischensummen immer in der Grße ausreichend nahe sein sollten, um den Gleitkommafehler zu minimieren. Nichts ist narrensicher, aber diese Methode hat ein paar sehr schlecht umgesetzte Projekte in der Produktion gespart. Ndash Mayur Patel Dez 15 14 am 17:22 Alleo: Statt einer Addition pro Wert, you39ll tun zwei. Der Beweis ist der gleiche wie das Bit-Flipping-Problem. Allerdings ist der Punkt dieser Antwort nicht notwendigerweise Leistung, sondern Präzision. Die Speicherauslastung für die Mittelung von 64-Bit-Werten würde 64 Elemente im Cache nicht überschreiten, daher ist sie auch im Arbeitsspeicher freundlich. Ndash Mayur Patel 29 Dec um 17:04 Uhr

No comments:

Post a Comment