Pandas (Python)

Was ist Pandas?

Pandas ist eine weit verbreitete Open-Source-Bibliothek zur Datenanalyse und -manipulation in der Programmiersprache Python. Aufgrund der schnellen, flexiblen und aussagekräftigen Datenstrukturen und effizienten Datenanalysewerkzeuge wird es häufig in den Bereichen Data Science, maschinelles Lernen und Deep Learning eingesetzt.

Es bietet eine schnelle und ausdrucksstarke Möglichkeit, strukturierte Daten zu manipulieren und zu analysieren, und ist für jeden, der mit der Python-Programmierung vertraut ist, leicht zu erlernen. Die Integration mit anderen Bibliotheken wie NumPy, Matplotlib und Seaborn macht es außerdem zu einer Komplettlösung für die Datenanalyse und -visualisierung in Python.

Der Name „Pandas“ leitet sich von dem Begriff „Panel Data“ ab, der sich auf mehrdimensionale Datenstrukturen bezieht, die häufig in der Ökonometrie verwendet werden. Die Bibliothek stellt zwei primäre Datenstrukturen zur Verfügung: Series (1-dimensional) und DataFrame (2-dimensional), die beide die Darstellung und Manipulation von beschrifteten Daten ermöglichen.

Beispiele zur Anwendung von Pandas (Python)

Datenbereinigung

Pandas bietet verschiedene Funktionen zum Bereinigen und Vorverarbeiten von Daten, wie z. B. die Behandlung fehlender Werte, die Konvertierung von Datentypen, das Entfernen von Duplikaten und die Behandlung von Ausreißern.

import pandas as pd
# Load a sample dataset with missing values
df = pd.read_csv("data.csv")
# Handle missing values by replacing them with the mean of the column
df.fillna(df.mean(), inplace=True)
# Convert column data type from string to integer
df['column_name'] = df['column_name'].astype(int)
# Remove duplicates from the DataFrame
df.drop_duplicates(inplace=True)
# Handle outliers by replacing them with the 95th percentile of the column
upper_bound = df['column_name'].quantile(0.95)
df['column_name'] = df['column_name'].apply(lambda x: upper_bound if x > upper_bound else x)

Daten-Aggregation

Es ist möglich, verschiedene Operationen durchzuführen, um Daten zu aggregieren und zusammenzufassen, z. B. Groupby, Pivot-Tabellen und Resampling. Diese Operationen können bei der Umwandlung von Rohdaten in nützliche Erkenntnisse hilfreich sein.

import pandas as pd
# Load a sample dataset
df = pd.read_csv("data.csv")
# Group the data by a categorical column and calculate the mean of a numeric column
grouped = df.groupby('column_name')['numeric_column'].mean()
# Create a pivot table to aggregate the data
pivot = df.pivot_table(index='column_name', values='numeric_column', aggfunc='mean')
# Resample the data to aggregate it by week
resampled = df.resample('W', on='date_column').sum()

Datenvisualisierung

Pandas lässt sich gut mit gängigen Datenvisualisierungsbibliotheken wie Matplotlib, Seaborn und Plotly integrieren. So können auf einfache Weise Balkendiagramme, Histogramme, Streudiagramme und vieles mehr erstellt werden, um Erkenntnisse aus Ihren Daten zu visualisieren und zu vermitteln.

import pandas as pd
import matplotlib.pyplot as plt
# Load a sample dataset
df = pd.read_csv("data.csv")
# Create a bar plot to visualize the distribution of a categorical column
df['column_name'].value_counts().plot(kind='bar')
plt.show()
# Create a histogram to visualize the distribution of a numeric column
df['numeric_column'].plot(kind='hist')
plt.show()
# Create a scatter plot to visualize the relationship between two numeric columns
df.plot(x='numeric_column_1', y='numeric_column_2', kind='scatter')
plt.show()

Pandas vs. NumPy

