Data
03 / BI and data analyst· Analytics

An end-to-end BI build: realistic personal-finance exports, a tested SQL model in DuckDB, and a four-question Power BI report generated from code.

Year
Oct 2026
Status
Public
Stack
Python, DuckDB, SQL, DAX
checks
15 reconciled
Power BI page 'Where does it go?': Sankey from gross pay to tax, provident fund, fixed costs, discretionary spend, investments and cash
01

Personal finance data is scattered across a bank statement, a credit card, payslips, fund confirmations, a provident-fund passbook and loan schedules. Each answers a narrow question; none answers the ones that matter: where the money goes, what it built, whether things are improving, and when work becomes optional.

02

A seeded generator writes the exports a Hyderabad software engineer would have over 60 months, mess included: UPI references, card bills that pay last month's spending, bonus months, a broken fixed deposit. Plain SQL in DuckDB types them into one ledger, sorts 2,818 transactions with regex rules kept as data, builds loan amortisation with a recursive CTE, and produces report-ready marts. The Power BI project (model and pages) is generated from the schema, not clicked together.

03

The export is blocked unless 15 reconciliation checks pass: bank balances chain line by line, salary credits match payslips, EMIs match the schedule, the cashflow identity holds every month. The checks were tested by corrupting the data six different ways; each was caught. Every headline measure was queried from the running Power BI model and matched DuckDB exactly.

04

SYNTHETIC, NOT TOYpublishable, but messy enough to need real cleaning
REPORT AS CODEgenerated TMDL + PBIR: reviewable, reproducible
ACCRUAL SPENDcard spend counts when it happens, not when it's paid