stembureau-meting/jupyter/stembureau_data.ipynb
2022-05-31 13:03:58 +02:00

2.9 MiB
Raw Blame History

None <html lang="en"> <head> gitea_input3447399613 </head>

Datasets gemeenteraadsverkiezingen 2022

Deze notebook heeft als doel de stemlokalen van de gemeenteraadsverkiezingen van 2022 te analyseren. Er zal hier stap voor stap door de data gelopen worden om het proces reproduceerbaar te maken voor latere verkiezingen. De eerste stap was de data ophalen van de bronnen, zowel van de overheid als van 'Waar is mijn stemlokaal' (voor geografische data van de stemlokalen). Deze bronnen zijn voor de verkiezingen van 2022 gebruikt:

Data inladen en eerste analyse

OSF/VK GeoJSON dataset: verkiezingsuitslagen per stembureau inclusief coördinaten

Als eerste importeren we de data voor de analyse, daarna kunnen we kijken hoe goed de data is, hoe we het aan kunnen vullen, en wat er mee te doen. We kijken eerst naar het GeoJSON bestand van Open State Foundation en de Volkskrant (OSF/VK). Daarin zijn de coördinaten van alle locaties van bijna alle stembureaus toegevoegd aan de lijst met stembureaus uit de officiële uitslagen zoals gepubliceerd door de Kiesraad. We kunnen een GeoJSON bestand direct inladen met geopandas.

In [1]:
import warnings
warnings.filterwarnings('ignore')
In [2]:
import pandas as pd
import geopandas as gpd

crs = {'init':'EPSG:4326'}
df_geojson = gpd.read_file(r'../data/2022gr.geo.json', crs=crs)

CBS dataset: gemeentegrenzen en informatie

We importeren nu de gemeente shapefile kaart van het CBS, om de overlay van onze stemlokalen eroverheen te leggen.

In [3]:
nl_map = gpd.read_file(r'../data/shape/Netherlands_shapefile/gemeente_2021_v1.shp')
plot = nl_map.to_crs(epsg=4326).plot()
plot.set_title('Plot van de gemeenten uit de CBS Wijk- en buurtkaart 2021')
plot
Out[3]:
<AxesSubplot:title={'center':'Plot van de gemeenten uit de CBS Wijk- en buurtkaart 2021'}>
No description has been provided for this image

De CBS Wijk- en buurtkaart 2021 bevat ook naast de gemeentegrenzen ook informatie (bv. aantal inwoners) over de gemeenten. We printen dat hier uit om daar een beeld van te krijgen.

In [4]:
print(nl_map)
    GM_CODE            GM_NAAM  H2O       OAD      STED  BEV_DICHTH  AANT_INW  \
0    GM0034             Almere   JA -99999999 -99999999   -99999999 -99999999   
1    GM0050           Zeewolde   JA -99999999 -99999999   -99999999 -99999999   
2    GM0060            Ameland   JA -99999999 -99999999   -99999999 -99999999   
3    GM0072          Harlingen   JA -99999999 -99999999   -99999999 -99999999   
4    GM0088    Schiermonnikoog   JA -99999999 -99999999   -99999999 -99999999   
..      ...                ...  ...       ...       ...         ...       ...   
430  GM1966       Het Hogeland  NEE       414         5          99     47834   
431  GM1969     Westerkwartier  NEE       476         5         176     63678   
432  GM1970  Noardeast-Fryslân  NEE       463         5         120     45481   
433  GM1978        Molenlanden  NEE       393         5         243     44130   
434  GM1979          Eemsdelta  NEE       692         4         170     45587   

     AANT_MAN  AANT_VROUW  P_00_14_JR  ...  P_TURKIJE  P_OVER_NW   OPP_TOT  \
0   -99999999   -99999999   -99999999  ...  -99999999  -99999999 -99999999   
1   -99999999   -99999999   -99999999  ...  -99999999  -99999999 -99999999   
2   -99999999   -99999999   -99999999  ...  -99999999  -99999999 -99999999   
3   -99999999   -99999999   -99999999  ...  -99999999  -99999999 -99999999   
4   -99999999   -99999999   -99999999  ...  -99999999  -99999999 -99999999   
..        ...         ...         ...  ...        ...        ...       ...   
430     24052       23782          15  ...          0          3     90308   
431     32034       31644          17  ...          0          3     36887   
432     22879       22602          17  ...          0          2     51645   
433     22317       21813          18  ...          0          2     19158   
434     22841       22746          14  ...          2          5     36407   

     OPP_LAND  OPP_WATER  JRSTATCODE  JAAR     Shape_Leng    Shape_Area  \
0   -99999999  -99999999  2021GM0034  2021  122665.358635  1.095623e+08   
1   -99999999  -99999999  2021GM0050  2021   83290.773617  1.633050e+07   
2   -99999999  -99999999  2021GM0060  2021  156406.894023  2.085914e+08   
3   -99999999  -99999999  2021GM0072  2021  104274.683035  3.618323e+08   
4   -99999999  -99999999  2021GM0088  2021  152568.858991  1.624101e+08   
..        ...        ...         ...   ...            ...           ...   
430     48249      42059  2021GM1966  2021  321301.166576  4.875998e+08   
431     36269        618  2021GM1969  2021   99030.762281  3.688457e+08   
432     37783      13862  2021GM1970  2021  238426.959926  3.837930e+08   
433     18173        986  2021GM1978  2021   88570.376691  1.915841e+08   
434     26789       9618  2021GM1979  2021  173966.493452  2.727771e+08   

                                              geometry  
