0

Gleitender Durchschnitt / Moving Average

Hallo allerseits, 

ich habe eine Tabelle mit Datensätzen mit Zeitstempel und zwei Zahlenangaben (Volumen bzw. Restvolumen). 

Screenshot Tabelle

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

null
    • mirko3
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • Peter.5
    • vor 2 Jahren
    • Gemeldet - anzeigen

    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

    • Torsten_Stang.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    avg((select Tabelle)[number(Nr)<= number(this.Nr)].Wert)

     

    alternativ:

     

    let my := this,
    avg((select Tabelle)[number(Nr)<= number(my.Nr)].Wert)

    • Peter.5
    • vor 2 Jahren
    • Gemeldet - anzeigen

    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...

    • Torsten_Stang.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    ... 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)

    • Torsten_Stang.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    das überflüssige "Du" darfst Du behalten ;)

    • Peter.5
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Du, danke Du, die Variante habe ich übernommen und es hat geklappt! (So habe ich auch gleich eine Verwendung für das Du gefunden...