La solicitud

De Jordan Reyes, Director de Marketing
Tu objetivo
Usando las líneas de pedido con quantity > 0 de pedidos con status 'completed' hechos en 2025, asigna a result un DataFrame con una fila por mes y las columnas month (el primer día del mes, una fecha), app, marketplace y web (ingresos = suma de quantity * unit_price * (1 - discount_pct / 100), redondeada a 2), ordenado por month. Dibuja una línea por canal con una leyenda.
- Usa el DataFrame
orderspendiente - Usa el DataFrame
order_itemspendiente - Muestra exactamente
monthappmarketplacewebpendiente
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 Jordan, 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 |
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 |
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
Las tablas anchas dibujan varias líneas
pandas dibuja una línea por columna cuando llamas a .plot() sobre un DataFrame, con el índice
en el eje x y una leyenda construida a partir de los nombres de columna. Así que un gráfico con una
línea por canal necesita una tabla con una columna por canal. El starter te da una fila por línea de
pedido con una columna month (el primer día de cada mes); pivot_table la convierte en ancha:
wide = lines.pivot_table(index="month", columns="channel",
values="revenue", aggfunc="sum").round(2)
# app marketplace web
# 2025-01-01 38566.02 24323.19 87681.78
# 2025-02-01 46574.43 8919.22 44409.50
# ...
ax = wide.plot(marker="o")
.plot() devuelve los Axes, y a partir de ahí es el matplotlib de siempre: ax.set_title,
ax.set_ylabel, ax.set_ylim(0, None) para mantener el cero a la vista.
Hacerlo a mano
El mismo gráfico en matplotlib puro es un ax.plot por serie, cada uno con un label=, y una leyenda al final:
fig, ax = plt.subplots()
for channel in ["app", "web", "marketplace"]:
ax.plot(wide.index, wide[channel], marker="o", label=channel)
ax.legend()
ax.legend() solo conoce las líneas a las que se dio una etiqueta. Llámalo después de dibujar, no antes.
Qué dicen las líneas
Enero empezó con la web muy por delante: $87,681.78 frente a $38,566.02 de la app. Desde febrero la app lideró todos los meses excepto julio y agosto, incluidos los picos de noviembre ($118,601.68) y diciembre ($130,471.52). A lo largo del año la app aportó $996,296.62 y la web $980,935.78, así que la respuesta para Jordan es sí, por poco. El marketplace sigue siendo una tercera línea más pequeña y estable, con $324,457.72 en el año.
Mantén bajo el número de líneas. Tres líneas son fáciles de seguir; ocho líneas en ocho colores son un espagueti. Con muchos grupos, dibuja pequeños gráficos separados (niveles siguientes) o resalta una línea y pon el resto en gris.
Errores comunes
- Graficar una tabla larga con
x="month": los puntos de todos los canales van a una sola línea en zigzag. - Llamar a
ax.legend()cuando ninguna línea tiene etiqueta, lo que da una leyenda vacía. - Dejar que el eje y empiece en el valor más bajo, lo que exagera los huecos entre líneas.
- Dejar los meses como texto del tipo “2025-01”; las fechas reales mantienen el eje en orden de calendario.
- Olvidar
.round(2)o redondear antes de sumar: redondea los totales, nunca los valores de línea.
¡Linterna encendida!
Practicaste: multi linelegendwide tablepivot tablepandas plot
- Resuelto
- Sin pistas
- Al primer intento
