Proyecto: analizar ventas desde un CSV con Python

Lee un archivo CSV, súmalo, agrúpalo por categoría y encuentra el producto más vendido. Con un analizador interactivo para probarlo con tus propios datos.

Qué vas a construir

Un script que abre un CSV de ventas y responde preguntas: ¿cuánto se ha facturado?, ¿qué categoría vende más?, ¿cuál es el producto estrella? Es el proyecto ideal para practicar ficheros, bucles y diccionarios.

El CSV de ejemplo tiene columnas fecha, producto, categoria, unidades, precio. Edítalo si quieres y pulsa un botón:

Paso 1: leer el CSV

El módulo csv viene con Python. DictReader convierte cada fila en un diccionario usando la cabecera como claves.

import csv

with open("ventas.csv", encoding="utf-8") as f:
    filas = list(csv.DictReader(f))

print(f"Se han leído {len(filas)} filas")
print(filas[0])   # {'fecha': '2024-01-03', 'producto': 'Teclado', ...}

Paso 2: el total de ventas

Cada fila factura unidades × precio. Sumamos todas con una expresión generadora.

total = sum(
    int(fila["unidades"]) * float(fila["precio"])
    for fila in filas
)
print(f"Total facturado: {total:.2f} €")

Paso 3: agrupar por categoría con un diccionario

Un diccionario categoria → importe acumulado. dict.get(clave, 0) evita el error cuando la categoría aún no existe.

por_categoria = {}
for fila in filas:
    cat = fila["categoria"]
    importe = int(fila["unidades"]) * float(fila["precio"])
    por_categoria[cat] = por_categoria.get(cat, 0) + importe

for cat, importe in sorted(por_categoria.items(), key=lambda x: -x[1]):
    print(f"{cat:15} {importe:8.2f} €")

Paso 4: el producto más vendido

Otro diccionario, esta vez producto → unidades. max() con key devuelve la clave con el valor más alto.

unidades_por_producto = {}
for fila in filas:
    p = fila["producto"]
    unidades_por_producto[p] = unidades_por_producto.get(p, 0) + int(fila["unidades"])

estrella = max(unidades_por_producto, key=unidades_por_producto.get)
print(f"Más vendido: {estrella} ({unidades_por_producto[estrella]} uds)")

Cómo seguir

  • Usar collections.Counter y defaultdict para acortar el código de agrupar.
  • Filtrar por mes con fila["fecha"].startswith("2024-01").
  • Escribir un CSV de resumen con csv.writer.
  • Dar el salto a pandas: df.groupby("categoria")["importe"].sum() hace lo mismo en una línea.