import re import pandas as pd import os from datetime import datetime from PyPDF2 import PdfReader from collections import defaultdict # 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 (puedes hacer un diccionario de equivalencias si quieres afinar más) 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"), 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") print("\n✅ Análisis completado. Archivos generados:") print("- detalle_productos.csv") print("- resumen_productos.csv") print("- gasto_mensual.csv")