Verarbeitung und Vorverarbeitung vom Datensatz Teil 4

In diesem Abschnitt wird der Datensatz bearbeitet. Die Daten befinden sich noch im Rohzustand, für eine weitere Verarbeitung, werden sie in bestimmte Formate umgewandelt.

Anschließend werden die Messdaten mit Python analysiert. Für die Umsetzung wird das Pandas Framework genutzt. Hauptbestandteil ist die Klasse DataFrame, mit der sich zweidimensionale Tabellen, die aus Zeilen und Spalten bestehen, aufbereiten und umarbeiten lassen. Die Datei messwerte.txt liefert Hinweise, wie die Datei in Python geladen werden soll. Deutschland verwendet ein Komma (,) als Dezimaltrennzeichen. Die meisten europäischen Länder, trennen mit ‚;“ anstatt ‚,‘ und das Dezimaltrennzeichen ist ‚,‘ statt ‚.‘

Datum;Zeit;Kohlendioxid (CO2)[mg/m³];Temperatur[°C];Luftdruck[hPa]

01.12.2019;01:00;867;-3,5;1023

01.12.2019;02:00;885;-3,6;1023

Die Rohdaten stellen folgenden Aufgaben:

Der Datentyp muss von Objekt in Zahl umwgewandelt werden. Die Datumspalte und Zeitspalte in ein Datumsformat bringen („%d-%m-%y %H:%M“).

Die pandas Bibliothek wird geladen und mit mit pd abgekürzt.

Stand: 27.04.2021

import pandas as pd

Die Messdaten einlesen (pd.read_csv) und die Zellen mit ‚;‘ trennen. Dezimaltrennzeichen ‚,‘ ( sep=‘;‘ , decimal=‘,‘).

df_wasserkuppe = pd.read_csv('daten/messwerte_wasserkuppe.txt', sep = ';' , decimal = ',')

Die head-Methode liefert eine Übersicht über die ersten fünf Zeilen.

df_wasserkuppe.head()
DatumZeitKohlendioxid (CO2)[mg/m³]Temperatur[°C]Luftdruck[hPa]Windgeschwindigkeit[m/s]Windrichtung[Grad]Niederschlag[mm/30min]Globalstrahlung[W/m²]
005.07.200001:00-9,7-12,6--1
105.07.200002:00-9,8-10,8--1
205.07.200003:00-9,7-11,0--1
305.07.200004:00-9,4-12,8--1
405.07.200005:00-8,8-12,6--1

Beim Einlesen von Daten versucht Pandas, die Daten automatisch in ein Zahlenformat (Integer oder Floats) zu konvertieren. Mit df.dtypes erhalten wir den entsprechenden Datentyp. Für die Messparameter und das Datum ist das nicht gelungen. Für die Verarbeitungsschritte, die uns noch bevorstehen, ist dieses Format ungeeignet.

df_wasserkuppe.dtypes
Datum                        object
Zeit                         object
Kohlendioxid (CO2)[mg/m³]    object
Temperatur[°C]               object
Luftdruck[hPa]               object
Windgeschwindigkeit[m/s]     object
Windrichtung[Grad]           object
Niederschlag[mm/30min]       object
Globalstrahlung[W/m²]        object
dtype: object

Die Dezimaltrennzeichen in Spalte Temperatur[°C] ‘,’ mit ‘.’ tauschen und erstelle eine neue Spalte Temperatur (df[‘Temperatur’]). (x.replace)

df_wasserkuppe['Temperatur'] = [x.replace(',' , '.') for x in df_wasserkuppe['Temperatur[°C]']]
df_wasserkuppe.head()
DatumZeitKohlendioxid (CO2)[mg/m³]Temperatur[°C]Luftdruck[hPa]Windgeschwindigkeit[m/s]Windrichtung[Grad]Niederschlag[mm/30min]Globalstrahlung[W/m²]Temperatur
005.07.200001:00-9,7-12,6--19.7
105.07.200002:00-9,8-10,8--19.8
205.07.200003:00-9,7-11,0--19.7
305.07.200004:00-9,4-12,8--19.4
405.07.200005:00-8,8-12,6--18.8

Die Datenreihe Luftdruck[hPa], Temperatur und Kohlendioxid (CO2)[mg/m³] von object zu float umwandeln, und erstelle eine neue Spalten namens Luftdruck, Temperatur und Kohlendioxid. (pd.to_numeric) Der Parameter errors=’coerce’ wandelt ‘-‘ und andere Parsingfehler zu NaN (Not a Number) um.

