Vi laster inn data fra internett

Vi kan finne datafiler lagt ut på nettet. Disse kan vi laste inn i Python på en elegant måte ved å bruke pandas. Vi viser ved hjelp av en del eksempler.

Eksempel 1

Filen https://vincentarelbundock.github.io/Rdatasets/csv/quantreg/gasprice.csv innhol- der tidsserie for ukentlige bensinpriser i USA i perioden 1990:8-2003:26

a) Lag en grafisk framstilling av hele tidsserien.

b) Lag en grafiske gramstilling der du kun ser på årene 2000-2003.

Løsning:

import pandas as pd             # For å lese og behandle CSV-filer
import matplotlib.pyplot as plt # For plotting

url = "https://vincentarelbundock.github.io/Rdatasets/csv/quantreg/gasprice.csv"
# Vi leser inn data fra URLen og lagrer det i en dataframe som vi kaller df:
df = pd.read_csv(url, index_col=0)
df
time value
1 1990.134615 126.6
2 1990.153846 127.2
3 1990.173077 132.1
4 1990.192308 133.3
5 1990.211538 133.9
... ... ...
691 2003.403846 157.9
692 2003.423077 160.4
693 2003.442308 159.1
694 2003.461538 160.9
695 2003.480769 161.7

695 rows × 2 columns

Vi kan nå plotte disse tallene ved å bruke time på x-aksen og value på y-aksen. Dette kan gjøres ved å bruke plt.plot(). Vi kan også bruke en egen plotte-metode på datarammen df som pandas gir oss. Vi viser begge metodene.

# Metode 1

x = df["time"] # x er en liste med datoer
y = df["value"] # y er en liste med priser

plt.plot(x, y)
plt.xlabel("Dato")
plt.ylabel("Pris")
plt.show()
_images/laste-inn-data_4_0.png
# Metode 2

df.plot("time", "value")
plt.xlabel("Dato")
plt.ylabel("Pris")
plt.show()
_images/laste-inn-data_5_0.png

Vi kan finne gjennomsnittsprisen for disse årene ved å bruke pandas mean-metode på datarammen.

df["value"].mean()
120.7546762589928

Vi kunne også funnet gjennomsnittsprisen for årene 2000-2003:

# Vi lager en ny dataramme som kun har med de rader vi ønsker å behandle:
D = df[df["time"]>=2000]
D
time value
514 2000.000000 145.6
515 2000.019231 150.2
516 2000.038462 153.5
517 2000.057692 153.9
518 2000.076923 152.5
... ... ...
691 2003.403846 157.9
692 2003.423077 160.4
693 2003.442308 159.1
694 2003.461538 160.9
695 2003.480769 161.7

182 rows × 2 columns

D["value"].mean()
141.87417582417586

Vi ser at gjennomsnittsprisen i perioden 2000-2003 er 141.87 dollar.

Eksempel 2

Filen https://vincentarelbundock.github.io/Rdatasets/csv/datasets/nottem.csv har data fra Nottingham slott. Den har to kolonner. Den første er tiden (i år) og den andre er temperaturen målt i Fahrenheit.

Vi ønsker å plotte temperaturen målt i grader Celsius som funksjon av tiden.

Vi bruker da følgende formel for å regne om fra Fahrenheit til Celsius:

\[C = \frac{5\cdot (F-32)}{9} \]
import pandas as pd
import matplotlib.pyplot as plt

# Vi lager en dataramme med tallene fra filen:
url = "https://vincentarelbundock.github.io/Rdatasets/csv/datasets/nottem.csv"
df = pd.read_csv(url, index_col=0)
df
time value
1 1920.000000 40.6
2 1920.083333 40.8
3 1920.166667 44.4
4 1920.250000 46.7
5 1920.333333 54.1
... ... ...
236 1939.583333 61.8
237 1939.666667 58.2
238 1939.750000 46.7
239 1939.833333 46.6
240 1939.916667 37.8

240 rows × 2 columns

# Vi legger til kolonnen med temperaturen i Celsius. 

df["temperatur"] = 5*(df["value"]- 32)/9
df
time value temperatur
1 1920.000000 40.6 4.777778
2 1920.083333 40.8 4.888889
3 1920.166667 44.4 6.888889
4 1920.250000 46.7 8.166667
5 1920.333333 54.1 12.277778
... ... ... ...
236 1939.583333 61.8 16.555556
237 1939.666667 58.2 14.555556
238 1939.750000 46.7 8.166667
239 1939.833333 46.6 8.111111
240 1939.916667 37.8 3.222222

