La solicitud

De Thomas Whitaker, Director de Merchandising
Tu objetivo
A partir de costed (construido en el starter: líneas válidas de pedidos confirmados de 2025 con costo unitario conocido, con net y cogs), asigna a result un DataFrame con una fila por categoría y las columnas category, sales_share_pct (ventas netas de la categoría × 100 / todas las ventas netas), margin_share_pct (su margen bruto × 100 / todo el margen bruto) y gap_pts (margin_share_pct − sales_share_pct), todas redondeadas a 2 (calcula gap_pts con las partes sin redondear), ordenado por gap_pts de mayor a menor.
- Usa el DataFrame
productspendiente - Usa el DataFrame
orderspendiente - Muestra exactamente
categorysales_share_pctmargin_share_pctgap_ptspendiente
Tu código
Cargando el editor…
Solución de referencia
| product_id | name | category | subcategory | unit_price |
|---|---|---|---|---|
| 101 | Vale Velvet Loveseat | Furniture | Sofas | 1659.00 |
| 102 | Alder Oak Coffee Table | Furniture | Tables | 919.00 |
| 103 | Orchard Rattan Dining Chair | Furniture | Chairs | 789.00 |
| 104 | Upland Oak Bookcase | Furniture | Storage | 429.00 |
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Thomas, y por qué
DataFrames
Cargados como DataFrames de pandas, junto con pd y np.
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 |
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 |
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
Dos partes del mismo pastel
Una mezcla es cómo se reparte un total entre grupos. La mezcla de ingresos es la parte de ventas de cada categoría; la mezcla de margen es su parte del margen bruto. Si todas las categorías tuvieran el mismo margen %, las dos mezclas serían idénticas. Difieren justo donde difieren los márgenes:
- Una categoría con margen % por encima del promedio tiene una parte mayor del margen que de las ventas.
- Una categoría con margen % por debajo del promedio tiene una parte menor.
La brecha entre las dos partes, en puntos porcentuales, es una forma rápida de ver quién carga con la ganancia.
Las partes usan el total general
cat = costed.groupby("category")[["net", "margin"]].sum()
cat["net"] * 100 / cat["net"].sum() # sales share, adds up to 100
cat["margin"] * 100 / cat["margin"].sum() # margin share, adds up to 100
Cada parte divide la suma de una categoría entre la suma de toda la tienda de esa misma columna. Dividir el margen entre las ventas de la propia categoría daría su margen %, que es un número distinto con una pregunta distinta detrás.
Puntos porcentuales, no porcentaje
La brecha es una diferencia entre dos porcentajes, así que se mide en puntos porcentuales. Una categoría que pasa de una parte del 23 % a una del 21 % perdió dos puntos, lo que es una caída relativa del 9 %. Escribe “pts” para lo primero y ”%” para lo segundo; confundirlos es uno de los errores más comunes en las diapositivas.
Qué hacer con la brecha
Una brecha no es un veredicto. La menor parte de margen de Outdoor viene con las mayores ventas, y eliminarla perdería dólares de margen. La brecha le dice a merchandising dónde rinde más un dólar extra de presupuesto: en las categorías que se quedan con más de cada venta, siempre que haya demanda. Combínala con los dólares de margen del nivel 1 antes de recomendar algo.
Errores comunes
- Partes que no suman 100. Señal de que el denominador fue el grupo, no el total.
- Redondear antes de restar. Dos partes redondeadas pueden dar una brecha de 0,01 que en realidad es 0,004.
- Ordenar las categorías solo por parte de ventas. Describe tamaño, no valor.
Nota de entrevista
“¿Cómo repartirías un presupuesto entre líneas de producto?” Empieza con ambas mezclas. Mostrar que la parte de ventas y la parte de margen no coinciden, y por cuánto, es una buena primera respuesta.
¡Linterna encendida!
Practicaste: mixshare of totalgross margingroupbytransform
- Resuelto
- Sin pistas
- Al primer intento
