Als beginner in python kost het tijd om te snappen hoe python code werkt en hoe je data kunt analyseren met behulp van python libraries zoals pandas en numpy. Zeker als het je eigen data betreft, is het uitdagend om te kijken wat je uit de analyse van je eigen dataset aan informatie kunt ophalen. Voor het maken van grafieken en analyses, is enige basiskennis van python wel zo handig. Op dataquest kun je een tutorial volgen en de eerste stappen zetten als python programmeur.

Welke analyses wil je uitvoeren?

Eerst moeten we bepalen welke data we willen analyseren. We nemen hier de data van het weerstation P41_Ermelo als uitgangspunt.

  • Dagelijks voor het tonen van de actuele waarnemingen op deze site en als samenvatting in de zijbalk bij berichten en pagina’s op adagia.eu.
  • Maandelijks voor het maken van een samenvatting van het weer over de afgelopen maand en voor het tonen van grafieken
Gebruik van een API

Het weerstation beschikt over een uploadfaciliteit via internet. Het station verstuurt de weerdata naar de cloud van wunderground.com en weathercloud.net. Op deze websites is de weerinformatie op overzichtelijke wijze te vinden in de vorm van grafieken of tabellen.

Figuur 1 Actuele waarnemingen via weathercloud.net

Via de API van wunderground.com zijn de waarnemingen real-time beschikbaar: de weerdata die het weerstation uploadt naar de cloud van Wunderground worden ogenblikkelijk beschikbaar gesteld in de API. Je kunt kiezen uit de actuele waarnemingen of de waarnemingen van de afgelopen zeven dagen. Elke tien minuten worden de data in de API ververst. Het zou natuurlijk leuk zijn om deze data te ‘streamen’ naar de website. Maar hoe doe je dat? Op de API help pagina van Wunderground wordt uitgelegd welke parameters nodig zijn om de betreffende informatie te verkrijgen. Je moet het station ID invullen, evenals de API key die in de persoonlijke login omgeving van wunderground.com te vinden is. Om de eenheden in standaardeenheden (metrics) weer te geven, moet de variabele ‘units’ gelijk aan ‘m’ worden gesteld. De URL wordt dan zoiets als dit:

https://api.weather.com/v2/pws/dailysummary/7day?stationId=YYYYYYYY&format=json&units=m&apiKey=a1ecb98658xxxxxxxxxxxxxxxxaa9782

Met de applicatie van postman kun je achterhalen wat het benodigde python commando is om de informatie op te halen. Voer de url in onder de optie ‘GET’ die resulteert in een code snippet (</>) aan de rechterkant van de pagina. Als voorbeeld de door postman gegenereerde code snippet om de informatie uit de url op te halen:

import requests
url = "https://api.weather.com/v2/pws/dailysummary/7day?stationId=YYYYYYY&format=json&units=m&apiKey=a1ecb98658xxxxxxxxxxxxxxxxxxxx9782"
payload={}
headers = {}
response = requests.request("GET", url, headers=headers, data=payload)
df = pd.read_json(response)
Deze informatie resulteert in een JSON bestand wat met behulp van pandas in een dataframe wordt omgezet. De opmaak van het JSON bestand kun je gemakkelijk uitlezen in jsoneditor.org.
Op de site van adagia.eu is de API informatie niet in een python script ontvangen, maar via een WordPress plugin JSON Content Importer. De waarden uit het via de API verkregen JSON bestand zijn weergegeven onder actuele waarnemingen en onder de terugblik over de afgelopen zeven dagen.
Gebruik van pandas bij een csv bestand
De API biedt niet alle data via haar portal aan. Data over de afgelopen maanden is alleen via een cvs bestand verkrijgbaar. Voor meer inzicht in het weer is dus iets anders nodig. We gaan kijken hoe we een CSV bestand kunnen importeren via de pandas library. Hieronder volgen enkele onderdelen van het programma waarmee de maandoverzichten worden gegenereerd. De gehele code is te raadplegen in dit python bestand.
#lees het bestand in dat via app.weathercloud.net gedownload is)
print("GEEF DE BESTANDSNAAM INCL HET PAD, bijvoorbeeld: 'C:/....../Weathercloud P41_Ermelo 2021-01.csv' \n")
file = input('Hoe heet het bestand (csv-formaat)? ')
#index o.b.v. datum-string, delimiter is een punt-komma en de decimaal moet een punt zijn
df = pd.read_csv(file, delimiter=';', header=0, parse_dates=True, infer_datetime_format=True, dayfirst=True, encoding='utf-16-le', decimal=',', thousands='.')
De opmaak van een CSV bestand komt soms nauw. Meestal worden de datavelden gescheiden door een komma; in Europese csv bestanden is het scheidingsteken een ‘;’ . Dan moet je dit bij het attribuut delimiter juist opgeven. Na inlezen van het csv bestand in een dataframe kan het dataframe worden opgeschoond, de gewenste variabelen geselecteerd en geïnspecteerd hoe het dataframe eruit ziet via df.head(). De seaborn library geeft mooie grafieken. Zie onderstaand voorbeeld voor het afbeelden van temperatuurverloop in de maand.
#temperatuurverloop / lijndiagram
plt.title("temperatuur gedurende de maand")
sns.lineplot(data=df, y='tempuit', x='dag', color="red", linewidth=1)
plt.xlabel("Dag")
plt.ylabel("Temperatuur (°C)")
plt.savefig('C:/..../plaatjes/temperatuur.png', dpi=400)
#plt.show()
plt.clf()
Opschonen

