DataFrame ausdünnen mithilfe von Slicing

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Ameinsenpeter
User
Beiträge: 12
Registriert: Freitag 2. Oktober 2020, 09:32

Hallo liebe Community,
ich habe ein DataFrame voll mit Messwerten( knapp 470'000 Zeilen). Im DataFrame befinden sich Messwerte eines Sensors der bei verschiedenen Betriebsparametern betrieben wird.
Ich möchte den Sensor bei seinen verschiedenen Betriebsparametern analysieren. Dabei ist es wichtig, nur jeweils die letzten 10 Messwerte (da sich Sensor einpendeln muss) einer Betriebsparameterkombination zu erhalten. Daher möchte ich aus dem ursprünglichen DataFrame ein ausgedünntes DataFrame erstellen, das nur aus den erwähnten letzten 10 Messwerten jeder Kombination besteht.
Mein ursprüngliches DataFrame sieht wie folgt aus: https://ibb.co/DwJTf5q. Die verschieden Indizes spiegeln die Betriebparameter, sowie Messablauf wieder.
Ich habe nun ein bisschen Code geschrieben, der mein Anliegen erfüllt, aber leider sehr ineffizient ist. Dabei wird durch alle Indizes iteriert und ein neues DataFrame konkateniert.
Der Code sieht so aus:

Code: Alles auswählen

start_time = time.time()
minparamzyklus = mwti['Param-Zyklus'].min()
maxparamzyklus = mwti['Param-Zyklus'].max()
minparam_H_ID = mwti['Param-H-ID'].min()
maxparam_H_ID = mwti['Param-H-ID'].max()
minparam_EL_ID = mwti['Param-EL-ID'].min()
maxparam_EL_ID = mwti['Param-EL-ID'].max()
minDruck_Zyklus = mwti['Druck-Zyklus'].min()
maxDruck_Zyklus = mwti['Druck-Zyklus'].max()
minDruck_Stufe = mwti['Druck-ID'].min()
maxDruck_Stufe = mwti['Druck-ID'].max()
newfr = pd.DataFrame()
print(maxparamzyklus,maxparam_H_ID,maxparam_EL_ID,maxDruck_Zyklus,maxDruck_Stufe)
for param_zyklus in range(minparamzyklus,maxparamzyklus+1):    
    for param_h_id in range(minparam_H_ID,maxparam_H_ID+1):
        for param_el_id in range(minparam_EL_ID,maxparam_EL_ID+1):    
            for druck_zyklus in range(minDruck_Zyklus,maxDruck_Zyklus+1):
                for druck_stufe in range(minDruck_Stufe,maxDruck_Stufe+1):
                    anhang = mwti.loc[pd.IndexSlice[param_zyklus,param_h_id,param_el_id,druck_zyklus,druck_stufe,:],:].iloc[-10:]
                    newfr = pd.concat([newfr,anhang])
print('--- %s Sekunden ---' %(time.time()-start_time))
Leider braucht dieser Code knapp 8 Minuten :oops: .
Daher meine Frage, ist mein Anliegen auch einfacher zu lösen, zum Beispiel mit IndexSlicing?
Wäre dankbar für jegliche Vorschläge, die meine Rechenzeit verringern.
Grüße Peter
Benutzeravatar
__blackjack__
User
Beiträge: 13927
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ameinsenpeter: Gruppieren und von jeder Gruppe die letzten 10 Werte nehmen wäre wohl der Ansatz.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Ameinsenpeter
User
Beiträge: 12
Registriert: Freitag 2. Oktober 2020, 09:32

@Blackjack, danke das war die Lösung, das funktioniert in Sekundenbruchteilen :D Hab groupby bisher nie benutzt und daher auch nicht dran gedacht, dass das die Lösung sein könnte.
Gruß Peter
Antworten