La solicitud

De Jordan Reyes, Director de Marketing
Tu objetivo
Asigna a result un DataFrame con las columnas device, direct, email, organic, paid, social, all: la proporción de web_sessions que convirtió (un valor entre 0 y 1) para cada dispositivo y fuente, redondeada a 3. La columna all contiene la tasa global de cada dispositivo, y una última fila extra con device 'all' contiene la tasa global de cada fuente (y la tasa global en su columna all). Filas: desktop, mobile, tablet, all, en ese orden.
- Usa el DataFrame
web_sessionspendiente - Muestra exactamente
devicedirectemailorganicpaidsocialallpendiente - 4 filas, ordenadas como se pidependiente
Tu código
Cargando el editor…
Solución de referencia
| session_id | customer_id | started_at | device | source |
|---|---|---|---|---|
| 1 | NaN | 2023-01-01 23:02:24 | mobile | paid |
| 2 | 18 | 2023-01-01 15:07:49 | desktop | paid |
| 3 | NaN | 2023-01-01 16:55:46 | desktop | direct |
| 4 | NaN | 2023-01-01 12:43:28 | mobile | organic |
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.
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 |
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 |
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 |
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 |
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
Tasas en una cuadrícula
Una tasa es la media de un resultado sí/no. Python trata True como 1 y False como 0, así que la
media de una columna booleana es la proporción de filas que son True. Eso convierte una cuadrícula
de tasas de conversión en un único pivot_table con aggfunc="mean":
web_sessions.pivot_table(index="device", columns="source",
values="converted", aggfunc="mean").round(3)
# source direct email organic paid social
# device
# desktop 0.057 0.128 0.023 0.022 0.010
# mobile 0.045 0.072 0.015 0.011 0.004
# tablet 0.050 0.092 0.016 0.018 0.003
Los visitantes de email en desktop convierten al 12,8 %, los de social en tablet al 0,3 %. Cada celda se calcula con las sesiones en bruto que contiene, así que las tasas son exactas, no medias de medias.
margins: totales para la fila y la columna
margins=True añade una columna extra y una fila extra, llamadas por defecto All. Cada margen es
el mismo agregado calculado sobre todas las filas en bruto de esa fila o columna. Para recuentos
es un total; para una media es la tasa global:
web_sessions.pivot_table(index="device", columns="source", values="session_id",
aggfunc="count", margins=True)
# source direct email organic paid social All
# desktop 2290 1738 4933 3277 2303 14541
# ...
# All 6410 4770 13531 8887 6402 40000
margins_name="all" renombra la fila y la columna de margen. Con aggfunc="mean", el margen de la
fila desktop es la tasa de conversión global de desktop (0.039), y la celda de la esquina es la tasa
de todo el sitio: 1.193 conversiones en 40.000 sesiones, 0.030.
Fíjate en lo que el margen no es: la media de las celdas de su fila. Promediar las tres tasas de dispositivo da 0.0303, algo distinto del verdadero 0.0298, porque mobile tiene muchas más sesiones que tablet. El margen pondera cada sesión por igual, que es lo que quieres.
pivot frente a pivot_table
pandas también tiene DataFrame.pivot. Solo mueve valores a una cuadrícula y nunca agrega, así que
funciona cuando cada par de fila y columna aparece exactamente una vez. Con 40.000 sesiones repartidas
en 15 celdas, falla:
web_sessions.pivot(index="device", columns="source", values="converted")
# ValueError: Index contains duplicate entries, cannot reshape
Usa pivot con datos que ya tienen una fila por celda (por ejemplo una tabla larga que acabas de
construir con groupby), y pivot_table siempre que haya que combinar filas.
Errores comunes
- Recurrir a
pivotcuando muchas filas comparten una celda, y toparte con el error de entradas duplicadas. - Calcular la tasa global como la media de las tasas de las celdas, lo que ignora el tamaño de los grupos.
- Redondear
convertedo convertirlo a texto antes del pivot. Déjalo booleano y deja quemeancuente los True. - Olvidar
margins_name, de modo que los márgenes se etiquetanAllen lugar del nombre pedido.
¡Linterna encendida!
Practicaste: pivot tablemean of booleanmarginspivot vs pivot table
- Resuelto
- Sin pistas
- Al primer intento
