1. Faro

Nivel 3 · Etiqueta los pedidos por tamaño

La solicitud

De Megan Collins, Directora de Ventas

“Quiero ver cómo se reparten nuestros pedidos por tamaño. Llama pequeño a todo lo que esté por debajo de $50, mediano de $50 hasta menos de $150, y grande a partir de $150. ¿Puedes etiquetar este lote?”

Tu objetivo

Define size_band(total) que devuelva 'small' para totales menores que 50, 'medium' desde 50 hasta 150 sin incluirlo, y 'large' para 150 o más. Asigna a result una lista con el rango de cada valor de order_totals, en el mismo orden.

  • Guarda una lista de 7 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

    Las reglas pertenecen a las funciones

    Los rangos, niveles y etiquetas están por todas partes en los datos de negocio: tamaño de pedido, nivel de valor del cliente, velocidad de entrega, grupos de edad. La regla en sí es sencilla, pero se usa en muchos sitios: un informe, un gráfico, un segmento de correo. Ponla en una función y todos los lugares usan los mismos límites.

    def size_band(total):
        if total < 50:
            return "small"
        elif total < 150:
            return "medium"
        else:
            return "large"

    Como return termina la función, gana la primera rama verdadera. Eso simplifica cada condición: cuando Python comprueba total < 150, ya sabe que el total no es menor que 50.

    Aplicarla a muchos valores

    Una función que funciona con un valor se puede aplicar a una lista entera con una comprehension:

    bands = [size_band(t) for t in order_totals]

    También puedes pasar la propia función, sin paréntesis, a map:

    list(map(size_band, order_totals))

    Ambas dan la misma lista. La comprehension es más común en el Python moderno porque se lee de forma más natural y es fácil de ampliar, por ejemplo [size_band(t) for t in order_totals if t > 0].

    Pasar una función por su nombre, sin llamarla, es una idea importante. size_band es la función; size_band(62.40) es su resultado. Los métodos de pandas como .map() y .apply() reciben la propia función y la llaman por ti con cada valor.

    Los límites, otra vez

    Los valores de borde de este lote son deliberados: 49.99, 50.00, 149.99 y 150.00. Ejecuta tu función exactamente con ellos y compáralos con el encargo:

    total rango
    49.99 small
    50.00 medium
    149.99 medium
    150.00 large

    Si 150.00 salió como medium, la segunda comprobación usó <= en lugar de <. Probar valores justo en el límite es la forma más rápida de encontrar ese tipo de error.

    Mantén las funciones puras

    size_band solo mira su entrada y devuelve un valor. No imprime, no cambia variables globales ni modifica la lista. Las funciones así, llamadas funciones puras, son fáciles de probar y seguras de reutilizar. Cuando una función necesita leer algún ajuste, pásalo como parámetro en lugar de buscar una variable definida en otro sitio:

    def size_band(total, small_limit=50, large_limit=150):
        ...

    Errores comunes

    • Olvidar return en una rama, de modo que algunos valores vuelven como None.
    • Ordenar las comprobaciones de mayor a menor pero mantener comparaciones con <, lo que manda todo al primer rango.
    • Escribir map(size_band(), order_totals) con paréntesis. Eso llama a la función sin argumento y falla.

    En una columna entera

    Si los totales están en una columna de un DataFrame, la misma función sirve ahí: df["order_total"].map(size_band) devuelve un rango para cada fila. Para rangos numéricos, pd.cut lo hace sin escribir una función:

    pd.cut(df["order_total"], bins=[0, 50, 150, float("inf")],
           labels=["small", "medium", "large"], right=False)

    right=False hace que cada rango incluya su límite inferior y excluya el superior, así que 50.00 es medium y 150.00 es large, igual que en size_band.

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