In deze oefening is het de bedoeling om aan een bestaand CSV-bestand kolommen toe
te voegen die een functie is van de andere kolommen van het bestand. Het bestand is een CSV-bestand, met als gedaante:
Data0; Data1; Data2; ...
(zie ook het voorbeeld onderaan de opgave)
Hierbij zijn de hoofdingen 'Data0, 'Data1', enz. placeholders (m.a.w. in de echte
bestanden staan andere hoofdingen). Alle volgende regels bevatten strings, die
eigenlijk floats voorstellen, waarbij de komma als decimaal teken gebruikt wordt.
In eerste instantie programmeren we de klasse Kolom
(die 1 kolom uit zo'n bestand
voorstelt), en vervolgens programmeren we de klasse Werkblad
.
een constructor met als argumenten de naam van de kolom (een string) en een lijst van getallen (floats of ints) die de gegevens van de kolom voorstellen
de methode __str__()
geeft een string terug die de naam van de kolom bevat, gevolgd door ':' en dit gevolgd door
de standaard lijst-voorstelling van de gegevens van de kolom.
de operator +
:
Kolom
zijn, is het resultaat een nieuwe Kolom
die
de som is van de gelijkstandige elementen van de argumentkolommen. Je mag in dit geval aannemen dat beide argumentkolommen even lang
zijn. Als naam kies je de string "naam_linker_argument+naam_rechter_argument" (indien het linkerargument de kolom met naam "A" is en het
rechterargument de kolom met naam "B", dan draagt de som de naam "A+B").Kolom
is, en rechter-operand een int of een float, dan wordt bij elk
gegevenselement van het linkeroperand de waarde van de int of float opgeteld. Als naam kies je "naam_linker_operand+getal"
waarbij "getal" staat voor de standaardstringvoorstelling van de int of float.Kolom
, dan wordt bij elk
gegevenselement van het rechteroperand de waarde van de int of float opgeteld. Als naam kies je "naam_rechter_operand+getal"
waarbij "getal" staat voor de standaardstringvoorstelling van de int of float. de operator *
: gelijkaardige werking als de +
-operator, met als verschillen:
Werkblad
:
een constructor met 1 argument, namelijk de naam van het CSV-bestand waar de gegevens van het werkblad te vinden zijn. Zorg ervoor dat je de numerieke gegevens uit het bestand (strings met als decimaal teken de komma) correct omzet naar floats (je mag aannemen dat alle gegevens in het bestand floats zijn, behalve de eerse regel van het bestand, die de namen van de kolommen bevat).
de methode __str__()
levert de standaard string-gedaante op van de opgeslagen gegevens. Hierbij sla je de gegevens op in
een lijst-van-lijsten, waarbij elke rij in het CSV-bestand in een lijst bijgehouden wordt. De eerste lijst bevat de namen van alle kolommen,
en elke volgende lijst bevat de numerieke gegevens (floats) van een rij.
de methode get_aantal_kolommen()
levert het aantal kolommen dat in het CSV-bestand aangetroffen werd
zorg ervoor dat objecten van de klasse Werkblad
oproepbaar ("callable") zijn, met 1 geheel argument $$i$$. Het
resultaat van de oproep is een object van de klasse Kolom
met rangnummer $$i$$ uit het CSV-bestand (na omzetting naar float van alle numerieke gegevens).
De naam van de Kolom
is de hoofding van de corresponderende kolom uit het CSV-bestand.
Is a
een object van de klasse Werkblad
, dan levert de oproep a(5)
dus de Kolom
met rangnummer 5
op van het werkblad (hierbij worden kolommen genummerd vanaf 0). Je mag aannemen dat het argument een geldig rangnummer voorstelt.
de operator +=
met als rechteroperand een opbject van de klasse Kolom
: deze operator voegt de argumentkolom toe aan het werkblad.
Je mag aannemen dat de kolom over het correcte aantal gegevens beschikt.
de methode schrijf()
met 1 argument, namelijk de naam van een te schrijven CSV-bestand. Oproepen van deze methode
resulteert in het wegschrijven van de gegevens van het Werkblad
naar een CSV-bestand. Hierbij worden floats opnieuw voorsteld
als strings, met de komma als decimaal teken.
a = Kolom('A', [1, 2, 3, 4, 5]) print(a) #A:[1, 2, 3, 4, 5] b = Kolom('B', [10, 20, 30, 40, 50]) print(a + b) #A+B:[11, 22, 33, 44, 55] print(a + 2) #A+2:[3, 4, 5, 6, 7] print(2 + a) #A+2:[3, 4, 5, 6, 7] c = Kolom('C', [100, 200, 300, 400, 500]) print(a*c) #A*C:[100, 400, 900, 1600, 2500] print(c*40) #C*40:[4000, 8000, 12000, 16000, 20000] print(40*c) #C*40:[4000, 8000, 12000, 16000, 20000] print(2*a + b*40 + c) #A*2+B*40+C:[502, 1004, 1506, 2008, 2510] Inhoud Gegevens_0_out.csv E;B;F;D;A;C; -86,0;1945,0;-107,0;1046,0;-624,0;1631,0 925,0;160,0;619,0;69,0;335,0;968,0 482,0;1621,0;435,0;-784,0;830,0;1072,0 blad = Werkblad('Gegevens_0_in.csv') print(blad) #[['E', 'B', 'F', 'D', 'A', 'C'], # [-86.0, 1945.0, -107.0, 1046.0, -624.0, 1631.0], # [925.0, 160.0, 619.0, 69.0, 335.0, 968.0], # [482.0, 1621.0, 435.0, -784.0, 830.0, 1072.0]] blad.get_aantal_kolommen() #6 print(blad(1)) #B:[1945.0, 160.0, 1621.0] blad += -5 * blad(4) + 5 * blad(0) print(blad) #[['E', 'B', 'F', 'D', 'A', 'C', 'A*-5+E*5'], # [-86.0, 1945.0, -107.0, 1046.0, -624.0, 1631.0, 2690.0], # [925.0, 160.0, 619.0, 69.0, 335.0, 968.0, 2950.0], # [482.0, 1621.0, 435.0, -784.0, 830.0, 1072.0, -1740.0]] blad.schrijf('Gegevens_0_out.csv') Inhoud Gegevens_0_out.csv E;B;F;D;A;C;A*-5+E*5 -86,0;1945,0;-107,0;1046,0;-624,0;1631,0;2690,0 925,0;160,0;619,0;69,0;335,0;968,0;2950,0 482,0;1621,0;435,0;-784,0;830,0;1072,0;-1740,0