Walmart M5 Data Platform Step 11 report · Demand dashboard analysis
Step 11 · Dashboard 4

Demand dashboard: DAX, visualization, validation & findings

Analysis of the Power BI DEMAND page against data/gold_export/ (agg_demand_trends, agg_event_sales, dim_date).

KPIs match Gold 28D card uses Average Total Units (period) labeled Event table cleaned 1,941 demand days

Live Power BI dashboard

Published report walmart_visualization — Executive, Store, Product, and Demand pages on Gold aggregates. Open in Power BI ↗

Analysis pages: 08 Executive · 09 Store · 10 Product · 11 Demand · Overview

Part A — DAX measures used on Demand (Page 4)

Full catalogue: 08 Executive · Part A.

Daily Units =
SUM ( 'agg_demand_trends'[daily_units] )

Daily Sales Value (Demand) =
SUM ( 'agg_demand_trends'[daily_sales_value] )

Rolling 7D Units =
SUM ( 'agg_demand_trends'[rolling_7d_units] )

Rolling 7D Avg Units =
AVERAGE ( 'agg_demand_trends'[rolling_7d_avg_units] )

/* Use Average — never Sum across all days for a KPI card */
Rolling 28D Avg Units =
AVERAGE ( 'agg_demand_trends'[rolling_28d_units] )

Event Units =
SUM ( 'agg_event_sales'[units_sold] )

Event Sales Value =
SUM ( 'agg_event_sales'[sales_value] )
Measure / fieldVisualNote
[Daily Units]Card titled Total Units (period)Period total 67M
[Rolling 7D Avg Units]Card, combo line≈ 34.41K
[Rolling 28D Avg Units]Card≈ 956.66K (fixed from Sum → 2bn)
daily_units, rolling_7d_unitsLeft linePrefer avg for 7D companion; see §4
[Daily Sales Value (Demand)] + 7D avgComboSecondary Y-axis for units
[Event Units] / columnsEvent column + tableFrom agg_event_sales

Part B — Dashboard 4 screenshot (updated)

Latest Power BI DEMAND page: period total card labeled, 7D/28D averages, units line, event columns, sales combo, and event table with title and no bogus grand-total row.

Power BI Demand dashboard updated: Total Units period card, rolling averages, demand line, event chart, sales combo, event table without totals
Figure 1. Demand (Page 4, updated) — Total Units (period) 67M · 7D avg 34.41K · 28D avg 956.66K · event vs non-event table titled · combo sales + 7D avg
Total units
66.9M
Sum of daily_units
7D avg units
34.41K
Mean rolling_7d_avg_units
28D avg units
956.7K
Mean rolling_28d_units
Non-event share
92.2%
Of all units (most days)

1. Scope & method

Dashboard visualGold sourceValidation
KPI cards agg_demand_trends 67M · 34.41K · 956.66K match export
Units line daily_units, rolling_7d_units Day grain OK; scale gap remains (see §4)
Sales combo sales value + 7D avg units Dual axis; Active SKUs removed (was constant 3049)
Event column + table agg_event_sales Titled; no bad Total row; units/sales match Gold

2. Visualization & interaction

2.1 Layout

┌──────────────────────────────────────────────────────────────┐
│ [ year ] [ month ]   [ Total Units (period) ] [ 7D Avg ] [ 28D Avg ] │
│ [ Units line: daily vs rolling 7D ] [ Event by cat ]                 │
│ [ Sales $ vs 7D avg (combo) ] [ Event vs non-event table ]           │
└──────────────────────────────────────────────────────────────┘

2.2 Visual-to-field map

VisualTypeFields
Year / month Slicers dim_date[year], dim_date[month]
KPIs Cards [Daily Units], [Rolling 7D Avg Units], [Rolling 28D Avg Units]
Demand line Line X date · Y daily_units, rolling_7d_units
Event impact Clustered column X event_label · Legend cat_id · Y [Event Units]
Sales vs demand Line & column Column [Daily Sales Value (Demand)] · Line [Rolling 7D Avg Units] (secondary axis)
Event detail Table event_label, cat_id, days, units_sold, sales_value, avg_units_per_row

2.3 Interaction

3. Key pattern findings

3.1 Demand rises on a daily basis

Mean rolling 7-day average units ≈ 34.4K; mean rolling 28-day unit total ≈ 957K. Both trend upward across 2011–2016 on the daily charts. The KPI card is correctly labeled Total Units (period) (67M = sum of daily units in filter), distinct from the ~34K rolling 7-day average.

3.2 Most volume is on non-event days (expected)

SegmentDays (per cat)UnitsShare of units
non_event_day1,78361.7M92.2%
event_day1585.2M7.8%

Absolute event bars look small because there are far fewer event days. Fairer lens — units per day by category:

CategoryNon-event units/dayEvent units/dayLift
FOODS23,72922,952−3.3%
HOUSEHOLD7,6497,122−6.9%
HOBBIES3,2382,956−8.7%

In this M5 calendar definition, labeled event days are slightly weaker on average units/day than non-event days (holidays / closures like Christmas pull the event average down). Use the table’s avg_units_per_row and per-day rates — not only stacked totals.

3.3 Active SKUs is not a trend metric

active_skus is 3,049 every day (full catalog in the long fact). It was correctly removed from the time combo; do not bring it back as a line series.

3.4 FOODS still dominates event and non-event volume

On both event and non-event days, FOODS is the largest unit contributor — consistent with Executive / Product pages.

4. Dashboard quality notes

5. Recommendations

  1. Switch left line companion to rolling_7d_avg_units (Average).
  2. Confirm combo secondary Y-axis for units (or split into two charts).
  3. Interpret events with units/day, not only absolute stacks.
  4. Keep forecasting focus on FOODS baseline demand + holiday zero days.
  5. Sync year slicer with Executive.

6. Reproduce

python - <<'PY'
import pandas as pd
from pathlib import Path
P = Path('data/gold_export')
d = pd.read_parquet(P/'agg_demand_trends.parquet')
e = pd.read_parquet(P/'agg_event_sales.parquet')
print(d['daily_units'].sum(), d['rolling_7d_avg_units'].mean(), d['rolling_28d_units'].mean())
print(e.groupby('event_label')['units_sold'].sum())
PY

Screenshot: assets/demand-dashboard-page4.png. Related: 08 · 09 · 10.