Statbel, het Belgische statistiekbureau, publiceert regelmatig de Belgische woningprijzen op basis van de verkoopakten die werden geregistreerd door de FOD Financiën.
In deze oefening werken we met een gegevensbestand dat de mediaan bevat voor verkochte woningen per Vlaamse gemeente in de jaren 2010 tot en met 2019, gedownload via Statbel.
Hieronder zie je een schermafdruk van de eerste lijnen van het bestand.
Elke rij in het databestand bevat 6 kolommen:
Notatie getallen: alle getallen zijn gehele getallen. Het scheidingsteken voor de duizendtallen is de komma. Als een gegeven ontbreekt, dan mag je veronderstellen dat er in dat jaar geen huizen van dat type in die gemeente verkocht zijn.
Encoding
Het databestand is een csv-bestand bewaard vanuit MS-Excel. Bij het openen in Python moet je specifiëren dat de encoding 'utf-8-sig' is.
f = open('NL_immo_vlaanderen.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 het bestand downloaden en bewaren in dezelfde map als je .py of .ipynb bestand.
Je kan het bestand hier downloaden: NL_immo_vlaanderen.csv1
inlezen
Schrijf een functie inlezen zonder argumenten.
De functie leest het bestand 'NL_immo_vlaanderen.csv' in en retourneert een geneste dictionary met drie niveaus.
De sleutels in de hoofddictionary zijn de namen van de gemeenten.
Voor elke gemeente bestaat de waarde opnieuw uit een geneste dictionary waarvan de sleutels de jaartallen zijn (int).
Voor elk jaartal is de waarde opnieuw een dictionary, met vier elementen. De sleutels zijn de strings "alle", "gesloten", "open" en "appartementen". De waarden zijn de overeenkomstige verkoopprijzen (type int). Als er geen transactie was van dat type, dan komt hier het getal -1.
>>> inlezen() {'AARTSELAAR': {2010: {'alle': 252500, 'gesloten': 248500, 'open': 330000, 'appartementen': 160000}, 2011: {'alle': 295000, 'gesloten': 267500, 'open': 400500, 'appartementen': 159250}, 2012: {'alle': 270000, 'gesloten': 262500, 'open': 418000, 'appartementen': 165000}, 2013: {'alle': 273000, 'gesloten': 264500, 'open': 400000, 'appartementen': 175000}, 2014: {'alle': 280000, 'gesloten': 262500, 'open': 455000, 'appartementen': 179500}, 2015: {'alle': 280000, 'gesloten': 272000, 'open': 400000, 'appartementen': 192250}, 2016: {'alle': 300000, 'gesloten': 270000, 'open': 447000, 'appartementen': 176000}, 2017: {'alle': 307250, 'gesloten': 284500, 'open': 442500, 'appartementen': 187000}, 2018: {'alle': 312500, 'gesloten': 295000, 'open': 448500, 'appartementen': 184000}, 2019: {'alle': 330000, 'gesloten': 310000, 'open': 462500, 'appartementen': 185000}}, ... 'VOEREN': {2010: {'alle': 170000, 'gesloten': -1, 'open': -1, 'appartementen': -1}, 2011: {'alle': 194500, 'gesloten': -1, 'open': -1, 'appartementen': -1}, 2012: {'alle': 160000, 'gesloten': -1, 'open': -1, 'appartementen': -1}, 2013: {'alle': 200000, 'gesloten': -1, 'open': -1, 'appartementen': -1}, 2014: {'alle': 180000, 'gesloten': -1, 'open': -1, 'appartementen': -1}, 2015: {'alle': 200000, 'gesloten': 130000, 'open': -1, 'appartementen': -1}, 2016: {'alle': 197500, 'gesloten': -1, 'open': -1, 'appartementen': -1}, 2017: {'alle': 205490, 'gesloten': 195979, 'open': 248000, 'appartementen': -1}, 2018: {'alle': 255000, 'gesloten': 169000, 'open': 290000, 'appartementen': -1}, 2019: {'alle': 199975, 'gesloten': 185000, 'open': 245000, 'appartementen': -1}}}
goedkoopste_gemeenten
Schrijf een functie goedkoopste_gemeenten met twee argumenten: jaartal (int) en type bebouwing (string): "alle", "gesloten", "open" of "appartementen".
De functie gaat op zoek naar de gemeente met de laagste mediane verkoopprijs voor dat type bebouwing in dat jaar. Aangezien het hier over cijfers gaat die afgerond zijn, is het goed denkbaar dat twee gemeenten dezelfde laagste prijs hebben.
De functie retourneert een alfabetisch gesorteerde lijst van alle gemeente die de laagste verkoopprijs hebben.
Als het jaartal of het type bebouwing niet voorkomt, retourneert de functie een lege lijst.
>>> goedkoopste_gemeenten(2010, 'appartementen') ['RONSE'] >>> goedkoopste_gemeenten(2015, 'alle') ['KLUISBERGEN', 'MENEN'] >>> goedkoopste_gemeenten(2010, 'Appartementen') [] >>> goedkoopste_gemeenten(2020, 'appartementen') []