Nivel 1 · Margen bruto por categoría
0 de 3
La solicitud

De Laura Bennett, Directora de Finanzas
Tu objetivo
A partir de lines (construido en el starter: líneas válidas de pedidos confirmados, de 2023 a 2025, con net y cogs), conserva solo las líneas con unit_cost conocido. Asigna a result un DataFrame con una fila por categoría y las columnas category, net_sales (suma de net), cogs (suma de cogs), gross_margin (net_sales − cogs) y margin_pct (gross_margin × 100 / net_sales), todas redondeadas a 2, ordenado por margin_pct de mayor a menor.
- Usa el DataFrame
productspendiente - Usa el DataFrame
orderspendiente - Muestra exactamente
categorynet_salescogsgross_marginmargin_pctpendiente
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 Laura, 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
Qué mide el margen bruto
El margen bruto es lo que queda de las ventas después de pagar la mercancía vendida:
- Ventas netas: lo que los clientes pagaron por los artículos, después de descuentos (el envío no está incluido).
- COGS (costo de la mercancía vendida): quantity × el costo unitario de cada producto.
- Margen bruto = ventas netas − COGS, en dólares.
- Margen bruto % = margen bruto ÷ ventas netas × 100.
La cifra en dólares te dice cuánto aporta una categoría a pagar salarios, alquiler y marketing. El porcentaje te dice cuánto de cada venta se queda la tienda, que es lo que comparas entre categorías de tamaños muy distintos.
Calcúlalo con las sumas, no con las líneas
El margen % de una categoría es el margen total dividido por las ventas totales, ambos sumados primero:
g = costed.groupby("category")
(g["net"].sum() - g["cogs"].sum()) * 100 / g["net"].sum()
Promediar el margen % de cada línea le daría el mismo peso a todas, así que una vela de $12 contaría tanto como un sofá de $1.600. Las sumas pesan cada línea por sus dólares, que es lo que finanzas entiende por margen de la categoría.
Un costo faltante no es un costo cero
Nueve productos no tienen unit_cost. Si los dejas, cogs es NaN en sus líneas y sum() de pandas
ignora los NaN, así que sus ventas se cuentan sin ningún costo en contra. Eso convierte 961 líneas y
$596.695 de ventas netas en ganancia pura. En su lugar, quita esas líneas de los dos lados de la
razón y escribe la cobertura en la diapositiva: “margen sobre el 90 % de las ventas netas; 9
productos no tienen costo registrado”.
lines["unit_cost"].isna().sum() # lines with no cost
Dólares y porcentaje cuentan historias distintas
En el historial de Harbor & Pine, Outdoor vende más y se queda con menos por dólar, pero aun así gana más dólares de margen. Textiles es lo contrario: las ventas más pequeñas y la mejor tasa. Ningún número por sí solo es “la mejor categoría”. Pon ambos en la tabla, ordenada por el que responde a la pregunta.
Errores comunes
- Contar los costos faltantes como cero. El margen parece más alto de lo que es, y el error se esconde en un producto fácil de pasar por alto.
- Usar el precio de lista en vez del precio pagado.
products.unit_pricees el precio de hoy; la línea del pedido tiene lo que el cliente realmente pagó. - Olvidar los descuentos. El margen sobre ventas brutas exagera lo que la tienda se queda en las promociones.
Nota de entrevista
“¿Cuál es la diferencia entre margen bruto y markup?” El margen divide la ganancia entre el precio de venta; el markup la divide entre el costo. Un producto comprado a $50 y vendido a $100 tiene un margen del 50 % y un markup del 100 %.
¡Linterna encendida!
Practicaste: gross margincogsmargin pctmissing costsgroupby
- Resuelto
- Sin pistas
- Al primer intento
