In [1]:
import IPython
IPython.__version__
Out[1]:
'7.12.0'

Session 2: Python

Die Informationen in diesem Kapitel bieten eine (subjektive) Auswahl der wichtigsten Punkte und sollen dazu dienen einen Überblick zum Thema Python zu bekommen. Bei detailierteren Fragestellungen sollten unbedingt weitere Quellen herangezogen werden.

Inhalte

  • Wieso Python?
  • Der Python Software Stack
  • Das Python Universum
  • Python in der Praxis
  • Pandas

Weshalb Python?

Wieso verwenden wir Python und nicht eine andere Sprache?

plang_regular plang_most_often plang_recommended

Was sehen wir in den Grafiken?

  • Python ist die populärste verwendete Sprache
  • Als Einstieg mit Abstand die beste Sprache

Info: Was ist kaggle?

Kaggle ist eine Online-Community, die sich an Datenwissenschaftler richtet. Kaggle ist im Besitz der Google LLC. Der Hauptzweck von Kaggle ist die Organisation von Data-Science-Wettbewerben. Die Anwendungspalette ist im Laufe der Zeit stetig vergrößert worden. Heute ermöglicht Kaggle es Anwendern unter anderem auch, Datensätze zu finden und zu veröffentlichen, Modelle in einer webbasierten datenwissenschaftlichen Umgebung zu erforschen und zu erstellen und mit anderen Datenwissenschaftlern und Ingenieuren des maschinellen Lernens zusammenzuarbeiten. Kaggle bietet auch eine öffentliche Datenplattform, eine Cloud-basierte Workbench für die Datenwissenschaft und eine Kurzform der KI-Ausbildung an.

Python im Vergleich mit anderen Sprachen

Wichtige Eigenschaften der Sprache:

  • einfache, klare Syntax
  • open source
  • große community
  • vielseitig einsetzbar (nicht nur Datenwissenschaften)
  • portable

Beispiel Java (objektorientierte Sprache)

public class HelloWorld{

         public static void main(String []args){
            System.out.println("Hello World");
         }
    }

Beispiel Python

print('Hello World')

Beispiel Python (objektorientiert)

class HelloWorld:

        def __init__(self):
            print('Hello World')

Was sehen wir?

  • Pythonsyntax ist simpel:
    • wenig technischer Overhead
    • Blockbildung durch Einrückung -> forciert Übersichtlichkeit
    • dynamische Typisierung (Typ-Prüfung zur Laufzeit vs statische Typisierung: Typ-Prüfung beim Kompilieren)
  • python is flexibel - Unterstützung mehrerer Programmierparadigmen: zB funktional oder objektorientiert (mehr zu Programmierparadigmen)

Wann sollte ich Python verwenden, wann nicht?

  • verwenden wenn

    • Python zur Verfügung steht
    • Entwicklungszeit viel wichtiger ist als Performance
    • oder performante Libraries (zB numpy) die rechenintensiven Operationen übernehmen können. Python ist in dem Fall die high-level Verbindungssprach zu zB C.
  • nicht verwenden wenn

    • Performancemaximierung im Vordergrund steht
    • Spezialanforderungen wie genaues Speichermanagement bestehen (geringe Speicherkontrolle in Python)
    • evtl. wenn mobile Entwicklung im Vordergrund steht (im Bereich mobile Apps ist Verbreitung nicht so groß)

Python Software Stack

PyPI: Python Package Index

  • zentraler Paketpool für Pythonpakete mit +230 000 Projekten (Stand 06.2020)
  • Paketverwaltungsprogramm pip
  • Umgebungsverwaltung durch externe Programme (z. B. virtualenv, venv) oder kombinierte Tools (z. B. pipenv, poetry und hatch)

Anaconda

  • Open-Source Python Distribution mit Schwerpunkt auf Datenwissenschaften.
  • Kommerzielle Erweiterung erhältlich
  • Beeinhaltet Paketverwaltungstool conda. Unterschiede zu pip:
    • kombiniert Paket- und Umgebungsverwaltung
    • installiert binaries, keine Kompilierung erforderlich (wie u.U. bei pip)
    • installiert Pakete sprachunabhängig (zB. Python, R)
    • überprüft Paketabhängigkeiten
  • Anaconda repository enthält weit weniger Pakete (1500+, Stand 11.2018) als PyPI -> Kombination mit pip falls Paket nicht vorhanden

Aufgabe: Installiere Anaconda

Zeige allg. Informationen:

conda info

Liste alle installierten Pakete:

conda list

Liste alle Umgebungen

conda env list

