Monday, 9 January 2017

Gleitende Durchschnittliche Funktion Python

Ich spiele in Python noch ein wenig, und ich fand ein ordentliches Buch mit Beispielen. Eines der Beispiele ist die Auftragung einiger Daten. Ich habe eine. txt-Datei mit zwei Spalten und ich habe die Daten. Ich habe die Daten genau dargestellt, aber in der Übung heißt es: Ändern Sie Ihr Programm weiter, um den laufenden Durchschnitt der Daten zu berechnen und zu zeichnen, die durch Folgendes definiert sind: wobei r5 in diesem Fall (und yk die zweite Spalte in der Datendatei ist) . Lassen Sie das Programm sowohl die Originaldaten als auch den laufenden Durchschnitt auf demselben Graphen dar. Bisher habe ich dies: So wie berechne ich die Summe In Mathematica seine einfache, da seine symbolische Manipulation (Sumi, zum Beispiel), sondern wie die Summe in python, die alle zehn Punkte in den Daten und mittelt, und es tut Bis zum Ende der Punkte schaute ich das Buch an, fand aber nichts, was das erklären würde: heltonbikers code hat den Trick: D Vielen Dank :) Es gibt ein Problem mit der akzeptierten Antwort. Ich denke, wir müssen gültig anstelle der gleichen hier - return numpy. convolve (Intervall, Fenster, gleiche). Als Beispiel versuchen Sie die MA dieses Datensatzes 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 sein. Aber mit demselben 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 dies auszuprobieren -: Versuchen Sie dies mit gültigen amp gleichen und sehen, ob die Mathematik sinnvoll ist. Ich habe versucht, dies aus, aber ich werde es untersuchen, es ist eine Weile seit I39ve codiert in Python. Ndash dingod Warum don39t Sie schnell ausprobieren dies mit dem rostigen Code (und die Beispiel-Datensatz (als einfache Liste), schrieb ich. Für einige faul Personen (wie ich auf den ersten) - seine Masken aus der Tatsache, dass gleitende Durchschnitt ist falsch. Wahrscheinlich sollten Sie erwägen, die Bearbeitung Ihrer ursprünglichen Antwort. Ich versuchte es nur gestern und doppelte Kontrolle rettete mir Gesicht von schauen schlecht bei der Berichterstattung auf Cxo Ebene. Sie müssen nur tun, ist zu versuchen Den gleichen gleitenden Durchschnitt einmal mit quotvalidquot und andere Zeit mit quotsamequot - und sobald Sie überzeugt sind, geben mir einige Liebe (aka-up-vote) ndash Ich weiß, das ist eine alte Frage, aber hier ist eine Lösung Dass es keine zusätzlichen 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, bitte Lassen Sie mich wissen) HINWEIS: dies 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 1N 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, möchten Sie vielleicht die letzten Zeilen der vorgeschlagenen Funktion als ynp. convolve (ww. sum (), s, mode39same39) zurückgeben ywindowlen-1 :-( windowlen-1) ndash Christian O39Reilly Aug 25 15 am 19:56 Ein wenig spät zur Partei, aber Ive bildete meine eigene kleine Funktion, die NICHT um die Enden wickelt, oder Auflagen mit Nullen, die dann verwendet werden, um den Durchschnitt ebenso 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: Diese Frage ist jetzt sogar älter als, als NeXuS über es letzter Monat schrieb, ABER ich mag, wie sein Code sich mit Randfällen befasst. Da es sich jedoch um einen einfachen gleitenden Durchschnitt handelt, liegen seine Ergebnisse hinter den Daten, auf die sie sich beziehen, zurück. Ich dachte, dass der Umgang mit Rand Fällen in einer befriedigender Weise als NumPys Modi gültig. gleich. Und voll konnte erreicht werden, indem eine ähnliche Annäherung an eine Faltung () basierte Methode angewendet wurde. Mein Beitrag verwendet einen zentralen laufenden Durchschnitt, um seine Ergebnisse mit seinen Daten auszurichten. Wenn zwei Punkten für das zu verwendende Vollformatfenster zur Verfügung stehen, werden laufende Mittelwerte aus sukzessiv kleineren Fenstern an den Rändern des Arrays berechnet. Eigentlich aus nacheinander größeren Fenstern, aber das ist eine Implementierung Detail. Seine relativ langsam, weil es convolve () verwendet. Und könnte wahrscheinlich durch eine wahre Pythonista viel aufgepeppt werden, aber ich glaube, dass die Idee steht. Antwortete Jan 2 um 0:28 np. convolve ist schön, aber langsam, wenn die Fensterbreite groß wird. Einige Antworten bieten effizientere Algorithmen mit np. cumsum aber scheinen nicht in der Lage, Rand-Werte zu behandeln. Ich selbst habe einen Algorithmus implementiert, der dieses Problem gut behandeln kann, wenn dieses Problem deklariert ist als: Eingangsparameter mergenum kann als 2 windowwidth 1 gedacht werden. Ich weiß, dieser Code ist ein wenig unlesbar, wenn u finden es nützlich und wollen einige Expanationen, lass es mich wissen und Ill Update dieser Antwort. (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 nur u in seiner ursprünglichen Version interessiert sind: Sein sogar noch unlesbarer: die erste Lösung Bekommt Kanten Problem durch das Auffüllen Nullen rund um das Array, aber die zweite Lösung veröffentlicht hier behandelt es in einem harten und direkten Weg :) lapis ja, aber sagen können Sie Cumsum-Methode auf die erste Tick und speichern Sie Ihre rollenden durchschnittliche Array für die Nächsten Tick. 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 , 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 Ich bin dabei, einen Forex-Handel Algorithmus zu schaffen und wollte meinen Versuch bei der Berechnung EMA (Exponential Moving Averages) versuchen. Meine Ergebnisse scheinen korrekt zu sein (im Vergleich zu den Berechnungen, die ich von Hand gemacht habe), so dass ich glaube, die folgende Methode funktioniert, aber wollte nur eine zusätzliche Menge von Augen, um sicherzustellen, dass im nicht fehlt etwas zu bekommen. Beachten Sie, dass dies nur die EMA für den letzten Preis zurückgibt, gibt es nicht ein Array von EMAs, wie das ist nicht das, was ich für meine Anwendung benötigen. Rekursion ist ein gutes Werkzeug für den richtigen Job, aber hier wird es verwendet, um einfaches Looping zu erreichen. Als solcher der Code. Ist schwerer zu lesen und zu begründen. Ist langsamer, da ein Großteil des Codes in ema nur einmal ausgeführt werden muss. Wird fehlschlagen mit groß genug Wert des Fensters durch überlaufende Python-Aufruf-Stack. Bitte dokumentieren Sie mindestens die Parameter jeder Funktion, zB. Dieses Fenster ist die Länge des Fensters, und diese Position zählt rückwärts vom Ende der Daten. (In der Tat wäre es klarer, wenn Position waren ein normaler Vorwärts-Index in Daten) Heben Sie eine Ausnahme, wenn Sie einen Parameter einen ungültigen Wert finden. Wenn Sie stattdessen nichts zurückgeben, wird dies später nur zu einer verwirrenden Ausnahme führen. In der Tat, wenn ich Indicators () versuchen. Ema (closeprices, 600) Ich bekomme unendliche Rekursion, weil sma keine zurückgibt. Das macht ema sma immer und immer wieder. Der vorhergehende Punkt zeigt auch, dass wenn len (data) lt window 2 nicht die richtige Gültigkeitsprüfung ist. Die 1 in data-window2 1: - window 1 scheint mir nicht richtig zu sein. Ich nehme an, Sie möchten data-window2: - window Die Anweisung return previousema ist an einem ungeraden Ort, da Sie an diesem Punkt haben Sie eine neue currentema berechnet. Dies ist der Basisfall der Rekursion, und es ist üblich, das Basisgehäuse zuerst zu behandeln. Mein Vorschlag für ema: antwortete am 26. November um 18:56 Hübsche flache Überprüfung: Sie müssen nicht eine Klasse für das, was Sie tun, zu schreiben (und ich schlage vor, Sie haben einen Blick auf dieses Video). Ihre Klasse kapselt keine Daten und Sie verwenden es nur, um Ihre Funktionen in einer gleichen Entität haben. Ich denke, Dinge wäre leichter zu verstehen, wenn Sie classmethod zu definieren, um es offensichtlich, dass Sie nicht wirklich auf irgendeine Instanz verlassen wollen. Eine noch bessere Möglichkeit wäre jedoch, Funktionen in einem Indikatormodul zu definieren. Antwortete Nov 24 14 am 18:04 Vielen Dank für die Vorschläge, die ich tatsächlich haben sie als classmethods und debattiert hin und her zwischen sogar mit einer Klasse oder einfach nur definieren Funktionen in einem Indikator-Modul (was ich jetzt tun). Ndash ChrisC Nov 25 14 am 19:12 Nur gerade das Video zu, große Sachen. Ndash ChrisC Nov 25 14 um 19:43 Deine Antwort 2017 Stack Exchange, Inc


No comments:

Post a Comment