Pandas unterscheidet sich in einigen Punkten von NumPy, einer weiteren beliebten Bibliothek für numerische Berechnungen in Python. Während NumPy grundlegende numerische Operationen bereitstellt, bietet Pandas fortschrittlichere Fähigkeiten zur Datenanalyse und -manipulation. NumPy arbeitet hauptsächlich mit Arrays, während Pandas mit Reihen und Datenrahmen arbeitet, die beschriftet sind und gemischte Datentypen zulassen. Außerdem bietet Pandas im Gegensatz zu NumPy eine integrierte Behandlung fehlender Werte.

Pandas vs. SQL

Ein signifikanter Unterschied zwischen Pandas und SQL besteht darin, dass Pandas eine Bibliothek für die In-Memory-Datenverarbeitung ist, während SQL eine Sprache für den Zugriff auf und die Bearbeitung von in Datenbanken gespeicherten Daten ist. SQL eignet sich besser für die Arbeit mit großen, persistent gespeicherten Datenmengen, während Pandas flexibler für die schnelle und effiziente Datenmanipulation, -exploration und -analyse ist.

Programmierschnittstelle (API)

Was ist eine Programmierschnittstelle (API)?

API steht für Application Programming Interface und bezeichnet eine Programmierschnittstelle, die die Kommunikation zwischen verschiedenen Anwendungen ermöglicht. Fremde Programme können über eine API Zugriff auf bestimmte Komponenten einer Software erhalten und Daten transferieren.

Anders als bei einer Binärschnittstelle findet die Programmanbindung auf Quelltext-Ebene statt. Operationen werden über Standardbefehle ausgeführt, sodass Kompatibilität mit unterschiedlichen Programmiersprachen gewährleistet ist. Eine API kann unter anderem auf Datenbanken, Festplatten, Grafikkarten und Benutzeroberflächen zugreifen.

Der Vorteil einer Programmierschnittstelle ist die einfache Integration neuer Anwendungskomponenten in ein bestehendes System. Zudem sind APIs meist ausführlich mit ihren dazugehörigen Parametern dokumentiert.

Wie funktioniert eine API?

Programmierschnittstellen (API) dienen insbesondere Entwicklern, um ihre Programme an ein anderes andocken zu lassen. Eine Programmierschnittstelle gibt vor, wie Daten erhalten und gesendet werden können. Die Befehle und Datentypen, die eine API akzeptiert, sind in Protokollen definiert. Sie werden von den entsprechenden Komponenten für eine einheitliche Kommunikation verwendet.

Grundsätzlich unterscheidet man zwischen internen/privaten APIs und externen/offenen APIs. Private Programmierschnittstellen können nur von den Programmierern innerhalb einer Organisation benutzt werden. Dadurch wird die Arbeit an unternehmensinternen Prozessen optimiert. Zusätzlich werden sie durch bestimmte Sicherheitsmaßnahmen vor unautorisiertem Zugang geschützt. Externe APIs stehen der Öffentlichkeit in Verzeichnissen für die Einbindung in andere Systeme zur Verfügung. Manchmal ist die Nutzung einer API jedoch beschränkt oder kostenpflichtig.

Anwendungsbereiche für Programmierschnittstellen

Mit APIs lässt sich eine Vielzahl von Prozessen miteinander verbinden:

Wettervorhersage

Globale Wetterdaten aus den verschiedensten internationalen Quellen werden über Programmierschnittstellen abgerufen und können dem Nutzer per App auf dem Smartphone angezeigt werden.

Terminbuchung

Dienstleister können mit APIs ihren Kunden ermöglichen, Buchungen auf Online-Portalen durchzuführen oder nach bestimmten Services zu suchen. Dies können zum Beispiel Terminauskünfte bei Arztpraxen oder der Vergleich von Flugpreisen sein. Die Webseite verbindet sich mit den Programmierschnittstellen der jeweiligen Dienstleister und generiert eine Übersicht mit den passendsten Optionen.

E-Commerce

Einzelhändler verwenden APIs, um den Bestand ihrer Produkte zu kontrollieren und Kunden Auskunft über die Verfügbarkeit zu geben.

Was ist der Unterschied von API und REST-API?

