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()
Datum | Zeit | Kohlendioxid (CO2)[mg/m³] | Temperatur[°C] | Luftdruck[hPa] | Windgeschwindigkeit[m/s] | Windrichtung[Grad] | Niederschlag[mm/30min] | Globalstrahlung[W/m²] | |
---|---|---|---|---|---|---|---|---|---|
0 | 05.07.2000 | 01:00 | - | 9,7 | - | 12,6 | - | - | 1 |
1 | 05.07.2000 | 02:00 | - | 9,8 | - | 10,8 | - | - | 1 |
2 | 05.07.2000 | 03:00 | - | 9,7 | - | 11,0 | - | - | 1 |
3 | 05.07.2000 | 04:00 | - | 9,4 | - | 12,8 | - | - | 1 |
4 | 05.07.2000 | 05: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()
Datum | Zeit | Kohlendioxid (CO2)[mg/m³] | Temperatur[°C] | Luftdruck[hPa] | Windgeschwindigkeit[m/s] | Windrichtung[Grad] | Niederschlag[mm/30min] | Globalstrahlung[W/m²] | Temperatur | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 05.07.2000 | 01:00 | - | 9,7 | - | 12,6 | - | - | 1 | 9.7 |
1 | 05.07.2000 | 02:00 | - | 9,8 | - | 10,8 | - | - | 1 | 9.8 |
2 | 05.07.2000 | 03:00 | - | 9,7 | - | 11,0 | - | - | 1 | 9.7 |
3 | 05.07.2000 | 04:00 | - | 9,4 | - | 12,8 | - | - | 1 | 9.4 |
4 | 05.07.2000 | 05:00 | - | 8,8 | - | 12,6 | - | - | 1 | 8.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()
Datum | Zeit | Kohlendioxid (CO2)[mg/m³] | Temperatur[°C] | Luftdruck[hPa] | Windgeschwindigkeit[m/s] | Windrichtung[Grad] | Niederschlag[mm/30min] | Globalstrahlung[W/m²] | Temperatur | Luftdruck | Kohlendioxid | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 05.07.2000 | 01:00 | - | 9,7 | - | 12,6 | - | - | 1 | 9.7 | NaN | NaN |
1 | 05.07.2000 | 02:00 | - | 9,8 | - | 10,8 | - | - | 1 | 9.8 | NaN | NaN |
2 | 05.07.2000 | 03:00 | - | 9,7 | - | 11,0 | - | - | 1 | 9.7 | NaN | NaN |
3 | 05.07.2000 | 04:00 | - | 9,4 | - | 12,8 | - | - | 1 | 9.4 | NaN | NaN |
4 | 05.07.2000 | 05:00 | - | 8,8 | - | 12,6 | - | - | 1 | 8.8 | NaN | NaN |
df_wasserkuppe.tail()
Datum | Zeit | Kohlendioxid (CO2)[mg/m³] | Temperatur[°C] | Luftdruck[hPa] | Windgeschwindigkeit[m/s] | Windrichtung[Grad] | Niederschlag[mm/30min] | Globalstrahlung[W/m²] | Temperatur | Luftdruck | Kohlendioxid | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
174595 | 04.06.2020 | 20:00 | 735 | 8,8 | 994 | 4,9 | - | 0,0 | 18 | 8.8 | 994.0 | 735.0 |
174596 | 04.06.2020 | 21:00 | 737 | 8,8 | 995 | 5,4 | - | - | 3 | 8.8 | 995.0 | 737.0 |
174597 | 04.06.2020 | 22:00 | 739 | 8,8 | 995 | 5,9 | - | 0,4 | 1 | 8.8 | 995.0 | 739.0 |
174598 | 04.06.2020 | 23:00 | 740 | 7,6 | 995 | 7,4 | - | 0,2 | 1 | 7.6 | 995.0 | 740.0 |
174599 | 04.06.2020 | 24:00 | 737 | 6,5 | 995 | 6,6 | - | 0,0 | 1 | 6.5 | 995.0 | 737.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()
Temperatur | Luftdruck | Kohlendioxid | |
---|---|---|---|
Datum | |||
05-07-00 01:00 | 9.7 | NaN | NaN |
05-07-00 02:00 | 9.8 | NaN | NaN |
05-07-00 03:00 | 9.7 | NaN | NaN |
05-07-00 04:00 | 9.4 | NaN | NaN |
05-07-00 05:00 | 8.8 | NaN | NaN |
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:
Webseite: https://facebook.github.io/prophet/ ↩