1. Faro

Nivel 5 · Variación semanal por producto

La solicitud

De Thomas Whitaker, Director de Merchandising

“Para la reunión de compras del lunes necesito la variación semanal en unidades de estos cinco productos, como porcentaje. Las luces decorativas se lanzaron justo esta semana, así que la semana pasada no tuvieron ventas.”

Tu objetivo

Define pct_change(old, new) que devuelva (new - old) / old * 100 redondeado a 1 decimal, o None cuando old sea 0. Asigna a result un diccionario que asocie cada nombre de producto de weekly_units con pct_change(last_week, this_week), en el mismo orden.

  • Guarda un dict en resultpendiente

Tu código

Python

Cargando el editor…

    ResultadoPresiona Ejecutar para ver el tuyo

    Mote revisa tu resultado

    Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

    La lección

    El cambio porcentual, la fórmula

    El cambio porcentual compara un valor nuevo con uno anterior, en relación con el anterior:

    (46 - 40) / 40 * 100      # 15.0   Dutch oven: up 15%
    (102 - 120) / 120 * 100   # -15.0  pillow: down 15%
    (41 - 32) / 32 * 100      # 28.125 vase: up 28.1% after rounding

    El valor anterior es siempre el denominador. Eso es lo que hace que «sube un 15%» signifique «un 15% más que la semana pasada». Si divides entre el valor nuevo obtienes otro número, erróneo: el cojín mostraría -17.6%.

    Una cláusula de guarda para el caso cero

    Las luces decorativas no vendieron nada la semana pasada. (9 - 0) / 0 lanza ZeroDivisionError, e incluso si no lo hiciera, no hay un crecimiento porcentual con sentido a partir de cero. La respuesta honesta es «no definido», que en Python es None.

    def pct_change(old, new):
        if old == 0:
            return None
        return round((new - old) / old * 100, 1)

    El primer if es una cláusula de guarda: maneja el caso especial y sale pronto de la función con return. El cálculo principal que viene después nunca tiene que preocuparse por un cero. Escribir primero el caso especial mantiene las funciones planas y legibles, sin un else envolviendo la lógica principal.

    Devolver None en lugar de 0 importa. Cero por ciento significa «igual que la semana pasada», que es lo que hizo la lámpara de escritorio (15 unidades ambas semanas). Las luces decorativas hicieron algo muy distinto, y el informe debería mostrarlo como un hueco, no como «sin cambio».

    Aplicar la función a cada fila

    Con la función escrita una sola vez, el bucle solo desempaqueta cada tupla y guarda la respuesta:

    result = {}
    for name, last_week, this_week in weekly_units:
        result[name] = pct_change(last_week, this_week)

    Los diccionarios conservan el orden en que se añadieron las claves, así que el resultado lista los productos en el mismo orden que la entrada. Como la lógica vive en una sola función, el informe de la semana que viene (o una versión interanual) la reutiliza sin cambios, y una corrección del caso cero solo tiene que hacerse una vez.

    Errores comunes

    • Dividir entre el valor nuevo en lugar del anterior.
    • Devolver 0 o 100 para una base cero. Ambos parecen números reales en un informe y ambos son erróneos.
    • Redondear antes de multiplicar por 100: round((new - old) / old, 1) * 100 convierte 28.125% en 30.0%.
    • Olvidar return. Una función sin él devuelve None para cada producto.

    Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.