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.
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=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
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=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
payload={}
headers = {}
response = requests.request("GET", url, headers=headers, data=payload)
df = pd.read_json(response)
Gebruik van pandas bij een csv 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='.')
#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')
#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
#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"])