Gardner Thornhill

data director at Mississippi Data Hub

I turn raw data, from ticket prices to live feeds, into something a team can run on. Pipelines in dbt and BigQuery, automation in Python, results in the browser.

selected_work/

All 7 case studies →

Where Do I Vote MS

11,352people found their polling place

I built a nonpartisan polling place finder in under two days, from the data pipeline to the mobile experience. Launched a week before the 2026 election; reached 21,390 visitors and all 82 Mississippi counties.

NXTStopHealth

research application

A desktop research tool for Jackson Free Clinic that measures access to JTRAN bus service and saves confirmed measurements locally, without retaining entered addresses.

NYC Poll Tracker

100k+views on primary day

Live wait times at every polling site in New York City during the 2025 mayoral primary, rolled up to Council, Assembly, Senate, Congressional, and Election District.

Travis County Early Vote

170,891early votes tracked, 2026 primary

A live early-vote dashboard for Travis County, Texas: daily turnout and partisanship paced against 2024, with a model projection of where the final count lands.

MSU Attendance Model

2,229seat leave-one-out RMSE

A Python package and CLI that forecasts Mississippi State home-game attendance from season-relative resale prices. Its first saved live forecast missed by 1,978 and covered the actual crowd in its 80% range.

2,425 Precincts

32special elections, 13 states

A hand-built precinct dataset comparing 2026 special-election results with 2024 presidential margins, generic-ballot polling, and presidential approval at the time of each race.

Transfer Portal

~530transfers, 2022 to 2024

How well Group of Five players hold up after moving to the Power Five: regression and correlation analysis by position group on PFF data.

what_i_build/

five areas, click to expand

dbt projects laid out as staging, intermediate, and marts on BigQuery, with data-quality tests in the pipeline and fuzzy matching where the source systems disagree about who a record is.

  • SQL
  • BigQuery
  • dbt
  • data-quality testing
  • fuzzy matching

Python that replaces manual work: browser automation with Playwright, TOTP-authenticated logins, REST clients packaged as reusable libraries, pytest suites, and jobs scheduled on Google Cloud and GitHub Actions.

  • Python
  • pandas
  • pytest
  • REST API client design
  • Playwright
  • TOTP/2FA automation
  • Google Cloud scheduled jobs
  • GitHub Actions CI

Precinct and boundary work in QGIS: matching, consolidating, and geocoding at scale with Census boundary data and batch geocoders, then turning the result into maps a decision can rest on.

  • QGIS
  • shapefiles, KML, GeoJSON
  • Census API and boundary data
  • Census batch geocoding
  • Google geocoding

Code-based BI in Observable Framework on top of warehouse marts, deployed like software, plus the application layer around it when a dashboard is not enough.

  • Observable Framework
  • Tableau
  • Django
  • FastAPI
  • React
  • TypeScript
  • Netlify
  • Git and GitHub

Statewide GOTV texting from lists and scripts through A/B tests and opt-out screening; race and age models; turnout-first targeting; and VAN, text, and ad audiences built from voter files and partner records in BigQuery.

  • NGP VAN administration and training
  • VAN/MyCampaign API
  • voter file analysis
  • wru and household modeling
  • GOTV targeting
  • A/B testing
  • opt-out screening
  • turf cutting

experience/

full résumé

Mississippi Data Hub

Data Director
Sept. 2026 to present

  • Ran the fall GOTV texting program end to end (lists, scripts, A/B tests, opt-out screening): 675,959 texts reached 415,090 voters in all 82 counties. A shorter script raised clicks 26%, and a youth picture text got 3× the click rate.
  • Replaced the vendor's race and age fields with our own models. The race model (wru + household) predicted precinct results better than the vendor's race field (R² .90 vs .80). The age model, tested on North Carolina's voter file, found twice as many 18–29 voters.
  • Built the analysis behind our turnout-first targeting strategy (precinct returns, vote history, primary turnout). It set tiered GOTV lists for 343K infrequent Black voters in 2026, plus a 367K-voter target and district win numbers for the 2027 legislative races.
  • Delivered 10+ VAN, text and ad lists, such as 343K GOTV tiers, 98K absentee voters 65+, 137K Black voters 18–45, and 230K inactive voters matched to VAN at 99.7%. Scheduled digital ads and combined 380K+ partner records in BigQuery to find overlaps and gaps.
  • Built and launched wheredoivotems.org in under two days. It's a nonpartisan polling place finder, 99.9% accurate when tested against the voter file. 21,390 people visited and 11,352 found their polling place in all 82 counties, including 2,092 whose site had moved. A/B tests doubled sharing.
  • Built the MS Data Hub for partner groups: live election-night results, a daily early vote tracker combining VAN exports with state reports, and results by precinct. Also built Turfbook, where partner groups claim turf and canvass by phone; 11 groups used it.

Pennsylvania Democratic Party

Data Associate, Voter Protection
Harrisburg, PA
June 2026 to September 2026

  • Automated GOTV turf-packet generation end to end with Python, Playwright, and TOTP-authenticated VAN worker accounts, cutting a 24-hour manual process to under one hour, and planned statewide delivery of pre-printed packets to staging locations.
  • Engineered a ~3,100-line Python replay harness with a pytest suite to backtest a dbt vote-by-mail ballot-cure model against historical election data before it went to production.
  • Migrated the team's BI layer from Tableau to a code-based analytics site built with Observable Framework on dbt/BigQuery marts, shipped on Netlify with user documentation, alongside a self-updating public voter registration tracker refreshed by GitHub Actions.
  • Built the team's VAN integration layer: a reusable Python client library adopted as standard tooling, plus a reverse-engineered URL-obfuscation algorithm that enables direct voter-record links from dashboards.
  • Shipped an enrichment pipeline that matches new user accounts in BigQuery to voter registration, party, ballot status, and support score, and geocodes each address to seven boundary levels.
  • Served as the team's precinct and boundary GIS specialist: matched 99.8% of 9,075 precincts to Census boundaries after surfacing a silent ~900-precinct mismatch, consolidated geometries in QGIS, and geocoded ~8,000 polling locations.
  • Produced a geospatial analysis of Spanish-speaking precincts that informed a Spanish-language ballot-access decision covering two counties, and trained 20 field organizers on VAN.

Harvard Extension School

Data Science coursework. CSCI 101, Foundations of Data Science and Engineering, grade A.

2025

Mississippi State University

B.A., History. Coursework in Statistics, Computer Programming, and Public Policy. Dean's List twice, President's List Spring 2023.

December 2023

writing/

All articles →

questions/

a little more about my work

I'm the Data Director at Mississippi Data Hub, where I started in September 2026. I ran a statewide GOTV texting program that reached 415,090 voters in all 82 counties, built race and age models and turnout targeting, and delivered partner data tools in BigQuery and VAN. I also built Where Do I Vote MS, the MS Data Hub's election dashboards, and Turfbook, which 11 partner groups used to coordinate canvassing.

SQL, dbt, and BigQuery for modeling and warehousing. Python with pandas, pytest, and Playwright for automation. Observable Framework for code-based BI. QGIS and the Census API for geospatial work. GitHub Actions and Google Cloud for scheduling and CI.

Sports, civic data, and operational analytics. I build football attendance forecasts, live dashboards, data pipelines, and geospatial analysis. My case studies cover how the systems work; my articles explore what the data says.

Contact me

jgardnerthornhill@gmail.com

Have a question about my work or want to connect? Email gets the fastest reply.