240 rows × 3 columns

df.plot(x="time", y="temperatur", figsize=(10,5))
plt.xlabel("År")
plt.grid()
plt.show()
_images/laste-inn-data_15_0.png

Oppgave 1

Hva var gjennomsnittstemperaturen i denne perioden?

Eksempel 3

På nettsiden seklima.met.no kan du laste ned klima-data for ulike målestasjoner. I dette eksempelet skal vi se på hvor kraftig det blåste i vindkastene i tidsrommet 26.-31. januar 2022.

vind-stord

Når vi har gjort de ulike valgene for hvilke data vi vil laste ned, så klikker vi på «Last ned» nederst til venstre på nettsiden. Velg csv-fil. Denne blir da lastet ned i din nedlastningsmappe (litt avhengig av nettleser og innstillinger). Pass på å ikke åpne denne filen med Excel. Dra så filen over i mappen som selve jupyter-filen din er lagret i.

vindkst-last-ned

Vi kan nå importere denne filen inn i Python, plotte og gjøre beregninger.

Når vi laster inn denne filen, får vi et par problemer. Vi må for det første spesifisere at verdiene skilles ved hjelp av semikolon. Dette gjør vi ved å skrive inn sep=”;”. Så får vi et lite problem ved at desimaltallene er gitt med komma, ikke punktum (som er standard i Python). Dette løser vi ved å skrive decimal=”,”.

import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("table.csv", sep=";", decimal=",")
df
Navn Stasjon Tid(norsk normaltid) Høyeste vindkast (10 min)
0 E39 Stordabrua SN48070 25.01.2022 19:30 5.9
1 E39 Stordabrua SN48070 25.01.2022 19:40 7.4
2 E39 Stordabrua SN48070 25.01.2022 19:50 8.2
3 E39 Stordabrua SN48070 25.01.2022 20:00 9.7
4 E39 Stordabrua SN48070 25.01.2022 20:10 11.2
... ... ... ... ...
855 E39 Stordabrua SN48070 31.01.2022 18:30 10.1
856 E39 Stordabrua SN48070 31.01.2022 18:40 10.1
857 E39 Stordabrua SN48070 31.01.2022 18:50 12.3
858 E39 Stordabrua SN48070 31.01.2022 19:00 12.5
859 Data er gyldig per 31.01.2022 (CC BY 4.0), Met... NaN NaN NaN

860 rows × 4 columns

Vi ønsker nå å finne ut når vi hadde det høyeste vindkastet.

m = df["Høyeste vindkast (10 min)"].max()
m
35.0
for i in range(859):
    if df["Høyeste vindkast (10 min)"][i] == m:
        print(df["Tid(norsk normaltid)"][i])
29.01.2022 23:50
30.01.2022 00:00

Vi må selvsagt også plotte dataene våre:

df.plot(x="Tid(norsk normaltid)", y="Høyeste vindkast (10 min)", figsize=(13,5))
plt.grid()
plt.show()
_images/laste-inn-data_23_0.png

Eksempel 4

Filen https://tork73.github.io/Data_behandling/vekt.txt inneholder vekten til 100 personer.

a) Bestem gjennomsnittsvekten til personene

b) Hva er den største vekten? Hva er den laveste?

c) Illustrer tallene i et histogram.

import pandas as pd
import matplotlib.pyplot as plt

url = "https://tork73.github.io/Data_behandling/vekt.txt"
df = pd.read_csv(url, names=["Vekt"])

# a)
m = df["Vekt"].mean()
print(f"Gjennomsnittsvekten er {m:.1f} kg")

# b)
s = df["Vekt"].max()
print(f"Største vekt er {s:.1f} kg")

minste = df["Vekt"].min()
print(f"Laveste vekt er {minste:.1f} kg")
Gjennomsnittsvekten er 81.8 kg
Største vekt er 116.1 kg
Laveste vekt er 44.4 kg
plt.hist(df["Vekt"], bins=range(40, 130, 10),  # bins er en liste med tall eller et helt tall 
         color="Royalblue", edgecolor="w", density=True) 
         # density=True gir en histogram med samlet areal lik 1
plt.xlabel("Vekt (kg)")
plt.title("Histogram")
plt.show()
_images/laste-inn-data_26_0.png

Eksempel 5

Filen https://tork73.github.io/Data_behandling/2017luft.txt inneholder målinter for temperaturen en plass gjennom et hele 2017. Den består av fem måliner for hver dag. Målingene er gjort klokken 00, 12, 15, 18 og 21.

