Uke 14 -- Pandas examples
=========================
.. note::
pandas er et eksternt bibliotek som vi må installere først i terminalen::
python -m pip install --user pandas
Hvis dette ikke fungerer så kan du prøve å kjøre denne koden:
:download:`install.py`, som prøver å finne den riktige versjonen til Python med::
import sys
print(sys.executable)
Denne gangen skal vi se på `Pandas `_-biblioteken,
med det samme datasettet vi har brukt før.
Pandas er en veldig nyttig bibliotek til dataanalyse, som gjør det enkelt å få til
mange av de vanlige ting man vil gjøre. Mer detalj finnes i introduksjonen her::
* https://pandas.pydata.org/docs/getting_started/overview.html
* https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html
.. * https://pandas.pydata.org/docs/getting_started/10min.html
Akvakultur
----------
Last inn datasettet
...................
FIlen er det samme som før: :download:`Akvakulturregisteret.csv`.
Fra `instructions on opening files `_
ser vi at vi bør bruke :code:`read_csv`. Første forsøket er ::
import pandas as pd
akva = pd.read_csv('Akvakulturregisteret.csv')
print(akva.columns)
Flere ting går feil her: vi må fortelle pandas om at filen bruker :code:`;` som separator, og at
filen er kodert som :code:`iso-8859-1`. Også er det litt uvanlig at informasjon
om kolonnenavn finnes i rad 1, ikke 0. La oss legge til alt dette::
import pandas as pd
import matplotlib.pyplot as plt
akva = pd.read_csv(
'Akvakulturregisteret.csv',
delimiter=';',
encoding='iso-8859-1',
header=1
)
print(akva.columns)
print(akva)
Det ser ut som at det fungerer allerede. Sammenlignet med CSV-modulen har vi mye mer informasjon inni
pandas-dataframet :code:`akva`. Kolonnenavn ble satt automatisk, og vi kan skrive ut
ulik informasjon med f.eks::
print(akva['ART'])
print(akva['POSTSTED'].min(), akva['POSTSTED'].max())
Slicing og filtrering fungerer slik som vi så med numpy::
filt = (akva['ART'] == 'Laks')
print(akva[filt])
Plotting
........
La oss se på visualisering.
`Tutorial on plotting `_
er veldig nyttig. Det ser ut at vi kun trenger en linje til, for å få en scatterplot
til alle posisjoner:
.. literalinclude:: akva_pd_1.py
.. image:: akva_pd_1.png
Oppgavene fra CSV-kapittel
..........................
De ulike dataanalyse-oppgavene vi så tidligere kan enkelt gjøres med pandas:
* Telle opp ulike arter (*ART*, column 12). Googling *count categories in pandas*
foreslår :code:`value_counts()`::
print(akva['ART'].value_counts())
* Plotte kun de som oppdrar *Laks*. Her kan vi bruke filtere::
laks = akva[ akva['ART'] == 'Laks' ]
laks.plot.scatter(x='Ø_GEOWGS84', y='N_GEOWGS84', alpha=0.2))
* Plot *FERSKVANN* i en farge og *SALTVANN* in en annen (*VANNMILJØ*, column 20). Igjen bruker vi filtere.
Scatter plots vi bruker her er vanlige matplotlib plots, ikke de som kommer direkte fra pandas.
Vi ser hvor enkelt det er å kombinere disse ulike bibliotekene:
.. literalinclude:: akva_pd_2.py
.. image:: akva_pd_2.png
Flere eksempler
---------------
Below are a few examples (in English) of using pandas, matplotlib, and numpy to
deal with large datasets:
.. toctree::
:maxdepth: 1
bergensveret/index
geophys3/index
tides-and-sea-level/index
hydrostatic-balance/index
Summary
-------
Pandas er ett av de flestbrukte dataanalyseverktøy i realfag, og tilbyr mye mer enn
det vi kan vise i en innføringsforelesning til Python. Om du synes det er nyttig for deg, start på
pandas-nettsiden og følg med i de ulike tutorials, med tanke på dine egne datasett.
Oppgaver
--------
.. note::
**Det er den siste oppgaven for dette semesteret!** Du må gjøre begge oppgavene for å få full kreditt for denne uken. Det kommer igen auto-testene denne uken.
For de som har lyst til å programmere mer i løpet av sommeren så finnes det en adventskalender med programmeringsoppgaver: `Advent of Code `_. Det er ulike vanskelighetsgrad på de ulike oppgavene, men du kan prøve og se hvor mange du kan løse. Om du blir med: lykke til!
Oppgave 1
.........
I denne oppgaven skal vi jobbe med datasettet :download:`VIK_sealevel_2000.txt` som inneholder målinger av havnivå for hver time av året 2000. Det er valgfritt å bruke ``pandas`` for å løse denne oppgaven.
I filen ``uke_14_oppg_1.py`` gjør du følgende:
**a)** skriv en funksjon :code:`read_data` som tar inn et filnavn og returnerer en pandas dataframe
der den første kolonnen (index) skal ha navnet ``date`` og innholder :code:`datetime`.
De andre kolonnene skal ha navn ``year month day hour sealevel``.
Du kan anta at filen har samme format som :code:`VIK_sealevel_2000.txt`.
.. note::
TIPPS: her er det lurt å se på `read_csv `_ og `to_datetime `_
Eksempelkjøring for pandas dataframe. Obs! ``hour`` må være 0-23, ikke 24! ::
.. code-block:: python
>>> print(data.head())
year month day hour sealevel
date
2000-01-01 00:00:00 2000 1 1 0 335
2000-01-01 01:00:00 2000 1 1 1 336
2000-01-01 02:00:00 2000 1 1 2 338
2000-01-01 03:00:00 2000 1 1 3 341
2000-01-01 04:00:00 2000 1 1 4 347
**b)** skriv en funksjon :code:`plot_months` som tar inn en dataframe formatert som i **a)** og plotter en graf som viser gjennomsnittlig havninvå for hver måned. Gi grafen og aksene passende navn, og velg noen fine farger.
**c)** skriv en funksjon :code:`plot_rolling_average` som tar inn en dataframe formatert som i **a)**.
Funksjonen skal plotte havninvået for juni måned både direkte og som et glidende gjennomsnitt (rolling average).
Velg periode for det glidende gjennomsnittet selv. Grafen kan f.eks se sånn her ut:
.. image:: rolling_avg_june.png
Lagre plot med navnet ``uke_14_oppg_1.png`` og laste opp filen.
.. note::
**TIPPS**: se på `rolling `_ i pandas dokumentasjonen.
Oppgave 2 - Airport Codes
...........................
I denne oppgaven skal vi jobbe med airport codes. Følg oppgaveinstruksjonene på den følgende siden og lagre koden i filen ``uke_14_oppg_2.py``.
.. toctree::
:maxdepth: 1
airportcodes/index