Wie gleitenden Mittelwert innerhalb einer Schleife bilden?

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
rickm
User
Beiträge: 9
Registriert: Mittwoch 14. August 2019, 13:37

Hallo,
ich bin Einsteiger in Python und habe folgendes Problem:
Ich lese in einer While -True-Schleife Sensordaten aus und möchte über eine beliebige Anzahl an Daten einen gleitenden Mittelwert über die Daten bilden und den ebenfalls in der Schleife ausgeben.

Für kleine Datensätze im Fenster habe ich das bisher so gut lösen können:

Code: Alles auswählen

 
 d1=0
 d2=0
 d3=0
 
 while True:
 	d1=d2
 	d2=d3
 	d3=sensorwert_aktuell
 	
 	ausgabe=(d1+d2+d3)/3
 
 
Wie löse ich das am Unkompliziertesten, wenn ich über mehr als 3 Werte den gleitenden Mittelwert bilden möchte ohne 50 Variablen schreiben zu müssen?
Danke schon mal im Voraus für jede Hilfe
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hiermit: https://docs.python.org/2/library/colle ... ions.deque

Code: Alles auswählen

import time
from collections import deque
from itertools import count

q = deque(maxlen=50)
for i in count():
    q.append(i)
    print(i, sum(q) / len(q))
    time.sleep(.1)
rickm
User
Beiträge: 9
Registriert: Mittwoch 14. August 2019, 13:37

wo gebe ich da jetzt meine Datensätze ein? Ich sehe in dieser Schleife gerade nur eine Möglichkeit, eine Länge einzustellen...
Das Problem ist ja auch, dass der Mittelwert in jedem Schleifenschritt ausgerechnt werden soll, während in jedem Schleifenschritt aber nur 1 Sensorwert mit fester Abtastzeit ausgelesen werden soll. Deshalb habe ich am Anfang die Nullen definiert...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hast du dir die Dokumentation mal angeschaut? Was glaubst du machen die einzelnen Zeilen in meinem Code?

Und welchen Tod du sterben willst, kannst du dir aussuchen - entweder der gleitende Mittelwert hat am Anfang weniger Werte zur Verfuegung (und gleitet darum nicht so recht), oder er ist gegenueber einem Standardwert wie bei dir verfaelscht. Wenn das dein Begehr ist, kann man die deque auch vorbelegen - auch das steht in der Dokumentation.
rickm
User
Beiträge: 9
Registriert: Mittwoch 14. August 2019, 13:37

Du überträgst hier irgendwelche hochgezählten Werte in eine Liste [1,2,3,4,5....] und bildest nach jedem erweiterten Eintrag den Mittelwert aus den bisherigen Komponenten. Das Ganze würde dann in einem einzigen Schleifenschritt der While true-Schleife laufen, also während nur ein einziger Sensorwert ausgelesen wird. Und wie soll ich dieser Sensorvariable eine Nummer geben, wenn sie doch in jedem Schritt erneuert wird? Ich möchte, dass der aktuelle Sensorwert in die Liste eingetragen wird
rickm
User
Beiträge: 9
Registriert: Mittwoch 14. August 2019, 13:37

Ich habe mich aber auch tatsächlich noch nicht so mit Listen beschäftigt
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

rickm hat geschrieben: Sonntag 18. August 2019, 20:18 Ich habe mich aber auch tatsächlich noch nicht so mit Listen beschäftigt
Das solltest du vielleicht nachholen, bevor du dich weiter mit dieser Aufgabe beschäftigst, denn das gehört zu den Grundlagen, um vernünftig mit Python arbeiten zu können. Der 'Trick' ist hier, dass man 'deque' eine Längenbegrenzung geben kann, bei deren Erreichen Elemente entfernt werden (wenn du rechts einen Wert anhängst und die Maximallänge ist erreicht, wird sozusagen links ein Wert "herausgeschoben"). Und das ist genau das, was du für einen gleitenden Mittelwert benötigst. Wenn du an der Stelle, an der __deets__ den Zähler zu Demonstatrationszwecken anhängt stattdessen deinen Sensorwert anhängst, bist du doch schon da.
Antworten