Analizar cinco años de compras de tecnología con Python
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
- Lee el CSV con pandas.
- Calcula el gasto de cada compra (cantidad × precio).
- Suma el gasto por año y por tipo de artículo.
- 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.yearpuede sacar el año.pivot_tablehace 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=0pone 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:



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.