import pandas as pd

log = pd.read_csv("../dataset/git_log_intellij.csv.gz")
log.head()

"""
Explanation: blank
Data Science meets <br/> Software Data
<b>Markus Harrer</b>, Software Development Analyst
@feststelltaste
<small>20 Jahre INNOQ Event, 13.09.2019</small>
<img src="../resources/innoq_logo.jpg" width=20% height="20%" align="right"/>
Data Science
Was ist Data Science?
"Statistik auf nem <b><span class="green">Mac</span></b>."
<br/>
<br/>
<div align="right"><small>Nach https://twitter.com/cdixon/status/428914681911070720</small></div>

<b>Data Science Venn Diagram (Drew Conway)</b>
<img src="../resources/venn_diagram.png" width=50% height="50%" >
Meine Definition
Was bedeutet "data"?
"Without data you‘re just another person with an opinion."
<br/>
<div align="right"><small>W. Edwards Deming</small></div>

<b>=> Belastbare Erkenntnisse mittels <span class="green">Fakten</span> liefern</b>
Was bedeutet "science"?
"The aim of science is to seek the simplest explanations of complex facts."
<br/>
<div align="right"><small>Albert Einstein</small></div>

<b>=> Neue Erkenntnisse <span class="green">verständlich</span> herausarbeiten</b>
Vorgehen
<small>Nach Roger Pengs "Stages of Data Analysis"</small><br/>
I. Fragestellung
II. Datenbeschaffung
III. Modellierung
IV. Interpretation
V. Kommunikation  
<b>=> von der <strong>Frage</strong> über die <span class="green">Daten</span> zur <span class="blue" style="background-color: #FFFF00">Erkenntnis</span>!</b>
Was hat das mit Softwareentwicklung zu tun?
Software Data
Was ist Software Data?

Statisch
Laufzeit
Chronologisch
Community

<b>=> Krass viel!</b>
Was ist ein Data Scientist?
"Jemand, der mehr Ahnung von Statistik<br/>
&nbsp;&nbsp;hat als ein <b><span class="green">Softwareentwickler</span></b><br/>
&nbsp;&nbsp;und mehr Ahnung von <b><span class="green">Softwareentwicklung</span></b><br/>
&nbsp;&nbsp;als ein Statistiker."
<br/>
<br/>
<div align="right"><small>Nach zu https://twitter.com/cdixon/status/428914681911070720</small></div>

<b>Data Science & Software Data:</b> Perfect <b><span class="green">match</span></b>!
Beispiele für Analysen

Modularisierungsschnitte finden
Performance-Bottlenecks identifizieren
Verborgene Code-Abhängigkeiten aufdecken
Open-Source-Communities bewerten
...

<b>Individuelle Systeme => individuelle Probleme => individuelle Analysen => individuelle Erkenntnisse!</b>
Software Analytics
Definition Software Analytics
"Software Analytics is analytics on software data for managers and <b class="green">software engineers</b> with the aim of empowering software development individuals and teams to <i>gain and share insight from their data</i> to <b>make better decisions</b>."
<br/>
<div align="right"><small>Tim Menzies and Thomas Zimmermann</small></div>

<img src="../resources/kombar0.png" width=95% align="center"/>
<img src="../resources/kombar4.png" width=95% align="center"/>
Lösungsstrategie
Grundprinzip
(Intent + Code + Data + Results)<br />
* Logical Step<br />
+ Automation<br />
= Literate Statistical Programming
Implementierung: Computational notebooks
Computational Notebooks
<br/>
<div align="center"><img src="../resources/notebook_approach.jpg"></div>

Technik
Technologie (1/2)
Klassischer Data-Science-Werkzeugkasten
* Jupyter (mit RISE)
* Python 3
* pandas
* matplotlib
Technologie (2/2)
Jupyter funktioniert und integriert sich auch mit
* jQAssistant / Cypher / Neo4j 
* JVM-Sprachen über beakerx / Tablesaw
* bash
* ...
Praktischer Teil
Erste Demo
Fallbeispiel
IntelliJ IDEA

IDE für die Java-Entwicklung
Vieles in Java geschrieben
Großes und lang entwickeltes Projekt

I. Fragestellung (1/3)

Offene Frage explizit niederschreiben
Analyseidee verständlich darstellen

I. Fragestellung (2/3)
<b>Frage</b>
* Welcher Code ist besonders komplex und wie oft wurde dieser in letzter Zeit geändert?
I. Fragestellung (3/3)
Umsetzungsidee

Werkzeuge: Jupyter, Python, pandas, matplotlib
Heuristiken:
"komplex": Lines of Code 
"letzter Zeit": Letzte 3 Monate
"oft geändert": Anzahl Git Commits

Meta-Ziel: Grundmechaniken kennenlernen.
II. Datenbeschaffung

Daten in Data-Science-Welt laden
Rohdaten bereinigen und filtern

Wir laden Git Log Daten eines Git Repos.
End of explanation
"""


log.info()

"""
Explanation: Was haben wir hier eigentlich?
End of explanation
"""


log['timestamp'] = pd.to_datetime(log['timestamp'])
log.head()

"""
Explanation: <b>1</b> DataFrame (~ programmierbares Excel-Arbeitsblatt), <b>6</b> Series (= Spalten), <b>1128819</b> Rows (= Einträge)
Wir wandeln die Zeitstempel von Texte in Objekte um.
End of explanation
"""


recent = log[log['timestamp'] > pd.Timestamp('today') - pd.Timedelta('90 days')]
recent.head()

"""
Explanation: Wir sehen uns nur die jüngsten Änderungen an.
End of explanation
"""


java = recent[recent['filename'].str.endswith(".java")].copy()
java.head() 

"""
Explanation: Wir wollen nur Java-Code verwenden.
End of explanation
"""


changes = java.groupby('filename')[['sha']].count()
changes.head()

"""
Explanation: III. Modellierung

Neue Sichten schaffen
Weitere Daten verschneiden

Wir aggregieren die Zeilen sowie die Anzahl der Änderungen pro Datei.
End of explanation
"""


loc = pd.read_csv("../dataset/cloc_intellij.csv.gz", index_col=1)
loc.head()

"""
Explanation: Wir holen Infos über die Code-Zeilen hinzu...
End of explanation
"""


hotspots = changes.join(loc[['code']])
hotspots.head()

"""
Explanation: ...und verschneiden diese mit den vorhandenen Daten.
End of explanation
"""


top10 = hotspots.sort_values(by="sha", ascending=False).head(10)
top10

"""
Explanation: VI. Interpretation

Problem: Ergebnisse oft umfangreich
Daher: Kernaussagen klar darstellen

Wir zeigen die TOP 10 Hotspots an.
End of explanation
"""


ax = top10.plot.scatter('sha', 'code');

for k, v in top10.iterrows():
    ax.annotate(k.split("/")[-1], v)

"""
Explanation: V. Kommunikation

Ergebnisse managementtauglich darstellen
Nächste Schritte lostreten

Wir plotten die TOP 10 Liste als XY-Diagramm.
End of explanation
"""


