DataPrep Service
godml incluye un motor de transformaciones declarativas. Define los pasos de limpieza en YAML — sin escribir una línea de Python.
Configuración en godml.yml
La receta embebida en dataset.dataprep usa el mismo schema que una receta standalone: necesita su propio inputs/outputs (aunque apunten al mismo archivo que dataset.uri — godml sobreescribe dataset.uri con el resultado al terminar).
dataset:
uri: ./data/raw.csv
target: churn
dataprep:
inputs:
- name: raw
connector: csv
uri: ./data/raw.csv
outputs:
- name: clean
connector: csv
uri: ./data/raw.csv
steps:
- op: drop_columns
params:
columns: [id, created_at, uuid]
# fillna no calcula media/mediana/moda automáticamente: calcula el
# valor con pandas antes y pásalo explícito. Un fillna por valor distinto.
- op: fillna
params:
columns: [age, income]
value: 0
- op: one_hot
params:
columns: [region, plan_type]
drop_first: true
- op: standard_scale
params:
columns: [age, income, tenure]
Transforms disponibles
Columnas
| Operación | op | Params |
|---|---|---|
| Eliminar columnas | drop_columns | columns: [...] |
| Renombrar | rename | mapping: {viejo: nuevo} |
| Seleccionar | select | columns: [...] |
| Castear tipos | cast_types / safe_cast | mapping: {col: "int"/"float"/"str"/"datetime"} — ambas variantes coercionan errores a null, no hay diferencia funcional entre ellas hoy |
Valores faltantes
| Operación | op | Params |
|---|---|---|
| Rellenar | fillna | columns: [...], value: <valor fijo> — un valor compartido por todas las columnas listadas; usa varios pasos fillna para valores distintos. Si omites value, infiere 0/"MISSING" según el tipo de la primera columna |
| Eliminar filas | dropna | columns: [...] (usadas como subset) |
Encoding
| Operación | op | Params |
|---|---|---|
| One-Hot | one_hot | columns: [...], drop_first: false |
| Label Encoding | label_encode | columns: [...] |
No hay transform de encoding de texto (TF-IDF/conteo) todavía.
Escalado
| Operación | op | Params |
|---|---|---|
| Estandarizar (z-score) | standard_scale | columns: [...] |
| Min-Max | minmax_scale | columns: [...], feature_range: [0, 1] |
No hay RobustScaler; no existe un op: scale genérico con parámetro method.
Texto
| Operación | op | Params |
|---|---|---|
| Minúsculas | lower | column: "..." (una columna) |
| Trim | strip | column: "..." (una columna) |
| Regex replace | regex_replace | column, pattern, repl — tiene una implementación acelerada con Cython cuando está disponible |
Series de tiempo
| Operación | op | Params |
|---|---|---|
| Lag | lag | column, periods: 1, new_column (default {column}_lag{periods}) |
No hay agregaciones por ventana temporal (rolling mean/sum, etc.) todavía.
Calidad
| Operación | op | Params |
|---|---|---|
| Deduplicar | drop_duplicates | subset: [...], keep: "first" |
| Marcar outliers | outlier_flag | column, method: "zscore"/"iqr", threshold: 3.0, new_column (default {column}_is_outlier) — agrega una columna booleana, no elimina filas |
No hay un op: quality_check con min_rows/max_null_pct. Para validar el dataset usa la sección validations (ver abajo).
Validaciones (validations)
Se ejecutan después de los steps, antes de escribir el output. Si una falla, lanza una excepción y detiene la receta.
validations:
- type: expect_non_null
args: [monthly_charges, tenure] # columna o lista de columnas
- type: expect_unique
args: [customer_id]
- type: expect_range
args:
columns: [tenure]
min: 0
max: 100
- type: expect_regex
args:
columns: [email]
pattern: '^[^@]+@[^@]+\.[^@]+$'
Join con otro dataset
join existe como transform, pero necesita un pd.DataFrame en memoria como parámetro right — no es expresable en una receta YAML declarativa. Úsalo desde Python:
from godml.dataprep_service.transforms.join import Join
df_joined = Join().apply(df, right=otro_df, on=["customer_id"], how="left")
Ejemplo completo
dataset:
uri: ./data/customers_raw.csv
target: churned
dataprep:
inputs:
- name: raw
connector: csv
uri: ./data/customers_raw.csv
outputs:
- name: clean
connector: csv
uri: ./data/customers_raw.csv
steps:
# Eliminar columnas no útiles
- op: drop_columns
params:
columns: [customer_id, signup_timestamp, internal_note]
# Rellenar nulos (un fillna por columna/valor)
- op: fillna
params:
columns: [monthly_charges]
value: 0
- op: fillna
params:
columns: [tenure_months]
value: 0
- op: fillna
params:
columns: [contract_type]
value: "unknown"
- op: fillna
params:
columns: [payment_method]
value: "unknown"
# Encoding de categóricas
- op: one_hot
params:
columns: [contract_type, payment_method, internet_service]
drop_first: true
# Normalizar numéricas
- op: standard_scale
params:
columns: [monthly_charges, total_charges, tenure_months]
validations:
- type: expect_non_null
args: [monthly_charges, tenure_months]
Usar DataPrep standalone
godml dataprep run recipe.yml
inputs:
- name: raw
connector: csv
uri: ./data/raw.csv
steps:
- op: drop_columns
params:
columns: [id]
outputs:
- name: clean
connector: csv
uri: ./data/clean.csv
También disponible desde notebook: nb.dataprep_run_inline(recipe) / nb.dataprep_run(path) / nb.dataprep_preview(path, limit), y por CLI: godml dataprep run/preview/validate/dry-run <archivo>.