Hey Leute,
ich habe selber eine Lösung gefunden und ich habe auch das Beispiel nochmal etwas verbessert vielleicht wird damit etwas klarer worauf ich hinaus wollte.
@__blackjack__ : Das Sortieren wurde durchgeführt um nacher die Produkte in der Reihenfolge vom günstigsten bis zum teuersten zu verarbeiten.
Die Reihenfolge ist in meinen Programm wichtig weil die Verarbeitung der einzelnen Produkte von einander abhängt.
Durch den Austausch der Pandas-Dataframes durch Numpy-Arrays konnte ich die Berechung um ein vielfaches beschleunigen. Ich hatte zwar zuvor mal gelesen das die Numpy-Vorteile auch
in Pandas enthalten sind aber da habe ich anscheinend etwas falsch verstanden.
Beide Beispiele können so ausgeführt werden.
Hier ist die alte Implementierung ausschließlich mit Dataframes:
Code: Alles auswählen
import pandas as pd
import time
start_1=time.time() # Messung Startzeit
# initialisieren der Beispiel-Komponenten
labels= ["Apfel", "Banane", "Kartoffel", "Bier"]
Menge=[12,25,14,50]
Preis=[11,2,100,45]
size_1 =10000
#Aufbau in Dataframes für einfache Handhabung / Verwaltung
output= pd.DataFrame(0,index=range(size_1),columns=labels)
inventar= pd.DataFrame(0,index=labels,columns=["Menge", "Preis"])
inventar.iloc[:,0]=Menge
inventar.iloc[:,1]=Preis
#Berechnung:
i=0
for i in range(size_1):
#im orginal werden in jeder äußeren iteration neue Megen und Preise für jedes Produkt berechnet
#die dann den Produkten im inventar Dataframe zugewiesen werden
sort = inventar.sort_values(by='Preis') #sortieren nach aufsteigendem Preis
labels_neu = sort.index #neue Reihenfolge der inventar Labels
t=0
for t in range (len(labels)):
#hier würde im Programm schrittweise das sortierte Inventar (sort) verarbeitet. In der nächsten Zeile soll dann das Ergebnis des Schrittes in das Output-Dataframe geschrieben werden
output.loc[i,labels_neu[t]]=inventar.iloc[t,0]
end_1 =time.time() #Messung End-Zeit
print(end_1-start_1)
print(output)
Diese Berechnung braucht bei mir ca. 8 Sekunden für einen vollständigen Durchlauf.
Hier ist die neue Implementierung mit Umwandlung in Numpy-Arrays und einer Rücktransformation in ein Pandas-Dataframe :
Code: Alles auswählen
import pandas as pd
import time
start_1=time.time() # Messung Startzeit
# initialisieren der Beispiel-Komponenten
labels= ["Apfel", "Banane", "Kartoffel", "Bier"]
idx=[0,1,2,3] #die Idx-Variable dient als Index innerhalb des Numpy Array und wird benutzt um nach dem Sortieren die Wertepaare(Mege,Preis) wieder den entsprechenden Produktnamen zu zuordnen.
Menge=[12,25,14,50]
Preis=[11,2,100,45]
size_1 =10000
#Aufbau in Dataframes für einfache Handhabung / Verwaltung
output= pd.DataFrame(0,index=range(size_1),columns=labels)
inventar= pd.DataFrame(0,index=labels,columns=["Menge", "Preis","idx"])
inventar.iloc[:,0]=Menge
inventar.iloc[:,1]=Preis
inventar.iloc[:,2]=idx
#Umwandlung in numpy-Arrays
out = output.to_numpy(dtype='int32')
inv = inventar.to_numpy(dtype='int32')
#Berechnung:
i=0
for i in range(size_1):
#im orginal werden in jeder äußeren iteration neue Megen und Preise für jedes Produkt berechnet
#die dann den Produkten im inventar Dataframe zugewiesen werden
sort= inv[inv[:,1].argsort()] #sortieren nach aufsteigendem Preis
label_neu= sort[:,2] #neue Reihenfolge der inventar Labels (hier mit den idx-Werten in der 3.ten Spalte von inv festgehalten)
t=0
for t in range (len(labels)):
#hier würde im Programm schrittweise das sortierte inventar (sort) verarbeitet. In der nächsten Zeile soll dann das Ergebnis des Schrittes in das out-Array geschrieben werden
out[i,label_neu[t]]=sort[t,0]
output= pd.DataFrame(out,index=range(size_1),columns=labels) #Rücktransformation in ein Pandas-Dataframe
end_1 =time.time() #Messung End-Zeit
print(end_1-start_1)
print(output)
Dieser Code braucht nur ca. 0,062 Sekunden bzw. 62 Millisekunden und gibt ein identisches Ergebnis aus !
Die Numpy Variante ist also ca.
129 mal schneller