Seite 1 von 1
Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 11:08
von mechatronics_student
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!
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 11:45
von mechatronics_student
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.
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 12:09
von Sirius3
Hast Du das Tutorial schon durchgearbeitet?
Hier stehen einige hilfreiche Arten der Maskierung drin:
https://pandas.pydata.org/pandas-docs/s ... exing.html
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 13:04
von mechatronics_student
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.
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 13:44
von Sirius3
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
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 13:48
von mechatronics_student
Kann ich denn ohne die Schleife jede Spalte für sich auf die Condition prüfen und wenn Condition erfüllt ist maskieren?
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 13:57
von Sirius3
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 14:11
von mechatronics_student
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

Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 14:19
von Sirius3
Hast Du die Codezeilen angeschaut? In wie weit weicht noch dieses Ergebnis von dem ab, was Du brauchst?
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 14:35
von mechatronics_student
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.
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 15:07
von Sirius3
Ja, das genau habe ich Dir doch gezeigt.
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 16:05
von mechatronics_student
Du meinst diesen Code hier:
Hier müsste ich doch die Maske auch wieder mit einer Schleife füttern oder nicht? Stehe hier etwas auf dem Schlauch..
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 16:19
von Sirius3
Hast Du schon geschaut, was mask und mask.index ist?
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 16:28
von mechatronics_student
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
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 16:36
von Sirius3
Nein, hast Du das Programm ausgeführt und geschaut, was der Inhalt von mask, bzw. mask.index ist?
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 16:44
von mechatronics_student
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.
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 16:50
von Sirius3
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
Re: Dataframe bearbeiten
Verfasst: Montag 8. Februar 2021, 17:09
von mechatronics_student
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