Every politician has a line about jobs. I wanted the number behind the line — not the headline rate, but the shape of who is working, in what, full-time or part, and how that's shifted.
So I built the whole stack an analyst actually uses: ingest → transform → store → model → visualise. Python pulls the ABS Labour Force series straight off the API, pandas cleans and reshapes it, Azure SQL stores and models it through a layered view pattern, and Power BI sits on top as a 4-page report covering the national picture, the states, industries, and the full-time / part-time split.
This page is that report, told as a story — the strongest findings first, the engineering that makes them trustworthy underneath.
Everything here comes from the Australian Bureau of Statistics — the same Labour Force survey the RBA and Treasury quote. I hit the ABS Data API directly (no key required): the monthly Labour Force series for the national, state and full-time/part-time numbers, and the annual Labour Account for employment by industry. The national series runs back to February 1978 and is current to early 2026.
The pipeline is deliberately boring, which is the point. The raw ABS output is messy multi-dimension data with coded labels and a wide shape; I parse the time periods, map the dimension codes to readable names, and reshape it long. The cleaned data lands in Azure SQL staging tables, then a staging → mart view layer shapes the metrics. Power BI only ever reads the curated mart views — never the raw tables.
The Power BI report itself is generated by a Python script, not hand-built in Desktop. One build_report.py writes the data model, every visual, the 15 DAX measures and a custom colour theme as text files. So the entire dashboard is diff-able, reviewable and version-controlled like code — if it ever corrupts, I regenerate it instead of fighting a binary .pbix.
It runs on serverless Azure SQL, which auto-pauses when idle — the whole thing costs roughly $2–6 a month, almost all of it storage rather than compute.

Insight one: full-time work isn't shared evenly. The part-time economy is overwhelmingly female.

“The headline rate hides the composition. Who works full-time, and where, is the part that actually moved.”
Insight two: the labour market is tight almost everywhere — the states barely differ.
I expected wide regional gaps. Instead the spread between the highest and lowest state unemployment rate is under 0.9 of a percentage point — Tasmania at the top, Western Australia at the bottom, everyone bunched in between.

Insight three: health care is the country's biggest employer — but here's where I have to be honest about the data.
By headcount, Health Care & Social Assistance and Retail Trade sit at the top of the industry table. But the industry breakdown comes from the annual ABS Labour Account, which lags badly — it ends at 2022, while everything else on the dashboard is current. I confirmed via the live API that it's stale at source, so rather than quietly mix a 2022 series with current numbers, I labelled every industry title with its vintage. Knowing a source's recency before you build on it matters more than any chart.

- 01Replace the stale annual industry source with a current quarterly Labour Force Detailed “employed by industry” series, so every page is current to the same month.
- 02Fix the missing ACT & NT in the state mart view — chase the gap back through staging → mart filtering.
- 03Harden the Azure side: a budget + cost alert, secrets in Key Vault, and Azure AD auth to the SQL DB instead of a SQL login.