Pandas-Operationen wie to_numeric arbeiten standardmäßig nicht “in-place”. Deswegen werden die Ergebnisse, einer neuen Spalte zugewiesen.

df_wasserkuppe['Luftdruck'] = pd.to_numeric(df_wasserkuppe['Luftdruck[hPa]'], errors = 'coerce')

df_wasserkuppe['Temperatur'] = pd.to_numeric(df_wasserkuppe['Temperatur'], errors = 'coerce')

df_wasserkuppe['Kohlendioxid'] = pd.to_numeric(df_wasserkuppe['Kohlendioxid (CO2)[mg/m³]'], errors = 'coerce')
df_wasserkuppe.head()
DatumZeitKohlendioxid (CO2)[mg/m³]Temperatur[°C]Luftdruck[hPa]Windgeschwindigkeit[m/s]Windrichtung[Grad]Niederschlag[mm/30min]Globalstrahlung[W/m²]TemperaturLuftdruckKohlendioxid
005.07.200001:00-9,7-12,6--19.7NaNNaN
105.07.200002:00-9,8-10,8--19.8NaNNaN
205.07.200003:00-9,7-11,0--19.7NaNNaN
305.07.200004:00-9,4-12,8--19.4NaNNaN
405.07.200005:00-8,8-12,6--18.8NaNNaN
df_wasserkuppe.tail()
DatumZeitKohlendioxid (CO2)[mg/m³]Temperatur[°C]Luftdruck[hPa]Windgeschwindigkeit[m/s]Windrichtung[Grad]Niederschlag[mm/30min]Globalstrahlung[W/m²]TemperaturLuftdruckKohlendioxid
17459504.06.202020:007358,89944,9-0,0188.8994.0735.0
17459604.06.202021:007378,89955,4--38.8995.0737.0
17459704.06.202022:007398,89955,9-0,418.8995.0739.0
17459804.06.202023:007407,69957,4-0,217.6995.0740.0
17459904.06.202024:007376,59956,6-0,016.5995.0737.0
df_wasserkuppe.dtypes
Datum                         object
Zeit                          object
Kohlendioxid (CO2)[mg/m³]     object
Temperatur[°C]                object
Luftdruck[hPa]                object
Windgeschwindigkeit[m/s]      object
Windrichtung[Grad]            object
Niederschlag[mm/30min]        object
Globalstrahlung[W/m²]         object
Temperatur                   float64
Luftdruck                    float64
Kohlendioxid                 float64
dtype: object

Für die weitere Datenverarbeitung, zum Beispiel für FP Prophet, wird ein bestimmtes Datumsformat benötigt. Zur ‘Zeit’spalte wird “:00” hinzugeügt, ohne Sekundenformat gibt es eine Fehlermeldung. 1

Prophet ist eine Open-Source-Software, die vom Core Data Science-Team von Facebook veröffentlicht wurde. Prophet ist für die Prognose von Zeitreihendaten geeignet.

df_wasserkuppe['Sekundenformat'] = df_wasserkuppe['Zeit'] + ':00'

Die Pandas-Funktion to_datetime wird genutzt, um datumsspezifische Operationen durchführen zu können.

df_wasserkuppe['DatumYDM'] = pd.to_datetime(df_wasserkuppe.Datum)

Pandas wird informiert, dass die zu lesenden Werte nacheinander Angaben zum Tag, Monat, Jahr beinhalten.

df_wasserkuppe["DatumMDY"] = df_wasserkuppe["DatumYDM"].dt.strftime("%d-%m-%y")

Die Spalte Sekundenformat in 0 Tage 01:00:00 wird umgewandelt. (zählt Stunden bis 24 und beginnt bei 0 Tage)

df_wasserkuppe['Stundenzaehler'] = pd.to_timedelta(df_wasserkuppe.Sekundenformat)

Zur Spalte DatumMDY die Spalte Stundenzaehler addiert = 2019-12-01 01:00:00

df_wasserkuppe['DatumStundenzaehler'] = pd.to_datetime(df_wasserkuppe.DatumMDY) + pd.to_timedelta(df_wasserkuppe.Stundenzaehler)

Das Datumsformat wird in 01-12-2019 01:00 umgwandelt

df_wasserkuppe["DatumFinal"] = df_wasserkuppe["DatumStundenzaehler"].dt.strftime("%d-%m-%y %H:%M")

Die folgenden Spalten werden gelöscht:

