La solicitud

De Catherine Hale, Directora General
Tu objetivo
Paso 1 de 4. Bloque de ingresos. Asigna a result un DataFrame con una fila por mes de 2025 (ordenado) y las columnas month, orders (pedidos confirmados distintos), net_sales, refunds, net_revenue (net_sales − refunds), aov (net_sales / orders) y return_rate_pct (refunds × 100 / net_sales), con dinero y tasas redondeados a 2.
- Usa el DataFrame
order_itemspendiente - Usa el DataFrame
returnspendiente - Muestra exactamente
monthordersnet_salesrefundsnet_revenueaovreturn_rate_pctpendiente
Paso 2 de 4. Bloque de clientes y tráfico. Asigna a result un DataFrame con una fila por mes de 2025 (ordenado) y las columnas month, sessions (sesiones web iniciadas ese mes), conversions (sesiones convertidas), conversion_pct (conversions × 100 / sessions, redondeado a 2) y new_customers (clientes cuyo primer pedido confirmado cae en ese mes).
- Usa el DataFrame
orderspendiente - Usa el DataFrame
web_sessionspendiente - Muestra exactamente
monthsessionsconversionsconversion_pctnew_customerspendiente
Paso 3 de 4. Bloque de crecimiento. Usando monthly del starter, asigna a result un DataFrame con una fila por mes de 2025 (ordenado) y las columnas month, net_revenue, net_revenue_ly (el mismo mes de 2024), yoy_pct ((net_revenue / net_revenue_ly − 1) × 100) y orders_yoy_pct (lo mismo para los pedidos), todas redondeadas a 2.
- Usa el DataFrame
orderspendiente - Usa el DataFrame
order_itemspendiente - Muestra exactamente
monthnet_revenuenet_revenue_lyyoy_pctorders_yoy_pctpendiente
Paso 4 de 4. Revisión de controles. El control de la tasa de devolución es 7 %. Un mes es definitivo cuando han pasado 40 días después de su último día, igual o antes de 2025-12-31. Asigna a result un dict: "breaches", la lista ordenada de los meses definitivos de 2025 con return_rate_pct por encima de 7, y "not_final", la lista ordenada de los meses de 2025 que todavía no son definitivos.
- Usa el DataFrame
orderspendiente - Usa el DataFrame
order_itemspendiente - Guarda un dict en
resultpendiente
Paso 1 · 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.
Paso 2 · 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.
Paso 3 · 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.
Paso 4 · 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 Catherine, 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 |
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 |
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 |
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 |
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 |
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 |
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
Una hoja de KPI es una página, no un panel
Una hoja de KPI es la página que un equipo directivo lee cada mes. Es corta a propósito: la métrica estrella, los pocos números que la impulsan, el crecimiento frente al mismo período del año pasado y los controles con un estado. Todo en ella tiene una definición escrita, y las definiciones no cambian entre ediciones.
La hoja de Harbor & Pine tiene cuatro bloques, y construyes uno por paso.
Bloque 1: ingresos
Pedidos, ventas netas, reembolsos, ingresos netos (la métrica estrella), AOV y tasa de devolución, una fila por mes. Todo sale de una sola tabla de líneas confirmadas y válidas con el reembolso adjunto, así que los números cuadran entre columnas: los ingresos netos son las ventas netas menos los reembolsos, y AOV × pedidos devuelve las ventas netas.
Bloque 2: clientes y tráfico
Sesiones, conversiones, tasa de conversión y clientes nuevos. Estos son los impulsores: los ingresos crecen porque más gente visita, más de ella compra, o más de ella es nueva. La tasa de conversión es conversiones entre sesiones del mismo mes, calculada a partir de los totales.
Bloque 3: crecimiento frente al año pasado
Harbor & Pine es estacional, así que la columna de crecimiento es interanual, no mes a mes. Pon el crecimiento de pedidos junto al de ingresos: cuando los pedidos crecen y los ingresos no, los pedidos se hicieron más pequeños, y eso merece una frase en la hoja.
Bloque 4: controles con una regla de madurez
El control de la tasa de devolución es 7 % de las ventas netas. Un mes solo puede incumplirlo cuando ya llegaron sus devoluciones, lo que tarda hasta 40 días después de que el mes termina. Los meses más jóvenes se listan como no definitivos en vez de juzgarlos pronto, para que los meses más recientes no puedan verse mejor de lo que son.
Errores comunes
- Promediar las tasas mensuales para el año. Recalcula las tasas anuales a partir de totales sumados.
- Crecimiento mes a mes en un negocio estacional. Mide el calendario.
- Juzgar meses jóvenes. Las métricas con retraso necesitan una fecha “definitiva desde”.
- Cambiar una definición entre ediciones. Si tiene que cambiar, reexpresa el historial con ella.
¡Linterna encendida!
Practicaste: kpi sheetnet revenueaovreturn rateconversion rateyoyguardrail metricsdata maturity
- Resuelto
- Sin pistas
- Al primer intento
