In [2]:
import sys;sys.path.append("..")
import pandas as pd
from pandas import DataFrame
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
%matplotlib inline
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:100% !important; }</style>"))



In [3]:
from devml.post_processing import (git_churn_df, file_len, git_populate_file_metatdata)

In [4]:
df = git_churn_df(path="/Users/noahgift/src/cpython")


2017-10-23 06:53:10,082 - devml.post_processing - INFO - Running churn cmd: [git log --name-only --pretty=format:] at path [/Users/noahgift/src/cpython]

In [5]:
df.head()


Out[5]:
files churn_count
0 b'Lib/test/test_struct.py' 178
1 b'Lib/test/test_zipimport.py' 78
2 b'Misc/NEWS.d/next/Core' 351
3 b'and' 351
4 b'Builtins/2017-10-13-20-01-47.bpo-31781.cXE9S... 1

In [6]:
metadata_df = git_populate_file_metatdata(df)

In [22]:
python_files_df = metadata_df[metadata_df.extension == ".py"]
line_python = python_files_df[python_files_df.line_count> 40]
line_python.sort_values(by="relative_churn", ascending=False).head(15)


Out[22]:
files churn_count line_count extension relative_churn
15 b'Lib/test/regrtest.py' 627 50.0 .py 12.54
196 b'Lib/test/test_datetime.py' 165 57.0 .py 2.89
197 b'Lib/io.py' 165 99.0 .py 1.67
430 b'Lib/test/test_sundry.py' 91 56.0 .py 1.62
269 b'Lib/test/test___all__.py' 128 109.0 .py 1.17
1120 b'Lib/test/test_userstring.py' 40 44.0 .py 0.91
827 b'Lib/email/__init__.py' 52 62.0 .py 0.84
85 b'Lib/test/test_support.py' 262 461.0 .py 0.57
1006 b'Lib/test/test_select.py' 44 82.0 .py 0.54
1474 b'Lib/lib2to3/fixes/fix_itertools_imports.py' 30 57.0 .py 0.53
346 b'Doc/conf.py' 106 206.0 .py 0.51
222 b'Lib/string.py' 151 305.0 .py 0.50
804 b'Lib/test/test_normalization.py' 53 108.0 .py 0.49
592 b'Lib/test/test_fcntl.py' 68 152.0 .py 0.45
602 b'Lib/test/test_winsound.py' 67 148.0 .py 0.45

In [42]:
metadata_df.median()


Out[42]:
churn_count         5.0
line_count        146.0
relative_churn      0.1
dtype: float64

In [43]:
metadata_df.groupby("extension").median()


Out[43]:
churn_count line_count relative_churn
extension
3.0 25.0 0.285
. 3.0 NaN NaN
.0 1.0 21.0 0.050
.1 2.0 3.0 0.670
.2 3.0 537.0 0.010
.3 4.5 69.0 0.010
.4b3 2.0 NaN NaN
.586 2.0 NaN NaN
.686 2.0 NaN NaN
.8svx 2.0 2.0 1.000
.AIX 6.0 130.0 0.050
.Emacs 4.0 NaN NaN
.JAGUAR 2.0 NaN NaN
.LUTZ 2.0 NaN NaN
.OpenBSD 4.0 NaN NaN
.README 5.0 NaN NaN
.S 6.0 417.0 0.020
.TXT 1.0 287.5 0.000
.WINDOWS 2.0 NaN NaN
.ac 136.5 5422.0 0.040
.adb 2.0 NaN NaN
.ads 2.0 NaN NaN
.aif 3.0 1.0 3.000
.aifc 1.0 5.0 0.200
.aiff 1.0 116.0 0.010
.am 7.5 NaN NaN
.as 3.0 NaN NaN
.asdl 61.0 135.0 0.450
.asm 2.0 102.0 0.045
.au 1.0 50.0 0.035
... ... ... ...
.uue 2.0 NaN NaN
.v1 4.0 NaN NaN
.valgrind 6.0 100.0 0.060
.vbs 3.0 1.0 2.000
.vcproj 7.0 NaN NaN
.vct 6.5 NaN NaN
.vcw 3.0 NaN NaN
.vcxproj 5.0 86.0 0.060
.vim 16.0 NaN NaN
.voc 2.0 2.0 1.000
.vsprops 6.0 NaN NaN
.wav 1.0 110.0 0.010
.webp 1.0 3.0 0.330
.whl 1.0 3244.0 0.000
.wixproj 2.0 21.0 0.100
.wml 3.0 NaN NaN
.wpj 5.5 NaN NaN
.wpr 2.5 18.0 0.150
.wse 8.0 NaN NaN
.wsp 3.5 NaN NaN
.wxl 1.0 6.0 0.200
.wxl_template 2.0 10.0 0.230
.wxs 3.0 29.5 0.125
.xMAP 2.0 NaN NaN
.xar 3.0 NaN NaN
.xbm 2.0 6.0 0.170
.xml 2.0 6.0 0.330
.xpm 2.0 NaN NaN
.yml 4.0 35.0 0.290
.zip 2.0 8.0 0.250

