Nivel 4 · Suaviza el gráfico de ingresos diarios

La solicitud

De Laura Bennett, Directora de Finanzas

“El gráfico de ingresos diarios de nuestro panel salta por todos lados, así que nadie puede decir cuándo empezó de verdad la temporada alta ni cuándo tuvo su pico. ¿Puedes suavizarlo con un promedio de 7 días y decirme cuál fue el día más fuerte y la semana más fuerte de 2025?”

Tu objetivo

Construye los ingresos diarios de 2025 a partir de los pedidos completados (ingresos de la línea = quantity × unit_price × (1 − discount_pct / 100)), con un valor por cada día del calendario. Luego calcula una media móvil de 7 días. Asigna a result un diccionario: "busiest_day", la fecha con los mayores ingresos diarios, y "busiest_week_end", la fecha en que la media de 7 días es más alta, ambas como texto "YYYY-MM-DD", y "max_7day", esa media de 7 días más alta, redondeada a 2.

  • Usa el DataFrame orderspendiente
  • Usa el DataFrame order_itemspendiente
  • Guarda un dict en resultpendiente
Daily revenue, October to December 2025
Daily revenue, October to December 2025$0$5k$10k$15k$20k$25krevenueOct 01Oct 12Oct 23Nov 03Nov 14Nov 25Dec 06Dec 17Dec 28
Daily revenue, October to December 2025$0$5k$10k$15k$20k$25krevenueOct 01Oct 23Nov 14Dec 06Dec 28

One point per day. Single big orders make spikes that say little about the trend.

Ver los números
revenue
Oct 01$7,274
Oct 02$2,112
Oct 03$4,680
Oct 04$2,781
Oct 05$3,477
Oct 06$2,683
Oct 07$3,333
Oct 08$6,183
Oct 09$9,080
Oct 10$13,463
Oct 11$2,566
Oct 12$4,713
Oct 13$6,800
Oct 14$9,910
Oct 15$6,526
Oct 16$3,814
Oct 17$8,680
Oct 18$7,353
Oct 19$1,924
Oct 20$2,019
Oct 21$6,832
Oct 22$3,267
Oct 23$1,675
Oct 24$6,266
Oct 25$12,136
Oct 26$6,223
Oct 27$6,582
Oct 28$5,525
Oct 29$5,992
Oct 30$3,587
Oct 31$7,148
Nov 01$13,803
Nov 02$9,265
Nov 03$8,846
Nov 04$4,958
Nov 05$6,880
Nov 06$6,287
Nov 07$6,646
Nov 08$5,912
Nov 09$7,314
Nov 10$13,755
Nov 11$6,441
Nov 12$10,065
Nov 13$5,885
Nov 14$5,975
Nov 15$16,267
Nov 16$8,817
Nov 17$10,937
Nov 18$15,139
Nov 19$6,540
Nov 20$12,074
Nov 21$10,664
Nov 22$6,574
Nov 23$14,407
Nov 24$5,660
Nov 25$4,173
Nov 26$4,801
Nov 27$11,165
Nov 28$15,976
Nov 29$19,382
Nov 30$17,757
Dec 01$23,299
Dec 02$7,703
Dec 03$6,354
Dec 04$13,797
Dec 05$8,518
Dec 06$13,459
Dec 07$15,360
Dec 08$11,234
Dec 09$3,319
Dec 10$9,526
Dec 11$11,364
Dec 12$9,434
Dec 13$22,028
Dec 14$8,486
Dec 15$7,621
Dec 16$16,117
Dec 17$13,730
Dec 18$6,980
Dec 19$6,694
Dec 20$14,178
Dec 21$9,817
Dec 22$6,037
Dec 23$5,782
Dec 24$5,647
Dec 25$1,597
Dec 26$6,528
Dec 27$5,232
Dec 28$6,396
Dec 29$1,635
Dec 30$3,416
Dec 31$7,059

Tu código

Python

