Voor deze oefening vertrekken we van bestanden gedownload via StatBel (statbel.fgov.be). De bestanden geven een overzicht van de voornamen van kinderen geboren in 2018.

csv bestanden

We beschikken over een csv-bestand afzonderlijk voor jongens en meisjes en per regio in België (Vlaanderen, Wallonië en Brussel). Elk csv-bestand heeft twee kolommen: de naam en en het aantal keer dat deze naam is gegeven in 2018. Enkel de namen die minstens 5 keer gegeven zijn, werden opgenomen.

De namen staan in volgorde: meest populaire bovenaan. Als verschillende namen een gelijk aantal keer zijn gebruikt, dan staan ze alfabetisch.

Hieronder zie je de schermafdruk van de eerste 20 regels van het bestand met jongensnamen in Vlaanderen.

schermafdruk csv
vlaanderen_jongens.csv
De 20 meest voorkomenden namen voor jongens in 2018.

Databestanden

Encoding

De databestanden zijn csv-bestanden bewaard vanuit MS-Excel. Bij het openen in Python moet je specifiëren dat de encoding 'utf-8-sig' is.

Voorbeeld

f = open('vlaanderen_jongens.csv', 'r', encoding='utf-8-sig')
            

Programma debuggen

Je kan voor deze oefening de Python Tutor (na indienen op Dodona) niet gebruiken aangezien deze geen toegang heeft tot de bestanden. Als je de oefening wil debuggen, zal je deze lokaal moeten maken in PyCharm of in een Jupyter Notebook. Je moet dan de bestanden downloaden en bewaren in dezelfde map als je .py of .ipynb bestand.

Je kan de bestanden hier downloaden:
vlaanderen_jongens.csv1
vlaanderen_meisjes.csv2
wallonie_jongens.csv3
wallonie_meisjes.csv4

Opgave

  1. inlezen

    Schrijf een functie inlezen met twee argumenten: geslacht (een string, 'jongens' of 'meisjes') en een regio (een string, 'vlaanderen', 'wallonie' of 'brussel').

    De functie leest het bestand in met de naam 'regio_geslacht.csv', dus bijvoorbeeld voor meisjes in Vlaanderen, wordt dit 'vlaanderen_meisjes.csv'.

    De functie retourneert een list van tuples waarvan telkens het eerste element de naam is (een string) en het tweede element het aantal voorkomens (een int). De elementen staan in volgorde van voorkomens, meest voorkomende eerst. Namen die even vaak voorkomen, worden alfabetisch gezet. Dit is tevens de volgorde waarin ze in het bestand opgenomen zijn.

    Voorbeeld
    >>> inlezen('meisjes', 'vlaanderen')
    [('Mila', 332), ('Olivia', 325), ('Marie', 319), ('Emma', 305), 
    ('Ella', 301), ('Louise', 292), ('Amélie', 279), ('Noor', 227), ...
    ... ,
    ('Youssra', 5), ('Zoya', 5)]
    
          
  2. positie

    Schrijf een functie positie met drie strings als argumenten: naam, geslacht ('jongens' of 'meisjes') en een regio ('vlaanderen', 'wallonie' of 'brussel').

    De functie retourneert een geheel getal: de positie van de opgegeven naam in de regio. Voor jongens in Vlaanderen, staat "Arthur" op de eerste postitie, "Noah" op de tweede enz.

    Als de naam niet voorkomt, komt als positie het getal 0.

    Voorbeelden
    >>> positie('Arthur', 'jongens', 'vlaanderen')
    1
    >>> positie('Len', 'jongens', 'vlaanderen')
    211
    >>> positie('Els', 'jongens', 'vlaanderen')
    0
          
  3. uniseks

    Schrijf een functie uniseks met één argument: een regio ('vlaanderen', 'wallonie' of 'brussel').

    De functie retourneert een geneste dictionary waarvan de sleutels de namen zijn die zowel voorkomen in de lijst met jongensnamen als meisjesnamen van die regio. De waarden van de hoofddictionary zijn telkens opnieuw een dictionary met twee elementen: 'meisjes' en 'jongens' met als waarden het aantal keer dat de naam gebruikt is als meisjesnaam, respectievelijk jongensnaam.

    Voorbeeld
    >>> uniseks('wallonie')
    {'Andréa': {'jongens': 11, 'meisjes': 6},
     'Camille': {'jongens': 16, 'meisjes': 175},
     'Charlie': {'jongens': 54, 'meisjes': 39},
     'Eden': {'jongens': 149, 'meisjes': 5},
     'Elie': {'jongens': 14, 'meisjes': 7},
     'Lou': {'jongens': 9, 'meisjes': 77},
     'Maé': {'jongens': 15, 'meisjes': 6},
     'Noa': {'jongens': 57, 'meisjes': 5},
     'Sam': {'jongens': 35, 'meisjes': 5},
     'Sasha': {'jongens': 45, 'meisjes': 18}}
          
  4. toptien

    Schrijf een functie toptien met twee argumenten: een geslacht (string, 'jongens' of 'meisjes'), en een lijst van regio's (een lijst met strings: 'vlaanderen', 'wallonie' of 'brussel').

    De functie geeft de 10 meest voorkomende namen in alle opgegeven regio's samen. Voor elke naam wordt dus opgeteld hoe vaak die voorkwam in de verschillende regio's samen. Vervolgens worden de 10 meest voorkomende namen in volgorde van aantal voorkomens gezocht. Als namen een gelijk aantal keer voorkomen, dan staan ze in alfabetische volgorde in de toptien.

    Voorbeelden
    >>> toptien('meisjes', ['wallonie', 'vlaanderen'])
    ['Emma', 'Olivia', 'Louise', 'Mila', 'Alice', 'Juliette', 'Marie', 'Ella', 'Elena', 'Camille']
    >>> toptien('jongens', ['vlaanderen'])
    ['Arthur', 'Noah', 'Lucas', 'Liam', 'Leon', 'Jules', 'Finn', 'Louis', 'Victor', 'Lewis']
          

 

Bron: StatBel, https://statbel.fgov.be/nl/themas/bevolking/namen-en-voornamen