Analyse der Git-Historie des Linux Kernels

Einleitung

Mit diesem Arbeitsblatt erlernen wir die ersten Schritte mit Jupyter, Python, pandas und matplotlib anhand eines praktischem Beispiels: Der Analyse der Entwicklungsgeschichte des Linux Kernels.

Das komplette und ausführlich beschriebene Mini-Tutorial ist auch auf meinem Blog zu finden unter https://www.feststelltaste.de/mini-tutorial-git-log-analyse-mit-python-und-pandas/.

Aufgabe

  • Wir wollen herausfinden,
    • wer die TOP 10 Autoren mit den häufigsten Commits (=Codeänderungen) sind
    • zu welcher Tagesstunde die meisten Commits vorgenommen werden.

Als Basis haben wir einen Datensatz in einer Datei, der uns pro Commit den Zeitstempel sowie den Autor der Codeänderung aufführt:

timestamp,author
2017-12-31 14:47:43,Linus Torvalds
2017-12-31 13:13:56,Linus Torvalds
2017-12-31 13:03:05,Linus Torvalds
2017-12-31 12:30:34,Linus Torvalds
2017-12-31 12:29:02,Linus Torvalds

Diese Daten habe ich mir im Grunde über git (https://git-scm.com) aus dem GitHub-Repository https://github.com/torvalds/linux/ erzeugen lassen (und für das Mini-Tutorial ein wenig vereinfacht...).

Aber der Reihe nach – lernen wir ersteinmal die Werkzeuge näher kennen.

Jupyter

Jupyter biete uns Code und Dokumentation in ausführbare Zellen.

Codeausführung

  1. Wähle die nächste Zelle aus (Mausklick oder mit Pfeiltasten).
  2. Führe die Zelle mit einem Strg+Enter aus.
  3. Führe die Zelle noch einmal mit Shift+Enter. Was ist der Unterschied der Ergebnissausgabe ?

In [ ]:
"Hello World"

Neue Zelle anlegen

  1. Wenn noch nicht passiert, wähle diese Zelle aus.
  2. Gehe in den Befehlsmodus, auswählbar mit Taste ESC.
  3. Erstelle nach diesem Text eine neue Zelle mit der Taste b.
  4. Wechlse den Zelltyp zu "Markdown" mit Taste m.
  5. Wechlse in den Eingabemodus mit Enter.
  6. Schreibe einen Text, den Du dann mit Strg + Enter "ausführst".

Python

Wir sehen uns sehr grundlegende Funktionen an:

  • Variablenzuweisungen
  • Wertebereichszugriffe
  • Methodenaufrufe

Text einer Variable zuweisen

  1. Schreibe den Text "Hello World" per Zuweisung = in die Variable text.
  2. Schreibe die Variable text in die nächste Zeile und führe die Zelle aus.

In [ ]:

Auf Werte zugreifen

  1. Greife mit [0] auf den ersten Buchstaben in text zu.

In [ ]:

Letzten Wert wählen

  1. Greife mit [-1] auf den letzten Buchstaben in text zu.

In [ ]:

Wertebereiche wählen

  1. Greife mit dem Slice [2:5] auf einen Bereich von text zu.

In [ ]:

Autovervollständigung

  1. Hänge einen . an text und siehe Dir die Funktionen mit der Taste Tab an.
  2. Führe die Methode upper() aus (Tipp: Tippe ein u in der Funktionsübersicht).

In [ ]:

Interaktive Dokumentation

  1. Wähle die Funktion split von text.
  2. Drücke Shift+Tab.
  3. Drücke Shift+Tab zweimal schnell hintereinander.
  4. Drücke Shift+Tab viermal schnell hintereinander (und anschlißend ESC zum ausblenden)
  5. Teile mit split den Text in text anhand der ls genau einmal auf.

In [ ]:

Pandas

Daten importieren

Modul laden

  1. Importiere das Modul pandas mit import <modulname> as <kuerzel> als abgekürztes pd
  2. Schau Dir in der nächsten Zeile mit einem angehängten ? an, was in der Variable pd nun steckt.

In [ ]:

Datei einlesen

  1. Lese mit der read_csv-Methode die Daten von der Adresse ein, die in URL steht.
    1. Gib hier den zu verwendenden Kompressionsalgorithmus mittels compression='gzip' mit an.
    2. Schreibe das Ergebnis in die Variable git_log.
  2. Zeige die ersten fünf Einträge (= Commits aka Codeänderungen) in git_log mit der Methode head() an.

In [ ]:
URL = "https://raw.githubusercontent.com/feststelltaste/software-analytics/master/demos/dataset/git_demo_timestamp_linux.gz"

Daten kennenlernen

  1. Rufe info() auf git_log auf.

In [ ]:

Wir sehen, dass in git_log

  • ein DataFrame steckt, der aus
    • zwei Spalten (sog. Series) besteht.
  • Wir sehen auch, dass wir
    • 723214 Einträge in der Spalte timestamp (=Commit-Zeitpunkt) haben
    • aber nur 723213 bei author (=Programmierer).

Datenfehler erkennen

  1. Greife auf die Spalte author mit der Schreibweise git_log.author zu.
  2. Berechne fehlende Autor mit einem angehängten .isnull()-Aufruf.
  3. Schreibe das Ergebnis in missing.
  4. Gib die ersten fünf Einträge von missing aus.

In [ ]:

Daten selektieren

  1. Selektiere alle fehlenden Autoren in git_log mit dem Selektor [<Series>] und Daten in der Series missing.

In [ ]:

Daten aggregieren

Top 10 Autoren

  1. Zähle die Anzahl der Commits pro Autor in git_log mit der Methode value_counts().
  2. Liste nur die TOP 10 am häufig vorkommendsten Autoren auf.
  3. Speichere das Ergebnis in der Variable top10.
  4. Liste das Ergebnis in top10 auf.

In [ ]:

matplotlib

Visualisierung

  1. Weise Jupyter mit %matplotlib inline an, erzeugte Grafiken direkt im Notebook darzustellen.
  2. Rufe plot() auf die Series top10 auf.

In [ ]:

Balkendiagramm erstellen

  1. Rufe die Untermethode bar() von plot für die Daten in git_log auf.
  2. Hänge ein ; an den Aufruf. Was hat sich geändert?

In [ ]:

Tortendiagramm erstellen

  1. Rufe die Untermethode plot() von plot für die Daten in git_log auf.

In [ ]:

  1. Erstelle noch einmal ein Tortendiagramm mit folgenden Parametern:
    • figsize=[7,7]
    • title="Top 10 Autoren"
    • labels=None

Zeitreihenanalyse

Zeitstempelspalte ansehen

  1. Zeige die ersten fünf Einträge der Series timestamp an.

In [ ]:

Datentypkonvertierung

  1. Wandle mit Hilfe der Pandas-Funktion pd.to_datetime die Spalte timestamp in einen echten Datumdatentyp
  2. Schreibe das Ergebnis in die Variable timestamp
  3. Gibt die ersten fünf Einträge aus.

In [ ]:

Mit Zeitdaten arbeiten

  1. Greife auf das DatumsObjekt dt der Variable timestamp zu.
  2. Zeige für die Stunden hour an.
  3. Gebe die ersten fünf Einträge aus.

In [ ]:

Commit-Lieblingszeit herausfinden

  1. Zähle die Häufigkeit der Commits pro Stunde.
    1. Stelle die Sortierung mit dem Parameter sort=False aus.
  2. Speichere das Ergebnis in commits_je_stunde.

In [ ]:

Endergebnis

  1. Plotte ein Balkendiagramm über die stündliche Commit-Anzahl.

In [ ]:

Was jetzt noch alles fehlt

Wir haben jetzt einige Grundlagen zu Pandas kennengelernt. Damit kommen wir schon sehr weit in der täglichen Arbeit. Die anderen wichtigen Themenbereiche, die nun noch fehlen, sind:

  • Einlesen komplizierter, semistrukturierte Datenstrukturen
  • Umfassende Bereinigung von schlechter Datenqualität
  • Zusammenführen verschiedener Datenquellen
  • Gruppieren von gleichartigen Daten mittels groupby
  • Umformen von DataFrames mittels pivot_table

Zusammenfassung

Ich hoffe, dass ich Dir mit diesem Mini-Tutorial das Potenzial von Datenanalysen mittels Jupyter, Python und matplotlib näherbringen konnte.

Über Anmerkungen und Feedback freue ich mich!

Kontakt

Markus Harrer
Blog: https://www.feststelltaste.de
Mail: talk@markusharrer.de
Twitter: @feststelltaste
Beratung und Training: http://markusharrer.de