How this forecast works
The short version
This forecast estimates, for each of the 228 Pennsylvania legislative seats on the ballot on November 3, 2026, the chance that a Democrat or Republican wins it, then simulates the election 40,000 times to see how often each party ends up controlling the State House (102 of 203 seats) and the State Senate (26 of 50, counting the 25 seats not up this year).
It works in four layers, in this order:
- District baseline. How much more Democratic or Republican than the state is each district? We measure that from the 2024 presidential, 2022 governor and 2022 U.S. Senate results, and the 2020 presidential result, all on the current district lines, plus the district's own most recent legislative result.
- Candidate layer. Who is actually on the ballot? Incumbents get a bonus. Open seats lose it. Unopposed candidates win. Fundraising, the incumbent's track record, and whether a seat is on a party committee's target list all nudge the expected margin.
- Statewide environment. How is 2026 shaping up for each party in Pennsylvania? We average every public poll of the governor's race, the generic ballot in Pennsylvania and nationally, and Shapiro's approval, weighting by recency, sample size, pollster quality and sponsorship. We combine that with a structural prior (the president's party usually loses ground in midterms) and turn it into a single statewide swing from the 2024 presidential result that is applied to every district.
- District polls and outside ratings. Where a public poll of a specific district exists, it is blended with the fundamentals in proportion to how much it tells us. Where outside analysts have rated a seat, their rating is converted into an implied probability and blended in as a prior with a capped weight, never copied.
Then the simulation adds three layers of error: a statewide miss shared by every district (the polls could all be wrong in the same direction), a regional miss shared by neighbouring districts (Philadelphia's collar counties tend to move together), and district-specific noise. Fat-tailed distributions are used for the shared errors, so a 2016-style systematic polling miss is a real possibility, not a rounding error.
What each layer does, in more detail
1. District baseline
For each reference race we compute the district's two-party Democratic margin minus the statewide two-party margin in the same race. That difference is the district's lean. The leans from the four races are averaged with the weights in the config (2024 president 45%, 2022 governor 20%, 2022 Senate 20%, 2020 president 15%). The district's last legislative result is turned into a lean the same way, by subtracting the statewide aggregate of contested legislative races that year and removing the then-incumbent's bonus, and blended at 30% when the race was contested.
Why not just use the last legislative result? Because a third of PA House races are uncontested, and incumbents who win by 40 points in a district that voted for Trump by 2 are telling you about themselves, not about the district. The statewide races are the cleanest measure of partisanship on identical lines.
2. Candidate layer
- Incumbency is worth 2.8 points. That is lower than the textbook figure from the 2000s because incumbency advantage has shrunk sharply as races have nationalised.
- An incumbent who ran ahead of their district's lean last time keeps 35% of that over-performance, capped at 6 points.
- Fundraising enters as the log of the ratio of Democratic to Republican cycle receipts, 1.6 points per factor of ten, capped at 4 points. Money matters less than people think once both sides can afford mail.
- Seats on a caucus or national committee target list are pulled 0.75 points toward even per list (max two lists). The committees know things about candidate quality that are not in the public record; a seat they are spending on is closer than its lean suggests.
- A seat with only one major-party candidate is fixed at a 99.5% win probability for that candidate.
- Manual candidate-quality overrides are allowed but every one must be listed in the config with a written reason. There are currently none.
3. Statewide environment
Each poll type is first turned into an estimate of a "generic" legislative race in Pennsylvania:
- A true Pennsylvania *legislative* generic ballot poll would be used directly. None has been published in 2026 (PennLive/Bravo asked one in September but released only an image). What does exist is Pennsylvania voters' preference for control of the U.S. House (Quinnipiac, Franklin & Marshall); those are treated as a PA-specific congressional generic and passed through at 80%.
- The governor race is adjusted for Shapiro's personal popularity. He ran 10 points ahead of Fetterman in 2022 on the same ballot; we assume a similar personal vote in 2026 and pass through only half of the remaining signal, because popular incumbent governors have weak coattails.
- The national generic ballot is shifted by Pennsylvania's lean relative to the country and passed through at 80%, since state legislative races track national mood but imperfectly.
- Shapiro's net approval is converted with a small slope and gets the lowest weight.
Within each type, polls are weighted by recency (half-life of 14 days), sample size (square root), pollster rating (letter grades from public pollster ratings; unrated pollsters are discounted), and sponsorship (partisan-sponsored polls get half weight and are shifted 2 points against the sponsor). A pollster's second, third and later polls count progressively less so no single prolific pollster dominates.
The combined poll estimate is then blended with a structural prior equal to the 2024 result plus a 4-point midterm swing against the president's party. The prior is worth the equivalent of 1,500 poll respondents, so once a few thousand people have been polled, the polls dominate.
4. District polls and external ratings
District polls are averaged with the same machinery (half-life 21 days). Internal and partisan polls get 40% weight and are shifted 3.5 points against their sponsor, because released internals are selected for good news. The poll average's weight against the fundamentals is n/(n+900), so one 500-person poll moves a seat about a third of the way to the poll, three polls about 60%.
External ratings (State Navigate, CNalysis, Sabato's Crystal Ball, Ballotpedia's battleground list) are mapped to probabilities (Toss-up 50%, Lean 74%, Likely 88%, Safe 98%), converted to a margin using the model's own error scale, and blended into the expected margin with per-source weights that sum to at most 35%. The methodology page's sensitivity table shows exactly how much each source is currently moving the forecast, seat by seat and in chamber-control terms.
How this differs from State Navigate and other outlets
- State Navigate publishes ratings and district polls. We use both, but as inputs with explicit, capped weights, and we publish a probability for every seat rather than a category for selected seats. Where our number disagrees with their rating, the district page shows why.
- Sabato's Crystal Ball and Ballotpedia rate chamber control and list battleground seats. We produce a chamber-control probability from a seat-level simulation rather than a judgement call, and the battleground list is one weak input among many.
- Caucus and committee target lists are treated as a signal about candidate quality and spending, not as a forecast.
- Prediction markets (Kalshi, Polymarket) are shown on this page for comparison and are never used as an input. Markets on state legislative control are thin and move on the same news the model already sees.
- Decision Desk HQ's congressional forecast is used only as a sanity check on the statewide environment, since the same voters elect both.
What the backtests say
Run on the 2022 and 2024 elections with only pre-election data (see the Backtest page for the full tables):
- 2022: 135 of 141 contested seats called correctly, Brier score 0.034, mean absolute margin error 5.4 points, 90% of actual margins inside the 90% range. Forecast House Democrats 101.2 (range 94 to 109); actual 102.
- 2024: 120 of 125 contested seats called correctly, Brier score 0.029, mean absolute margin error 5.3 points, 97% coverage. Forecast House Democrats 103.1 (range 97 to 110); actual 102.
- The statewide environment was the weak point in 2024: polls had Pennsylvania roughly even and Trump carried it by 1.7, and legislative Democrats in contested seats ran about 1.5 points behind their districts' presidential lean on top of that. The statewide error term was widened from 3.0 to 3.5 points in response. No systematic legislative-versus-top-of-ticket offset is applied because the two cycles disagree on its sign (+0.6 in 2022, -4.3 in 2024).
A note on Senate ties
The Senate has 50 seats, so a 25-25 result is possible and the model reports its probability separately. Under Pennsylvania's constitution the Lieutenant Governor presides over the Senate and breaks tie votes, but organisation of the chamber in a tie is a political negotiation rather than an automatic outcome, so the forecast does not assign a tied chamber to either party.
Known limitations
- Only one organisation, State Navigate, has published district-level polls in 2026: 25 polls across 16 House and 9 Senate districts, all in seats already considered competitive. Every other seat is forecast from fundamentals alone. The error bars reflect that.
- The incumbency and fundraising coefficients are set from the political-science literature and the 2022/2024 backtests, not fitted to 2026 data (there is none yet).
- Campaign finance is cycle-to-date receipts from PA Department of State filings. For most candidates the latest report in the state's export is the 30-day post-primary report (June 2026); only about a fifth had the September 22 pre-election report in the export as of October 9. Low-confidence committee matches are ignored, receipts under $1,000 are treated as no data, and late money and independent expenditures are not captured.
- The backtests cannot include district polls, outside ratings, target lists or finance for past cycles because no point-in-time archive of those exists. The backtests therefore test the fundamentals and environment layers only.
- The model is two-party, with one extension: where a major party has no nominee but an independent is on the ballot (Senate District 46, House District 145), the independent is modelled as the challenger, starting from what a generic candidate of the missing party would get minus a 6-point no-party penalty, with wider uncertainty and the district polls used directly. An independent win counts for neither party's majority, which is why the chamber odds include a small "no majority" share beyond 25-25 ties.
- Vacancies and special elections change who "holds" a seat; the config has a
specialslist for that.
How much each outside source moves the forecast
We re-run the model with each source removed. The difference is exactly how much that source is worth in the current forecast.
| Source removed | House P(D control) | Δ | House D seats | Δ | Senate P(D control) | Δ | Seats moved >5 pts | Most-moved seat | Max move |
|---|---|---|---|---|---|---|---|---|---|
| Full model | 98.9% | 111.8 | 28.8% | ||||||
| no external ratings | 99.0% | -0.1 | 111.8 | -0.0 | 24.0% | +4.8 | 4 | H72 | 8.2 pts |
| no target lists | 99.2% | -0.3 | 112.0 | -0.2 | 27.0% | +1.8 | 0 | H137 | 3.6 pts |
| no campaign finance | 98.7% | +0.2 | 111.7 | +0.1 | 28.7% | +0.1 | 3 | H13 | 7.0 pts |
| no district polls | 98.9% | -0.1 | 111.5 | +0.3 | 21.7% | +7.1 | 7 | S46 | 20.1 pts |
| no ballotpedia | 98.9% | -0.1 | 111.7 | +0.0 | 28.3% | +0.4 | 0 | S40 | 1.6 pts |
| no sabato | 98.9% | -0.1 | 111.7 | +0.0 | 28.6% | +0.2 | 0 | H142 | 1.0 pts |
| no state navigate | 99.0% | -0.1 | 111.8 | -0.0 | 24.1% | +4.7 | 4 | H72 | 8.2 pts |
Δ is read as "full model minus model-without-this-source". Rows labelled "no [source]" remove one ratings outlet; "no external ratings" removes all of them.
Prediction markets (cross-check only)
Markets are never an input to the model. They are shown so readers can compare.
Every weight and assumption
This is the complete configuration file the model ran with. Change a number here (in config/model_config.yaml) and the whole forecast re-derives from it.
Show configuration
# =====================================================================
# PA General Assembly 2026 Forecast — MODEL CONFIGURATION
# =====================================================================
# Every weight, prior, and assumption used by the model lives in this
# file. The pipeline reads it on every run; nothing is hard-coded.
# All margins are DEMOCRATIC two-party margins in percentage points
# (positive = Democrat ahead). "Lean" = district margin minus the
# statewide margin in the same race.
#
# Units cheat-sheet: pts = percentage points of two-party margin
# prob = probability 0..1
# =====================================================================
election:
date: "2026-11-03"
cycle: 2026
house_seats: 203
house_majority: 102
senate_seats_total: 50
senate_majority: 26
# Senate seats up in 2026 are the EVEN-numbered districts (last elected 2022;
# odd districts were elected in 2024 and hold over).
senate_up: [2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50]
# Party now holding each seat (used for "flip" lists and holdovers)
# is read from data/processed/current_holders.csv, built by the
# pipeline from the 2024 (House, even Senate) and 2022 (odd Senate)
# results plus any special elections listed under `specials` below.
# 2026 special elections (sources: PA DoS, Ballotpedia; see data/raw/ratings/NOTES.md).
# The candidates file's incumbent_party already reflects these; listed here for the record.
specials:
- {chamber: house, district: 12, winner_party: D, date: "2026-08-18", note: "Dukes (D) flips Trump+18 seat; House becomes 103-100 D"}
- {chamber: house, district: 22, winner_party: D, date: "2026", note: "D hold"}
- {chamber: house, district: 42, winner_party: D, date: "2026", note: "D hold"}
- {chamber: house, district: 79, winner_party: R, date: "2026", note: "R hold"}
- {chamber: house, district: 193, winner_party: R, date: "2026", note: "R hold"}
- {chamber: house, district: 196, winner_party: R, date: "2026", note: "R hold"}
# ---------------------------------------------------------------------
# 1. DISTRICT BASELINE (partisan lean on current lines)
# ---------------------------------------------------------------------
baseline:
# Weighted average of district leans (district margin minus statewide
# margin) across reference races. Weights are renormalised over the
# races that actually have data for a district.
lean_weights:
pres_2024: 0.45 # most recent, highest turnout, best proxy for 2026 coalition
gov_2022: 0.20 # Shapiro's 2022 coalition — relevant because he tops the 2026 ticket
sen_2022: 0.20 # Fetterman/Oz — a "generic-ish" midterm race
pres_2020: 0.15 # older; included to damp single-race noise
# Statewide two-party Dem margins for the same races (used to convert
# district shares to leans). Filled from actual_statewide.csv when present;
# these are fallbacks and are overwritten by data.
statewide_margin_fallback:
pres_2024: -1.71
gov_2022: 14.80
sen_2022: 4.93
pres_2020: 1.17
# Blend the lean-based estimate with the district's own most recent
# legislative result (expressed as a lean vs that year's statewide
# legislative environment). Legislative results carry candidate-specific
# information but are noisier and often uncontested.
legislative_result_weight: 0.30 # 0 = ignore past legislative result; 1 = use only it
# Past legislative result is ignored when that race was uncontested or
# the winner's margin exceeded this (effectively uncontested).
legislative_result_max_margin: 60
# Statewide "legislative environment" implied by the aggregate of all
# contested legislative races in that year, computed from data; the
# fallback is used only if the computation fails.
legislative_environment_fallback:
2022: 1.5
2024: -1.0
# ---------------------------------------------------------------------
# 2. CANDIDATE LAYER
# ---------------------------------------------------------------------
candidates:
incumbency_advantage_pts: 2.8 # literature on 2010s-2020s state legislatures: ~2-4 pts and shrinking
# An incumbent's over-/under-performance vs their district's lean in
# their last race, shrunk toward zero and carried forward.
prior_performance_carryover: 0.35 # fraction of past over-performance that persists
prior_performance_cap_pts: 6.0 # cap on carried-over over-performance
# Campaign finance: effect per unit of log10(D receipts / R receipts),
# computed on cycle-to-date receipts, floored at $1,000 each side.
finance_pts_per_log10_ratio: 1.6
finance_cap_pts: 4.0
# Receipts below this are treated as "no data" (committee-matching gaps in
# the DoS export show up as $0 for candidates who clearly raised money).
finance_min_receipts_for_signal: 1000
# Committee matches flagged match_confidence=low in finance_2026.csv
# (surname-only rules) are ignored entirely; see data/raw/finance/NOTES.md.
# Most finance figures are as of the 30-day post-primary report (June 2026);
# the Sept 22 pre-election reports were only partly in the DoS export on Oct 9.
# Where finance data is missing for either side, assume parity (0 effect).
# Candidate-quality adjustment: manual, documented overrides, in pts.
# Format: {chamber: house, district: 12, adjustment_pts: -1.5, reason: "..."}
quality_overrides: []
# Target-list signal: being on a caucus/national committee target list
# is treated as evidence of a credible, funded challenger (pulls margin
# toward 0) and of spending. Applied once per side regardless of how
# many lists name the seat.
target_list_pts_toward_zero: 0.75
target_list_max_lists_counted: 2
# Independent challengers: when one major party has no nominee but an
# independent / third-party candidate is on the ballot against the other
# party's nominee, the independent is modelled as the challenger. Their
# expected margin starts from what a generic candidate of the MISSING party
# would get (district lean + environment + opponent's incumbency) minus a
# penalty for having no party infrastructure; district polls then enter
# directly (independent minus major-party share). An independent win counts
# for neither party's majority. 2026 cases: SD-46 (Borello vs Bartolotta),
# HD-145 (Prendergast vs Staats).
independent_challenger:
enabled: true
baseline_penalty_pts: 6.0 # Osborn-style independents in 2024 ran ~5-8 pts behind what a generic D would in deep-red seats... before polls
extra_sd_pts: 3.0 # much less history to lean on
# Uncontested seats
uncontested_win_prob: 0.995 # leaves room for write-in upsets (rare but not zero)
# If no candidate from a party appears in the data AND the seat is
# not flagged uncontested, treat the missing side as a nominal
# candidate with a penalty (e.g., late write-in, minor-party-only).
missing_candidate_penalty_pts: 8.0
# ---------------------------------------------------------------------
# 3. ENVIRONMENT LAYER (statewide swing)
# ---------------------------------------------------------------------
environment:
# Statewide 2024 presidential two-party margin is the anchor; the
# model forecasts a statewide "generic legislative" margin for 2026 and
# applies (forecast - anchor) as a uniform swing to every district's
# 2024-anchored baseline.
anchor_race: pres_2024
# --- Structural prior (before polls) ---
# Midterm penalty for the president's party: average House popular-vote
# swing against the White House party in midterms since 1946 is ~ -5 pts
# relative to the prior presidential vote. PA is slightly more elastic
# than average, but legislative races are less nationalised than
# congressional races.
prior:
presidents_party: R
midterm_swing_pts_toward_out_party: 4.0
prior_sd_pts: 4.5 # how uncertain the structural prior is
# The prior's weight in the final blend is expressed as an
# equivalent number of "effective poll respondents".
prior_effective_n: 1500
# --- Poll averaging ---
polls:
half_life_days: 14 # recency: weight halves every 14 days
max_age_days: 90 # polls older than this are dropped
sample_size_exponent: 0.5 # weight ∝ n^0.5 (standard; damps giant online panels)
reference_sample_size: 600
# Pollster-rating multipliers keyed by letter grade (Silver Bulletin /
# 538-style). Unknown pollsters get the "unrated" value.
rating_multiplier:
"A+": 1.30
"A": 1.20
"A-": 1.10
"A/B": 1.05
"B+": 1.00
"B": 0.90
"B-": 0.80
"B/C": 0.75
"C+": 0.70
"C": 0.60
"C-": 0.50
"C/D": 0.45
"D": 0.35
unrated: 0.65
# Partisan sponsorship: weight multiplier and a bias correction
# applied AGAINST the sponsor (D-sponsored polls shifted toward R).
partisan_weight_multiplier: 0.50
partisan_bias_correction_pts: 2.0
# Likely-voter vs registered-voter adjustment (RV polls historically
# lean ~1-2 pts more Democratic than LV in the same race).
population_adjustment_pts: {LV: 0.0, RV: -1.0, A: -1.5}
# Same-pollster down-weighting: a pollster's k-th most recent poll is
# weighted by this factor^(k-1) so one prolific pollster can't
# dominate.
same_pollster_decay: 0.5
# --- Converting each poll type into a "generic PA legislative" margin ---
# Each source produces an estimate of the statewide generic Dem margin.
# They are then combined by these weights (renormalised over sources
# that actually have polls).
source_weights:
pa_generic_ballot: 0.40 # a true PA *legislative* generic ballot; none published so far in 2026
pa_congressional_generic: 0.30 # PA voters' U.S. House preference (Quinnipiac, F&M): PA-specific but congressional
pa_governor: 0.25 # Shapiro over-performs a generic D; see pass_through
national_generic_ballot: 0.25
shapiro_approval: 0.10
# PA congressional generic -> PA legislative generic: same pass-through
# logic as the national generic (legislative races are less nationalised)
pa_congressional_pass_through: 0.80
# Governor race → generic: generic_margin = pres_2024_margin
# + governor_pass_through * (gov_poll_margin - gov_expected_personal_margin ...)
# Simplified: the generic margin is inferred as
# gov_margin - governor_personal_vote_pts, with pass_through damping
# the signal because incumbent governors' coattails are weak.
governor_personal_vote_pts: 10.0 # Shapiro's expected over-performance vs a generic Dem (2022: won by 15.0 while Fetterman won by 5.0 on the same ballot)
governor_pass_through: 0.50
# National generic → PA generic: PA partisan lean relative to the nation
# (PA pres margin minus national pres margin, 2024: -1.7 - (-1.5) = -0.2)
pa_lean_vs_nation_pts: -0.2
national_pass_through: 0.80 # state legislative races are less nationalised
# Shapiro approval → generic: net approval is converted with a slope
# and intercept estimated loosely from governor-approval vs down-ballot
# results (weak signal; low weight above).
approval_slope: 0.15
approval_intercept_pts: -4.0
# Legislative candidates as a class under-run the top of the ticket:
# historical PA generic legislative vote vs presidential/gov margins.
# Positive = Dems do better in legislative races than the statewide
# anchor implies. Set from 2022/2024 computation; fallback here.
legislative_vs_anchor_offset_pts: 0.0
# ---------------------------------------------------------------------
# 4. DISTRICT POLLS
# ---------------------------------------------------------------------
district_polls:
half_life_days: 21
max_age_days: 120
internal_weight_multiplier: 0.40 # internals are released selectively
internal_bias_correction_pts: 3.5 # released internals historically overstate sponsor by ~3-5 pts
# Blend weight of the district poll average vs fundamentals:
# w_polls = n_eff / (n_eff + k) where n_eff = weighted sum of sample sizes
blend_k: 900 # with one 500-person poll, polls get 36%; three -> 62%
# For independent challengers the D-vs-R fundamentals say little, so polls
# carry more weight: a 1,200-person poll gets 80% instead of 57%.
blend_k_independent: 300
# Additional error for small-district polls (legislative polls are
# harder; add to the poll SD in the blend)
extra_poll_sd_pts: 4.0
# ---------------------------------------------------------------------
# 5. EXTERNAL RATINGS AS PRIORS
# ---------------------------------------------------------------------
external_ratings:
# Rating → implied Dem win probability
rating_to_prob:
"Safe D": 0.98
"Likely D": 0.88
"Lean D": 0.74
"Tilt D": 0.60
"Toss-up": 0.50
"Tilt R": 0.40
"Lean R": 0.26
"Likely R": 0.12
"Safe R": 0.02
# The implied probability is converted into a margin using the model's
# own district error SD, then blended into the fundamentals mean.
# Weights are per source; total external weight is capped.
source_weights:
state_navigate: 0.25 # the only seat-by-seat PA rater in 2026 (CNalysis rebranded as State Navigate); its published win probability is used when available
sabato: 0.15 # Crystal Ball publishes chamber-level ratings only for PA; included in case seat ratings appear
ballotpedia: 0.08 # Ballotpedia only flags "battleground" (treated as Toss-up)
other: 0.05
total_weight_cap: 0.35
# Ballotpedia battleground flag → treated as this rating
ballotpedia_battleground_as: "Toss-up"
# Ratings older than this many days are ignored
max_age_days: 120
# ---------------------------------------------------------------------
# 6. SIMULATION
# ---------------------------------------------------------------------
simulation:
n_sims: 40000
seed: 20261103
# Error components (SD in pts of two-party margin). Total district
# error for a typical seat ≈ sqrt(3.0² + 2.2² + 6.5²) ≈ 7.5 pts, in
# line with state-legislative fundamentals-model errors (~7-9 pts).
# Backtest margin MAE was 5.4 (2022) and 5.2 (2024) with 90% coverage 90%/96%.
statewide_sd_pts: 3.5 # polling/environment miss shared by all seats. Backtests: 2022 miss +2.7, 2024 miss -4.3 (lean-adjusted)
regional_sd_pts: 2.2 # shared by seats in the same region
district_sd_pts: 6.5 # idiosyncratic
# Fat tails: statewide and regional shocks drawn from Student-t
statewide_t_df: 5
regional_t_df: 8
# Open seats and seats without a recent contested result are noisier
open_seat_extra_sd_pts: 1.5
no_recent_result_extra_sd_pts: 1.0
# Extra statewide uncertainty per week remaining until the election
# (polls move). Added in quadrature: sd_extra = per_week * weeks_left.
statewide_sd_per_week_remaining: 0.35
regions: [philadelphia, collar, lehigh_valley, pittsburgh_metro, central, northeast, northwest]
# ---------------------------------------------------------------------
# 7. MARKETS (cross-check only — NEVER an input)
# ---------------------------------------------------------------------
markets:
use_as_input: false
show_on_methodology_page: true
# ---------------------------------------------------------------------
# 9. BACKTEST
# ---------------------------------------------------------------------
backtest:
cycles: [2022, 2024]
# Freeze date: only polls ending on/before this date are used.
freeze_days_before_election: 3
# For 2022 the current map was new; baseline uses pres_2020 (and
# gov/sen 2018 where available). Lean weights below override the main
# ones for each backtest cycle.
lean_weights:
2022: {pres_2020: 1.0}
2024: {pres_2020: 0.45, gov_2022: 0.275, sen_2022: 0.275}
anchor_race:
2022: pres_2020
2024: pres_2020
presidents_party:
2022: D
2024: D # presidential year: no midterm prior applied
Data sources
Every file the model reads, with where it came from and when it was retrieved. Raw captures are kept under data/raw/; notes on gaps and caveats are in each folder's NOTES.md.
2026 candidates and incumbents
dos_electioninfo.html— PA Department of State Election Information page, default election = 2026 General Election (11/03/2026, election id 116). The full certified candidate list (1,299 candidates, all offices) is embedded as JSON in a hidden form input. Source: https://www.pavoterservices.pa.gov/ElectionInfo/ElectionInfo.aspx (retrieved 2026-10-15)dos_2026_general_candidates.json— The embedded JSON above, extracted verbatim by pipeline/fetch/parse_dos_candidates.py. Source: https://www.pavoterservices.pa.gov/ElectionInfo/ElectionInfo.aspx (retrieved 2026-10-15)dos_2026_general_candidates.csv— CSV flattening of the JSON (same fields). Source: https://www.pavoterservices.pa.gov/ElectionInfo/ElectionInfo.aspx (retrieved 2026-10-15)ballotpedia_house_2026.html— Ballotpedia overview page; contains the 'General election' candidateListTablePartisan table (203 district rows: Democratic / Republican / Other, incumbents marked (i)), the primary table, race ratings, retiring incumbents and incumbents defeated in primaries. Source: https://ballotpedia.org/Pennsylvania_House_of_Representatives_elections,_2026 (retrieved 2026-10-15)ballotpedia_senate_2026.html— Same for the State Senate (25 district rows; the 2026 class is the EVEN-numbered districts 2-50). Source: https://ballotpedia.org/Pennsylvania_State_Senate_elections,_2026 (retrieved 2026-10-15)bp_house_general.csv / bp_house_general.json— Parsed general-election table (pipeline/fetch/parse_ballotpedia.py): per district dem/rep/other lists and incumbent flags; JSON also holds the retiring/defeated lists. Source: https://ballotpedia.org/Pennsylvania_House_of_Representatives_elections,_2026 (retrieved 2026-10-15)bp_senate_general.csv / bp_senate_general.json— Parsed Senate general-election table. Source: https://ballotpedia.org/Pennsylvania_State_Senate_elections,_2026 (retrieved 2026-10-15)legis_house_roster.html— Official PA House member list, 2025-2026 session: name, party, district. Source: https://www.legis.state.pa.us/cfdocs/legis/home/member_information/mbrList.cfm?body=H&sort=alpha (redirects to https://www.palegis.us/house/members)) (retrieved 2026-10-15)legis_senate_roster.html— Official PA Senate member list. Source: https://www.legis.state.pa.us/cfdocs/legis/home/member_information/mbrList.cfm?body=S&sort=alpha (redirects to https://www.palegis.us/senate/members)) (retrieved 2026-10-15)legis_house_roster.csv / legis_senate_roster.csv— Parsed rosters: chamber, district, member, party, bio_url (pipeline/fetch/parse_legis_roster.py). Source: (derived from the two roster HTML files) (retrieved 2026-10-15)- Gaps and caveats: see
data/raw/candidates/NOTES.mdin the repository.
Campaign finance (PA Department of State full export)
cf_export_index.html— Legacy DoS URL from the brief; it now redirects to the pa.gov Department of State landing page (no export links). Source: https://www.dos.pa.gov/VotingElections/CandidatesCommittees/CampaignFinance/Pages/FullCampaignFinanceExport.aspx (retrieved 2026-10-15)cf_export_index2.html— Guessed pa.gov URL; returned HTTP 404. Source: https://www.pa.gov/agencies/dos/programs/voting-and-elections/campaign-finance/full-campaign-finance-export.html (retrieved 2026-10-15)cf_data_page.html— Current 'Campaign Finance Data' page listing the Full Export zip files (1987-2026) and the Read Me file. Source: https://www.pa.gov/agencies/dos/resources/voting-and-elections-resources/campaign-finance-data (retrieved 2026-10-15)readme-cf-data.txt— Column layouts for the filer, contribution, expense, debt and receipt tables. Source: https://www.pa.gov/content/dam/copapwp-pagov/en/dos/resources/voting-and-elections/campaign-finance/campaign-finance-data/readme-cf-data.txt (retrieved 2026-10-15)2026.zip— 2026 Full Campaign Finance Export (14.5 MB zip). Member files dated 2026-10-09; latest SubmittedDate in filer table 2026-10-07. Source: https://www.pa.gov/content/dam/copapwp-pagov/en/dos/resources/voting-and-elections/campaign-finance/campaign-finance-data/2026.zip (retrieved 2026-10-15)2025.zip— 2025 Full Campaign Finance Export (29.1 MB zip). Member files dated 2026-05-20. Source: https://www.pa.gov/content/dam/copapwp-pagov/en/dos/resources/voting-and-elections/campaign-finance/campaign-finance-data/2025.zip (retrieved 2026-10-15)cfo_probe_mcclinton.html— First probe of the online system's per-filer 'CF Summary' page (official cover-sheet totals by year and cycle). Source: https://www.campaignfinanceonline.pa.gov/Pages/CFAnnualTotals.aspx?Filer=20150217 (retrieved 2026-10-15)cfo_annual_totals/— One page per filer matched to a 2026 legislative nominee (candidate filer IDs 2026Cxxxx and committee IDs). Each page lists, per year and reporting cycle: Amount Brought Forward, Total Monetary Contributions And Receipts, Total Funds Available, Total Expenditures, Ending Cash Balance, Value of In-Kind Contributions, Unpaid Debts. Source: https://www.campaignfinanceonline.pa.gov/Pages/CFAnnualTotals.aspx?Filer=.html (retrieved 2026-10-15) - Gaps and caveats: see
data/raw/finance/NOTES.mdin the repository.
2026 polls (statewide and district)
538_pollster_ratings_2023.csv— FiveThirtyEight 2023 letter-grade ratings (pre-2024 methodology). Source: https://raw.githubusercontent.com/fivethirtyeight/data/master/pollster-ratings/2023/pollster-ratings.csv (retrieved 2026-10-15)538_pollster_ratings_README.md— Codebook for 538 pollster ratings CSVs. Source: https://raw.githubusercontent.com/fivethirtyeight/data/master/pollster-ratings/README.md (retrieved 2026-10-15)538_pollster_ratings_combined.csv— FiveThirtyEight final pollster ratings archive (2024 methodology: numeric_grade, POLLSCORE, transparency). projects.fivethirtyeight.com/polls/data/ now redirects to abcnews.com (dead). Source: https://raw.githubusercontent.com/fivethirtyeight/data/master/pollster-ratings/pollster-ratings-combined.csv (retrieved 2026-10-15)bravo/august-2026.html— Morning Scrapple Aug 2026 results page (711 RV, Aug 18-22). Source: https://bravogroup.us/morning-scrapple/august-2026/ (retrieved 2026-10-29)bravo/july-2026.html— Morning Scrapple July 2026 (630 LV, July 17-24; qualitative wave). Source: https://bravogroup.us/morning-scrapple/july-2026/ (retrieved 2026-10-29)bravo/june-2026.html— Morning Scrapple June 2026 (644 LV, June 18-25). Source: https://bravogroup.us/morning-scrapple/june-2026/ (retrieved 2026-10-29)bravo/may-2026.html— Morning Scrapple May 2026 (684 LV, May 20-24). Source: https://bravogroup.us/morning-scrapple/may-2026/ (retrieved 2026-10-29)bravo_dashboard.html— Bravo Group Morning Scrapple landing page (links to monthly result pages). Source: https://bravogroup.us/morning-scrapple/ (retrieved 2026-10-29)bravo_sept2026.html— PennLive/Bravo Group Morning Scrapple September 2026 email (624 RV, Sept 16-22; methodology; numeric results mostly in images). Source: https://mailchi.mp/thebravogroup.com/morning-scrapple-sept26-results-ns (retrieved 2026-10-29)cityandstate_sept2026_polls.html— City & State PA Sept 25 2026 roundup of NYT/Inquirer/Siena PA poll (Shapiro approval 60/33) and F&M CD polls. Source: https://www.cityandstatepa.com/politics/2026/09/pennsylvania-polls-show-democrats-leading-midterm-election-nears/416229/ (retrieved 2026-10-29)fandm/aug2026.html— F&M August 2026 release: governor 50-25, US House pref 48-36, job rating 47/47. Source: https://www.fandmpoll.org/franklin-marshall-college-poll-release-august-2026/ (retrieved 2026-10-29)fandm/index.html— F&M poll site index (release list; Sept 2026 CD-7/CD-10 release is paid-members only). Source: https://www.fandmpoll.org/ (retrieved 2026-10-29)fandm/jun2026.html— F&M June 2026 release: governor 50-28, job rating 48/48. Source: https://www.fandmpoll.org/franklin-marshall-college-poll-release-june-2026/ (retrieved 2026-10-29)fiftyplusone_downloads.html— FiftyPlusOne downloads page: poll CSV/API is paid ($100+/mo). Source: https://fiftyplusone.news/downloads (retrieved 2026-10-29)fiftyplusone_generic.html— FiftyPlusOne generic ballot average page (Oct 15: D+8, 51.4-43.1). Source: https://fiftyplusone.news/polls/generic-ballot (retrieved 2026-10-29)fiftyplusone_pa_gov.html— FiftyPlusOne PA governor average page (Oct 15: Shapiro +22, 55.2-33.0); poll list is JS-rendered/paywalled API. Source: https://fiftyplusone.news/polls/governor/general/pennsylvania (retrieved 2026-10-29)inquirer_jun18.html— Inquirer coverage of F&M June 2026 poll (US House preference 47-35). Source: https://www.inquirer.com/politics/pennsylvania/shapiro-garrity-pennsylvania-governor-poll-approval-rating-20260618.html (retrieved 2026-10-29)inquirer_jun24.html— Inquirer: Suffolk/Inquirer Philadelphia-only CityView poll (favorability; not statewide, not used). Source: https://www.inquirer.com/politics/philadelphia/josh-shapiro-john-fetterman-pennsylvania-approval-poll-20260624.html (retrieved 2026-10-29)levittownnow_jul16.html— Center Square/LevittownNow coverage of Quinnipiac July 2026 poll. Source: https://levittownnow.com/2026/07/16/poll-josh-shapiro-leads-stacy-garrity-by-13-points/ (retrieved 2026-10-29)natpublicaffairs_pa_0804.pdf— National Public Affairs (R) PA topline memo Aug 4 2026: Shapiro 50 Garrity 43, 600 LV, live phone + text-to-web. Source: https://backend.natpublicaffairs.com/media/PA_Statewide_Topline_08042026%20-Public_Release-v2.pdf (retrieved 2026-10-29)politicalwire_oct7.html— Political Wire on Quinnipiac Oct 2026 PA poll. Source: https://politicalwire.com/2026/10/07/shapiro-opens-wide-leads-in-pennsylvania/ (retrieved 2026-10-29)politicspa_0423_playbook.html— PoliticsPA Playbook Apr 23 2026 (Cook Political Report national battleground-district poll; not PA-specific, not used). Source: https://politicspa.com/4-23-playbook-dems-lead-by-six-in-new-battleground-poll/146192/ (retrieved 2026-10-29)politicspa_fm_mar2026.html— PoliticsPA summary of F&M Feb18-Mar1 2026 poll (governor 48-28; job rating 50/44; generic US House 44-37). Source: https://www.politicspa.com/fm-poll-shapiro-leads-garrity-for-governor-48-28/145800/ (retrieved 2026-10-29)quinnipiac/pa02252026_pdkl34.pdf— Quinnipiac PA poll release Feb 25 2026 (RV): governor 55-37, House control 49-43, approval 56-29. Source: https://poll.qu.edu/images/polling/pa/pa02252026_pdkl34.pdf (retrieved 2026-10-29)quinnipiac/pa10072026_pgrx47.pdf— Quinnipiac PA poll release Oct 7 2026 (LV): governor 59-34, House control 54-39, Shapiro approval 63-30. Source: https://poll.qu.edu/images/polling/pa/pa10072026_pgrx47.pdf (retrieved 2026-10-29)quinnipiac/release_3933.html— Quinnipiac PA poll release Oct 1 2025 (RV): approval 60-28, Shapiro-Garrity 55-39. Source: https://poll.qu.edu/poll-release?releaseid=3933 (retrieved 2026-10-29)quinnipiac/release_3948.html— Quinnipiac PA poll release Feb 2026 (HTML version). Source: https://poll.qu.edu/poll-release?releaseid=3948 (retrieved 2026-10-29)quinnipiac/release_3962.html— Quinnipiac PA poll release July 2026 (RV): governor 53-40, House control 49-43, approval 56-34. Source: https://poll.qu.edu/poll-release?releaseid=3962 (retrieved 2026-10-29)rcp_generic_archive.html— RealClearPolling generic ballot table via Wayback (60 most recent polls, Aug 14-Oct 13 2026). Cross-check only. Source: https://web.archive.org/web/2026id_/https://www.realclearpolling.com/polls/state-of-the-union/generic-congressional-vote (retrieved 2026-10-15)rcp_pa_gov_archive.html— RealClearPolling PA governor table via Wayback (live site returns 403). Cross-check; source of the PennLive 7/17-7/24 poll. Source: https://web.archive.org/web/2026id_/https://www.realclearpolling.com/polls/governor/general/2026/pennsylvania/shapiro-vs-garrity (retrieved 2026-10-15)silverbulletin/dw_03KAo_3.csv— Silver Bulletin ratings: right-call %, outside-MoE %, house effect, herding penalty (98 pollsters). Source: https://datawrapper.dwcdn.net/03KAo/3/dataset.csv (retrieved 2026-10-29)silverbulletin/dw_1XlrM_2.csv— Silver Bulletin ratings: error / plus-minus detail table (98 pollsters). Source: https://datawrapper.dwcdn.net/1XlrM/2/dataset.csv (retrieved 2026-10-29)silverbulletin/dw_GiFps_3.csv— Silver Bulletin ratings main table (pollster, grade, predictive plus-minus, mean-reverted bias, #polls), 541 pollsters. Source: https://datawrapper.dwcdn.net/GiFps/3/dataset.csv (retrieved 2026-10-29)silverbulletin_archive.html— Silver Bulletin June 2024 ratings archive page. Source: https://www.natesilver.net/p/silver-bulletin-pollster-ratings-archive (retrieved 2026-10-15)silverbulletin_pollster_ratings.html— Silver Bulletin pollster ratings landing page (Jan 14 2026 update); data in Datawrapper embeds. Source: https://www.natesilver.net/p/pollster-ratings-silver-bulletin (retrieved 2026-10-29)spotlightpa_races_to_watch.html— Spotlight PA races-to-watch (cites State Navigate SD-6, SD-40, SD-36, HD-144 polls; no Spotlight-own polls). Source: https://www.spotlightpa.org/news/2026/09/races-to-watch-pennsylvania-house-senate-2026-midterm-election-elections/ (retrieved 2026-10-29)statenavigate/PA_HD142_General_StateNav_Briefing-1.pdf— State Navigate August 2026 poll briefing PDF, PA HD142 (field July 31-Aug 3, 2026). Source: https://statenavigate.org/wp-content/uploads/2026/08/PA_HD142_General_StateNav_Briefing-1.pdf (retrieved 2026-10-29)statenavigate/PA_HD144_General_StateNav_Briefing-1.pdf— State Navigate August 2026 poll briefing PDF, PA HD144 (field July 31-Aug 3, 2026). Source: https://statenavigate.org/wp-content/uploads/2026/08/PA_HD144_General_StateNav_Briefing-1.pdf (retrieved 2026-10-29)statenavigate/PA_HD178_General_StateNav_Briefing-1.pdf— State Navigate August 2026 poll briefing PDF, PA HD178 (field July 31-Aug 3, 2026). Source: https://statenavigate.org/wp-content/uploads/2026/08/PA_HD178_General_StateNav_Briefing-1.pdf (retrieved 2026-10-29)statenavigate/PA_HD18_General_StateNav_Briefing-1.pdf— State Navigate August 2026 poll briefing PDF, PA HD18 (field July 31-Aug 3, 2026). Source: https://statenavigate.org/wp-content/uploads/2026/08/PA_HD18_General_StateNav_Briefing-1.pdf (retrieved 2026-10-29)statenavigate/PA_SD6_General_StateNav_Briefing-1.pdf— State Navigate August 2026 poll briefing PDF, PA SD6 (field July 31-Aug 3, 2026). Source: https://statenavigate.org/wp-content/uploads/2026/08/PA_SD6_General_StateNav_Briefing-1.pdf (retrieved 2026-10-29)statenavigate/art_aug06_trifecta.html— State Navigate Aug 6 2026 article releasing SD-6/HD-18/HD-142/HD-144/HD-178 polls. Source: https://articles.statenavigate.com/pa/will-josh-shapiro-get-his-trifecta/ (retrieved 2026-10-29)statenavigate/art_oct08_osborn_sd46.html— State Navigate Oct 8 2026 article: SD-46 poll (Bartolotta R vs Borello I). Source: https://statenavigate.org/pa/can-the-democrats-dan-osborn-strategy-work-on-the-state-legislative-level/ (retrieved 2026-10-29)statenavigate/art_oct15_dems_gain.html— State Navigate Oct 15 2026 article: October re-polls of 9 districts + HD-145. Source: https://statenavigate.org/pa/democrats-gain-in-pennsylvania-legislative-polling/ (retrieved 2026-10-29)statenavigate/art_sep17_senate.html— State Navigate Sept 17 2026 article: SD-36, SD-40, HD-41 polls. Source: https://statenavigate.org/pa/state-navigate-polls-show-uphill-climb-for-pennsylvania-democrats-in-state-senate/ (retrieved 2026-10-29)statenavigate/art_sep24_se_pa.html— State Navigate Sept 24 2026 article: SD-16, SD-24, HD-131, HD-143, HD-147, HD-187 polls. Source: https://statenavigate.org/pa/state-navigate-polls-show-tight-races-in-southeastern-pennsylvania/ (retrieved 2026-10-29)statenavigate/articles_home.html— State Navigate articles index. Source: https://articles.statenavigate.com/ (retrieved 2026-10-29)statenavigate/downloads_data.html— State Navigate data downloads (catalog is JS/API; API key required). Source: https://projects.statenavigate.com/downloads/data.html (retrieved 2026-10-29)statenavigate/feed.xml— State Navigate RSS feed: full text of PA polling articles with Data/Crosstabs links (Sept 17, Sept 24, Oct 8, Oct 15 2026). Source: https://statenavigate.org/feed/ (retrieved 2026-10-29)statenavigate/iv_hd-131-poll-october-2026.html— State Navigate interactive poll data page for PA hd-131-poll-october-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/hd-131-poll-october-2026/ (retrieved 2026-10-15)statenavigate/iv_hd-131-poll-september-2026.html— State Navigate interactive poll data page for PA hd-131-poll-september-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/hd-131-poll-september-2026/ (retrieved 2026-10-15)statenavigate/iv_hd-142-poll-october-2026.html— State Navigate interactive poll data page for PA hd-142-poll-october-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/hd-142-poll-october-2026/ (retrieved 2026-10-15)statenavigate/iv_hd-143-poll-october-2026.html— State Navigate interactive poll data page for PA hd-143-poll-october-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/hd-143-poll-october-2026/ (retrieved 2026-10-15)statenavigate/iv_hd-143-poll-september-2026.html— State Navigate interactive poll data page for PA hd-143-poll-september-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/hd-143-poll-september-2026/ (retrieved 2026-10-15)statenavigate/iv_hd-145-poll-october-2026.html— State Navigate interactive poll data page for PA hd-145-poll-october-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/hd-145-poll-october-2026/ (retrieved 2026-10-15)statenavigate/iv_hd-147-poll-september-2026.html— State Navigate interactive poll data page for PA hd-147-poll-september-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/hd-147-poll-september-2026/ (retrieved 2026-10-15)statenavigate/iv_hd-18-poll-october-2026.html— State Navigate interactive poll data page for PA hd-18-poll-october-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/hd-18-poll-october-2026/ (retrieved 2026-10-15)statenavigate/iv_hd-187-poll-october-2026.html— State Navigate interactive poll data page for PA hd-187-poll-october-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/hd-187-poll-october-2026/ (retrieved 2026-10-15)statenavigate/iv_hd-187-poll-september-2026.html— State Navigate interactive poll data page for PA hd-187-poll-september-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/hd-187-poll-september-2026/ (retrieved 2026-10-15)statenavigate/iv_hd-41-poll-october-2026.html— State Navigate interactive poll data page for PA hd-41-poll-october-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/hd-41-poll-october-2026/ (retrieved 2026-10-15)statenavigate/iv_hd-41-poll-september-2026.html— State Navigate interactive poll data page for PA hd-41-poll-september-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/hd-41-poll-september-2026/ (retrieved 2026-10-15)statenavigate/iv_sd-16-poll-october-2026.html— State Navigate interactive poll data page for PA sd-16-poll-october-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/sd-16-poll-october-2026/ (retrieved 2026-10-15)statenavigate/iv_sd-16-poll-september-2026.html— State Navigate interactive poll data page for PA sd-16-poll-september-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/sd-16-poll-september-2026/ (retrieved 2026-10-15)statenavigate/iv_sd-24-poll-september-2026.html— State Navigate interactive poll data page for PA sd-24-poll-september-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/sd-24-poll-september-2026/ (retrieved 2026-10-15)statenavigate/iv_sd-36-poll-october-2026.html— State Navigate interactive poll data page for PA sd-36-poll-october-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/sd-36-poll-october-2026/ (retrieved 2026-10-15)statenavigate/iv_sd-36-poll-september-2026.html— State Navigate interactive poll data page for PA sd-36-poll-september-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/sd-36-poll-september-2026/ (retrieved 2026-10-15)statenavigate/iv_sd-40-poll-september-2026.html— State Navigate interactive poll data page for PA sd-40-poll-september-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/sd-40-poll-september-2026/ (retrieved 2026-10-15)statenavigate/iv_sd-46-poll-october-2026.html— State Navigate interactive poll data page for PA sd-46-poll-october-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/sd-46-poll-october-2026/ (retrieved 2026-10-15)statenavigate/iv_sd-6-poll-october-2026.html— State Navigate interactive poll data page for PA sd-6-poll-october-2026 (embedded JSON: details, ballots, approvals). Source: https://projects.statenavigate.com/interactives/pa/sd-6-poll-october-2026/ (retrieved 2026-10-15)statenavigate/pa_forecast_lower.html— State Navigate 2026 PA House forecast page (ratings; JS-rendered). Source: https://projects.statenavigate.com/25-26/states/pa/forecast-lower.html (retrieved 2026-10-29)statenavigate/pa_forecast_upper.html— State Navigate 2026 PA Senate forecast page (ratings; JS-rendered). Source: https://projects.statenavigate.com/25-26/states/pa/forecast-upper.html (retrieved 2026-10-29)statenavigate/pa_news.html— State Navigate PA news page. Source: https://statenavigate.org/states/pa/news.html (retrieved 2026-10-29)statenavigate/pa_sd46_live_poll.html— State Navigate SD-46 live poll interactive (unweighted live view; not used for toplines). Source: https://projects.statenavigate.com/interactives/pa/sd-46-live-poll/ (retrieved 2026-10-29)statenavigate/pa_state_page.html— State Navigate Pennsylvania hub (live polling maps, forecast links). Source: https://statenavigate.org/states/pa/ (retrieved 2026-10-29)statenavigate/polling_grades.csv— State Navigate self-reported poll accuracy grades sheet. Source: https://docs.google.com/spreadsheets/d/12rMsLA9kcbaxLrsbYpbZW0Q3yjg9m-quuFe7DwhynXY/export?format=csv&gid=0 (retrieved 2026-10-29)statenavigate_home.html— State Navigate homepage (501(c)(3); states launched incl. Pennsylvania). Source: https://statenavigate.org/ (retrieved 2026-10-29)wiki_pa_gov_2026.html— Wikipedia: PA governor polling tables (Shapiro v Garrity; primary; aggregates). Primary source for pa_governor rows. Source: https://en.wikipedia.org/wiki/2026_Pennsylvania_gubernatorial_election (retrieved 2026-10-29)wiki_pa_house_2026.html— Wikipedia PA House election page; checked for polling tables (none; only predictions). Source: https://en.wikipedia.org/wiki/2026_Pennsylvania_House_of_Representatives_election (retrieved 2026-10-29)wiki_pa_senate_2026.html— Wikipedia PA State Senate election page; article does not exist at this title (stub). Source: https://en.wikipedia.org/wiki/2026_Pennsylvania_State_Senate_election (retrieved 2026-10-15)wiki_us_elections_2026.html— Wikipedia: national generic congressional ballot poll tables (2025-26 and 2024-25). Primary source for national_generic_ballot rows. Source: https://en.wikipedia.org/wiki/2026_United_States_elections (retrieved 2026-10-29)wiki_us_house_2026.html— Wikipedia US House page; contains only aggregate generic-ballot table (individual polls live on the 2026 United States elections page). Source: https://en.wikipedia.org/wiki/2026_United_States_House_of_Representatives_elections (retrieved 2026-10-29)wiki_us_house_pa_2026.html— Wikipedia PA congressional races; district-level US House polls (not used; no PA generic ballot table). Source: https://en.wikipedia.org/wiki/2026_United_States_House_of_Representatives_elections_in_Pennsylvania (retrieved 2026-10-29)yahoo_shapiro_split.html— Syndicated coverage of Quinnipiac Feb 2026 poll. Source: https://www.yahoo.com/news/articles/pennsylvania-voters-split-whether-shapiro-205541290.html (retrieved 2026-10-29)- Gaps and caveats: see
data/raw/polls/NOTES.mdin the repository.
2022 and 2024 polls (backtest)
wb_governor_polls_historical_20250203.csv— Source: http://web.archive.org/web/20250203110129id_/https://projects.fivethirtyeight.com/polls/data/governor_polls_historical.csv (retrieved )wb_senate_polls_historical_20250203.csv— Source: http://web.archive.org/web/20250203110129id_/https://projects.fivethirtyeight.com/polls/data/senate_polls_historical.csv (retrieved )wb_generic_ballot_polls_historical_20241203.csv— Source: http://web.archive.org/web/20241203041935id_/https://projects.fivethirtyeight.com/polls/data/generic_ballot_polls_historical.csv (retrieved )wb_generic_ballot_polls_20241203.csv— Source: http://web.archive.org/web/20241203161806id_/https://projects.fivethirtyeight.com/polls/data/generic_ballot_polls.csv (retrieved )wb_president_polls_historical_20250205.csv— Source: http://web.archive.org/web/20250205084149id_/https://projects.fivethirtyeight.com/polls/data/president_polls_historical.csv (retrieved )wb_president_polls_20241202.csv— Source: http://web.archive.org/web/20241202132111id_/https://projects.fivethirtyeight.com/polls/data/president_polls.csv (retrieved )wb_senate_polls_20241118.csv— Source: http://web.archive.org/web/20241118073720id_/https://projects.fivethirtyeight.com/polls/data/senate_polls.csv (retrieved )wb_senate_polls_historical_20241203.csv— Source: http://web.archive.org/web/20241203065148id_/https://projects.fivethirtyeight.com/polls/data/senate_polls_historical.csv (retrieved )wb_president_polls_20230325.csv— Source: http://web.archive.org/web/20230325120602id_/https://projects.fivethirtyeight.com/polls/data/president_polls.csv (retrieved )2022_Pennsylvania_gubernatorial_election.wikitext— Source: https://en.wikipedia.org/w/index.php?title=2022_Pennsylvania_gubernatorial_election&action=raw (retrieved )2022_Pennsylvania_gubernatorial_election.html— Source: https://en.wikipedia.org/wiki/2022_Pennsylvania_gubernatorial_election (retrieved )2022_United_States_Senate_election_in_Pennsylvania.wikitext— Source: https://en.wikipedia.org/w/index.php?title=2022_United_States_Senate_election_in_Pennsylvania&action=raw (retrieved )2022_United_States_Senate_election_in_Pennsylvania.html— Source: https://en.wikipedia.org/wiki/2022_United_States_Senate_election_in_Pennsylvania (retrieved )2022_United_States_House_of_Representatives_elections.wikitext— Source: https://en.wikipedia.org/w/index.php?title=2022_United_States_House_of_Representatives_elections&action=raw (retrieved )2022_United_States_House_of_Representatives_elections.html— Source: https://en.wikipedia.org/wiki/2022_United_States_House_of_Representatives_elections (retrieved )2024_United_States_presidential_election_in_Pennsylvania.wikitext— Source: https://en.wikipedia.org/w/index.php?title=2024_United_States_presidential_election_in_Pennsylvania&action=raw (retrieved )2024_United_States_presidential_election_in_Pennsylvania.html— Source: https://en.wikipedia.org/wiki/2024_United_States_presidential_election_in_Pennsylvania (retrieved )2024_United_States_Senate_election_in_Pennsylvania.wikitext— Source: https://en.wikipedia.org/w/index.php?title=2024_United_States_Senate_election_in_Pennsylvania&action=raw (retrieved )2024_United_States_Senate_election_in_Pennsylvania.html— Source: https://en.wikipedia.org/wiki/2024_United_States_Senate_election_in_Pennsylvania (retrieved )2024_United_States_House_of_Representatives_elections.wikitext— Source: https://en.wikipedia.org/w/index.php?title=2024_United_States_House_of_Representatives_elections&action=raw (retrieved )2024_United_States_House_of_Representatives_elections.html— Source: https://en.wikipedia.org/wiki/2024_United_States_House_of_Representatives_elections (retrieved )2020_United_States_presidential_election_in_Pennsylvania.wikitext— Source: https://en.wikipedia.org/w/index.php?title=2020_United_States_presidential_election_in_Pennsylvania&action=raw (retrieved )- Gaps and caveats: see
data/raw/polls_historical/NOTES.mdin the repository.
External ratings, target lists, markets, calibration references
sn_pa_forecast_lower.html— State Navigate 2026 PA State House forecast; per-seat data-rating/data-win-probability attributes for all 203 districts Source: https://projects.statenavigate.com/25-26/states/pa/forecast-lower.html (retrieved 2026-10-15)sn_pa_forecast_upper.html— State Navigate 2026 PA State Senate forecast; per-seat attributes for all 50 districts (25 up in 2026) Source: https://projects.statenavigate.com/25-26/states/pa/forecast-upper.html (retrieved 2026-10-15)sn_pa_forecast_gov.html— State Navigate 2026 PA governor forecast (Shapiro >99%) Source: https://projects.statenavigate.com/25-26/states/pa/forecast-gov.html (retrieved 2026-10-15)sn_pa_forecast_index.html— State Navigate PA forecast landing page (redirects to lower chamber) Source: https://projects.statenavigate.com/25-26/states/pa/forecast.html (retrieved 2026-10-15)sn_states_pa.html— State Navigate Pennsylvania hub page (links to forecast, polls, articles) Source: https://statenavigate.org/states/pa/ (retrieved 2026-10-15)statenavigate_home.html— State Navigate homepage Source: https://statenavigate.org/ (retrieved 2026-10-15)cnalysis_home_redirect.html— cnalysis.com -> redirects to statenavigate.org (CNalysis rebranded as State Navigate) Source: https://www.cnalysis.com/ (retrieved 2026-10-15)sn_api_pa_forecast_info.json— State Navigate forecast API: PA chamber metadata, current seats, model inputs, run_time Source: https://api.statenavigate.com/api/pa/forecasts/2526/info.json (retrieved 2026-10-15)sn_api_control_odds.csv— State Navigate forecast API: joint chamber/governor control odds for every state (PA row used) Source: https://api.statenavigate.com/api/forecasts/2526/outputs/control-odds.csv (retrieved 2026-10-15)sn_art_welcome_pa.html— State Navigate PA launch note, Aug 6 2026 (Nuttycombe) Source: https://articles.statenavigate.com/pa/welcome-to-pennsylvania-navigate/ (retrieved 2026-10-15)sn_art_senate_uphill.html— State Navigate polls SD-36/SD-40/HD-41, Sept 17 2026 Source: https://articles.statenavigate.com/pa/state-navigate-polls-show-uphill-climb-for-pennsylvania-democrats-in-state-senate/ (retrieved 2026-10-15)sn_art_se_pa_tight.html— State Navigate polls SD-16/SD-24/HD-131/143/147/187, Sept 24 2026 Source: https://articles.statenavigate.com/pa/state-navigate-polls-show-tight-races-in-southeastern-pennsylvania/ (retrieved 2026-10-15)sn_PA_HD18_briefing.pdf— State Navigate HD-18 poll briefing (Jul 31-Aug 3 2026), forecast rating Toss-Up Source: https://statenavigate.org/wp-content/uploads/2026/08/PA_HD18_General_StateNav_Briefing-1.pdf (retrieved 2026-10-15)sn_PA_HD142_briefing.pdf— State Navigate HD-142 poll briefing, forecast rating Toss-Up Source: https://statenavigate.org/wp-content/uploads/2026/08/PA_HD142_General_StateNav_Briefing-1.pdf (retrieved 2026-10-15)sn_PA_HD144_briefing.pdf— State Navigate HD-144 poll briefing, forecast rating Very Likely D Source: https://statenavigate.org/wp-content/uploads/2026/08/PA_HD144_General_StateNav_Briefing-1.pdf (retrieved 2026-10-15)sn_PA_HD178_briefing.pdf— State Navigate HD-178 poll briefing, forecast rating Very Likely R Source: https://statenavigate.org/wp-content/uploads/2026/08/PA_HD178_General_StateNav_Briefing-1.pdf (retrieved 2026-10-15)sn_PA_SD6_briefing.pdf— State Navigate SD-6 poll briefing (n=1,831), forecast rating Toss-Up Source: https://statenavigate.org/wp-content/uploads/2026/08/PA_SD6_General_StateNav_Briefing-1.pdf (retrieved 2026-10-15)wiki_2026_pa_senate_election.html— Wikipedia: 2026 PA Senate election; chamber ratings table (Sabato Lean R 1/22/26; State Navigate) and per-district State Navigate table Source: https://en.wikipedia.org/wiki/2026_Pennsylvania_Senate_election (retrieved 2026-10-15)wiki_2026_pa_house_election.html— Wikipedia: 2026 PA House election; chamber ratings table (Sabato Lean D 1/22/26; State Navigate Lean D 8/27/26); 103-100 composition Source: https://en.wikipedia.org/wiki/2026_Pennsylvania_House_of_Representatives_election (retrieved 2026-10-15)wiki_pa_house.html— Wikipedia: PA House composition (103 D / 100 R) Source: https://en.wikipedia.org/wiki/Pennsylvania_House_of_Representatives (retrieved 2026-10-15)wiki_pa_senate.html— Wikipedia: PA Senate composition (27 R / 23 D) Source: https://en.wikipedia.org/wiki/Pennsylvania_State_Senate (retrieved 2026-10-15)bp_pa_house_elections_2026.html— Ballotpedia PA House 2026: composition 'As of October 2026' 103 D/100 R/0 vacancies; no battleground-district section published Source: https://ballotpedia.org/Pennsylvania_House_of_Representatives_elections,_2026 (retrieved 2026-10-15)bp_pa_senate_elections_2026.html— Ballotpedia PA Senate 2026: composition 23 D/27 R; 10 battleground districts (4,6,10,14,16,20,24,36,40,50) Source: https://ballotpedia.org/Pennsylvania_State_Senate_elections,_2026 (retrieved 2026-10-15)bp_news_pa_senate_targets_2026-10-06.html— Ballotpedia News, Oct 6 2026: DLCC and RSLC both target PA Senate; 10 battleground districts Source: https://news.ballotpedia.org/?p=51528 (retrieved 2026-10-15)bp_news_early_look_chambers_2026-01-14.html— Ballotpedia News, Jan 14 2026: DLCC/RSLC battleground states incl. PA Source: https://news.ballotpedia.org/2026/01/14/an-early-look-at-the-most-competitive-state-legislative-chambers-in-2026/ (retrieved 2026-10-15)bp_battleground_chambers_2026_404.html— Ballotpedia 'State legislative battleground chambers, 2026' -> HTTP 404 (page does not exist) Source: https://ballotpedia.org/State_legislative_battleground_chambers,_2026 (retrieved 2026-10-15)sabato_crystalball_p26241.html— Sabato's Crystal Ball original 'Handicapping the 2026 State Legislative Map: A First Look' (returns 403 to non-browser clients) Source: https://centerforpolitics.org/crystalball/?p=26241 (retrieved 2026-10-15)rasmussen_jacobson_first_look_2026-01-22.html— Reprint of Jacobson/Crystal Ball first look, Jan 22 2026: PA Senate Leans R (27R-23D), PA House Leans D (100D-99R, 4 vacancies) Source: https://www.rasmussenreports.com/public_content/political_commentary/commentary_by_louis_jacobson/handicapping_the_2026_state_legislative_map_a_first_look (retrieved 2026-10-15)multistate_2026_state_elections.html— MultiState, Feb 5 2026: summarizes Crystal Ball chamber ratings (PA House/Senate 'lean') Source: https://www.multistate.us/insider/2026/2/5/2026-state-elections-could-reshape-trifecta-control-states-to-watch (retrieved 2026-10-15)politicalwire_15_chambers_2026-02-11.html— Political Wire summary of Crystal Ball 15 competitive chambers Source: https://politicalwire.com/2026/02/11/15-state-legislatures-up-for-grabs/ (retrieved 2026-10-15)dlcc_pr_sabato_first_look.html— DLCC press release summarizing Crystal Ball first look Source: https://www.dlcc.org/press/sabatos-crystal-ball-favorable-cycle-for-democrats-as-republicans-are-playing-defense-to-a-disproportionate-degree/ (retrieved 2026-10-15)insideelections_state_leg_ratings_403.html— Inside Elections state legislature ratings page (403 to non-browser clients; not captured) Source: https://insideelections.com/state-legislature-ratings/ (retrieved 2026-10-15)dlcc_state_pa.html— DLCC Pennsylvania battleground page: 24 Target Races (HD-3,12,16,18,30,33,41,44,45,82,88,118,121,137,142,143,144,160; SD-6,14,16,24,36,40); composition 103D-100R / 23D-27R Source: https://www.dlcc.org/state/pa/ (retrieved 2026-10-15)dlcc_pr_pa_targets_2026-06-03.html— DLCC press release Jun 3 2026: 9 House + 3 Senate PA Target Races (and April first-50 slate) Source: https://www.dlcc.org/news/press/target-race-launch-dlcc-announces-latest-targets-in-pennsylvania/ (retrieved 2026-10-15)dlcc_pr_pinsley_sd16_2026-06-25.html— DLCC press release Jun 25 2026: Mark Pinsley SD-16 Target Race (23rd PA target) Source: https://www.dlcc.org/?p=19572 (retrieved 2026-10-15)dlcc_hd12_dukes.html— DLCC candidate page: Brandon Dukes HD-12 Target Race Source: https://www.dlcc.org/?p=20666 (retrieved 2026-10-15)dlcc_top10_races.html— DLCC Top 10 Races (October 2026): includes PA SD-6 Eileen Hartnett Albillar Source: https://www.dlcc.org/dlcc-top-10-races/ (retrieved 2026-10-15)rslc_statement_pa_primary_2026-05-21.html— RSLC statement May 21 2026: committed to defending PA Senate majority / winning PA House; no district list Source: https://rslc.gop/rslc-statement-on-pennsylvania-primary-2/ (retrieved 2026-10-15)politicspa_rslc_memo_2026-04-27.html— PoliticsPA Apr 27 2026 on RSLC memo (PA House must-win; Senate 27-23) Source: https://politicspa.com/rslc-says-gop-must-focus-on-winning-back-pennsylvania-state-house/146223/ (retrieved 2026-10-15)givegreen_pa_sdcc.html— PA Senate Democratic Campaign Committee profile: priority targets SD 24, 6, 16, 40 Source: https://www.givegreen.com/committees/pennsylvania-senate-democratic-campaign-committee (retrieved 2026-10-15)alternet_capstar_malone_sdcc_2025-12-04.html— Reprint of PA Capital-Star Dec 4 2025: SDCC targets SD 6/16/24/40 + defend SD-36; SRCC (Straw) on SD-36 Source: https://www.alternet.org/amp/dems-prepared-to-marshal-every-resource-sen-malone-launches-reelection-dems-eye-a-pa-senate-flip-2674368545 (retrieved 2026-10-15)spotlightpa_races_to_watch_2026-09-22.html— Spotlight PA Sept 22 2026: races to watch; 103-100 / 27-23; Dem targets SD 6,16,24,40; GOP targets SD 36,38,14; HD 88,72,144; Nuttycombe quote; HDCC statement Source: https://www.spotlightpa.org/news/2026/09/races-to-watch-pennsylvania-house-senate-2026-midterm-election-elections/ (retrieved 2026-10-15)whyy_races_to_watch_2026-10-13.html— WHYY Oct 13 2026: races that could decide control; 13 House + 7 Senate districts named Source: https://whyy.org/articles/pennsylvania-election-2026-state-house-senate-harrisburg-power-democratic-republican-parties/ (retrieved 2026-10-15)altoonamirror_control_on_ballot_2026-10-05.html— Altoona Mirror Oct 5 2026: control of House/Senate on ballot Source: https://www.altoonamirror.com/news/local-news/2026/10/pa-election2026-statehouse-senate-on-ballot/ (retrieved 2026-10-15)cityandstate_specials_2026-08-19.html— City & State PA Aug 19 2026: all 2026 House specials (HD 22, 42, 79, 193, 196, 12) Source: https://www.cityandstatepa.com/politics/2026/08/what-know-about-pennsylvanias-upcoming-special-elections/410599/ (retrieved 2026-10-15)cityandstate_gov_guide_2026-10.html— City & State PA Oct 2026 governor guide (cites Kalshi 97% Shapiro mid-Sept) Source: https://www.cityandstatepa.com/politics/2026/10/guide-pennsylvanias-2026-race-governor/416399/ (retrieved 2026-10-15)pahouse_mcclinton_103_2026-08-19.html— Speaker McClinton release Aug 19 2026: House will be 103 D / 100 R once Dukes sworn in (Sept) Source: https://pahouse.com/McClinton/InTheNews/NewsRelease/?id=144887 (retrieved 2026-10-15)ddhq_press_forecast_launch_2026-07-15.html— DDHQ press release Jul 15 2026: Dems 62% House, GOP 57% Senate Source: https://ddhq.io/press/decision-desk-hq-releases-2026-congressional-forecast-model (retrieved 2026-10-15)c270_ddhq_house_forecast_table.html— 270toWin table of DDHQ 2026 House forecast categories (PA-1,7,8,10,11), 'As of October 12, 2026' Source: https://www.270towin.com/2026-house-election/table/decision-desk-hq-2026-house-forecast (retrieved 2026-10-15)c270_ddhq_house_forecast_map.html— 270toWin DDHQ map page (embedded JSON seat_status) Source: https://www.270towin.com/2026-house-election/decision-desk-hq-2026-house-forecast (retrieved 2026-10-15)ddhq_pa07_forecast_page.html— DDHQ PA-7 race forecast page (returns 429 / Vercel security checkpoint to scripts) Source: https://integration-votes.decisiondeskhq.com/races/2026-11-03/pennsylvania-us-house-7-general-election/forecast (retrieved 2026-10-15)kalshi_markets_KXPAHOUSE.json— Kalshi: Pennsylvania State House control markets (KXPAHOUSE-262-DEM/GOP) Source: https://api.elections.kalshi.com/trade-api/v2/markets?series_ticker=KXPAHOUSE&limit=100 (retrieved 2026-10-15)kalshi_markets_KXPASEN.json— Kalshi: Pennsylvania State Senate control markets (KXPASEN-262-D/R) Source: https://api.elections.kalshi.com/trade-api/v2/markets?series_ticker=KXPASEN&limit=100 (retrieved 2026-10-15)kalshi_markets_GOVPARTYPA.json— Kalshi: PA governor party markets (GOVPARTYPA-26-D/R) Source: https://api.elections.kalshi.com/trade-api/v2/markets?series_ticker=GOVPARTYPA&limit=100 (retrieved 2026-10-15)kalshi_markets_KXPAHD12.json— Kalshi: PA State House District 12 general election winner Source: https://api.elections.kalshi.com/trade-api/v2/markets?series_ticker=KXPAHD12&limit=100 (retrieved 2026-10-15)kalshi_markets_KXSTATELEG.json— Kalshi: multi-state legislature control series (no PA entries; PA uses its own series) Source: https://api.elections.kalshi.com/trade-api/v2/markets?series_ticker=KXSTATELEG&limit=200&status=open (retrieved 2026-10-15)kalshi_series_elections.json— Kalshi: all Elections-category series (searched for PA tickers) Source: https://api.elections.kalshi.com/trade-api/v2/series?category=Elections&limit=500 (retrieved 2026-10-15)poly_event_pa_state_senate_2026.json— Polymarket Gamma: 'Pennsylvania State Senate Winner 2026?' event with D/R control markets Source: https://gamma-api.polymarket.com/events?slug=pennsylvania-state-senate-winner-2026 (retrieved 2026-10-15)poly_event_pa_governor_2026.json— Polymarket Gamma: PA Governor Election Winner (D/R) Source: https://gamma-api.polymarket.com/events?slug=pennsylvania-governor-winner-2026 (retrieved 2026-10-15)poly_event_pa_us_house_seats.json— Polymarket Gamma: How many US House seats will Democrats win in PA Source: https://gamma-api.polymarket.com/events?slug=how-many-house-seats-will-the-democrats-win-in-pennsylvania (retrieved 2026-10-15)poly_search_pennsylvania.json— Polymarket search 'pennsylvania' (no PA State House control market found) Source: https://gamma-api.polymarket.com/public-search?q=pennsylvania&limit_per_type=30 (retrieved 2026-10-15)poly_search_state_house.json— Polymarket search 'state house' (no PA entry) Source: https://gamma-api.polymarket.com/public-search?q=state%20house&limit_per_type=30 (retrieved 2026-10-15)poly_search_pennsylvania_house.json— Polymarket search 'pennsylvania house' (only US House + HD-12 special) Source: https://gamma-api.polymarket.com/public-search?q=pennsylvania%20house&limit_per_type=30 (retrieved 2026-10-15)- Gaps and caveats: see
data/raw/ratings/NOTES.mdin the repository.
Election returns (PA Department of State)
pados/erstat_2024_g_268768_20250129.txt— PA Department of State official 2024 General Election precinct-level returns (268,768 rows, comma-delimited, no header). Every row carries the precinct's State Senatorial and State House district (2022 LRC map). Source: https://www.pa.gov/content/dam/copapwp-pagov/en/dos/resources/voting-and-elections/bulk-data/2024-general-election/er/erstat_2024_g_268768_20250129.txt (retrieved 2026-10-15)pados/erstat_2024_g_readme.txt— Field layout, county codes, office codes and party codes for the 2024 precinct returns file. Source: https://www.pa.gov/content/dam/copapwp-pagov/en/dos/resources/voting-and-elections/bulk-data/2024-general-election/er/erstat_2024_g_readme.txt (retrieved 2026-10-15)pados/ElectionReturns_2022_General_PrecinctReturns.txt— PA DoS official 2022 General Election precinct-level returns (131,796 rows). Offices: USS, GOV, USC, STS, STH. District columns are the 2022 LRC map (first election on it). Source: https://www.pa.gov/content/dam/copapwp-pagov/en/dos/resources/voting-and-elections/bulk-data/ElectionReturns_2022_General_PrecinctReturns.txt (retrieved 2026-10-15)pados/ElectionReturns_2022_General_Readme.txt— Field layout / code tables for the 2022 precinct returns file. Source: https://www.pa.gov/content/dam/copapwp-pagov/en/dos/resources/voting-and-elections/bulk-data/ElectionReturns_2022_General_Readme.txt (retrieved 2026-10-15)pados/ElectionReturns_2020_General_PrecinctReturns.txt— PA DoS official 2020 General Election precinct-level returns (179,507 rows). Offices: USP, USC, STS, STH, ATT, AUD, TRE. District columns are the OLD 2011 LRC map. Source: https://www.pa.gov/content/dam/copapwp-pagov/en/dos/resources/voting-and-elections/bulk-data/ElectionReturns_2020_General_PrecinctReturns.txt (retrieved 2026-10-15)pados/ElectionReturns_2020_General_ReadMeFile.txt— Field layout / code tables for the 2020 precinct returns file. Source: https://www.pa.gov/content/dam/copapwp-pagov/en/dos/resources/voting-and-elections/bulk-data/ElectionReturns_2020_General_ReadMeFile.txt (retrieved 2026-10-15)lrc/2022_LRC-House-Final_block_equivalency.csv— PA Legislative Reapportionment Commission final House plan: 2020 census block GEOID -> district (337,039 rows, no header). Source: https://www.redistricting.state.pa.us/Resources/GISData/Districts/Legislative/House/2021-Final/CSV/2022%20LRC-House-Final.csv (retrieved 2026-10-15)lrc/2022_LRC-Senate-Final_block_equivalency.csv— LRC final Senate plan block equivalency file (337,039 rows, no header). Source: https://www.redistricting.state.pa.us/Resources/GISData/Districts/Legislative/Senate/2021-Final/CSV/2022%20LRC%20Senate%20Final.csv (retrieved 2026-10-15)wikipedia/2020_Pennsylvania_House_of_Representatives_election.html— Raw HTML; district-breakdown table used for pre-election incumbent name/party. Source: https://en.wikipedia.org/wiki/2020_Pennsylvania_House_of_Representatives_election (retrieved 2026-10-15)wikipedia/2020_Pennsylvania_Senate_election.html— Raw HTML; incumbents for the 25 odd-numbered Senate seats up in 2020. Source: https://en.wikipedia.org/wiki/2020_Pennsylvania_Senate_election (retrieved 2026-10-15)wikipedia/2022_Pennsylvania_House_of_Representatives_election.html— Raw HTML; incumbents (as assigned by Wikipedia editors to the NEW 2022 districts) and status. Source: https://en.wikipedia.org/wiki/2022_Pennsylvania_House_of_Representatives_election (retrieved 2026-10-15)wikipedia/2022_Pennsylvania_Senate_election.html— Raw HTML; incumbents for the 25 even-numbered Senate seats up in 2022. Source: https://en.wikipedia.org/wiki/2022_Pennsylvania_Senate_election (retrieved 2026-10-15)wikipedia/2024_Pennsylvania_House_of_Representatives_election.html— Raw HTML; incumbents (reflecting 2023-24 special elections) and status. Source: https://en.wikipedia.org/wiki/2024_Pennsylvania_House_of_Representatives_election (retrieved 2026-10-15)wikipedia/2024_Pennsylvania_Senate_election.html— Raw HTML; incumbents for the 25 odd-numbered Senate seats up in 2024. Source: https://en.wikipedia.org/wiki/2024_Pennsylvania_Senate_election (retrieved 2026-10-15)wikipedia/incumbents_— Parsed per-district incumbent name, party (D/R/I) and status for 2020/2022/2024 x house/senate. Source: (derived from the Wikipedia HTML above by pipeline/fetch/wikipedia_incumbents.py) (retrieved 2026-10-15)_ .csv ballotpedia/Pennsylvania_House_of_Representatives_elections_2022.html— Raw HTML (fallback source, not parsed). Source: https://ballotpedia.org/Pennsylvania_House_of_Representatives_elections,_2022 (retrieved 2026-10-15)- Gaps and caveats: see
data/raw/returns/NOTES.mdin the repository.
District and county boundaries
tl_2025_42_sldl.zip— US Census TIGER/Line 2025, Pennsylvania State Legislative Districts - Lower (House), 203 features, LSY=2024, NAD83 (EPSG:4269). Reflects the 2022 LRC Final Plan. Source: https://www2.census.gov/geo/tiger/TIGER2025/SLDL/tl_2025_42_sldl.zip (retrieved 2026-10-15)tl_2025_42_sldu.zip— US Census TIGER/Line 2025, Pennsylvania State Legislative Districts - Upper (Senate), 50 features, LSY=2024, NAD83 (EPSG:4269). Reflects the 2022 LRC Final Plan. Source: https://www2.census.gov/geo/tiger/TIGER2025/SLDU/tl_2025_42_sldu.zip (retrieved 2026-10-15)cb_2024_us_county_500k.zip— US Census 2024 Cartographic Boundary counties, 1:500k, all US (3,235 features); filtered to STATEFP=42 (67 PA counties) in the pipeline. Shoreline-clipped. Source: https://www2.census.gov/geo/tiger/GENZ2024/shp/cb_2024_us_county_500k.zip (retrieved 2026-10-15)lrc_2022_house_final.zip— PA Legislative Reapportionment Commission 2022 Final Plan - House (203 districts). Used only as a cross-check of the TIGER file. Source: https://www.redistricting.state.pa.us/Resources/GISData/Districts/Legislative/House/2021-Final/SHAPE/2022%20LRC-House-Final.zip (retrieved 2026-10-15)lrc_2022_senate_final.zip— PA Legislative Reapportionment Commission 2022 Final Plan - Senate (50 districts). Used only as a cross-check of the TIGER file. Source: https://www.redistricting.state.pa.us/Resources/GISData/Districts/Legislative/Senate/2021-Final/SHAPE/2022%20LRC-Senate-Final.zip (retrieved 2026-10-15)- Gaps and caveats: see
data/raw/shapes/NOTES.mdin the repository.