turnout = FileAttachment("Turnout_1980_2022_v1.2.csv").csv()
.then(data => data.map(d => ({
YEAR: parseInt(d.YEAR),
election_type: parseInt(d.YEAR) % 4 === 0 ? "Presidential" : "Midterm",
STATE: d.STATE.replace('*', ''),
STATE_ABV: d.STATE_ABV,
TOTAL_BALLOTS_COUNTED: d.TOTAL_BALLOTS_COUNTED ?
parseInt(d.TOTAL_BALLOTS_COUNTED.replace(/,/g, '')) : null,
VOTE_FOR_HIGHEST_OFFICE: d.VOTE_FOR_HIGHEST_OFFICE?.startsWith('http') ?
null :
(d.VOTE_FOR_HIGHEST_OFFICE ? parseInt(d.VOTE_FOR_HIGHEST_OFFICE.replace(/,/g, '')) : null),
VAP: d.VAP ?
parseInt(d.VAP.replace(/,/g, '')) : null,
NONCITIZEN_PCT: d.NONCITIZEN_PCT ?
parseFloat(d.NONCITIZEN_PCT.replace('%', '')) : null,
INELIGIBLE_PRISON: d.INELIGIBLE_PRISON ?
parseInt(d.INELIGIBLE_PRISON.replace(/,/g, '')) : null,
INELIGIBLE_PROBATION: d.INELIGIBLE_PROBATION ?
parseInt(d.INELIGIBLE_PROBATION.replace(/,/g, '')) : null,
INELIGIBLE_PAROLE: d.INELIGIBLE_PAROLE ?
parseInt(d.INELIGIBLE_PAROLE.replace(/,/g, '')) : null,
INELIGIBLE_FELONS_TOTAL: d.INELIGIBLE_FELONS_TOTAL ?
parseInt(d.INELIGIBLE_FELONS_TOTAL.replace(/,/g, '')) : null,
ELIGIBLE_OVERSEAS: d.ELIGIBLE_OVERSEAS,
VEP: d.VEP ?
parseInt(d.VEP.replace(/,/g, '')) : null,
VEP_TURNOUT_RATE: d.VEP_TURNOUT_RATE ?
parseFloat(d.VEP_TURNOUT_RATE.replace('%', '')) : null,
VAP_TURNOUT_RATE: d.VAP_TURNOUT_RATE ?
parseFloat(d.VAP_TURNOUT_RATE.replace('%', '')) : null
})))