Le funzioni sono essenziali in un progetto di data science perché rendono il codice più modulare, riutilizzabile, leggibile e testabile. Tuttavia, scrivere una funzione disordinata che tenta di fare troppo può introdurre ostacoli alla manutenzione e ridurre la leggibilità del codice.
Nel codice seguente la funzione function impute_missing_values
è lungo, disordinato e cerca di fare molte cose. Poiché sono presenti molti valori codificati, sarebbe impossibile per qualcun altro riutilizzare questa funzione per un DataFrame con nomi di colonna diversi.
def impute_missing_values(df):
# Fill missing values with group statistics
df("MSZoning") = df.groupby("MSSubClass")("MSZoning").transform(
lambda x: x.fillna(x.mode()(0))
)
df("LotFrontage") = df.groupby("Neighborhood")("LotFrontage").transform(
lambda x: x.fillna(x.median())
)# Fill missing values with constant
df("Functional") = df("Functional").fillna("Typ")
df("Alley") = df("Alley").fillna("Missing")
for col in ("GarageType", "GarageFinish", "GarageQual", "GarageCond"):
df(col) = df(col).fillna("Missing")
for col in ("BsmtQual", "BsmtCond", "BsmtExposure", "BsmtFinType1", "BsmtFinType2"):
df(col) = df(col).fillna("Missing")
df("FireplaceQu") = df("FireplaceQu").fillna("Missing")
df("PoolQC") = df("PoolQC").fillna("Missing")
df("Fence") = df("Fence").fillna("Missing")
df("MiscFeature") = df("MiscFeature").fillna("Missing")
numeric_dtypes = ("int16", "int32", "int64", "float16", "float32", "float64")
for i in df.columns:
if df(i).dtype in numeric_dtypes:
df(i) = df(i).fillna(0)
# Fill missing values with mode
df("Electrical") = df("Electrical").fillna("SBrkr")
df("KitchenQual") = df("KitchenQual").fillna("TA")
df("Exterior1st") = df("Exterior1st").fillna(df("Exterior1st").mode()(0))
df("Exterior2nd") = df("Exterior2nd").fillna(df("Exterior2nd").mode()(0))
df("SaleType") = df("SaleType").fillna(df("SaleType").mode()(0))
for i in df.columns:
if df(i).dtype == object:
df(i) = df(i).fillna(df(i).mode()(0))
return df
Questo esempio è adattato dal taccuino intitolato Come ho ottenuto lo 0,3% migliore in una competizione Kagglecon alcune modifiche.
Fonte: towardsdatascience.com