Forelesningsnotat#

Introduksjon til databehandling i python#

Kjøre kode inne i Jupyter#

  • Sette celletype til “Code” (Esc + y)

  • Shift+Enter

a = 3
b = 4
c = a*b
print("a*b = %i"%(a*b))
a*b = 12

Noe slikt som dette

a = 3 
b = 4 
c = a*b 
print("%d*%d=%d" % (a, b, c))
3*4=12

Legge til ny/fjerne celle#

  • Legge til ny celle over (above) aktiv celle: Esc + a

  • Legge til ny celle under (below) aktiv celle: Esc + b

  • Slette hele den aktive cellen: Esc + x

Buke celle til tekst (inkl. latex)#

  • Sette celletype til “Markdown” (Esc + m)

  • Latex: kan f.eks. skrive \(\frac{2}{3}\) slik $\frac{2}{3}$

3*4
12

\(\alpha\)

Dette er en markdown-celle hvor jeg kan bruke \(\LaTeX\), \(\TeX\)

Lag så en celle som er over denne (Esc + a)

Installere pakker inne i Jupyter#

  • !pip install <pakkenavn>

  • Legge på -q for å ikke spamme output-cellen

!pip install matplotlib
Requirement already satisfied: matplotlib in /scratch2/eirikgr/anaconda3/lib/python3.11/site-packages (3.7.2)
Requirement already satisfied: contourpy>=1.0.1 in /scratch2/eirikgr/anaconda3/lib/python3.11/site-packages (from matplotlib) (1.0.5)
Requirement already satisfied: cycler>=0.10 in /scratch2/eirikgr/anaconda3/lib/python3.11/site-packages (from matplotlib) (0.11.0)
Requirement already satisfied: fonttools>=4.22.0 in /scratch2/eirikgr/anaconda3/lib/python3.11/site-packages (from matplotlib) (4.25.0)
Requirement already satisfied: kiwisolver>=1.0.1 in /scratch2/eirikgr/anaconda3/lib/python3.11/site-packages (from matplotlib) (1.4.4)
Requirement already satisfied: numpy>=1.20 in /scratch2/eirikgr/anaconda3/lib/python3.11/site-packages (from matplotlib) (1.24.3)
Requirement already satisfied: packaging>=20.0 in /scratch2/eirikgr/anaconda3/lib/python3.11/site-packages (from matplotlib) (23.1)
Requirement already satisfied: pillow>=6.2.0 in /scratch2/eirikgr/anaconda3/lib/python3.11/site-packages (from matplotlib) (9.4.0)
Requirement already satisfied: pyparsing<3.1,>=2.3.1 in /scratch2/eirikgr/anaconda3/lib/python3.11/site-packages (from matplotlib) (3.0.9)
Requirement already satisfied: python-dateutil>=2.7 in /scratch2/eirikgr/anaconda3/lib/python3.11/site-packages (from matplotlib) (2.8.2)
Requirement already satisfied: six>=1.5 in /scratch2/eirikgr/anaconda3/lib/python3.11/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)
!pip install -q matplotlib numpy pandas

Pakkene over trenger vi for å kunne plotte grafer

Feilmeldingsfellesskap#

Er det noen som har fått en feilmelding / ikke får det til å virke?

  • Nå må vi være snille med hverandre

Lage pandas DataFrame manuelt#

Om du har data i lister eller numpy-arrayer og vil ha dem over i et Pandas DataFrame. Dataframes er en type tabell.

Panda kommer fra (panel data) - data samlet for ulike observasjoner/personer over tid

panda

Live koding I#

Lage pandas DataFrame manuelt#

import pandas as pd
df = pd.DataFrame({"a": [2,3,4],
                   "b": [1,2,3]}) 
df
a b
0 2 1
1 3 2
2 4 3

Når vi skal jobbe med data som passer på tabellformat kan livet vårt bli svært mye enklere om vi brukere et bibliotek som heter pandas. Det skal da lite kode til for å lese inn filer og for å gjøre enkle plots. Dessuten passer dataformatet i pandas sammen med flere kjente maskinlæringsbiblioteker som pytorch og scikit-learn. Dermed slipper vi å bruke tid på å manipulere data til å passe inn i spesifikke formater for hvert bibliotek vi skal bruke.

Når man bruker kraftige biblioteker for databehnadling, vil det alltid være mange funksjoner man ikke kan navnet på, eller ikke vet hva gjør. Det er helt greit, og helt vanglig. Det er lov til å si at man “kan pandas” uten å vite hva alle funksjonene gjør, på samme måte som det er lov å si man kan engelsk selv om man ike vet betydningen av floccinaucinihilipilification. Derfor kommer det til å være mange ting jeg ikke vet om pandas, men jeg føler meg ganske komfortabel med å bruke det allikevel.