0    MULTIPOLYGON (((150213.998 479503.726, 150087....  
1    MULTIPOLYGON (((170588.413 486792.192, 170570....  
2    POLYGON ((196000.000 610000.000, 196000.000 60...  
3    MULTIPOLYGON (((158392.775 580357.500, 158387....  
4    POLYGON ((219000.000 616567.418, 219000.000 61...  
..                                                 ...  
430  MULTIPOLYGON (((217037.735 601967.991, 217043....  
431  POLYGON ((215186.661 595044.495, 215190.788 59...  
432  MULTIPOLYGON (((207769.575 603284.528, 207773....  
433  POLYGON ((123569.533 440132.167, 123576.153 44...  
434  MULTIPOLYGON (((269190.000 594253.046, 269190....  

[435 rows x 38 columns]

Hieronder plotten we de gegevens van stembureaus op de kaart van het CBS:

In [5]:
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize = (10,10))
nl_map.to_crs(epsg=4326).plot(ax=ax, color='lightgrey')
df_geojson.plot(ax=ax)
ax.set_title('Stembureaus op de gemeentekaart van het CBS')
Out[5]:
Text(0.5, 1.0, 'Stembureaus op de gemeentekaart van het CBS')
No description has been provided for this image

We hebben hier een probleem dat sommige punten de coördinaten 0,0 hebben, dit is niet iets wat we willen weergeven. Laten we eerst kijken waarom dit het geval is in de data voordat we het er helemaal uithalen.

In [6]:
for index, row in df_geojson.iterrows():
    if (row.geometry.centroid.x == 0.00000):
        print(row)
Stembureau                                     32
Adres                                            
Locatie                                      SB32
description        Stembureau Mobiel Stembureau 1
Geldige stemmen                                99
                                ...              
één-Ermelo                                    NaN
gmcode                                     GM0109
election                         GR2022_Coevorden
electionName          Gemeenteraad Coevorden 2022
geometry                              POINT (0 0)
Name: 2520, Length: 973, dtype: object
Stembureau                                     33
Adres                                            
Locatie                                      SB33
description        Stembureau Mobiel Stembureau 2
Geldige stemmen                               115
                                ...              
één-Ermelo                                    NaN
gmcode                                     GM0109
election                         GR2022_Coevorden
electionName          Gemeenteraad Coevorden 2022
geometry                              POINT (0 0)
Name: 2521, Length: 973, dtype: object
Stembureau                                   157
Adres                                           
Locatie                                    SB157
description        Stembureau Stembureau Stembus
Geldige stemmen                               72
                               ...              
één-Ermelo                                   NaN
gmcode                                    GM0150
election                         GR2022_Deventer
electionName          Gemeenteraad Deventer 2022
geometry                             POINT (0 0)
Name: 2918, Length: 973, dtype: object
Stembureau                                                       171
Adres                                                               
Locatie                                                        SB171
description        Stembureau Stembureau Stembureau op locatie al...
Geldige stemmen                                                  174
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0772
election                                            GR2022_Eindhoven
electionName                             Gemeenteraad Eindhoven 2022
geometry                                                 POINT (0 0)
Name: 3579, Length: 973, dtype: object
Stembureau                                                       172
Adres                                                               
Locatie                                                        SB172
description        Stembureau Stembureau Stembureau op locatie al...
Geldige stemmen                                                   66
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0772
election                                            GR2022_Eindhoven
electionName                             Gemeenteraad Eindhoven 2022
geometry                                                 POINT (0 0)
Name: 3580, Length: 973, dtype: object
Stembureau                                                       173
Adres                                                               
Locatie                                                        SB173
description        Stembureau Stembureau Stembureau op locatie al...
Geldige stemmen                                                  162
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0772
election                                            GR2022_Eindhoven
electionName                             Gemeenteraad Eindhoven 2022
geometry                                                 POINT (0 0)
Name: 3581, Length: 973, dtype: object
Stembureau                                                       174
Adres                                                               
Locatie                                                        SB174
description        Stembureau Stembureau Stembureau op locatie al...
Geldige stemmen                                                   65
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0772
election                                            GR2022_Eindhoven
electionName                             Gemeenteraad Eindhoven 2022
geometry                                                 POINT (0 0)
Name: 3582, Length: 973, dtype: object
Stembureau                                                       175
Adres                                                               
Locatie                                                        SB175
description        Stembureau Stembureau Stembureau op locatie al...
Geldige stemmen                                                  121
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0772
election                                            GR2022_Eindhoven
electionName                             Gemeenteraad Eindhoven 2022
geometry                                                 POINT (0 0)
Name: 3583, Length: 973, dtype: object
Stembureau                                                        39
Adres                                                               
Locatie                                                         SB39
description        Stembureau Mobiel stembureau met beperkte toeg...
Geldige stemmen                                                   56
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM1735
election                                         GR2022_HofvanTwente
electionName                        Gemeenteraad Hof van Twente 2022
geometry                                                 POINT (0 0)
Name: 5494, Length: 973, dtype: object
Stembureau                                                        34
Adres                                                               
Locatie                                                         SB34
description        Stembureau Stembureau Mobiel stembureau verzor...
Geldige stemmen                                                  119
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0166
election                                               GR2022_Kampen
electionName                                Gemeenteraad Kampen 2022
geometry                                                 POINT (0 0)
Name: 5784, Length: 973, dtype: object
Stembureau                                                        35
Adres                                                               
Locatie                                                         SB35
description        Stembureau Stembureau Mobiel stembureau verzor...
Geldige stemmen                                                  151
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0166
election                                               GR2022_Kampen
electionName                                Gemeenteraad Kampen 2022
geometry                                                 POINT (0 0)
Name: 5785, Length: 973, dtype: object
Stembureau                                            11
Adres                                                   
Locatie                                             SB11
description        Stembureau Mobiel stembureau Ommedijk
Geldige stemmen                                       14
                                   ...                  
één-Ermelo                                           NaN
gmcode                                            GM0547
election                               GR2022_Leiderdorp
electionName                Gemeenteraad Leiderdorp 2022
geometry                                     POINT (0 0)
Name: 6260, Length: 973, dtype: object
Stembureau                                                        12
Adres                                                               
Locatie                                                         SB12
description        Stembureau Mobiel stembureau Van Alphenstaete ...
Geldige stemmen                                                   68
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0547
election                                           GR2022_Leiderdorp
electionName                            Gemeenteraad Leiderdorp 2022
geometry                                                 POINT (0 0)
Name: 6261, Length: 973, dtype: object
Stembureau                                   70
Adres                                          
Locatie                                    SB70
description        Stembureau Mobiel stembureau
Geldige stemmen                              34
                               ...             
één-Ermelo                                  NaN
gmcode                                   GM0938
election                        GR2022_Meerssen
electionName         Gemeenteraad Meerssen 2022
geometry                            POINT (0 0)
Name: 6738, Length: 973, dtype: object
Stembureau                                   71
Adres                                          
Locatie                                    SB71
description        Stembureau Mobiel stembureau
Geldige stemmen                              43
                               ...             
één-Ermelo                                  NaN
gmcode                                   GM0938
election                        GR2022_Meerssen
electionName         Gemeenteraad Meerssen 2022
geometry                            POINT (0 0)
Name: 6739, Length: 973, dtype: object
Stembureau                                             699
Adres                                                     
Locatie                                              SB699
description        Stembureau Stembureau Mobiel stembureau
Geldige stemmen                                         59
                                    ...                   
één-Ermelo                                             NaN
gmcode                                              GM0687
election                                 GR2022_Middelburg
electionName                  Gemeenteraad Middelburg 2022
geometry                                       POINT (0 0)
Name: 6863, Length: 973, dtype: object
Stembureau                                   32
Adres                                          
Locatie                                    SB32
description         Stembureau Mobielstembureau
Geldige stemmen                              63
                               ...             
één-Ermelo                                  NaN
gmcode                                   GM1930
election                      GR2022_Nissewaard
electionName       Gemeenteraad Nissewaard 2022
geometry                            POINT (0 0)
Name: 7348, Length: 973, dtype: object
Stembureau                                   90
Adres                                          
Locatie                                    SB90
description            Stembureau Roll and Vote
Geldige stemmen                             339
                               ...             
één-Ermelo                                  NaN
gmcode                                   GM1930
election                      GR2022_Nissewaard
electionName       Gemeenteraad Nissewaard 2022
geometry                            POINT (0 0)
Name: 7364, Length: 973, dtype: object
Stembureau                                   19
Adres                                          
Locatie                                    SB19
description        Stembureau Mobiel stembureau
Geldige stemmen                              77
                               ...             
één-Ermelo                                  NaN
gmcode                                   GM0086
election                      GR2022_Opsterland
electionName       Gemeenteraad Opsterland 2022
geometry                            POINT (0 0)
Name: 7857, Length: 973, dtype: object
Stembureau                                                    1428
Adres                                                             
Locatie                                                     SB1428
description        Stembureau Drive-thru parkeerplaats Rusheuvel 1
Geldige stemmen                                                163
                                        ...                       
één-Ermelo                                                     NaN
gmcode                                                      GM0828
election                                                GR2022_Oss
electionName                                 Gemeenteraad Oss 2022
geometry                                               POINT (0 0)
Name: 7912, Length: 973, dtype: object
Stembureau                                                    1437
Adres                                                             
Locatie                                                     SB1437
description        Stembureau Drive-thru parkeerplaats Rusheuvel 2
Geldige stemmen                                                239
                                        ...                       
één-Ermelo                                                     NaN
gmcode                                                      GM0828
election                                                GR2022_Oss
electionName                                 Gemeenteraad Oss 2022
geometry                                               POINT (0 0)
Name: 7913, Length: 973, dtype: object
Stembureau                                                    1528
Adres                                                             
Locatie                                                     SB1528
description        Stembureau Drive-thru parkeerplaats Rusheuvel 1
Geldige stemmen                                                323
                                        ...                       
één-Ermelo                                                     NaN
gmcode                                                      GM0828
election                                                GR2022_Oss
electionName                                 Gemeenteraad Oss 2022
geometry                                               POINT (0 0)
Name: 7923, Length: 973, dtype: object
Stembureau                                                    1537
Adres                                                             
Locatie                                                     SB1537
description        Stembureau Drive-thru parkeerplaats Rusheuvel 2
Geldige stemmen                                                208
                                        ...                       
één-Ermelo                                                     NaN
gmcode                                                      GM0828
election                                                GR2022_Oss
electionName                                 Gemeenteraad Oss 2022
geometry                                               POINT (0 0)
Name: 7924, Length: 973, dtype: object
Stembureau                                 1541
Adres                                          
Locatie                                  SB1541
description        Stembureau Mobiel stembureau
Geldige stemmen                             125
                               ...             
één-Ermelo                                  NaN
gmcode                                   GM0828
election                             GR2022_Oss
electionName              Gemeenteraad Oss 2022
geometry                            POINT (0 0)
Name: 7926, Length: 973, dtype: object
Stembureau                                         200
Adres                                                 
Locatie                                          SB200
description            Stembureau Mobiel stembureau Ma
Geldige stemmen                                     30
                                  ...                 
één-Ermelo                                         NaN
gmcode                                          GM1509
election                       GR2022_OudeIJsselstreek
electionName       Gemeenteraad Oude IJsselstreek 2022
geometry                                   POINT (0 0)
Name: 7958, Length: 973, dtype: object
Stembureau                                         201
Adres                                                 
Locatie                                          SB201
description            Stembureau Mobiel stembureau Di
Geldige stemmen                                     30
                                  ...                 
één-Ermelo                                         NaN
gmcode                                          GM1509
election                       GR2022_OudeIJsselstreek
electionName       Gemeenteraad Oude IJsselstreek 2022
geometry                                   POINT (0 0)
Name: 7959, Length: 973, dtype: object
Stembureau                                         202
Adres                                                 
Locatie                                          SB202
description           Stembureau Mobiel stembureau Woe
Geldige stemmen                                     44
                                  ...                 
één-Ermelo                                         NaN
gmcode                                          GM1509
election                       GR2022_OudeIJsselstreek
electionName       Gemeenteraad Oude IJsselstreek 2022
geometry                                   POINT (0 0)
Name: 7960, Length: 973, dtype: object
Stembureau                                                        30
Adres                                                               
Locatie                                                         SB30
description        Stembureau Stembureau voor de telling stembure...
Geldige stemmen                                                 2004
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM1926
election                                    GR2022_PijnackerNootdorp
electionName                    Gemeenteraad Pijnacker-Nootdorp 2022
geometry                                                 POINT (0 0)
Name: 8108, Length: 973, dtype: object
Stembureau                                                        40
Adres                                                               
Locatie                                                         SB40
description        Stembureau Stembureau voor de telling stembure...
Geldige stemmen                                                 2953
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM1926
election                                    GR2022_PijnackerNootdorp
electionName                    Gemeenteraad Pijnacker-Nootdorp 2022
geometry                                                 POINT (0 0)
Name: 8109, Length: 973, dtype: object
Stembureau                                                      990
Adres                                                              
Locatie                                                       SB990
description        Stembureau Mobiel stembureau (meerdere plaatsen)
Geldige stemmen                                                  47
                                         ...                       
één-Ermelo                                                      NaN
gmcode                                                       GM0177
election                                              GR2022_Raalte
electionName                               Gemeenteraad Raalte 2022
geometry                                                POINT (0 0)
Name: 8161, Length: 973, dtype: object
Stembureau                                                      991
Adres                                                              
Locatie                                                       SB991
description        Stembureau Mobiel stembureau (meerdere plaatsen)
Geldige stemmen                                                  70
                                         ...                       
één-Ermelo                                                      NaN
gmcode                                                       GM0177
election                                              GR2022_Raalte
electionName                               Gemeenteraad Raalte 2022
geometry                                                POINT (0 0)
Name: 8162, Length: 973, dtype: object
Stembureau                                                      992
Adres                                                              
Locatie                                                       SB992
description        Stembureau Mobiel stembureau (meerdere plaatsen)
Geldige stemmen                                                  39
                                         ...                       
één-Ermelo                                                      NaN
gmcode                                                       GM0177
election                                              GR2022_Raalte
electionName                               Gemeenteraad Raalte 2022
geometry                                                POINT (0 0)
Name: 8163, Length: 973, dtype: object
Stembureau                                           17
Adres                                                  
Locatie                                            SB17
description        Stembureau Mobiel Stembureau dinsdag
Geldige stemmen                                     115
                                   ...                 
één-Ermelo                                          NaN
gmcode                                           GM1742
election                           GR2022_RijssenHolten
electionName           Gemeenteraad Rijssen-Holten 2022
geometry                                    POINT (0 0)
Name: 8318, Length: 973, dtype: object
Stembureau                                    228
Adres                                            
Locatie                                     SB228
description        Stembureau Stembureau Drive-in
Geldige stemmen                                80
                                ...              
één-Ermelo                                    NaN
gmcode                                     GM0606
election                          GR2022_Schiedam
electionName           Gemeenteraad Schiedam 2022
geometry                              POINT (0 0)
Name: 9093, Length: 973, dtype: object
Stembureau                                           30
Adres                                                  
Locatie                                            SB30
description                Stembureau Mobiel stembureau
Geldige stemmen                                      25
                                   ...                 
één-Ermelo                                          NaN
gmcode                                           GM1676
election                       GR2022_SchouwenDuiveland
electionName       Gemeenteraad Schouwen-Duiveland 2022
geometry                                    POINT (0 0)
Name: 9151, Length: 973, dtype: object
Stembureau                                           31
Adres                                                  
Locatie                                            SB31
description                Stembureau Mobiel stembureau
Geldige stemmen                                       8
                                   ...                 
één-Ermelo                                          NaN
gmcode                                           GM1676
election                       GR2022_SchouwenDuiveland
electionName       Gemeenteraad Schouwen-Duiveland 2022
geometry                                    POINT (0 0)
Name: 9152, Length: 973, dtype: object
Stembureau                                           32
Adres                                                  
Locatie                                            SB32
description                Stembureau Mobiel stembureau
Geldige stemmen                                      24
                                   ...                 
één-Ermelo                                          NaN
gmcode                                           GM1676
election                       GR2022_SchouwenDuiveland
electionName       Gemeenteraad Schouwen-Duiveland 2022
geometry                                    POINT (0 0)
Name: 9153, Length: 973, dtype: object
Stembureau                                          76
Adres                                                 
Locatie                                           SB76
description        Stembureau Rondvaartboot Toerist VI
Geldige stemmen                                    148
                                  ...                 
één-Ermelo                                         NaN
gmcode                                          GM1900
election                         GR2022_SudwestFryslan
electionName         Gemeenteraad Súdwest-Fryslân 2022
geometry                                   POINT (0 0)
Name: 9661, Length: 973, dtype: object
Stembureau                                                        68
Adres                                                               
Locatie                                                         SB68
description        Stembureau Drive Inn (evenemententerrein Het L...
Geldige stemmen                                                  285
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0855
election                                              GR2022_Tilburg
electionName                               Gemeenteraad Tilburg 2022
geometry                                                 POINT (0 0)
Name: 9853, Length: 973, dtype: object
Stembureau                                   14
Adres                                          
Locatie                                    SB14
description        Stembureau Mobiel Stembureau
Geldige stemmen                              24
                               ...             
één-Ermelo                                  NaN
gmcode                                   GM0047
election                         GR2022_Veendam
electionName          Gemeenteraad Veendam 2022
geometry                            POINT (0 0)
Name: 10427, Length: 973, dtype: object
Stembureau                                   18
Adres                                          
Locatie                                    SB18
description        Stembureau Mobiel stembureau
Geldige stemmen                              50
                               ...             
één-Ermelo                                  NaN
gmcode                                   GM0047
election                         GR2022_Veendam
electionName          Gemeenteraad Veendam 2022
geometry                            POINT (0 0)
Name: 10431, Length: 973, dtype: object
Stembureau                                                   23
Adres                                                          
Locatie                                                    SB23
description        Stembureau Stembureau Mobiel: Wkp Zout Veere
Geldige stemmen                                              55
                                       ...                     
één-Ermelo                                                  NaN
gmcode                                                   GM0717
election                                           GR2022_Veere
electionName                            Gemeenteraad Veere 2022
geometry                                            POINT (0 0)
Name: 10497, Length: 973, dtype: object
Stembureau                                            24
Adres                                                   
Locatie                                             SB24
description        Stembureau Stembureau Mobiel: Okp Dom
Geldige stemmen                                       35
                                   ...                  
één-Ermelo                                           NaN
gmcode                                            GM0717
election                                    GR2022_Veere
electionName                     Gemeenteraad Veere 2022
geometry                                     POINT (0 0)
Name: 10498, Length: 973, dtype: object
Stembureau                                     115
Adres                                             
Locatie                                      SB115
description        Stembureau Tent Nijverheidslaan
Geldige stemmen                                258
                                ...               
één-Ermelo                                     NaN
gmcode                                      GM0861
election                          GR2022_Veldhoven
electionName           Gemeenteraad Veldhoven 2022
geometry                               POINT (0 0)
Name: 10525, Length: 973, dtype: object
Stembureau                                     116
Adres                                             
Locatie                                      SB116
description        Stembureau Tent Nijverheidslaan
Geldige stemmen                                377
                                ...               
één-Ermelo                                     NaN
gmcode                                      GM0861
election                          GR2022_Veldhoven
electionName           Gemeenteraad Veldhoven 2022
geometry                               POINT (0 0)
Name: 10526, Length: 973, dtype: object
Stembureau                                         117
Adres                                                 
Locatie                                          SB117
description        Stembureau Tent Peter Benenson park
Geldige stemmen                                    285
                                  ...                 
één-Ermelo                                         NaN
gmcode                                          GM0861
election                              GR2022_Veldhoven
electionName               Gemeenteraad Veldhoven 2022
geometry                                   POINT (0 0)
Name: 10527, Length: 973, dtype: object
Stembureau                                         118
Adres                                                 
Locatie                                          SB118
description        Stembureau Tent Peter Benenson park
Geldige stemmen                                    329
                                  ...                 
één-Ermelo                                         NaN
gmcode                                          GM0861
election                              GR2022_Veldhoven
electionName               Gemeenteraad Veldhoven 2022
geometry                                   POINT (0 0)
Name: 10528, Length: 973, dtype: object
Stembureau                                              310
Adres                                                      
Locatie                                               SB310
description        Stembureau Mobiel Bijzonder stembureau 1
Geldige stemmen                                          26
                                     ...                   
één-Ermelo                                              NaN
gmcode                                               GM0983
election                                       GR2022_Venlo
electionName                        Gemeenteraad Venlo 2022
geometry                                        POINT (0 0)
Name: 10623, Length: 973, dtype: object
Stembureau                                              311
Adres                                                      
Locatie                                               SB311
description        Stembureau Mobiel Bijzonder stembureau 2
Geldige stemmen                                          55
                                     ...                   
één-Ermelo                                              NaN
gmcode                                               GM0983
election                                       GR2022_Venlo
electionName                        Gemeenteraad Venlo 2022
geometry                                        POINT (0 0)
Name: 10624, Length: 973, dtype: object
Stembureau                                     88
Adres                                            
Locatie                                      SB88
description        Stembureau Mobiel stembureau 1
Geldige stemmen                                78
                                ...              
één-Ermelo                                    NaN
gmcode                                     GM1949
election                         GR2022_Waadhoeke
electionName          Gemeenteraad Waadhoeke 2022
geometry                              POINT (0 0)
Name: 10894, Length: 973, dtype: object
Stembureau                                     89
Adres                                            
Locatie                                      SB89
description        Stembureau Mobiel stembureau 2
Geldige stemmen                                35
                                ...              
één-Ermelo                                    NaN
gmcode                                     GM1949
election                         GR2022_Waadhoeke
electionName          Gemeenteraad Waadhoeke 2022
geometry                              POINT (0 0)
Name: 10895, Length: 973, dtype: object
Stembureau                                              31
Adres                                                     
Locatie                                               SB31
description        Stembureau Stembureau Mobiel Stembureau
Geldige stemmen                                         32
                                    ...                   
één-Ermelo                                             NaN
gmcode                                              GM0988
election                                      GR2022_Weert
electionName                       Gemeenteraad Weert 2022
geometry                                       POINT (0 0)
Name: 11032, Length: 973, dtype: object
Stembureau                                     0
Adres                                           
Locatie                                      SB0
description                         Stembureau -
Geldige stemmen                                0
                               ...              
één-Ermelo                                   NaN
gmcode                                    GM1960
election                       GR2022_WestBetuwe
electionName       Gemeenteraad West Betuwe 2022
geometry                             POINT (0 0)
Name: 11101, Length: 973, dtype: object
Stembureau                                                       132
Adres                                                               
Locatie                                                        SB132
description        Stembureau Stembureau IJsselhallen drive thoug...
Geldige stemmen                                                   52
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0193
election                                               GR2022_Zwolle
electionName                                Gemeenteraad Zwolle 2022
geometry                                                 POINT (0 0)
Name: 12038, Length: 973, dtype: object
Stembureau                                                       133
Adres                                                               
Locatie                                                        SB133
description        Stembureau Stembureau IJsselhallen drive throu...
Geldige stemmen                                                   48
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0193
election                                               GR2022_Zwolle
electionName                                Gemeenteraad Zwolle 2022
geometry                                                 POINT (0 0)
Name: 12039, Length: 973, dtype: object
Stembureau                                                       232
Adres                                                               
Locatie                                                        SB232
description        Stembureau Stembureau IJsselhallen drive thoug...
Geldige stemmen                                                  113
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0193
election                                               GR2022_Zwolle
electionName                                Gemeenteraad Zwolle 2022
geometry                                                 POINT (0 0)
Name: 12053, Length: 973, dtype: object
Stembureau                                                       233
Adres                                                               
Locatie                                                        SB233
description        Stembureau Stembureau IJsselhallen drive throu...
Geldige stemmen                                                   73
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0193
election                                               GR2022_Zwolle
electionName                                Gemeenteraad Zwolle 2022
geometry                                                 POINT (0 0)
Name: 12054, Length: 973, dtype: object
Stembureau                                               358
Adres                                                       
Locatie                                                SB358
description        Stembureau Stembureau Mobiel stembureau 1
Geldige stemmen                                           70
                                     ...                    
één-Ermelo                                               NaN
gmcode                                                GM0193
election                                       GR2022_Zwolle
electionName                        Gemeenteraad Zwolle 2022
geometry                                         POINT (0 0)
Name: 12118, Length: 973, dtype: object
Stembureau                                               359
Adres                                                       
Locatie                                                SB359
description        Stembureau Stembureau Mobiel stembureau 2
Geldige stemmen                                          169
                                     ...                    
één-Ermelo                                               NaN
gmcode                                                GM0193
election                                       GR2022_Zwolle
electionName                        Gemeenteraad Zwolle 2022
geometry                                         POINT (0 0)
Name: 12119, Length: 973, dtype: object
Stembureau                                               360
Adres                                                       
Locatie                                                SB360
description        Stembureau Stembureau Mobiel stembureau 3
Geldige stemmen                                           89
                                     ...                    
één-Ermelo                                               NaN
gmcode                                                GM0193
election                                       GR2022_Zwolle
electionName                        Gemeenteraad Zwolle 2022
geometry                                         POINT (0 0)
Name: 12120, Length: 973, dtype: object
Stembureau                                               361
Adres                                                       
Locatie                                                SB361
description        Stembureau Stembureau Mobiel stembureau 4
Geldige stemmen                                           36
                                     ...                    
één-Ermelo                                               NaN
gmcode                                                GM0193
election                                       GR2022_Zwolle
electionName                        Gemeenteraad Zwolle 2022
geometry                                         POINT (0 0)
Name: 12121, Length: 973, dtype: object
Stembureau                                                       114
Adres                                                               
Locatie                                                        SB114
description        Stembureau Stembureau Mobiel stembureau (beper...
Geldige stemmen                                                  109
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0796
election                                       GR2022_sHertogenbosch
electionName                      Gemeenteraad 's-Hertogenbosch 2022
geometry                                                 POINT (0 0)
Name: 12504, Length: 973, dtype: object
Stembureau                                                       115
Adres                                                               
Locatie                                                        SB115
description        Stembureau Stembureau Mobiel Stembureau (beper...
Geldige stemmen                                                   80
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0796
election                                       GR2022_sHertogenbosch
electionName                      Gemeenteraad 's-Hertogenbosch 2022
geometry                                                 POINT (0 0)
Name: 12505, Length: 973, dtype: object
Stembureau                                                       116
Adres                                                               
Locatie                                                        SB116
description        Stembureau Stembureau Mobiel Stembureau (beper...
Geldige stemmen                                                  119
                                         ...                        
één-Ermelo                                                       NaN
gmcode                                                        GM0796
election                                       GR2022_sHertogenbosch
electionName                      Gemeenteraad 's-Hertogenbosch 2022
geometry                                                 POINT (0 0)
Name: 12506, Length: 973, dtype: object

Het zijn dus duidelijk allemaal mobiele stemlokalen, die kunnen we in een aparte dataset houden voor later, voor nu zijn ze onbelangrijk voor de kaartweergave, laten we de dataset dus opsplitsen in drie dataframes, de originele, één frame zonder de mobiele stemlokalen, en de mobiele stemlokalen alleen.

In [7]:
# De waarschuwing over de projectie die niet klopt kan genegeerd worden, we zoeken naar data die x = 0 is,
# de projectie gaat geen effect hebben op die data in Nederland.

# Filter de data en print welke waardes 0 hebben op x.
mobiel_mask = df_geojson['geometry'].centroid.x == 0
i = 0
for item in mobiel_mask:
    if item:
        print(i)
    i = i + 1
2520
2521
2918
3579
3580
3581
3582
3583
5494
5784
5785
6260
6261
6738
6739
6863
7348
7364
7857
7912
7913
7923
7924
7926
7958
7959
7960
8108
8109
8161
8162
8163
8318
9093
9151
9152
9153
9661
9853
10427
10431
10497
10498
10525
10526
10527
10528
10623
10624
10894
10895
11032
11101
12038
12039
12053
12054
12118
12119
12120
12121
12504
12505
12506
In [8]:
df_geojson_clean = df_geojson[~mobiel_mask]
df_geojson_mobiel = df_geojson[mobiel_mask]
print(df_geojson_clean)
       Stembureau   Adres Locatie  \
0               1  9461BH     SB1   
1               2  9461DA     SB2   
2               3  9461JA     SB3   
3               4  9451KD     SB4   
4               6  9454PL     SB6   
...           ...     ...     ...   
12591         703  5391AR   SB703   
12592         705  5391AR   SB705   
12593         750  5382KE   SB750   
12594         751  5382KE   SB751   
12595         752  5283KE   SB752   

                                             description  Geldige stemmen  \
0      Stembureau Gemeentehuis Gieten (postcode: 9461...              784   
1              Stembureau OBS Gieten (postcode: 9461 DA)              562   
2      Stembureau Zorgcentrum Dekelhem (postcode: 946...              566   
3      Stembureau Ontmoetingscentrum Boerhorn Rolde (...             1495   
4      Stembureau Dropshuis de Eekhof (postcode: 9454...              347   
...                                                  ...              ...   
12591  Stembureau Stembureau Gemeenschapshuis de Meen...              268   
12592  Stembureau Stembureau Gemeenschapshuis De Meen...              398   
12593  Stembureau Stembureau Gemeenschapshuis 't Zijl...              663   
12594  Stembureau Stembureau Gemeenschapshuis 't Zijl...              170   
12595  Stembureau Stembureau Gemeenschapshuis 't Zijl...              222   

       Opgeroepen  Ongeldig  Blanco  Geldige stempassen  \
0            2780         3       3                 700   
1            1396         0       0                 518   
2            1409         2       2                 516   
3            2209         2       4                1335   
4             477         0       2                 298   
...           ...       ...     ...                 ...   
12591           0         0       1                 237   
12592           0         1       0                 359   
12593        2321         2       0                 552   
12594           0         0       0                 151   
12595           0         0       0                 193   

       Geldige volmachtbewijzen  ...  Partij voor Logisch Beleid (PvLB)  \
0                            90  ...                                NaN   
1                            44  ...                                NaN   
2                            54  ...                                NaN   
3                           166  ...                                NaN   
4                            51  ...                                NaN   
...                         ...  ...                                ...   
12591                        32  ...                                NaN   
12592                        40  ...                                NaN   
12593                       113  ...                                NaN   
12594                        19  ...                                NaN   
12595                        29  ...                                NaN   

       Socialisten 010  Jong Rotterdam  VOOR Den Bosch Joep Gersjes  \
0                  NaN             NaN                          NaN   
1                  NaN             NaN                          NaN   
2                  NaN             NaN                          NaN   
3                  NaN             NaN                          NaN   
4                  NaN             NaN                          NaN   
...                ...             ...                          ...   
12591              NaN             NaN                          0.0   
12592              NaN             NaN                          2.0   
12593              NaN             NaN                          5.0   
12594              NaN             NaN                          1.0   
12595              NaN             NaN                          0.0   

       Zorg Voor Gorkum  één-Ermelo  gmcode               election  \
0                   NaN         NaN  GM1680       GR2022_AaenHunze   
1                   NaN         NaN  GM1680       GR2022_AaenHunze   
2                   NaN         NaN  GM1680       GR2022_AaenHunze   
3                   NaN         NaN  GM1680       GR2022_AaenHunze   
4                   NaN         NaN  GM1680       GR2022_AaenHunze   
...                 ...         ...     ...                    ...   
12591               NaN         NaN  GM0796  GR2022_sHertogenbosch   
12592               NaN         NaN  GM0796  GR2022_sHertogenbosch   
12593               NaN         NaN  GM0796  GR2022_sHertogenbosch   
12594               NaN         NaN  GM0796  GR2022_sHertogenbosch   
12595               NaN         NaN  GM0796  GR2022_sHertogenbosch   

                             electionName                  geometry  
0           Gemeenteraad Aa en Hunze 2022  POINT (6.75899 53.00524)  
1           Gemeenteraad Aa en Hunze 2022  POINT (6.75990 52.99975)  
2           Gemeenteraad Aa en Hunze 2022  POINT (6.76600 53.00494)  
3           Gemeenteraad Aa en Hunze 2022  POINT (6.64736 52.98281)  
4           Gemeenteraad Aa en Hunze 2022  POINT (6.60459 52.95269)  
...                                   ...                       ...  
12591  Gemeenteraad 's-Hertogenbosch 2022  POINT (5.43290 51.72810)  
12592  Gemeenteraad 's-Hertogenbosch 2022  POINT (5.43290 51.72810)  
12593  Gemeenteraad 's-Hertogenbosch 2022  POINT (5.45919 51.70595)  
12594  Gemeenteraad 's-Hertogenbosch 2022  POINT (5.45919 51.70595)  
12595  Gemeenteraad 's-Hertogenbosch 2022  POINT (5.45919 51.70595)  

[12532 rows x 973 columns]
In [9]:
# Let's also check if none fell through the cracks, it might be some mobile polls did actually have a location
# posted erroneously
#mobiel_mask_name = df_geojson_clean['description'].str.contains('Mobiel')
#df_geojson_clean = df_geojson_clean[~mobiel_mask_name]
#df_geojson_clean

'Waar is mijn stemlokaal' dataset (wims)

In [10]:
df_wims = pd.read_csv(r'../data/wims_clean.csv')
df_wims
Out[10]:
Unnamed: 0 _id Gemeente CBS gemeentecode Nummer stembureau Naam stembureau Gebruiksdoel van het gebouw Website locatie Wijknaam CBS wijknummer ... Visuele hulpmiddelen Gehandicaptentoilet Kieskring ID Hoofdstembureau Tellocatie Contactgegevens gemeente Verkiezingswebsite gemeente Verkiezingen ID UUID
0 0 1 Valkenswaard GM0858 1 Zorgcentrum Kempenhof gezondheidszorgfunctie https://www.valkenhof.nl/ NaN NaN ... leesloep ja Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 3a612b2151fa4ab491b9e331355e6258
1 1 2 Valkenswaard GM0858 2 Buurtgebouw De Horizon bijeenkomstfunctie NaN NaN NaN ... leesloep NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 9a01d765af0a467ea37f08d92db114ba
2 2 3 Valkenswaard GM0858 3 Speeltuin Geenhoven bijeenkomstfunctie NaN NaN NaN ... leesloep NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 fc5869d33fbc4b06be659149fa615f4c
3 3 4 Valkenswaard GM0858 4 Ontmoetingscentrum De zoete inval bijeenkomstfunctie NaN NaN NaN ... leesloep NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 4427cc0b39e040ba8f75c333f19d66f0
4 4 5 Valkenswaard GM0858 5 Gymnastiekzaal 't Gegraaf sportfunctie NaN NaN NaN ... leesloep NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 a893bb9add324ce29769f1c39afcc48d
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
9270 9270 38745 Gennep GM0907 4 Het Hökske bijeenkomstfunctie NaN NaN NaN ... Leesloep NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 f744546cd6894e5e9a4db4bbfd81b4ee
9271 9271 38746 Gennep GM0907 5 Buurthuis VanOns bijeenkomstfunctie NaN NaN NaN ... Leesloep NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 1270081b1dc74cd7bea0f45973650408
9272 9272 38747 Gennep GM0907 6 't Trefpunt bijeenkomstfunctie NaN NaN NaN ... Leesloep NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 447c7742604345139e41def4cf1e4d3c
9273 9273 38748 Gennep GM0907 8 De Uitkomst bijeenkomstfunctie NaN NaN NaN ... Leesloep NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 049cfd258c174bc49abf17883396d083
9274 9274 38749 Gennep GM0907 1 Zaal Buurman woonfunctie,bijeenkomstfunctie NaN NaN NaN ... NaN NaN Gennep Gennep NaN Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 1e8cbe96e72c4c6ba6303f47bec8cdb5

9275 rows × 40 columns

In [11]:
df_wims2 = pd.read_csv(r'../data/wims-3.csv')
df_wims['Gebruiksdoel van het gebouw'] = df_wims['Gebruiksdoel van het gebouw'].mask(df_wims['Gebruiksdoel van het gebouw'].eq(0)).fillna(
    df_wims['UUID'].map(df_wims2.set_index('UUID')['Gebruiksdoel van het gebouw'])
)
In [12]:
df_wims.to_csv(path_or_buf='../data/export/wims_clean.csv', sep=',', na_rep='', header=True)
In [13]:
# Convert the wims data to a geopandas dataframe
gdf_wims = gpd.GeoDataFrame(
    df_wims,
    geometry=gpd.points_from_xy(df_wims.Longitude, df_wims.Latitude)
).set_crs(epsg=4326, inplace=True)

gdf_wims
Out[13]:
Unnamed: 0 _id Gemeente CBS gemeentecode Nummer stembureau Naam stembureau Gebruiksdoel van het gebouw Website locatie Wijknaam CBS wijknummer ... Gehandicaptentoilet Kieskring ID Hoofdstembureau Tellocatie Contactgegevens gemeente Verkiezingswebsite gemeente Verkiezingen ID UUID geometry
0 0 1 Valkenswaard GM0858 1 Zorgcentrum Kempenhof gezondheidszorgfunctie https://www.valkenhof.nl/ NaN NaN ... ja Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 3a612b2151fa4ab491b9e331355e6258 POINT (5.45515 51.34711)
1 1 2 Valkenswaard GM0858 2 Buurtgebouw De Horizon bijeenkomstfunctie NaN NaN NaN ... NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 9a01d765af0a467ea37f08d92db114ba POINT (5.45137 51.34955)
2 2 3 Valkenswaard GM0858 3 Speeltuin Geenhoven bijeenkomstfunctie NaN NaN NaN ... NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 fc5869d33fbc4b06be659149fa615f4c POINT (5.44827 51.35702)
3 3 4 Valkenswaard GM0858 4 Ontmoetingscentrum De zoete inval bijeenkomstfunctie NaN NaN NaN ... NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 4427cc0b39e040ba8f75c333f19d66f0 POINT (5.44871 51.36022)
4 4 5 Valkenswaard GM0858 5 Gymnastiekzaal 't Gegraaf sportfunctie NaN NaN NaN ... NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 a893bb9add324ce29769f1c39afcc48d POINT (5.45331 51.36514)
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
9270 9270 38745 Gennep GM0907 4 Het Hökske bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 f744546cd6894e5e9a4db4bbfd81b4ee POINT (5.98266 51.69726)
9271 9271 38746 Gennep GM0907 5 Buurthuis VanOns bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 1270081b1dc74cd7bea0f45973650408 POINT (5.98127 51.69000)
9272 9272 38747 Gennep GM0907 6 't Trefpunt bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 447c7742604345139e41def4cf1e4d3c POINT (5.95118 51.72591)
9273 9273 38748 Gennep GM0907 8 De Uitkomst bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 049cfd258c174bc49abf17883396d083 POINT (6.01556 51.70976)
9274 9274 38749 Gennep GM0907 1 Zaal Buurman woonfunctie,bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep NaN Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 1e8cbe96e72c4c6ba6303f47bec8cdb5 POINT (5.98514 51.70189)

9275 rows × 41 columns

In [14]:
# We only want to analyse stemlokalen so deduplicate the stembureaus based on their location's coordinates
gdf_wims_dedupe = gdf_wims.drop_duplicates(subset="geometry", keep='first')
df_geojson_dedupe = df_geojson_clean.drop_duplicates(subset="geometry", keep='first')
gdf_wims_dedupe
Out[14]:
Unnamed: 0 _id Gemeente CBS gemeentecode Nummer stembureau Naam stembureau Gebruiksdoel van het gebouw Website locatie Wijknaam CBS wijknummer ... Gehandicaptentoilet Kieskring ID Hoofdstembureau Tellocatie Contactgegevens gemeente Verkiezingswebsite gemeente Verkiezingen ID UUID geometry
0 0 1 Valkenswaard GM0858 1 Zorgcentrum Kempenhof gezondheidszorgfunctie https://www.valkenhof.nl/ NaN NaN ... ja Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 3a612b2151fa4ab491b9e331355e6258 POINT (5.45515 51.34711)
1 1 2 Valkenswaard GM0858 2 Buurtgebouw De Horizon bijeenkomstfunctie NaN NaN NaN ... NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 9a01d765af0a467ea37f08d92db114ba POINT (5.45137 51.34955)
2 2 3 Valkenswaard GM0858 3 Speeltuin Geenhoven bijeenkomstfunctie NaN NaN NaN ... NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 fc5869d33fbc4b06be659149fa615f4c POINT (5.44827 51.35702)
3 3 4 Valkenswaard GM0858 4 Ontmoetingscentrum De zoete inval bijeenkomstfunctie NaN NaN NaN ... NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 4427cc0b39e040ba8f75c333f19d66f0 POINT (5.44871 51.36022)
4 4 5 Valkenswaard GM0858 5 Gymnastiekzaal 't Gegraaf sportfunctie NaN NaN NaN ... NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 a893bb9add324ce29769f1c39afcc48d POINT (5.45331 51.36514)
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
9270 9270 38745 Gennep GM0907 4 Het Hökske bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 f744546cd6894e5e9a4db4bbfd81b4ee POINT (5.98266 51.69726)
9271 9271 38746 Gennep GM0907 5 Buurthuis VanOns bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 1270081b1dc74cd7bea0f45973650408 POINT (5.98127 51.69000)
9272 9272 38747 Gennep GM0907 6 't Trefpunt bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 447c7742604345139e41def4cf1e4d3c POINT (5.95118 51.72591)
9273 9273 38748 Gennep GM0907 8 De Uitkomst bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 049cfd258c174bc49abf17883396d083 POINT (6.01556 51.70976)
9274 9274 38749 Gennep GM0907 1 Zaal Buurman woonfunctie,bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep NaN Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 1e8cbe96e72c4c6ba6303f47bec8cdb5 POINT (5.98514 51.70189)

8582 rows × 41 columns

Voor dit onderzoek zijn we enkel geïnteresseerd in de locaties van stembureaus, oftewel de stemlokalen. Hierboven hebben we de stembureaus uit de wims dataset gededupliceerd op basis van de coördinaten van hun locatie.

Het aantal stembureaus: 9275

Het aantal stemlokalen: 8089

Er zijn dus 1186 stembureaus gevestigd op een locatie van minimaal één ander stembureau.

Plots van alle stemlokalen op de kaart

Stemlokalen uit de wims dataset

In [15]:
fig, ax = plt.subplots(figsize = (15,15))
nl_map.to_crs(epsg=4326).plot(ax=ax, color='lightgrey')
gdf_wims_dedupe.plot(ax=ax)
Out[15]:
<AxesSubplot:>
No description has been provided for this image

Stemlokalen uit de OSF/VK GeoJSON dataset

In [16]:
fig, ax = plt.subplots(figsize = (15,15))
nl_map.to_crs(epsg=4326).plot(ax=ax, color='lightgrey')
df_geojson_clean.plot(ax=ax)
Out[16]:
<AxesSubplot:>
No description has been provided for this image

Nu we een kaart van nederland met de stemlokalen erop hebben, kunnen we als eerste voorbeeld gaan kijken hoe dit zich verhoudt met de bevolkingsdichtheid. De kaart is opgehaald van het CBS, eerst gaan we kijken hoe de kaart er op zichzelf met dezelfde projectie uitziet.

In [17]:
nl_map_cbs = gpd.read_file(r'../data/shape/Netherlands_shapefile/cbs_vk500_2021_v1.gpkg')
nl_map_cbs.to_crs(epsg=4326).plot()
Out[17]:
<AxesSubplot:>
No description has been provided for this image

Het verwerken van de 100m bij 100m vierkanten kaart duurde lang (langer dan een half uur) op de laptop, en is dus niet ideaal tenzij we dit niveau van detail écht nodig hebben. Er is namelijk nog een andere kaart met dezelfde gegevens beschikbaar, maar met een grid van 500 bij 500 meter in plaats van 100 bij 100. Laten we dus kijken hoe vaak een stemlokaal dichterbij dan 100 meter van de dichtstbijzijnde andere is. De makkelijkste manier om dat te doen zonder alle punten met alle andere te vergelijken (wat lang duurt), is een extra dataframe maken als een kopie, alle indexen 1 opschuiven (want alle stemlokalen zijn al in een volgorde van clustering), en dan de laagste afstand bekijken.

In [18]:
# Use Rijksdriehoekscoördinaten (EPSG:28992) as this uses meters as unit so we can calculate the distance in meters
df_shifted = df_geojson_clean.to_crs('EPSG:28992')

df_shifted['geometry (shifted)'] = df_shifted['geometry'].shift(periods=1)
df_shifted['distance'] = df_shifted['geometry'].distance(df_shifted['geometry (shifted)'])
df_shifted.sort_values(['distance'], inplace=True, ascending=True)
zero_mask_booth = df_shifted['distance'] == 0.000000
df_shifted = df_shifted[~zero_mask_booth]
print(df_shifted['distance'])
11165         0.002608
1021          0.004853
3196          0.004875
1923          2.693202
3757          3.609362
             ...      
7444     253385.654588
9711     263408.187856
4392     266925.200994
9297     271954.076837
0                  NaN
Name: distance, Length: 11670, dtype: float64

Los van bovenstaande resultaten blijkt het dat de 100m kaart niet dezelfde inwonersgegevens heeft als de 500m kaart. Deze hebben we echter nodig voor de analyse, dus we gaan verder met de 500 bij 500 meter kaart. Laten we nu een projectie proberen te maken met de bevolkingsdichtheid erop om het te vergelijken met de stemlokalen en hun posities en clustering.

In [ ]:
 
In [19]:
print(list(nl_map_cbs))
nl_map_dst = nl_map_cbs.drop(columns=['aantal_mannen', 'aantal_vrouwen', 'aantal_inwoners_0_tot_15_jaar', 'aantal_inwoners_15_tot_25_jaar', 'aantal_inwoners_25_tot_45_jaar', 'aantal_inwoners_45_tot_65_jaar', 'aantal_inwoners_65_jaar_en_ouder', 'percentage_nederlandse_achtergrond', 'percentage_westerse_migr_achtergr', 'percentage_niet_westerse_migr_achtergr', 'aantal_personen_met_uitkering_onder_aowlft', 'aantal_part_huishoudens', 'aantal_eenpersoonshuishoudens', 'aantal_meerpersoonshuishoudens_zonder_kind', 'aantal_eenouderhuishoudens', 'aantal_tweeouderhuishoudens', 'gemiddelde_huishoudensgrootte', 'aantal_woningen', 'aantal_woningen_bouwjaar_voor_1945', 'aantal_woningen_bouwjaar_45_tot_65', 'aantal_woningen_bouwjaar_65_tot_75', 'aantal_woningen_bouwjaar_75_tot_85', 'aantal_woningen_bouwjaar_85_tot_95', 'aantal_woningen_bouwjaar_95_tot_05', 'aantal_woningen_bouwjaar_05_tot_15', 'aantal_woningen_bouwjaar_15_en_later', 'aantal_meergezins_woningen', 'percentage_koopwoningen', 'percentage_huurwoningen', 'aantal_huurwoningen_in_bezit_woningcorporaties', 'aantal_niet_bewoonde_woningen', 'gemiddelde_woz_waarde_woning', 'omgevingsadressendichtheid'])

nl_map_dst
['crs28992res500m', 'aantal_inwoners', 'aantal_mannen', 'aantal_vrouwen', 'aantal_inwoners_0_tot_15_jaar', 'aantal_inwoners_15_tot_25_jaar', 'aantal_inwoners_25_tot_45_jaar', 'aantal_inwoners_45_tot_65_jaar', 'aantal_inwoners_65_jaar_en_ouder', 'percentage_nederlandse_achtergrond', 'percentage_westerse_migr_achtergr', 'percentage_niet_westerse_migr_achtergr', 'aantal_personen_met_uitkering_onder_aowlft', 'aantal_part_huishoudens', 'aantal_eenpersoonshuishoudens', 'aantal_meerpersoonshuishoudens_zonder_kind', 'aantal_eenouderhuishoudens', 'aantal_tweeouderhuishoudens', 'gemiddelde_huishoudensgrootte', 'aantal_woningen', 'aantal_woningen_bouwjaar_voor_1945', 'aantal_woningen_bouwjaar_45_tot_65', 'aantal_woningen_bouwjaar_65_tot_75', 'aantal_woningen_bouwjaar_75_tot_85', 'aantal_woningen_bouwjaar_85_tot_95', 'aantal_woningen_bouwjaar_95_tot_05', 'aantal_woningen_bouwjaar_05_tot_15', 'aantal_woningen_bouwjaar_15_en_later', 'aantal_meergezins_woningen', 'percentage_koopwoningen', 'percentage_huurwoningen', 'aantal_huurwoningen_in_bezit_woningcorporaties', 'aantal_niet_bewoonde_woningen', 'gemiddelde_woz_waarde_woning', 'omgevingsadressendichtheid', 'stedelijkheid', 'geometry']
Out[19]:
crs28992res500m aantal_inwoners stedelijkheid geometry
0 E2260N6190 -99997 -99997 MULTIPOLYGON (((226000.000 619000.000, 226000....
1 E2265N6190 -99997 -99997 MULTIPOLYGON (((226500.000 619500.000, 227000....
2 E2270N6190 -99997 -99997 MULTIPOLYGON (((227000.000 619500.000, 227500....
3 E2275N6190 -99997 -99997 MULTIPOLYGON (((227500.000 619500.000, 228000....
4 E2280N6190 -99997 -99997 MULTIPOLYGON (((228000.000 619500.000, 228500....
... ... ... ... ...
151103 E1995N3070 -99997 5 MULTIPOLYGON (((199500.000 307500.000, 200000....
151104 E1905N3065 -99997 -99997 MULTIPOLYGON (((190500.000 307000.000, 191000....
151105 E1910N3065 -99997 -99997 MULTIPOLYGON (((191000.000 307000.000, 191500....
151106 E1920N3065 15 5 MULTIPOLYGON (((192000.000 307000.000, 192500....
151107 E1925N3065 -99997 5 MULTIPOLYGON (((192500.000 307000.000, 193000....

151108 rows × 4 columns

We kunnen zien dat er gemeente zijn die geen stemlokalen hebben, dit klopt. In de verkiezingen van 2022 hebben 12 gemeentes niet meegedaan. Er zijn dus in totaal 333 gemeentes met stemlokalen. We willen de bevolkingsdichtheiddata van de gemeentes die niet meededen dus weggooien, hiervoor moeten we eerst kijken welke alleen binnen de gemeentes vallen die we niet willen houden.

In [20]:
print(df_geojson['electionName'])

#get all municipalities that are in the election
gemeentes = df_geojson['electionName'].str.slice(13, -5).drop_duplicates()
print(gemeentes)
0             Gemeenteraad Aa en Hunze 2022
1             Gemeenteraad Aa en Hunze 2022
2             Gemeenteraad Aa en Hunze 2022
3             Gemeenteraad Aa en Hunze 2022
4             Gemeenteraad Aa en Hunze 2022
                        ...                
12591    Gemeenteraad 's-Hertogenbosch 2022
12592    Gemeenteraad 's-Hertogenbosch 2022
12593    Gemeenteraad 's-Hertogenbosch 2022
12594    Gemeenteraad 's-Hertogenbosch 2022
12595    Gemeenteraad 's-Hertogenbosch 2022
Name: electionName, Length: 12596, dtype: object
0             Aa en Hunze
27               Aalsmeer
46                 Aalten
74          Achtkarspelen
95           Alblasserdam
               ...       
11976     Zwartewaterland
11997         Zwijndrecht
12031              Zwolle
12122       's-Gravenhage
12495    's-Hertogenbosch
Name: electionName, Length: 333, dtype: object
In [21]:
#First let's remove the municipalities that don't have an Election from the municipality map
remove_lst = ["Boxtel", "Eemsdelta", "Oisterwijk", "Vught", "Heerhugowaard", "Langedijk", "Boxmeer", "Cuijk", "Sint Anthonis", "Mill en Sint Hubert", "Grave", "Landerd", "Uden", "Brielle", "Hellevoetsluis", "Westvoorne", "Purmerend", "Beemster", "Weesp"]


nl_map_clean = nl_map[~nl_map["GM_NAAM"].isin(remove_lst)]
nl_map_clean = nl_map_clean.query("H2O != 'JA'")
nl_map_clean = nl_map_clean.query("GM_NAAM != 'Buitenland'")


nl_map_election = nl_map[nl_map["GM_NAAM"].isin(gemeentes)]
nl_map_election = nl_map_election.query("H2O != 'JA'")

print("Shape of clean: {}".format(nl_map_clean.shape))
print("Shape of election: {}".format(nl_map_election.shape))

diff = pd.concat([nl_map_election, nl_map_clean]).drop_duplicates(keep=False)
diff
Shape of clean: (333, 38)
Shape of election: (330, 38)
Out[21]:
GM_CODE GM_NAAM H2O OAD STED BEV_DICHTH AANT_INW AANT_MAN AANT_VROUW P_00_14_JR ... P_TURKIJE P_OVER_NW OPP_TOT OPP_LAND OPP_WATER JRSTATCODE JAAR Shape_Leng Shape_Area geometry
113 GM0164 Hengelo NEE 1845 2 1332 81049 40776 40273 15 ... 6 7 6183 6084 99 2021GM0164 2021 47510.255914 6.183056e+07 POLYGON ((251978.591 481220.258, 251979.382 48...
191 GM0373 Bergen (NH.) NEE 819 4 300 29715 14317 15398 12 ... 0 3 12023 9896 2127 2021GM0373 2021 57488.474563 9.987418e+07 POLYGON ((105976.650 529056.951, 106002.347 52...
328 GM0893 Bergen (L.) NEE 318 5 127 13108 6568 6540 13 ... 0 3 10850 10324 525 2021GM0893 2021 61497.563571 1.084951e+08 POLYGON ((199768.270 409749.960, 199758.060 40...

3 rows × 38 columns

Het is een andere vorm omdat deze drie gemeentes een andere format hadden voor de naam van hun verkiezingen, en dus niet op dezelfde manier gefilterd konden worden, ze staan wel in de lijst, dit is dus correct, we gebruiken de clean dataframe. Nu we dezelfde lijst hebben van gemeentes die in de verkiezingen meededen kunnen we verder.

In [22]:
fig, ax = plt.subplots(figsize = (15,15))
nl_map_clean.to_crs(epsg=4326).plot(ax=ax, color='lightgrey')
df_geojson_clean.plot(ax=ax)
Out[22]:
<AxesSubplot:>
No description has been provided for this image
In [23]:
nl_map_dst['savedindex'] = nl_map_dst.index #Save the index values as a new column

intersecting = nl_map_clean.sjoin(nl_map_dst, how='inner')['savedindex'] #Find the polygons that intersect. Keep savedindex as a series

nl_map_dst = nl_map_dst.loc[nl_map_dst.savedindex.isin(intersecting)] #Filter away these, "savedindex is in intersecting"

nl_map_dst.to_crs(epsg=4326).plot()
Out[23]:
<AxesSubplot:>
No description has been provided for this image
In [24]:
import folium
from folium import plugins

#Location is Amersfoort, the central point of the continental Netherlands
map = folium.Map(location = [52.155, 5.3875], zoom_start = 9, tiles="cartodbdark_matter", prefer_canvas=True)

nl_map_dst.to_crs(epsg=4326)
#Make sure the index is a string so folium can read it correctly as a key.
nl_map_dst['crs28992res500m'] = nl_map_dst['crs28992res500m'].apply(lambda x: str(x))

nl_map_dst_zero = nl_map_dst.copy()

zero_mask_pop = nl_map_dst['aantal_inwoners'] == -99997
nl_map_dst = nl_map_dst[~zero_mask_pop]
zero_mask_pop2 = nl_map_dst['aantal_inwoners'] == 0
nl_map_dst = nl_map_dst[~zero_mask_pop2]

folium.Choropleth(
    geo_data = nl_map_dst,
    name="Bevolkingsdichtheid",
    data = nl_map_dst,
    columns = ["crs28992res500m", "aantal_inwoners"],
    key_on = 'feature.properties.crs28992res500m',
    fill_color = 'RdPu',
    nan_fill_color= 'white',
    fill_opacity = 0.7,
    nan_fill_opacity = 0.7,
    line_opacity = 0,
    legend_name = 'Bevolkingsdichtheid',
    smooth_factor = 1.0,
    show=False
).add_to(map)
map

# Renders the map to an HTML file and displays it in an embed.
def embed_map(m):
    #from IPython.display import IFrame
    m.save('index.html')
    #return IFrame('index.html', width='100%', height='750px')
In [25]:
gdf_wims_hmp = [[point.xy[1][0], point.xy[0][0]] for point in gdf_wims.geometry]

plugins.HeatMap(gdf_wims_hmp, name="Stemlokalen Heatmap").add_to(map)

folium.LayerControl().add_to(map)



embed_map(map)
In [26]:
nl_map_dst_points = nl_map_dst.copy()
nl_map_dst_points['geometry'] = nl_map_dst_points['geometry'].centroid

nl_map_dst_zero_points = nl_map_dst_zero.copy()
nl_map_dst_zero_points['geometry'] = nl_map_dst_zero_points['geometry'].centroid

nl_map_dst_zero_points
Out[26]:
crs28992res500m aantal_inwoners stedelijkheid geometry savedindex
2 E2270N6190 -99997 -99997 POINT (227250.000 619250.000) 2
3 E2275N6190 -99997 -99997 POINT (227750.000 619250.000) 3
4 E2280N6190 -99997 -99997 POINT (228250.000 619250.000) 4
7 E2265N6185 -99997 -99997 POINT (226750.000 618750.000) 7
8 E2270N6185 -99997 -99997 POINT (227250.000 618750.000) 8
... ... ... ... ... ...
151102 E1990N3070 -99997 -99997 POINT (199250.000 307250.000) 151102
151103 E1995N3070 -99997 5 POINT (199750.000 307250.000) 151103
151105 E1910N3065 -99997 -99997 POINT (191250.000 306750.000) 151105
151106 E1920N3065 15 5 POINT (192250.000 306750.000) 151106
151107 E1925N3065 -99997 5 POINT (192750.000 306750.000) 151107

140002 rows × 5 columns

In [27]:
import numpy as np

from scipy.spatial import cKDTree
from shapely.geometry import Point
#Found on https://gis.stackexchange.com/questions/222315/finding-nearest-point-in-other-geodataframe-using-geopandas
def ckdnearest(gdA, gdB):

    nA = np.array(list(gdA.geometry.apply(lambda x: (x.x, x.y))))
    nB = np.array(list(gdB.geometry.apply(lambda x: (x.x, x.y))))
    btree = cKDTree(nB)
    dist, idx = btree.query(nA, k=1)
    gdB_nearest = gdB.iloc[idx].drop(columns="geometry").reset_index(drop=True)
    gdf = pd.concat(
        [
            gdA.reset_index(drop=True),
            gdB_nearest,
            pd.Series(dist, name='dist')
        ], 
        axis=1)

    return gdf

#error bar is +- sqrt(250²*2)m ≈ +-353.553390593m
error = np.sqrt(250**2 + 250**2)
df_nearest = ckdnearest(nl_map_dst_points.to_crs(epsg=28992), gdf_wims_dedupe.to_crs(epsg=28992))
df_nearest.head()
Out[27]:
crs28992res500m aantal_inwoners stedelijkheid geometry savedindex Unnamed: 0 _id Gemeente CBS gemeentecode Nummer stembureau ... Gehandicaptentoilet Kieskring ID Hoofdstembureau Tellocatie Contactgegevens gemeente Verkiezingswebsite gemeente Verkiezingen ID UUID dist
0 E2050N6110 5 5 POINT (205250.000 611250.000) 267 5710 30871 Schiermonnikoog GM0088 1 ... ja Schiermonnikoog Schiermonnikoog NaN postbus20@schiermonnikoog.nl, 0519-535050 https://www.schiermonnikoog.nl/in-de-gemeente/... NaN NLODSGM0088stembureaus20220316009 35abba36eca7485c89e82b2917633ae7 1331.950309
1 E2060N6110 10 5 POINT (206250.000 611250.000) 269 5710 30871 Schiermonnikoog GM0088 1 ... ja Schiermonnikoog Schiermonnikoog NaN postbus20@schiermonnikoog.nl, 0519-535050 https://www.schiermonnikoog.nl/in-de-gemeente/... NaN NLODSGM0088stembureaus20220316009 35abba36eca7485c89e82b2917633ae7 688.536284
2 E2055N6105 20 5 POINT (205750.000 610750.000) 292 5710 30871 Schiermonnikoog GM0088 1 ... ja Schiermonnikoog Schiermonnikoog NaN postbus20@schiermonnikoog.nl, 0519-535050 https://www.schiermonnikoog.nl/in-de-gemeente/... NaN NLODSGM0088stembureaus20220316009 35abba36eca7485c89e82b2917633ae7 672.375861
3 E2060N6105 185 5 POINT (206250.000 610750.000) 293 5710 30871 Schiermonnikoog GM0088 1 ... ja Schiermonnikoog Schiermonnikoog NaN postbus20@schiermonnikoog.nl, 0519-535050 https://www.schiermonnikoog.nl/in-de-gemeente/... NaN NLODSGM0088stembureaus20220316009 35abba36eca7485c89e82b2917633ae7 228.220493
4 E2065N6105 335 5 POINT (206750.000 610750.000) 294 5710 30871 Schiermonnikoog GM0088 1 ... ja Schiermonnikoog Schiermonnikoog NaN postbus20@schiermonnikoog.nl, 0519-535050 https://www.schiermonnikoog.nl/in-de-gemeente/... NaN NLODSGM0088stembureaus20220316009 35abba36eca7485c89e82b2917633ae7 389.974214

5 rows × 46 columns

Het was mooier geweest als we het konden filteren op alleen stemgerechtigden en niet op de gehele populatiedichtheid, maar het CBS geeft geen data vrij die daarbij helpt. Er is een categorie voor 0-14 jaar oude mensen, maar niet alle minderjarigen of niet stemgerechtigde. Het moet dus maar met totale bevolkingsdichtheid om een idee te krijgen.

In [28]:
nl_map_dst_zero_points["aantal_inwoners"].mask(nl_map_dst_zero_points["aantal_inwoners"] == -99997, 0, inplace=True)
nl_map_dst_zero_points.head()
df_nearest_zero = ckdnearest(nl_map_dst_zero_points.to_crs(epsg=28992), gdf_wims_dedupe.to_crs(epsg=28992))
df_nearest_zero["aantal_inwoners"].dropna()
df_nearest_zero["dist"].dropna()
df_nearest_zero
Out[28]:
crs28992res500m aantal_inwoners stedelijkheid geometry savedindex Unnamed: 0 _id Gemeente CBS gemeentecode Nummer stembureau ... Gehandicaptentoilet Kieskring ID Hoofdstembureau Tellocatie Contactgegevens gemeente Verkiezingswebsite gemeente Verkiezingen ID UUID dist
0 E2270N6190 0 -99997 POINT (227250.000 619250.000) 2 5817 31030 Het Hogeland GM1966 1 ... NaN Het Hogeland Het Hogeland NaN verkiezingen@hethogeland.nl https://hethogeland.nl/bestuur-en-organisatie/... NaN NLODSGM1966stembureaus20220316009 6df04b8dd4be4aa3b4a03f221ab5ad17 17236.920436
1 E2275N6190 0 -99997 POINT (227750.000 619250.000) 3 5817 31030 Het Hogeland GM1966 1 ... NaN Het Hogeland Het Hogeland NaN verkiezingen@hethogeland.nl https://hethogeland.nl/bestuur-en-organisatie/... NaN NLODSGM1966stembureaus20220316009 6df04b8dd4be4aa3b4a03f221ab5ad17 17280.014918
2 E2280N6190 0 -99997 POINT (228250.000 619250.000) 4 5817 31030 Het Hogeland GM1966 1 ... NaN Het Hogeland Het Hogeland NaN verkiezingen@hethogeland.nl https://hethogeland.nl/bestuur-en-organisatie/... NaN NLODSGM1966stembureaus20220316009 6df04b8dd4be4aa3b4a03f221ab5ad17 17337.427867
3 E2265N6185 0 -99997 POINT (226750.000 618750.000) 7 5817 31030 Het Hogeland GM1966 1 ... NaN Het Hogeland Het Hogeland NaN verkiezingen@hethogeland.nl https://hethogeland.nl/bestuur-en-organisatie/... NaN NLODSGM1966stembureaus20220316009 6df04b8dd4be4aa3b4a03f221ab5ad17 16708.725120
4 E2270N6185 0 -99997 POINT (227250.000 618750.000) 8 5817 31030 Het Hogeland GM1966 1 ... NaN Het Hogeland Het Hogeland NaN verkiezingen@hethogeland.nl https://hethogeland.nl/bestuur-en-organisatie/... NaN NLODSGM1966stembureaus20220316009 6df04b8dd4be4aa3b4a03f221ab5ad17 16738.249149
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
139997 E1990N3070 0 -99997 POINT (199250.000 307250.000) 151102 496 4101 Vaals GM0981 1 ... ja Vaals Vaals ja Team verkiezingen, verkiezingen2022@vaals.nl http://www.vaals.nl/verkiezingen NaN NLODSGM0981stembureaus20220316009 ec2f41c816aa4f4f8b18a3565c20dd0b 1939.206985
139998 E1995N3070 0 5 POINT (199750.000 307250.000) 151103 496 4101 Vaals GM0981 1 ... ja Vaals Vaals ja Team verkiezingen, verkiezingen2022@vaals.nl http://www.vaals.nl/verkiezingen NaN NLODSGM0981stembureaus20220316009 ec2f41c816aa4f4f8b18a3565c20dd0b 1923.094050
139999 E1910N3065 0 -99997 POINT (191250.000 306750.000) 151105 5276 29739 Gulpen-Wittem GM1729 7 ... NaN Gulpen-Wittem Gulpen-Wittem NaN info@gulpen-wittem.nl 14 043 https://www.gulpen-wittem.nl/onderwerpen/verki... NaN NLODSGM1729stembureaus20220316009 feb9d0a67a2f460f906d0d21e87bf690 2880.233287
140000 E1920N3065 15 5 POINT (192250.000 306750.000) 151106 5276 29739 Gulpen-Wittem GM1729 7 ... NaN Gulpen-Wittem Gulpen-Wittem NaN info@gulpen-wittem.nl 14 043 https://www.gulpen-wittem.nl/onderwerpen/verki... NaN NLODSGM1729stembureaus20220316009 feb9d0a67a2f460f906d0d21e87bf690 2746.345509
140001 E1925N3065 0 5 POINT (192750.000 306750.000) 151107 5276 29739 Gulpen-Wittem GM1729 7 ... NaN Gulpen-Wittem Gulpen-Wittem NaN info@gulpen-wittem.nl 14 043 https://www.gulpen-wittem.nl/onderwerpen/verki... NaN NLODSGM1729stembureaus20220316009 feb9d0a67a2f460f906d0d21e87bf690 2813.494018

140002 rows × 46 columns

In [29]:
df_nearest.sort_values(by=['dist'], inplace=True)
df_nearest[['Gemeente', 'Naam stembureau', 'dist']]
Out[29]:
Gemeente Naam stembureau dist
47304 Ridderkerk Gemeentehuis 3.835321
32815 Baarn Dorpshuis de Furs 4.000517
46669 Lingewaard Ontmoetingscentrum Doornenburg 4.465340
5168 Groningen Dorpshuis De Hoeksteen 5.577246
38975 Montfoort Zalencentrum St. Joseph 5.703409
... ... ... ...
65964 Roerdalen Brede school de Berensprong 8117.463711
22477 Lelystad Gymzaal Kindcentrum Warande (2) 8135.260944
22479 Harderwijk Drive-In op parkeerplaats P2 8167.139659
22478 Lelystad Gymzaal De Borg 8402.730770
22619 Lelystad Gymzaal Kindcentrum Warande (2) 8685.023942

68131 rows × 3 columns

In [30]:
def plot_dist(df, label):
    plt.figure(figsize=(13,13))
    df['dist'].plot(kind="hist", weights=df['aantal_inwoners'], figsize=(13,13), fontsize=22, density=False,title="Afstand tot Stemlokaal per 500 x 500 m vierkant (minimaal 5 mensen in het vierkant) Staffel {}".format(label), log=True).set_ylabel('Bevolking (Millioenen)')
    plt.figure(figsize=(13,13))
    df.plot.scatter(x = 'aantal_inwoners', y = 'dist', figsize=(13,13), fontsize=22, title="Afstand tot Stemlokaal per 500 x 500 m vierkant (minimaal 5 mensen in het vierkant) Staffel {}".format(label), xlabel="Inwoners per 500m² (laagste is 5)", ylabel="Afstand tot stemlokaal (meter)")
    
In [31]:
ax_nearest_zero = df_nearest_zero.plot.scatter(x = 'aantal_inwoners', y = 'dist', figsize=(13,13), fontsize=22, xlabel="Inwoners per 500m² (inclusief lege (<5 inwoners) vierkanten)", ylabel="Afstand tot stemlokaal (meter)")


ax_nearest_zero.set_xscale('log')
#ax_nearest_zero.set_yscale('log')
No description has been provided for this image
In [32]:
FIGSIZE = (13, 13)
def plot_bargraph_with_groupings(df, groupby, colourby, title, xlabel, ylabel):

    import matplotlib.patches as mpatches


    # Makes the bargraph.
    ax = df[groupby].value_counts().plot(kind='bar',
                                         figsize=FIGSIZE,
                                         title=title)
    

    # display the graph.
    
    ax.set_xlabel(xlabel)
    ax.set_ylabel(ylabel)
In [33]:
plot_bargraph_with_groupings(gdf_wims_dedupe, 'Gebruiksdoel van het gebouw', 'Gemeente', 'Gebruiksdoelen van Stemlokalen', 'Gebruiksdoel', 'Hoeveelheid Stemlokalen')
No description has been provided for this image

Dit is onbruikbaar, de categorieën moeten elk één balkje zijn, niet zoals dit.

In [34]:
def plot_use (df, label):
    plt.figure(figsize=(13,13))
    df_exploded = df.drop('Gebruiksdoel van het gebouw', axis=1).join(df['Gebruiksdoel van het gebouw'].str.split(',', expand=True).stack().reset_index(level=1,drop=True).rename('Gebruiksdoel van het gebouw'))
    #print(df_exploded)
    plot_bargraph_with_groupings(df_exploded, 'Gebruiksdoel van het gebouw', 'Gemeente', 'Gebruiksdoelen van Stemlokalen Staffel {}'.format(label), 'Gebruiksdoel', 'Hoeveelheid Stemlokalen')
    print("Staffel: {}".format(label))
    print(df_exploded['Gebruiksdoel van het gebouw'].value_counts())
    
    
In [35]:
wims_count = gdf_wims_dedupe['Gemeente'].value_counts()


geojson_rename = df_geojson_dedupe.rename(columns = {'electionName': 'Gemeente'})
geojson_count = geojson_rename['Gemeente'].str.slice(13, -5).value_counts()

pd.concat([geojson_count, wims_count]).drop_duplicates(keep=False)
Out[35]:
Amsterdam           509
Rotterdam           452
's-Gravenhage       320
Utrecht             201
Groningen           121
Breda               111
Nijmegen            108
Eindhoven           102
Arnhem               82
Zwolle               70
Deventer             63
's-Hertogenbosch     61
Stichtse Vecht       38
Amsterdam           387
Rotterdam           375
's-Gravenhage       258
Utrecht             200
Groningen           123
Breda                90
Haarlem              78
Nijmegen             76
Arnhem               72
Leeuwarden           69
Súdwest-Fryslân      67
Emmen                59
Dordrecht            54
Meierijstad          49
Name: Gemeente, dtype: int64
In [36]:
standard_14 = '2022-03-14T07:30:00 tot 2022-03-14T21:00:00'
standard_15 = '2022-03-15T07:30:00 tot 2022-03-15T21:00:00'
standard_16 = '2022-03-16T07:30:00 tot 2022-03-16T21:00:00'


nan_value = float("NaN")
gdf_wims_dedupe.replace(" ", nan_value, inplace = True)
gdf_wims_dedupe.replace("  ", nan_value, inplace = True)

wims_nonstandaard_14 = gdf_wims_dedupe.dropna(subset=['Openingstijden 14-03-2022']).loc[gdf_wims_dedupe['Openingstijden 14-03-2022'] != standard_14]
wims_nonstandaard_15 = gdf_wims_dedupe.dropna(subset=['Openingstijden 15-03-2022']).loc[gdf_wims_dedupe['Openingstijden 15-03-2022'] != standard_15]
wims_nonstandaard_16 = gdf_wims_dedupe.dropna(subset=['Openingstijden 16-03-2022']).loc[gdf_wims_dedupe['Openingstijden 16-03-2022'] != standard_16]
wims_standaard_14 = gdf_wims_dedupe.loc[gdf_wims_dedupe['Openingstijden 14-03-2022'] == standard_14]
wims_standaard_15 = gdf_wims_dedupe.loc[gdf_wims_dedupe['Openingstijden 15-03-2022'] == standard_15]
wims_standaard_16 = gdf_wims_dedupe.loc[gdf_wims_dedupe['Openingstijden 16-03-2022'] == standard_16]
In [37]:
gdf_wims_times = gdf_wims_dedupe.loc[:, ('Openingstijden 14-03-2022','Openingstijden 15-03-2022','Openingstijden 16-03-2022', 'UUID', 'Gemeente', 'CBS gemeentecode')]
gdf_wims_split = gdf_wims_times
gdf_wims_split[['Openingstijden 14-03-2022 van', 'Openingstijden 14-03-2022 tot']] = gdf_wims_times['Openingstijden 14-03-2022'].str.split(' tot ',1 , expand=True)
gdf_wims_split[['Openingstijden 15-03-2022 van', 'Openingstijden 15-03-2022 tot']] = gdf_wims_split['Openingstijden 15-03-2022'].str.split(' tot ',1 , expand=True)
gdf_wims_split[['Openingstijden 16-03-2022 van', 'Openingstijden 16-03-2022 tot']] = gdf_wims_split['Openingstijden 16-03-2022'].str.split(' tot ',1 , expand=True)

gdf_wims_split
Out[37]:
Openingstijden 14-03-2022 Openingstijden 15-03-2022 Openingstijden 16-03-2022 UUID Gemeente CBS gemeentecode Openingstijden 14-03-2022 van Openingstijden 14-03-2022 tot Openingstijden 15-03-2022 van Openingstijden 15-03-2022 tot Openingstijden 16-03-2022 van Openingstijden 16-03-2022 tot
0 NaN NaN 2022-03-16T10:00:00 tot 2022-03-16T13:00:00 3a612b2151fa4ab491b9e331355e6258 Valkenswaard GM0858 NaN NaN NaN NaN 2022-03-16T10:00:00 2022-03-16T13:00:00
1 NaN NaN 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 9a01d765af0a467ea37f08d92db114ba Valkenswaard GM0858 NaN NaN NaN NaN 2022-03-16T07:30:00 2022-03-16T21:00:00
2 NaN NaN 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 fc5869d33fbc4b06be659149fa615f4c Valkenswaard GM0858 NaN NaN NaN NaN 2022-03-16T07:30:00 2022-03-16T21:00:00
3 NaN NaN 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 4427cc0b39e040ba8f75c333f19d66f0 Valkenswaard GM0858 NaN NaN NaN NaN 2022-03-16T07:30:00 2022-03-16T21:00:00
4 2022-03-14T07:30:00 tot 2022-03-14T21:00:00 2022-03-15T07:30:00 tot 2022-03-15T21:00:00 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 a893bb9add324ce29769f1c39afcc48d Valkenswaard GM0858 2022-03-14T07:30:00 2022-03-14T21:00:00 2022-03-15T07:30:00 2022-03-15T21:00:00 2022-03-16T07:30:00 2022-03-16T21:00:00
... ... ... ... ... ... ... ... ... ... ... ... ...
9270 NaN NaN 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 f744546cd6894e5e9a4db4bbfd81b4ee Gennep GM0907 NaN NaN NaN NaN 2022-03-16T07:30:00 2022-03-16T21:00:00
9271 2022-03-14T07:30:00 tot 2022-03-14T21:00:00 2022-03-15T07:30:00 tot 2022-03-15T21:00:00 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 1270081b1dc74cd7bea0f45973650408 Gennep GM0907 2022-03-14T07:30:00 2022-03-14T21:00:00 2022-03-15T07:30:00 2022-03-15T21:00:00 2022-03-16T07:30:00 2022-03-16T21:00:00
9272 NaN 2022-03-15T07:30:00 tot 2022-03-15T21:00:00 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 447c7742604345139e41def4cf1e4d3c Gennep GM0907 NaN NaN 2022-03-15T07:30:00 2022-03-15T21:00:00 2022-03-16T07:30:00 2022-03-16T21:00:00
9273 NaN NaN 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 049cfd258c174bc49abf17883396d083 Gennep GM0907 NaN NaN NaN NaN 2022-03-16T07:30:00 2022-03-16T21:00:00
9274 NaN NaN 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 1e8cbe96e72c4c6ba6303f47bec8cdb5 Gennep GM0907 NaN NaN NaN NaN 2022-03-16T07:30:00 2022-03-16T21:00:00

8582 rows × 12 columns

In [38]:
gdf_wims_split[['Openingstijden 14-03-2022 van','Openingstijden 15-03-2022 van','Openingstijden 16-03-2022 van', 'Openingstijden 14-03-2022 tot', 'Openingstijden 15-03-2022 tot','Openingstijden 16-03-2022 tot']] = gdf_wims_split[['Openingstijden 14-03-2022 van','Openingstijden 15-03-2022 van','Openingstijden 16-03-2022 van','Openingstijden 14-03-2022 tot','Openingstijden 15-03-2022 tot','Openingstijden 16-03-2022 tot']].apply(pd.to_datetime, errors='coerce')
gdf_wims_split
Out[38]:
Openingstijden 14-03-2022 Openingstijden 15-03-2022 Openingstijden 16-03-2022 UUID Gemeente CBS gemeentecode Openingstijden 14-03-2022 van Openingstijden 14-03-2022 tot Openingstijden 15-03-2022 van Openingstijden 15-03-2022 tot Openingstijden 16-03-2022 van Openingstijden 16-03-2022 tot
0 NaN NaN 2022-03-16T10:00:00 tot 2022-03-16T13:00:00 3a612b2151fa4ab491b9e331355e6258 Valkenswaard GM0858 NaT NaT NaT NaT 2022-03-16 10:00:00 2022-03-16 13:00:00
1 NaN NaN 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 9a01d765af0a467ea37f08d92db114ba Valkenswaard GM0858 NaT NaT NaT NaT 2022-03-16 07:30:00 2022-03-16 21:00:00
2 NaN NaN 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 fc5869d33fbc4b06be659149fa615f4c Valkenswaard GM0858 NaT NaT NaT NaT 2022-03-16 07:30:00 2022-03-16 21:00:00
3 NaN NaN 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 4427cc0b39e040ba8f75c333f19d66f0 Valkenswaard GM0858 NaT NaT NaT NaT 2022-03-16 07:30:00 2022-03-16 21:00:00
4 2022-03-14T07:30:00 tot 2022-03-14T21:00:00 2022-03-15T07:30:00 tot 2022-03-15T21:00:00 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 a893bb9add324ce29769f1c39afcc48d Valkenswaard GM0858 2022-03-14 07:30:00 2022-03-14 21:00:00 2022-03-15 07:30:00 2022-03-15 21:00:00 2022-03-16 07:30:00 2022-03-16 21:00:00
... ... ... ... ... ... ... ... ... ... ... ... ...
9270 NaN NaN 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 f744546cd6894e5e9a4db4bbfd81b4ee Gennep GM0907 NaT NaT NaT NaT 2022-03-16 07:30:00 2022-03-16 21:00:00
9271 2022-03-14T07:30:00 tot 2022-03-14T21:00:00 2022-03-15T07:30:00 tot 2022-03-15T21:00:00 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 1270081b1dc74cd7bea0f45973650408 Gennep GM0907 2022-03-14 07:30:00 2022-03-14 21:00:00 2022-03-15 07:30:00 2022-03-15 21:00:00 2022-03-16 07:30:00 2022-03-16 21:00:00
9272 NaN 2022-03-15T07:30:00 tot 2022-03-15T21:00:00 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 447c7742604345139e41def4cf1e4d3c Gennep GM0907 NaT NaT 2022-03-15 07:30:00 2022-03-15 21:00:00 2022-03-16 07:30:00 2022-03-16 21:00:00
9273 NaN NaN 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 049cfd258c174bc49abf17883396d083 Gennep GM0907 NaT NaT NaT NaT 2022-03-16 07:30:00 2022-03-16 21:00:00
9274 NaN NaN 2022-03-16T07:30:00 tot 2022-03-16T21:00:00 1e8cbe96e72c4c6ba6303f47bec8cdb5 Gennep GM0907 NaT NaT NaT NaT 2022-03-16 07:30:00 2022-03-16 21:00:00

8582 rows × 12 columns

In [39]:
import datetime as dt
import numpy as np

def datesplit(df, column):

    df = df.dropna(subset = ['{} van'.format(column)])
    df1 = df.rename(columns={'{} van'.format(column):'vandate','{} tot'.format(column):'totdate', 'UUID':'UUID'})
    return  (pd.concat([pd.Series(r.UUID,pd.date_range(r.vandate, r.totdate, freq='0.5H')) 
                        for r in df1.itertuples()])
               .rename_axis('Openingstijden')
               .reset_index(name='UUID'))
def plot_opening(df, label):
    print("Open op 14 maart groep {}: {}".format(label, df[df['Openingstijden 15-03-2022 van'].isnull()][df['Openingstijden 16-03-2022 van'].isnull()]['Openingstijden 14-03-2022 van'].count()))
    print("Open op 15 maart groep {}: {}".format(label, df[df['Openingstijden 14-03-2022 van'].isnull()][df['Openingstijden 16-03-2022 van'].isnull()]['Openingstijden 15-03-2022 van'].count()))
    print("Open op 16 maart groep {}: {}".format(label, df[df['Openingstijden 14-03-2022 van'].isnull()][df['Openingstijden 15-03-2022 van'].isnull()]['Openingstijden 16-03-2022 van'].count()))

    print("Open op 14 én 15 maart groep {}: {}".format(label, df[df['Openingstijden 16-03-2022 van'].isnull()].dropna(subset=['Openingstijden 15-03-2022 van'])['Openingstijden 14-03-2022 van'].count()))
    print("Open op 14 én 16 maart groep {}: {}".format(label, df[df['Openingstijden 15-03-2022 van'].isnull()].dropna(subset=['Openingstijden 16-03-2022 van'])['Openingstijden 14-03-2022 van'].count()))
    print("Open op 15 én 16 maart groep {}: {}".format(label, df[df['Openingstijden 14-03-2022 van'].isnull()].dropna(subset=['Openingstijden 15-03-2022 van'])['Openingstijden 16-03-2022 van'].count()))
    print("Open op 14, 15 én 16 maart groep {}: {}".format(label, df.dropna(subset=['Openingstijden 16-03-2022 van', 'Openingstijden 15-03-2022 van'])['Openingstijden 14-03-2022 van'].count()))

    opening = np.datetime64('2022-03-16 07:30:00')
    closing = np.datetime64('2022-03-16 21:00:00')

    #print(df[(df['Openingstijden 16-03-2022 van'] == opening)])
    df_standard = df[(df['Openingstijden 16-03-2022 van'] == opening) & (df['Openingstijden 16-03-2022 tot'] == closing)]

    print("Aantal stemlokalen open op standaard tijden 16 Maart in staffel {}: {}".format(label, df_standard['Openingstijden 14-03-2022 van'].count()))

    plt.figure(figsize=(13,13))
    wims_datesplit_14 = df.loc[:, ('Openingstijden 14-03-2022 van','Openingstijden 14-03-2022 tot', 'UUID')]
    wims_datesplit_15 = df.loc[:, ('Openingstijden 15-03-2022 van','Openingstijden 15-03-2022 tot', 'UUID')]
    wims_datesplit_16 = df.loc[:, ('Openingstijden 16-03-2022 van','Openingstijden 16-03-2022 tot', 'UUID')]
    wims_datesplit_14 = datesplit(wims_datesplit_14, 'Openingstijden 14-03-2022')
    wims_datesplit_15 = datesplit(wims_datesplit_15, 'Openingstijden 15-03-2022')
    wims_datesplit_16 = datesplit(wims_datesplit_16, 'Openingstijden 16-03-2022')

    wims_datesplit_14.reset_index()
    wims_datesplit_15.reset_index()
    wims_datesplit_16.reset_index()

    #wims_datesplit_14.info()
    #wims_datesplit_15.info()
    #wims_datesplit_16.info()

    
    wims_datestack = pd.concat([wims_datesplit_14, wims_datesplit_15], ignore_index=True)
    wims_datestack = pd.concat([wims_datestack, wims_datesplit_16], ignore_index=True)
    
    wims_datestack.set_index('Openingstijden', drop=False, inplace=True)

    #print(wims_datestack['Openingstijden'].unique())

    xticks = []
    xticklabels = []
    datetimecount = 0
    for datetime in wims_datestack.groupby(pd.Grouper(freq='30Min'))['Openingstijden'].unique():
        if (datetime.size > 0):
            xticks.append(datetime.ravel()[0])
            if(datetimecount % 6 == 0):
                ts = pd.to_datetime(datetime.ravel()[0])
                #hardcoded for the data, sloppy code, quick fix, only applies to timestamps with 7 minute changes to reality
                if (ts.minute == 7):
                    ts = ts - dt.timedelta(minutes=7)
                xticklabels.append(ts.strftime("%m-%d %H:%M"))
            else:
                xticklabels.append(" ")
        else:
            xticks.append("")
            xticklabels.append("")
        datetimecount += 1


    wims_datestack.groupby(pd.Grouper(freq='30Min')).count().plot(kind='bar', y='Openingstijden',width=1, figsize=(25, 25), title="Openingstijden stemlokalen staffel {}".format(label), log=True).set_xticklabels(xticklabels, rotation=-45, ha="left", rotation_mode="anchor")
    

    
    dfg = wims_datestack.groupby(pd.Grouper(freq='30Min')).count()
    dfg['Staffel'] = label

    global wims_datestack_grouped
    if (label != 'totaal'):
        wims_datestack_grouped = pd.concat([wims_datestack_grouped, dfg])
    wims_datestack.to_csv(path_or_buf='../data/export/openingstijden_staffel_{}.csv'.format(label), sep=';', na_rep='', header=True, date_format = '%m-%d %H:%M')


    #wims_datesplit_16.groupby(wims_datesplit_16["Openingstijden 16-03-2022"].dt.hour).count().plot(kind="bar", y='Openingstijden 16-03-2022')
    #wims_datesplit_16.groupby(pd.Grouper(freq='30Min')).count().plot(kind='bar', y='Openingstijden 16-03-2022')
    #wims_datesplit_15.groupby(wims_datesplit_15["Openingstijden 15-03-2022"].dt.hour).count().plot(kind="bar", y='Openingstijden 15-03-2022')
    #wims_datesplit_14.groupby(wims_datesplit_14["Openingstijden 14-03-2022"].dt.hour).count().plot(kind="bar", y='Openingstijden 14-03-2022')
In [40]:
df_stemger = pd.read_excel('../data/Maatwerk_kiesgerechtigd_per_gemeente_def.xlsx', sheet_name='Tabel 1', header=0, skiprows= [0,1,3,5,6,7,344,345])
df_stemger_clean = df_stemger[df_stemger['gemeentecode'].isin(nl_map_clean['GM_CODE'])]

bins = [0, 10, 30, 60, 100, 350, float("inf")]
labels = ['1; 0-10.000 stemgerechtigden', '2; 10.000-30.000 stemgerechtigden', '3; 30.000-60.000 stemgerechtigden', '4; 60.000-100.000 stemgerechtigden', '5; 100.000-350.000 stemgerechtigden', '6; >350.000 stemgerechtigden']

df_stemger_clean['binned'] = pd.cut(df_stemger_clean['Kiesgerechtigde bevolking'], bins, labels=labels)
In [41]:
def filter_binned(df1, df2):
    return df1[df1['CBS gemeentecode'].isin(df2['gemeentecode'])]
In [42]:
df_dist_nonbin = df_nearest[['Gemeente', 'Naam stembureau', 'dist', "CBS gemeentecode", "geometry"]].rename(columns = {'CBS gemeentecode': 'gemeentecode'})
df_dist_bin = pd.merge(df_dist_nonbin, df_stemger_clean, on = 'gemeentecode')

df_furthest_binned = pd.DataFrame()

for label in labels: 
    print(df_dist_bin[df_dist_bin['binned'].str.fullmatch(label)].sort_values(by=['dist'])[::-1].head(1))
    df_furthest_binned = df_furthest_binned.append(df_dist_bin[df_dist_bin['binned'].str.fullmatch(label)].sort_values(by=['dist'])[::-1].head(1))
       Gemeente    Naam stembureau         dist gemeentecode  \
68130  Vlieland  Sporthal Flidunen  8023.806656       GM0096   

                            geometry  gemeente Kiesgerechtigde bevolking  \
68130  POINT (127250.000 586750.000)  Vlieland                         1   

                             binned  
68130  1; 0-10.000 stemgerechtigden  
        Gemeente              Naam stembureau         dist gemeentecode  \
66779  Roerdalen  Brede school de Berensprong  8117.463711       GM1669   

                            geometry   gemeente Kiesgerechtigde bevolking  \
66779  POINT (210250.000 355750.000)  Roerdalen                      17.3   

                                  binned  
66779  2; 10.000-30.000 stemgerechtigden  
         Gemeente               Naam stembureau         dist gemeentecode  \
30730  Harderwijk  Drive-In op parkeerplaats P2  8167.139659       GM0243   

                            geometry    gemeente Kiesgerechtigde bevolking  \
30730  POINT (167250.000 492250.000)  Harderwijk                        38   

                                  binned  
30730  3; 30.000-60.000 stemgerechtigden  
       Gemeente                  Naam stembureau         dist gemeentecode  \
20747  Lelystad  Gymzaal Kindcentrum Warande (2)  8685.023942       GM0995   

                            geometry  gemeente Kiesgerechtigde bevolking  \
20747  POINT (159750.000 491750.000)  Lelystad                      62.9   

                                   binned  
20747  4; 60.000-100.000 stemgerechtigden  
      Gemeente      Naam stembureau         dist gemeentecode  \
24075   Almere  School Het Avontuur  7847.286731       GM0034   

                            geometry gemeente Kiesgerechtigde bevolking  \
24075  POINT (158250.000 489250.000)   Almere                       164   

                                    binned  
24075  5; 100.000-350.000 stemgerechtigden  
        Gemeente Naam stembureau         dist gemeentecode  \
11706  Rotterdam       Dorpskerk  5983.140982       GM0599   

                           geometry   gemeente Kiesgerechtigde bevolking  \
11706  POINT (66750.000 438250.000)  Rotterdam                     516.8   

                             binned  
11706  6; >350.000 stemgerechtigden  
In [43]:
open_standaard = {
        'dag': [],
        'standaard': [],
        'aantal': [],
        'staffel': []
    }

def print_opening_standard(df, label, day, standard):
    df_stemger_label = df_stemger_clean[df_stemger_clean['binned'].str.fullmatch(label)]
    print("Staffel: {}, dag: {}, {}open op standaard dagen, stemlokalen: {}".format(label, day, standard, len(filter_binned(df, df_stemger_label).index)))
    global open_standaard
    open_standaard['dag'].append(day)
    open_standaard['aantal'].append(len(filter_binned(df, df_stemger_label).index))
    open_standaard['staffel'].append(label)
    if (standard == 'niet '):
        open_standaard['standaard'].append(False)
    else:
        open_standaard['standaard'].append(True)
for label in labels:
    print_opening_standard(wims_standaard_14, label, "14 maart", "")
    print_opening_standard(wims_standaard_15, label, "15 maart", "")
    print_opening_standard(wims_standaard_16, label, "16 maart", "")
    print_opening_standard(wims_nonstandaard_14, label, "14 maart", "niet ")
    print_opening_standard(wims_nonstandaard_15, label, "15 maart", "niet ")
    print_opening_standard(wims_nonstandaard_16, label, "16 maart", "niet ")
Staffel: 1; 0-10.000 stemgerechtigden, dag: 14 maart, open op standaard dagen, stemlokalen: 28
Staffel: 1; 0-10.000 stemgerechtigden, dag: 15 maart, open op standaard dagen, stemlokalen: 31
Staffel: 1; 0-10.000 stemgerechtigden, dag: 16 maart, open op standaard dagen, stemlokalen: 129
Staffel: 1; 0-10.000 stemgerechtigden, dag: 14 maart, niet open op standaard dagen, stemlokalen: 0
Staffel: 1; 0-10.000 stemgerechtigden, dag: 15 maart, niet open op standaard dagen, stemlokalen: 4
Staffel: 1; 0-10.000 stemgerechtigden, dag: 16 maart, niet open op standaard dagen, stemlokalen: 3
Staffel: 2; 10.000-30.000 stemgerechtigden, dag: 14 maart, open op standaard dagen, stemlokalen: 446
Staffel: 2; 10.000-30.000 stemgerechtigden, dag: 15 maart, open op standaard dagen, stemlokalen: 449
Staffel: 2; 10.000-30.000 stemgerechtigden, dag: 16 maart, open op standaard dagen, stemlokalen: 2242
Staffel: 2; 10.000-30.000 stemgerechtigden, dag: 14 maart, niet open op standaard dagen, stemlokalen: 16
Staffel: 2; 10.000-30.000 stemgerechtigden, dag: 15 maart, niet open op standaard dagen, stemlokalen: 17
Staffel: 2; 10.000-30.000 stemgerechtigden, dag: 16 maart, niet open op standaard dagen, stemlokalen: 103
Staffel: 3; 30.000-60.000 stemgerechtigden, dag: 14 maart, open op standaard dagen, stemlokalen: 392
Staffel: 3; 30.000-60.000 stemgerechtigden, dag: 15 maart, open op standaard dagen, stemlokalen: 388
Staffel: 3; 30.000-60.000 stemgerechtigden, dag: 16 maart, open op standaard dagen, stemlokalen: 2328
Staffel: 3; 30.000-60.000 stemgerechtigden, dag: 14 maart, niet open op standaard dagen, stemlokalen: 12
Staffel: 3; 30.000-60.000 stemgerechtigden, dag: 15 maart, niet open op standaard dagen, stemlokalen: 17
Staffel: 3; 30.000-60.000 stemgerechtigden, dag: 16 maart, niet open op standaard dagen, stemlokalen: 68
Staffel: 4; 60.000-100.000 stemgerechtigden, dag: 14 maart, open op standaard dagen, stemlokalen: 213
Staffel: 4; 60.000-100.000 stemgerechtigden, dag: 15 maart, open op standaard dagen, stemlokalen: 213
Staffel: 4; 60.000-100.000 stemgerechtigden, dag: 16 maart, open op standaard dagen, stemlokalen: 1051
Staffel: 4; 60.000-100.000 stemgerechtigden, dag: 14 maart, niet open op standaard dagen, stemlokalen: 3
Staffel: 4; 60.000-100.000 stemgerechtigden, dag: 15 maart, niet open op standaard dagen, stemlokalen: 2
Staffel: 4; 60.000-100.000 stemgerechtigden, dag: 16 maart, niet open op standaard dagen, stemlokalen: 29
Staffel: 5; 100.000-350.000 stemgerechtigden, dag: 14 maart, open op standaard dagen, stemlokalen: 226
Staffel: 5; 100.000-350.000 stemgerechtigden, dag: 15 maart, open op standaard dagen, stemlokalen: 202
Staffel: 5; 100.000-350.000 stemgerechtigden, dag: 16 maart, open op standaard dagen, stemlokalen: 1456
Staffel: 5; 100.000-350.000 stemgerechtigden, dag: 14 maart, niet open op standaard dagen, stemlokalen: 13
Staffel: 5; 100.000-350.000 stemgerechtigden, dag: 15 maart, niet open op standaard dagen, stemlokalen: 16
Staffel: 5; 100.000-350.000 stemgerechtigden, dag: 16 maart, niet open op standaard dagen, stemlokalen: 39
Staffel: 6; >350.000 stemgerechtigden, dag: 14 maart, open op standaard dagen, stemlokalen: 151
Staffel: 6; >350.000 stemgerechtigden, dag: 15 maart, open op standaard dagen, stemlokalen: 151
Staffel: 6; >350.000 stemgerechtigden, dag: 16 maart, open op standaard dagen, stemlokalen: 1015
Staffel: 6; >350.000 stemgerechtigden, dag: 14 maart, niet open op standaard dagen, stemlokalen: 1
Staffel: 6; >350.000 stemgerechtigden, dag: 15 maart, niet open op standaard dagen, stemlokalen: 1
Staffel: 6; >350.000 stemgerechtigden, dag: 16 maart, niet open op standaard dagen, stemlokalen: 5
In [44]:
df_open_standaard_full = pd.DataFrame(open_standaard)

df_open_standaard_plot = df_open_standaard_full[df_open_standaard_full['standaard']].pivot(index='dag', columns=['staffel'], values=['aantal'])

df_open_nonstandaard = pd.DataFrame(open_standaard)

df_open_nonstandaard_plot = df_open_nonstandaard[~df_open_nonstandaard['standaard']].pivot(index='dag', columns=['staffel'], values=['aantal'])

dagen_standaard = sorted(list(dict.fromkeys(open_standaard['dag'])))

ax_open_standaard = df_open_standaard_plot.plot(title='Stemlokalen open op standaard tijden',kind="bar", stacked=True, fontsize=22, figsize=(13,13))

ax_open_nonstandaard = df_open_nonstandaard_plot.plot(title='Stemlokalen open op niet standaard tijden', kind="bar", stacked=True, fontsize=22, figsize=(13,13))

ax_open_standaard.set_xticklabels(dagen_standaard, fontsize=22, rotation=-45, ha="left", rotation_mode="anchor")

ax_open_nonstandaard.set_xticklabels(dagen_standaard, fontsize=22, rotation=-45, ha="left", rotation_mode="anchor")
Out[44]:
[Text(0, 0, '14 maart'), Text(1, 0, '15 maart'), Text(2, 0, '16 maart')]
No description has been provided for this image
No description has been provided for this image
In [45]:
df_open_standaard_full.pivot(index='dag', columns=['staffel', 'standaard'], values=['aantal'])
Out[45]:
aantal
staffel 1; 0-10.000 stemgerechtigden 2; 10.000-30.000 stemgerechtigden 3; 30.000-60.000 stemgerechtigden 4; 60.000-100.000 stemgerechtigden 5; 100.000-350.000 stemgerechtigden 6; >350.000 stemgerechtigden
standaard True False True False True False True False True False True False
dag
14 maart 28 0 446 16 392 12 213 3 226 13 151 1
15 maart 31 4 449 17 388 17 213 2 202 16 151 1
16 maart 129 3 2242 103 2328 68 1051 29 1456 39 1015 5

Staffel 1 2 3 4 5 6
14 maart 0% 3.4% 3.1% 1.7% 6.2% 0.7% 15 maart 12.1% 3.6% 4.4% 0.5% 7.2% 0.7% 16 maart 2.3% 4.5% 2.9% 2.8% 2.6% 0.5%

In [46]:
wims_datestack_grouped = pd.DataFrame()
def make_graphs_opening(label):
    df_stemger_label = df_stemger_clean[df_stemger_clean['binned'].str.fullmatch(label)]
    #df_stemger_label.head()
    graph_wims = filter_binned(gdf_wims_dedupe, df_stemger_label)
    graph_wims_split = filter_binned(gdf_wims_split, df_stemger_label)
    plot_opening(graph_wims_split, label)
    
    
for label in labels:
    make_graphs_opening(label)

print(wims_datestack_grouped)
Open op 14 maart groep 1; 0-10.000 stemgerechtigden: 0
Open op 15 maart groep 1; 0-10.000 stemgerechtigden: 5
Open op 16 maart groep 1; 0-10.000 stemgerechtigden: 98
Open op 14 én 15 maart groep 1; 0-10.000 stemgerechtigden: 0
Open op 14 én 16 maart groep 1; 0-10.000 stemgerechtigden: 4
Open op 15 én 16 maart groep 1; 0-10.000 stemgerechtigden: 6
Open op 14, 15 én 16 maart groep 1; 0-10.000 stemgerechtigden: 24
Aantal stemlokalen open op standaard tijden 16 Maart in staffel 1; 0-10.000 stemgerechtigden: 28
Open op 14 maart groep 2; 10.000-30.000 stemgerechtigden: 10
Open op 15 maart groep 2; 10.000-30.000 stemgerechtigden: 6
Open op 16 maart groep 2; 10.000-30.000 stemgerechtigden: 1877
Open op 14 én 15 maart groep 2; 10.000-30.000 stemgerechtigden: 5
Open op 14 én 16 maart groep 2; 10.000-30.000 stemgerechtigden: 13
Open op 15 én 16 maart groep 2; 10.000-30.000 stemgerechtigden: 21
Open op 14, 15 én 16 maart groep 2; 10.000-30.000 stemgerechtigden: 434
Aantal stemlokalen open op standaard tijden 16 Maart in staffel 2; 10.000-30.000 stemgerechtigden: 442
Open op 14 maart groep 3; 30.000-60.000 stemgerechtigden: 16
Open op 15 maart groep 3; 30.000-60.000 stemgerechtigden: 16
Open op 16 maart groep 3; 30.000-60.000 stemgerechtigden: 2002
Open op 14 én 15 maart groep 3; 30.000-60.000 stemgerechtigden: 6
Open op 14 én 16 maart groep 3; 30.000-60.000 stemgerechtigden: 11
Open op 15 én 16 maart groep 3; 30.000-60.000 stemgerechtigden: 12
Open op 14, 15 én 16 maart groep 3; 30.000-60.000 stemgerechtigden: 371
Aantal stemlokalen open op standaard tijden 16 Maart in staffel 3; 30.000-60.000 stemgerechtigden: 378
Open op 14 maart groep 4; 60.000-100.000 stemgerechtigden: 9
Open op 15 maart groep 4; 60.000-100.000 stemgerechtigden: 3
Open op 16 maart groep 4; 60.000-100.000 stemgerechtigden: 869
Open op 14 én 15 maart groep 4; 60.000-100.000 stemgerechtigden: 1
Open op 14 én 16 maart groep 4; 60.000-100.000 stemgerechtigden: 0
Open op 15 én 16 maart groep 4; 60.000-100.000 stemgerechtigden: 5
Open op 14, 15 én 16 maart groep 4; 60.000-100.000 stemgerechtigden: 206
Aantal stemlokalen open op standaard tijden 16 Maart in staffel 4; 60.000-100.000 stemgerechtigden: 205
Open op 14 maart groep 5; 100.000-350.000 stemgerechtigden: 29
Open op 15 maart groep 5; 100.000-350.000 stemgerechtigden: 8
Open op 16 maart groep 5; 100.000-350.000 stemgerechtigden: 1285
Open op 14 én 15 maart groep 5; 100.000-350.000 stemgerechtigden: 0
Open op 14 én 16 maart groep 5; 100.000-350.000 stemgerechtigden: 0
Open op 15 én 16 maart groep 5; 100.000-350.000 stemgerechtigden: 0
Open op 14, 15 én 16 maart groep 5; 100.000-350.000 stemgerechtigden: 210
Aantal stemlokalen open op standaard tijden 16 Maart in staffel 5; 100.000-350.000 stemgerechtigden: 208
Open op 14 maart groep 6; >350.000 stemgerechtigden: 0
Open op 15 maart groep 6; >350.000 stemgerechtigden: 0
Open op 16 maart groep 6; >350.000 stemgerechtigden: 868
Open op 14 én 15 maart groep 6; >350.000 stemgerechtigden: 0
Open op 14 én 16 maart groep 6; >350.000 stemgerechtigden: 0
Open op 15 én 16 maart groep 6; >350.000 stemgerechtigden: 0
Open op 14, 15 én 16 maart groep 6; >350.000 stemgerechtigden: 152
Aantal stemlokalen open op standaard tijden 16 Maart in staffel 6; >350.000 stemgerechtigden: 151
                     Openingstijden  UUID                       Staffel
Openingstijden                                                         
2022-03-14 07:30:00              28    28  1; 0-10.000 stemgerechtigden
2022-03-14 08:00:00              28    28  1; 0-10.000 stemgerechtigden
2022-03-14 08:30:00              28    28  1; 0-10.000 stemgerechtigden
2022-03-14 09:00:00              28    28  1; 0-10.000 stemgerechtigden
2022-03-14 09:30:00              28    28  1; 0-10.000 stemgerechtigden
...                             ...   ...                           ...
2022-03-16 19:00:00            1019  1019  6; >350.000 stemgerechtigden
2022-03-16 19:30:00            1019  1019  6; >350.000 stemgerechtigden
2022-03-16 20:00:00            1019  1019  6; >350.000 stemgerechtigden
2022-03-16 20:30:00            1019  1019  6; >350.000 stemgerechtigden
2022-03-16 21:00:00            1017  1017  6; >350.000 stemgerechtigden

[762 rows x 3 columns]
<Figure size 936x936 with 0 Axes>
No description has been provided for this image
<Figure size 936x936 with 0 Axes>
No description has been provided for this image
<Figure size 936x936 with 0 Axes>
No description has been provided for this image
<Figure size 936x936 with 0 Axes>
No description has been provided for this image
<Figure size 936x936 with 0 Axes>
No description has been provided for this image
<Figure size 936x936 with 0 Axes>
No description has been provided for this image
In [47]:
wims_datestack_grouped.drop('Openingstijden', axis=1, inplace=True)
wims_datestack_grouped.reset_index(inplace=True)
In [51]:
def graph_open_stacked(df):
    wims_pivot = df.pivot_table(index='Openingstijden', columns='Staffel', values='UUID', aggfunc='sum')

    ax_open_opening = wims_pivot.plot(kind="bar", width=1, stacked=True, fontsize=22, figsize=(40,40), log=True)


    xticks = pd.date_range(start=df.Openingstijden.min(), end=df.Openingstijden.max(), freq="30min")
    xticklabels = []
    tickcount = 0
    for tick in xticks:
        if (tickcount % 6 == 0):
            xticklabels.append(tick.strftime("%d-%m %H:%M"))
        else:
            xticklabels.append(" ")
        tickcount += 1


    ax_open_opening.set_xticklabels(xticklabels, fontsize=22, rotation=-45, ha="left", rotation_mode="anchor")
In [52]:
graph_open_stacked(wims_datestack_grouped)
No description has been provided for this image
In [50]:
filtered_datestack_1 = wims_datestack_grouped.loc[(pd.to_datetime(wims_datestack_grouped['Openingstijden']) >= pd.to_datetime('2022-03-14T07:30:00.000Z'))
                     & (pd.to_datetime(wims_datestack_grouped['Openingstijden']) <= pd.to_datetime('2022-03-14T21:00:00.000Z'))]
graph_open_stacked(filtered_datestack_1)
"""
filtered_datestack_2 = wims_datestack_grouped.loc[(pd.to_datetime(((wims_datestack_grouped['Openingstijden'])) >= pd.to_datetime('2022-03-15T07:30:00.000Z')))
                     & (pd.to_datetime(wims_datestack_grouped['Openingstijden']) <= pd.to_datetime('2022-03-15T21:00:00.000Z'))]
graph_open_stacked(filtered_datestack_2)
filtered_datestack_3 = wims_datestack_grouped.loc[(pd.to_datetime(wims_datestack_grouped['Openingstijden']) >= pd.to_datetime('2022-03-16T07:30:00.000Z'))
                     & (pd.to_datetime(wims_datestack_grouped['Openingstijden']) <= pd.to_datetime('2022-03-16T21:00:00.000Z'))]
graph_open_stacked(filtered_datestack_3)
"""
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
File ~/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py:536, in DatetimeLikeArrayMixin._validate_comparison_value(self, other)
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=534'>535</a> try:
--> <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=535'>536</a>     self._check_compatible_with(other)
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=536'>537</a> except (TypeError, IncompatibleFrequency) as err:
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=537'>538</a>     # e.g. tzawareness mismatch

File ~/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimes.py:508, in DatetimeArray._check_compatible_with(self, other, setitem)
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimes.py?line=506'>507</a>     return
--> <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimes.py?line=507'>508</a> self._assert_tzawareness_compat(other)
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimes.py?line=508'>509</a> if setitem:
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimes.py?line=509'>510</a>     # Stricter check for setitem vs comparison methods

File ~/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimes.py:711, in DatetimeArray._assert_tzawareness_compat(self, other)
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimes.py?line=709'>710</a>     if other_tz is not None:
--> <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimes.py?line=710'>711</a>         raise TypeError(
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimes.py?line=711'>712</a>             "Cannot compare tz-naive and tz-aware datetime-like objects."
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimes.py?line=712'>713</a>         )
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimes.py?line=713'>714</a> elif other_tz is None:

TypeError: Cannot compare tz-naive and tz-aware datetime-like objects.

The above exception was the direct cause of the following exception:

InvalidComparison                         Traceback (most recent call last)
File ~/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py:1008, in DatetimeLikeArrayMixin._cmp_method(self, other, op)
   <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=1006'>1007</a> try:
-> <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=1007'>1008</a>     other = self._validate_comparison_value(other)
   <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=1008'>1009</a> except InvalidComparison:

File ~/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py:539, in DatetimeLikeArrayMixin._validate_comparison_value(self, other)
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=536'>537</a>     except (TypeError, IncompatibleFrequency) as err:
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=537'>538</a>         # e.g. tzawareness mismatch
--> <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=538'>539</a>         raise InvalidComparison(other) from err
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=540'>541</a> elif not is_list_like(other):

InvalidComparison: 2022-03-14 07:30:00+00:00

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
/home/lillian/Code/stembureau-meting/jupyter/stembureau_data.ipynb Cell 69' in <cell line: 1>()
----> <a href='vscode-notebook-cell:/home/lillian/Code/stembureau-meting/jupyter/stembureau_data.ipynb#ch0000068?line=0'>1</a> filtered_datestack_1 = wims_datestack_grouped.loc[(pd.to_datetime(wims_datestack_grouped['Openingstijden']) >= pd.to_datetime('2022-03-14T07:30:00.000Z'))
      <a href='vscode-notebook-cell:/home/lillian/Code/stembureau-meting/jupyter/stembureau_data.ipynb#ch0000068?line=1'>2</a>                      & (pd.to_datetime(wims_datestack_grouped['Openingstijden']) <= pd.to_datetime('2022-03-14T21:00:00.000Z'))]
      <a href='vscode-notebook-cell:/home/lillian/Code/stembureau-meting/jupyter/stembureau_data.ipynb#ch0000068?line=2'>3</a> graph_open_stacked(filtered_datestack_1)
      <a href='vscode-notebook-cell:/home/lillian/Code/stembureau-meting/jupyter/stembureau_data.ipynb#ch0000068?line=3'>4</a> """
      <a href='vscode-notebook-cell:/home/lillian/Code/stembureau-meting/jupyter/stembureau_data.ipynb#ch0000068?line=4'>5</a> filtered_datestack_2 = wims_datestack_grouped.loc[(pd.to_datetime(((wims_datestack_grouped['Openingstijden'])) >= pd.to_datetime('2022-03-15T07:30:00.000Z')))
      <a href='vscode-notebook-cell:/home/lillian/Code/stembureau-meting/jupyter/stembureau_data.ipynb#ch0000068?line=5'>6</a>                      & (pd.to_datetime(wims_datestack_grouped['Openingstijden']) <= pd.to_datetime('2022-03-15T21:00:00.000Z'))]
   (...)
     <a href='vscode-notebook-cell:/home/lillian/Code/stembureau-meting/jupyter/stembureau_data.ipynb#ch0000068?line=9'>10</a> graph_open_stacked(filtered_datestack_3)
     <a href='vscode-notebook-cell:/home/lillian/Code/stembureau-meting/jupyter/stembureau_data.ipynb#ch0000068?line=10'>11</a> """

File ~/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/common.py:70, in _unpack_zerodim_and_defer.<locals>.new_method(self, other)
     <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/common.py?line=65'>66</a>             return NotImplemented
     <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/common.py?line=67'>68</a> other = item_from_zerodim(other)
---> <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/common.py?line=69'>70</a> return method(self, other)

File ~/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arraylike.py:60, in OpsMixin.__ge__(self, other)
     <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arraylike.py?line=57'>58</a> @unpack_zerodim_and_defer("__ge__")
     <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arraylike.py?line=58'>59</a> def __ge__(self, other):
---> <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arraylike.py?line=59'>60</a>     return self._cmp_method(other, operator.ge)

File ~/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/series.py:5623, in Series._cmp_method(self, other, op)
   <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/series.py?line=5619'>5620</a> rvalues = extract_array(other, extract_numpy=True, extract_range=True)
   <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/series.py?line=5621'>5622</a> with np.errstate(all="ignore"):
-> <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/series.py?line=5622'>5623</a>     res_values = ops.comparison_op(lvalues, rvalues, op)
   <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/series.py?line=5624'>5625</a> return self._construct_result(res_values, name=res_name)

File ~/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/array_ops.py:269, in comparison_op(left, right, op)
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/array_ops.py?line=259'>260</a>         raise ValueError(
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/array_ops.py?line=260'>261</a>             "Lengths must match to compare", lvalues.shape, rvalues.shape
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/array_ops.py?line=261'>262</a>         )
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/array_ops.py?line=263'>264</a> if should_extension_dispatch(lvalues, rvalues) or (
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/array_ops.py?line=264'>265</a>     (isinstance(rvalues, (Timedelta, BaseOffset, Timestamp)) or right is NaT)
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/array_ops.py?line=265'>266</a>     and not is_object_dtype(lvalues.dtype)
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/array_ops.py?line=266'>267</a> ):
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/array_ops.py?line=267'>268</a>     # Call the method on lvalues
--> <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/array_ops.py?line=268'>269</a>     res_values = op(lvalues, rvalues)
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/array_ops.py?line=270'>271</a> elif is_scalar(rvalues) and isna(rvalues):  # TODO: but not pd.NA?
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/array_ops.py?line=271'>272</a>     # numpy does not like comparisons vs None
    <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/array_ops.py?line=272'>273</a>     if op is operator.ne:

File ~/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/common.py:70, in _unpack_zerodim_and_defer.<locals>.new_method(self, other)
     <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/common.py?line=65'>66</a>             return NotImplemented
     <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/common.py?line=67'>68</a> other = item_from_zerodim(other)
---> <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/common.py?line=69'>70</a> return method(self, other)

File ~/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arraylike.py:60, in OpsMixin.__ge__(self, other)
     <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arraylike.py?line=57'>58</a> @unpack_zerodim_and_defer("__ge__")
     <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arraylike.py?line=58'>59</a> def __ge__(self, other):
---> <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arraylike.py?line=59'>60</a>     return self._cmp_method(other, operator.ge)

File ~/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py:1010, in DatetimeLikeArrayMixin._cmp_method(self, other, op)
   <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=1007'>1008</a>     other = self._validate_comparison_value(other)
   <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=1008'>1009</a> except InvalidComparison:
-> <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=1009'>1010</a>     return invalid_comparison(self, other, op)
   <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=1011'>1012</a> dtype = getattr(other, "dtype", None)
   <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=1012'>1013</a> if is_object_dtype(dtype):
   <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=1013'>1014</a>     # We have to use comp_method_OBJECT_ARRAY instead of numpy
   <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=1014'>1015</a>     #  comparison otherwise it would fail to raise when
   <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/arrays/datetimelike.py?line=1015'>1016</a>     #  comparing tz-aware and tz-naive

File ~/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/invalid.py:34, in invalid_comparison(left, right, op)
     <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/invalid.py?line=31'>32</a> else:
     <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/invalid.py?line=32'>33</a>     typ = type(right).__name__
---> <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/invalid.py?line=33'>34</a>     raise TypeError(f"Invalid comparison between dtype={left.dtype} and {typ}")
     <a href='file:///home/lillian/.conda/envs/stembureaus/lib/python3.10/site-packages/pandas/core/ops/invalid.py?line=34'>35</a> return res_values

TypeError: Invalid comparison between dtype=datetime64[ns] and Timestamp
In [53]:
list_temp = [404, 229, 115, 91, 80, 53, 39, 28, 27, 26]

for num in list_temp:
    
    print("{} | {}".format(num,(num / sum(list_temp) * 100)))
404 | 36.996336996337
229 | 20.97069597069597
115 | 10.531135531135531
91 | 8.333333333333332
80 | 7.326007326007327
53 | 4.853479853479854
39 | 3.571428571428571
28 | 2.564102564102564
27 | 2.4725274725274726
26 | 2.380952380952381
In [54]:
def make_graphs_use(label):
    df_stemger_label = df_stemger_clean[df_stemger_clean['binned'].str.fullmatch(label)]
    plot_use(filter_binned(gdf_wims_dedupe, df_stemger_label), label)

for label in labels:
    make_graphs_use(label)
Staffel: 1; 0-10.000 stemgerechtigden
bijeenkomstfunctie         83
kantoorfunctie             26
sportfunctie               23
woonfunctie                15
overige gebruiksfunctie    12
onderwijsfunctie           10
gezondheidszorgfunctie      6
winkelfunctie               3
industriefunctie            1
Name: Gebruiksdoel van het gebouw, dtype: int64
Staffel: 2; 10.000-30.000 stemgerechtigden
bijeenkomstfunctie         1420
sportfunctie                456
kantoorfunctie              270
onderwijsfunctie            249
woonfunctie                 213
overige gebruiksfunctie      98
gezondheidszorgfunctie       80
industriefunctie             40
winkelfunctie                37
logiesfunctie                33
Name: Gebruiksdoel van het gebouw, dtype: int64
Staffel: 3; 30.000-60.000 stemgerechtigden
bijeenkomstfunctie         1507
sportfunctie                436
onderwijsfunctie            284
kantoorfunctie              224
woonfunctie                 185
overige gebruiksfunctie     114
gezondheidszorgfunctie      103
industriefunctie             54
winkelfunctie                34
logiesfunctie                27
celfunctie                    1
Name: Gebruiksdoel van het gebouw, dtype: int64
Staffel: 4; 60.000-100.000 stemgerechtigden
bijeenkomstfunctie         595
sportfunctie               188
onderwijsfunctie           152
kantoorfunctie              91
woonfunctie                 88
gezondheidszorgfunctie      47
overige gebruiksfunctie     44
industriefunctie            22
winkelfunctie               20
logiesfunctie                7
celfunctie                   1
Name: Gebruiksdoel van het gebouw, dtype: int64
Staffel: 5; 100.000-350.000 stemgerechtigden
bijeenkomstfunctie         727
onderwijsfunctie           318
sportfunctie               273
kantoorfunctie             150
woonfunctie                120
overige gebruiksfunctie     66
gezondheidszorgfunctie      55
industriefunctie            49
winkelfunctie               32
logiesfunctie               12
celfunctie                   1
Name: Gebruiksdoel van het gebouw, dtype: int64
Staffel: 6; >350.000 stemgerechtigden
bijeenkomstfunctie         404
onderwijsfunctie           229
sportfunctie               115
kantoorfunctie              91
woonfunctie                 80
industriefunctie            53
overige gebruiksfunctie     39
winkelfunctie               28
gezondheidszorgfunctie      27
logiesfunctie               26
Name: Gebruiksdoel van het gebouw, dtype: int64
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
In [55]:
plot_opening(gdf_wims_split, "totaal")
Open op 14 maart groep totaal: 64
Open op 15 maart groep totaal: 38
Open op 16 maart groep totaal: 6999
Open op 14 én 15 maart groep totaal: 12
Open op 14 én 16 maart groep totaal: 28
Open op 15 én 16 maart groep totaal: 44
Open op 14, 15 én 16 maart groep totaal: 1397
Aantal stemlokalen open op standaard tijden 16 Maart in staffel totaal: 1412
<Figure size 936x936 with 0 Axes>
No description has been provided for this image
In [56]:
plot_use(gdf_wims_dedupe, "totaal")
Staffel: totaal
bijeenkomstfunctie         4736
sportfunctie               1491
onderwijsfunctie           1242
kantoorfunctie              852
woonfunctie                 701
overige gebruiksfunctie     373
gezondheidszorgfunctie      318
industriefunctie            219
winkelfunctie               154
logiesfunctie               105
celfunctie                    3
Name: Gebruiksdoel van het gebouw, dtype: int64
No description has been provided for this image
In [57]:
 print(df_stemger_clean['binned'].value_counts())
2; 10.000-30.000 stemgerechtigden      170
3; 30.000-60.000 stemgerechtigden       92
1; 0-10.000 stemgerechtigden            25
4; 60.000-100.000 stemgerechtigden      24
5; 100.000-350.000 stemgerechtigden     19
6; >350.000 stemgerechtigden             3
Name: binned, dtype: int64
In [58]:
def make_graphs_dist(label):
    df_stemger_label = df_stemger_clean[df_stemger_clean['binned'].str.fullmatch(label)]
    plot_dist(filter_binned(df_nearest, df_stemger_label), label)

for label in labels:
    make_graphs_dist(label)
    
No description has been provided for this image
<Figure size 936x936 with 0 Axes>
No description has been provided for this image
No description has been provided for this image
<Figure size 936x936 with 0 Axes>
No description has been provided for this image
No description has been provided for this image
<Figure size 936x936 with 0 Axes>
No description has been provided for this image
No description has been provided for this image
<Figure size 936x936 with 0 Axes>
No description has been provided for this image
No description has been provided for this image
<Figure size 936x936 with 0 Axes>
No description has been provided for this image
No description has been provided for this image
<Figure size 936x936 with 0 Axes>
No description has been provided for this image
In [59]:
def w_avg(df, values, weights):
    d = df[values]
    w = df[weights]
    return (d * w).sum() / w.sum()
print("Gemiddelde afstand tot stemlokaal totaal: {}".format(w_avg(df_nearest, "dist", "aantal_inwoners")))

df_nearest_rename = df_nearest.rename(columns = {'CBS gemeentecode': 'gemeentecode'})
print(list(df_nearest_rename))
df_nearest_merged = pd.merge(df_nearest_rename, df_stemger_clean, on=['gemeentecode'])
df_nearest_merged.groupby('binned').apply(w_avg, 'dist', 'aantal_inwoners')
Gemiddelde afstand tot stemlokaal totaal: 398.4622574050279
['crs28992res500m', 'aantal_inwoners', 'stedelijkheid', 'geometry', 'savedindex', 'Unnamed: 0', '_id', 'Gemeente', 'gemeentecode', 'Nummer stembureau', 'Naam stembureau', 'Gebruiksdoel van het gebouw', 'Website locatie', 'Wijknaam', 'CBS wijknummer', 'Buurtnaam', 'CBS buurtnummer', 'BAG Nummeraanduiding ID', 'Straatnaam', 'Huisnummer', 'Huisletter', 'Huisnummertoevoeging', 'Postcode', 'Plaats', 'Extra adresaanduiding', 'X', 'Y', 'Latitude', 'Longitude', 'Openingstijden 14-03-2022', 'Openingstijden 15-03-2022', 'Openingstijden 16-03-2022', 'Toegankelijk voor mensen met een lichamelijke beperking', 'Akoestiek', 'Auditieve hulpmiddelen', 'Visuele hulpmiddelen', 'Gehandicaptentoilet', 'Kieskring ID', 'Hoofdstembureau', 'Tellocatie', 'Contactgegevens gemeente', 'Verkiezingswebsite gemeente', 'Verkiezingen', 'ID', 'UUID', 'dist']
Out[59]:
binned
1; 0-10.000 stemgerechtigden           557.263691
2; 10.000-30.000 stemgerechtigden      501.954603
3; 30.000-60.000 stemgerechtigden      430.203478
4; 60.000-100.000 stemgerechtigden     385.710814
5; 100.000-350.000 stemgerechtigden    330.138666
6; >350.000 stemgerechtigden           228.956257
dtype: float64
In [60]:
def weighted_median(df, val, weight):
    df_sorted = df.sort_values(val)
    cumsum = df_sorted[weight].cumsum()
    cutoff = df_sorted[weight].sum() / 2.
    return df_sorted[cumsum >= cutoff][val].iloc[0]

print(weighted_median(df_nearest_merged, 'dist', 'aantal_inwoners'))

print(df_nearest_merged.groupby('binned').apply(weighted_median, 'dist', 'aantal_inwoners'))
310.67489219672746
binned
1; 0-10.000 stemgerechtigden           419.609842
2; 10.000-30.000 stemgerechtigden      372.963518
3; 30.000-60.000 stemgerechtigden      342.569428
4; 60.000-100.000 stemgerechtigden     310.750995
5; 100.000-350.000 stemgerechtigden    285.175463
6; >350.000 stemgerechtigden           210.788011
dtype: float64
In [61]:
#df_nearest_merged['New']=df_nearest_merged[['aantal_inwoners','r2']].apply(tuple ,1);df_nearest_merged.groupby(['binned']).New.value_counts().reindex(pd.MultiIndex.from_frame(df_nearest_merged[['binned','New']])).values
In [62]:
plot_dist(df_nearest, "totaal")
No description has been provided for this image
<Figure size 936x936 with 0 Axes>
No description has been provided for this image
In [63]:
def print_type(df, label):
    # 'Naam stembureu' en 'Extra adresaanduiding' moeten 'mobiel' bevatten, maar 'Extra adresaanduiding' mag niet
    # ook 'niet open voor algemeen publiek' bevatten
    print("aantal mobiele stemlokalen groep {}: {}".format(
        label,
        df[
            ((df["Naam stembureau"].str.contains("mobiel", case=False)) | (df["Extra adresaanduiding"].str.contains("mobiel", case=False, na=False)))
            &
            ~(df["Extra adresaanduiding"].str.contains("niet open voor algemeen publiek", case=False, na=False)
            )
        ]["Naam stembureau"].count()
    ))
    print("aantal drive through stemlokalen groep {}: {}".format(label, df[(df["Naam stembureau"].str.contains("drive", case=False)) | (df["Extra adresaanduiding"].str.contains("drive", case=False))]["Naam stembureau"].count()))
    df_publiek = df.dropna(subset=['Extra adresaanduiding'])
    print("aantal niet publiek open stemlokalen groep {}: {}".format(label, df_publiek[df_publiek["Extra adresaanduiding"].str.contains("niet open voor algemeen publiek", case=False)]["Extra adresaanduiding"].count()))
    print("aantal tent stemlokalen groep {}: {}".format(label, df[(df["Naam stembureau"].str.contains("tent", case=False)) | (df["Extra adresaanduiding"].str.contains("tent", case=False))]["Naam stembureau"].count()))
    print("aantal parkeerplaats stemlokalen groep {}: {}".format(label, df[(df["Naam stembureau"].str.contains("parkeer", case=False)) | (df["Extra adresaanduiding"].str.contains("parkeer", case=False))]["Naam stembureau"].count()))
    print("aantal bus stemlokalen groep {}: {}".format(label, df[(df["Naam stembureau"].str.contains("bus", case=False)) | (df["Extra adresaanduiding"].str.contains("bus", case=False))]["Naam stembureau"].count()))
In [64]:
print_type(gdf_wims_dedupe, "totaal")
print("\n")

def make_print_type(label):
    df_stemger_label = df_stemger_clean[df_stemger_clean['binned'].str.fullmatch(label)]
    print_type(filter_binned(gdf_wims_dedupe, df_stemger_label), label)
    
for label in labels:
    make_print_type(label)
    print("\n")
aantal mobiele stemlokalen groep totaal: 111
aantal drive through stemlokalen groep totaal: 39
aantal niet publiek open stemlokalen groep totaal: 100
aantal tent stemlokalen groep totaal: 80
aantal parkeerplaats stemlokalen groep totaal: 58
aantal bus stemlokalen groep totaal: 34


aantal mobiele stemlokalen groep 1; 0-10.000 stemgerechtigden: 0
aantal drive through stemlokalen groep 1; 0-10.000 stemgerechtigden: 1
aantal niet publiek open stemlokalen groep 1; 0-10.000 stemgerechtigden: 6
aantal tent stemlokalen groep 1; 0-10.000 stemgerechtigden: 0
aantal parkeerplaats stemlokalen groep 1; 0-10.000 stemgerechtigden: 0
aantal bus stemlokalen groep 1; 0-10.000 stemgerechtigden: 0


aantal mobiele stemlokalen groep 2; 10.000-30.000 stemgerechtigden: 35
aantal drive through stemlokalen groep 2; 10.000-30.000 stemgerechtigden: 9
aantal niet publiek open stemlokalen groep 2; 10.000-30.000 stemgerechtigden: 27
aantal tent stemlokalen groep 2; 10.000-30.000 stemgerechtigden: 14
aantal parkeerplaats stemlokalen groep 2; 10.000-30.000 stemgerechtigden: 20
aantal bus stemlokalen groep 2; 10.000-30.000 stemgerechtigden: 13


aantal mobiele stemlokalen groep 3; 30.000-60.000 stemgerechtigden: 45
aantal drive through stemlokalen groep 3; 30.000-60.000 stemgerechtigden: 11
aantal niet publiek open stemlokalen groep 3; 30.000-60.000 stemgerechtigden: 27
aantal tent stemlokalen groep 3; 30.000-60.000 stemgerechtigden: 10
aantal parkeerplaats stemlokalen groep 3; 30.000-60.000 stemgerechtigden: 8
aantal bus stemlokalen groep 3; 30.000-60.000 stemgerechtigden: 11


aantal mobiele stemlokalen groep 4; 60.000-100.000 stemgerechtigden: 14
aantal drive through stemlokalen groep 4; 60.000-100.000 stemgerechtigden: 8
aantal niet publiek open stemlokalen groep 4; 60.000-100.000 stemgerechtigden: 11
aantal tent stemlokalen groep 4; 60.000-100.000 stemgerechtigden: 20
aantal parkeerplaats stemlokalen groep 4; 60.000-100.000 stemgerechtigden: 16
aantal bus stemlokalen groep 4; 60.000-100.000 stemgerechtigden: 0


aantal mobiele stemlokalen groep 5; 100.000-350.000 stemgerechtigden: 17
aantal drive through stemlokalen groep 5; 100.000-350.000 stemgerechtigden: 10
aantal niet publiek open stemlokalen groep 5; 100.000-350.000 stemgerechtigden: 29
aantal tent stemlokalen groep 5; 100.000-350.000 stemgerechtigden: 24
aantal parkeerplaats stemlokalen groep 5; 100.000-350.000 stemgerechtigden: 12
aantal bus stemlokalen groep 5; 100.000-350.000 stemgerechtigden: 10


aantal mobiele stemlokalen groep 6; >350.000 stemgerechtigden: 0
aantal drive through stemlokalen groep 6; >350.000 stemgerechtigden: 0
aantal niet publiek open stemlokalen groep 6; >350.000 stemgerechtigden: 0
aantal tent stemlokalen groep 6; >350.000 stemgerechtigden: 12
aantal parkeerplaats stemlokalen groep 6; >350.000 stemgerechtigden: 2
aantal bus stemlokalen groep 6; >350.000 stemgerechtigden: 0


In [65]:
#print(list(gdf_wims_dedupe))

#print(list(df_stemger_clean))


#gdf_wims_dedupe.rename(columns = {'CBS gemeentecode': 'gemeentecode'}, inplace = True)
#wims_merged = pd.merge(gdf_wims_dedupe, df_stemger_clean, on=['gemeentecode'])
#wims_merged.rename(columns = {'binned': 'staffel'}, inplace = True)
#wims_merged.to_csv(path_or_buf='../data/export/openingstijden_alle_staffels.csv', sep=';', na_rep='', header=True, date_format = '%m-%d %H:%M')

#df_nearest.rename(columns = {'CBS gemeentecode': 'gemeentecode'}, inplace = True)
#df_merged = pd.merge(df_nearest, df_stemger_clean, on=['gemeentecode'])
#df_merged.rename(columns = {'binned': 'staffel'}, inplace = True)
#df_merged.to_csv(path_or_buf='../data/export/afstand_alle_staffels.csv', sep=';', na_rep='', header=True, date_format = '%m-%d %H:%M')
In [66]:
#de eerste vijf rijen zijn meta-data en kunnen we gerust weghalen voor nu 
#df_gr_gr = pd.read_csv(r'../data/stemmen/01_Groningen/#osv4-3_telling_gr2022_groningen.csv', skiprows=5, header=None, delimiter=';')
#print(df_gr_gr)
In [67]:
open = {
        'dagen': [],
        'aantal': [],
        'staffel': []
    }


def graph_open_2(df, label):
    
    open['dagen'].append("14 en 15 maart")
    open['aantal'].append(df[df['Openingstijden 16-03-2022 van'].isnull()].dropna(subset=['Openingstijden 15-03-2022 van'])['Openingstijden 14-03-2022 van'].count())
    open['staffel'].append(label)

    open['dagen'].append("14 en 16 maart")
    open['aantal'].append(df[df['Openingstijden 15-03-2022 van'].isnull()].dropna(subset=['Openingstijden 16-03-2022 van'])['Openingstijden 14-03-2022 van'].count())
    open['staffel'].append(label)

    open['dagen'].append("15 en 16 maart")
    open['aantal'].append(df[df['Openingstijden 14-03-2022 van'].isnull()].dropna(subset=['Openingstijden 15-03-2022 van'])['Openingstijden 16-03-2022 van'].count())
    open['staffel'].append(label)

    open['dagen'].append("Alle dagen")
    open['aantal'].append(df.dropna(subset=['Openingstijden 16-03-2022 van', 'Openingstijden 15-03-2022 van'])['Openingstijden 14-03-2022 van'].count())
    open['staffel'].append(label)

    open['dagen'].append("Alleen 14 maart")
    open['aantal'].append(df[df['Openingstijden 15-03-2022 van'].isnull()][df['Openingstijden 16-03-2022 van'].isnull()]['Openingstijden 14-03-2022 van'].count())
    open['staffel'].append(label)

    open['dagen'].append("Alleen 15 maart")
    open['aantal'].append(df[df['Openingstijden 14-03-2022 van'].isnull()][df['Openingstijden 16-03-2022 van'].isnull()]['Openingstijden 15-03-2022 van'].count())
    open['staffel'].append(label)

    open['dagen'].append("Alleen 16 maart")
    open['aantal'].append(df[df['Openingstijden 14-03-2022 van'].isnull()][df['Openingstijden 15-03-2022 van'].isnull()]['Openingstijden 16-03-2022 van'].count())
    open['staffel'].append(label)


def make_graph_open_2(label):
    df_stemger_label = df_stemger_clean[df_stemger_clean['binned'].str.fullmatch(label)]
    graph_open_2(filter_binned(gdf_wims_times, df_stemger_label), label)

for label in labels: 
    make_graph_open_2(label)

dagen = sorted(list(dict.fromkeys(open['dagen'])))

df_open_dagen = pd.DataFrame(open).pivot(index='dagen', columns=['staffel'], values=['aantal'])

#ax_open = pd.DataFrame(open).pivot(index='dagen', columns=['staffel'], values=['aantal']).plot(kind="bar", stacked=True, figsize=(13,13), fontsize=22)

#ax_open.set_xticklabels(dagen, fontsize=22, rotation=-45, ha="left", rotation_mode="anchor")

#for c in ax_open.containers:

    # Optional: if the segment is small or 0, customize the labels
    #labels_ax= [v.get_height() if v.get_height() > 0 else '' for v in c]
    
    # remove the labels parameter if it's not needed for customized labels
    #ax_open.bar_label(c, labels=labels_ax, label_type='center')

ax_open_log = pd.DataFrame(open).pivot(index='dagen', columns=['staffel'], values=['aantal']).plot(kind="bar", stacked=True, fontsize=22, figsize=(13,13), log=True)

ax_open_log.set_xticklabels(dagen, fontsize=22, rotation=-45, ha="left", rotation_mode="anchor")

for c in ax_open_log.containers:

    # Optional: if the segment is small or 0, customize the labels
    labels_ax = [v.get_height() for v in c]
    
    # remove the labels parameter if it's not needed for customized labels
    ax_open_log.bar_label(c, labels=labels_ax, label_type='center', padding = 0)

#pd.DataFrame(open).pivot(index='dagen', columns=['staffel'], values=['aantal']).plot(kind="bar", stacked=True, figsize=(13,13))
No description has been provided for this image
In [68]:
amount = {
        ' ': [],
        'aantal': [],
        'staffel': []
    }

def graph_count(df, label):
    amount[' '].append("Stemlokaal")
    amount['aantal'].append(df["UUID"].count())
    amount['staffel'].append(label)

def make_graph_count(label):
    df_stemger_label = df_stemger_clean[df_stemger_clean['binned'].str.fullmatch(label)]
    graph_count(filter_binned(gdf_wims_dedupe, df_stemger_label), label)

for label in labels: 
    make_graph_count(label)



ax_stemlok = pd.DataFrame(amount).pivot(index=' ', columns=['staffel'], values=['aantal']).plot(kind="bar", stacked=True, figsize=(13,13), fontsize=22)

ax_stemlok.set_xticklabels(['Stemlokalen'], fontsize=22, rotation=0, ha="center", rotation_mode="anchor")

for c in ax_stemlok.containers:

    # Optional: if the segment is small or 0, customize the labels
    labels_ax = [v.get_height() if v.get_height() > 0 else '' for v in c]
    
    # remove the labels parameter if it's not needed for customized labels
    ax_stemlok.bar_label(c, labels=labels_ax, label_type='center')
No description has been provided for this image
In [69]:
counts =   {'type': [],
                'aantal': [],
                'staffel': []}
def graph_type(df, label):
    
    counts['type'].append("Mobiel stemlokaal") 
    counts['aantal'].append(df[df["Naam stembureau"].str.contains("Mobiel")]["Naam stembureau"].count())
    counts['staffel'].append(label)
    counts['type'].append("Drive-through stemlokaal")
    counts['aantal'].append(df[df["Naam stembureau"].str.contains("Drive")]["Naam stembureau"].count())
    counts['staffel'].append(label)
    df_publiek = df.dropna(subset=['Extra adresaanduiding'])
    counts['type'].append("Niet open algemeen publiek")
    counts['aantal'].append(df_publiek[df_publiek["Extra adresaanduiding"].str.contains("Niet open voor algemeen publiek")]["Extra adresaanduiding"].count())
    counts['staffel'].append(label)
    counts['type'].append("Tent stemlokaal")
    counts['aantal'].append(df[df["Naam stembureau"].str.contains("tent")]["Naam stembureau"].count())
    counts['staffel'].append(label)
    counts['type'].append("Parkeerplaats stemlokaal")
    counts['aantal'].append(df[df["Naam stembureau"].str.contains("parkeer")]["Naam stembureau"].count())
    counts['staffel'].append(label)
    counts['type'].append("Bus stemlokaal")
    counts['aantal'].append(df[df["Naam stembureau"].str.contains("bus")]["Naam stembureau"].count())
    counts['staffel'].append(label)

def make_graph_type_2(label):
    df_stemger_label = df_stemger_clean[df_stemger_clean['binned'].str.fullmatch(label)]
    graph_type(filter_binned(gdf_wims_dedupe, df_stemger_label), label)

for label in labels: 
    make_graph_type_2(label)

types = ['Bus stemlokaal', 'Drive through stemlokaal', 'Mobiel stemlokaal', 'Niet open voor algemeen publiek', 'Parkeerplaats stemlokaal', 'Tent stemlokaal']

ax = pd.DataFrame(counts).pivot(index='type', columns=['staffel'], values=['aantal']).plot(kind="bar", stacked=True, figsize=(13,13), fontsize=22)

ax.set_xticklabels(types, fontsize=22, rotation=-45, ha="left", rotation_mode="anchor")

for c in ax.containers:

    # Optional: if the segment is small or 0, customize the labels
    labels_ax = [v.get_height() if v.get_height() > 0 else '' for v in c]
    
    # remove the labels parameter if it's not needed for customized labels
    ax.bar_label(c, labels=labels_ax, label_type='center')
No description has been provided for this image
In [72]:
gdf_wims_dedupe
Out[72]:
Unnamed: 0 _id Gemeente CBS gemeentecode Nummer stembureau Naam stembureau Gebruiksdoel van het gebouw Website locatie Wijknaam CBS wijknummer ... Gehandicaptentoilet Kieskring ID Hoofdstembureau Tellocatie Contactgegevens gemeente Verkiezingswebsite gemeente Verkiezingen ID UUID geometry
0 0 1 Valkenswaard GM0858 1 Zorgcentrum Kempenhof gezondheidszorgfunctie https://www.valkenhof.nl/ NaN NaN ... ja Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 3a612b2151fa4ab491b9e331355e6258 POINT (5.45515 51.34711)
1 1 2 Valkenswaard GM0858 2 Buurtgebouw De Horizon bijeenkomstfunctie NaN NaN NaN ... NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 9a01d765af0a467ea37f08d92db114ba POINT (5.45137 51.34955)
2 2 3 Valkenswaard GM0858 3 Speeltuin Geenhoven bijeenkomstfunctie NaN NaN NaN ... NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 fc5869d33fbc4b06be659149fa615f4c POINT (5.44827 51.35702)
3 3 4 Valkenswaard GM0858 4 Ontmoetingscentrum De zoete inval bijeenkomstfunctie NaN NaN NaN ... NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 4427cc0b39e040ba8f75c333f19d66f0 POINT (5.44871 51.36022)
4 4 5 Valkenswaard GM0858 5 Gymnastiekzaal 't Gegraaf sportfunctie NaN NaN NaN ... NaN Valkenswaard Valkenswaard NaN verkiezingen@valkenswaard.nl http://www.valkenswaard.nl/verkiezingen NaN NLODSGM0858stembureaus20220316009 a893bb9add324ce29769f1c39afcc48d POINT (5.45331 51.36514)
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
9270 9270 38745 Gennep GM0907 4 Het Hökske bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 f744546cd6894e5e9a4db4bbfd81b4ee POINT (5.98266 51.69726)
9271 9271 38746 Gennep GM0907 5 Buurthuis VanOns bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 1270081b1dc74cd7bea0f45973650408 POINT (5.98127 51.69000)
9272 9272 38747 Gennep GM0907 6 't Trefpunt bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 447c7742604345139e41def4cf1e4d3c POINT (5.95118 51.72591)
9273 9273 38748 Gennep GM0907 8 De Uitkomst bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep ja Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 049cfd258c174bc49abf17883396d083 POINT (6.01556 51.70976)
9274 9274 38749 Gennep GM0907 1 Zaal Buurman woonfunctie,bijeenkomstfunctie NaN NaN NaN ... NaN Gennep Gennep NaN Klantcontactcentrum gemeente Gennep gemeente@g... https://www.gennep.nl NaN NLODSGM0907stembureaus20220316009 1e8cbe96e72c4c6ba6303f47bec8cdb5 POINT (5.98514 51.70189)

8582 rows × 41 columns

In [74]:
df_stemger_clean.rename(columns = {'gemeentecode': 'CBS gemeentecode'}, inplace =True)
In [76]:
gdf_wims_dedupe.merge(df_stemger_clean, on='CBS gemeentecode').to_csv(path_or_buf='../data/export/full_export.csv'.format(label), sep=';', na_rep='', header=True, date_format = '%m-%d %H:%M')
In [ ]:
 

De data is heel gecompliceerd, dus we moeten het bruikbaar maken in pandas. Met hoe de data eruit ziet in een CSV in libre office willen we een constructie maken van de verschillende onderdelen. We hebben de data van de stemlokalen apart al, die kunnen we dus negeren. We willen de data van de lijsten apart hebben.

In [70]:
#TODO:mobiele stemlokalen eruit filteren die NIET 0,0 zijn
#TODO:datastandaard duitse verkiezingen stemlokaalafstand opzoeken
</html>