← Blog

Analizar cinco años de compras de tecnología con Python

Python / pandas / matplotlib

En la empresa teníamos un CSV con todas las compras de tecnología de los últimos cinco años: ordenadores, monitores, periféricos, tablets… Cada fila era una compra, con su fecha, el tipo de artículo, la cantidad y el precio unitario. Eran miles de filas.

La pregunta era sencilla: ¿cuánto gastamos cada año en cada tipo de artículo y hacia dónde va la tendencia? Con Excel se puede responder a base de tablas dinámicas, pero cada vez que llegaban datos nuevos había que rehacerlas. Así que escribí un script en Python que lo hace solo.

Los datos reales son de la empresa y no puedo publicarlos. El código es el mismo, pero los números y los gráficos de este post son de ejemplo.

Qué hace el script

  1. Lee el CSV con pandas.
  2. Calcula el gasto de cada compra (cantidad × precio).
  3. Suma el gasto por año y por tipo de artículo.
  4. Dibuja con matplotlib un gráfico de líneas por artículo y lo guarda como imagen.

Los datos de entrada

El archivo techpurchases.csv tiene esta forma:

fecha,articulo,cantidad,precio
2018-03-12,Portátiles,20,950
2018-07-02,Monitores,30,180
2019-01-15,Portátiles,12,980

El código

# analizar_compras.py - gasto anual por tipo de artículo y un gráfico por artículo
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('techpurchases.csv', parse_dates=['fecha'])
df['gasto'] = df['cantidad'] * df['precio']
df['año'] = df['fecha'].dt.year

gasto = df.pivot_table(index='año', columns='articulo', values='gasto', aggfunc='sum', fill_value=0)
print(gasto)

for articulo in gasto.columns:
    ax = gasto[articulo].plot(marker='o', title=articulo)
    ax.set_xlabel('Año')
    ax.set_ylabel('Gasto (€)')
    ax.set_xticks(gasto.index)
    plt.savefig(f'{articulo}_gasto.png', bbox_inches='tight')
    plt.close()

Las piezas clave:

  • parse_dates=['fecha'] convierte la columna de texto en fechas de verdad, y así dt.year puede sacar el año.
  • pivot_table hace lo mismo que una tabla dinámica de Excel: años en las filas, artículos en las columnas y la suma del gasto en cada celda. fill_value=0 pone un cero donde un año no tuvo compras de ese artículo.
  • El bucle dibuja una línea por artículo y guarda cada gráfico en su propio PNG. El plt.close() evita que las líneas de un artículo se mezclen con las del siguiente.

El resultado

Estos son tres de los gráficos, con los datos de ejemplo:

Gráfico de líneas del gasto anual en ordenadores de sobremesa entre 2018 y 2023

Gráfico de líneas del gasto anual en portátiles entre 2018 y 2023

Gráfico de líneas del gasto anual en monitores entre 2018 y 2023

Con los datos reales, lo útil no fue el gráfico en sí, sino poder regenerarlo en segundos cada vez que llegaba una exportación nueva, en vez de rehacer las tablas a mano.

Cómo lo ampliaría

  • Validar el archivo antes de analizarlo: avisar de filas vacías, precios negativos o fechas mal escritas, en vez de dejar que el script falle a medias.
  • Comparar categorías en un solo gráfico, por ejemplo portátiles frente a sobremesa, para ver si una sustituye a la otra.
  • Juntar varios CSV, uno por año o por departamento, con pd.concat.
  • Exportar la tabla resumen a Excel con gasto.to_excel() para quien no use Python.