2016-10-24 1 views
1

Ich habe zwei Funktionen, die ich kombinieren möchte: Die erste Funktion f (rdata, t) liest die Daten für die Zeit horizont t ein und ordnet sie für die weitere ModellierungPython Lambda: Funktion einer anderen Funktion zuweisen

an
def f(rdata,t): 
    dataset = pd.read_csv(rdata, sep = ",", skiprows = 3) 
    data = dataset.loc[:,dataset.dtypes == np.float64] 
    data = pd.concat([dataset.OS_TERM, data], axis = 1).set_index(dataset.SIMULATION) 
    rdata = data.loc[data["OS_TERM"] == t ].drop("OS_TERM", axis = 1).T.add_prefix("Sim_") 
    return(rdata) 

die zweite Funktion Quantil (Daten, q, n, aufsteigend) berechnet eine hypothetische Quantil Q und vergleicht sie mit dem Ergebnis der ersten Funktion, die n extremsten Beobachtungen zeigen

def quantile(data, q , n , ascending): 
    name = str(q) 
    quant = pd.DataFrame({name:data.quantile(q, axis = 1)}) 
    quant_dif = pd.DataFrame(data.values - quant.values, columns = data.columns)**2 
    cum_dif = pd.DataFrame(quant_dif.sum(axis = 0), columns = ["cum_dif"]) 
    out = pd.DataFrame(cum_dif.sort(["cum_dif"], ascending = ascending).ix[0:n,:]) 
    index = out.index.values 
    sims = pd.DataFrame(data.loc[:, index]) 
    return(sims) 

So kombinieren Mit den beiden konnte ich die folgende Funktion aufbauen

Ion
quantile(f(rdata), t), q, n, ascending) 

Trotzdem würde Ich mag eine Funktion erstellen, die für einen Zeithorizont t in den Daten liest und wendet dann das Quantil in einem zweiten Schritt

f(data, t, quantile(data, q, n, ascending)) 

Irgendwelche Vorschläge, wie dies zu setzen up, vielleicht mit einer Lambda-Funktion?

+1

Was ist los mit 'Quantil (f (rdata), t), q, n, aufsteigend)' eigentlich? Es macht genau das, wonach Sie fragen: "liest die Daten für einen Zeithorizont t ein und wendet das Quantil dann in einem zweiten Schritt an". –

+0

Ich möchte in einem ersten Schritt die Daten einlesen und dann die Möglichkeit haben, den Daten irgendeine andere Funktion zuzuweisen, z.B. für den Mittelwert f (Daten, t, Mittelwert (Daten)) – Carmen

+0

Wenn Sie es wirklich brauchen, dann 'f (Daten, t, Lambda x: Quantil (x, q, n, aufsteigend))' und 'def f (rdata, t, fun): ... fun (rdata) ' – furas

Antwort

0

Wenn Sie darauf bestehen, die Dinge in der die meisten gewundenen Weg zu tun, können Sie einen partial als Rückruf verwenden:

from functools import partial 

def apply(rdata, t, callback): 
    data = f(rdata, t) 
    return callback(data=data) 


apply(rdata, t, partial(qantile, q=q, n=n, ascending=ascending)) 

oder mit einem Lambda:

apply(
    rdata, t, 
    lambda data, q=q, n=n, asc=ascending: qantile(data, q, n, asc) 
    ) 

Aber in beiden Fällen Ich verstehe nicht, Sehen Sie, wie es eine Verbesserung gegenüber der einfachen und offensichtlichen Lösung ist ...

Verwandte Themen