From 0fccdf3ea4f21ba6a5b612517585e1f0014e4cde Mon Sep 17 00:00:00 2001 From: GuaSiMoTO Date: Tue, 19 May 2026 17:12:23 +0200 Subject: [PATCH] LAB terminado --- analisis.py | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++ informe.json | 11 ++++ 2 files changed, 188 insertions(+) create mode 100644 analisis.py create mode 100644 informe.json diff --git a/analisis.py b/analisis.py new file mode 100644 index 0000000..3b6f06b --- /dev/null +++ b/analisis.py @@ -0,0 +1,177 @@ +# Solución del LAB - AI - W1 - D1 - 101 de python + +ventas = [ + { "id": 1, "producto": "Laptop", "precio": 899.99, "cantidad": 2, "categoria": "electronica", "fecha": "2026-01-15" }, + { "id": 2, "producto": "Teclado", "precio": 49.99, "cantidad": 5, "categoria": "electronica", "fecha": "2026-01-16" }, + { "id": 3, "producto": "Silla", "precio": 299.99, "cantidad": 1, "categoria": "muebles", "fecha": "2026-01-16" }, + { "id": 4, "producto": "Monitor", "precio": 349.99, "cantidad": 3, "categoria": "electronica", "fecha": "2026-01-17" }, + { "id": 5, "producto": "Libro Python", "precio": 29.99, "cantidad": 10, "categoria": "libros", "fecha": "2026-01-18" }, + { "id": 6, "producto": "Escritorio", "precio": 499.99, "cantidad": 1, "categoria": "muebles", "fecha": "2026-01-18" }, + { "id": 7, "producto": "Auriculares", "precio": 79.99, "cantidad": 4, "categoria": "electronica", "fecha": "2026-01-19" } +] + +import json +from datetime import datetime + +def cargar_ventas(ruta_archivo): + """Lee el archivo JSON y devuelve la lista de ventas.""" + try: + with open(ruta_archivo, 'r') as archivo: + return json.load(archivo) + except FileNotFoundError: + print(f"Error: El archivo {ruta_archivo} no se encontró.") + return [] + except json.JSONDecodeError: + print(f"Error: El archivo {ruta_archivo} no contiene un JSON válido.") + return [] + + +def calcular_total_venta(venta): + """Devuelve precio * cantidad para una venta.""" + precio = venta.get("precio", 0) + cantidad = venta.get("cantidad", 0) + return precio * cantidad + +def ventas_por_categoria(ventas): + """ + Agrupa las ventas por categoría. + Devuelve un dict: { "categoria": total_euros } + """ + resultado = {} + for venta in ventas: + categoria = venta.get("categoria") # Obtiene la categoría de la venta, o None si no existe + total_venta = calcular_total_venta(venta) # Calcula el total de la venta (precio * cantidad) llamando a la función calcular_total_venta + + if categoria: + # Si la categoría ya existe, suma; si no, la inicializa en 0 y suma + resultado[categoria] = resultado.get(categoria, 0) + total_venta + print("resultado de ventas por categoria", resultado) + return resultado + + + +def producto_mas_vendido(ventas): + """Devuelve el nombre del producto con mayor ingreso total.""" + + if not ventas: # por si llaman a la función con una lista vacía + return None + + ingresos_por_producto = {} + for venta in ventas: + producto = venta.get("producto") # Obtiene el nombre del producto de la venta, o None si no existe + total_venta = calcular_total_venta(venta) # Calcula el total de la venta (precio * cantidad) llamando a la función calcular_total_venta + if producto: # Si el producto existe, suma; si no, lo inicializa en 0 y suma + ingresos_por_producto[producto] = ingresos_por_producto.get(producto, 0) + total_venta + + if not ingresos_por_producto: # Si no hay productos con ingresos + return None + + return max(ingresos_por_producto, key=ingresos_por_producto.get) + +def ventas_en_fecha(ventas, fecha_str): + """Filtra ventas de una fecha específica (formato YYYY-MM-DD).""" + if not ventas: # por si llaman a la función con una lista vacía + return None + + ventas_filtradas = [] + + # Validamos primero que la fecha buscada tenga el formato correcto + try: + # Convertimos la fecha_str a un objeto date para comparaciones posteriores + fecha_buscada = datetime.strptime(fecha_str, "%Y-%m-%d").date() # .date() para quedarnos solo con la parte de la fecha, sin horas + except ValueError: + print("Error: El formato de fecha_str debe ser YYYY-MM-DD") + return [] + + for venta in ventas: + fecha_venta_str = venta.get("fecha") + if fecha_venta_str: + try: + # Extraemos solo la parte de la fecha (por si el JSON incluye horas) + fecha_venta = datetime.strptime(fecha_venta_str[:10], "%Y-%m-%d").date() + if fecha_venta == fecha_buscada: + ventas_filtradas.append(venta) + except ValueError: + # Si un registro tiene una fecha corrupta, lo saltamos + continue + + return ventas_filtradas + +# paso 4: Exportar resultados + +# Añade una función `guardar_informe(informe, ruta)` que guarde el informe en `informe.json`: + +"""json +{ + "generado_en": "2026-05-11T09:30:00", + "total_ventas": 7, + "ingresos_totales": 3089.87, + "por_categoria": { + "electronica": 2599.87, + "muebles": 799.98, + "libros": 299.90 + }, + "producto_top": "Laptop" +} +""" + + +def guardar_informe(informe, ruta): + """Guarda el informe en un archivo JSON.""" + try: + # Añadimos encoding='utf-8' para soportar eñes y acentos + with open(ruta, "w", encoding="utf-8") as archivo: + # ensure_ascii=False guarda los caracteres especiales tal cual + json.dump(informe, archivo, indent=4, ensure_ascii=False) + print(f"Informe guardado en {ruta}") + except IOError as e: + print(f"Error al guardar el informe: {e}") + +if __name__ == "__main__": + + ventas_cargadas = ventas + + print("============================") + print(" INFORME DE VENTAS") + print("============================") + + total_ingresos = sum(calcular_total_venta(venta) for venta in ventas_cargadas) + ingresos_formateados = f"{total_ingresos:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".") + + print(f"Total de ventas: {len(ventas_cargadas)}") + print(f"Ingresos Totales: {ingresos_formateados} €") + + print("\n--- Ventas por categoría ---") + ventas_categoria = ventas_por_categoria(ventas_cargadas) + + for categoria, ingresos in ventas_categoria.items(): + # Formateamos cada subtotal de categoría a euros con comas + ingresos_cat_formateados = f"{ingresos:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".") + print(f"{categoria:<15} {ingresos_cat_formateados:>12} €") + + print("\nProducto más vendido:") + print(producto_mas_vendido(ventas_cargadas)) + + fecha_busqueda = "2026-01-16" + ventas_en_fecha_resultado = ventas_en_fecha(ventas_cargadas, fecha_busqueda) + print(f"\n--- Ventas en la fecha {fecha_busqueda} ---") + for venta in ventas_en_fecha_resultado: + subtotal_v = calcular_total_venta(venta) + subtotal_v_formateado = f"{subtotal_v:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".") + print(f"- {venta['producto']}: {subtotal_v_formateado} €") + + print("\n==========================================") + print("NUEVO: PASO 4 - EXPORTAR RESULTADOS") + print("==========================================") + + # Tu diccionario 'informe' está perfecto porque el JSON requiere + # los números puros (con puntos decimales), no strings formateados. + informe = { + "generado_en": datetime.now().strftime("%Y-%m-%dT%H:%M:%S"), + "total_ventas": len(ventas_cargadas), + "ingresos_totales": round(total_ingresos, 2), + "por_categoria": ventas_categoria, + "producto_top": producto_mas_vendido(ventas_cargadas), + } + + guardar_informe(informe, "informe.json") \ No newline at end of file diff --git a/informe.json b/informe.json new file mode 100644 index 0000000..62e0f2a --- /dev/null +++ b/informe.json @@ -0,0 +1,11 @@ +{ + "generado_en": "2026-05-19T15:56:57", + "total_ventas": 7, + "ingresos_totales": 4519.74, + "por_categoria": { + "electronica": 3419.8599999999997, + "muebles": 799.98, + "libros": 299.9 + }, + "producto_top": "Laptop" +} \ No newline at end of file