<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Versionskontrollsysteme sind eine unglaubliche Informationsquelle um Softwaresysteme und deren Entwicklung zu analysieren. Allein durch simple Informationen über welcher Autor hat wann was geändert lassen sich einige sehr interessante Dinge herausstellen.
In diesem Artikel sehen wir uns an, was wir mit einem sog. git blame log alles herausfinden können. Ein git blame log enthält Informationen darüber, welcher Autor in welcher Datei welche Zeilenänderung durchgeführt hat. Nehmen wir hier nur alle als zuletzt durchgeführte Zeilenänderungen je Quellcodedatei, können wir darüber potenziell abschätzen, wer noch etwas über eine Zeile wissen könnte. Darüber können wir berechnen, wer noch etwas übe reine komplette Datei sowie einer Komponente (was das auch immer sein möge) wissen könnte.
Als Basis des ganzen ist jedoch einiges an Vorarbeit notwendig. Wir brauchen ein git blame für jede Datei unseres Softwaresystems.
Step1:  No-Go Areas
Step2:  Wissensinseln
Bewertung des vorhandenen Wissens
...anhand der zuletzt geänderten Quellcodezeilen
Gruppieren mit minimalen Zeitdauer und Zeilenanzahl
=> Jüngste Änderung und Anzahl geänderter Zeilen pro Datei und Autor
Step3:  Wissensanteile berechnen
=> Prozentualer Anteil der zuletzt geänderten Zeilen pro Datei und Autor
Step4:  Maximales Wissen pro Datei identifizieren
=> Hauptautor pro Datei
Step5:  Visualisierung erstellen
=> Export in D3 Visualisierung "Zoomable Circle Packing"
<ASSISTANT_TASK:>
Python Code:
import pandas as pd
log = pd.read_csv("../../../software-data/projects/linux/linux_blame_log.csv.gz")
log.head()
log.info()
top10 = log['author'].value_counts().head(10)
top10
%matplotlib inline
top10.plot.pie();
Explanation: Versionskontrollsysteme sind eine unglaubliche Informationsquelle um Softwaresysteme und deren Entwicklung zu analysieren. Allein durch simple Informationen über welcher Autor hat wann was geändert lassen sich einige sehr interessante Dinge herausstellen.
In diesem Artikel sehen wir uns an, was wir mit einem sog. git blame log alles herausfinden können. Ein git blame log enthält Informationen darüber, welcher Autor in welcher Datei welche Zeilenänderung durchgeführt hat. Nehmen wir hier nur alle als zuletzt durchgeführte Zeilenänderungen je Quellcodedatei, können wir darüber potenziell abschätzen, wer noch etwas über eine Zeile wissen könnte. Darüber können wir berechnen, wer noch etwas übe reine komplette Datei sowie einer Komponente (was das auch immer sein möge) wissen könnte.
Als Basis des ganzen ist jedoch einiges an Vorarbeit notwendig. Wir brauchen ein git blame für jede Datei unseres Softwaresystems.
End of explanation
log['timestamp'] = pd.to_datetime(log['timestamp'])
log.head()
log['age'] = pd.Timestamp("today") - log['timestamp']
log.head()
log['component'] = log['path'].str.split("/").str[:2].str.join(":")
log.head()
age_per_component = log.groupby('component')['age'].min().sort_values()
age_per_component.head()
age_per_component.plot.bar(
    title="Alter pro Komponente (in Jahren)",
    figsize=[15,5]);
Explanation: No-Go Areas
End of explanation
knowledge = log.groupby(
    ['path', 'author']).agg(
        {'timestamp':'min', 'line':'count'}
    )
knowledge.head()
Explanation: Wissensinseln
Bewertung des vorhandenen Wissens
...anhand der zuletzt geänderten Quellcodezeilen
Gruppieren mit minimalen Zeitdauer und Zeilenanzahl
=> Jüngste Änderung und Anzahl geänderter Zeilen pro Datei und Autor
End of explanation
knowledge['all'] = knowledge.groupby('path')['line'].transform('sum')
knowledge['knowing'] = knowledge['line'] / knowledge['all']
knowledge.head()
Explanation: Wissensanteile berechnen
=> Prozentualer Anteil der zuletzt geänderten Zeilen pro Datei und Autor
End of explanation
max_knowledge_per_file = knowledge.groupby(['path'])['knowing'].transform(max)
knowledge_carriers = knowledge[knowledge['knowing'] == max_knowledge_per_file]
knowledge_carriers = knowledge_carriers.reset_index(level=1)
knowledge_carriers.head()
Explanation: Maximales Wissen pro Datei identifizieren
=> Hauptautor pro Datei
End of explanation
from ausi import d3
d3.create_json_for_zoomable_circle_packing(
    knowledge_carriers.reset_index(),
    'author',
    'author',
    'path',
    '/',
    'all',
    'knowing',
    'linux_circle_packing'
)
Explanation: Visualisierung erstellen
=> Export in D3 Visualisierung "Zoomable Circle Packing"
End of explanation
<END_TASK>