Cinco pasos para transformar funciones confusas en código listo para producción |  de Khuyen Tran |  enero de 2024
Imagen por autor

Las funciones son esenciales en un proyecto de ciencia de datos porque hacen que el código sea más modular, reutilizable, legible y comprobable. Sin embargo, escribir una función desordenada que intente hacer demasiado puede introducir obstáculos de mantenimiento y disminuir la legibilidad del código.

En el siguiente código, la función impute_missing_values Es largo, desordenado e intenta hacer muchas cosas. Dado que hay muchos valores codificados, sería imposible que otra persona reutilizara esta función para un DataFrame con diferentes nombres de columna.

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

Este ejemplo está adaptado del cuaderno titulado Cómo logré el 0,3% superior en una competencia de Kagglecon algunas modificaciones.