Oefenopgaven
Contents
2.6. Oefenopgaven#
2.6.1. Pandas#
Opdracht: Een inventaris van veren
Een fabrikant heeft verschillende veren in voorraad, elk met een eigen veerconstante, maximale uitrekking en prijs:
Serienummer |
Veerconstante (N/mm) |
Max. Uitrekking (mm) |
Prijs (euro) |
|---|---|---|---|
T1590 |
0.29 |
251.00 |
3.30 |
T1350 |
25.40 |
4.88 |
2.88 |
T1620 |
12.80 |
14.70 |
5.37 |
T940 |
0.41 |
61.9 |
2.66 |
Voer voor deze gegevens de volgende opdrachten uit:
Zet deze veren in een
pandasDataFrameGebruik het dataframe om een staafgrafiek te maken met de serienummers op de x-as en de prijs op de y-as
Gebruik het dataframe om een spreidingsdiagram (scatterplot) te maken met de prijs op de x-as en de veerconstante op de y-as
Plotten met pandas
Bij de plot functies van een DataFrame geef je als eerste argument de titel van de kolom met de x-as data op en als tweede argument de titel van de kolom met de data die op de y-as moeten komen
Met
data.plot.barkonden we een staafgrafiek maken. Voor een ander type grafiek kan je kijken in de documentatie
2.6.2. Data Filteren#
Opdracht: De inventaris filteren
We werken verder met het DataFrame met gegevens van veren dat we hiervoor aangemaakt hebben.
Voer hiermee de volgende opdrachten uit:
maak een overzicht van alle veren met een prijs onder de 3 euro
maak een overzicht van alle veren met een veerconstante hoger dan 1 N/mm
2.6.3. Kolommen#
Opdracht: Veerenergie
Opnieuw werken we verder met het DataFrame met gegevens van veren dat we hiervoor aangemaakt hebben.
Nu zijn wij benieuwd hoeveel veerenergie er maximaal in elk van deze veren opgeslagen kan worden. Dit kan berekend worden vanuit de veergegevens als volgt:
waar \(C\) de veerconstante in Newton per meter is en \(u_\text{max}\) de maximale uitrekking in meter.
Voer hiermee de volgende opdrachten uit:
maak een nieuwe kolom aan genaamd
Veerenergie (J). De waarden in deze kolom zouden gelijk moeten zijn aan de maximale veerenergie, berekend volgens de bovenstaande formulegeef dit resultaat weer in een grafiek met op de x-as de prijs per veer en op de y-as de maximale veerenergie
2.6.4. Data inlezen#
Opdracht: Man/Vrouw verhouding in Studentensteden
Uit de bevolkingsgegevens die we als voorbeeld gebruiken kunnen we ook halen hoeveel mannen en vrouwen er in elk van de studentensteden wonen.
Laad de bevolkingsgegevens in en voer de volgende opdrachten uit:
Voeg naar eigen inzicht studentensteden toe aan de lijst in het voorbeeld,
Maak een nieuwe kolom aan met daarin de verhouding vrouw/man,
Maak een staafgrafiek met daarin per stad de vrouw/man verhouding.
2.6.5. Data filteren en plotten#
Download het onderstaande bestand, en sla het op in de data-submap van de map waar je in aan het werk bent.
Opdracht: Filter de pieken eruit
Schrijf een functie om de pieken (die waarschijnlijk uit een meetfout volgen) uit de data weg te filteren. Hiervoor kan je met een for-loop door de gegevens heen lopen en het gemiddelde van de buren nemen als je een piek detecteert.
Voorbeeldoplossing
import pandas as pd
import numpy as np
data = pd.read_excel('data/simple_xls.xls')
tijd = data['Tijd']
afstand = data['Afstand']
grenswaarde = 0.5
for i in range(2, len(afstand) - 1):
# We beginnen met aan te nemen dat er links en rechts geen fout is.
# Dan hoeven we niet bij elke 'if' ook een 'else' regel te zetten.
fout_links, fout_rechts = False, False
if abs(afstand[i] - afstand[i - 1]) > grenswaarde:
fout_links = True
if abs(afstand[i] - afstand[i + 1]) > grenswaarde:
fout_rechts = True
if fout_links and fout_rechts:
afstand[i] = (afstand[i - 1] + afstand[i + 1]) / 2
nieuwe_data = pd.DataFrame({'Tijd': tijd, 'Afstand': afstand})
Opdracht: Fit de data
Pas de waarden in y_schatting aan zodat de schatting goed overeen komt met de ingelezen data. Waarschijnlijk moet je dit een paar keer proberen voordat de gegevens helemaal overeen komen.
Data fitten
Wat we hier handmatig doen is iets wat in onderzoek veel gebeurt: het fitten van data. Wanneer je een meetgegevens en een model hebt kan je de modelparameters bepalen door deze gericht te varieren tot het model en de gegevens overeen komen.
Gelukkig zijn hier ook verschillende algorithmes voor geschreven om dit automatisch te doen. In python kunnen we die vinden in scipy.optimize
2.6.6. Afsluitende Opdracht#
Je kan je antwoorden op deze vragen controleren in Vocareum. Kijk hiervoor op Brightspace.
Opdracht: Fietsen tegen de wind in 1
Freek wil graag wat vaker vanaf zijn huis in Voorschoten naar Delft fietsen. Hij heeft alleen het idee dat hij altijd tegenwind heeft wanneer hij dat doet. In deze opdracht gaan we uitzoeken of dat echt zo is.
Download hiervoor de uurgegevens van het weer in Voorschoten. Deze vind je op de website van het KNMI. De gegevens die je daar download zitten ingepak in een .zip bestand. Pak deze uit in een mapje genaamd data.
We beginnen met het inlezen van deze gegevens. Gebruik hiervoor pandas.read_csv en geef het resulterende DataFrame de naam data.
Je zal merken dat het bovenste deel van het bestand veel toelichting bevat. Dit deel kan je overslaan met het argument
skiprows. Kies hiervoor zelf een geschikte waarde.Wat ook opvalt aan het bestand is dat er veel spaties gebruikt worden om de tabel er netjes uit te laten zien. Bij het inladen kan je het argument
skipinitialspacegebruiken om deze te verwijderen.
Laten we eerst naar één dag kijken: 23 november 2022. Haal deze gegevens op uit de tabel en sla dit op als nov23.
Bepaal voor deze dag de gemiddelde windrichting in graden en de gemiddelde windsnelheid in meter per seconde. Sla deze respectievelijk op als gem_windrichting en gem_windsnelheid.
In het bovenste deel van het bestand staat beschreven wat de (enigszins kriptische) kolomtitels betekenen en welke eenheden ze daarvoor gebruiken.
Opdracht: Fietsen tegen de wind in 2
In dit tweede deel gaan we kijken of Freek gelijk heeft. Vanaf voorschoten fiets hij het grootste deel van de weg in een kompasrichting van 234 graden \((\theta_F)\). Als de wind een snelheid \(v_w\) heeft en onder een kompasrichting van \(\theta_w\) staat kunnen we als volgt de wind die Freek voelt berekenen:
\(v_\text{gevoel} = v_w\cdot \cos\left(\theta_w - \theta_F\right) \).
Wanneer deze gevoelde wind positief is heeft Freek wind mee, wanneer deze negatief is heeft Freek wind tegen.
Schrijf een script wat op basis van de ingeladen data een grafiek maakt van de gevoelde wind. Voer hiervoor de volgende stappen uit:
Maak een functie
v_gevoel, met als input de windsnelheid in 0.1 m/s en de windrichting in graden (in die volgorde). Deze berekent de gevoelssnelheid volgens de bovenstaande formule in meter per secondeVoeg een kolom met als naam
V_GEVOELtoe aan het dataframedata, met daarin de gevoelde snelheid op elk momentMaak een grafiek met daarin de gevoelde snelheid per uur op 23 november 2022. Zet op de x-as het uur van de dag en op de y-as de gevoelde windsnelheid. Noem de figuur
figen het assenstelselax. Vergeet ook de aslabels niet