Einfache Datenanalyse mit Pandas¶
Tabellarische Daten einlesen, analysieren und für typische Administrations- und Reportingaufgaben auswerten.
Im Alltag von Systemadministratoren und DevOps Engineers fallen regelmäßig größere Datenmengen an. Logdateien, Inventarlisten, Monitoringdaten, CSV-Exporte oder API-Antworten müssen ausgewertet, gefiltert und zusammengefasst werden.
Für kleine Aufgaben reichen Listen und Dictionaries häufig aus. Sobald jedoch größere Tabellen verarbeitet werden müssen, bietet Pandas deutlich leistungsfähigere Werkzeuge.
Pandas gehört zu den wichtigsten Bibliotheken im Python-Ökosystem und ermöglicht das komfortable Arbeiten mit tabellarischen Daten. Daten können aus CSV-, Excel- oder JSON-Dateien geladen, gefiltert, aggregiert und analysiert werden.
In diesem Kapitel lernen Sie die wichtigsten Grundlagen kennen, um typische Administrations- und Reportingaufgaben mit Pandas effizient umzusetzen.
Daten aus CSV, Excel und JSON einlesen¶
Daten aus CSV-Dateien einlesen¶
CSV-Dateien sind eines der am häufigsten genutzten Formate für tabellarische Daten in der Systemadministration, etwa bei Exporten von Monitoring-Tools oder Inventarisierungslisten. Python bietet mit der Bibliothek pandas eine einfache Möglichkeit, solche Dateien in sogenannte DataFrames zu laden – strukturierte Tabellen, die sich bequem weiterverarbeiten lassen.
import pandas as pd
# CSV-Datei mit Serverinventar laden
df = pd.read_csv('server_inventar.csv')
print(df.head()) # zeigt die ersten 5 Zeilen
Wichtig ist, dass pandas automatisch die Spaltenüberschriften erkennt, falls vorhanden. Falls nicht, können Sie mit dem Parameter header=None arbeiten und eigene Spaltennamen vergeben.
Excel-Dateien verarbeiten¶
Excel-Dateien (.xlsx) sind in der IT-Administration ebenfalls verbreitet, z.B. bei Asset-Management oder Betriebsdaten. pandas kann auch Excel-Dateien direkt einlesen, wobei Sie angeben können, welches Tabellenblatt geladen werden soll.
# Excel-Datei mit mehreren Tabellenblättern
excel_path = 'netzwerk_geräte.xlsx'
df = pd.read_excel(excel_path, sheet_name='Inventar')
print(df.info()) # Übersicht der geladenen Daten
Falls Sie nur einen Teil der Daten benötigen, können Sie mit Parametern wie usecols gezielt Spalten auswählen, was Ladezeit und Speicherbedarf reduziert.
JSON-Daten importieren¶
JSON ist ein flexibles Format, das häufig bei API-Antworten oder Logdaten verwendet wird. pandas kann JSON-Dateien laden, wenn diese als Liste von Objekten (ähnlich einer Tabelle) strukturiert sind.
# JSON-Datei mit Monitoring-Daten
json_path = 'monitoring_logs.json'
df = pd.read_json(json_path)
print(df.head())
Falls die JSON-Struktur verschachtelt ist, kann es nötig sein, sie vor dem Laden mit Python-Standardmodulen wie json zu entpacken und dann gezielt in einen DataFrame umzuwandeln.
Best Practices¶
- Prüfen Sie vor dem Einlesen die Kodierung der Datei (z.B. UTF-8), um Fehler zu vermeiden:
pd.read_csv('file.csv', encoding='utf-8') - Bei großen Dateien hilft
chunksize, um die Daten in Teilen zu laden und so Speicher zu sparen. - Nutzen Sie
df.info()unddf.head(), um die Struktur und ersten Datenzeilen zu prüfen.
Mit diesen Grundlagen können Sie tabellarische Daten aus den wichtigsten Formaten zuverlässig in Python laden und für Ihre Automatisierungs- und Reporting-Aufgaben weiterverarbeiten.
Daten filtern und sortieren¶
Daten filtern: Relevante Datensätze auswählen¶
Beim Arbeiten mit großen Datenbeständen ist es oft nötig, nur bestimmte Zeilen auszuwählen, die bestimmte Bedingungen erfüllen. In Pandas geschieht das über boolesche Filter, die man auf DataFrames anwendet.
Ein typisches Szenario: Sie haben eine Inventarliste von Servern mit Spalten wie Hostname, Status, IP-Adresse und Letztes_Update. Sie möchten nur die Server sehen, die aktuell offline sind.
import pandas as pd
daten = {
'Hostname': ['srv01', 'srv02', 'srv03', 'srv04'],
'Status': ['online', 'offline', 'online', 'offline'],
'IP': ['10.0.0.1', '10.0.0.2', '10.0.0.3', '10.0.0.4'],
'Letztes_Update': ['2024-06-01', '2024-05-30', '2024-06-02', '2024-05-28']
}
df = pd.DataFrame(daten)
# Filter: nur Server mit Status 'offline'
offline_server = df[df['Status'] == 'offline']
print(offline_server)
Das Ergebnis zeigt nur die Zeilen, bei denen die Bedingung Status == 'offline' wahr ist.
Mehrere Bedingungen kombinieren¶
Man kann auch komplexere Filter mit & (und), | (oder) und ~ (nicht) erstellen. Wichtig: Jede Bedingung muss in Klammern stehen.
# Server offline oder letztes Update älter als 2024-06-01
filter_bedingung = (df['Status'] == 'offline') | (df['Letztes_Update'] < '2024-06-01')
gefilterte_server = df[filter_bedingung]
print(gefilterte_server)
Daten sortieren: Übersicht durch Reihenfolge schaffen¶
Sortieren hilft, Daten übersichtlich darzustellen oder z.B. die ältesten Updates zuerst zu sehen.
# Nach Letztem_Update aufsteigend sortieren
sortiert = df.sort_values(by='Letztes_Update')
print(sortiert)
# Nach Status absteigend und dann Hostname aufsteigend sortieren
sortiert_mehrfach = df.sort_values(by=['Status', 'Hostname'], ascending=[False, True])
print(sortiert_mehrfach)
Kennzahlen berechnen: Schnelle Auswertungen¶
Neben Filtern und Sortieren sind einfache Kennzahlen oft gefragt, z.B. wie viele Server offline sind.
anzahl_offline = (df['Status'] == 'offline').sum()
print(f"Anzahl offline Server: {anzahl_offline}")
Oder die Anzahl unterschiedlicher IP-Adressen:
Zusammenfassung¶
- Verwenden Sie DataFrame-Filter mit booleschen Bedingungen, um gezielt relevante Zeilen auszuwählen.
- Kombinieren Sie Bedingungen mit
&,|und~für komplexere Filter. - Nutzen Sie
sort_values, um Daten übersichtlich zu ordnen. - Berechnen Sie einfache Kennzahlen direkt mit Pandas-Funktionen.
- Pandas erleichtert die Arbeit mit tabellarischen Daten im Administrationsalltag gegenüber klassischen Shell-Methoden erheblich.
Daten bereinigen¶
Fehlende Werte erkennen und behandeln¶
In der Praxis sind Daten aus Monitoring- oder Inventarsystemen häufig unvollständig. Sensoren können ausfallen, Logs fehlen oder Datensätze sind unvollständig. Pandas bietet einfache Methoden, um fehlende Werte zu identifizieren und zu bearbeiten.
import pandas as pd
daten = pd.DataFrame({
'Server': ['srv01', 'srv02', 'srv03', 'srv04'],
'CPU_Usage': [55, None, 70, 65], # None steht für fehlenden Wert
'RAM_Usage': [70, 80, None, 60]
})
# Fehlende Werte anzeigen
print(daten.isna())
# Anzahl fehlender Werte je Spalte
print(daten.isna().sum())
Warum ist das wichtig?¶
Fehlende Werte können Berechnungen verfälschen oder Fehler verursachen. Zum Beispiel führt die Berechnung des Durchschnitts ohne Behandlung fehlender Werte zu falschen Ergebnissen.
Fehlende Werte auffüllen oder entfernen¶
Es gibt verschiedene Strategien:
- Entfernen: Datensätze mit fehlenden Werten löschen
- Auffüllen: Fehlende Werte mit sinnvollen Standardwerten ersetzen
# Entfernen aller Zeilen mit fehlenden Werten
daten_sauber = daten.dropna()
# Fehlende Werte mit 0 ersetzen (z.B. bei CPU-Auslastung)
daten_ersetzt = daten.fillna(0)
# Fehlende Werte mit Mittelwert der Spalte auffüllen
daten['CPU_Usage'] = daten['CPU_Usage'].fillna(daten['CPU_Usage'].mean())
Hinweis¶
Beim Auffüllen mit Mittelwerten sollte man sicherstellen, dass dies für die jeweilige Metrik sinnvoll ist. Für Statuswerte oder Kategorien ist dies oft nicht geeignet.
Fehlerhafte oder inkonsistente Einträge erkennen¶
In Inventardaten können Tippfehler oder unerwartete Werte auftauchen, z.B. falsche Statusangaben oder ungültige IP-Adressen.
daten = pd.DataFrame({
'Server': ['srv01', 'srv02', 'srv03'],
'Status': ['online', 'offine', 'online'] # Tippfehler bei 'offine'
})
# Einfache Überprüfung auf erlaubte Werte
erlaubte_status = ['online', 'offline', 'wartung']
fehlerhafte_eintraege = daten[~daten['Status'].isin(erlaubte_status)]
print(fehlerhafte_eintraege)
Korrektur¶
Man kann fehlerhafte Einträge manuell korrigieren oder automatisiert ersetzen:
# Automatische Korrektur (Beispiel: 'offine' zu 'offline')
daten['Status'] = daten['Status'].replace({'offine': 'offline'})
Duplikate entfernen¶
Doppelte Einträge können bei Inventarlisten oder Logdaten vorkommen und sollten entfernt werden:
daten = pd.DataFrame({
'Server': ['srv01', 'srv02', 'srv01'],
'IP': ['10.0.0.1', '10.0.0.2', '10.0.0.1']
})
# Duplikate finden
print(daten.duplicated())
# Duplikate entfernen
daten_einzigartig = daten.drop_duplicates()
Zusammenfassung¶
- Fehlende Werte mit
isna()erkennen - Fehlende Werte mit
dropna()entfernen oder mitfillna()auffüllen - Fehlerhafte Werte mit
isin()identifizieren und mitreplace()korrigieren - Duplikate mit
duplicated()finden und mitdrop_duplicates()entfernen
Diese Techniken sind essenziell, um Daten aus verschiedenen Quellen zuverlässig und automatisiert für Monitoring, Reporting oder Inventarisierung vorzubereiten. Im Vergleich zu Shell-Skripten erlaubt Pandas eine übersichtliche und flexible Handhabung großer Tabellen, ohne komplexe Textmanipulationen.
Reporting und Auswertungen¶
Daten zusammenfassen und gruppieren¶
In der Systemadministration ist es häufig nötig, große Mengen an Monitoring- oder Inventardaten zu verdichten, um aussagekräftige Berichte zu erzeugen. Pandas bietet dafür die Methode groupby(), mit der Sie Daten nach einem oder mehreren Kriterien gruppieren und anschließend aggregieren können.
Beispiel: Aus einer Liste von Server-Logs sollen die durchschnittlichen CPU-Auslastungen pro Server ermittelt werden.
import pandas as pd
# Beispiel-Daten: Logs mit Servername und CPU-Auslastung
logs = pd.DataFrame({
'server': ['srv01', 'srv02', 'srv01', 'srv03', 'srv02', 'srv01'],
'cpu_load': [55, 70, 60, 30, 65, 58],
'timestamp': pd.to_datetime([
'2024-06-01 10:00', '2024-06-01 10:05', '2024-06-01 10:10',
'2024-06-01 10:15', '2024-06-01 10:20', '2024-06-01 10:25'
])
})
# Durchschnittliche CPU-Auslastung je Server berechnen
cpu_avg = logs.groupby('server')['cpu_load'].mean().reset_index()
print(cpu_avg)
Ausgabe:
Dieses Vorgehen ist in Shell-Skripten oft umständlich, da Sie dort meist Zeile für Zeile parsen und manuell aggregieren müssen.
Mehrstufige Auswertungen mit Filtern und Sortierung¶
Nach der Gruppierung wollen Sie oft nur bestimmte Ergebnisse betrachten, z.B. Server mit hoher Auslastung. Pandas erlaubt das einfache Filtern und Sortieren:
# Filter: Server mit durchschnittlicher CPU-Last über 60%
high_load = cpu_avg[cpu_avg['cpu_load'] > 60]
# Sortieren nach CPU-Last absteigend
high_load_sorted = high_load.sort_values(by='cpu_load', ascending=False)
print(high_load_sorted)
Ausgabe:
Berichte als CSV oder Excel exportieren¶
Die erzeugten Berichte lassen sich unkompliziert speichern, um sie z.B. per E-Mail zu versenden oder in andere Tools zu importieren:
# CSV-Export
high_load_sorted.to_csv('high_cpu_servers.csv', index=False)
# Excel-Export (benötigt openpyxl oder xlsxwriter)
high_load_sorted.to_excel('high_cpu_servers.xlsx', index=False)
Hinweise zur Praxis¶
- Zeitliche Aggregation: Für Monitoringdaten ist oft eine Aggregation über Zeiträume (Stunden, Tage) sinnvoll. Verwenden Sie dazu
pd.Grouper(freq='H')oderresample(). - Performance: Bei sehr großen Datenmengen kann das Einlesen und Gruppieren viel Arbeitsspeicher benötigen. Nutzen Sie Filter vor dem Laden oder verarbeiten Sie Daten stückweise.
- Vergleich zu Shell-Skripten: Während Shell-Tools wie
awkundsorteinfache Aggregationen erlauben, bietet Pandas eine deutlich mächtigere und lesbarere Syntax für komplexe Auswertungen.
Zusammenfassung¶
Mit Pandas können Sie Monitoring- und Inventardaten schnell zusammenfassen, filtern und sortieren. Die intuitive Gruppierung und Aggregation erleichtert die Erstellung aussagekräftiger Berichte, die Sie direkt weiterverarbeiten oder exportieren können. So automatisieren Sie wiederkehrende Auswertungen effizient und vermeiden manuelle Fehlerquellen.