Mysql Exponentiell Gleitender Durchschnitt


Exponentieller gleitender Durchschnitt in T-SQL Exponentielle gleitende Durchschnittswerte sind ähnlich gewichteten gleitenden Durchschnittswerten, da sie den Änderungen vor langer Zeit weniger Gewicht zuordnen und den jüngsten Änderungen mehr Gewicht verleihen. Die gewichteten gleitenden Mittelwerte sind linear, aber exponentielle gleitende Mittelwerte sind exponentiell. Das heißt, das Gewicht kann als Kurve ausgedrückt werden: Es gibt eine große Möglichkeit, exponentielle gleitende Mittelwerte in T-SQL zu berechnen, indem Sie ein undokumentiertes Feature über Variablen und laufende Summen in SQL Server verwenden. In diesem Blogpfosten werde ich zeigen, wie man diese Methode verwendet, um exponentiellen gleitenden Durchschnitt in T-SQL zu berechnen, aber ich werde auch eine Methode vorstellen, die Standardfunktionen in SQL Server verwendet. Leider bedeutet das, mit einer Schleife. In den Beispielen werde ich einen 9 Tage exponentiellen gleitenden Durchschnitt berechnen. Die Beispiele verwenden die Datenbank TAdb. Ein Skript zur Erstellung von TAdb finden Sie hier. Exponential Moving Average (EMA): Laufende Totals-Methode Die Theorie hinter den laufenden Total Features in Updates wird ausführlich von Jeff Moden in seinem Artikel Solving the Running Total und Ordinal Rang Probleme beschrieben. Weitere Ressourcen, die diese Methode zur Berechnung von EMA beschreiben, sind der Blogpfosten, der die gleitenden Durchschnitte mit T-SQL von Gabriel Priester berechnet und dem Forumsbeitrag Exponential Moving Average Challenge. Beide auf SQL Server Central. Grundsätzlich können Sie in T-SQL sowohl Variablen als auch Spalten in einer update - Anweisung aktualisieren. Die Updates werden Zeile für Zeile intern von SQL Server ausgeführt. Dieses Zeilen-für-Zeile-Verhalten macht die Berechnung einer laufenden Summe möglich. Dieses Beispiel zeigt, wie es funktioniert: Beachten Sie, dass 8220ColumnRunningTotal8221 eine laufende Summe von 8220ColumnToSum8221 ist. Mit dieser Methode können wir EMA9 mit diesem T-SQL berechnen: Die Berechnung von EMA ist recht einfach. Wir verwenden die aktuelle Zeile und die vorherige, aber mit mehr Gewicht auf die aktuelle Zeile. Das Gewicht wird nach der Formel 2 (19) berechnet, wobei 822098221 der Parameter für die Länge der EMA ist. Zur Berechnung von EMA9 für Zeile 10 oben ist die Berechnung: In diesem Fall erhält die aktuelle Zeile 20 des Gewichts (2 (19) 0,2) und die vorherige Zeile erhält 80 des Gewichts (1-2 (19) 0,8). Sie finden diese Berechnung in der Anweisung oben in der CASE-Anweisung: Exponential Moving Average (EMA): Looping-Methode Soweit ich weiß, mit Ausnahme der laufenden Summenmethode oben skizziert, gibt es keine Möglichkeit, EMA mit einer setbasierten SQL-Anweisung zu berechnen . Daher verwendet die T-SQL unten eine while-Schleife, um EMA9 zu berechnen: Die Ergebnisse sind die gleichen wie in den laufenden Summen Beispiel oben. Leistung Wie erwartet, ist die set based running sumals-Version viel schneller als die Loop-Version. Auf meiner Maschine lag die setbasierte Lösung bei ca. 300 ms, verglichen mit ca. 1200 bei der Loop-Version. Die Schleifenversion entspricht jedoch mehr den SQL-Standards. Also die Wahl zwischen den Methoden hängt von what8217s am wichtigsten für Sie, Leistung oder Standards. Der exponentielle gleitende Durchschnitt kann in der Trendanalyse verwendet werden, wie bei den anderen Arten von gleitenden Durchschnitten, dem Simple Moving Average (SMA) und dem gewichteten gleitenden Durchschnitt (WMA). Es gibt auch andere Berechnungen in der technischen Analyse, die die EMA, MACD zum Beispiel verwendet. Dieser Blog-Beitrag ist Teil einer Serie über technische Analyse, TA, in SQL Server. Siehe die anderen Beiträge hier. Geschrieben von Tomas Lind Tomas Lind - Consulting-Dienstleistungen als SQL Server DBA und Datenbank-Entwickler an der High Coast Database Solutions AB. Wir haben offen diskutiert, wie man rollende Durchschnitte in Postgres schreiben. Durch die populäre Nachfrage zeigten Ihnen, wie das gleiche in MySQL und SQL Server zu tun. Nun zu decken, wie kommentieren laute Charts wie folgt: Mit einem 7-Tage vorherigen durchschnittlichen Zeile wie folgt: Die große Idee Unsere erste Grafik oben ist ziemlich laut und schwer zu nützlichen Informationen zu bekommen. Wir können es glätten, indem wir einen 7-Tage-Durchschnitt auf die zugrundeliegenden Daten zeichnen. Dies kann durch Fensterfunktionen, Self-Joins oder korrelierte Unterabfragen erfolgen - decken die ersten beiden ab. Nun beginnen mit einem vorangegangenen Durchschnitt, was bedeutet, dass der durchschnittliche Punkt am 7. des Monats der Durchschnitt der ersten sieben Tage ist. Optisch verschiebt sich die Spitze im Graphen nach rechts, da eine große Spitze über die nächsten sieben Tage gemittelt wird. Erstens eine Zwischenzahltabelle erstellen Wir wollen einen Durchschnittswert über die gesamten Anmeldungen für jeden Tag berechnen. Angenommen, wir haben eine typische Benutzer-Tabelle mit einer Zeile pro neuen Benutzer und einem Zeitstempel erstellt, können wir unsere aggregate unsere Signups-Tabelle wie folgt erstellen: In Postgres und SQL Server können Sie diese als CTE verwenden. In MySQL können Sie sie als temporäre Tabelle speichern. Postgres Rolling Average Glücklicherweise hat Postgres Fensterfunktionen, die der einfachste Weg sind, einen laufenden Durchschnitt zu berechnen. Diese Abfrage setzt voraus, dass die Daten keine Lücken aufweisen. Die Abfrage ist Mittelung über die letzten sieben Zeilen, nicht die letzten sieben Termine. Wenn Ihre Daten Lücken aufweisen, füllen Sie sie mit generateseries oder Beitritt gegen eine Tabelle mit dichten Datumszeilen. MySQL Rolling Average MySQL fehlt Fenster-Funktionen, aber wir können eine ähnliche Berechnung mit Self-Joins zu tun. Für jede Zeile in unserem Zählungstabelle verbinden wir jede Zeile, die innerhalb der letzten sieben Tage war, und nehmen den Durchschnitt. Diese Abfrage behandelt automatisch Datumslücken, da wir Zeilen innerhalb eines Datumsbereichs anstelle der vorhergehenden N Zeilen betrachten. SQL Server Rolling Average SQL Server verfügt über Fensterfunktionen, so dass die Berechnung der rollenden Durchschnitt kann entweder in der Postgres-Stil oder MySQL-Stil erfolgen. Zur Vereinfachung wurden die MySQL-Version mit einem Self-Join. Dies ist konzeptionell das gleiche wie in MySQL. Die einzigen Übersetzungen sind die dateadd Funktion und explizit benannt Gruppe nach Spalten. Andere Mittelwerte Wir konzentrierten uns auf den 7-tägigen nachlaufenden Durchschnitt in diesem Beitrag. Wenn wir uns den 7-Tage-Leitdurchschnitt anschauen wollten, so einfach wie die Daten in die andere Richtung sortieren. Postgres: Zeilen zwischen 3 vorherigen und 3 folgenden MySql: zwischen signups. date - 3 und signups. date 3 in MySQL SQL Server: zwischen dateadd (Tag, -3, signups. In meinem letzten Vortrag bei Surge und Percona Live über adaptive Fehlererkennung (Folien) behauptete ich, dass hartcodierte Schwellenwerte für die Alarmierung über Fehlerbedingungen in der Regel am besten zu Gunsten von dynamischen oder zu vermeiden sind Adaptive Schwellen. (Ich ging tatsächlich viel weiter als das und sagte, dass es möglich ist, Fehler mit großer Zuversicht in vielen Systemen wie MySQL, ohne Festlegung aller Schwellen zu erkennen.) In diesem Beitrag möchte ich ein wenig mehr über die gleitenden Durchschnitte für die ich verwendet zu erklären Bestimmung des normalen Verhaltens in den Beispielen I gegeben. Es gibt zwei offensichtliche Kandidaten für gleitende Mittelwerte: geradlinige gleitende Mittelwerte und exponentiell gewichtete gleitende Mittelwerte. Ein einfacher gleitender Durchschnitt berechnet lediglich den Mittelwert (Mittelwert) über die letzten N Abtastwerte der Daten. In meinem Fall habe ich 60 Proben verwendet. Dies erfordert das Halten eines Arrays der vorhergehenden N Abtastwerte und das Aktualisieren des Durchschnitts für jeden Abtastwert. Ein exponentieller gleitender Durchschnitt erfordert keine Probenhaltung. Der Durchschnitt ist eine einzelne Zahl und Sie haben einen sogenannten Glättungsfaktor. Für jede neue Probe multiplizieren Sie den alten Durchschnitt mit 1 und fügen Sie ihn dann zu den neuen Sample-Zeiten hinzu: avg: (1-alpha) avg alphasample. Beide Techniken haben ihre Nachteile. Beide erfordern eine Aufwärmperiode, zum Beispiel. Offensichtlich, im Falle eines 60-Probe-Fenster bewegen, benötigen Sie 60 Proben, bevor Sie beginnen können. Der exponentielle gleitende Durchschnitt kann aus dem Mittelwert der ersten 10 Proben, nach meiner Erfahrung, grundiert werden. Beide Techniken hingen auch in gewissem Maße von der Entwicklung der Proben ab. Wenn theres eine drastische Änderung im Muster, nehmen sie eine Weile, um aufzuholen. Heres eine Handlung von einigen realen Daten und die beiden Techniken. Klicken Sie hier, um ein größeres Bild zu sehen. Die blaue Linie ist die abgetastete Daten, die rote Linie ist ein exponentieller gleitender Durchschnitt mit einem durchschnittlichen 60-Sekunden-Speicher, und die gelbe Linie ist ein 60-Sekunden-gleitender Durchschnitt. Beachten Sie, dass die rote Linie dazu neigt, schneller zu korrigieren und dem aktuellen Verhalten der blauen Linie treuer zu bleiben. Dies ist ein Vorteil der exponentiellen gleitenden Durchschnitt, wenn das ist, was Sie wünschen. Es ist nicht in diesen Daten offensichtlich, aber der einfache gleitende Durchschnitt hat einen weiteren Nachteil. Angenommen, es gibt eine Spitze von sehr hohen Werten in den abgetasteten Daten für ein paar Sekunden. Für die nächsten 60 Sekunden wird diese Spitze innerhalb des Fensters sein und den gleitenden Durchschnitt aufblasen. Wenn es aus dem Fenster weggeworfen wird, verursacht es den gleitenden Durchschnitt plötzlich fallen. Ich habe festgestellt, dass dies in einigen Fällen problematisch sein. Sein besonders offensichtlich, wenn youre, das die Standardabweichung der Proben (oder anderer empfindlicher Statistiken) über dem bewegten Fenster berechnet. Der exponentielle gleitende Durchschnitt hat nicht dieses Problem, weil diese Spitze nie aus dem Fenster heraus bewegt. Sein Einfluss ist für immer, aber im Laufe der Zeit, wird es allmählich kleiner, in einer glatten Weise. So erhalten Sie nicht abrupt Spikes im aktuellen Durchschnitt basierend auf, was vor 60 Sekunden passiert. Dies ist nur Kratzer auf der Oberfläche der Techniken Ive erforscht auf einem großen Satz von Tagen bis Wochen von Daten von Zehntausenden von realen Servern. Wie ich Zeit bekomme, versuche ich, mehr darüber in der Zukunft zu schreiben.

Comments

Popular Posts