Zeit Kennfeld erstellen

Code-Stücke können hier veröffentlicht werden.
Antworten
Berlin
User
Beiträge: 2
Registriert: Freitag 19. August 2022, 13:03

Hallo Zusammen,

ich habe leider ein Laufzeitproblem.
Vielleicht hat jemand eine Idee wie ich den Code schneller bekomme.

Ich versuche aus einer Messung mit zwei Variablen ein Kennfeld zur Aufenhaltsdauer zu erzeugen (Aufsummieren der Zeit).
Der Datensatz hat über 1 Mio Einträge.

So wie ich das gelöst habe dauert das einfach ewig....
Hat jemand eine Idee? Hab schon versuch über sortieren und dann ax zu kürzen, das hat aber bei mir nicht funktioniert.

Danke schon mal!
Grüße

Code: Alles auswählen

data = pd.DataFrame({'Zeit':Drehzahl_new[:,0],'Drehzahl':Drehzahl_new[:,1],'Moment':Moment_new[:,1]})

Freq=100

ax=[0, 500, 1000, 1500,2000,2500,3000,3500,4000,4500,5000,5500,6000,6500,7000]
bx=[-100,0,100,150,200,250,300,350,400,450,500,550,600,650,700,750,800,850,900,950,1000]

Kennfeld_Zeit=np.zeros([len(ax),len(bx)])

data_save=data
data_sorted=data.sort_values(by="Drehzahl", kind="mergesort")
data=data_sorted
f=0
for x in range(0, len(data)):
    done= False
    for a in range(0, len(ax)-1):    
        for b in range(0,len(bx)-1):
            print(a,b,x)
                   
            
            if a==0 and b==0 and ax[a+1] > data['Drehzahl'][x] and bx[b+1] > data['Moment'][x]:
                Kennfeld_Zeit[a,b]= Kennfeld_Zeit[a,b]+(1/Freq)
                done= True
                print('Yes  1--------------------')
                break
            elif a==0 and ax[a+1] > data['Drehzahl'][x] and bx[b+1] > data['Moment'][x] >= bx[b]:    
                Kennfeld_Zeit[a,b]= Kennfeld_Zeit[a,b]+(1/Freq)
                done= True
                print('Yes  2--------------------')
                break
            elif b==0 and ax[a+1] > data['Drehzahl'][x] >= ax[a] and bx[b+1] > data['Moment'][x]:
                Kennfeld_Zeit[a,b]= Kennfeld_Zeit[a,b]+(1/Freq)    
                done= True
                print('Yes  3----------------------')   
                break
            elif ax[a+1] > data['Drehzahl'][x] >= ax[a] and  bx[b+1] > data['Moment'][x] >= bx[b]:
                Kennfeld_Zeit[a,b]= Kennfeld_Zeit[a,b]+(1/Freq)
                done= True
                print('Yes  4----------------------')
                break
            else:
                print('oh NOOOO')
               
        if done==True:
            f+=1
            print(f)
            break
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablen schreibt man komplett klein, man benutzt keine Abkürzungen. Warum `Freq` und nicht frequence? Aber was für eine Frequenz? Was ist `ax` oder `bx`?

Würdest Du in Worten beschreiben, was Du eigentlich vorhast, müßte man das nicht erst mühsam aus dem Code herausfinden.

Warum bindest Du das Dataframe `data` an `data_save`, benutzt es aber gar nicht und was soll `data_sorted`, das eigentlich gar nicht benutzt wird?
Wenn möglich vermeidet man Flags. Am einfachsten geht das, wenn man Funktionen benutzt. Die vielen if-Abfragen sind, soweit ich das sehe, unlogisch, und könnten zu einem if werden.

Code: Alles auswählen

def find_bin(drehzahl, moment, bins_drehzahl, bins_moment):
    for a in range(len(bins_drehzahl) - 1):    
        for b in range(len(bins_moment) - 1):
            if (bins_drehzahl[a] <= drehzahl < bins_drehzahl[a + 1]
                    and bins_moment[b] <= moment < bins_moment[b + 1]):
                return a, b
    return None, None

frequency = 100
bins_drehzahl = [0, 500, 1000, 1500,2000,2500,3000,3500,4000,4500,5000,5500,6000,6500,7000]
bins_moment = [-100,0,100,150,200,250,300,350,400,450,500,550,600,650,700,750,800,850,900,950,1000]

data = pd.DataFrame({'Zeit':Drehzahl_new[:,0],'Drehzahl':Drehzahl_new[:,1],'Moment':Moment_new[:,1]})
kennfeld_zeit = np.zeros([len(bins_drehzahl),len(bins_moment)])
data = data.sort_values(by="Drehzahl", kind="mergesort")
for x in range(len(data)):
    a, b = find_bin(data['Drehzahl'][x], data['Moment'][x], bins_drehzahl, bins_moment)
    if a is not None:
        kennfeld_zeit[a,b] += 1/frequency
Wenn man mit großen Zahlenmengen arbeitet und for-Schleifen hat, dann macht man etwas falsch.
Hier erzeugst Du ein einfaches Histogramm:

Code: Alles auswählen

kennfeld_zeit = numpy.histogramdd([data['Drehzahl'], data['Moment']], [bins_drehzahl, bins_moment])
Berlin
User
Beiträge: 2
Registriert: Freitag 19. August 2022, 13:03

Vielen Dank. Ich sitzt hier Demütig und werde es besser machen.
Antworten