Inicializa el preprocessor con un DataFrame de pandas o polars. Los mΓ©todos que retornan self son encadenables.
from statslibx import Preprocessing
import pandas as pd
df = pd.read_csv("datos.csv")
pp = Preprocessing(df)
# Fluent API (encadenamiento)
df_limpio = (
Preprocessing(df)
.fill_nulls(fill_with=0, columns=['col1', 'col2'])
.normalize('precio')
.standardize('edad')
.data
)Detecta valores nulos por columna. Retorna DataFrame con columnas: column, nulls, non_nulls, null_pct.
nulos = pp.detect_nulls()
print(nulos)
# Solo columnas especΓficas
nulos = pp.detect_nulls(columns=['edad', 'salario'])Retorna el nΓΊmero de valores ΓΊnicos por columna.
print(pp.check_uniqueness())Muestra las primeras n filas del DataFrame.
pp.preview_data(n=10)Reporte completo de calidad por columna: dtype, nulos, % nulos, valores ΓΊnicos y % completitud.
report = pp.data_quality()
# column | dtype | nulls | null_pct | unique_values | completeness_pct
print(report)EstadΓsticas descriptivas para columnas numΓ©ricas o categΓ³ricas respectivamente.
pp.describe_numeric() # count, mean, std, min, 25%, 50%, 75%, max
pp.describe_categorical() # count, unique, top, freqRellena valores nulos con el valor especificado. Si columns=None aplica a todas las columnas.
pp.fill_nulls(fill_with=0) # Todas las columnas
pp.fill_nulls(fill_with='Desconocido', columns='ciudad') # Una columna
pp.fill_nulls(fill_with=-1, columns=['col1', 'col2']) # Varias columnasNormaliza una columna al rango [0, 1] usando Min-Max Scaling: (x - min) / (max - min).
pp.normalize('precio')
df_resultado = pp.data # Acceder al DataFrame transformadoEstandariza una columna con Z-score: (x - mean) / std. Resultante tiene mediaβ0 y desv. std.β1.
pp.standardize('edad')
pp.standardize('salario')Convierte tipos de datos de columnas. Puede filtrar por tipo origen con from_type.
pp.change_dtypes(columns='precio', to_type='float')
pp.change_dtypes(columns=['col1','col2'], to_type='string')
pp.change_dtypes(from_type='object', to_type='string') # Todas las object β stringFiltra filas segΓΊn una condiciΓ³n booleana compatible con pandas o polars.
pp.filter_rows(pp.data['edad'] >= 18)
pp.filter_rows((pp.data['precio'] > 100) & (pp.data['stock'] > 0))Selecciona solo las columnas indicadas, descartando el resto.
pp.filter_columns(['nombre', 'edad', 'salario'])Renombra columnas usando un diccionario {nombre_actual: nombre_nuevo}.
pp.rename_columns({'old_name': 'new_name', 'sepal.length': 'sepal_length'})Detecta y retorna las filas que contienen outliers en la columna indicada. Si no hay outliers, imprime mensaje y retorna DataFrame vacΓo.
outliers_df = pp.detect_outliers('precio', method='iqr')
print(f"Filas con outliers: {len(outliers_df)}")
outliers_z = pp.detect_outliers('salario', method='zscore')from statslibx import Preprocessing
import pandas as pd
df = pd.read_csv("ventas_brutas.csv")
# Pipeline completo de limpieza
pp = Preprocessing(df)
reporte = pp.data_quality()
print(reporte)
df_limpio = (
Preprocessing(df)
.fill_nulls(fill_with=0, columns=['ventas', 'descuento'])
.fill_nulls(fill_with='Desconocido', columns='region')
.rename_columns({'Ventas_Brutas': 'ventas', 'Fecha_Venta': 'fecha'})
.filter_rows(df['ventas'] > 0)
.filter_columns(['fecha', 'region', 'ventas', 'descuento'])
.normalize('ventas')
.standardize('descuento')
.data
)
print(df_limpio.head()).data al final de la cadena. Los mΓ©todos fill_nulls, normalize, standardize, filter_rows, filter_columns y rename_columns retornan self y son encadenables.