autocompra/autocompra2.py

100 lines
3.4 KiB
Python

import re
import pandas as pd
import os
from datetime import datetime
from PyPDF2 import PdfReader
from collections import defaultdict
import matplotlib.pyplot as plt
import seaborn as sns
# Carpeta con tus tickets PDF
ticket_folder = "tickets"
def extract_data_from_pdf(file_path):
reader = PdfReader(file_path)
text = ""
for page in reader.pages:
text += page.extract_text() + "\n"
date_match = re.search(r"(\d{2}/\d{2}/\d{4})", text)
fecha = datetime.strptime(date_match.group(1), "%d/%m/%Y") if date_match else None
products = []
for line in text.splitlines():
match = re.match(r"\d*\s?(.*?)\s+(\d+,\d{2})\s+(\d+,\d{2})", line)
if match:
nombre = match.group(1).strip().upper()
unit_price = float(match.group(2).replace(",", "."))
total_price = float(match.group(3).replace(",", "."))
products.append((fecha, nombre, unit_price, total_price))
else:
match_simple = re.match(r"(.*?)\s+(\d+,\d{2})$", line)
if match_simple:
nombre = match_simple.group(1).strip().upper()
total_price = float(match_simple.group(2).replace(",", "."))
products.append((fecha, nombre, None, total_price))
return products
# Recolectar todos los productos de todos los tickets
datos = []
for file in os.listdir(ticket_folder):
if file.endswith(".pdf"):
path = os.path.join(ticket_folder, file)
datos.extend(extract_data_from_pdf(path))
# Crear DataFrame
columnas = ["fecha", "producto", "precio_unitario", "precio_total"]
df = pd.DataFrame(datos, columns=columnas)
df.dropna(subset=["fecha"], inplace=True)
# Normalizar nombres de producto
df["producto"] = df["producto"].str.upper().str.strip()
# Guardar detalle completo
df.to_csv("detalle_productos.csv", index=False)
# Agrupar por producto
resumen = df.groupby("producto").agg(
veces_comprado=("fecha", "count"),
gasto_total=("precio_total", "sum"),
gasto_promedio=("precio_total", "mean"),
primera_vez=("fecha", "min"),
ultima_vez=("fecha", "max")
).sort_values("gasto_total", ascending=False)
resumen.to_csv("resumen_productos.csv")
# Gasto mensual
df["mes"] = df["fecha"].dt.to_period("M")
gasto_mensual = df.groupby("mes")["precio_total"].sum()
gasto_mensual.to_csv("gasto_mensual.csv")
# Graficar precios por producto a lo largo del tiempo
plt.figure(figsize=(10, 6))
for producto in df["producto"].unique():
producto_df = df[df["producto"] == producto]
plt.plot(producto_df["fecha"], producto_df["precio_total"], label=producto)
plt.title("Evolución de los precios de los productos a lo largo del tiempo")
plt.xlabel("Fecha")
plt.ylabel("Precio Total")
plt.legend()
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig("grafico_precios_productos.png")
plt.show()
# Crear una lista de la compra: productos más comprados en el último mes
ultimo_mes = df["fecha"].max().replace(day=1) # Primer día del mes actual
productos_ultimo_mes = df[df["fecha"] >= ultimo_mes].groupby("producto").agg(
cantidad_comprada=("producto", "count"),
gasto_total=("precio_total", "sum")
).sort_values("gasto_total", ascending=False)
productos_ultimo_mes.to_csv("lista_compra_ultimo_mes.csv")
print("\n✅ Análisis completado. Archivos generados:")
print("- detalle_productos.csv")
print("- resumen_productos.csv")
print("- gasto_mensual.csv")
print("- grafico_precios_productos.png")
print("- lista_compra_ultimo_mes.csv")