2024-election-modelling

A walking stick to Nate Silver's sportscar
Log | Files | Refs | README

commit aad1cd725eee75e20021c0024d07a35098865943
parent 120d6f860dfa48e61c53dc4c4b9442e043b5b80d
Author: NunoSempere <nuno.semperelh@protonmail.com>
Date:   Sat, 13 Apr 2024 12:42:13 -0400

unify structs

Diffstat:
Rdata/2000.csv -> data/results/2000.csv | 0
Rdata/2004.csv -> data/results/2004.csv | 0
Rdata/2008.csv -> data/results/2008.csv | 0
Rdata/2012.csv -> data/results/2012.csv | 0
Rdata/2016.csv -> data/results/2016.csv | 0
Rdata/2020.csv -> data/results/2020.csv | 0
Mmain.go | 180++++++++++++++++++++++++++++++++++---------------------------------------------
7 files changed, 78 insertions(+), 102 deletions(-)

diff --git a/data/2000.csv b/data/results/2000.csv diff --git a/data/2004.csv b/data/results/2004.csv diff --git a/data/2008.csv b/data/results/2008.csv diff --git a/data/2012.csv b/data/results/2012.csv diff --git a/data/2016.csv b/data/results/2016.csv diff --git a/data/2020.csv b/data/results/2020.csv diff --git a/main.go b/main.go @@ -8,110 +8,99 @@ import ( "strings" ) -/* Electoral votes */ -type StateVotes struct { - State string - Votes int +type StateData struct { + State string + Votes int + Party2000 string + Party2004 string + Party2008 string + Party2012 string + Party2016 string + Party2020 string } -func readElectoralVotes(filename string) ([]StateVotes, error) { - var stateVotes []StateVotes +func readStateData() ([]StateData, error) { + var statesData map[string]StateData = make(map[string]StateData) + var years = []string{"2000", "2004", "2008", "2012", "2016", "2020"} - file, err := os.Open(filename) + /* Electoral votes for the 2004 election*/ + votesFilename := "data/electoral-college-votes.csv" + votesFile, err := os.Open(votesFilename) if err != nil { - return nil, fmt.Errorf("error opening the file: %v", err) + return nil, fmt.Errorf("error opening the votes file: %v", err) } - defer file.Close() - - reader := csv.NewReader(file) - // Skip the first row ('State, Votes' header) - if _, err := reader.Read(); err != nil { - return nil, fmt.Errorf("error reading header row: %v", err) + defer votesFile.Close() + votesReader := csv.NewReader(votesFile) + if _, err := votesReader.Read(); err != nil { // Skip header + return nil, fmt.Errorf("error reading votes header: %v", err) } - for { - record, err := reader.Read() - // End of file is expected, not an error in this context + record, err := votesReader.Read() if err != nil { - break + break // EOF or an error } - votes, err := strconv.Atoi(record[1]) if err != nil { - return nil, fmt.Errorf("error converting votes for %s to int: %v", record[0], err) + continue // Error in converting votes, skip this record } - stateVotes = append(stateVotes, StateVotes{State: record[0], Votes: votes}) - } - - if len(stateVotes) == 0 { - return nil, fmt.Errorf("no data found") - } - - return stateVotes, nil -} - -func findElectoralVotes(stateVotes []StateVotes, stateName string) (int, error) { - for _, sv := range stateVotes { - if strings.EqualFold(sv.State, stateName) { - return sv.Votes, nil + state := record[0] + if _, exists := statesData[state]; !exists { + statesData[state] = StateData{State: state, Votes: votes} } } - return 0, fmt.Errorf("state not found") -} - -/* Results for the elections */ - -type StateResult struct { - State string - Party string -} - -func readElectionResults(filename string) ([]StateResult, error) { - var results []StateResult - - file, err := os.Open(filename) - if err != nil { - return nil, fmt.Errorf("error opening the file: %v", err) - } - defer file.Close() - - reader := csv.NewReader(file) - // Skip the header - if _, err := reader.Read(); err != nil { - return nil, fmt.Errorf("error reading header row: %v", err) - } - - for { - record, err := reader.Read() + /* Election results */ + for _, year := range years { + resultsFilename := fmt.Sprintf("data/results/%s.csv", year) + resultsFile, err := os.Open(resultsFilename) if err != nil { - break // End of file or an error + return nil, fmt.Errorf("error opening the results file for %s: %v", year, err) + } + defer resultsFile.Close() + resultsReader := csv.NewReader(resultsFile) + if _, err := resultsReader.Read(); err != nil { // Skip header + return nil, fmt.Errorf("error reading results header for %s: %v", year, err) + } + for { + record, err := resultsReader.Read() + if err != nil { + break // EOF or an error + } + state, party := record[0], record[1] + data, exists := statesData[state] + if !exists { + continue // State not found in votes map, skip + } + // Update the party winning in the specific year + switch year { + case "2000": + data.Party2000 = party + case "2004": + data.Party2004 = party + case "2008": + data.Party2008 = party + case "2012": + data.Party2012 = party + case "2016": + data.Party2016 = party + case "2020": + data.Party2020 = party + } + statesData[state] = data } - results = append(results, StateResult{State: record[0], Party: record[1]}) - } - - if len(results) == 0 { - return nil, fmt.Errorf("no data found") } - return results, nil -} - -// findWinningParty searches the provided slice of StateResults for a given state and returns its winning party. -func findWinningParty(results []StateResult, stateName string) (string, error) { - for _, result := range results { - if strings.EqualFold(result.State, stateName) { - return result.Party, nil - } + // Convert statesData map to a slice for returning + var dataSlice []StateData + for _, data := range statesData { + dataSlice = append(dataSlice, data) } - // If the loop completes without finding the state, it's not in the list. - return "", fmt.Errorf("state not found") + return dataSlice, nil } func main() { - filename := "data/2000.csv" // Update with the actual filename - results, err := readElectionResults(filename) + stateDatas, err := readStateData() if err != nil { fmt.Println("Error:", err) return @@ -119,28 +108,15 @@ func main() { // Example states to query states := []string{"California", "Texas", "Florida"} - for _, state := range states { - party, err := findWinningParty(results, state) - if err != nil { - fmt.Printf("Error: %s\n", err) - } else { - fmt.Printf("%s won by %s in 2000 US election.\n", state, party) + for _, stateData := range stateDatas { + for _, state := range states { + if strings.EqualFold(stateData.State, state) { + fmt.Printf("%s: Votes: %d, Winners: 2000 - %s, 2004 - %s, 2008 - %s, 2012 - %s, 2016 - %s, 2020 - %s\n", + stateData.State, stateData.Votes, + stateData.Party2000, stateData.Party2004, stateData.Party2008, + stateData.Party2012, stateData.Party2016, stateData.Party2020) + break + } } } - - filename = "data/electoral-college-votes.csv" - stateVotes, err := readElectoralVotes(filename) - if err != nil { - fmt.Println("Error:", err) - return - } - for _, state := range states { - votes, err := findElectoralVotes(stateVotes, state) - if err != nil { - fmt.Printf("Error: %s\n", err) - } else { - fmt.Printf("%s has %d electoral votes.\n", state, votes) - } - } - }