Erstelle eine neue Umgebung schulung mit Python 3

conda create --name schulung python=3

Aktiviere Umgebung schulung

conda activate schulung

Installiere Pakete

conda install numpy pandas

Lösche Umgebung conda env remove --name schulung

Navigiere in den Ordner mit der Datei 'env.yml' und installiere vollständige Umgebung erneut (ca. 10 Minuten)

conda env create -f env.yml

Siehe auch das conda Cheat Sheet und den Userguide für mehr Details zu conda.

Das Python Universum

Achtung: es gibt zwei Versionen: Python 2 und Python 3. Python 3+ ist die aktuelle Version! Infos zur Portierung.)

Es gibt mehrere Umgebungen in denen Python verwendet werden kann

  • Python
  • IPython
  • Jupyter Notebook / Lab
  • klassische integrierte Entwicklungsumgebung (IDE), zB Spyder

Python CLI (command line interface)

  • use it as calculator: 1 + 1
  • normale Benutzung, zB. Paketimport:
    import pandas as pd
      df = pd.DataFrame({'a': [1,2], 'b':[3,4]})
    
  • run a script: python __tmp/hello_world.py
  • Hauptverwendung: Ausführung von .py Scripten
In [3]:
%%writefile __tmp/hello_world.py
print('Hello world!')
Overwriting __tmp/hello_world.py

IPython CLI

  • alles was man mit Python machen kann, plus Verbesserungen

  • allg. Infos, type ? oder help

    • Funktionen haben/sollten einen Docstring haben zB
      def say_this(text):
        """
        I am the Docstring.
        Prints text to screen.
        """
        print('Someone told me I should print {}.'.format(text))
      
    • read docstring with help(say_this) oder say_this?
  • standard CLI für interaktive Arbeiten zB. data exploration

  • syntax highlighting
  • In- Output caching: zB Out[1] oder _i1, _1
  • command line completion: tab
    • aussagekräftie Variablennamen einfach verwendbar
    • PEP 8 Style Guide: variables_are_lower_case_w_underscore
  • command history:
    • erste Buchstaben eingeben, dann Pfeiltasten verwenden
    • strg + r
  • magics

    • %command: line magic , ausgeführt in einer Zeile, Zuweisung möglich
    • %%command: cell magic , ausgführt über mehrere Zeilen, keine Zuweisung möglich
    • Beispiele:
      • %run __tmp/hello_world.py
      • sys commands, list available with %alias
      • timing:
        • %timeit np.arange(1000)
        • %timeit [i for i in range(1000)]
        • -> np version ist ca 27 mal schneller
        • gibt es auch als cell magic: %%timeit
  • !sys_command run system commands -> Achtung: wird in local shell ausgeführt d.h. abhängig davon auf welchem OS (Win, Linux). Beispiele:

Jupyter Notebook

  • Verwendung: Kombination aus Dokumentation und Code zB Datenexploration, Dokumentation oder Präsentation

  • Notebook starten mit jupyter notebook

  • Zellen enthalten Code oder Markdown

Markdown Demo

Level 2 Überschrift

Bullet points

  • Bullet points
    • Noch ein Bullet point

Aufzählung

  1. Aufzählung 1

    1.2 Blubb

  1. Aufzählung 2

Code line: code has back-ticks

Code Block

def func():
    """
    Example function.
    """
    # function body
    pass # this is used as placeholder

LaTeX Code: $ e^{i\pi} = -1$

Links: Mehr über Markdown

Formatierung: fett , kursiv , fett und kursiv

und noch mehr...

Die wichtigsten Tastenkombinationen

Zwei Modes:

  • edit mode (grüne Balken): Enter drücken oder in eine Zelle klicken.
    • shift + enter: Zelle ausführen und weiterspringen
    • strg + enter: Zelle ausführen
  • command mode (blaue Baken): Esc oder auf Bereich außerhalb der Zelle klicken.
    • m: Zelle als Markdown formatieren
    • a: Zelle hinzufügen
    • dd: Zelle löschen
Sonstige wichtige Befehle
  • Zellen kopieren, löschen
  • Undo delete Cells

more magic

Shell Kommandos im Notebook ausführen.

Unter Windows gibt es ein paar Probleme, weil

In [4]:
# !conda list
In [5]:
# %%bash
# conda --version
In [6]:
%%bash
# bash Kommandos ausführen
# ls -l

JupyterLab

  • Weiterentwicklung von Jupyter Notebooks
  • Web IDE like
  • Viele Features

Spyder

  • simple IDE
  • gute Debugging Möglichkeiten
  • Variable Explorer
  • Profiler
  • und vieles mehr

