Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HCP EP2024 #13

Merged
merged 33 commits into from
Apr 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
6631004
Change difference calculation according to new protocol
chrismostert Feb 12, 2024
88ba467
Make CSV threshold values dynamic
chrismostert Feb 12, 2024
3e8e56f
Add candidate votes to EML class
chrismostert Feb 12, 2024
1eedc7f
Implement switched candidates check at municipality level
chrismostert Feb 13, 2024
3a7263b
Allow passing neighbourhood data and save zip in EmlMetadata
chrismostert Feb 20, 2024
3d415a4
Add function for getting reference group based on neighbourhood data …
chrismostert Feb 21, 2024
b2c3142
Implement potentially switched candidates for neighbourhoods
chrismostert Feb 22, 2024
ba444fe
Properly handle invalid zip codes
chrismostert Feb 22, 2024
7393a46
Add unit test for switched candidate protocol_check
chrismostert Feb 22, 2024
bb0720c
Add test cases for neighbourhood functions
chrismostert Feb 22, 2024
4884f15
Don't add temporary/mobile polling stations to reporting neighbourhood
chrismostert Feb 22, 2024
08fd6a7
Add switched candidates to csv writer
chrismostert Feb 26, 2024
3bafb0b
Write switched candidate only if not excluded by neighbourhood check
chrismostert Feb 26, 2024
8067ec1
Pass reference group size for neighbourhood check
chrismostert Feb 26, 2024
ce56285
Move some of the logic to protocol_checks
chrismostert Feb 27, 2024
f55d2cd
Additional test for combining switched candidates at municipality and…
chrismostert Feb 27, 2024
44de198
Minor refactoring for switched candidates check
chrismostert Feb 27, 2024
0b5626b
Added some more test cases for 'public' facing switched candidate check
chrismostert Feb 28, 2024
85b7c33
Move constructing reference groups
chrismostert Mar 14, 2024
eb44687
Update readme
chrismostert Mar 14, 2024
61fca69
Add docstring documentation
chrismostert Mar 18, 2024
8ffbd03
Add election ID as identifying column
chrismostert Apr 8, 2024
30bcdfb
Add summarise function for topdesk import
chrismostert Apr 8, 2024
e6b74ac
Add summary to CSV output for topdesk import
chrismostert Apr 8, 2024
b8becff
Only write csv A if not already recounted. Always write CSV B
chrismostert Apr 8, 2024
03db6c7
Format reporting unit name to exclude zip code and prefix
chrismostert Apr 10, 2024
207d6c1
Add additional e2e testcases
chrismostert Apr 10, 2024
cdcbc8d
Add odt test cases for EP2024
chrismostert Apr 11, 2024
d996fcc
Simply summary sentence structure
chrismostert Apr 15, 2024
4e334dd
Don't floor output values but round to one digit
chrismostert Apr 25, 2024
7d39790
Change output text for topdesk import
chrismostert Apr 25, 2024
cc91e5a
Handle edge cases where zipcode is supplied without a space
chrismostert Apr 25, 2024
f2863c7
Explicitly indicate that eml files are testdata
chrismostert Apr 26, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@ on: push

jobs:
check:
runs-on: ubuntu-latest
runs-on: ubuntu-20.04
steps:
- name: Check out repository code
uses: actions/checkout@v4

- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: "3.8.18"
python-version: "3.8.0"

- name: Install pipenv
run: |
Expand Down
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -167,4 +167,6 @@ cython_debug/
testing_wip.py

# Output csv files
*.csv
a.csv
b.csv
c.csv
3 changes: 2 additions & 1 deletion Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,15 @@ name = "pypi"

[packages]
defusedxml = "0.7.1"
polars = "0.20.3"

[dev-packages]
pytest = "*"
pytest-cov = "*"

[requires]
python_version = "3.8"
python_full_version = "3.8.18"
python_full_version = "3.8.0"

[scripts]
test = "pytest"
143 changes: 78 additions & 65 deletions Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ De functie `create_csv_files` in `main.py` is het ingangspunt voor de code. Para
- `path_to_xml`: het pad naar het `.eml.xml` bestand waarover je de controle uit wilt voeren. Dit is dus een EML tellingsbestand (`id=510[a-dqrs]`)
- `dest_a`, `dest_b`, `dest_c`: paden waar respectievelijk controlebestanden `a`, `b` en `c` weggeschreven moeten worden. De precieze inhoud van deze bestanden wordt hieronder beschreven
- `path_to_odt`: optionele parameter, pad naar een proces verbaal in `.odt` formaat. Geldige bestanden zijn `Model_Na31-1.odt` voor een decentrale- en `Model_Na31-2.odt` voor een centrale stemopneming.
- `path_to_neighbourhood_data`: optionele parameter, pad naar wijkdata in `.parquet` of `.csv` formaat. In `data/` staat het het meest recente beschikbare bestand. (CBS update deze eens in de zoveel tijd, dus deze zal niet altijd 100% up-to-date zijn).

