Reelle datasett#

Som jegere i en data-jungel har vi lært å jakte, slakte og partere data-byttet vårt – men det viser seg at vi egentlig ikke hadde trengt å jakte lengre, fordi det finnes data-biff ferdig partert i butikken – i form av fint formaterte .csv- og .json-filer.

Med pandas er det å åpne og analysere datafiler en lek, men før vi ser på datafilene, må vi bli kjent med DataFrame-objekter.

Dataframes#

Den viktigste datatypen fra pandas er DataFrame.

En dataframe er en ordbok hvor keys er navn for kolonner, og values er data i hver kolonne.

import pandas as pd

data = {
    'Navn': ['Aelar', 'Thalia', 'Gorath', 'Elara', 'Borin'],
    'Class': ['Ranger', 'Wizard', 'Barbarian', 'Rogue', 'Cleric'],
    'Alder': [120, 35, 28, 25, 150],
    'Rase': ['Elf', 'Human', 'Half-Orc', 'Halfling', 'Dwarf'],
    'Level': [5, 7, 6, 4, 8]
}

df = pd.DataFrame(data)

print(df)
     Navn      Class  Alder      Rase  Level
0   Aelar     Ranger    120       Elf      5
1  Thalia     Wizard     35     Human      7
2  Gorath  Barbarian     28  Half-Orc      6
3   Elara      Rogue     25  Halfling      4
4   Borin     Cleric    150     Dwarf      8

Søyler#

Man kan hente all data fra en søyle ved å bruke søylens navn.

print(df["Navn"])
print()
print(list(df["Navn"]))
0     Aelar
1    Thalia
2    Gorath
3     Elara
4     Borin
Name: Navn, dtype: object

['Aelar', 'Thalia', 'Gorath', 'Elara', 'Borin']

Rader#

Man kan hente en spesifikk rad ved å bruke iloc().

print(df.iloc[4])
Navn      Borin
Class    Cleric
Alder       150
Rase      Dwarf
Level         8
Name: 4, dtype: object

Filtrering#

Man kan også enkelt filtrere resultater.

print(df[df["Level"] >= 6]) # Henter ut alle som har level større enn eller likt 6
     Navn      Class  Alder      Rase  Level
1  Thalia     Wizard     35     Human      7
2  Gorath  Barbarian     28  Half-Orc      6
4   Borin     Cleric    150     Dwarf      8

Gjennomsnitt og sum#

Gjennomsnitt og sum finner man også lett.

print(f"Gjennomsnittlig alder: {df['Alder'].mean()} år")
print(f"Sum av hvert level: {df['Level'].sum()}")
Gjennomsnittlig alder: 71.6 år
Sum av hvert level: 30

Sortering#

Man kan sortere en DataFrame etter verdier.

print(df.sort_values(by="Alder", ascending=False))
     Navn      Class  Alder      Rase  Level
4   Borin     Cleric    150     Dwarf      8
0   Aelar     Ranger    120       Elf      5
1  Thalia     Wizard     35     Human      7
2  Gorath  Barbarian     28  Half-Orc      6
3   Elara      Rogue     25  Halfling      4

Plotting#

Det er også innebygd matplotlib-funksjonalitet i pandas.

import matplotlib.pyplot as plt

df.plot(x="Navn", y=["Alder", "Level"], kind="bar")
plt.show()
../_images/f781bebb2622af64b2ba01f659346cadf5aed8e963f45fa73cbbff79d884c2c3.png

Lagre filer#

Når man har en dataframe, kan man enkelt lagre den som en .csv eller .json-fil.

df.to_csv("adventurers.csv", index=False)
df.to_json("adventurers.json", index=False)

CSV-filer#

Filer med .csv er tekstfiler som følger en (litt slapp) standard.

  • Hver linje (rad) representerer et dataobjekt, for eksempel et spill, en bil eller en person.

  • Hver linje er delt opp i kolonner med et delimiter- eller separator-tegn, i dette tilfellet ,.

Plassering,Spillnavn,Konsoll
1,"Mario Kart DS",DS
2,"Hey You, Pikachu!",N64
3,"WarioWare, Inc.: Mega MicroGame$",GBA
4,"Horse Life 4: My Horse, My Friend, My Champion",3DS

Filer med .csv har ofte en første rad (eller flere rader) som forklarer hva hver kolonne representerer. Dette kalles en header. I tillegg brukes det noen ganger en annen delimiter enn ,, for eksempel ; eller \t, til tross for at det heter comma-separated values.

import pandas as pd

df = pd.read_csv("spill_enkel.csv")

print(df)
   Plassering                                       Spillnavn Konsoll
