La solicitud

De Catherine Hale, Directora General
Tu objetivo
Cuenta los pedidos por mes (todos los estados, meses etiquetados con su primer día). Asigna a result un DataFrame con las columnas order_date, n_orders, mom_pct (variación porcentual respecto al mes anterior, por 100, redondeada a 1) y yoy_pct (variación porcentual respecto al mismo mes un año antes, por 100, redondeada a 1), solo para los 12 meses de 2025, ordenado por order_date ascendente, con el índice reiniciado.
- Usa el DataFrame
orderspendiente - Muestra exactamente
order_daten_ordersmom_pctyoy_pctpendiente - 12 filas, ordenadas como se pidependiente
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 Catherine, 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 |
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 |
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 |
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
¿Crecimiento respecto a qué?
“Subió un 93 %” no significa nada hasta que dices comparado con qué. Las dos comparaciones que usan todos los analistas:
- Periodo contra periodo (mes a mes, MoM): este mes frente al mes anterior. Bueno para detectar cambios bruscos.
- Interanual (YoY): este mes frente al mismo mes del año pasado. La prueba justa para un negocio estacional, porque noviembre se compara con otro noviembre.
shift y pct_change
shift(n) desplaza una serie hacia abajo n filas, de modo que cada fila queda junto al valor de
n filas antes. El crecimiento es entonces simple aritmética:
monthly = orders.set_index("order_date").resample("MS").size()
growth = (monthly / monthly.shift(1) - 1) * 100
pct_change(n) es el atajo para exactamente eso: monthly.pct_change() es el cambio respecto a la
fila anterior, y monthly.pct_change(12) respecto a la fila 12 posiciones atrás. En una serie
mensual sin meses ausentes, 12 filas atrás es el mismo mes del año pasado. Esa es una razón más para
construir series mensuales con resample: nunca se salta un mes, así que los desplazamientos de
fila siempre coinciden con los del calendario.
Fíjate en que pct_change devuelve una fracción (0.137), así que multiplica por 100 para obtener un porcentaje (13.7).
La primera fila no tiene nada antes, así que su cambio MoM es NaN. Las primeras 12 filas no tienen una fila de hace un año, así que su cambio YoY es NaN. Eso es correcto: no las rellenes con 0, que afirmaría “sin cambio”.
Un ejemplo trabajado
Calculadas sobre la serie completa, las filas de 2025 se leen así:
# order_date n_orders mom_pct yoy_pct
# 2025-01-01 296 -57.6 26.0
# 2025-10-01 371 7.5 14.2
# 2025-11-01 715 92.7 13.7
# 2025-12-01 777 8.7 11.3
Noviembre de 2025 casi se duplicó respecto a octubre (+92,7 %), lo que suena a un avance. En términos interanuales es +13,7 %, en línea con el resto del año. Enero parece un mes de hundimiento mes a mes (−57,6 %) porque diciembre es el pico; en términos interanuales creció un 26 %. La estacionalidad hace que el MoM oscile violentamente justo en los momentos en que la gente presta más atención.
Calcula primero, filtra al final
Como con las ventanas móviles, la comparación necesita historial. Si seleccionas 2025 primero, enero
no tiene un diciembre antes y nada tiene una fila de hace un año. Construye las columnas sobre los
36 meses, y luego selecciona con table.loc["2025"]: en un DatetimeIndex, una cadena de año selecciona el año entero.
Errores comunes
- Filtrar a un año antes de
pct_change, lo que convierte las comparaciones en NaN. - Olvidar
* 100e informar 0.137 como “0,1 %”. - Usar
pct_change(12)en una serie con meses ausentes, de modo que 12 filas ya no son 12 meses. - Llamar “crecimiento” a los saltos estacionales mes a mes sin la cifra interanual al lado.
¡Linterna encendida!
Practicaste: pct changeshiftmonth over monthyear over yearseasonality
- Resuelto
- Sin pistas
- Al primer intento
