Forelesningsnotat#

Kjøre kode inne i Jupyter#

  • Sette celletype til “Code”

  • Shift+Enter

# Kjøre litt kode
a = 3
b = 4
c = a*b
print(c)
12

Noe slikt som dette

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

Installere pakker inne i Jupyter#

  • !pip install <pakkenavn>

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

# Installere pakker
!pip install pandas
Requirement already satisfied: pandas in /Users/henriasv/.pyenv/versions/3.9.9/envs/streamlit/lib/python3.9/site-packages (1.4.1)
Requirement already satisfied: numpy>=1.20.0 in /Users/henriasv/.pyenv/versions/3.9.9/envs/streamlit/lib/python3.9/site-packages (from pandas) (1.22.3)
Requirement already satisfied: pytz>=2020.1 in /Users/henriasv/.pyenv/versions/3.9.9/envs/streamlit/lib/python3.9/site-packages (from pandas) (2021.3)
Requirement already satisfied: python-dateutil>=2.8.1 in /Users/henriasv/.pyenv/versions/3.9.9/envs/streamlit/lib/python3.9/site-packages (from pandas) (2.8.2)
Requirement already satisfied: six>=1.5 in /Users/henriasv/.pyenv/versions/3.9.9/envs/streamlit/lib/python3.9/site-packages (from python-dateutil>=2.8.1->pandas) (1.16.0)
WARNING: You are using pip version 22.0.4; however, version 22.3.1 is available.
You should consider upgrading via the '/Users/henriasv/.pyenv/versions/3.9.9/envs/streamlit/bin/python3.9 -m pip install --upgrade pip' command.

!pip install -q matplotlib numpy pandas

Pakkene over trenger vi for å kunne plotte grafer

Feilmeldingsfellesskap#

Stopp deling av skjerm

Er det noen som har fått en feilmelding / ikke får det til å virke, som vil dele skjerm så vi alle kan se på det?

  • 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

# 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({"a": [2,3,4],
                   "b": [1,2,3]}) 
# Løsningsforslag. Live-kode
df = pd.DataFrame({"innsats" : innsats, 
                   "talent" : talent, 
                   "resultat" : resultat})
import matplotlib.pyplot as plt 

plt.scatter(df["resultat"], df["innsats"])
<matplotlib.collections.PathCollection at 0x12f330d30>
../../../_images/01_introduction_2023_17_1.png

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-kode plotting av innsats, talent, resultat-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!

# URL: https://programmering-i-skolen.github.io/programmeringiskolen/_static/datasett/sas_fly.txt
# turl https://tinyurl.com/yyvzg8tt
df = pd.read_table("https://tinyurl.com/yyvzg8tt")

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"
data = pd.read_table(url)
data

Plotting videre#

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#

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])
       YYYY  MM    DD      PA      CA     PSI
0      1874   5   9.0  1882.0  1298.0 -0.0574
1      1874   5  10.0  1830.0  1150.0 -0.0589
2      1874   5  11.0  1276.0   767.0 -0.0429
3      1874   5  12.0   771.0   389.0 -0.0275
4      1874   5  13.0   692.0   350.0 -0.0245
...     ...  ..   ...     ...     ...     ...
49175  2008  12  27.0     0.0     0.0  0.0000
49176  2008  12  28.0     0.0     0.0  0.0000
49177  2008  12  29.0     0.0     0.0  0.0000
49178  2008  12  30.0     0.0     0.0  0.0000
49179  2008  12  31.0     0.0     0.0  0.0000

[49180 rows x 6 columns]
[<matplotlib.lines.Line2D at 0x12f4affd0>]
../../../_images/01_introduction_2023_30_2.png

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å 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