WorkCase 03Public data dashboard
Case 03Data pipeline
Ten public datasets, cleaned, checked and queryable.
My own business numbers stay private, so I built a dashboard on real public data. Python scripts download and clean each source and write JSON and parquet; the dashboard draws the charts and runs live SQL in your browser. The checks are written down next to the data.
- Role
- Analyst, personal project
- Data
- 11 public sources, 10 analyses
- Refreshed
- Oct 7, 2026
- Stack
- Python, JSON and parquet, ECharts, DuckDB-WASM
- Label
- Public data, not my business
The pipeline, like a ground station
Step 6Query
Live SQL in your browser.
DuckDB-WASM runs SQL on the published parquet tables in your browser, with nothing to install.
A schematic drawn like a ground station. Eleven public sources (Census, FRED, NY Fed, Port of LA, City of LA, UCI, CFPB, Stack Overflow, Census BTOS, Olist and CA DGStats) send data down to Python cleaning scripts. The scripts check the numbers back against the primary source, then write JSON and parquet. JSON feeds the charts (ECharts) and parquet feeds Live SQL (DuckDB-WASM), and both end in the dashboard in your browser.
- Sources
- Clean
- Verify
- Store
- Chart
- Query
Cross-check · Census MTIS
415 months, 0 differences
Both inventories-to-sales ratios equal the Census workbook, not only FRED's copy.
Live SQL · DuckDB-WASM
Query the tables yourself
Write SQL and see the answer in your browser.
01Context
Real data I can show.
The numbers from my own business stay private. To show how I work with data, I built a dashboard on real public data: ten analyses, each with its question, source, period, licence and query. Every chart carries the same label: public data, not my business.
02The pipeline
From the source to your browser.
Each analysis runs the same way, so every number on the page can be traced back to where it came from.
- 01SourcesEleven public sources, each with its licence and period recorded.
- 02CleanA Python script downloads and cleans each source, and the cleaning steps are written down with the data.
- 03VerifyThe numbers are cross-checked against the primary source.
- 04StoreSmall JSON files for the charts, parquet tables for SQL.
- 05ChartOne clear chart per question, with its source, period and caveat.
- 06QueryLive SQL on the tables, in your browser, with DuckDB-WASM.
03One real query
Which lead sources close?
This is the query behind the sales analysis, exactly as it runs on the published table, with its output. Public data, not my business.
seller_leads · 8,000 rowsMarketing Funnel by Olist · CC BY-NC-SA 4.0
SELECT origin, count(*) AS leads,
count(*) FILTER (WHERE won) AS won,
round(100.0 * count(*) FILTER (WHERE won)
/ count(*), 1) AS conversion_pct
FROM seller_leads
WHERE first_contact_date >= DATE '2018-01-01'
GROUP BY origin
ORDER BY conversion_pct DESC
| origin | leads | won | conversion_pct |
|---|---|---|---|
| (null) | 48 | 13 | 27.1 |
| unknown | 813 | 168 | 20.7 |
| paid_search | 1,182 | 175 | 14.8 |
| organic_search | 1,736 | 255 | 14.7 |
| direct_traffic | 380 | 54 | 14.2 |
| referral | 211 | 24 | 11.4 |
| other_publicities | 41 | 3 | 7.3 |
| display | 75 | 5 | 6.7 |
| social | 1,051 | 66 | 6.3 |
| 347 | 14 | 4.0 | |
| other | 114 | 4 | 3.5 |
What it says: organic and paid search leads closed 14.7% and 14.8% of the time in early 2018, against 6.3% for social and 4.0% for email, even though social brought 1,051 leads. "Unknown" is Olist's own label for 813 leads with no tracked channel.
Olist, Marketing Funnel by Olist (Kaggle) · CC BY-NC-SA 4.0 · 8,000 anonymized marketing qualified leads, June 2017 to May 2018 · public data, not my business · full analysis in the dashboard
04Verification
Checked against the primary source.
The four newest analyses were each re-run from a fresh download into an empty folder, then checked against the publisher's own files. No number was typed by hand.
- US e-commerce share · CensusAll 107 quarters of both Census workbooks equal FRED, with 0 mismatches, and the latest five quarters match the Census release PDF.
- Retail inventories-to-sales ratio · Census MTISAll 415 months of both ratios equal the Census workbook, not only FRED's copy.
- Port of LA container volumeLoaded and empty imports and exports add up to the port's own total in all 140 months.
- Global supply chain pressure · NY FedThe download equals the latest column of the NY Fed interactive data for all 345 months.
- Online retailer registrations · City of LACounts by ZIP from the API equal a local count of all 1,951 downloaded rows.
When a source has a problem, I write it down instead of smoothing it over. The Port of LA's November 2020 total cell is malformed, so the file uses the sum of its parts, which matches the port's 2020 annual total.
05Sources
Eleven sources, with their licences.
| Source | Dataset | Licence | Period |
|---|---|---|---|
| US Census Bureau | Quarterly Retail E-Commerce Sales; Manufacturing and Trade Inventories and Sales | US federal government work, public domain | 1999 Q4 to 2026 Q2; Jan 1992 to Jul 2026 |
| FRED, St. Louis Fed | ECOMPCTSA, ECOMPCTNSA, RETAILIRSA, ISRATIO (cross-checks) | Public Domain: Citation Requested | Same as the Census series |
| Federal Reserve Bank of New York | Global Supply Chain Pressure Index | NY Fed Terms of Use, with credit line | Jan 1998 to Sep 2026 |
| Port of Los Angeles | Container Statistics, TEU by month | Free of charge with credit; no formal licence text | Jan 2015 to Aug 2026 |
| City of Los Angeles Open Data | Listing of Active Businesses | CC0 1.0 | Snapshot, updated Sep 15, 2026 |
| UCI Machine Learning Repository | Online Retail II | CC BY 4.0 | Dec 2009 to Dec 2011 |
| CFPB | Consumer Complaint Database, student-loan complaints | CC0, as stated in the CFPB API metadata | Jan 2023 onward, as of Oct 5, 2026 |
| Stack Overflow | Developer Survey 2025 | ODbL 1.0 | Fielded May 29 to June 23, 2025 |
| US Census Bureau, BTOS | Business Trends and Outlook Survey, AI questions | US government data; no separate licence stated | As of Sep 22, 2026 |
| Olist | Marketing Funnel by Olist | CC BY-NC-SA 4.0 | June 2017 to May 2018 |
| California DGStats | Interconnected applications, SCE 5-year export | No open licence; the publisher's Terms of Use apply | As of Aug 31, 2026 |
06What I learned
Public data moves.
Write the check down, next to the number.
Public data gets revised. Census revised its monthly retail estimates after the release I built from, and the NY Fed re-estimates the whole supply chain index every month, so each file records its release and vintage. That taught me to treat a number as finished only when I can show where it came from.
07Tools
What it runs on.
- PythonDownload, cleaning and check scripts, one per analysis.
- SQLThe method and sample queries for every analysis.
- JSON and parquetJSON for the charts, parquet tables for SQL.
- EChartsThe interactive charts in the dashboard.
- DuckDB-WASMLive SQL in the browser, nothing to install.
08Contact
Want this kind of reporting on your data? Let's talk.
Open to e-commerce, data and operations roles. Los Angeles or remote.