2016-10-05 4 views
0

ich folgende Funktionen haben, die ich mag würde, um Kette können zusammen für die Nutzung sauberer Code haben:Chaining Funktionen für sauberere Code

def label_encoder(dataframe, column): 
    """ 
    Encodes categorical variables 
    """ 
    le = preprocessing.LabelEncoder() 
    le.fit(dataframe[column]) 
    dataframe[column] = le.transform(dataframe[column]) 
    return dataframe 

def remove_na_and_inf(dataframe): 
    """ 
    Removes rows containing NaNs, inf or -inf from dataframes 
    """ 
    dataframe.replace([np.inf, -np.inf], np.nan, inplace=True).dropna(how="all", inplace=True) 
    return dataframe 

def create_share_reate_vars(dataframe): 
    """ 
    Generate share rate to use as interaction var 
    """ 
    for interval in range(300, 3900, 300): 
     interval = str(interval) 
     dataframe[interval + '_share_rate'] = dataframe[interval + '_shares']/dataframe[interval + '_video_views'] 
    return dataframe 

def generate_logged_values(dataframe): 
    """ 
    Generate logged values for all features which can be logged 
    """ 
    columns = list(dataframe.columns) 

    for feature in columns: 
     try: 
      dataframe[str(feature + '_log')] = np.log(dataframe[feature]) 
     except AttributeError: 
      continue 
    return dataframe 

Ich möchte so etwas wie dies tun:

new_df = reduce(lambda x, y: y(x), reversed([label_encoder, remove_na_and_inf, create_share_reate_vars, generate_logged_values]), df) 

aber da die erste Funktion zwei Argumente benötigt, wird dies nicht funktionieren. Irgendwelche Lösungen für dieses oder vielleicht ein völlig anderes Paradigma?

+0

Wie erhalten Sie den Wert für Spalte in label_encoder? – bravosierra99

+0

nur etwas, das ich im Voraus kenne, abhängig vom Datensatz. Ich denke, ich könnte es hart codieren? – metersk

+0

ja, oder zumindest einen Standardwert haben ... – bravosierra99

Antwort

3

Sie könnten zuerst label_encoder mit functools.partial auswerten und dann diese Version verwenden, um zu Ihrem Lambda zu analysieren. Z.B.

from functools import partial 
fixed_col_bound_encoder = partial(label_encoder, column=2) 
new_df = reduce(lambda x, y: y(x), reversed([fixed_col_bound_encoder, remove_na_and_inf, create_share_reate_vars, generate_logged_values]), df)