## Lijst met controles
Hieronder een korte beschrijving van de controles die onderdeel zijn van HCP. Deze zijn geïmplementeerd in `protocol_checks.py` en worden aangeroepen in `EML::run_protocol` in `eml.py`.
Expand All @@ -19,11 +20,12 @@ Hieronder een korte beschrijving van de controles die onderdeel zijn van HCP. De
| `check_inexplicable_difference` | Geeft de waarde terug die ingevuld is onder 'geen verklaring' in de EML | In `a.csv` een waarde in de kolom "Aantal geen verklaring voor verschil" bij stembureaus *mits deze ongelijk is aan 0* |
| `check_explanation_sum_difference` | Geeft het verschil tussen (het totaal aantal stemmen en het aantal toegelaten kiezers) en de som van de ingevulde verklaringen. Dus bij 6 stemmen, 5 toegelaten kiezers en een som van verklaringen van 0 is deze waarde 1 (`(6-5) - 0`) | In `a.csv` het aantal dat uit deze verschilberekening komt in de kolom "Aantal ontbrekende verklaringen voor verschil" *mits deze ongelijk is aan 0*
| `check_too_many_rejected_votes` | Controleert of het *percentage* blanco of ongeldige stemmen ten opzichte van het totaal aantal *uitgebrachte* stemmen groter of gelijk is aan een in te stellen percentage. | In `b.csv` een "ja (`{percentage}`%)" in de bijbehorende kolom bij stembureaus waar dit het geval is
| `check_too_many_explained_differences` | Controleert of de som van *verklaarde* verschillen ten opzichte van het totaal aantal *uitgebrachte* stemmen groter of gelijk is aan een in te stellen percentage. | In `b.csv` een "ja (`{percentage}`%)" in de bijbehorende kolom bij stembureaus waar dit het geval is
| `check_too_many_differences` | Controleert of het absolute verschil tussen toegelaten kiezers ten het totaal aantal uitgebrachte stemmen groter of gelijk is aan een in te stellen percentage *of* absoluuut aantal. | In `b.csv` een "ja (`{percentage}`%)" of "ja (`{aantal}`)" in de bijbehorende kolom bij stembureaus waar dit het geval is
| `check_parties_with_large_percentage_difference` | Controleert of er partijen zijn die bij een stembureau een percentage stemmen heeft behaald dat ten minste een in te stellen aantal percentagepunten verschilt van het gemiddelde in die *gemeente*. Voor de berekening van het gemiddelde in die gemeente wordt het betreffende stembureau niet meegenomen | In `b.csv` de namen van de partijen waarvoor dit het geval is, gescheiden door een komma bij de stembureaus waar dit het geval is
| `check_potentially_switched_candidates` | Controleert of voorkeursstemmen tussen twee kandidaten op dezelfde lijst mogelijk verwisseld zijn. Dat wil zeggen dat een van de kandidaten veel meer (in te stellen hoeveel) stemmen heeft gekregen dan verwacht terwijl een ander veel minder gekregen heeft dan verwacht. | In `b.csv` de paren kandidaten waarvoor dit het geval is, gescheiden door een nieuwe regel (`\n`) in het formaat: *"Mogelijke verwisseling op lijst `i` (`lijstnaam`). Kandidaat `j` had `v_j` stemmen maar verwachting was `e_j`. Kandidaat `k` had `v_k` stemmen maar verwachting was `e_k`"*

## .odt verwerking
Naast de checks die hierboven beschreven zijn, kan ook het proces-verbaal dat bij een telbestand meegeleverd wordt geparsed worden. Het doel hiervan is om stembureau's te identificeren die al een hertelling uitgevoerd hebben. Als dit het geval is, dan wordt in `a.csv` de waarde "x of ja" toegevoegd aan de kolom "Al hergeteld". In alle gevallen moet zowel het nummer als de naam van het stembureau genoteerd staan om zeker te weten dat we deze koppelen aan het juiste stembureau in de EML. Is deze koppeling om welke reden dan ook niet mogelijk, dan gaan we er van uit dat er **niet** herteld is.
Naast de checks die hierboven beschreven zijn, kan ook het proces-verbaal dat bij een telbestand meegeleverd wordt geparsed worden. Het doel hiervan is om stembureau's te identificeren die al een hertelling uitgevoerd hebben. Als dit het geval is, dan wordt in `a.csv` de waarde "x of ja" toegevoegd aan de kolom "Al herteld". In alle gevallen moet zowel het nummer als de naam van het stembureau genoteerd staan om zeker te weten dat we deze koppelen aan het juiste stembureau in de EML. Is deze koppeling om welke reden dan ook niet mogelijk, dan gaan we er van uit dat er **niet** herteld is.

De informatie is afkomstig uit:
#### [Model_Na31-1.odt](https://www.rijksoverheid.nl/onderwerpen/verkiezingen/documenten/publicaties/2022/11/18/model-na-31-1)
Expand Down
Binary file added data/zip_to_neighbourhood_2023.parquet
Binary file not shown.
Loading
Loading