Ejercicio 24: Comparación de Operaciones en Pandas y SQL

El objetivo de este ejercicio es comparar el uso de Pandas y SQL para realizar operaciones comunes en bases de datos, ejecutando cada consulta en dos formatos: usando Pandas sobre un DataFrame y ejecutando SQL sobre una base SQLite dentro del mismo notebook.

Objetivos

  • Comparar la sintaxis y el rendimiento de operaciones comunes en Pandas y SQL.
  • Desarrollar habilidades para decidir cuándo utilizar Pandas o SQL en función de la tarea.

Requerimientos Previos

Antes de comenzar, asegúrese de instalar las siguientes dependencias:

pip install pandas sqlite3 ipython-sql sqlalchemy

En la primera celda del notebook, active la extensión SQL para Jupyter:

%load_ext sql

Conecte una base de datos SQLite en memoria:

import sqlite3
import pandas as pd

conn = sqlite3.connect(":memory:")  # Base de datos en memoria

Estructura del Ejercicio

Los estudiantes trabajarán con un dataset de empleados y departamentos. Se realizarán consultas equivalentes en Pandas y SQL.

1. Cargar Datos en Pandas y en SQLite

  • Se genera un dataset en Pandas.
  • Se crea una tabla en SQLite con la misma información.
# Crear DataFrames de ejemplo
empleados = pd.DataFrame({
    "id": [1, 2, 3, 4, 5],
    "nombre": ["Ana", "Luis", "Carlos", "Sofía", "Marta"],
    "edad": [28, 34, 25, 45, 38],
    "salario": [3000, 4500, 2800, 5200, 4100],
    "departamento": ["IT", "Ventas", "IT", "RRHH", "Ventas"]
})

departamentos = pd.DataFrame({
    "id": [1, 2, 3],
    "nombre": ["IT", "Ventas", "RRHH"],
    "ciudad": ["Buenos Aires", "Córdoba", "Rosario"]
})

# Guardar en SQLite
empleados.to_sql("empleados", conn, index=False, if_exists="replace")
departamentos.to_sql("departamentos", conn, index=False, if_exists="replace")

2. Consultas en Pandas vs SQL

Los estudiantes replicarán las siguientes consultas en Pandas y SQL, observando diferencias de sintaxis y rendimiento.

a) Seleccionar todas las columnas de la tabla empleados

En Pandas:

empleados

En SQL:

%%sql
SELECT * FROM empleados;

b) Filtrar empleados con salario mayor a $4000

En Pandas:

empleados[empleados["salario"] > 4000]

En SQL:

%%sql
SELECT * FROM empleados WHERE salario > 4000;

c) Contar empleados por departamento

En Pandas:

empleados["departamento"].value_counts()

En SQL:

%%sql
SELECT departamento, COUNT(*) as cantidad FROM empleados GROUP BY departamento;

d) Promedio de salario por departamento

En Pandas:

empleados.groupby("departamento")["salario"].mean()

En SQL:

%%sql
SELECT departamento, AVG(salario) FROM empleados GROUP BY departamento;

e) Unir empleados con departamentos (JOIN)

En Pandas:

empleados.merge(departamentos, left_on="departamento", right_on="nombre", how="left")

En SQL:

%%sql
SELECT e.*, d.ciudad 
FROM empleados e
LEFT JOIN departamentos d 
ON e.departamento = d.nombre;

Reflexión Final

Preguntas de análisis:

  1. ¿Qué diferencias notaste en la sintaxis entre Pandas y SQL?
  2. ¿Cuál de las dos opciones te resulta más intuitiva para cada consulta?
  3. ¿En qué casos crees que es mejor usar Pandas en lugar de SQL y viceversa?
  4. ¿Cómo afecta la escalabilidad cuando trabajamos con grandes volúmenes de datos?

Entrega esperada

Un notebook (.ipynb) que contenga:

  • La carga de datos en Pandas y SQLite.
  • Cada consulta replicada en Pandas y SQL.
  • Reflexiones sobre las diferencias entre ambas herramientas.