La solicitud

De Catherine Hale, Directora Ejecutiva
Tu objetivo
A partir de lines (construido en el código inicial: líneas válidas de pedidos contabilizados, con year y net), asigna a result un DataFrame con una fila por año, ordenado por año, y las columnas year, orders (order_id distintos), net_sales (suma de net), aov (net_sales / orders) y units_per_order (suma de quantity / orders). Redondea net_sales y aov a 2 decimales y units_per_order a 2.
- Usa el DataFrame
order_itemspendiente - Muestra exactamente
yearordersnet_salesaovunits_per_orderpendiente - 3 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 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 |
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
Los ingresos son pedidos por AOV
El valor promedio del pedido (AOV) son las ventas netas divididas entre el número de pedidos. Las unidades por pedido (UPO) son las unidades vendidas divididas entre los pedidos. Junto con los pedidos forman una pequeña identidad sobre la que descansa todo informe de e-commerce:
net sales = orders × AOV
AOV = units per order × average price per unit
Cuando los ingresos se mueven, esto te dice dónde mirar: más pedidos, carritos más grandes o artículos más caros.
Contar pedidos, no líneas
Los datos tienen una fila por línea de pedido, unas 2.5 líneas por pedido. Cualquier conteo sobre líneas cuenta líneas, así que los pedidos deben ser ids de pedido distintos:
lines.groupby("year")["order_id"].nunique() # 2,972 · 3,772 · 4,409
lines.groupby("year").size() # line counts, two and a half times bigger
Las unidades son una simple suma de quantity. Tanto el AOV como las UPO usan el mismo conteo de pedidos
como denominador, así que ambos se calculan después del groupby, a partir de los totales.
Qué dicen los números
El panorama anual de Harbor & Pine:
year orders net_sales aov units_per_order
2023 2,972 1,649,804.36 555.12 5.20
2024 3,772 2,046,520.24 542.56 5.03
2025 4,409 2,362,232.24 535.78 4.98
Las ventas netas crecieron 43 % en dos años mientras el AOV cayó 3.5 %. Todo el crecimiento vino del volumen de pedidos; los carritos se hicieron un poco más pequeños. Eso no es malo en sí, porque más clientes comprando es buena noticia. Pero un pronóstico que supone que el AOV se queda en los $555 de 2023 se pasa.
El AOV es una media
El AOV hereda todas las debilidades de la media (mira la ruta de Estadística): un puñado de pedidos de empresas por miles de dólares lo suben, y la mediana del pedido es aproximadamente la mitad. Usa el AOV para planear (se multiplica de vuelta en ingresos) y usa la mediana para “cuánto gasta un cliente típico”.
Errores comunes
size()en lugar denunique(). El AOV sale por línea, no por pedido.- Promediar valores de línea.
lines["net"].mean()es la línea promedio, no el pedido promedio. - Conjuntos de pedidos distintos. Dividir las ventas netas de pedidos contabilizados entre todos los pedidos realizados mezcla dos definiciones y subestima el AOV.
Nota de entrevista
“Los ingresos subieron 15 % pero el AOV bajó. ¿Qué pasó?” Responde con la identidad: los pedidos tienen que haber crecido más que 15 %. Luego pregunta qué clientes generaron los pedidos extra.
¡Linterna encendida!
Practicaste: aovunits per ordergroupbynuniqueratio metrics
- Resuelto
- Sin pistas
- Al primer intento