REST ist eine Abkürzung für Representational State Transfer und bezieht sich auf eine Softwarearchitektur, die sich nach den Grundsätzen und dem Verhalten des World Wide Web richtet. Eine REST-API ist eine bestimmte Form einer API, die für den Datentransfer auf verteilten Systemen verwendet wird. Die REST-Architektur besitzt im Vergleich zu einer allgemeinen API sechs Designprinzipien, die von Entwicklern eingehalten werden müssen:

Einheitliche Programmierschnittstelle

Die Ressourcen sind über einen bestimmten Uniform Resource Identifier (URI) zugänglich. Verschiedene Operationen können mithilfe von HTTP-Methoden über dieselben URI durchgeführt werden. Geeignete Formate für Ressourcen sind zum Beispiel JSON, XML oder Text.

Unabhängigkeit von Client und Server

Client- und Serveranwendungen müssen voneinander entkoppelt sein. Der Client sollte nichts weiter als den URI der jeweiligen Ressource benötigen.

Zwischenspeicher

Um die Skalierbarkeit des Servers zu erhöhen und die Performance des Clients zu verbessern, können Ressourcen im Cache gespeichert werden.

Zustandslosigkeit

Rest-APIs erfordern keine Informationen über Sitzungen. Wenn der Server Daten über die Client-Session benötigt, werden diese über eine separate Anfrage gesendet.

Mehrschichtige Systemarchitektur

Zwischen Client und Server kann es eine Reihe anderer Anwendungen geben, die miteinander kommunizieren. Der Client kann nicht erkennen, durch wie viele Server die Antwort übermittelt wurde.

Code auf Abruf (optional)

In den meisten Fällen werden über REST-APIs statische Ressourcen übertragen. Manchmal kann es sich aber auch um ausführbaren Code wie Java-Applets handeln. Dieser sollte nur auf Abruf ausgeführt werden.

Prädikatenlogik erster Stufe

Was ist Prädikatenlogik erster Stufe?

Die Prädikatenlogik erster Stufe oder auch First-Order Logic (FOL) ist eine, an die Mathematik angelehnte Methode, um einem Objekt eindeutige Eigenschaften zuordnen zu können. Dabei wird jeder Satz/Aussage in sein Subjekt und sein Prädikat zerlegt. Die Beziehung zwischen ihnen erfolgt in der Prädikatenlogik erster Stufe durch P(x), wobei P für Prädikat und die Variable x für das entsprechende Subjekt steht.

Zu beachten ist, dass die Prädikate in der First-Order Logic sich nur auf jeweils ein Subjekt beziehen. Anders als in der Sprachwissenschaft ist ein Prädikat nicht zwingend ein Verb, sondern liefert lediglich relevante Informationen über das betreffende Subjekt. Die Verwendung der Prädikate erlaubt es zudem Relationen herzustellen; beispielsweise durch Vergleiche (größer/kleiner als, gleich usw.).

In der Prädikatenlogik erster Stufe werden Quantoren eingesetzt und durch die Symbole ∀ (universeller Quantor; gelesen: „für alle“) und ∃ (Existenzquantor; gelesen: „es existiert“ oder „für einige“) dargestellt. Die Darstellung erfolgt in der First-Order Logic durch mathematische Symbole und besteht aus:

  • Termen: Mensch, Tier, Pflanze etc.
  • Namen von Objekten. Diese können im sprachlichen Sinn sowohl Objekte als auch Subjekte sein!
  • Variablen a, b, c, …, x, y, z etc.

Diese stehen für noch nicht bekannte Objekte.

Prädikate [rot, duftet, ist eine Blume etc.] stehen für Eigenschaften und Relationen, die sprachlich mit Verben oder Attributen vergleichbar sind.

Quantoren [∀, ∃] erlauben Aussagen über Mengen von Objekten, für die das Prädikat gilt.

Beziehungen [∧ (und), ∨ (oder), →(impliziert), ⇒ (daraus folgt), ⇔ (ist äquivalent zu), == (Gleichheits – Operator)] geben Rückschlüsse über Relationen.

Beispiel für eine Prädikatenlogik erster Stufe

