{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Intro til programmering i Python med Jupyter Notebook\nSeminar 3 i FYS1035, høsten 2025. Anja Røyne, UiO"},{"metadata":{},"cell_type":"markdown","source":"\n\n## 1. Bruk av Jupyter Notebook\n### Du jobber i din egen kopi av dokumentet\n\nNår du har åpnet dette dokumentet, kan du gjøre så mange endringer du vil. Du jobber i din egen kopi, og det får ingen konsekvenser for de andre studentene. Husk at du må trykke på \"lagre\" for at endringer skal lagres. \n\n### Celler og formater\n\nDette dokumentet er delt inn i celler, som kan ha to formater: tekst (Markdown) eller kode (code). Du kan se hvilken type en celle er i menyen på toppen. Bruk '+'-knappen i menyen til å sette inn nye celler, og 'cut' (saksen) for å slette celler. \n\n### Redigering av tekstceller\n\nDu får tilgang på å redigere en tekstcelle ved å sette markøren i den og dobbeltklikke eller trykke Enter. Når du er ferdig med å redigere trykker du ctr+enter og cella går tilbake til å se \"fin\" ut. \n\n### Kjøring av kode\n\nEn kode er tekst som får datamaskinen til å gjøre et eller annet. Her brukes programmeringsspråket Python. For å få koden i en celle til å kjøre plasserer du markøren i kodecella og trykker på Run-knappen eller ctr+enter.\n\nHer er et eksempel: "},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Hello, world!\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Når du kjører cella over, skal teksten inne i parentesen dukke opp på en linje under. Du kan prøve å bytte ut teksten \"Hello, world!\" med noe annet og kjøre igjen. Husk at tekst må stå i \"klammer\" for at datamaskinen skal forstå at det er tekst. "},{"metadata":{},"cell_type":"markdown","source":"### Rekkefølgen på kodeceller\n\nNår du kjører flere kodeceller etter hverandre, husker datamaskinen hva den gjorde sist. **Kjør cellene under i forskjellig rekkefølge for å se effekten:**"},{"metadata":{"trusted":true},"cell_type":"code","source":"navnet_mitt = \"Tom\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"navnet_mitt = \"Ole\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Jeg heter\", navnet_mitt)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 2. Python som kalkulator\nAller først skal vi importere noen pakker som Python kan bruke til å gjøre nyttig matematikk og til å plotte data i figurer. Kjør kodecella under, da fungerer resten av koden i dokumentet: "},{"metadata":{"trusted":true},"cell_type":"code","source":"from numpy import *\nfrom pylab import *","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Nå kan vi få til å gjøre utregninger for oss. La oss for eksempel regne ut hvor mye varme som kreves for å varme opp 0,72 liter vann fra 20 til 50 grader. Likningen for dette er\n\n$Q = cm\\Delta T$\n\nder\n\n$\\Delta T = T_2-T_1$ \ner temperaturendringen (i celcius eller Kelvin, siden det gir det samme når vi ser på en differanse), $Q$ er varmen i joule, $c$ er varmekapasiteten til vann i (J/kg K), og $m$ er massen til vannet. \n\nVi vet at 1 liter vann veier 1 kg, så 0,72 liter vann gir $m$ = 0,72 kg.  \n\nVarmekapasiteten til vann er $c$ = 4183 J/kg K. \n\nDette kan vi fortelle til datamaskinen og få den til å regne ut svaret. Det er gjort i cella under: "},{"metadata":{"trusted":true},"cell_type":"code","source":"# tegnet # gjør at Python ikke leser resten av linja. Dette brukes til å lage kommentarer i koden. \n\n# Oppgir tallene som skal brukes: \nc = 4183 # varmekapasiteten til vann, J/kg K\nm = 0.72 # massen til vannet, kg\nT1 = 20 # starttemperaturen, degC\nT2 = 40 # sluttemperaturen, degC\n\n# Definerer likningen som Python skal regne ut:\nQ = c*m*(T2-T1)\n\n# Skriver ut svaret:\nprint(\"Varmen er\", format(Q,\".2f\"),\"J\")\n# kommandoen format(Q,\".2f\") forteller Python at den skal skrive ut verdien av Q med to desimaler.","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"- **Kanskje er det bedre å oppgi varmen i kJ enn i J. Endre koden over til å gjøre dette.**\n\n- **Hva skjer om du bytter ut massen og temperaturene med andre tall?**\n\nVi kan bruke samme fremgangsmåte til å regne ut hvor mye varme vi trenger for å smelte 2,3 kg is. Det er gitt av likningen\n\n$Q = lm$\n\nder $l$ er smeltevarmen til is, som er $3,34\\cdot10^5$ J/kg. **Prøv selv i cella under:** "},{"metadata":{"trusted":true},"cell_type":"code","source":"l = 3.34e5 # smeltevarme for is, J/kg. Jeg skriver e5 for 10^5\nm = 2.3 #kg\n# fortsett her\nQ = l*m\nprint(\"Varmen er\", format(Q,\".2f\"),\"J\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"- **Endre koden over slik at varmen blir oppgitt med vitenskapelig notasjon og to sifre etter komma. Spør gjerne GPT UiO om hjelp.**"},{"metadata":{},"cell_type":"markdown","source":"## 3. Plotting og dataanalyse\n\nI mappen FYS1035 på jupyterhub finner du fila *gmst_changes_model_and_obs.csv*, som er [lastet ned herfra](https://catalogue.ceda.ac.uk/uuid/0b2759059ad6474098e40dad73e0a8ec/). Fila inneholder observerte globale temperaturavvik (i forhold til 1850-1990) i tillegg til en del andre data som er plottet i [panel b i IPCC WG1 figur SPM.1](https://www.ipcc.ch/report/ar6/wg1/figures/summary-for-policymakers/figure-spm-1). Vi er interessert i den svarte linja i plottet, som er observerte data. Du kan se innholdet i fila ved å trykke på den. \n\nI cella under ber vi Python om å lese fila og hente ut informasjonen i kolonne 1 (år) og 8 (temperaturavvik). Vi starter med å importere pakken **pandas**, som kan være nyttig for å lese datafiler og behandle datasett. Det finnes flere ulike metoder for å gjøre dette.\n\n- **Åpne datafila og se på hvordan den er strukturert. Linjene til og med 34 kalles metadata. Hva finner du der?**\n- **Se på hver av linjene i kodecella under. Kan du forstå hva de gjør? Be gjerne GPT UiO om å forklare dem.**\n- **Hva må du gjøre dersom du vil ha ut data fra simuleringer, i stedet for observasjonsdata?**"},{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\n\n# Oppgi navnet til fila som skal leses inn\nfil = 'gmst_changes_model_and_obs.csv'\n\n# Les fila, hopp over radene med metadata, bruk bare radene med årstall og kolonne 1+8\ndf = pd.read_csv(file_path, skiprows=35, nrows=170, usecols=['1', '8'])\n\n# Gi kolonnene nye, selvforklarende navn\ndf = df.rename(columns={'1': 'År', '8': 'Temp-avvik'})\n\n# Extract the data\nx_data = df['År']\ny_data = df['Temp-avvik']\n\nprint(df)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Nå kan vi få Python til å plotte dataene vi har lest inn. I cella under gjør vi det ved bruk av pandas-pakken vi allerede har importert. Det går også an å gjøre det med, for eksempel, en pakke som heter **matplotlib**. \n- **Se på koden under. Hva gjør den?**\n- **Endre på plottet slik at du bare viser dataene mellom år 1975 og 2000. Be gjerne GPT UiO om hjelp.** "},{"metadata":{"trusted":true},"cell_type":"code","source":"# Plott dataene ved hjelp av pandas\nax = df.plot(x='År', y='Temp-avvik', figsize=(10, 6), title='Observert globalt avvik i overflatetemperatur som funksjon av år', legend=False)\nax.set_xlabel('År')\nax.set_ylabel('Temperaturavvik')\nax.grid(True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"- **Hvis du har tid:** Ofte brukes et glidende gjennomsnitt med tidsvindu på 10 år når man plotter historiske temperaturdata. Få hjelp fra GPT UiO til å endre koden over til å plotte et glidende gjennomsnitt, og prøv deg frem med å bruke tidsvinduer på 2, 5 og 10 år. Hva blir resultatet? Er det som forventet?"},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3 (ipykernel)","language":"python"},"language_info":{"name":"python","version":"3.10.5","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":2}
