In een Geautomatiseerd gegevens downloaden heb je geleerd hoe je met requests data kunt ophalen van een URL. In deze tutorial ga je een stapje verder en ga je aan de slag met die data. Je leert werken met het pakket pandas, een veelgebruikte tool voor data-analyse in Python.
Wat is pandas?
pandas is een open-source pakket om data-analyses uit te voeren en data te bewerken. De basis is de zogenaamde DataFrame. Dit is een tabel met rijen en kolommen, vergelijkbaar met een spreadsheet:
Een kolom in pandas is van het gegevenstype Series. De donkergrijze rij bevat de kolomnamen en de donkergrijze eerste kolom bevat de index (rijnummers of namen).
Waarom pandas?
Als je te maken hebt met grote hoeveelheden data in de vorm van CSV-bestanden, Excel-sheets, databases en meer is het prettig om deze data snel en efficiënt te kunnen analyseren en bewerken. Dit is waar pandas goed in is. Met pandas kun je:
Data importeren/exporteren in veel verschillende formaten (CSV, Excel, SQL, etc.)
Data opschonen (Missende waarden vervangen, kolommen hernoemen, rijen verwijderen, etc.)
Data analyseren (groeperen, samenvatten, statistieken berekenen, etc.)
Het grote voordeel van pandas ten opzichte van bijvoorbeeld Excel, is dat het eenvoudiger is om het werken met gegevens te automatiseren. Heb je een Excelbestand waar je eenmalig iets uit nodig hebt, maak dan vooral een draaitabel.
Maar krijg je elke week hetzelfde Excelbestand met nieuwe gegevens, en ben je elke keer die draaitabel opnieuw aan het maken, dan is pandas een uitkomst. Daar komt bij dat het goed in te passen is in een volledig (Python)programma: inlezen van gegevens, opschonen, analyses maken, een rapport maken en dit e-mailen. En dat allemaal automatisch!
In dat project download je data van het KNMI. Dit komt in een txt-bestand. Nadat je het tekstbestand hebt opgeslagen, schoon je het op en sla je het op als CSV-bestand, zodat er eenvoudiger mee is te werken. De data zijn maand- en jaargemiddelde temperaturen van het meetstation De Bilt.
In dit vervolgproject laad je KNMI-gegevens die je in een CSV hebt opgeslagen in met pandas in om er vervolgens een eenvoudige analyses op los te laten. Je kunt verdergaan in het eerdere KNMI-project. Activeer de virtual environment en installeer pandas:
shell
cdprojects/knmi
source.venv/bin/activate# .venv\Scripts\activate.bat voor Windows
python-mpipinstallpandas
python-mpipfreeze>requirements.txt
Aan de slag met pandas
Zodra pandas geïnstalleerd is, kun je het importeren. Het is gebruikelijk om pandas te importeren onder de alias pd. Voeg vervolgens een functie load_data toe aan het project. Dit kan in main.py, maar omdat het project wat uitgebreider wordt kun je het ook in een apart bestand plaatsen. Bijvoorbeeld in data.py. Onder de code lees je de toelichting.
data.py
# ...importpandasaspd# ...CSV="knmi.csv"KNMI_COLUMNS={"STN":"Station","JAN":"Januari",# ... etc"DEC":"December","YYYY":"Jaar","YEAR":"Jaargemiddelde",}MONTH_COLUMNS=[]forkey,valueinKNMI_COLUMNS.items():ifkeynotin["STN","YYYY","YEAR"]:MONTH_COLUMNS.append(value)defload_data():"""Laad de gegevens uit het CSV-bestand in een pandas DataFrame en maak enkele aanpassingen."""# Maak een DataFrame van het CSV-bestanddf=pd.read_csv(CSV,delimiter=",")# Hernoem de kolommendf.rename(columns=KNMI_COLUMNS,inplace=True)# Van 0.1 °C naar 1°Ccolumns=MONTH_COLUMNS+["Jaargemiddelde"]updated_columns=df[columns].map(lambdax:x/10,na_action="ignore")df[columns]=updated_columns# Toon de eerste 5 rijen voor een snelle inspectieprint(df.head(),"\n")returndf
In deze functie laad je de gegevens uit de eerder gemaakte CSV in, hernoem je de kolommen en wijzig je de getallen van 0.1 °C naar 1°C (dus 80.5 wordt 8.5). Tot slot gebruik je df.head() om de DataFrame snel te inspecteren.
CSV inlezen
Met pandas kun je eenvoudig gegevens inlezen uit verschillende soorten bestanden, zoals CSV, Excel, JSON, etc. Voor elk bestandsformaat is er de methode read_*. Dus om het CSV-bestand in te lezen gebruik je pd.read_csv(). Je geeft altijd het pad naar het bestand op (in dit geval opgeslagen in de constante CSV) en optioneel andere argumenten. Omdat de KNMI-gegevens zijn opgeslagen in een CSV waarbij de waarden worden gescheiden door een komma, gebruik je delimiter=",". De gegevens worden ingelezen en opgeslagen in de variabele df, die van het type DataFrame is.
De kolomnamen bestaan uit Engelse afkortingen, het is mooier voor het resultaat om te werken met de volledige Nederlandse namen. Gebruik df.rename() om dit te doen. Met het argument columns geef je aan welke kolommen je wilt wijzigen. Je geeft een dict mee met de oude en nieuwe namen als key-value pairs. Met inplace=true geef je aan dat df gewijzigd wordt, in plaats van dat er een nieuwe DataFrame wordt teruggegeven.
Van 0.1 °C naar 1°C
De gegevens in het oorspronkelijke formaat zijn in tienden van graden. Dus een gemiddelde temperatuur van 8 graden, staat genoteerd als 80. Omdat we meer gewend zijn in graden te denken, pas je dit aan. Hiervoor maak je eerst een lijst met alle maandnamen, plus de kolom "Jaargemiddelde". Vervolgens wijzig je alle gegevens in die kolommen. Hiervoor gebruik je de volgende code:
De syntax om een kolom te selecteren is df["kolomnaam"] voor een enkele kolom, of df[["kolomnaam1", "kolomnaam2"]] voor meerdere kolommen. Met df[columns] selecteer je dus alle kolommen met meetgegevens. Vervolgens pas je de methode .map() toe. Deze methode ontvangt een functie als argument die wordt toegepast op elke cel in de kolommen.
Omdat je alle getallen wilt delen door 10, gebruik je map(lambda x: x / 10). Dit ziet er ingewikkeld uit, maar is hetzelfde als:
lambda x: x / 10 is een zogenaamde lambda-functie, ofwel een korte functie zonder het eerst te hoeven definiëren.
Met na_action="ignore" geef je aan dat als een cel geen waarde bevat, de functie wordt overgeslagen (anders krijg je fouten).
Je hebt nu een variabele updated_columns met alle aangepaste kolommen. De laatste stap is om de oude kolommen in df te vervangen door de nieuwe kolommen:
df[columns]=updated_columns
Inspecteren
Tot slot print je de eerste vijf rijen van de DataFrame met df.head(). Dit is handig om snel te kijken hoe je data eruit ziet. Het resultaat ziet er ongeveer zo uit:
Een analyse uitvoeren
Je hebt gezien dat je met pandas data kunt inladen en transformeren. Je kunt nu een (eenvoudige) analyse maken, bijvoorbeeld het ophalen van de hoogste jaargemiddelde temperatuur:
data.py
defget_highest_mean_temp(df):""" Haal de hoogste jaargemiddelde temperatuur op. """# Haal de hoogste jaargemiddelde temperatuur ophighest_mean_temp=df["Jaargemiddelde"].max()# Temperatuur in °Cindex=df["Jaargemiddelde"].idxmax()# Index van de rij met de hoogste temperatuuryear=df.at[index,"Jaar"]# Jaar van de hoogste temperatuurprint(f"Hoogste jaargemiddelde: {highest_mean_temp}°C")print(f"Dit was in jaar: {year}")returnhighest_mean_temp,year
Eerst selecteer je de juiste kolom met df["Jaargemiddelde"]. Vervolgens haal je hier het hoogste getal uit op met .max(). Omdat je ook het bijbehorende jaar wilt weten, doe je hetzelfde nog een keer, maar nu met .idmax(). Dit haalt de index op van de rij met het hoogste getal.
Je kunt nu het jaar ophalen met df.at[], waarbij je de zojuist opgehaalde index als eerste waarde opgeeft, en de kolomnaam "Jaar" als tweede waarde. Zo selecteer je de cel uit de rij met de hoogste temperatuur de kolom "Jaar".
Conclusie
pandas is een krachtige tool voor data-analyse in Python. Het biedt veel mogelijkheden waarmee je data kunt importeren, exporteren, opschonen en analyseren. In deze tutorial heb je het topje van de ijsberg gezien van wat mogelijk is. Werk je veel met spreadsheet-achtige gegevens (zoals CSV of Excel), dan is pandas alleen al handig voor het opschonen en transformeren van deze gegevens.
Over de auteur
Erwin Matijsen
Erwin is de oprichter van python-cursus.nl. In allerlei rollen heeft hij Python ingezet, van het eenvoudiger maken van zijn werk tot het opleveren van complete (web)applicaties. Met vrouw en kinderen woont hij in Havelte (Drenthe), midden in de prachtige natuur. Daar wandelt hij graag, zeker ook omdat de beste ingevingen tijdens een wandeling - weg van de computer - lijken te komen.
Training volgen?
Heb je behoefte aan een in-person training voor jezelf of je team?
Dat kan! Laat je gegevens achter en dan nemen we zo snel mogelijk contact met je op de mogelijkheden te bespreken.
Vragen, opmerkingen?
Heb je vragen, opmerkingen, suggesties of tips naar aanleiding van deze blog?
Neem dan contact met ons op, of laat het weten via
Mastodon of
LinkedIN.