Lag Profesjonelle Datavisualiseringer med Python, Pandas og Matplotlib

Profilbilde av Felix Sandström, artikkelens forfatter

Felix Sandström

Når du analyserer komplekse datasett, er visualisering nøkkelen til å gjøre innsiktene lett tilgjengelige. I dette innlegget viser jeg hvordan jeg brukte Python til å visualisere historiske strømpriser i Norge, fra januar 2019 til november 2024, for ulike soner. For å gjøre dette, brukte jeg to kraftige Python-biblioteker: Pandas for databehandling og Matplotlib for datavisualisering.

Datasettet

Mange statistiske data er lett tilgjengelige på norske nettsteder, som for eksempel Statistisk sentralbyrå. Imidlertid er ikke all informasjon like enkel å finne eller laste ned direkte. I slike tilfeller må man ofte lage sine egne datasett, noe som krever ekstra arbeid for å samle, strukturere og transformere dataene til en brukervennlig form.

For dette prosjektet samlet jeg data fra offentlige nettsider og klargjorde det i en CSV-fil. Tabellen nedenfor viser hvordan dataene så ut på nettsiden før transformasjon:

Opprinnelige data

Et skjermbilde av hvordan dataene så ut på nettsiden.

Steg 1: Datatransformasjon

Datastrukturen måtte transformeres for å gjøre analysen enklere. Originalt hadde datasettet en kolonne per år, og månedene var skrevet på norsk. Målet var å gjøre datasettet mer brukervennlig ved å:

  • Pivotere slik at hver sone fikk sin egen kolonne.
  • Representere datoer i et standardisert format.

Pandas, et bibliotek spesielt laget for databehandling i Python, ble brukt til å håndtere disse operasjonene. Pandas gir oss kraftige datastrukturer som DataFrame, som er perfekt for å håndtere rader og kolonner. Her er hvordan vi begynte:

Lese inn datasettet

Først må vi lese dataen fra CSV-filen:


    import os
    import pandas as pd  # Importerer Pandas, et verktøy for databehandling

    # Setter opp stien til filen
    script_dir = os.path.dirname(os.path.abspath(__file__))  # Finner hvor scriptet kjører
    file_path = os.path.join(script_dir, "electricity_prices_norway_raw.csv")  # Setter riktig filsti

    # Leser inn CSV-filen med Pandas
    df = pd.read_csv(file_path, encoding="latin1")  # Leser CSV-filen, støtter spesialtegn med latin1-encoding

    # Viser de første radene i datasettet
    print(df.head())  # Sjekker de første radene for å bekrefte innholdet
    

Gi kolonnene meningsfulle navn

Datasettet har ofte generiske eller uklare kolonnenavn. Vi gir dem mer forståelige navn:


    df.columns = ["Måned", "Sone", "2024", "2023", "2022", "2021", "2020", "2019"]  # Gir nytt navn til kolonner
    print(df.columns)  # Bekrefter nye kolonnenavn
    

Transformere datasettet

Datasettet var i bredt format med ett år per kolonne. Vi brukte pd.melt til å gjøre det til langformatet:


    df_long = pd.melt(df, id_vars=["Måned", "Sone"], value_vars=["2024", "2023", "2022", "2021", "2020", "2019"], 
                      var_name="År", value_name="Pris")
    print(df_long.head())  # Ser hvordan dataen ser ut etter transformasjon
    

Håndtere norske månednavn

Python forventer engelske månednavn når vi lager datoer. Vi oversatte de norske månedene til engelsk:


    df_long["Måned"] = df_long["Måned"].map({
        "Januar": "January", "Februar": "February", "Mars": "March", 
        "April": "April", "Mai": "May", "Juni": "June", 
        "Juli": "July", "August": "August", "September": "September",
        "Oktober": "October", "November": "November", "Desember": "December"
    })
    print(df_long.head())  # Bekrefter at månedene er oversatt
    

Kombinere år og måned til dato