Die Rose ist rot.

P(x) = rot(Rose)

Die Rose duftet.

P(x) = duftet(Rose)

Die Rose ist eine Blume.

P(x) = Blume(Rose)

Wir erfahren über die Rose, dass sie rot ist, duftet und eine Blume ist.

Daraus resultiert für ∀:

Alle Rosen sind rot.

Alle Rosen duften.

Alle Rosen sind Blumen.

Es sind jedoch nicht alle Rosen rot und nicht jede Rose duftet.

Dass alle Rosen Blumen sind, ist hingegen eine wahre Aussage.

∀(x) Rose(x) → Blume(x)

Damit die beiden anderen Aussagen auf ihre Richtigkeit hin überprüft werden können, kommen nun Existenzquantoren zum Einsatz.

Aus den beiden Aussagen:

„Alle Rosen sind rot.“ und „Alle Rosen duften.“ werden durch Verwendung von ∃:

„Einige Rosen sind rot.“ und „Einige Rosen duften.“

Um sie in eine Formel erster Ordnung zu übersetzen, müssen wir eine Variable x definieren:

Ein Prädikat A(x), wobei x der Rose entspricht, und einem Prädikat G(x), welches für x ist, rot bzw. duftet.

∃(x) Rose(x) → rot(x)

bzw.

∃(x) Rose(x) → duftet(x)

Dadurch erfährt man, dass es Rosen gibt, die rot sind und Rosen existieren, die duften. Logisch ergibt sich daraus, dass es demnach auch Rosen geben muss, die nicht rot sind bzw. die nicht duften.

Pathfinding

Was ist Pathfinding?

Unter Pathfinding versteht man in der Informatik Algorithmen, mit welchen der optimale Weg zwischen zwei oder mehreren Punkten gefunden werden soll. Dabei kann der optimale Weg anhand von unterschiedlichen Parametern definiert werden.

Der optimale Weg ist immer vom jeweiligen Anwendungsfall abhängig. Neben dem kürzesten Weg kann beispielsweise auch der kostengünstigste Weg als Optimum definiert werden. Beispielsweise können auch andere Nebenbedingungen wie das Vermeiden von gewissen Wegpunkten oder Streckenabschnitten die Bestimmung des optimalen Weges beeinflussen.

Dieses Verhalten ist im Allgemeinen bei Routenplanern bekannt, wenn Autobahnen oder Mautstraßen vermieden werden sollen.

Algorithmen

Je nach Anforderung der Zielsetzung lassen sich im Rahmen des Pathfinding verschiedene Algorithmen anwenden.

Beim A*-Algorithmus handelt es sich um einen sogenannten informierten Suchalgorithmus, welcher den kürzesten Graphen zwischen zwei Punkten mithilfe einer Schätzfunktion/Heuristik ermittelt. Bei der Suche wird (vom Startpunkt aus gesehen) jener Folgeknoten untersucht, welcher wahrscheinlich schnell zum Ziel führt bzw. die Entfernung zum Zielknoten verringert. Ist eine Untersuchung eines Knotens nicht zielführend, wird dieser als solcher markiert und die Suche wird mit einem anderen Knoten fortgesetzt. Gemäß diesem Algorithmus wird der kürzeste Weg zum Zielknoten untersucht.

Ein weiterer Algorithmus zur Ermittlung des kürzesten Pfades ist der Algorithmus von Dijkstra. Dieser basiert nicht auf Heuristik, sondern auf Basis der Vorgehensweise, dass vom Startknoten ausgehend alle Knoten mit den kürzesten Teilstrecken zueinander zur Optimallösung führen, indem die Summe der kürzesten Teilstrecken zum insgesamt kürzesten Gesamtpfad führt. Somit funktioniert die Vorgehensweise in Form der aussichtsreichsten Teillösung.