Regelmatig komt python bij de uitvoering van de code data tegen die niet het juiste format hebben. Zo zijn de datums weergegeven als “2013-03-07 00:00:00 +01:00”. De tijdzone aanduiding (+01:00) is niet nodig. Laten we kijken hoe we deze aanduiding kunnen verwijderen met de volgende functie. Als in het dataveld een waarde aanwezig is, dan wordt +01:00 vervangen door niets (dus zonder karakters). Er wordt een nieuwe geschoonde datumreeks opgebouwd (lijst s) die vervolgens als series in panda geïmporteerd wordt met de aanduiding ‘datum_nieuw_weer’.

#functie om de data string te schonen
def schoning(utc):
if utc != "":
utc = str(utc)
utc = utc.replace("+01:00","")
return utc

#reeks met de nieuwe geschoonde data
s = []

#haal data string op, cel voor cel, uit kolom 'datum' en zet geschoonde datum in reeks s 
for i in cum['datum']:
i = schoning(i)
s.append(i)

#maak een nieuwe Series aan met de nieuwe datums
datum_nieuw_weer = pd.Series(s, name='Datum_Nieuw_Weer', dtype='object')
De serie ‘datum_nieuw_weer’ wordt als kolom aan het bestaande dataframe ‘cum’ toegevoegd.
#voeg de Series als kolom toe aan de maand-data
weer = pd.concat([cum, datum_nieuw_weer], axis=1)
weer = weer.assign(energie=0)
Toewijzen van zonne-energie data aan het weer dataframe
Met zonnepanelen wekken we energie op. Deze geproduceerde hoeveelheid energie wordt per dag bijgehouden en is op te vragen in een CSV bestand. Ook hier blijkt het datum veld ‘ingewikkeld’ in elkaar te zitten. Gelukkig kunnen we de voorgaande functie opnieuw toepassen om deze datumvelden op te schonen en passen we deze ook toe op het zonne-energie dataframe. De datumgegevens worden als een nieuwe kolom aan het zonne-energie dataframe zon toegevoegd.
#zelfde schoning als bij het weer dataframe
u = []

for j in zon['datum']:
j = schoning(j)
u.append(j)

datum_nieuw_zon = pd.Series(u, name='Datum_Nieuw_Zon', dtype='object')
zon = pd.concat([zon, datum_nieuw_zon], axis=1)

Nu kan de geproduceerde energie per dag worden gematcht met de dagen in het weer dataframe; op dezelfde dag van het weer dataframe wordt de energie van de corresponderende dag in het energie dataframe ingevoegd. Dit gebeurt door middel van een loop (for k in zon; for l in weer).

#bepaal de gelijke datumvelden in beide dataframes weer en zon
#zodat energie waarde uit df zon kan worden gematcht met
#de datum uit df weer
#maak een lijst van de corresponderende datumvelden: dit zijn de indexen
#om de energie waarde op de juiste plek uit df zon te halen en naar df weer te verplaatsen
check = []
for k in zon['Datum_Nieuw_Zon']:
    for l in weer['Datum_Nieuw_Weer']:
        if k == l:
            check.append(k)
            print("overeenkomst op ", k)
    #print('geen gelijkenis gevonden, volgende element in zon')
print(check)

#haal de energie waarde uit df zon op
#plaats deze waarde in de kolom 'energie' van df weer
for elem in check:
    a = zon.index[zon.Datum_Nieuw_Zon == elem]
    index_zon = a[0]
    e = zon["energie"][index_zon]
    b = weer.index[weer.Datum_Nieuw_Weer == elem]
    index_data = b[0]
    weer.iloc[index_data,-1] = e
print(weer["energie"])
Nu beschikt het weer dataframe over een kolom met de geproduceerde energie waarden. Zo kunnen we op termijn kijken op welke wijze de energie samenhangt met de weer variabelen.