<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Demo
Strategic Redesign für das Projekt „Spring Petclinic“
Auslastungsdaten vom Produktivbetrieb
Datenquelle
Step1:  Berechnung wesentlicher Metriken für Größe und Nutzungsgrad
Step2:  Vorbereitung Verbindung zu technischen Schulden
Es wird ein eindeutiger Schlüssel ("fqn") für die Softwareinheiten erstellt, um nachfolgend Nutzungsdaten zu den technischen Schulden zuordnen zu können
Zudem werden nicht mehr benötigte Daten weggelassen
Step3:  Änderungshäufigkeit der Software
Zur Bewertung der Investitionen werden die Änderungen pro Softwareeinheit herangezogen.
Laden der Änderungshäufigkeit aus dem Versionskontrollsystem
Die vorgenommenen Änderungen der Anwendung werden geladen.
Step4:  Vorbereitung der Zuordnung zu Auslastungsdaten
Es wird ein eindeutiger Schlüssel für die Softwareinheiten erstellt, um technischen Schulden zu Nutzungsdaten zuordnen zu können
Mehrfacheinträge zu technischen Schulden werden pro Softwareeinheit aufsummiert
Step5:  Aufstellung der notwendigen Daten für tiefergehende Analysen
Es wird nur der Name der vermessenen Softwareeinheit benötigt sowie die berechnete Dauer der technischen Schulden
Die Dauer der technischen Schulden wird entsprechend als Zeitdauer umgewandelt
Step6:  Erstellung der Management-Sicht
Zusammenführung der Daten
Step7:  Identifikation technischer Komponenten
Step8:  Zusammenfassung nach technischen Komponenten
Step9:  Bewertungsmatrix nach technischen Gesichtspunkten
Step10:  Identifikation fachlicher Komponenten
Step11:  Zusammenfassung nach fachlichen Komponenten
Step12:  Bewertungsmatrix nach fachlichen Gesichtspunkten
<ASSISTANT_TASK:>
Python Code:
import pandas as pd
coverage = pd.read_csv("../dataset/jacoco_production_coverage_spring_petclinic.csv")
coverage.head()
Explanation: Demo
Strategic Redesign für das Projekt „Spring Petclinic“
Auslastungsdaten vom Produktivbetrieb
Datenquelle: Gemessen wurde der Anwendungsbetrieb der Software über einen Zeitraum von 24h an einem Wochentag. Für jede Softwareeinheit ("CLASS") wurden die durchlaufenen Code-Zeilen aufgezeichnet.
End of explanation
coverage['lines'] = coverage.LINE_MISSED + coverage.LINE_COVERED
coverage['covered'] = coverage.LINE_COVERED / coverage.lines
coverage.head()
Explanation: Berechnung wesentlicher Metriken für Größe und Nutzungsgrad
End of explanation
coverage['fqn'] = coverage.PACKAGE + "." + coverage.CLASS
coverage_per_class = coverage.set_index('fqn')[['lines', 'covered']]
coverage_per_class.head()
Explanation: Vorbereitung Verbindung zu technischen Schulden
Es wird ein eindeutiger Schlüssel ("fqn") für die Softwareinheiten erstellt, um nachfolgend Nutzungsdaten zu den technischen Schulden zuordnen zu können
Zudem werden nicht mehr benötigte Daten weggelassen
End of explanation
git_log = pd.read_csv(
    "../dataset/git_log_numstat_spring_petclinic.log",
    sep="\t",
    names=['additions', 'deletions', 'path'])
git_log.head()
Explanation: Änderungshäufigkeit der Software
Zur Bewertung der Investitionen werden die Änderungen pro Softwareeinheit herangezogen.
Laden der Änderungshäufigkeit aus dem Versionskontrollsystem
Die vorgenommenen Änderungen der Anwendung werden geladen.
End of explanation
git_log['fqn'] = git_log.path.str.extract(
    "/java/(.*)\.java",
    expand=True)[0]
git_log['fqn'] = git_log.fqn.str.replace("/", ".")
git_log['fqn'][0]
Explanation: Vorbereitung der Zuordnung zu Auslastungsdaten
Es wird ein eindeutiger Schlüssel für die Softwareinheiten erstellt, um technischen Schulden zu Nutzungsdaten zuordnen zu können
Mehrfacheinträge zu technischen Schulden werden pro Softwareeinheit aufsummiert
End of explanation
changes_per_file = git_log.groupby('fqn').path.count()
changes_per_file.name = "changes"
changes_per_file.head()
Explanation: Aufstellung der notwendigen Daten für tiefergehende Analysen
Es wird nur der Name der vermessenen Softwareeinheit benötigt sowie die berechnete Dauer der technischen Schulden
Die Dauer der technischen Schulden wird entsprechend als Zeitdauer umgewandelt
End of explanation
analysis = coverage_per_class.join(changes_per_file)
analysis.head()
Explanation: Erstellung der Management-Sicht
Zusammenführung der Daten
End of explanation
analysis['tech'] = analysis.index.str.split(".").str[-2]
analysis.head()
Explanation: Identifikation technischer Komponenten
End of explanation
tech_insights = analysis.groupby('tech').agg({
    "lines" : "sum",
    "covered": "mean",
    "changes" : "sum"
    })
tech_insights
Explanation: Zusammenfassung nach technischen Komponenten
End of explanation
%matplotlib inline
from ausi import portfolio
portfolio.plot_diagram(tech_insights, "changes", "covered", "lines");
Explanation: Bewertungsmatrix nach technischen Gesichtspunkten
End of explanation
analysis['domain'] = "Other"
domains = ["Owner", "Pet", "Visit", "Vet", "Specialty", "Clinic"]
for domain in domains:
    analysis.loc[analysis.index.str.contains(domain), 'domain'] = domain
analysis.head()
Explanation: Identifikation fachlicher Komponenten
End of explanation
domain_insights = analysis.groupby('domain').agg({
    "lines" : "sum",
    "covered": "mean",
    "changes" : "sum"
    })
domain_insights = domain_insights.rename(columns=
   {"lines": "Größe", "covered" : "Nutzungsgrad", "changes" : "Investition"})
domain_insights
Explanation: Zusammenfassung nach fachlichen Komponenten
End of explanation
portfolio.plot_diagram(domain_insights, "Investition", "Nutzungsgrad", "Größe");
Explanation: Bewertungsmatrix nach fachlichen Gesichtspunkten
End of explanation
<END_TASK>