Im Gegensatz zu den bisher beschriebenen Vorgehensweisen erlaubt der Bellman-Ford-Algorithmus (bzw. Moore-Bellman-Ford-Algorithmus) auch die Betrachtung von Graphen mit negativen Kantengewichten zur Ermittlung der kürzesten Pfade. Dies bedeutet, dass die Kosten (z. B. Zeit) zwischen zwei Knoten auch negativ sein können. Es muss jedoch sichergestellt sein, dass Zyklen durch negative Gewichte ausgeschlossen werden, da sich ansonsten der Pfad durch wiederholtes Durchlaufen der negativen Kantengewichte verringert. Alle bisher betrachteten Vorgehensweisen optimieren den Pfad von einem bestimmten Knoten aus gesehen.

Der Min-Plus-Matrixmultiplikations-Algorithmus sucht hingegen das Optimum sämtlicher Knotenpaare zueinander.

Gleiches gilt für den Floyd-Warshall-Algorithmus. Das Verfahren macht sich dabei die Vorgehensweise der dynamischen Programmierung zunutze. Zur Findung des Optimums wird das Gesamtproblem in gleichartige Teilprobleme geteilt und anschließend durch die Lösung und Speicherung dieser zu einer Optimierung des Gesamtproblems übergeführt. Die Funktionsweise ist zweigeteilt, wobei der Teil von Floyd dafür sorgt, dass die kürzesten Distanzen zwischen den Knoten berechnet werden, während der Teil von Warshall für die Konstruktion der kürzesten Pfade zuständig ist. Auch die Betrachtung von negativen Kantengewichten ist bei diesem Algorithmus möglich.

Während manche Verfahren die Optimierung zwischen zwei Knotenpunkten als Zielsetzung haben, optimieren andere sämtliche Knotenpunkte zueinander. Dies führt natürlich zu einer Erhöhung der Rechenleistung. Deshalb ist neben der Betrachtung der Zielsetzung bei der Wahl des Algorithmus mitunter auch die Beanspruchung der Ressourcen ein ausschlaggebender Faktor. Neben der Rechenleistung können auch der benötigte Speicherplatz und die Laufzeit relevante Größen bei der Wahl des Verfahrens darstellen.

Für manche der beschriebenen Verfahren bestehen vorgefertigte Algorithmen, welche in eigene Lösungen implementiert werden können. So kann unter anderem die Bibliothek NetworkX in Python implementiert und als Framework für die Pathfinding-Probleme genutzt werden.

Beispiele für die Anwendung von Pathfinding in der Praxis

Die Anwendungsmöglichkeiten von Pathfinding sind vielfältig. Sie reichen von einfachen sowie komplexen Steuerungen und Routenplanungen im Computerspiel-Sektor bis hin zur Lösung von Transportlogistikproblemen und der Optimierung von Routing-Problemen im Netzwerk-Sektor. Zur Unterstützung der Optimierungslösungen können auch Teilbereiche der Künstlichen Intelligenz implementiert werden.

Wie eingangs erwähnt, kann das zu erreichende Optimum individuell definiert sein. Die Begrenzung der Kostengröße kann durch Minimierung des Faktors Zeit, Geld, Zwischenstopps und vielen anderen Parametern dargestellt werden.

PyTorch

PyTorch ist ein Open-Source-Framework für Machine Learning (maschinelles Lernen) und basiert auf der Programmiersprache Python und der Bibliothek Torch. Entwickelt wurde es 2016 von einem Forscherteam für künstliche Intelligenz von Facebook, um die Effizienz der Entwicklung und Bereitstellung von Forschungsprototypen zu verbessern. PyTorch rechnet mit Tensoren, welche durch Grafikprozessoren (kurz GPU) beschleunigt werden. Es können über 200 verschiedene mathematische Operationen mit dem Framework genutzt werden.

Heute ist PyTorch eine der beliebtesten Plattformen für Forschungen im Bereich von Deep Learning und wird hauptsächlich für künstliche Intelligenz (KI), Datenwissenschaft und Forschung genutzt. PyTorch wird immer beliebter, weil sich damit vergleichsweise einfach Modelle für künstliche neuronale Netze (KNN) erstellen lassen. Und auch für Reinforcement Learning (bestärkendes Lernen) lässt sich PyTorch nutzen. Es kann bei GitHub kostenlos als Open Source heruntergeladen werden.