Plott temperaturen gjennom hele året.

import pandas as pd
import matplotlib.pyplot as plt

url = "https://tork73.github.io/Data_behandling/2017luft.txt"
df = pd.read_csv(url, sep="\t", index_col=False)
df
Tid Nr Lufttemperatur
0 2017.01.01.00 1 2.1
1 2017.01.01.12 2 2.4
2 2017.01.01.15 3 2.3
3 2017.01.01.18 4 1.3
4 2017.01.01.21 5 -0.3
... ... ... ...
2255 2017.12.17.09 2256 -0.2
2256 2017.12.17.12 2257 0.8
2257 2017.12.18.15 2258 2.4
2258 2017.12.28.18 2259 -1.1
2259 2017.12.28.21 2260 -0.9

2260 rows × 3 columns

df.plot(x="Tid", y="Lufttemperatur", figsize=(14, 5))
plt.show()
_images/laste-inn-data_29_0.png

##$ Ekempel 6

Filen https://vincentarelbundock.github.io/Rdatasets/csv/quantreg/gasprice.csv innholder tidsserie for ukentlige bensinpriser i USA i perioden 1990:8-2003:26

a) Lag en grafisk framstilling av hele tidsserien.

b) Lag en grafiske gramstilling der du kun ser på årene 2000-2003.

import matplotlib.pyplot as plt
import pandas as pd

url = "https://vincentarelbundock.github.io/Rdatasets/csv/quantreg/gasprice.csv"

df = pd.read_csv(url, index_col=0)
df
time value
1 1990.134615 126.6
2 1990.153846 127.2
3 1990.173077 132.1
4 1990.192308 133.3
5 1990.211538 133.9
... ... ...
691 2003.403846 157.9
692 2003.423077 160.4
693 2003.442308 159.1
694 2003.461538 160.9
695 2003.480769 161.7

695 rows × 2 columns

df.plot(x="time", y="value", figsize=(10, 5))
plt.xlim(2000)
plt.grid();
_images/laste-inn-data_32_0.png

Vi kunne også ha laget en ny dataramme som inneholder kun data fra 2000-tallet:

df2 = df[df["time"] >= 2000]
df2.head()
time value
514 2000.000000 145.6
515 2000.019231 150.2
516 2000.038462 153.5
517 2000.057692 153.9
518 2000.076923 152.5
df2.plot(x="time", y="value", figsize=(10, 5));
_images/laste-inn-data_35_0.png

Oppgave 2

I denne oppgaven skal du jobbe med filen https: // tork73.github.io/Data_behandling/posisjon.txt.

a) Importer denne filen i et Pythonprogram.

b) Plott posisjonsgrafen som funksjon av tiden.

c) Plott fartsgrafen som funksjon av tiden.

import pandas as pd
import matplotlib.pyplot as plt

# a)
url = "https://tork73.github.io/Data_behandling/posisjon.txt"
df = pd.read_csv(url, sep="\t")
df.head()
Tid(s) Posisjon(m)
0 1.0052 0.727
1 1.1043 0.562
2 1.2037 0.434
3 1.3032 0.332
4 1.4029 0.261
# b)
df.plot("Tid(s)", "Posisjon(m)");
_images/laste-inn-data_38_0.png

For å kunne tegne fartsgrafen må vi regne ut gjennomsnittsfarten i hvert delintervall fra df. Bruker da formelen

\[ \overline v = \frac{\Delta s}{\Delta t}\]

I vårt eksempel betyr dette at vi må regne ut endring i posisjon, delt på endring i tid. Vi lager derfor en ny liste som vi kaller Fart. I denne legger vi inn alle gjennomsnittsfartene. Vi lager også en liste som vi kaller Tid. I denne legger vi inn midtpunktet til tidspunktene.

# c)
Fart = [] # Denne skal vi fylle med fartene. 
for i in range(len(df)-1):
    v = (df["Posisjon(m)"][i+1]-df["Posisjon(m)"][i])/(df["Tid(s)"][i+1]-df["Tid(s)"][i])
    Fart.append(v)

Tid = [] # Denne skal vi fylle med midtpunktene til tiden.

for i in range(len(df)-1):
    t = (df["Tid(s)"][i+1]+df["Tid(s)"][i])/2
    Tid.append(t)

# Nå kan vi plotte data fra de to listene: 

plt.plot(Tid, Fart, "-o")
plt.xlabel("Tid (s)")
plt.ylabel("Fart (m/s)")
plt.show()
_images/laste-inn-data_40_0.png