autocompra/autocompra.py

73 lines
2.4 KiB
Python

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")