Dataframe bearbeiten

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Hallo zusammen,

ich habe einen Dataframe aus Messdaten gebildet, den ich für eine Auswertung heranziehen möchte. Da ich jedoch rauschende Signale herausfiltern möchte würde ich gerne jede Spalte prüfen ob die prozentuale Standardabweichung größer gleich 5% vom Mittelwert (auch über die Spalte gebildet) ist. Wenn ja soll die Spalte maskiert werden.

Code: Alles auswählen

# Mittelwert und Standardabweichung über die Spalten bilden
mean_vals = imp_comp.mean(numeric_only=True)
std_vals = imp_comp.std(numeric_only=True)

for j in len(imp_comp[0]):
	pct_result = std_vals[j]/mean_vals[j]*100
	#Vergleich ob die Standardabweichung größer als 5% von Mittelwert abweicht; wenn ja --> Spalte maskieren
	if pct_result > 5:
		## Spalte maskieren
Da es sich um sehr viele Dataframes handelt, die ich verarbeiten muss möchte ich das Ganze etwas performant machen. Der hier abgebildete Weg scheint mir nicht als sonderlich gut.
Habe ich eine Möglichkeit die For-Schleife wegzulassen und alle benötigten Operationen direkt mit Pandas auszuführen?

Vielen lieben Dank!
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Es fehlt mir gerade zudem noch die Idee wie ich eine komplette Spalte auf einmal maskiere ohne extra über die einzelnen Zeilen und Spalten zu iterieren und jedes einzelne Spaltenelement zu maskieren.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Hast Du das Tutorial schon durchgearbeitet?
Hier stehen einige hilfreiche Arten der Maskierung drin: https://pandas.pydata.org/pandas-docs/s ... exing.html
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Ja habe ich durchgeschaut. Hier habe ich eine Idee für das Maskieren bekommen:

Code: Alles auswählen

m = np.zeros_like(imp_comp)
m[:,idx] = 1
imp_comp_msk = np.ma.masked_array(imp_comp, m)
Wie ich aber Mittelwerte und Standardabweichung und das Ergebnis als Condition für die Maskierung schön in ein paar Zeilen Code packe ohne Verwendung der Schleifen ist mir bisher noch rätselhaft.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Das steht doch bei Dir fast schon da:

Code: Alles auswählen

mean_vals = imp_comp.mean(numeric_only=True)
std_vals = imp_comp.std(numeric_only=True)
mask = std_vals / mean_vals > 0.05
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Kann ich denn ohne die Schleife jede Spalte für sich auf die Condition prüfen und wenn Condition erfüllt ist maskieren?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Was fehlt Dir denn noch?

Code: Alles auswählen

imp_comp[mask.index[mask]]
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

soweit bin ich. Der Code tut auch was er soll. Ich Frage mich nur ob ich es nicht 1 oder 2 Befehle von Pandas gibt, mit deren Hilfe ich die Operation über die Spalten durchführe und anschließend das Ergebnis als Condition verwende für die Maskierung. Hier bin ich bisher leider nicht fündig geworden.

Code: Alles auswählen

imp_comp = "Einlesen von Dataframe aus csv"

mean_vals = imp_comp.mean(numeric_only=True)
std_vals = imp_comp.std(numeric_only=True)
idx = []

for j in range(len(imp_comp.columns)):
	pct_result = std_vals[j]/mean_vals[j]*100
	if pct_result > 5:
		idx.append(j)
		
m = np.zeros_like(imp_comp)
m[:idx] = 1
imp_comp_msk = np.ma.masked_array(imp_comp, m)

Mit der von Ihnen eingefügten Codezeile kann ich leider noch nichts anfangen - hier bräuchte ich auch noch "mask", die ich wiederrum mit einer Schleife füttern müsste oder?

Vielen Dank für Deine Hilfe

:)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Hast Du die Codezeilen angeschaut? In wie weit weicht noch dieses Ergebnis von dem ab, was Du brauchst?
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Welche Codezeilen meinst Du?

Grundsätzlich passt das Ergebnis. Nur eben die Frage ob ich meinen Code von der Funktionalität noch besser zusammenschieben kann um auch hinsichtlich Performance besser zu werden.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, das genau habe ich Dir doch gezeigt.
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Du meinst diesen Code hier:

Code: Alles auswählen

imp_comp[mask.index[mask]]
Hier müsste ich doch die Maske auch wieder mit einer Schleife füttern oder nicht? Stehe hier etwas auf dem Schlauch..
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Hast Du schon geschaut, was mask und mask.index ist?
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Ich hatte vorhin schon versucht danach zu schauen, bin jedoch nicht fündig geworden.

zu mask.index finde ich leider keine Information

https://pandas.pydata.org/pandas-docs/ ... mask.html
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, hast Du das Programm ausgeführt und geschaut, was der Inhalt von mask, bzw. mask.index ist?
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

Ja hatte ich vorhin schon mal eingegeben nachdem Du mir die Zeile Code gegeben hast, hier sagt mir JupyterNotebook nur, dass 'mask' nicht definiert ist.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Das kann schlecht sein, wenn Du meinen Code ausgeführt hast, denn dort wird mask definiert:

Code: Alles auswählen

mean_vals = imp_comp.mean(numeric_only=True)
std_vals = imp_comp.std(numeric_only=True)
mask = std_vals / mean_vals > 0.05
mechatronics_student
User
Beiträge: 20
Registriert: Mittwoch 3. Februar 2021, 21:18

oh.. ich habe leider nur die eine Zeile Code gesehen. Ahh cool :) Jedoch muss ich leider die Dimension beibehalten, da dies Messdaten (jede Spalte entspricht einer bestimmten Parametereinstellung) und diese will ich mit den Referenzwerten in derselben Dimension vergleichen
Antworten