La solicitud

De Debra Marshall, Gerente de Almacén
Tu objetivo
El código del starter se ejecuta pero mide lo que no es. Corrígelo para que result sea un DataFrame de los 10 productos con más unidades vendidas: columnas product_id y units (la suma de quantity de todas las líneas de pedido, usadas tal como están), ordenado por units descendente y luego product_id ascendente, índice reiniciado.
- Usa el DataFrame
order_itemspendiente - Muestra exactamente
product_idunitspendiente - 10 filas, ordenadas como se pidependiente
Tu código
Cargando el editor…
Solución de referencia
| order_item_id | order_id | product_id | quantity | unit_price |
|---|---|---|---|---|
| 1 | 1001 | 121 | 9 | 31.99 |
| 2 | 1001 | 154 | 3 | 11.99 |
| 3 | 1002 | 154 | 4 | 11.99 |
| 4 | 1002 | 194 | 1 | 149.00 |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Debra, y por qué
DataFrames
Cargados como DataFrames de pandas, junto con pd y np.
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 |
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 |
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
Count no es sum
Ambas funciones reciben una columna, y ambas devuelven un número por grupo, por eso es fácil confundirlas:
"count"responde a «¿cuántas filas tienen un valor en esta columna?». Sobrequantityeso es el número de líneas de pedido del producto."sum"responde a «¿a cuánto suman los valores?». Sobrequantityeso es el número de unidades.
Un cliente que compra 6 mantas de lana en un pedido suma 1 al conteo y 6 a la suma. Los clientes de empresa suelen comprar al por mayor, así que en estos datos las dos medidas están muy separadas:
order_items.groupby("product_id").agg(
lines=("quantity", "count"),
units=("quantity", "sum"),
).sort_values("units", ascending=False).head(3)
| product_id | lines | units |
|---|---|---|
| 166 | 1262 | 2565 |
| 193 | 1339 | 2545 |
| 186 | 1121 | 2268 |
El producto 193, el Delancey Brass Vase, aparece en más líneas, pero el producto 166, la Harbor Wool Knit Throw, vende más unidades. El ranking del starter puso el jarrón primero; los conteos del almacén de Debra dicen otra cosa, y ella tiene razón.
Depurar leyendo los números
El mensaje de Debra contiene dos pistas. El número de un producto es más o menos la mitad de lo que ella envió, y el orden de los dos primeros está cambiado. «Demasiado bajo, más o menos la mitad» encaja con contar líneas cuando la línea promedio tiene unas dos unidades (la cantidad media es 2.0). Antes de editar código, vale la pena preguntarse «¿qué produciría exactamente este número erróneo?». Aquí la respuesta apunta directamente a la función de agregación, y la corrección es una palabra.
Sobre las líneas erróneas
order_items tiene 24 líneas con cantidad 0 o menor, errores de captura de datos que limpiarás en el
capítulo 8. El ticket pide que uses las líneas tal como están. Algunas de ellas pertenecen a productos del
top diez, así que bajan los totales en una unidad o unas pocas, pero no cambian el ranking.
Errores comunes
- Usar
"count"o"size"cuando la pregunta es sobre unidades. - Sumar
unit_priceen lugar dequantity. - Quitar el desempate por
product_id, de modo que totales iguales podrían salir en cualquier orden. - Tomar
.head(10)antes de ordenar, lo que devuelve los diez primeros productos por id.
¡Linterna encendida!
Practicaste: groupbycount vs sumnamed aggregationdebuggingsort values
- Resuelto
- Sin pistas
- Al primer intento
