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.

  1. Sources
  2. Clean
  3. Verify
  4. Store
  5. Chart
  6. 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.

  1. 01SourcesEleven public sources, each with its licence and period recorded.
  2. 02CleanA Python script downloads and cleans each source, and the cleaning steps are written down with the data.
  3. 03VerifyThe numbers are cross-checked against the primary source.
  4. 04StoreSmall JSON files for the charts, parquet tables for SQL.
  5. 05ChartOne clear chart per question, with its source, period and caveat.
  6. 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
Output · leads first contacted Jan to May 2018
originleadswonconversion_pct
(null)481327.1
unknown81316820.7
paid_search1,18217514.8
organic_search1,73625514.7
direct_traffic3805414.2
referral2112411.4
other_publicities4137.3
display7556.7
social1,051666.3
email347144.0
other11443.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.

SourceDatasetLicencePeriod
US Census BureauQuarterly Retail E-Commerce Sales; Manufacturing and Trade Inventories and SalesUS federal government work, public domain1999 Q4 to 2026 Q2; Jan 1992 to Jul 2026
FRED, St. Louis FedECOMPCTSA, ECOMPCTNSA, RETAILIRSA, ISRATIO (cross-checks)Public Domain: Citation RequestedSame as the Census series
Federal Reserve Bank of New YorkGlobal Supply Chain Pressure IndexNY Fed Terms of Use, with credit lineJan 1998 to Sep 2026
Port of Los AngelesContainer Statistics, TEU by monthFree of charge with credit; no formal licence textJan 2015 to Aug 2026
City of Los Angeles Open DataListing of Active BusinessesCC0 1.0Snapshot, updated Sep 15, 2026
UCI Machine Learning RepositoryOnline Retail IICC BY 4.0Dec 2009 to Dec 2011
CFPBConsumer Complaint Database, student-loan complaintsCC0, as stated in the CFPB API metadataJan 2023 onward, as of Oct 5, 2026
Stack OverflowDeveloper Survey 2025ODbL 1.0Fielded May 29 to June 23, 2025
US Census Bureau, BTOSBusiness Trends and Outlook Survey, AI questionsUS government data; no separate licence statedAs of Sep 22, 2026
OlistMarketing Funnel by OlistCC BY-NC-SA 4.0June 2017 to May 2018
California DGStatsInterconnected applications, SCE 5-year exportNo open licence; the publisher's Terms of Use applyAs 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.