Nivel: Intermedio
Tema: Archivos, CSV, parsing, conversión de tipos, agregaciones, validación de entradas, tests con pytest
Objetivo: Leer un archivo CSV usando solo la librería estándar y calcular métricas básicas (conteo, suma y promedio) de una columna numérica, ignorando filas inválidas.
Enunciado
Crea una función llamada metricas_csv(ruta_csv, columna) que:
- Reciba:
ruta_csv: ruta (string) a un archivo CSV con cabeceracolumna: nombre (string) de una columna numérica
- Si
ruta_csvesNoneocolumnaesNone, lanceTypeError. - Si
ruta_csvocolumnano sonstr, lanceTypeError. - Si el archivo no existe, lance
FileNotFoundError. - Lea el CSV y calcule métricas para la columna indicada:
count: número de filas válidas (con valor numérico convertible)sum: suma de los valores válidosavg: promedio (sicountes 0,avgdebe ser 0)
- Debe ignorar filas donde:
- falte la columna,
- el valor esté vacío,
- el valor no se pueda convertir a
float.
Debe devolver un diccionario con esta forma:
{"count": int, "sum": float, "avg": float}
CSV de ejemplo
ventas.csv
producto,importe
A,10
B,20.5
C,abc
D,
E,5
metricas_csv("ventas.csv", "importe") debería devolver:
{"count": 3, "sum": 35.5, "avg": 11.833333333333334}
Pistas
- Usa
csv.DictReaderpara leer filas como diccionarios. - Convierte a número con
float(valor). - Maneja conversiones fallidas con
try/except ValueError. - Asegura casos borde: archivo vacío, columna inexistente,
count == 0.
Solución explicada (paso a paso)
- Validamos tipos (
ruta_csvycolumnadeben serstr). - Abrimos el archivo en modo texto con
newline="". - Usamos
csv.DictReaderpara obtener cada fila como diccionario. - Para cada fila:
- obtenemos el valor de la columna,
- verificamos que exista y no esté vacío,
- intentamos convertirlo a
float, - si se puede, lo acumulamos en suma y aumentamos
count.
- Calculamos promedio:
- si
countes 0 →avg = 0 - si no →
avg = total / count
- si
- Devolvemos el diccionario con métricas.
Ejecuta:
pytest -q
Variantes para subir de nivel (opcional)
- Devolver también min/max de la columna
- Permitir separador configurable (
,vs;) - Soportar decimales con coma (locale)
- Calcular métricas por grupo (por ejemplo, por
productoocategoria) - Validar que el CSV tenga cabecera (y manejar caso contrario)
Lo que aprendiste
- Lectura de CSV con
csv.DictReader - Manejo de datos “sucios” y filas inválidas
- Agregaciones básicas (conteo, suma, promedio)
- Tests con archivos temporales (
tmp_path)
Accede al código completo y a los tests en GitHub para ejecutar y modificar la solución localmente.
Continúa con Reto #16 — Merge de dos listas ordenadas para practicar lógica de “dos punteros”, muy útil en algoritmos y rendimiento.