Hinweis

Bei der Installation von Spyder unter WSL kann es zu Problemen kommen. Folgende Links könnten helfen:

Python: Das Wichtigste

Die wichtigsten Eigenschaften von Python für die Praxis

  • Blockbildung durch Einrückungen (4 Leerzeichen)
  • Dynamische Typisierung -> keine explizite Typendeklaration -> Problematisch bei komplexen Datentypen zB. Return Wert an REST API. In diesem Fall erst Erkundung des Objects notwendig (in CLI, Dokumentation, Quellcode...).

  • Alles ist ein Objekt

    • Alles in Python ist ein Objet und fast alles hat Attribute und Methoden
    • Was genau ein Objekt ist wird zT für die Sprachen unterschiedlich definiert. In jedem Fall ist alles ein Objekt in dem Sinne, dass eine Zuweisung zu einer Variable oder die Übergabe an eine Funktion möglich ist.
  • weitere Punkte siehe unten

Loops

Lesender Zugriff auf Elemente iterierbarer Objekte i. d. R. nicht über den Index.

In [17]:
#id0001 live coding: naive loops
In [19]:
#id0002 live coding: pythionic loops
In [21]:
#id0003 live coding: zwei Listen
In [23]:
#id0004 live coding: dicts

List Comprehensions

Kompakte und schnelle Schreibweise zur Erzeugung von Listen

In [25]:
#id0005 live coding: simple list comprehension
In [27]:
#id0006 live coding: conditional list comprehension
In [29]:
#id0007 live coding: mixed dtypes, complex condition
In [31]:
#id0008 live coding: func call

Übung: Schnittmenge zweier Listen (15 Min)

Schreibe eine Funktion get_intersection(l1, l2) die die Schnittmenge zweier Listen l1 und l2 berechnet.

  • Verwende x in some_list um zu überprüfen ob x in der Liste ist.
  • Du kannst ein Element mit some_list.append(new_entry) einer Liste hinzufügen
  • Eine leere Liste erzugst du mit some_list = []
  • Implementiere die Funktion einmal mit und einmal ohne list comprehension.

Welches Ergebnis erhaltet ihr für die listen l1 = [1, 2, 3, 4, 5] und l2 = [2, 4, 5, 7, 9]?

Slicing

In [ ]:
l1 = [0, 1, 2, 3]
In [ ]:
#id0009 live coding: slicing start
In [ ]:
#id0010 live coding: slicing end
In [ ]:
#id0011 live coding: slice it
In [ ]:
#id0012 live coding: step
In [ ]:
#id0013 live coding: reverse
In [ ]:
#id0014 live coding: str

Numpy

Grundlegende Datenstruktur für numerische Operationen.

In [ ]:
#id0100 live coding: numpy intro

Pandas

Überblick

  • pandas DataFrame erzeugen
  • Daten selektieren
    • Spalten
    • masken
    • iloc und loc
  • head(), dtypes, describe(), value_counnts()
  • Funktionen anwenden
    • std, mean, median
    • apply
    • gruppieren

Funktionen von Pandas sind sehr umfangreich. Ein erschöpfende Behandlung ist hier nicht möglich. Weitere Informationen auf der Pandas Website bzw. im Internet.

In [ ]:
import pandas as pd

DataFrame erzeugen

In [ ]:
#id0015 live coding: create df

Importieren und Exportieren

In [ ]:
import os
In [ ]:
#id0016 live coding: os.path.join
In [ ]:
#id0017 live coding: os.path.join 2
In [ ]:
#id0018 live coding: csv export
In [ ]:
#id0019 live coding: csv import
In [ ]:
#id0020 live coding: csv import 2
In [ ]:
file_path = os.path.join(dir_path, 'df_test.pkl')
file_path
In [ ]:
#id0021 live coding: pkl export
In [ ]:
#id0022 live coding: pkl import

Datenzugriff

In [ ]:
#id0023 live coding: df col selection
In [ ]:
#id0024 live coding: object like access
In [ ]:
#id0024 live coding: add col
In [ ]:
#id0025 live coding: add more cols
In [ ]:
#id0026 live coding: masking 1
In [ ]:
#id0027 live coding: masking 2
In [ ]:
#id0028 live coding: masking 3
In [ ]:
#id0029 live coding: masking 4
In [ ]:
#id0030 live coding: masking 4 compact

Zeilenzugriff

  • Merkspruch (wie bei Matrizen): "Zeilen zuerst, Spalten später"
  • Im Prinzip sehr viele Zugriffsmöglichkeiten, hier nur die wichtigsten