Det viktigste konseptet i pandas er et DataFrame. Det lager vi på denne måten, og det er en type tabell.

import pandas as pd
df = pd.DataFrame({"a": [2,3,4],
                   "b": [1,2,3]}) 

Underveisoppgave#

Legg disse listene inn i et dataframe.

innsats = [2, 4, 3, 7, 4, 1]
talent = [4, 5, 3, 4, 6, 2]
resultat = [24, 73, 25, 204, 93, 4]

Eksempelet fra forrige slide#

import pandas as pd
df = pd.DataFrame({"innsats": innsats,
                   "talent": talent,
                  "resultat":resultat}) 
0    2
1    4
2    3
3    7
4    4
5    1
Name: innsats, dtype: int64

Live-koding II#

Legge lister inn i DataFrame#

Feilmeldingsfellesskap før løsningsforslag?#

Legg disse listene inn i et DataFrame

  • innsats = [2, 4, 3, 7, 4, 1]

  • talent = [4, 5, 3, 4, 6, 2]

  • resultat = [24, 73, 25, 204, 93, 4]

#Løsning 1
df = pd.DataFrame({"innsats"   : [2, 4, 3, 7, 4, 1],
                    "talent"   : [4, 5, 3, 4, 6, 2],
                    "resultat" : [24, 73, 25, 204, 93, 4]})

# Løsning 2 siden vi allerede har dataene i lister 
innsats = [2, 4, 3, 7, 4, 1]
talent = [4, 5, 3, 4, 6, 2]
resultat = [24, 73, 25, 204, 93, 4]
df = pd.DataFrame({"innsats"   : innsats,
                    "talent"   : talent,
                    "resultat" : resultat})

Plotte datasettet#

plt.plot(df["var1"], df["var2"])

Live-koding III#

Plotte datasettet#

import matplotlib.pyplot as plt
plt.figure(figsize=(10, 8), facecolor="w")
plt.scatter(df["innsats"], df["resultat"])
plt.scatter(df["talent"], df["resultat"])

Laste inn et datasett fra internett#

Det ville være utrolig plundrete om vi hele tiden måtte bygge opp dataframes på denne måten. Det trenger vi heldigvis ikke!

Live-koding IV#

Laste inn et datasett fra internett#

url: https://programmering-i-skolen.github.io/programmeringiskolen/_static/datasett/sas_fly.txt turl: https://tinyurl.com/yyvzg8tt

import pandas as pd
url = "https://tinyurl.com/yyvzg8tt"
flydata = pd.read_table(url)
flydata

Live-koding V#

Plotte sas-fly-datasettet#

plt.plot(df[“Rekkevidde”], df[“Drivstofforbruk”], “o”)

  • Laste inn, se tabellen

  • importere matplotlib

  • plotte forskjellige ting mot hverandre: Vingespenn, Marsjfart, Rekkevidde, Drivstofforbruk

  • scatter mer relevant

# La oss nå ta for oss datasettet vi nettop lastet inn: Det med SAS sine fly. 
import pandas as pd
url = "https://programmering-i-skolen.github.io/programmeringiskolen/_static/datasett/sas_fly.txt"
flydata = pd.read_table(url)
print(flydata.keys())
import matplotlib.pyplot as plt 
plt.plot(flydata["Rekkevidde"], flydata["Drivstofforbruk"])
plt.scatter(flydata["Rekkevidde"], flydata["Drivstofforbruk"])

Underveisoppgave i feilmeldingsfellesskap. Jeg viser feilmeldingen, studentene foreslår hva vi kan gjøre.

  • Problement med “Antall”-kolonnen. Til slutt fikse separator. Forklare s+

Underveisoppgave: Solflekker#

Live-koding VI#

Underveisoppgave: Solflekker#

Prøve og feile med studentene

Ting å tenke på:

  • Først bare lese inn read_table(url). Da blir det galt.

  • Så påpeke headeren

  • Deretter riktig separator (\s = mellomrom, +: 1 eller flere treff)

Så går vi til plotting

  • Plotte PA

  • Fikse de manglende datapunktene med logisk indeksering. Manglende datapunkter er her satt til -9999.

Løsningen blir

import pandas as pd
url = "https://programmering-i-skolen.github.io/programmeringiskolen/_static/datasett/solflekkdata.txt"
solflekker = pd.read_table(url, skiprows=1, sep="\s+")
print(solflekker)
import matplotlib.pyplot as plt 
plt.plot(solflekker.YYYY[solflekker.PA>=0], solflekker.PA[solflekker.PA>=0])

Til neste gang:#

  • Notat og oppgaver fra nettressursene som trener pandas-ferdigheter.

  • Kom gjerne med tilbakemelding på vanskelighetsgrad.

Neste gang:#

  • Statistikk