Cargando el editor…

    ResultadoVista previa de orders · presiona Ejecutar para ver el tuyo
    Vista previa de orders
    order_idcustomer_idorder_datestatuschannel
    10011252023-01-01 20:51:19completedweb
    10021562023-01-02 07:58:46completedweb
    1003222023-01-02 10:25:27completedmarketplace
    1004482023-01-02 11:21:51completedmarketplace

    Mote revisa tu resultado

    Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

    DataFrames

    Cargados como DataFrames de pandas, junto con pd y np.

    orders12,000 filas · 7 columnas
    • order_idinteger
    • customer_idinteger
    • order_datetimestamp
    • statusvarchar
    • channelvarchar
    • shipping_feedecimal
    • coupon_codevarchar
    Primeras 5 filas de orders
    order_idcustomer_idorder_datestatuschannelshipping_feecoupon_code
    10011252023-01-01 20:51:19completedweb0.00NaN
    10021562023-01-02 07:58:46completedweb0.00NaN
    1003222023-01-02 10:25:27completedmarketplace4.99WELCOME10
    1004482023-01-02 11:21:51completedmarketplace4.99WELCOME10
    1005822023-01-02 11:43:36completedweb0.00WELCOME10
    order_items30,338 filas · 6 columnas
    • order_item_idinteger
    • order_idinteger
    • product_idinteger
    • quantityinteger
    • unit_pricedecimal
    • discount_pctdecimal
    Primeras 5 filas de order_items
    order_item_idorder_idproduct_idquantityunit_pricediscount_pct
    11001121931.990.00
    21001154311.990.00
    31002154411.990.00
    410021941149.000.00
    51002193219.990.00
    customers2,018 filas · 9 columnas
    • customer_idinteger
    • first_namevarchar
    • last_namevarchar
    • emailvarchar
    • cityvarchar
    • statevarchar
    • signup_datedate
    • segmentvarchar
    • referral_sourcevarchar
    Primeras 5 filas de customers
    customer_idfirst_namelast_nameemailcitystatesignup_datesegmentreferral_source
    1OwenHudsonowen.hudson@icloud.comSan FranciscoCA2022-06-02consumersearch
    2DouglasMendozadmendoza69@gmail.comAtlantaGA2022-06-02consumerNaN
    3HenryBrookshbrooks@lakesidecafe.comLos AngelesCA2022-06-04businessNaN
    4BrianGrahambgraham@bluecedarhomes.comSeattleWA2022-06-06businesspinterest
    5KyleJimenezkjimenez27@yahoo.comIndianapolisIN2022-06-07consumerNaN
    products120 filas · 8 columnas
    • product_idinteger
    • namevarchar
    • categoryvarchar
    • subcategoryvarchar
    • unit_pricedecimal
    • unit_costdecimal
    • launched_ondate
    • is_activeboolean
    Primeras 5 filas de products
    product_idnamecategorysubcategoryunit_priceunit_costlaunched_onis_active
    101Vale Velvet LoveseatFurnitureSofas1659.00NaN2023-09-11true
    102Alder Oak Coffee TableFurnitureTables919.00503.502024-05-16true
    103Orchard Rattan Dining ChairFurnitureChairs789.00429.872023-05-27true
    104Upland Oak BookcaseFurnitureStorage429.00214.702022-12-20true
    105Avery Leather Bed FrameFurnitureBeds449.00232.702021-08-31true
    returns1,673 filas · 5 columnas
    • return_idinteger
    • order_item_idinteger
    • returned_ondate
    • reasonvarchar
    • refund_amountdecimal
    Primeras 5 filas de returns
    return_idorder_item_idreturned_onreasonrefund_amount
    1142023-01-10damaged83.69
    2422023-01-10wrong_item19.99
    31052023-01-14wrong_item10.99
    4242023-01-16changed_mind26.99
    51262023-01-16late20.99
    employees60 filas · 8 columnas
    • employee_idinteger
    • first_namevarchar
    • last_namevarchar
    • departmentvarchar
    • titlevarchar
    • manager_idinteger
    • hire_datedate
    • salaryinteger
    Primeras 5 filas de employees
    employee_idfirst_namelast_namedepartmenttitlemanager_idhire_datesalary
    1CatherineHaleExecutiveChief Executive OfficerNaN2016-03-01285000
    2RobertKimExecutiveChief Operating Officer12017-01-09235000
    3MeganCollinsSalesHead of Sales12018-04-16172000
    4ChloeGutierrezSalesAccount Executive32020-01-2172000
    5FrankBellSalesAccount Executive32023-05-2173000
    web_sessions40,000 filas · 7 columnas
    • session_idinteger
    • customer_idinteger
    • started_attimestamp
    • devicevarchar
    • sourcevarchar
    • pages_viewedinteger
    • convertedboolean
    Primeras 5 filas de web_sessions
    session_idcustomer_idstarted_atdevicesourcepages_viewedconverted
    1NaN2023-01-01 23:02:24mobilepaid1false
    2182023-01-01 15:07:49desktoppaid1false
    3NaN2023-01-01 16:55:46desktopdirect7false
    4NaN2023-01-01 12:43:28mobileorganic3false
    5NaN2023-01-01 13:06:21mobilesocial2false
    marketing_spend3,276 filas · 3 columnas
    • spend_datedate
    • channelvarchar
    • amountdecimal
    Primeras 5 filas de marketing_spend
    spend_datechannelamount
    2023-01-01paid492.99
    2023-01-01email37.38
    2023-01-01social200.53
    2023-01-02paid709.13
    2023-01-02email64.13

    La lección

    Por qué los gráficos diarios tienen ruido

    Los ingresos de un día dependen de unas pocas docenas de pedidos. Un cliente empresarial que compra un juego de sofás puede duplicar un martes. Además, los días de semana y los fines de semana son distintos. Si dibujas cada día, la línea zigzaguea tanto que el movimiento real, el crecimiento lento de la temporada de fiestas, se esconde detrás de picos aislados. Los lectores entonces señalan el pico más alto y cuentan una historia sobre él.

    De pedidos a días

    order_date es una marca de tiempo con hora del día, así que agrupar por ella da un grupo por cada hora de pedido. resample corta un índice de fechas en periodos del calendario y rellena con cero los días sin pedidos:

    daily = lines.set_index("order_date").resample("D")["revenue"].sum()
    len(daily)   # 365: one value per day of 2025

    "D" son días, "W" semanas, "MS" meses que empiezan el día 1.

    Una media móvil de 7 días

    rolling(7) desliza una ventana de siete filas a lo largo de la Series. .mean() promedia cada ventana y la etiqueta con su último día:

    smooth = daily.rolling(7).mean()
    smooth.head(7)   # six NaN, then the mean of Jan 1 to Jan 7

    Los primeros seis valores faltan porque todavía no hay siete días. Siete es la ventana habitual para datos diarios de negocio: cada ventana contiene cada día de la semana exactamente una vez, así que el ritmo semanal se cancela y lo que queda es la tendencia.

    Leer la línea suavizada

    El valor suavizado del 4 de diciembre es el promedio del 28 de noviembre al 4 de diciembre: la semana después de Thanksgiving, con Black Friday, Cyber Monday y sus pedidos con el cupón BFCM25 dentro. Esa es la semana más fuerte de 2025. El día más fuerte, el 1 de diciembre, forma parte de ella, pero un solo día es una señal más débil. Fíjate en que la línea suavizada va retrasada: llega a su pico unos días después de que empieza la temporada, porque cada punto mira hacia atrás una semana.

    Errores comunes

    • Aplicar rolling sobre filas que no son días. Si faltan los días sin pedidos, rolling(7) abarca más de una semana. Remuestrea primero para que haya exactamente una fila por día.
    • Centrar por accidente, o no centrar nunca. rolling(7, center=True) etiqueta cada ventana con su día central, lo que elimina el retraso pero usa días futuros. Di cuál de los dos muestra tu gráfico.
    • Suavizar justo lo que te preguntaron. Si la pregunta es “¿qué pasó el Black Friday?”, muestra las barras diarias. Suavizar responde preguntas sobre tendencias.

    Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.