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:
- ¿Qué diferencias notaste en la sintaxis entre Pandas y SQL?
- ¿Cuál de las dos opciones te resulta más intuitiva para cada consulta?
- ¿En qué casos crees que es mejor usar Pandas en lugar de SQL y viceversa?
- ¿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.