93 lines
3.4 KiB
Python
93 lines
3.4 KiB
Python
import pdfplumber
|
|
import re
|
|
import pandas as pd
|
|
import matplotlib.pyplot as plt
|
|
|
|
|
|
archivos = ["enero-2024.pdf", "febrero-2024.pdf", "marzo-2024.pdf","abril-2024.pdf","junio-2024.pdf","julio-2024.pdf","agosto-2024.pdf","septiembre-2024.pdf","octubre-2024.pdf","noviembre-2024.pdf","diciembre-2024.pdf","enero-2025.pdf", "febrero-2025.pdf", "marzo-2025.pdf","abril-2025.pdf","junio-2025.pdf","julio-2025.pdf","agosto-2025.pdf","septiembre-2025.pdf","octubre-2025.pdf","noviembre-2025.pdf","diciembre-2025.pdf"]
|
|
|
|
datos = []
|
|
|
|
for archivo in archivos:
|
|
with pdfplumber.open(archivo) as pdf:
|
|
texto = " ".join([p.extract_text() for p in pdf.pages if p.extract_text()])
|
|
#print(texto)
|
|
|
|
# Patrones
|
|
fecha = re.search(r"Fecha hasta *?(\d{2}-\d{2}-\d{4})", texto)
|
|
consumo = re.search(r"Consumo.*?(\d+)\s*kWh", texto)
|
|
total = re.search(r"VALOR TOTAL.*?\$?([\d,.]+)", texto)
|
|
val_imp = re.search(r"TOTAL SE Y AP \(1\).*?\$?([\d,.]+)", texto)
|
|
val_basura = re.search(r"TOTAL RECOLECCIÓN BASURA \(5\).*?\$?([\d,.]+)", texto)
|
|
|
|
#print(fecha)
|
|
for pagina in pdf.pages:
|
|
tablas = pagina.extract_tables()
|
|
for tabla in tablas:
|
|
df_tabla = pd.DataFrame(tabla[1:], columns=tabla[0])
|
|
|
|
# Buscar la fila específica
|
|
fila = df_tabla[df_tabla.iloc[:,0].str.contains("Energía Facturada", case=False, na=False)]
|
|
if not fila.empty:
|
|
consumo = fila["Consumo Total"].values[0] # nombre exacto de la columna
|
|
datos.append({
|
|
"archivo": archivo,
|
|
"Fecha" : fecha.group(1) if fecha else None,
|
|
"KW Consumidos": consumo,
|
|
"Valor total": float(total.group(1).replace(",", "")) if total else None,
|
|
"Valor SE y AP": float(val_imp.group(1).replace(",", "")) if val_imp else None,
|
|
"Valor Basura" : float(val_basura.group(1).replace(",", "")) if val_basura else None
|
|
})
|
|
|
|
df = pd.DataFrame(datos)
|
|
print(df)
|
|
|
|
# Exportar a CSV
|
|
df.to_csv("consumo.csv", index=False)
|
|
|
|
# Exportar a JSON
|
|
df.to_json("consumo.json", orient="records", indent=4)
|
|
|
|
print("Datos exportados a consumo.csv y consumo.json")
|
|
|
|
# aqui grafica los resultados
|
|
|
|
# Cargar datos
|
|
df = pd.read_csv("consumo.csv")
|
|
|
|
# Convertir fechas
|
|
df["Fecha"] = pd.to_datetime(df["Fecha"], dayfirst=True)
|
|
df["anio"] = df["Fecha"].dt.year
|
|
df["mes"] = df["Fecha"].dt.month
|
|
|
|
# Identificar último año y anterior
|
|
ultimo_anio = df["anio"].max()
|
|
anterior_anio = ultimo_anio - 1
|
|
|
|
# Filtrar datos
|
|
df_ultimo = df[df["anio"] == ultimo_anio]
|
|
df_anterior = df[df["anio"] == anterior_anio]
|
|
|
|
# Graficar comparación
|
|
plt.figure(figsize=(10,6))
|
|
plt.plot(df_anterior["mes"], df_anterior["KW Consumidos"], marker="o", label=f"Año {anterior_anio}", color="red")
|
|
plt.plot(df_ultimo["mes"], df_ultimo["KW Consumidos"], marker="o", label=f"Año {ultimo_anio}", color="blue")
|
|
|
|
|
|
# etiquetas a los valores
|
|
|
|
for x, y in zip(df_anterior["mes"], df_anterior["Valor total"]):
|
|
plt.text(x, y+5, str(y), color="red", ha="center", fontsize=8)
|
|
|
|
for x, y in zip(df_ultimo["mes"], df_ultimo["Valor total"]):
|
|
plt.text(x, y+5, str(y), color="blue", ha="center", fontsize=8)
|
|
|
|
plt.title("Comparación de consumo eléctrico entre dos años")
|
|
plt.xlabel("Mes")
|
|
plt.ylabel("Consumo Total (kWh)")
|
|
plt.xticks(range(1,13))
|
|
plt.legend()
|
|
plt.grid(True)
|
|
plt.tight_layout()
|
|
plt.show()
|