La solicitud

De Anthony Ramos, Analista Financiero
Tu objetivo
A partir de lines (líneas válidas de pedidos contabilizados con net y year, construido en el código inicial) y returns, asigna a result un DataFrame con una fila por año, ordenado por año, y las columnas year, net_sales (suma de net), refunds (suma de refund_amount en esas líneas), net_revenue (net_sales − refunds) y refund_rate_pct (refunds × 100 / net_sales). Redondea todo a 2 decimales.
- Usa el DataFrame
orderspendiente - Usa el DataFrame
order_itemspendiente - Muestra exactamente
yearnet_salesrefundsnet_revenuerefund_rate_pctpendiente
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 Anthony, 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 |
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 |
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 |
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
El último paso de la cascada
Las ventas netas son lo que los clientes pagaron. Una parte vuelve. Los reembolsos son el dinero devuelto,
registrado por línea devuelta en returns.refund_amount, y los ingresos netos son lo que queda:
gross sales − discounts = net sales
net sales − refunds = net revenue
Un pedido reembolsado aporta su valor completo a las ventas netas y la misma cantidad (o casi, tras una tarifa de reposición) a los reembolsos, así que su neto queda cerca de cero. Un pedido completado con una lámpara devuelta deja neto el resto del carrito.
Unir devoluciones sin perder ventas
returns tiene una fila por línea devuelta, y la mayoría de las líneas nunca se devuelven. Un merge por la
izquierda conserva todas las líneas y pone NaN en refund_amount donde no volvió nada:
lines = lines.merge(returns[["order_item_id", "refund_amount"]], on="order_item_id", how="left")
groupby(...).sum() ignora los NaN, así que la columna de reembolsos suma solo reembolsos reales. Un merge
interno conservaría solo las 1,673 líneas devueltas y destruiría el total de ventas netas.
¿A qué año pertenece un reembolso?
Un pedido de diciembre devuelto en enero se puede contabilizar de dos maneras: en el año del pedido (la vista por cohorte) o en el año en que salió el dinero (la vista de caja). Los estados financieros suelen usar la fecha de caja. Esta ruta usa el año del pedido, así que la tasa de reembolso de cada año describe los pedidos de ese año. Ambas son válidas; mezclarlas no. Di cuál usaste.
El período más reciente nunca está terminado
Las devoluciones llegan de 4 a 40 días después del pedido. Los pedidos de diciembre de 2025 han tenido solo días para volver, así que diciembre muestra $8,573.75 de reembolsos frente a $21,306.68 en noviembre. La tasa de reembolso de 2025, 5.96 %, irá subiendo cuando lleguen las devoluciones de enero. Los informes que comparan el mes más reciente con los anteriores sin esa nota al pie hacen parecer que las devoluciones bajan.
Errores comunes
- Merge interno. Solo sobreviven las líneas devueltas; las ventas netas se reducen a casi nada.
- Contar líneas devueltas como la tasa. Las unidades devueltas y los dólares reembolsados dan tasas distintas; este nivel usa dólares, porque la cascada está en dólares.
- Restar los reembolsos de las ventas brutas. Los reembolsos se pagan sobre precios con descuento, así que se restan de las ventas netas.
Nota de entrevista
“¿Por qué la tasa de devolución del mes pasado se vería baja?” Porque las devoluciones llegan con retraso respecto a los pedidos. Decir “censura por la derecha” o simplemente “la ventana aún no se cierra” muestra que sabes que los datos siguen llegando.
¡Linterna encendida!
Practicaste: refundsnet revenuereturn ratemergeleft join
- Resuelto
- Sin pistas
- Al primer intento