268 rows × 3 columns


In [45]:
metadata_df.groupby("extension").describe()


Out[45]:
churn_count line_count relative_churn
count mean std min 25% 50% 75% max count mean ... 75% max count mean std min 25% 50% 75% max
extension
668.0 35.248503 566.236073 1.0 2.00 3.0 6.00 14464.0 58.0 1048.068966 ... 159.00 34821.0 58.0 0.725172 1.991237 0.00 0.0700 0.285 0.6750 15.00
. 5.0 3.800000 1.303840 3.0 3.00 3.0 4.00 6.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.0 8.0 1.250000 0.462910 1.0 1.00 1.0 1.25 2.0 6.0 25.333333 ... 36.00 41.0 6.0 0.046667 0.022509 0.02 0.0275 0.050 0.0650 0.07
.1 4.0 2.500000 1.000000 2.0 2.00 2.0 2.50 4.0 1.0 3.000000 ... 3.00 3.0 1.0 0.670000 NaN 0.67 0.6700 0.670 0.6700 0.67
.2 3.0 4.333333 3.214550 2.0 2.50 3.0 5.50 8.0 1.0 537.000000 ... 537.00 537.0 1.0 0.010000 NaN 0.01 0.0100 0.010 0.0100 0.01
.3 8.0 4.250000 2.121320 1.0 2.75 4.5 6.00 7.0 1.0 69.000000 ... 69.00 69.0 1.0 0.010000 NaN 0.01 0.0100 0.010 0.0100 0.01
.4b3 1.0 2.000000 NaN 2.0 2.00 2.0 2.00 2.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.586 1.0 2.000000 NaN 2.0 2.00 2.0 2.00 2.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.686 1.0 2.000000 NaN 2.0 2.00 2.0 2.00 2.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.8svx 1.0 2.000000 NaN 2.0 2.00 2.0 2.00 2.0 1.0 2.000000 ... 2.00 2.0 1.0 1.000000 NaN 1.00 1.0000 1.000 1.0000 1.00
.AIX 1.0 6.000000 NaN 6.0 6.00 6.0 6.00 6.0 1.0 130.000000 ... 130.00 130.0 1.0 0.050000 NaN 0.05 0.0500 0.050 0.0500 0.05
.Emacs 1.0 4.000000 NaN 4.0 4.00 4.0 4.00 4.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.JAGUAR 1.0 2.000000 NaN 2.0 2.00 2.0 2.00 2.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.LUTZ 1.0 2.000000 NaN 2.0 2.00 2.0 2.00 2.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.OpenBSD 1.0 4.000000 NaN 4.0 4.00 4.0 4.00 4.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.README 2.0 5.000000 4.242641 2.0 3.50 5.0 6.50 8.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.S 54.0 6.185185 3.348185 2.0 4.00 6.0 8.00 14.0 5.0 386.000000 ... 418.00 422.0 5.0 0.016000 0.005477 0.01 0.0100 0.020 0.0200 0.02
.TXT 4.0 1.000000 0.000000 1.0 1.00 1.0 1.00 1.0 4.0 282.750000 ... 292.75 298.0 4.0 0.000000 0.000000 0.00 0.0000 0.000 0.0000 0.00
.WINDOWS 1.0 2.000000 NaN 2.0 2.00 2.0 2.00 2.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.ac 2.0 136.500000 132.228968 43.0 89.75 136.5 183.25 230.0 1.0 5422.000000 ... 5422.00 5422.0 1.0 0.040000 NaN 0.04 0.0400 0.040 0.0400 0.04
.adb 7.0 2.000000 0.000000 2.0 2.00 2.0 2.00 2.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.ads 3.0 2.000000 0.000000 2.0 2.00 2.0 2.00 2.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.aif 1.0 3.000000 NaN 3.0 3.00 3.0 3.00 3.0 1.0 1.000000 ... 1.00 1.0 1.0 3.000000 NaN 3.00 3.0000 3.000 3.0000 3.00
.aifc 3.0 1.333333 0.577350 1.0 1.00 1.0 1.50 2.0 3.0 13.000000 ... 19.00 33.0 3.0 0.743333 1.091620 0.03 0.1150 0.200 1.1000 2.00
.aiff 5.0 1.200000 0.447214 1.0 1.00 1.0 1.00 2.0 5.0 97.400000 ... 140.00 147.0 5.0 0.408000 0.889955 0.01 0.0100 0.010 0.0100 2.00
.am 4.0 8.000000 3.162278 5.0 5.75 7.5 9.75 12.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.as 1.0 3.000000 NaN 3.0 3.00 3.0 3.00 3.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.asdl 1.0 61.000000 NaN 61.0 61.00 61.0 61.00 61.0 1.0 135.000000 ... 135.00 135.0 1.0 0.450000 NaN 0.45 0.4500 0.450 0.4500 0.45
.asm 8.0 2.750000 2.121320 2.0 2.00 2.0 2.00 8.0 2.0 102.000000 ... 129.00 156.0 2.0 0.045000 0.007071 0.04 0.0425 0.045 0.0475 0.05
.au 9.0 2.444444 2.603417 1.0 1.00 1.0 2.00 7.0 8.0 64.250000 ... 113.75 147.0 8.0 0.342500 0.686518 0.01 0.0100 0.035 0.2600 2.00
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
.uue 4.0 2.000000 0.000000 2.0 2.00 2.0 2.00 2.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.v1 1.0 4.000000 NaN 4.0 4.00 4.0 4.00 4.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.valgrind 1.0 6.000000 NaN 6.0 6.00 6.0 6.00 6.0 1.0 100.000000 ... 100.00 100.0 1.0 0.060000 NaN 0.06 0.0600 0.060 0.0600 0.06
.vbs 2.0 3.000000 1.414214 2.0 2.50 3.0 3.50 4.0 1.0 1.000000 ... 1.00 1.0 1.0 2.000000 NaN 2.00 2.0000 2.000 2.0000 2.00
.vcproj 198.0 9.277778 13.521880 1.0 3.00 7.0 10.00 165.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.vct 6.0 6.666667 4.546061 2.0 3.00 6.5 8.50 14.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.vcw 2.0 3.000000 0.000000 3.0 3.00 3.0 3.00 3.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.vcxproj 53.0 6.415094 8.321506 1.0 4.00 5.0 7.00 63.0 42.0 103.595238 ... 105.00 457.0 42.0 0.064524 0.032022 0.01 0.0500 0.060 0.0800 0.14
.vim 1.0 16.000000 NaN 16.0 16.00 16.0 16.00 16.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.voc 1.0 2.000000 NaN 2.0 2.00 2.0 2.00 2.0 1.0 2.000000 ... 2.00 2.0 1.0 1.000000 NaN 1.00 1.0000 1.000 1.0000 1.00
.vsprops 43.0 7.837209 7.665415 1.0 3.50 6.0 9.00 40.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.wav 5.0 1.200000 0.447214 1.0 1.00 1.0 1.00 2.0 5.0 80.200000 ... 140.00 147.0 5.0 0.472000 0.865344 0.01 0.0100 0.010 0.3300 2.00
.webp 1.0 1.000000 NaN 1.0 1.00 1.0 1.00 1.0 1.0 3.000000 ... 3.00 3.0 1.0 0.330000 NaN 0.33 0.3300 0.330 0.3300 0.33
.whl 52.0 1.153846 0.414663 1.0 1.00 1.0 1.00 3.0 2.0 3244.000000 ... 3980.50 4717.0 2.0 0.000000 0.000000 0.00 0.0000 0.000 0.0000 0.00
.wixproj 28.0 2.535714 1.731669 1.0 2.00 2.0 3.00 8.0 26.0 26.884615 ... 29.75 66.0 26.0 0.094615 0.040913 0.03 0.0625 0.100 0.1100 0.19
.wml 1.0 3.000000 NaN 3.0 3.00 3.0 3.00 3.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.wpj 2.0 5.500000 3.535534 3.0 4.25 5.5 6.75 8.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.wpr 4.0 3.250000 1.892969 2.0 2.00 2.5 3.75 6.0 3.0 16.333333 ... 18.00 18.0 3.0 0.196667 0.117189 0.11 0.1300 0.150 0.2400 0.33
.wse 11.0 19.090909 39.948603 3.0 4.00 8.0 9.50 139.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.wsp 2.0 3.500000 0.707107 3.0 3.25 3.5 3.75 4.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.wxl 11.0 2.818182 4.468069 1.0 1.00 1.0 2.00 16.0 10.0 21.100000 ... 7.00 148.0 10.0 0.192000 0.050067 0.11 0.1700 0.200 0.2000 0.29
.wxl_template 5.0 2.000000 0.707107 1.0 2.00 2.0 2.00 3.0 4.0 11.250000 ... 13.50 18.0 4.0 0.237500 0.120934 0.11 0.1550 0.230 0.3125 0.38
.wxs 54.0 3.648148 2.809401 1.0 2.00 3.0 4.00 16.0 50.0 38.080000 ... 49.00 122.0 50.0 0.116200 0.056996 0.02 0.0625 0.125 0.1500 0.23
.xMAP 1.0 2.000000 NaN 2.0 2.00 2.0 2.00 2.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.xar 1.0 3.000000 NaN 3.0 3.00 3.0 3.00 3.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.xbm 15.0 1.933333 0.258199 1.0 2.00 2.0 2.00 2.0 1.0 6.000000 ... 6.00 6.0 1.0 0.170000 NaN 0.17 0.1700 0.170 0.1700 0.17
.xml 103.0 3.213592 2.962678 1.0 2.00 2.0 5.00 29.0 5.0 26.800000 ... 7.00 115.0 5.0 0.330000 0.193261 0.03 0.2900 0.330 0.5000 0.50
.xpm 8.0 2.000000 0.000000 2.0 2.00 2.0 2.00 2.0 0.0 NaN ... NaN NaN 0.0 NaN NaN NaN NaN NaN NaN NaN
.yml 5.0 10.600000 13.446189 2.0 3.00 4.0 10.00 34.0 3.0 57.000000 ... 70.50 106.0 3.0 0.226667 0.136504 0.07 0.1800 0.290 0.3050 0.32
.zip 8.0 1.750000 0.707107 1.0 1.00 2.0 2.00 3.0 5.0 7.400000 ... 8.00 13.0 5.0 0.616000 0.780244 0.15 0.2500 0.250 0.4300 2.00

