2017-12-07 1 views
1

Ich habe einen Pandas-Datenrahmen mit 6 Millionen Zeilen. Die Säulen sind:Schnellste Möglichkeit zur Berechnung zwischen zwei Datensammelsäulen?

['x', 'y'] 

Ich brauche eine einfache Berechnung zwischen x ein y, anzuwenden und an den Datenrahmen anhängen. Diese

ist, was ich habe versucht:

''' 
Calculates the height of a pressure level in feet 
''' 
def pressure_to_elevation(P, T = None): 

    sea_level_pressure = 1013.25 

    if T is not None: 
     # https://www.omnicalculator.com/physics/air-pressure-at-altitude 

     P0 = sea_level_pressure 
     g = 9.80665 
     M = 0.0289644 
     R0 = 8.31447 

     m = (np.log(P/P0)*T)/-(g*M/R0) 
     f = 3.28084 * m 
     return f 

    b = 0.190284 
    c = 145366.45 

    return (1-math.pow((P/sea_level_pressure), b)) * c 


test_df['result'] = test_fd.apply(lambda row: pressure_to_elevation(row['x'], row['y']),axis=1) 

Leider dauert dies eine lächerliche Menge an Zeit ... in der Tat, ich habe noch es komplett zu sehen.

Gibt es einen schnelleren Weg, dies zu tun? diese

+1

Dies hängt von Ihrer __real__ Funktion ab - können Sie eine Definition der realen Funktion angeben? Für Ihre aktuelle Frage wäre die schnellste: 'test_df ['result'] = test_df ['x'] + test_df ['y']' – MaxU

+0

Die Verwendung von '.apply' ist eine Abkürzung für die Iteration über die Zeilen im Datenrahmen, die mit 6M Reihen, das wird langsam sein. Abhängig von Ihren Bedürfnissen können Sie wahrscheinlich eine Methode finden, die die eingebauten Pandas Methoden/Operationen verwendet. – James

+0

@MaxU OK, aktualisiert, um die eigentliche Funktion zu enthalten. – pookie

Antwort

2

Versuchen:

def pressure_to_elevation(P, T): 

    sea_level_pressure = 1013.25 

    P0 = sea_level_pressure 
    g = 9.80665 
    M = 0.0289644 
    R0 = 8.31447 

    b = 0.190284 
    c = 145366.45 

    return np.where(T.notnull(), 
        3.28084 * ((np.log(P/P0)*T)/-(g*M/R0)), 
        (1-np.pow((P/sea_level_pressure), b)) * c) 

Verbrauch:

test_df['result'] = pressure_to_elevation(test_df['x'], test_df['y']) 
+0

Fantastisch, danke! – pookie

+0

@pookie, froh, dass es hilft! :) – MaxU

0

Ich glaube, wenn Sie diese brechen in getrennten Schritten und vermeiden durch den gesamten Datenrahmen laufen, dramatisch die Geschwindigkeit erhöhen. Geben Sie folgendes ein.

test_df['result_1'] = (test_df['x']/sea_level_pressure) 
test_df['result_1'] = test_df['result']**0.190284 
test_df['result_1'] = (1 - test_df['result'])*145366.45 

test_df['result_2'] = 3.28084*((np.log(test_df['x']/sea_level_pressure)*test_df['y'])/(-1*(9.80665*0.0289644/8.31447))) 

test_df['final_result'] = np.where(pd.isnull(test_df['y']), test_df['result_1'], test_df['result_2']) 
+0

Danke - Deine Vermutung ist richtig, das würde auch funktionieren. – pookie

Verwandte Themen