0           1                                   Mario Kart DS      DS
1           2                               Hey You, Pikachu!     N64
2           3                WarioWare, Inc.: Mega MicroGame$     GBA
3           4  Horse Life 4: My Horse, My Friend, My Champion     3DS

Spesifisere separator og desimaltegn

Man kan spesifisere separator og desimaltegn som ekstra argumenter til read_csv().

Dette er nyttig hvis vi har en datafil som bruker andre tegn for separator og komma.

2023;129,6;126,1;126,6;127,6;129,0;129,6;130,4;130,9;129,9;129,8;131,1;131,8;131,9
2022;122,8;117,8;119,1;119,8;121,2;121,5;122,6;124,2;123,9;125,6;126,0;125,8;125,9
2021;116,1;114,1;114,9;114,6;115,0;114,9;115,3;116,3;116,3;117,5;117,2;118,1;118,9
df = pd.read_csv("datafil.csv", sep=";", decimal=",")

JSON-filer#

Filer med .json er tekstfiler som lagrer data på nesten samme måte som vi har gjort med ordbøker (lenke).

{
    "1" : {
        "Navn" : "Mario Kart DS",
        "Konsoll" : "DS"
    },
    "2" : {
        "Navn" : "Hey You, Pikachu!",
        "Konsoll" : "N64"
    },
    "3" : {
        "Navn" : "WarioWare, Inc.: Mega MicroGame$",
        "Konsoll" : "GBA"
    },
    "4" : {
        "Navn" : "Horse Life 4: My Horse, My Friend, My Champion",
        "Konsoll" : "3DS"
    }
}
import pandas as pd

df = pd.read_json("spill_enkel.json")

print(df)
print()
print(df[1]["Navn"]) # Henter navnet fra plassering 1
                     1                  2                                 3  \
Navn     Mario Kart DS  Hey You, Pikachu!  WarioWare, Inc.: Mega MicroGame$   
Konsoll             DS                N64                               GBA   

                                                      4  
Navn     Horse Life 4: My Horse, My Friend, My Champion  
Konsoll                                             3DS  

Mario Kart DS

Manglende data

Hvis man går gjennom en kolonne, kan man droppe de radene som ikke har data i den kolonnen ved å bruke df.dropna()-metoden.

Rating,Title,Console,Time(Optional)
5,Bloodborne,PS4,16h54m19s
4,Katamari Damacy,PS2,4h42m58s
3,Dead Cells,PC,
df = pd.read_csv("list.csv")
print(df["Time(Optional)"].dropna())
16h54m19s
4h42m58s

Dokumentasjonen

Dokumentasjonen for pandas finner du her (lenke).

Husk, å kunne lese dokumentasjon er en viktig ferdighet for en aspirerende programmerer! 🤓


Oppgaver#

Oppgave 1 🅰️

Lag din egen DataFrame. Første kolonne skal være Fag og andre kolonne skal være Karakter. Du kan finne på fag og karakterer.

  • Finn snittkarakteren.

  • Lag et søylediagram med labels som navnene på fagene og verdiene (høydene) som karakterene.

  • Bruk pandas til å lagre dette som en datafil karakterer.csv.

Oppgave 2 🎮

Jeg har rundet hundrevis av spill og kategorisert de i en .csv-fil.

Last ned filen her (lenke)

  • Skriv ut antallet spill i listen.

  • Skriv ut fordelingen mellom 1-ere, 2-ere, 3-ere, 4-ere og 5-ere.

  • Skriv ut hvor mange spill det er til de \(8\) mest populære spillkonsollene, i synkende rekkefølge.

  • (BONUS) Regn ut summen av de registrerte tidene i timer.

Oppgave 3 🏹

Handelsmannen Knoteknut Glimretå er en handelsmann som selger utstyr til eventyrere.

Last ned filen gnome_merchant_inventory.json.

Skriv ut en oversikt over de seks tingene han har mest av.

Oppgave 4 ✨

Stjernestasjonen Epsilon-9 har et register over romskipene fra føderasjonen som har besøkt stasjonen.

Last ned filen starship_registry.csv.

Skriv ut en fin tabell over alle besøkene i kronologisk rekkefølge.

Oppgave 5 🎬

Norsk filmindustri har produsert noen sykt bra filmer gjennom tidene.

Last ned filen filmer.csv.

  • Lag en fin tabell. Brukeren skal kunne velge om man skal skrive ut i alfabetisk rekkefølge, eller etter utgivelse.

  • Skriv ut de tre mest sette filmene på kino.

  • Skriv ut de tre filmene med flest strømminger.