In [ ]:
#id0031 live coding: rows basics
In [ ]:
#id0032 live coding: rows and cols
In [ ]:
#id0033 live coding: masking 5
In [ ]:
#id0034 live coding: masking and cols

Unterschied slicing Python und Pandas

In [ ]:
#id0035 live coding: recap simple list
In [ ]:
#id0036 live coding: recap simple list slicing
In [ ]:
#id0037 live coding: pd slicing 1
In [ ]:
#id0038 live coding: pd slicing 2

Referenz vs Kopie

Referenzen müssen von Kopien unterschieden werden um Seiteneffekte zu vermeiden.

In [ ]:
df1 = pd.DataFrame({'a': [0, 1]})
df1
In [ ]:
#id0039 live coding: reference

Wie bekomme ich eine Kopie?

In [ ]:
#id0040 live coding: copy

Views und chained Indexing

Ein view df2 auf ein array df1 ist ein array, dass auf eine Teilmenge der Daten von df1 zeigt.

Grafik von dataquest.io

Dieser Unterschied kann bei Schreibzugriffen zu unerwarteten Resultaten führen:

Grafik von dataquest.io

In [ ]:
df1 = pd.DataFrame({'a': [0, 1]})
df1
In [ ]:
#id0041 live coding: chained indexing

Hidden chaining

SettingWithCopyWarning entsteht bei Schreibzugriffen, diese können u.U. sehr weit entfernt von der ursächlichen Codezeile liegen.

In [ ]:
#id0042 live coding: hidden chaining
Falsch negativ Fall (keine Warnung obwohl SettingsWithCopy Fall vorliegt)

Bug on Github

Tipps

Für das debuggen der SettingsWithCopyWarning kann es hilfreich sein nicht nur eine Warnung anzuzeigen, sondern direkt eine Exception zu werfen. In diesem Fall wird sofort die Codezeile deutlich bei der die Warnung auftritt (jedoch nicht die ursächliche Codezeile). Dazu müssen die Einstellungen in Pandas geändert werden mit

pd.options.mode.chained_assignment = 'raise'

Weitere Informationen:

Übung: Vektoroperationen

Gegeben ist der unten stehende DataFrame mit zwei Spalten a und b:

In [ ]:
df = pd.DataFrame({'a': [1, 2, 3, 4],
                   'b': [1, 1, 1, 1]})
df

Aufgabe: Füge eine neue Spalte c hinzu deren Werte folgendermaßen bestimmt werden:

  • wenn der Wert in a gerade ist, ist der Wert in c die Summe der Spalten a und b
  • wenn der Wert in a ungerade ist, ist der Wert in c die Differenz der Spalten a und b.

Berechne die Spalte c einmal mittels einer for Schleife und dann ohne eine for Schleife zu verwenden (vektorisiert).

Geschwindigkeitsvergleich

Gruppieren

In [ ]:
# helper functions
def _color_groups(row, group_key='group_id'):
    cdict = {1: 'red',
             2: 'blue',
             3: 'green'}
    color = cdict.get(row[group_key], 'black')
    return ['color: %s' % color] * len(row)

def cprint(df):
    """
    Helper function which colors each group.
    """
    group_key = 'group_id' if 'group_id' in \
        df.columns else 'counter_id'
    display(df.style.apply(lambda row: _color_groups(row, group_key),
                           axis=1))

Pandas ermöglicht es Daten in Tabellen zu gruppieren und Operationen auf diesen Gruppen auszuführen.

In [ ]:
#id0043 live coding: groupby

Beispiel Zählerstandsvalidierung (vereinfacht)

Tabelle df_imp enthält unplausible Ablesebelege. Hier der Einfacheit halber nur die IDs der Zählwerke (counter_id).

In [ ]:
#id0044 live coding: simple grouping mrv

Übung: Mittelwertsberechnung

Berechne den Mittelwert über alle Gruppen in df_hist und join das Ergbnis in df_imp. Achte darauf, dass die Ergebnissspalte den Namen 'mean' trägt. Versuche die Operationen in zwei Zeilen auszudrücken.

Lösung:

Gruppen analysieren

Hilfreich für die Analyse ist es, sich einzelene Gruppen anzeigen zu lassen. Das geht mit get_group(group_id):

In [ ]:
selection = grp.get_group(2)
selection

selection ist ein gewöhnlicher DataFrame auf dem normal Operationen ausgeführt werden können.

In [ ]:
selection['daily_cons'].sum()

Literatur

Diverse Tutorials im Internet und Bücher. Keine spezielle Empfehlung. Eine kleine Auswahl relevanter Quellen: