Øvingsoppgaver

Her er øvingsopgaver som passer å gjøre etter første undervisningsøkt i kurset. Det er lov å sende mail og be om hjelp om du står fast! Eller spørre en medstudent.

Trekke ut informasjon fra datasett

a) Last ned filen “bestsellers with categories.xls” her, og les den inn med pandas.

Løsningsforslag

Vi laster ned filen og bruker df.head til å vise fram de første radene.

import pandas as pd
df = pd.read_csv("data/bestsellers_with_categories.csv")
df.head()
Name Author User Rating Reviews Price Year Genre
0 10-Day Green Smoothie Cleanse JJ Smith 4.7 17350 8 2016 Non Fiction
1 11/22/63: A Novel Stephen King 4.6 2052 22 2011 Fiction
2 12 Rules for Life: An Antidote to Chaos Jordan B. Peterson 4.7 18979 15 2018 Non Fiction
3 1984 (Signet Classics) George Orwell 4.7 21424 6 2017 Fiction
4 5,000 Awesome Facts (About Everything!) (Natio... National Geographic Kids 4.8 7665 12 2019 Non Fiction

Hvorfor ber vi dere om å laste ned datasettet, og ikke bare hente direkte fra internett? For øve på å legge filer på fornuftige steder.

b) Behandling av data: - Datasettet har noen bøker med flere ganger. Fjern duplikatene med .drop_duplicates("Name") - Fjern navnet på boken og forfatteren fra dataen - Fjern alle bøker med mindre enn 1000 anmeldelser

Løsningsforslag
df_dropped = df.drop_duplicates("Name")
print(f"Lengde på opprinnelig datasett: {len(df)}")
print(f"Lengde på droppet datasett: {len(df_dropped)}")
Lengde på opprinnelig datasett: 550
Lengde på droppet datasett: 351

Så tar vi vekk de som har færre enn 1000 anmeldelser

c) Plot - Gjennomsnittlig anmeldelsesskårer for fiksjon og sakprosa - Gjennomsnittlig anmeldelsesskårer for hvert utgivelsesår. - Antall bøker for hver score - Antall anmeldelser for hver score

d) Hvor mange fiksjonsbøker fra 2017 fikk en score bedre enn 4.6?

Beregning av strømregning basert på forbruksdata og prisdata

Har du betalt rett pris for strømmen din? Last ned dette datasettet som inneholder strømavlesninger fra en adresse i oslo-området i desember 2024. Alle som har et strømabonnement i Norge kan laste ned sine forbruksdata fra Elhub.

a) Plott strømforbruket som funksjon av tid.

import pandas as pd
import matplotlib.pyplot as plt
df_forbruk = pd.read_csv("data/meteringvalues-dec-2024.csv", sep=";", decimal=",")
plt.plot(df_forbruk['KWH 60 Forbruk'])

b) Vi kan så hente prisdata fra Nordpool. Vi har lastet ned prisene for desember 2024 for dere her.

from nordpool import elspot
import datetime
price_list = []
prices_spot = elspot.Prices(currency="NOK")
for i in range(1, 32):
    entry = prices_spot.hourly(end_date=datetime.datetime(2024, 12, i), areas=['NO1'], )
    price_list.append(entry)

Så henter vi ut den delen av informasjonen som vi er interessert i og lagrer som csv-fil.

import pandas as pd
clean_list = []
for element in price_list: 
    clean_list += element["areas"]["NO1"]["values"]
df_pris = pd.DataFrame(clean_list)
df_pris.to_csv("data/nordpool-dec-24.csv")
  • Hva er spotpriskostnaden for strømforbruket i desember 2024?
Løsningsforslag
df_pris = pd.read_csv("data/nordpool-dec-24.csv")
df_forbruk = pd.read_csv("data/meteringvalues-dec-2024.csv", sep=";", decimal=",")

nettopris = sum(df_forbruk['KWH 60 Forbruk']*df_pris["value"])/1000
med_moms = nettopris*1.25
print(f"Spotpris på strømmen inkl. moms er {med_moms:.2f} kr")
Spotpris på strømmen inkl. moms er 2899.55 kr

Merk at vi la på moms i omregningen fra nordpool-priser til egen beregnet pris for strømforbruket, derav gange med 1.25

c) For å komplisere saken videre, har staten innført strømstøtte. I 2024 dekket staten 90 % av den delen av strømprisen som var over 73 øre eks moms. Hvor mye strømstøtte kommer denne kunden til å få?

Tips: Lag først en funksjon som konverterer strømpris til strømpris med strømstøtte.

Løsningsforslag
import numpy as np
def strømstøtte(pris):
    # Antar pris i kroner 
    if pris <= 0.73: 
        return 0
    else: 
        return (pris-0.73)*0.9

df_pris["value"]
strømstøtte(0.753)
strømstøtte_sats = np.array([strømstøtte(pris) for pris in df_pris["value"]/1000])
strømstøtte = sum(df_forbruk['KWH 60 Forbruk']*strømstøtte_sats)
print(strømstøtte*1.25)
840.7654382812502

d) Vi kan så se om vi klarer å finne en sammenheng mellom strømforbruk og utetemperatur. Du kan hente data fra meteorologisk institutt sitt frost-API. Først oppretter du en bruker her (det går superfort). Så kan du hente data med følgende python-kode:

import requests
import pandas as pd

client_id = client_id
endpoint = 'https://frost.met.no/observations/v0.jsonld'
parameters = {
    'sources': 'SN18700',
    'elements': 'mean(air_temperature P1D)',
    'referencetime': '2024-12-01/2025-01-01',
}
r = requests.get(endpoint, parameters, auth=(client_id,''))

json = r.json()
Løsningsforslag
my_list = []
for data in json["data"]:
    my_list += data["observations"]
df_temp = pd.DataFrame(my_list)
df_temp = df_temp[df_temp["timeOffset"] == "PT6H"]
from datetime import datetime
def date_func(row): 
    date_object = datetime.strptime(row["Fra"], "%d.%m.%Y %H:%M")
    return date_object.date()

df_forbruk["date"] = df_forbruk.apply(date_func, axis=1) 
forbruk_per_dag = df_forbruk.groupby("date").sum()
x = df_temp["value"]
y = forbruk_per_dag["KWH 60 Forbruk"]

plt.scatter(x, y)

plt.xlabel("Utetemperatur [$^\circ$C]")
plt.ylabel("Strømforbruk [kWh]")
/var/folders/qn/3_cqp_vx25v4w6yrx68654q80000gp/T/ipykernel_59212/3890764162.py:7: FutureWarning:

The default value of numeric_only in DataFrameGroupBy.sum is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.
Text(0, 0.5, 'Strømforbruk [kWh]')

e) Om du lusker rundt på denne adressen, vil du kanskje finne en ganske ny varmepumpe. Kan du med informasjon om strømforbruk og temperatur fastslå omtrent når denne ble installert?

Løsningsforslag
dag_varmepumpe = 16
forbruk_per_dag["is_varmepumpe"] = [0] * dag_varmepumpe+[1] * (31-dag_varmepumpe)

x = df_temp["value"]
y = forbruk_per_dag["KWH 60 Forbruk"]

plt.scatter(x, y, c=forbruk_per_dag["is_varmepumpe"])