Voor deze oefening maken we gebruik van een dataset met statistieken van de spelers die deelnamen aan de kwalificatiewedstrijden voor het wereldkampioenschap voetbal in Qatar in 2022.
Voor elk land dat deelnam aan de kwalificatie, beschikken we over een bestand met alle spelers die minstens één keer opgeroepen werden voor een kwalificatiewedsstrijd.
De bestanden werden gedownload vanop Kaggle via deze link: https://www.kaggle.com/datasets/mateusdesousamartins/world-cup-2022-national-teams-data-set?resource=download1
Als voorbeeld zie je hieronder de eerste regels van het bestand "2022 Belgium.csv".
Elke speler staat op een afzonderlijke rij en voor elke speler zijn er 24 kolommen (inclusief eerste kolom met een volgnummer). Voor deze oefening zijn we enkel geïnteresseerd in deze kolommen:
Voor elk land X beschik je over een databestand 2022 X.csv waarin X de naam van het land (in het Engels) voorstelt.
De bestanden zijn geëncodeerd via utf-8 encoding. Je kan ze openen via volgende instructie:
f = open('2022 X.csv', 'r', encoding='utf-8')
De bestanden zijn beschikbaar in het working directory van Dodona. Als je de oefening echter lokaal wilt maken (in PyCharm of in een Jupyter Notebook), dan moet je de bestanden downloaden en bewaren in dezelfde map als je .py of .ipynb bestand.
Je kan de bestanden van 8 landen hier downloaden:
inlezen
Schrijf een functie inlezen met één argument: de naam van een land (string)
De functie leest het bestand van het juiste land in, dat de naam "2022 X.csv" heeft, waarin X vervangen wordt door de naam van het land. Je mag ervan uit gaan dat de naam van het land correct gespeld is zoals in de bestandsnaam.
De functie retourneert een geneste dictionary waarin de sleutels de namen van de spelers zijn (string), de waarde is voor elke speler opnieuw een dictionary met twee elementen: "leeftijd" en "minuten" met als waarden respectievelijk de leeftijd (kolom Age) van de speler en het aantal speelminuten (kolom Min_Playing_Time). Beide waarden worden omgezet naar een integer. Als de leeftijd van de speler niet gekend is, dan wordt deze speler niet opgenomen in de dictionary. Indien de speler niet gespeeld heeft (Min_Playing_Time = "NA"), dan wordt de waarde 0 ingevuld voor minuten.
>>> inlezen("Belgium") {'Jason Denayer': {'leeftijd': 26, 'minuten': 540}, 'Toby Alderweireld': {'leeftijd': 32, 'minuten': 532}, 'Thibaut Courtois': {'leeftijd': 29, 'minuten': 450}, 'Hans Vanaken': {'leeftijd': 29, 'minuten': 440}, 'Jan Vertonghen': {'leeftijd': 34, 'minuten': 429}, 'Timothy Castagne': {'leeftijd': 26, 'minuten': 426}, 'Youri Tielemans': {'leeftijd': 24, 'minuten': 370}, 'Axel Witsel': {'leeftijd': 33, 'minuten': 360}, 'Kevin De Bruyne': {'leeftijd': 30, 'minuten': 352}, 'Romelu Lukaku': {'leeftijd': 28, 'minuten': 333}, 'Thomas Meunier': {'leeftijd': 30, 'minuten': 325}, 'Dedryck Boyata': {'leeftijd': 31, 'minuten': 315}, 'Leandro Trossard': {'leeftijd': 27, 'minuten': 299}, 'Thorgan Hazard': {'leeftijd': 28, 'minuten': 291}, 'Eden Hazard': {'leeftijd': 31, 'minuten': 237}, 'Yannick Carrasco': {'leeftijd': 28, 'minuten': 208}, 'Leander Dendoncker': {'leeftijd': 26, 'minuten': 264}, 'Alexis Saelemaekers': {'leeftijd': 22, 'minuten': 243}, 'Koen Casteels': {'leeftijd': 29, 'minuten': 180}, 'Dries Mertens': {'leeftijd': 34, 'minuten': 164}, 'Dennis Praet': {'leeftijd': 27, 'minuten': 160}, 'Michy Batshuayi': {'leeftijd': 28, 'minuten': 156}, 'Christian Benteke': {'leeftijd': 31, 'minuten': 141}, 'Dodi Lukebakio': {'leeftijd': 24, 'minuten': 93}, 'Simon Mignolet': {'leeftijd': 33, 'minuten': 90}, 'Arthur Theate': {'leeftijd': 21, 'minuten': 84}, 'Jeremy Doku': {'leeftijd': 19, 'minuten': 76}, 'Charles De Ketelaere': {'leeftijd': 20, 'minuten': 66}, 'Divock Origi': {'leeftijd': 26, 'minuten': 66}, 'Nacer Chadli': {'leeftijd': 32, 'minuten': 55}, 'Thomas Vermaelen': {'leeftijd': 36, 'minuten': 45}, 'Thomas Foket': {'leeftijd': 27, 'minuten': 67}, 'Dante Vanzeir': {'leeftijd': 23, 'minuten': 32}, 'Albert Sambi Lokonga': {'leeftijd': 22, 'minuten': 17}, 'Adnan Januzaj': {'leeftijd': 26, 'minuten': 14}, 'Wout Faes': {'leeftijd': 23, 'minuten': 0}, 'Thomas Kaminski': {'leeftijd': 29, 'minuten': 0}, 'Brandon Mechele': {'leeftijd': 29, 'minuten': 0}, 'Matz Sels': {'leeftijd': 29, 'minuten': 0}, 'Zinho Vanheusden': {'leeftijd': 22, 'minuten': 0}, 'Yari Verschaeren': {'leeftijd': 20, 'minuten': 0}}
gemiddelde_leeftijd
Schrijf een functie gemiddelde_leeftijd met één argument: de naam van een land (string)
De functie haalt de gegevens op van het land met behulp van de functie inlezen en berekent de gemiddelde leeftijd van de spelers op het veld tijdens de kwalificatiewedstrijden.
Dit gewogen gemiddelde wordt als volgt berekend: sommeer voor alle spelers het product van de leeftijd met zijn speelminuten en deel dit door het totaal aantal speelminuten van alle spelers samen.
De functie retourneert een float.
>>> gemiddelde_leeftijd("Belgium") 28.56830808080808 >>> gemiddelde_leeftijd("France") 27.37741116751269
jongste
Schrijf een functie jongste met één argument: een lijst met een onbepaald aantal landen (strings)
De functie bepaalt welk land de laagste gemiddelde leeftijd heeft en retourneert een string van de vorm: "x heeft de jongste spelerskern met een gemiddelde leeftijd van y", waarbij x staat voor het land en y voor de gemiddelde leeftijd die wordt afgerond op twee cijfers na de komma.
>>> jongste(["Belgium", "Argentina", "Croatia", "Ghana", "France"]) 'Ghana heeft de jongste spelerskern met een gemiddelde leeftijd van 26.32' >>> jongste(['Argentina', 'France']) 'France heeft de jongste spelerskern met een gemiddelde leeftijd van 27.38'