Nivel 1 · Pedidos por mes con resample
¿Es nuevo para ti? Lee primero el concepto: Cómo pandas convierte marcas de tiempo en tendencias
0 de 3
La solicitud

De Megan Collins, Directora de Ventas
Tu objetivo
Asigna a result un DataFrame con una fila por mes del calendario desde enero de 2023 hasta diciembre de 2025 (36 filas) y las columnas order_date (el primer día del mes, p. ej. 2023-01-01) y n_orders (número de pedidos hechos ese mes, todos los estados), ordenado por order_date ascendente, con el índice reiniciado.
- Usa el DataFrame
orderspendiente - Muestra exactamente
order_daten_orderspendiente - 36 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 Megan, 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
Agrupar por tiempo
groupby agrupa filas que comparten un valor. El tiempo necesita algo ligeramente distinto: quieres
que cada pedido del 3 de marzo de 2025 a las 14:07 y cada pedido del 28 de marzo a las 21:50 caigan
en el mismo grupo, “marzo de 2025”. resample hace exactamente eso. Es un groupby para el tiempo:
corta la línea temporal en periodos regulares (días, semanas, meses, trimestres, años) y agrupa las
filas según el periodo en que caen.
Necesita las marcas de tiempo en el índice, así que el patrón siempre empieza con set_index:
monthly = orders.set_index("order_date").resample("MS").size()
monthly.head(3)
# order_date
# 2023-01-01 192
# 2023-02-01 157
# 2023-03-01 191
Después de resample llamas a una agregación, exactamente como después de groupby: .size()
cuenta filas, ["shipping_fee"].sum() suma una columna, .mean(), .max() y compañía también funcionan.
Los códigos de frecuencia
La cadena que pasas es un alias de frecuencia. Los que más usan los analistas:
| alias | periodo | etiqueta |
|---|---|---|
"D" |
día | el día |
"W-SUN" (o "W") |
semana que termina en domingo | el domingo |
"MS" |
mes del calendario | primer día del mes |
"ME" |
mes del calendario | último día del mes |
"QS" / "QE" |
trimestre | primer / último día |
"YS" / "YE" |
año | primer / último día |
"MS" y "ME" producen los mismos recuentos; solo cambia la etiqueta. Enero de 2023 es 2023-01-01
con "MS" y 2023-01-31 con "ME". Elige la que coincida con aquello con lo que vayas a unir o
comparar. Aquí los objetivos de Megan usan el primer día del mes, así que "MS". (Los tutoriales
antiguos escriben "M"; las versiones recientes de pandas lo han renombrado a "ME" y avisan del nombre antiguo.)
Qué aspecto tiene el resultado
Los pedidos de Harbor & Pine abarcan 36 meses. El más tranquilo fue febrero de 2023 con 157 pedidos; el más ocupado fue diciembre de 2025 con 777. Cada noviembre y diciembre es más o menos el doble de un mes normal, algo que verás enseguida al recorrer la columna.
El resultado es una Series indexada por mes. Para compartirla como tabla, nombra los valores y devuelve el índice a una columna:
monthly.rename("n_orders").reset_index()
# order_date n_orders
# 0 2023-01-01 192
# 1 2023-02-01 157
¿Por qué no agrupar por texto de mes?
Podrías construir una columna de texto "2025-03" con dt.strftime y aplicarle groupby. Funciona,
pero resample tiene dos ventajas. El resultado conserva fechas reales, así que puedes graficarlo,
desplazarlo y calcular crecimiento sobre él. Y un mes sin pedidos sigue apareciendo, con un recuento
de 0, en lugar de desaparecer en silencio de la tabla, lo cual importa en cuanto calculas “cambio
desde el mes pasado”.
Errores comunes
- Llamar a
orders.resample("MS")sinset_index. pandas lanza unTypeErrorpidiendo un DatetimeIndex (o pasaon="order_date"en su lugar). - Usar
"ME"cuando la otra tabla usa inicios de mes, o al revés. Los números son correctos pero nada encaja al unir. - Usar
.count()sobre todo el frame, lo que devuelve un recuento por columna..size()devuelve un número por mes. - Escribir el alias obsoleto
"M"de código antiguo.
¡Linterna encendida!
Practicaste: datetimeindexresampleset indexmonth startsize
- Resuelto
- Sin pistas
- Al primer intento
