7 - Validación, Limpieza y CSV con Bases de Datos

Trabajar con datos CSV a menudo implica lidiar con imperfecciones. La validación y limpieza son pasos cruciales para asegurar la calidad de los datos antes de su análisis o importación a sistemas.

Validación y limpieza de CSV

Los datos en archivos CSV rara vez son perfectos. Pueden contener errores de entrada, inconsistencias, duplicados o formatos incorrectos. La limpieza de datos es el proceso de corregir o eliminar estos errores.

Detectar y corregir errores comunes

  • Valores faltantes: Identificar celdas vacías o con marcadores de nulo (NA, NULL). Se pueden rellenar con un valor por defecto, la media/mediana, o eliminar la fila/columna.
    import pandas as pd
    
    df = pd.read_csv('datos_sucios.csv')
    print("Valores nulos antes:\n", df.isnull().sum())
    
    # Rellenar nulos en la columna 'Edad' con la media
    df['Edad'].fillna(df['Edad'].mean(), inplace=True)
    
    # Eliminar filas con cualquier valor nulo
    df.dropna(inplace=True)
    print("Valores nulos después:\n", df.isnull().sum())
  • Tipos de datos incorrectos: Asegurarse de que las columnas numéricas sean números, las fechas sean fechas, etc. A menudo, los números pueden venir como cadenas con caracteres no numéricos.
    # Convertir columna a tipo numérico, forzando errores a NaN
    df['Precio'] = pd.to_numeric(df['Precio'], errors='coerce')
    # Eliminar filas donde la conversión falló
    df.dropna(subset=['Precio'], inplace=True)
  • Espacios en blanco extra: Eliminar espacios al inicio o final de las cadenas.
    df['Nombre'] = df['Nombre'].str.strip()

Verificar consistencia de columnas

Asegurarse de que los valores en una columna sigan un patrón o un conjunto de valores permitidos.

  • Valores únicos/categorías: Verificar que una columna categórica solo contenga los valores esperados.
    print("Categorías únicas:\n", df['Categoría'].unique())
    # Corregir inconsistencias (ej. 'Electronica' y 'electrónica')
    df['Categoría'] = df['Categoría'].replace({'Electronica': 'Electrónica'})
  • Rangos de valores: Para columnas numéricas, verificar que los valores estén dentro de un rango lógico (ej. edad > 0 y < 120).

Eliminar duplicados

Los registros duplicados pueden sesgar los análisis. Es importante identificarlos y decidir si eliminarlos o no.

print("Filas duplicadas antes:\n", df.duplicated().sum())
# Eliminar filas completamente duplicadas
df.drop_duplicates(inplace=True)

# Eliminar duplicados basándose en un subconjunto de columnas (ej. ID de producto)
df.drop_duplicates(subset=['ID'], inplace=True)

Normalización de datos

Transformar los datos a un formato estándar. Esto puede incluir:

  • Convertir texto a minúsculas o mayúsculas.
  • Estandarizar formatos de fecha.
  • Escalar valores numéricos (ej. a un rango de 0 a 1).

CSV y bases de datos

Los archivos CSV son un formato muy común para interactuar con bases de datos, tanto para importar datos existentes como para exportar resultados de consultas.

Importar CSV a MySQL, PostgreSQL y SQLite

La mayoría de los sistemas de bases de datos relacionales tienen comandos o herramientas para importar datos desde archivos CSV.

  • MySQL: Utiliza el comando LOAD DATA INFILE.
    LOAD DATA INFILE '/path/to/data.csv'
    INTO TABLE my_table
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 ROWS; -- Para ignorar la fila de encabezado
  • PostgreSQL: Utiliza el comando COPY.
    COPY my_table FROM '/path/to/data.csv' WITH (FORMAT CSV, HEADER TRUE);
  • SQLite: Desde la línea de comandos, puedes usar .import.
    .mode csv
    .import /path/to/data.csv my_table
  • Python con Pandas: Puedes leer el CSV con pandas y luego usar to_sql() para insertarlo en una base de datos (requiere una librería de conexión a la DB, ej. sqlalchemy y psycopg2 para PostgreSQL).
    from sqlalchemy import create_engine
    
    # Conexión a PostgreSQL (ejemplo)
    engine = create_engine('postgresql://user:password@host:port/database')
    
    df = pd.read_csv('datos.csv')
    
    # Escribir el DataFrame a una tabla en la base de datos
    df.to_sql('nombre_tabla', engine, if_exists='replace', index=False)

Exportar tablas a CSV

De manera similar, puedes exportar datos de una tabla o el resultado de una consulta a un archivo CSV.

  • MySQL: SELECT ... INTO OUTFILE (ya visto en Tema 4).
  • PostgreSQL: COPY ... TO (ya visto en Tema 4).
  • SQLite: Usando el modo CSV en la CLI (ya visto en Tema 4).
  • Python con Pandas: Leer desde la base de datos y luego usar to_csv().
    # Leer datos de una tabla de base de datos a un DataFrame
    df_db = pd.read_sql('SELECT * FROM nombre_tabla', engine)
    
    # Guardar el DataFrame a CSV
    df_db.to_csv('export_db.csv', index=False, encoding='utf-8')

Uso en ETL (Extract, Transform, Load)

Los archivos CSV juegan un papel fundamental en los procesos ETL:

  • Extract (Extracción): Los datos se extraen de diversas fuentes (bases de datos, APIs, sistemas legados) y a menudo se guardan temporalmente como CSV debido a su simplicidad y universalidad.
  • Transform (Transformación): Los datos CSV se cargan en herramientas o scripts (como Python con pandas) donde se limpian, validan, normalizan, agregan y transforman según las necesidades del negocio.
  • Load (Carga): Los datos transformados se cargan finalmente en un sistema de destino, que puede ser un data warehouse, una base de datos analítica o una aplicación, a menudo utilizando los mismos mecanismos de importación de CSV.

La simplicidad y el formato de texto plano de CSV lo hacen un formato de intercambio ideal en muchas etapas de un pipeline ETL.