Tuesday, 24 October 2017

Mysql Exponentiell Gleitender Durchschnitt


Als ich ein ähnliches Problem hatte, landete ich mit Temp-Tischen für eine Vielzahl von Gründen, aber es machte dies viel einfacher Was ich tat, sieht sehr ähnlich, was youre tun, soweit das Schema geht. Machen Sie das Schema so etwas wie ID Identität, Startdatum, Enddatum, Wert. Wenn du auswählst, mache ein Subselect avg der vorherigen 20 auf der Identitäts-ID. Tu dies nur, wenn du dich schon aus anderen Gründen mit den Temp-Tischen verwennst (ich habe die gleichen Zeilen immer wieder für verschiedene Metriken getroffen, also war es hilfreich, den kleinen Datensatz zu haben). In meiner Erfahrung neigt Mysql ab 5.5.x dazu, keine Indizes auf abhängige Auswahlen zu verwenden, ob eine Unterabfrage oder eine Verknüpfung. Dies kann einen erheblichen Einfluss auf die Leistung haben, bei der sich die abhängigen Auswahlkriterien in jeder Zeile ändern. Der gleitende Durchschnitt ist ein Beispiel für eine Abfrage, die in diese Kategorie fällt. Die Ausführungszeit kann mit dem Quadrat der Zeilen zunehmen. Um dies zu vermeiden, wählte eine Datenbank-Engine, die indexierte Look-ups auf abhängigen auswahlen ausführen kann. Ich finde postgres effektiv für dieses Problem. Antwortete Jul 2 14 um 8:01 Ihre Antwort 2017 Stack Exchange, IncUsing eine einfache gleitenden Durchschnitt zu glätten Daten ist eine ziemlich beliebte Technik. Es ist zu schlecht das primäre Beispiel in der SQL Anywhere-Hilfe ist weit von einfach: Was macht dieses Beispiel so komplex Neben der Problem-Anweisung, das heißt: Berechnen Sie den gleitenden Durchschnitt aller Produktverkäufe, im Monat, im Jahr 2000. Heres was macht Es komplex: zwei referenzen auf die AVG () - Funktion, eine GROUP BY (die alle von sich aus irgendwelche SELECT einen Kopf-Scratcher macht),. Eine Stealth-WINDOW-Klausel eine WINDOW-Klausel, die nicht einmal das WINDOW-Schlüsselwort verwendet. So zu den Uneingeweihten (die Leute, die Beispiele mehr als alle anderen brauchen) ist es nicht offensichtlich, dass ein FENSTER überhaupt beteiligt ist. Nicht nur irgendeine WINDOW-Klausel, kümmere dich, aber eine, die jede einzelne Komponente enthält, die du in einem FENSTER kodieren kannst: eine PARTITION BY, eine RANGE-Klausel. Nicht eine einfache ROWS-Klausel, sondern voll-geblasen RANGE-Klausel, eine, die eine intime Beziehung mit dem ORDER BY hat. Ich weiß, was eine Reihe ist, aber was das Redakteur ist ein RANGE Aber warten, theres mehr: Die Wahl von RANGE über ROWS in diesem Beispiel ist entscheidend für den korrekten Betrieb der Abfrage. (Für eine ausführlichere Diskussion dieses Beispiels siehe Beispiel 23 - Berechnung eines Moving Average in Glenn Paulleys ausgezeichnetes OLAP White Paper.) Jetzt können wir wieder auf den richtigen Weg gehen: Ein wirklich wirklich einfaches Moving Average Das folgende Beispiel zeigt 10 Tage im Wert von Daten zusammen mit dem gleitenden Durchschnitt des heutigen Wertes und gestern: Die WINDOW-Klausel auf den Zeilen 21 bis 23 definiert ein Bewegtfenster, das zwei Zeilen enthält: Zeilenzeile (CURRENT ROW) und gestern Zeile (1 PRECEDING): Die FENSTER ORDER BY-Klausel bestimmt, was PRECEDING bedeutet (die vorhergehende Zeile von t. entrydate) und die ROWS-Klausel bestimmt die Größe des Fensters (immer zwei Zeilen). Der Ausdruck AVG (t. value) OVER twodays auf Zeile 19 bezieht sich auf die WINDOW-Klausel mit Namen und es sagt SQL Anywhere, dass der Durchschnitt der beiden Werte von t. value berechnet wird, die im 2-reihigen Schiebefenster vorhanden sind Zeile in der Ergebnismenge. Also, für 2012-02-02 der Durchschnitt von 10 und 20 ist 15.000000, für 2012-02-03 der Durchschnitt von 20 und 10 ist 15.000000, für 2012-02-04 der Durchschnitt von 10 und 30 ist 20.000000, für 2012- 02-10 Der Durchschnitt von 10 und 60 ist 35.000000. Oops, was ist mit der ersten Reihe Die 2012-02-01 Reihe hat keine PRECEDING Zeile, also was ist der Durchschnitt über dem bewegten Fenster Nach Glenn Paulleys Weißbuch im Fall eines beweglichen Fensters wird angenommen, dass Zeilen, die Null enthalten Werte existieren vor der ersten Zeile und nach der letzten Zeile in der Eingabe. Das bedeutet, wenn das bewegte Fenster 2012-02-01 als CURRENT ROW hat, enthält die 1 PRECEDING Zeile NULL-Werte. Und wenn SQL Anywhere ein AVG () berechnet, das einen NULL-Wert enthält, zählt es überhaupt nicht das NULL. Nicht im Zähler oder im Nenner bei der Berechnung des Durchschnitts. Heres Beweis: Thats warum twodayaverage 10.000000 für die erste Reihe 2012-02-01. Geschrieben von Breck Carter um 3:47 PMIn meinem letzten Vortrag bei Surge und Percona Live über adaptive Fehlererkennung (Folien) habe ich behauptet, dass hartcodierte Schwellenwerte für die Alarmierung von Fehlerbedingungen in der Regel am besten zugunsten dynamischer oder adaptiver Schwellenwerte zu vermeiden sind. (Ich ging eigentlich viel weiter als das und sagte, dass es möglich ist, Fehler mit großem Vertrauen in vielen Systemen wie MySQL zu erkennen, ohne irgendwelche Schwellenwerte zu setzen.) In diesem Beitrag möchte ich ein wenig mehr über die gleitenden Durchschnitte erklären, die ich verwendet habe Bestimmung des normalen Verhaltens in den Beispielen, die ich gab. Es gibt zwei offensichtliche Kandidaten für bewegte Durchschnitte: geradlinige gleitende Durchschnitte und exponentiell gewichtete gleitende Durchschnitte. Ein einfacher gleitender Durchschnitt berechnet nur den Durchschnitt (Mittelwert) über die letzten N Datenproben. In meinem Fall habe ich 60 Samples benutzt. Dies erfordert das Halten eines Arrays der vorherigen N Samples und die Aktualisierung des Durchschnitts für jedes Sample. Ein exponentieller gleitender Durchschnitt erfordert keine Proben. Der Durchschnitt ist eine einzige Zahl und Sie haben einen so genannten 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 benötigen beispielsweise eine Aufwärmphase. Offensichtlich, im Falle eines 60-Probe-Fenster, benötigen Sie 60 Proben, bevor Sie beginnen können. Der exponentielle gleitende Durchschnitt kann aus dem Mittel der ersten 10 Samples hervorgehoben werden. Beide Techniken verzichten auch auf den Trend der Proben bis zu einem gewissen Grad. Wenn theres eine dramatische Verä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 abgetasteten 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, wie die rote Linie dazu neigt, schneller zu korrigieren und besser auf das aktuelle Verhalten der blauen Linie zu verzichten. Dies ist ein Vorteil der exponentiellen gleitenden Durchschnitt, wenn das ist, was Sie wünschen. Es ist nicht offensichtlich in diesen Daten, 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 dieser Spike im Fenster sein und den gleitenden Durchschnitt aufblasen. Wenn es aus dem Fenster weggeworfen wird, veranlasst es den gleitenden Durchschnitt plötzlich zu fallen. Ich habe das in einigen Fällen problematisch gefunden. Es ist besonders offensichtlich, wenn Sie die Standardabweichung der Proben (oder anderer sensibler Statistiken) über das bewegte Fenster berechnen. Der exponentielle gleitende Durchschnitt hat dieses Problem nicht, weil dieser Spike sich nie aus dem Fenster bewegt. Sein Einfluss ist für immer da, aber wie die Zeit vergeht, wird es allmählich kleiner, in einer glatten Art und Weise. So bekommst du keine abrupten Spikes im aktuellen Durchschnitt, basierend auf dem, was vor 60 Sekunden passiert ist. Dies ist nur Kratzen die Oberfläche der Techniken, die ich auf einem großen Satz von Tagen bis Wochen von Daten aus Zehntausenden von realen Servern erforscht. Als ich Zeit bekomme, versuche ich, in der Zukunft mehr darüber zu schreiben.

No comments:

Post a Comment