1. Faro

Nivel 4 · Cuenta los pedidos por canal

La solicitud

De Andrew Ramos, Gerente de Marketing

“Tengo el canal de los pedidos de esta mañana como una lista simple. ¿Cuántos llegaron por web, app y marketplace?”

Tu objetivo

Asigna a result un diccionario que asocie cada canal de channels con el número de veces que aparece, por ejemplo {'web': 6, ...}. Cada canal de la lista debe aparecer como clave.

  • 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

    La pregunta más común del análisis

    «¿Cuántos de cada uno?» es la pregunta que responderás con más frecuencia como analista: pedidos por canal, clientes por estado, devoluciones por motivo. En Python puro, un diccionario es la herramienta natural, porque cada categoría se convierte en una clave y su conteo en el valor.

    Contar con get

    El truco está en manejar la primera vez que ves una categoría, cuando su clave aún no existe. .get con un valor por defecto de 0 lo resuelve en una línea:

    counts = {}
    for channel in channels:
        counts[channel] = counts.get(channel, 0) + 1

    Repasa las primeras pasadas:

    1. "web": no está en counts, así que get devuelve 0 y counts["web"] pasa a ser 1.
    2. "app": tampoco está, así que counts["app"] pasa a ser 1.
    3. "web": ya vale 1, así que pasa a ser 2.

    Al final, cada canal distinto es una clave y los valores suman len(channels). Ese último dato es una comprobación rápida que conviene que te hagas costumbre ejecutar:

    sum(counts.values()) == len(channels)   # True

    La versión más larga con un if hace lo mismo y conviene reconocerla cuando leas el código de otras personas:

    if channel in counts:
        counts[channel] += 1
    else:
        counts[channel] = 1

    El atajo: Counter

    La biblioteca estándar de Python tiene un diccionario hecho justo para esto:

    from collections import Counter
    
    Counter(channels)
    # Counter({'web': 6, 'app': 4, 'marketplace': 2})
    Counter(channels).most_common(1)   # [('web', 6)]

    Un Counter se comporta como un diccionario, y es igual a un diccionario normal con los mismos conteos. En el trabajo real usarás Counter o, más probablemente, el value_counts() de pandas, que conocerás en el capítulo 4. Escribir el bucle una vez tú mismo sigue valiendo la pena: es la misma lógica que usan esas herramientas, y a los entrevistadores les gusta pedirlo sin importaciones.

    Contar con condiciones

    Como es un bucle normal, puedes añadir reglas. Cuenta solo los canales que no estén vacíos, o normaliza primero el texto desordenado:

    for channel in raw_channels:
        key = channel.strip().lower()
        if key:
            counts[key] = counts.get(key, 0) + 1

    if key: se salta el texto vacío: un string vacío "" cuenta como falso en una condición, así que los canales en blanco se dejan fuera. Sin el .strip().lower(), "Web", "web " y "web" se contarían como tres canales distintos, un clásico error de calidad de datos que corregirás como es debido en el capítulo de limpieza.

    Errores comunes

    • Escribir counts[channel] += 1 sin un valor por defecto. Falla con KeyError en el primer canal nuevo.
    • Crear counts = {} dentro del bucle, lo que lo borra en cada pasada.
    • Contar con una lista y .count() para cada valor, como channels.count("web"). Funciona con tres canales, pero tienes que conocer las categorías de antemano y recorre la lista de nuevo cada vez.

    La versión en pandas

    Cuando los pedidos están en un DataFrame, todo este bucle se convierte en una línea: orders["channel"].value_counts(). Devuelve los mismos conteos, ordenados de más a menos comunes. Escribir el bucle una vez te muestra exactamente qué hace esa línea por ti.

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