df_wasserkuppe = df_wasserkuppe.drop(columns = ['Datum', 'Zeit','Sekundenformat','Kohlendioxid (CO2)[mg/m³]','Temperatur[°C]','Luftdruck[hPa]','DatumYDM','DatumMDY','Stundenzaehler','DatumStundenzaehler'])
df_wasserkuppe = df_wasserkuppe.drop(columns=['Windgeschwindigkeit[m/s]', 'Windrichtung[Grad]','Niederschlag[mm/30min]','Globalstrahlung[W/m²]'])

Die Spalte DatumFinal in Datum umbenennen.

df_wasserkuppe = df_wasserkuppe.rename(columns={'DatumFinal' : 'Datum'})

Die Spalte Datum als Index setzen, dadurch werden die Vorzüge der Datumsklasse genutzt.

df_wasserkuppe = df_wasserkuppe.set_index('Datum')

Das Ergebnis: Das Datum wurde als nutzbares Datumsformat umgewandelt. Die Temperatur, Luftdruck und Kohlendioxid sind im Zahlenformat und NaN Werte für fehlende Daten.

df_wasserkuppe.head()
TemperaturLuftdruckKohlendioxid
Datum
05-07-00 01:009.7NaNNaN
05-07-00 02:009.8NaNNaN
05-07-00 03:009.7NaNNaN
05-07-00 04:009.4NaNNaN
05-07-00 05:008.8NaNNaN
df_wasserkuppe.dtypes
Temperatur      float64
Luftdruck       float64
Kohlendioxid    float64
dtype: object
df_wasserkuppe.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 174600 entries, 2000-05-07 01:00:00 to 2020-05-06 00:00:00
Data columns (total 4 columns):
 #   Column        Non-Null Count   Dtype  
---  ------        --------------   -----  
 0   Datum         174600 non-null  object 
 1   Temperatur    173564 non-null  float64
 2   Luftdruck     76646 non-null   float64
 3   Kohlendioxid  154136 non-null  float64
dtypes: float64(3), object(1)
memory usage: 6.7+ MB

Zusammenfassung:

df_wasserkuppe['Temperatur'] = [x.replace(',', '.') for x in df_wasserkuppe['Temperatur[°C]']]
df_wasserkuppe['Luftdruck'] = pd.to_numeric(df_wasserkuppe['Luftdruck[hPa]'], errors='coerce')
df_wasserkuppe['Temperatur'] = pd.to_numeric(df_wasserkuppe['Temperatur'], errors='coerce')
df_wasserkuppe['Kohlendioxid'] = pd.to_numeric(df_wasserkuppe['Kohlendioxid (CO2)[mg/m³]'], errors='coerce')
df_wasserkuppe['Sekundenformat'] = df_wasserkuppe['Zeit'] + ':00'
df_wasserkuppe['DatumYDM'] = pd.to_datetime(df_wasserkuppe.Datum)
df_wasserkuppe["DatumMDY"] = df_wasserkuppe["DatumYDM"].dt.strftime("%d-%m-%y")
df_wasserkuppe['Stundenzaehler'] = pd.to_timedelta(df_wasserkuppe.Sekundenformat)
df_wasserkuppe['DatumStundenzaehler'] = pd.to_datetime(df_wasserkuppe.DatumMDY) + pd.to_timedelta(df_wasserkuppe.Stundenzaehler)
df_wasserkuppe["DatumFinal"] = df_wasserkuppe["DatumStundenzaehler"].dt.strftime("%d-%m-%y %H:%M")
df_wasserkuppe = df_wasserkuppe.drop(columns=['Datum', 'Zeit','Sekundenformat','Kohlendioxid (CO2)[mg/m³]','Temperatur[°C]','Luftdruck[hPa]','DatumYDM','DatumMDY','Stundenzaehler','DatumStundenzaehler'])
df_wasserkuppe = df_wasserkuppe.drop(columns=['Windgeschwindigkeit[m/s]', 'Windrichtung[Grad]','Niederschlag[mm/30min]','Globalstrahlung[W/m²]'])
df_wasserkuppe = df_wasserkuppe.rename(columns={'DatumFinal': 'Datum'})
df_wasserkuppe = df_wasserkuppe.set_index('Datum')
df_wasserkuppe.head()

Die Ergebnisse als csv speichern.

df_wasserkuppe.to_csv('daten/wasserkuppe.csv')

Quellenangaben:

  1. Webseite: https://facebook.github.io/prophet/