La solicitud

De Thomas Whitaker, Director de Merchandising
Tu objetivo
Para cada producto, toma units = la suma de quantity sobre las líneas de pedido con quantity > 0 que pertenecen a pedidos con status 'completed' (todos los años). Dibuja un scatter del unit_price de los productos (de products) frente a units, ajusta una recta con np.polyfit, y asigna a result la pendiente de esa recta (unidades por dólar extra), un float redondeado a 2.
- Usa el DataFrame
productspendiente - Usa el DataFrame
orderspendiente - Guarda un número en
resultpendiente
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
Un punto por cosa
Un gráfico de dispersión (scatter) responde a “¿se mueven juntos dos números?”. Cada punto es una observación, aquí un producto: su precio de lista en horizontal, sus unidades vendidas en vertical. Construye primero esa tabla, una fila por producto:
units = lines.groupby("product_id", as_index=False).agg(units=("quantity", "sum"))
per_product = products[["product_id", "unit_price"]].merge(units, on="product_id")
len(per_product) # 120 products, all sold at least once
Luego dibuja:
fig, ax = plt.subplots()
ax.scatter(per_product["unit_price"], per_product["units"], alpha=0.6)
ax.set_xlabel("List price (USD)")
ax.set_ylabel("Units sold")
alpha hace los puntos parcialmente transparentes, de modo que donde los puntos se amontonan ves
una mancha más oscura en lugar de un borrón. La versión de pandas es per_product.plot(kind="scatter", x="unit_price", y="units").
Una línea de tendencia con np.polyfit
La nube desciende, pero ¿cuánto? np.polyfit(x, y, 1) ajusta la recta (grado 1) más cercana a todos
los puntos y devuelve su pendiente y su ordenada en el origen:
slope, intercept = np.polyfit(per_product["unit_price"], per_product["units"], 1)
# slope ≈ -0.56, intercept ≈ 608
x = np.array([0, per_product["unit_price"].max()])
ax.plot(x, slope * x + intercept, color="red")
Dos valores de x bastan para dibujar una recta. La pendiente se lee en las unidades de los ejes: unidades de y por unidad de x, así que aquí unidades vendidas por dólar de precio. -0.56 significa que, a lo largo de todo el rango, cada $100 extra de precio de lista va acompañado de unas 56 unidades vendidas menos.
Leerlo con honestidad
El más vendido, el Delancey Brass Vase a $19.99, vendió 2.320 unidades; la Laurel Teak Solar Lantern a $1,289 vendió 6. Pero los puntos están muy dispersos alrededor de la recta, así que la pendiente es un resumen de todo el rango, no una previsión para un producto. Además compara productos distintos: no dice qué pasaría si Thomas subiera el precio de uno de ellos. Eso necesita una prueba de precios. Un scatter muestra que dos cosas van juntas; no prueba que una cause la otra.
Errores comunes
- Graficar cada línea de pedido en lugar de un punto por producto: miles de puntos superpuestos.
- Pasar y antes que x a
polyfit, lo que invierte el significado de la pendiente. - Leer la pendiente como causa y efecto. Describe cómo se distribuyen los puntos, nada más.
- Usar
ax.plotcon marcadores para un scatter y olvidarlinestyle="", que une los puntos con líneas en el orden de la tabla.
¡Linterna encendida!
Practicaste: scatterpolyfittrend lineslopealpha
- Resuelto
- Sin pistas
- Al primer intento