Deretter kombinerte vi år og måned til en enkelt Dato-kolonne:


    df_long["Dato"] = pd.to_datetime(df_long["År"] + "-" + df_long["Måned"], format="%Y-%B", errors="coerce")
    print(df_long[["Dato", "Pris"]].head())  # Kontrollerer at datoene er opprettet korrekt
    

Pivotere dataen

Til slutt pivotérer vi dataen slik at hver sone får sin egen kolonne:


    df_long = df_long.pivot(index="Dato", columns="Sone", values="Pris").reset_index()
    print(df_long.head())  # Dataen er nå klar for visualisering
    

Steg 2: Visualisering

Når dataen er klar, kan vi lage en graf for å sammenligne prisutviklingen:

Lese bearbeidet data

Først leser vi den bearbeidede dataen fra CSV-filen:


    df = pd.read_csv("electricity_prices_norway_processed.csv", encoding="utf-8")
    df["Dato"] = pd.to_datetime(df["Dato"])  # Sikrer at Dato er i riktig format
    df.set_index("Dato", inplace=True)  # Setter Dato som indeks for enklere plotting
    print(df.head())  # Bekrefter at dataen er riktig lastet
    

Opprett graf

Ved å bruke matplotlib oppretter vi grafen:


    import matplotlib.pyplot as plt

    plt.figure(figsize=(12, 6))  # Setter størrelse på figuren
    for column in df.columns:
        plt.plot(df.index, df[column], marker="o", label=column, linewidth=2, alpha=0.85)  # Plotter hver sone

    plt.title("Strømpriser per sone over tid", fontsize=18, color="#1a1a1a", weight="semibold")
    plt.xlabel("Dato", fontsize=14)
    plt.ylabel("Øre/kWh, inkl. mva", fontsize=14)
    plt.legend(title="Sone", loc="upper left", bbox_to_anchor=(0.02, 0.98), fontsize=10, framealpha=0.9)
    plt.grid(True, linestyle="--", alpha=0.7)
    plt.tight_layout()
    plt.savefig("electricity_prices_plot.png", dpi=300)  # Lagre grafen som PNG
    plt.show()  # Viser grafen
    

Resultat

Grafen nedenfor viser utviklingen av strømpriser for ulike soner i Norge mellom 2019 og 2024. Hver linje representerer en sone.

Strømpriser per sone

Utvikling av strømpriser per sone fra 2019 til 2024. Fram til midten av 2022 fulgte sonene ganske lik prisutvikling, men etterpå steg prisene betydelig for sone 1 og 2 sammenlignet med de andre sonene. Fra 2023 kan man se en viss stabilisering av prisene.

Oppsummering

Denne guiden viser hvordan Python kan brukes til å analysere og visualisere data ved hjelp av Pandas og Matplotlib. Vi hentet strømprisdata, transformerte det fra råformat til en brukervennlig struktur, og visualiserte trender for ulike soner i Norge mellom 2019 og 2024.

Grafen fremhever viktige trender, som prisøkningen i sone 1 og 2 fra midten av 2022 og en viss stabilisering i 2023. Metoden kan brukes på andre datasett for å trekke innsikter og lage oversiktlige visualiseringer.

I kommende artikler planlegger jeg å vise mer interaktive visualiseringsverktøy som Chart.js og D3.js. Disse verktøyene gir mer interaksjon og responsivitet, og tilbyr flere alternativer tilpasset ulike behov. Matplotlib er en av de mer grunnleggende løsningene, men fungerer godt for mange typer analyser.

Vil du prøve selv? Se hele koden på mitt GitHub-repository.

Relaterte Artikler

Kommentarer (0)

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

KONTAKT

Har du spørsmål, ideer eller ønsker å vite mer, er du hjertelig velkommen til å fylle ut kontaktskjemaet, sende en e-post eller ringe.

info@felixwebutvikling.no

+47 40496181

Slettestien 3

4050 Sola

Org.nr: 934 781 864

KONTAKTSKJEMA