Python-klient för smhi-data

/ 2023-01-29 / Projekt

Statens Meteorologiska och Hydrologiska Institut, SMHI, som vid årsskiftet bytte huvudman till Klimat- och näringslivsdepartementet efter 35 år under Miljödepartementet, har sedan andra världskrigets slut tillhandahållit data och modeller över väder- och klimatförhållanden i Sverige. IFKs Mladen Gibanica har med föreningens stöd byggt ett pyton-bibliotek för att genom SMHIs API tillgängliggöra denna data.

Behovet av tillförlitlig klimat- och väderdata är högt, såväl för att kunna energieffektivisera byggnader och skydda infrastruktur och bostäder från extremväder som översvämningar som för att kunna planera förnyelsebara energikällor som vind-, vatten-, och solkraft. SMHI tillhandahåller ett omfattande API (Application Programming Interface - ett sätt att tillgängliggöra data och tjänster för kodutvecklare) för sådan data. Hittills har utvecklare dock fått skriva sina egna applikationer för att läsa in denna data. Genom att tillhandahålla ett öppet bibliotek som förenklar inläsning av sådan data i det moderna programmeringsspråket Python hoppas föreningen kunna bidra till ett mer effektivt klimatomställningsarbete.

"Den kod som finns implementerad i dagsläget läser de fyra mest kritiska API:na", förklarar dr. Mladen Gibanica, som till vardags arbetar som dataanalytiker på Volvo Cars. "Det handlar om MetObs - som läser historisk data från Meteorologiska Observationer, Mesan - en modell som interpolerar fram meterologisk data även där mätdata saknas, MetFcts - som genererar meteorologiska förutsägelser, och Strång - som modellerar solens strålningsintensitet" förklarar Mladen vidare och hänvisar samtidigt till den utomordentliga dokumentationen på SMHIs hemsida.

Ett exempel på hur denna kod kan användas: Låt oss anta att vi vill samla in data över snödjupet i Kiruna. För att kunna läsa data krävs endast att biblioteket installeras och följande självförklarande rader körs:

from smhi.smhi import SMHI
s = SMHI()
s.find_stations_by_city(8, 'Kiruna')
kiruna_station = s.nearby_stations[0]
h1, d1 = s.get_data(8, kiruna_station)

Det visar sig att det finns luckor i dataunderlaget från Kirunas mätstation. Det är då enkelt att be om att täcka dessa med data från den saknade tiden inom en given radie (i exemplet 40km, vilket inkluderar Kiruna flygplats, Jukkasjärvi D, Puoltsa, Kaitum, Esrange, Bergfors och Killingi):

_, d2 = s.get_data(8, kiruna_station, interpolate=40)
Visualisera hämtad data
import plotly.graph_objects as go

index = d1.index.intersection(d2.index)
d2_dropped = d2.drop(index, axis=0)

fig = go.Figure()
fig.add_trace(
    go.Scattergl(
        x=d1.index,
        y=d1["Snödjup"],
        mode="markers",
        name="Kiruna station"
    )
)
fig.add_trace(
    go.Scattergl(
        x=d2_dropped.index,
        y=d2_dropped["Snödjup"],
        mode="markers",
        name="Interpolerat, radie 40 km"
    )
)
fig.update_layout(
    title='Historiskt snödjup i Kiruna',
    xaxis_title="År",
    yaxis_title="Snödjup [m]",
    legend={"orientation": "h"},
    margin={"l": 0, "r": 0, "b": 80, "t": 100}
)

fig.show()

Historisk data över uppmätt snödjup i Kiruna. Från SMHI, genererad med hjälp av ifk-smhi, ett pytonbibliotek utvecklat av föreningen Ingenjörsarbete För Klimatet.

Programkoden, som är gratis och öppen för alla att använda och modifiera, finns tillgänglig på Ingenjörsarbete För Klimatets GitHub. Ladda ner och prova!

Saknar du en funktion i koden? Meddela oss så ska vi göra vårt bästa för att åtgärda detta! Du är också varmt välkommen att bidra själv; ansök om medlemskap i föreningen via GitHub eller via e-mail.

(c) Ingenjörsarbete för Klimatet. För återpublicering kontakta ansvarig utgivare Anders Nord anders.nord@ingenjorsarbeteforklimatet.se.