La solicitud

De Thomas Whitaker, Director de Merchandising
Tu objetivo
Usando las líneas de pedido cuyo pedido tiene status 'completed' y cuyo order_date está en 2025, con ingresos de línea = quantity * unit_price * (1 - discount_pct / 100) (unit_price de order_items), asigna a result un DataFrame con las columnas category, sum_revenue, median_revenue, count_revenue: la suma, la mediana y el número de ingresos de línea por categoría, redondeados a 2. Una fila por categoría, ordenada de la A a la Z.
- Usa el DataFrame
productspendiente - Usa el DataFrame
orderspendiente - Muestra exactamente
categorysum_revenuemedian_revenuecount_revenuependiente
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
Sumar en una cuadrícula
Contar es un uso de pivot_table; sumar una columna de dinero es el otro uso cotidiano. Solo
cambian la respuesta a “¿qué calculo?” (values) y a “¿qué operación?” (aggfunc):
spend = marketing_spend.assign(year=marketing_spend["spend_date"].dt.year)
spend.pivot_table(index="year", columns="channel", values="amount", aggfunc="sum").round(2)
# channel email paid social
# year
# 2023 28989.02 253948.40 99253.03
# 2024 32876.47 294047.40 114970.96
# 2025 38322.22 340778.33 131540.77
El año sale de la fecha con .dt.year. Las etiquetas de año son enteros, así que una columna de una
cuadrícula con años en horizontal se selecciona como grid[2025], no grid["2025"].
Crear primero las columnas
Un pivot solo puede usar columnas que existen. Los ingresos por categoría necesitan cosas que las
líneas de pedido aún no tienen: la categoría (en products), la fecha y el estado del pedido (en
orders) y los propios ingresos. Así que el trabajo ocurre antes del pivot: merge, filtro, calcular
la medida, y luego pivot.
Varias funciones a la vez
aggfunc también acepta una lista. Cada función se convierte en su propio bloque de columnas:
p = items.pivot_table(index="category", values="revenue",
aggfunc=["sum", "median", "count"])
p.columns.tolist()
# [('sum', 'revenue'), ('median', 'revenue'), ('count', 'revenue')]
Las etiquetas de columna tienen ahora dos niveles: la función arriba, la columna medida debajo.
Cuando este juego muestra o comprueba una tabla así, los niveles se unen con un guion bajo, así que
ves sum_revenue, median_revenue y count_revenue. En tu propio código puedes hacer lo mismo con
p.columns = ["_".join(c) for c in p.columns], o seleccionar un bloque con p["median"].
Con los tres años de pedidos completados, Decor tiene 7.407 líneas con una mediana de $44.98, y Furniture solo 1.450 líneas con una mediana de $670.65. La suma sola mostraría dos categorías grandes; la mediana y el recuento muestran que son grandes de maneras completamente distintas.
Por qué la mediana junto a la suma
La mediana es la línea del medio: la mitad de las líneas están por debajo, la mitad por encima. A diferencia de la media, un puñado de pedidos de empresa de $10,000 apenas la mueve, así que describe una compra típica. El recuento te dice en cuánta evidencia se apoya cada cifra. Un total, un valor típico y un recuento juntos responden a la mayoría de las preguntas de “¿cómo le va a esta categoría?”.
Errores comunes
- Valorar las líneas con
products["unit_price"]. Ese es el precio de lista actual; la línea de pedido tiene el precio que el cliente realmente pagó. - Olvidar
aggfunc. El valor por defecto es la media, así que cada celda muestra una línea media. - Filtrar por estado o año después del pivot. El pivot ya no tiene esas columnas; filtra antes.
- Esperar nombres de columna simples a partir de una lista de funciones. Tienen dos niveles; únelos o selecciónalos.
¡Linterna encendida!
Practicaste: pivot tableaggfunc listmultiindex columnsmergedt year
- Resuelto
- Sin pistas
- Al primer intento
