1. Faro

Nivel 8 · Dos semanas antes del Black Friday con NumPy

La solicitud

De Megan Collins, Directora de Ventas

“Tengo los pedidos y los ingresos diarios del 17 al 30 de noviembre en dos listas. Necesito el valor promedio de pedido por día, cuántos pedidos entraron en la segunda semana, cómo se compara cada día de la semana dos con el mismo día de la semana uno, y los conteos de pedidos de nuestros días de mucho movimiento, de más de 40.”

Tu objetivo

Convierte las listas en arrays de NumPy. Asigna a result un diccionario con las claves 'aov' (ingresos / pedidos de cada día, redondeado a 2, como una lista de 14 floats), 'week2_orders' (suma de pedidos de los últimos 7 días, un int), 'vs_last_week' (pedidos de los días 8–14 menos pedidos de los días 1–7, día a día, como una lista de 7 ints) y 'busy_days' (los conteos de pedidos mayores que 40, en orden de fecha, como una lista).

  • 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

    Los arrays hacen las cuentas elemento a elemento

    NumPy es la biblioteca de cálculo numérico que hay debajo de pandas, ya cargada aquí como np. Su objeto central es el array: una lista de valores de un mismo tipo que admite operaciones matemáticas sobre todos a la vez.

    o = np.array([23, 24, 17, 22, 22, 18, 26, 20, 22, 15, 24, 56, 51, 58])
    r = np.array([10937, 16395, 9826, ...])
    
    r / o        # 14 averages: 475.52, 683.12, 578.0, ...
    o * 2        # every count doubled
    o + 5        # every count plus 5

    Las operaciones entre dos arrays de la misma longitud emparejan los valores por posición. Por eso r / o da un valor promedio de pedido por día sin un bucle. Las listas simples se comportan distinto: orders * 2 repite la lista, y revenue / orders es un TypeError.

    Los promedios cuentan su propia historia. El Black Friday (28 de noviembre, el 12.º valor) tuvo la mayor cantidad de pedidos pero un promedio de solo $306.59, por debajo de la mayoría de los días normales. Casi la mitad de los pedidos de ese día usó el cupón del 25% de Black Friday, lo que baja el valor de la canasta.

    Cortar una semana

    Los arrays se cortan como las listas. Las posiciones empiezan en 0, y el final de un slice se excluye:

    o[:7]           # days 1-7, the week of November 17
    o[7:]           # days 8-14, the week of November 24
    o[7:].sum()     # 246
    o[7:] - o[:7]   # [-3, -2, -2, 2, 34, 33, 32]

    Como ambos slices tienen 7 valores, restarlos compara el lunes con el lunes, el martes con el martes, y así sucesivamente. .sum() devuelve un entero de NumPy; int(...) lo convierte en un int normal de Python.

    Indexación booleana

    Una comparación sobre un array da un array de True y False, uno por valor:

    o > 40          # [False, False, ..., True, True, True]
    o[o > 40]       # [56, 51, 58]

    Poner ese array de True/False dentro de los corchetes conserva solo los valores donde es True. Esto se llama indexación booleana, y es exactamente como funciona el filtrado de un DataFrame. Las condiciones se pueden combinar con & (y) y | (o), cada una entre paréntesis: o[(o > 20) & (o < 30)] conserva los días normales con movimiento y descarta tanto los tranquilos como el pico del Black Friday. El resultado es siempre un array nuevo y más corto; el o original conserva sus 14 valores.

    Errores comunes

    • Hacer aritmética con las listas en lugar de con arrays.
    • Cortar o[8:] para la segunda semana, lo que se salta su lunes. La posición 7 es el 8.º día.
    • Escribir o > 40 y esperar recibir los valores; obtienes True/False. Ponlo dentro de o[...].
    • Devolver arrays donde se piden listas. .tolist() los convierte.

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