Creación de la receta: preparando la automatización

Clase 26 de 38Curso de Ingeniería de Datos con Python

Contenido del curso

Web scraping

Pandas

Resumen

Convertir insights de un Jupyter Notebook en un proceso reproducible marca la diferencia entre un Data Scientist y un Data Engineer. Aquí se explica, con claridad y foco práctico, cómo pasar de pruebas manuales a una recipe automatizada en Python que limpia y estandariza datos de noticias, generalizable más allá de El Universal.

¿Qué diferencia al data engineer en la transformación de datos?

Las dos disciplinas exploran datos con Jupyter Notebooks para entender su estructura y detectar vacíos. Sin embargo, el perfil de Data Engineer debe automatizar esos hallazgos en un script que ejecute transformaciones paso a paso sobre múltiples datasets con formato similar. La idea: crear una recipe que reciba un archivo y devuelva un dataset limpio.

  • Uso de Jupyter Notebooks para obtener insights, luego traducidos a código automatizado.
  • Creación de un script reutilizable para muchos sitios, no solo El Universal.
  • Transformaciones declarativas y trazables con logging.

¿Cómo construir la recipe en Python paso a paso?

El flujo central: definir punto de entrada, parsear argumentos, configurar logging, leer datos con pandas, extraer el identificador del diario desde el nombre del archivo, añadirlo como columna y obtener el host de cada URL.

¿Cómo se define el punto de entrada y los argumentos con argparse?

  • Punto de entrada en Python con if name == "main".
  • Un argumento obligatorio: filename, el path al archivo con datos “sucios”.
  • Validación básica usando la opción de ayuda antes de ejecutar.
import argparse import logging from urllib.parse import urlparse import pandas as pd logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def main(filename: str): logger.info("iniciando proceso de limpiado") df = read_data(filename) newspaper_uid = extract_newspaper_uid(filename) df = add_newspaper_uid_column(df, newspaper_uid) df = extract_host(df) return df if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("filename", help="el path a los datos sucios", type=str) args = parser.parse_args() df = main(args.filename) print(df)

¿Qué funciones implementan la receta con pandas y urlparse?

  • Lectura del CSV a dataframe con pandas.
  • Extracción del identificador del diario desde el nombre del archivo: la primera parte antes del guion bajo.
  • Creación de la columna "newspaper_uid" en el dataframe.
  • Obtención del host de cada URL con urlparse y lambda.
def read_data(filename: str) -> pd.DataFrame: logger.info("leyendo archivo: %s", filename) return pd.read_csv(filename) def extract_newspaper_uid(filename: str) -> str: logger.info("extrayendo newspaper_uid") newspaper_uid = filename.split("_")[0] logger.info("newspaper_uid detectado: %s", newspaper_uid) return newspaper_uid def add_newspaper_uid_column(df: pd.DataFrame, newspaper_uid: str) -> pd.DataFrame: logger.info("añadiendo columna newspaper_uid con valor: %s", newspaper_uid) df["newspaper_uid"] = newspaper_uid return df def extract_host(df: pd.DataFrame) -> pd.DataFrame: logger.info("extrayendo host de las urls") df["host"] = df["url"].apply(lambda url: urlparse(url).netloc) return df

¿Cómo se ejecuta y qué retorna main?

  • Ejecución desde consola pasando el filename como argumento.
  • El main retorna el dataframe transformado para inspección inmediata en consola.
  • Algunas columnas podrían no mostrarse completas al imprimir, pero están presentes internamente.

¿Qué errores comunes y buenas prácticas se resolvieron?

La depuración mostró fallos típicos de sintaxis y su corrección rápida gracias a mensajes claros.

  • Import correcto de urlparse: from urllib.parse import urlparse. Un ajuste simple evitó fallos de importación.
  • Consistencia en nombres de variables: usar args en vez de arc para acceder a argumentos.
  • Uso de ayuda antes de correr: ejecutar con la opción de ayuda valida la configuración del script.
  • Mensajes de logging: informan cada paso (lectura, extracción, agregado de columnas) y facilitan el seguimiento.
  • Generalización del proceso: el mismo script sirve para El Universal y otros sitios con estructura similar.
  • Diferenciar errores: los de sintaxis se corrigen rápido; los de lógica requieren más atención.

¿Quieres que revisemos tu pipeline o un ajuste en tu script? Deja tus dudas y comparte tu avance en comentarios.