268 rows × 24 columns


In [26]:
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))
python_files_df = metadata_df[metadata_df.extension == ".py"]
line_python = python_files_df[python_files_df.line_count> 40]
line_python_sorted = line_python.sort_values(by="relative_churn", ascending=False).head(15)
sns.barplot(y="files", x="relative_churn",data=line_python_sorted)
plt.title('Top 15 CPython Absolute and Relative Churn')
plt.show()



In [48]:
python_files = metadata_df[metadata_df.extension == ".py"]
python_files.describe()


Out[48]:
churn_count line_count relative_churn
count 4693.000000 1824.000000 1824.000000
mean 19.010228 406.422149 0.236837
std 39.943848 733.784818 0.877692
min 1.000000 1.000000 0.000000
25% 3.000000 52.000000 0.050000
50% 7.000000 169.500000 0.100000
75% 16.000000 427.500000 0.192500
max 720.000000 12990.000000 26.910000

In [29]:
from devml.post_processing import git_deleted_files
deletion_counts = git_deleted_files("/Users/noahgift/src/cpython")


2017-10-23 10:00:52,661 - devml.post_processing - INFO - Running del cmd: [git log --diff-filter=D --summary | grep delete] at path [/Users/noahgift/src/cpython]

In [30]:
all_files = metadata_df['files']
deleted_files = deletion_counts['files']
membership = all_files.isin(deleted_files)

In [31]:
metadata_df["deleted_files"] = membership

In [32]:
metadata_df.loc[metadata_df["deleted_files"] == True].median()


Out[32]:
churn_count        4.000
line_count        91.500
relative_churn     0.145
deleted_files      1.000
dtype: float64

In [33]:
metadata_df.loc[metadata_df["deleted_files"] == False].median()


Out[33]:
churn_count         9.0
line_count        149.0
relative_churn      0.1
deleted_files       0.0
dtype: float64

In [34]:
metadata_df.count()


Out[34]:
files             11695
churn_count       11695
line_count         3885
extension         11695
relative_churn     3885
deleted_files     11695
dtype: int64

In [35]:
sns.heatmap(metadata_df.corr(), annot=True)


Out[35]:
<matplotlib.axes._subplots.AxesSubplot at 0x11c50bcc0>

In [36]:
sns.lmplot(x="churn_count", y="line_count", hue="deleted_files", data=metadata_df)


Out[36]:
<seaborn.axisgrid.FacetGrid at 0x11c543908>

In [ ]: