Gleitender Durchschnitt / Moving Average
Hallo allerseits,
ich habe eine Tabelle mit Datensätzen mit Zeitstempel und zwei Zahlenangaben (Volumen bzw. Restvolumen).
Nun würde ich gerne folgendes berechnen:
1. einen gleitenden Durchschnitt der sagen wir letzten 10 Datensätze
2. den Tagesdurchschnitt
3. und jeweils die Standardabweichung
Für den Durchschnitt habe ich im Forum bereits die Funktion avg() entdeckt.
Doch: Wie kann ich vorangehende Datensätze in meine Berechnung mit einbeziehen?
Und gibt es eine Funktion, die mir eine Standardabweichung berechnet?
Vielen Dank schon mal für die Antworten!
Gruß,
Philipp
7 Antworten
-
Hi Philipp. Tabellenname und Feldname noch anpassen. Standardabweichung habe ich auf 4 Stellen gerundet, kannst Du noch ändern. Gleitender Durchschnitt war mir zu aufwändig. Vielleicht mag das ja ein anderer einbringen. Gruß Mirko
Mittelwert (aber nicht gleitend)
avg((select TABELLE).Volumen)
Tagesdurchschnitt
let aktDat := 'Datum + Uhrzeit';
avg(for i in (select TABELLE)['Datum + Uhrzeit' = aktDat] do
i.Volumen
end)
Standardabweichung
let aryWerte := for i in select TABELLE do
i.Volumen
end;
let mittelWert := avg(aryWerte);
let firstStepVarianz := for i in aryWerte do
pow(i - mittelWert, 2)
end;
let secondStepVarianz := sum(firstStepVarianz) / cnt(firstStepVarianz);
let standardAbweichung := round(sqrt(secondStepVarianz), 4);
standardAbweichung
-
Hallo zusammen,
mich würde der gleitende Durchschnitt interessieren, bzw. ein Durchschnitt bis zum Datensatz.
avg((select Tabelle).Wert) gibt den Durchschnitt über alle Werte.
Eine Einschränkung mit der Datensatznr Nr liefert keine Ergebnisse
avg((select Tabelle)[Nr > 0 and Nr <= Nr].Wert)
Wie müsste die Abfrage angepasst werden?
Gruß
Peter
-
avg((select Tabelle)[number(Nr)<= number(this.Nr)].Wert)
alternativ:
let my := this,
avg((select Tabelle)[number(Nr)<= number(my.Nr)].Wert)
-
Danke für die schnelle Antwort. Allerdings liefert der Ausdruck je Datensatz für number (Nr) und number(this.Nr) beide Male den gleichen Wert: die ID der Zeile.
Ich denke noch mal darauf rum...
-
... mit der aufgeführten Alternative ebenso?
In Deinem Code
avg((select Tabelle)[Nr > 0 and Nr <= Nr].Wert)
bildest Du den Durchschnitt des Feldes "Wert" aller Datensätze, deren Datensatz-ID kleiner oder gleich deren Datensatz-ID ist - diese Bedingung trifft auf jeden Datensatz zu. Du möchtest Du die Datensatz-ID aber kleiner oder gleich der Datensatz-ID Deines aktuellen Datensatzes haben. Vielleicht hilft's, wenn Du die ID direkt in eine Variable schreibst - also:let my := number(Nr),
avg((select Tabelle)[number(Nr)<= my].Wert)
-
das überflüssige "Du" darfst Du behalten ;)
-
Du, danke Du, die Variante habe ich übernommen und es hat geklappt! (So habe ich auch gleich eine Verwendung für das Du gefunden...
Content aside
- vor 2 JahrenZuletzt aktiv
- 7Antworten
- 311Ansichten