Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
177 changes: 177 additions & 0 deletions analisis.py
Original file line number Diff line number Diff line change
@@ -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")
11 changes: 11 additions & 0 deletions informe.json
Original file line number Diff line number Diff line change
@@ -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"
}