La solicitud

De Laura Bennett, Directora de Finanzas
Tu objetivo
Toma las líneas de pedido con quantity > 0 de pedidos con status 'completed' hechos en 2025, y calcula el valor de cada pedido (la suma de quantity * unit_price * (1 - discount_pct / 100)). Dibuja un histograma con bins cada $100 de 0 a 2,000. Asigna a result un DataFrame con los mismos recuentos: columnas bin_start (0, 100, …, 1900) y n_orders (pedidos cuyo valor está en [bin_start, bin_start + 100); el último bin incluye también exactamente 2,000), 20 filas en orden de bin, índice de 0 a 19. Los pedidos por encima de $2,000 se dejan fuera.
- Usa el DataFrame
orderspendiente - Usa el DataFrame
order_itemspendiente - Muestra exactamente
bin_startn_orderspendiente
Tu código
Cargando el editor…
Solución de referencia
| order_id | customer_id | order_date | status | channel |
|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Laura, y por qué
DataFrames
Cargados como DataFrames de pandas, junto con pd y np.
orders12,000 filas · 7 columnas
order_idintegercustomer_idintegerorder_datetimestampstatusvarcharchannelvarcharshipping_feedecimalcoupon_codevarchar
| order_id | customer_id | order_date | status | channel | shipping_fee | coupon_code |
|---|---|---|---|---|---|---|
| 1001 | 125 | 2023-01-01 20:51:19 | completed | web | 0.00 | NaN |
| 1002 | 156 | 2023-01-02 07:58:46 | completed | web | 0.00 | NaN |
| 1003 | 22 | 2023-01-02 10:25:27 | completed | marketplace | 4.99 | WELCOME10 |
| 1004 | 48 | 2023-01-02 11:21:51 | completed | marketplace | 4.99 | WELCOME10 |
| 1005 | 82 | 2023-01-02 11:43:36 | completed | web | 0.00 | WELCOME10 |
order_items30,338 filas · 6 columnas
order_item_idintegerorder_idintegerproduct_idintegerquantityintegerunit_pricedecimaldiscount_pctdecimal
| order_item_id | order_id | product_id | quantity | unit_price | discount_pct |
|---|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 | 0.00 |
| 2 | 1001 | 154 | 3 | 11.99 | 0.00 |
| 3 | 1002 | 154 | 4 | 11.99 | 0.00 |
| 4 | 1002 | 194 | 1 | 149.00 | 0.00 |
| 5 | 1002 | 193 | 2 | 19.99 | 0.00 |
customers2,018 filas · 9 columnas
customer_idintegerfirst_namevarcharlast_namevarcharemailvarcharcityvarcharstatevarcharsignup_datedatesegmentvarcharreferral_sourcevarchar
| customer_id | first_name | last_name | city | state | signup_date | segment | referral_source | |
|---|---|---|---|---|---|---|---|---|
| 1 | Owen | Hudson | owen.hudson@icloud.com | San Francisco | CA | 2022-06-02 | consumer | search |
| 2 | Douglas | Mendoza | dmendoza69@gmail.com | Atlanta | GA | 2022-06-02 | consumer | NaN |
| 3 | Henry | Brooks | hbrooks@lakesidecafe.com | Los Angeles | CA | 2022-06-04 | business | NaN |
| 4 | Brian | Graham | bgraham@bluecedarhomes.com | Seattle | WA | 2022-06-06 | business | |
| 5 | Kyle | Jimenez | kjimenez27@yahoo.com | Indianapolis | IN | 2022-06-07 | consumer | NaN |
products120 filas · 8 columnas
product_idintegernamevarcharcategoryvarcharsubcategoryvarcharunit_pricedecimalunit_costdecimallaunched_ondateis_activeboolean
| product_id | name | category | subcategory | unit_price | unit_cost | launched_on | is_active |
|---|---|---|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 | NaN | 2023-09-11 | true |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 | 503.50 | 2024-05-16 | true |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 | 429.87 | 2023-05-27 | true |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 | 214.70 | 2022-12-20 | true |
| 105 | Avery Leather Bed Frame | Furniture | Beds | 449.00 | 232.70 | 2021-08-31 | true |
returns1,673 filas · 5 columnas
return_idintegerorder_item_idintegerreturned_ondatereasonvarcharrefund_amountdecimal
| return_id | order_item_id | returned_on | reason | refund_amount |
|---|---|---|---|---|
| 1 | 14 | 2023-01-10 | damaged | 83.69 |
| 2 | 42 | 2023-01-10 | wrong_item | 19.99 |
| 3 | 105 | 2023-01-14 | wrong_item | 10.99 |
| 4 | 24 | 2023-01-16 | changed_mind | 26.99 |
| 5 | 126 | 2023-01-16 | late | 20.99 |
employees60 filas · 8 columnas
employee_idintegerfirst_namevarcharlast_namevarchardepartmentvarchartitlevarcharmanager_idintegerhire_datedatesalaryinteger
| employee_id | first_name | last_name | department | title | manager_id | hire_date | salary |
|---|---|---|---|---|---|---|---|
| 1 | Catherine | Hale | Executive | Chief Executive Officer | NaN | 2016-03-01 | 285000 |
| 2 | Robert | Kim | Executive | Chief Operating Officer | 1 | 2017-01-09 | 235000 |
| 3 | Megan | Collins | Sales | Head of Sales | 1 | 2018-04-16 | 172000 |
| 4 | Chloe | Gutierrez | Sales | Account Executive | 3 | 2020-01-21 | 72000 |
| 5 | Frank | Bell | Sales | Account Executive | 3 | 2023-05-21 | 73000 |
web_sessions40,000 filas · 7 columnas
session_idintegercustomer_idintegerstarted_attimestampdevicevarcharsourcevarcharpages_viewedintegerconvertedboolean
| session_id | customer_id | started_at | device | source | pages_viewed | converted |
|---|---|---|---|---|---|---|
| 1 | NaN | 2023-01-01 23:02:24 | mobile | paid | 1 | false |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid | 1 | false |
| 3 | NaN | 2023-01-01 16:55:46 | desktop | direct | 7 | false |
| 4 | NaN | 2023-01-01 12:43:28 | mobile | organic | 3 | false |
| 5 | NaN | 2023-01-01 13:06:21 | mobile | social | 2 | false |
marketing_spend3,276 filas · 3 columnas
spend_datedatechannelvarcharamountdecimal
| spend_date | channel | amount |
|---|---|---|
| 2023-01-01 | paid | 492.99 |
| 2023-01-01 | 37.38 | |
| 2023-01-01 | social | 200.53 |
| 2023-01-02 | paid | 709.13 |
| 2023-01-02 | 64.13 |
La lección
Las barras comparan, los histogramas reparten
Un gráfico de barras compara categorías. Un histograma muestra la distribución de un número: corta el rango de valores en intervalos, llamados bins, y dibuja una barra con cuántos valores caen en cada uno. Las barras vecinas se tocan, porque los bins están uno al lado del otro en una recta numérica.
La pregunta de Laura, “¿es de verdad típico un pedido de $500?”, trata de una distribución, así que recibe un histograma de los valores de los pedidos.
Dibujarlo
Primero un valor por pedido (lo hace el starter), luego ax.hist:
fig, ax = plt.subplots()
ax.hist(order_value, bins=range(0, 2100, 100), edgecolor="white")
ax.set_xlabel("Order value (USD)")
ax.set_ylabel("Orders")
bins acepta un número (bins=30 crea 30 bins iguales desde el valor menor al mayor) o la lista de
bordes. Con bordes controlas el rango y el ancho. Aquí 21 bordes crean 20 bins de $100, de 0 a
2,000. Los pedidos por encima de $2,000, 207 de los 4.295 pedidos completados de 2025, quedan fuera
del rango y no se dibujan. Entre 20 y 50 bins suele funcionar; con muy pocos pierdes la forma, con
demasiados cada barra es ruido.
Las cifras detrás de las barras
np.histogram recibe los mismos argumentos y devuelve lo que dibuja ax.hist:
counts, bin_edges = np.histogram(order_value, bins=range(0, 2100, 100))
counts[:3] # [1180, 683, 451]
bin_edges[:3] # [0, 100, 200]
Siempre hay un borde más que recuentos. Cada bin incluye su borde izquierdo y excluye su borde derecho, así que un pedido de exactamente $100 cuenta en el segundo bin. El último bin es la excepción: incluye ambos extremos.
Media frente a mediana
Esta distribución está sesgada a la derecha: muchos pedidos pequeños y una cola larga de cestas grandes de empresas. En una distribución sesgada la media es atraída hacia la cola, mientras que la mediana se queda donde están la mayoría de los pedidos. Marca ambas con líneas verticales y la diferencia se ve al instante:
ax.axvline(order_value.mean(), color="red", label="Mean") # $535.90
ax.axvline(order_value.median(), linestyle="--", label="Median") # $257.96
ax.legend()
La mitad de los pedidos completados de 2025 estuvieron por debajo de $258, y sin embargo la media es más del doble. Para “¿cuánto gasta un cliente típico?”, la mediana es la respuesta honesta; la media sigue siendo la cifra correcta para planificar ingresos, porque los ingresos son un total.
Errores comunes
- Graficar las líneas de
order_itemsen lugar de pedidos enteros. Agrupa primero a un valor por pedido. - Dejar
binsen el valor por defecto de 10, que convierte esta forma en unos pocos bloques. - Usar un gráfico de barras con huecos entre las barras para un histograma, lo que sugiere categorías separadas.
- Citar solo la media de una distribución sesgada. Da la mediana a su lado.
¡Linterna encendida!
Practicaste: histogrambinsdistributionmean vs mediannp histogram
- Resuelto
- Sin pistas
- Al primer intento