Was ist PyTorch Lightning?

PyTorch Lightning ist eine Open-Source-Bibliothek für Python und bietet eine High-Level-Schnittstelle für PyTorch. Der Schwerpunkt liegt auf Flexibilität und Leistung, um Forschern, Datenwissenschaftlern und Machine-Learning-Ingenieuren die Möglichkeit zu geben, passende und vor allem skalierbare ML-Systeme zu erstellen. PyTorch Lightning steht ebenfalls als Open Source zum Download bei GitHub bereit.

Was sind die Funktionen und Vorteile von PyTorch?

Dynamische Graphenberechnung

Das Netzwerkverhalten kann spontan geändert werden und es muss dafür nicht der komplette Code ausgeführt werden.

Automatische Differenzierung

Mittels Rückwärtsdurchläufe in neuronalen Netzen wird die Ableitung einer Funktion numerisch berechnet.

Benutzerfreundliche Oberfläche

Sie wird TorchScript genannt und macht das nahtlose Wechseln zwischen den Modi möglich. Es bietet Funktionalität, Geschwindigkeit, Flexibilität und Benutzerfreundlichkeit.

Python-Unterstützung

Da PyTorch auf Python basiert, ist es leicht zu erlernen und zu programmieren und es können alle mit Python kompatiblen Bibliotheken wie zum Beispiel NumPy oder SciPy genutzt werden. Außerdem ist ein unkompliziertes Debugging mit Python-Tools möglich.

Skalierbarkeit

Es findet auf wichtigen Cloud-Plattformen eine gute Unterstützung und ist somit gut zu skalieren.

Dataset und DataLoader

Es besteht die Möglichkeit, ein eigenes Dataset für PyTorch zu erstellen, um alle nötigen Daten zu speichern. Das Dataset wird mittels DataLoader verwaltet. Der DataLoader kann unter anderem die Daten durchlaufen, Batches verwalten und Daten transformieren.

Zusätzlich kann PyTorch Lernmodelle im Open Neural Network Exchange (ONNX) Standardformat exportieren und besitzt eine C++ Front-End-Schnittstellenoption.

Was sind Beispiele für die Anwendung von PyTorch?

  • Objekterkennung (object detection)
  • Segmentierung (semantic segmentation)
  • LSTM (Long Short-Term Memory, zu Deutsch: langes Kurzzeitgedächtnis)
  • Transformer

PyTorch vs. Tensorflow

Tensorflow ist ebenfalls ein Deep-Learning-Framework und wurde von Google entwickelt. Es existiert bereits länger als PyTorch und hat deswegen eine größere Entwickler-Community und mehr Dokumentation. Beide Frameworks haben ihre Vor- und Nachteile, da sie für unterschiedliche Projekte gedacht sind.

Während Tensorflow die Rechendiagramme auf statische Weise definiert, verfolgt PyTorch einen dynamischen Ansatz. Auch können die dynamischen Graphen bei PyTorch in Echtzeit manipuliert werden und bei Tensorflow nur am Ende. Daher eignet sich PyTorch durch seine einfache und leichte Handhabung besonders für eine unkomplizierte Erstellung von Prototypen und für Forschungsarbeiten. Tensorflow hingegen ist vor allem für Projekte geeignet, die skalierbare Produktionsmodelle benötigen.

PyTorch vs. scikit-learn

Scikit-learn (auch Sklearn genannt) ist eine freie Bibliothek für Python und ist auf Machine Learning (maschinelles Lernen) spezialisiert. Es bietet eine Reihe an Klassifikations-, Regressions- und Clustering-Algorithmen, wie zum Beispiel Random Forest, Support-Vektor-Maschinen oder k-means an. Scikit-learn bietet eine effiziente und unkomplizierte Datenanalyse und eignet sich besonders zum Definieren von Algorithmen, ist aber für ein End-to-End-Training tiefer neuronaler Netze eher ungeeignet, wofür hingegen PyTorch sehr gut genutzt werden kann.