Mittelwert aus gesampelten Daten berechnen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
hugo_007
User
Beiträge: 3
Registriert: Montag 23. März 2020, 10:46

Hallo liebe Community,

ich möchte aus gemessenen Daten einen gleitenden Mittelwert mit Gewichtung berechnen.
In dem Datensatz befinden sich drei Messwerte (Zeit, Spannung und Strom). Mit einer For-Schleife möchte ich den Algrithmus ausführen.
Allerdings habe ich ein Fehler im Programm den ich einfach nicht finden kann. Hier mal mein Code (jupyther Notebook):

Code: Alles auswählen


%matplotlib notebook
#%matplotlib inline

import matplotlib.pyplot as plt
import pandas as pd 
import numpy as np

data2 = pd.read_csv('Test_Data.csv', sep='\,', engine='python')
#CSV lesen 

m=7
x_mittel = 0
a = [data2.Ampere]
for x_neu in a:
    x_mittel = ((x_mittel * m + x_neu) /(m+1))    


fig = plt.figure(figsize=(10, 5))
plt.plot(x_neu,'red',label = '4000mA')
plt.plot(x_mittel,'blue',label = '4000mA, m=7')
plt.grid(True)
plt.show()


Mein Problem ist, dass der Algorithmus den Wert x_mittel immer wieder auf 0 setzt, was ich nicht ganz verstehe. Ich muss den Wert vor der Schleife ja mit 0 initialisieren, oder?
Darum wird hier der neue Messwert x_neu einfach durch m+1 geteilt, da x_mittel immer 0 ist. Der Verlauf des Mittelwertes ist aus diesem Grund immer falsch.

Vielleicht liegt es aber auch an meinen Daten. Die würde ich euch zur Verfügung stellen, wenn ich wüsste wie man sie hier anhängt :ugeek:
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

Wenn man über Numpy.Arrays oder DataFrames iteriert, macht man in der Regel etwas falsch.
Pandas bietet dafür eine Funktion: https://pandas.pydata.org/pandas-docs/s ... ng-windows

Code: Alles auswählen

data2['Ampere'].rolling(window=10).mean()
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Komma braucht keinen Backslash zum escapen. a ist eine Liste mit einem Element. Was hast Du Dir dabei für Gedanken gemacht? Was soll `m` sein? Mittelwert ist die Summe aller Zahlen geteilt durch deren Anzahl.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`x_mittel` kann auch irgendwie nicht auf 0 gesetzt werden bei dem gezeigten Code, denn da kommt ja gar keine skalarer Wert heraus sondern ein `Series`-Objekt. Zudem wird die Schleife genau *einmal* durchlaufen weil in der Liste `a` genau *ein* Element steckt. Womit die Schleife keinen Sinn ergibt.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
hugo_007
User
Beiträge: 3
Registriert: Montag 23. März 2020, 10:46

Es handelt sich bei der Rechnung nicht um den klassischen Mittelwert.
Die Formel an sich ist auch nicht von Bedeutung, bzw. ist nicht mein Problem, muss aber damit durchgeführt werden.
Warum ist in a nur ein Wert drin bzw. wird die Schleife nur einmal ausgeführt? In dem Datensatz den ich importiere sind ca. 2000 Datenpunkte vorhanden. Wenn ich nach einer Ausführung des Programmes einfach nur a eingebe bekomme ich auch folgende ansicht gezeigt:

Code: Alles auswählen

[0             NaN
 1             NaN
 2         46.4512
 3        -45.6256
 4         15.3267
           ...    
 1995    3955.0252
 1996    4035.4272
 1997    3955.0252
 1998    3743.6625
 1999    3914.8242
 Name: Ampere, Length: 2000, dtype: float64]
Also sollte doch in a der ganze Datensatz drin stecken oder? Aber warum wird die Schleife dann nur einmal ausgeführt?
Es wird auch ein Verlauf des berechneten Wertes dargestellt. Dieser ist allerdings falsch, aber für alle 2000 Punkte vorhanden.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

DU erzeugst eine Liste mit EINEM Element. Dass da drin dann noch komplexere Daten sind, ist der for-Schleife egal.
Und ist die Formel für Deinen mysteriösen Mittelwert? Wie einfachTobi schon geschrieben hat, wenn man eine for-Schleife mit `pandas` benutzt, dann macht man etwas falsch.
hugo_007
User
Beiträge: 3
Registriert: Montag 23. März 2020, 10:46

Ok vielen Dank, ich habs verstanden :!:
Antworten