Skip to content

Instantly share code, notes, and snippets.

@albertovilla
Created February 17, 2018 10:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save albertovilla/0a85e943e741f803aab06d2e3ca8cd79 to your computer and use it in GitHub Desktop.
Save albertovilla/0a85e943e741f803aab06d2e3ca8cd79 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{"nbformat":4,"nbformat_minor":2,"metadata":{"language_info":{"file_extension":".py","pygments_lexer":"ipython3","codemirror_mode":{"name":"ipython","version":3},"nbconvert_exporter":"python","name":"python","version":"3.5.2","mimetype":"text/x-python"},"kernelspec":{"language":"python","name":"python3","display_name":"Python 3"}},"cells":[{"source":"## 1. Introduction\n<p>Version control repositories like CVS, Subversion or Git can be a real gold mine for software developers. They contain every change to the source code including the date (the \"when\"), the responsible developer (the \"who\"), as well as little message that describes the intention (the \"what\") of a change.</p>\n<p><a href=\"https://commons.wikimedia.org/wiki/File:Tux.svg\">\n<img style=\"float: right;margin:5px 20px 5px 1px\" width=\"150px\" src=\"https://s3.amazonaws.com/assets.datacamp.com/production/project_111/img/tux.png\" alt=\"Tux - the Linux mascot\">\n</a></p>\n<p>In this notebook, we will analyze the evolution of a very famous open-source project &ndash; the Linux kernel. The Linux kernel is the heart of some Linux distributions like Debian, Ubuntu or CentOS. </p>\n<p>We get some first insights into the work of the development efforts by </p>\n<ul>\n<li>identifying the TOP 10 contributors and</li>\n<li>visualizing the commits over the years.</li>\n</ul>\n<p>Linus Torvalds, the (spoiler alert!) main contributor to the Linux kernel (and also the creator of Git), created a <a href=\"https://github.com/torvalds/linux/\">mirror of the Linux repository on GitHub</a>. It contains the complete history of kernel development for the last 13 years.</p>\n<p>For our analysis, we will use a Git log file with the following content:</p>","metadata":{"dc":{"key":"4"},"run_control":{"frozen":true},"tags":["context"],"deletable":false,"editable":false},"cell_type":"markdown"},{"source":"# Printing the content of git_log_excerpt.csv\n# ... YOUR CODE FOR TASK 1 ...\nlog = open('datasets/git_log_excerpt.csv', 'r')\nprint(log.read())","metadata":{"dc":{"key":"4"},"trusted":true,"tags":["sample_code"]},"cell_type":"code","execution_count":176,"outputs":[{"output_type":"stream","name":"stdout","text":"1502382966#Linus Torvalds\n1501368308#Max Gurtovoy\n1501625560#James Smart\n1501625559#James Smart\n1500568442#Martin Wilck\n1502273719#Xin Long\n1502278684#Nikolay Borisov\n1502238384#Girish Moodalbail\n1502228709#Florian Fainelli\n1502223836#Jon Paul Maloy\n"}]},{"source":"## 2. Reading in the dataset\n<p>The dataset was created by using the command <code>git log --encoding=latin-1 --pretty=\"%at#%aN\"</code>. The <code>latin-1</code> encoded text output was saved in a header-less csv file. In this file, each row is a commit entry with the following information:</p>\n<ul>\n<li><code>timestamp</code>: the time of the commit as a UNIX timestamp in seconds since 1970-01-01 00:00:00 (Git log placeholder \"<code>%at</code>\")</li>\n<li><code>author</code>: the name of the author that performed the commit (Git log placeholder \"<code>%aN</code>\")</li>\n</ul>\n<p>The columns are separated by the number sign <code>#</code>. The complete dataset is in the <code>datasets/</code> directory. It is a <code>gz</code>-compressed csv file named <code>git_log.gz</code>.</p>","metadata":{"dc":{"key":"11"},"run_control":{"frozen":true},"tags":["context"],"deletable":false,"editable":false},"cell_type":"markdown"},{"source":"# Loading in the pandas module\n# ... YOUR CODE FOR TASK 2 ...\nimport pandas as pd\n\n# Reading in the log file\ngit_log = pd.read_csv('datasets/git_log.gz', sep='#', encoding='latin-1', header=None, names=['timestamp', 'author'])\n\n# Printing out the first 5 rows\n# ... YOUR CODE FOR TASK 2 ...\nprint(git_log.head(5))","metadata":{"dc":{"key":"11"},"trusted":true,"tags":["sample_code"]},"cell_type":"code","execution_count":178,"outputs":[{"output_type":"stream","name":"stdout","text":" timestamp author\n0 1502826583 Linus Torvalds\n1 1501749089 Adrian Hunter\n2 1501749088 Adrian Hunter\n3 1501882480 Kees Cook\n4 1497271395 Rob Clark\n"}]},{"source":"## 3. Getting an overview\n<p>The dataset contains the information about every single code contribution (a \"commit\") to the Linux kernel over the last 13 years. We'll first take a look at the number of authors and their commits to the repository.</p>","metadata":{"dc":{"key":"18"},"run_control":{"frozen":true},"tags":["context"],"deletable":false,"editable":false},"cell_type":"markdown"},{"source":"# calculating number of commits\nnumber_of_commits = git_log.shape[0]\n\n# calculating number of authors\nnumber_of_authors = len(git_log.dropna().author.unique())\n\n# printing out the results\nprint(\"%s authors committed %s code changes.\" % (number_of_authors, number_of_commits))","metadata":{"dc":{"key":"18"},"trusted":true,"tags":["sample_code"]},"cell_type":"code","execution_count":180,"outputs":[{"output_type":"stream","name":"stdout","text":"17385 authors committed 699071 code changes.\n"}]},{"source":"## 4. Finding the TOP 10 contributors\n<p>There are some very important people that changed the Linux kernel very often. To see if there are any bottlenecks, we take a look at the TOP 10 authors with the most commits.</p>","metadata":{"dc":{"key":"25"},"run_control":{"frozen":true},"tags":["context"],"deletable":false,"editable":false},"cell_type":"markdown"},{"source":"# Identifying the top 10 authors\ntop_10_authors = git_log.groupby(['author']).agg('count').sort_values(by=['timestamp'], ascending=False)[0:10]\n\n# Listing contents of 'top_10_authors'\ntop_10_authors","metadata":{"dc":{"key":"25"},"trusted":true,"tags":["sample_code"]},"cell_type":"code","execution_count":182,"outputs":[{"output_type":"execute_result","execution_count":182,"metadata":{},"data":{"text/plain":" timestamp\nauthor \nLinus Torvalds 23361\nDavid S. Miller 9106\nMark Brown 6802\nTakashi Iwai 6209\nAl Viro 6006\nH Hartley Sweeten 5938\nIngo Molnar 5344\nMauro Carvalho Chehab 5204\nArnd Bergmann 4890\nGreg Kroah-Hartman 4580","text/html":"<div>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>timestamp</th>\n </tr>\n <tr>\n <th>author</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>Linus Torvalds</th>\n <td>23361</td>\n </tr>\n <tr>\n <th>David S. Miller</th>\n <td>9106</td>\n </tr>\n <tr>\n <th>Mark Brown</th>\n <td>6802</td>\n </tr>\n <tr>\n <th>Takashi Iwai</th>\n <td>6209</td>\n </tr>\n <tr>\n <th>Al Viro</th>\n <td>6006</td>\n </tr>\n <tr>\n <th>H Hartley Sweeten</th>\n <td>5938</td>\n </tr>\n <tr>\n <th>Ingo Molnar</th>\n <td>5344</td>\n </tr>\n <tr>\n <th>Mauro Carvalho Chehab</th>\n <td>5204</td>\n </tr>\n <tr>\n <th>Arnd Bergmann</th>\n <td>4890</td>\n </tr>\n <tr>\n <th>Greg Kroah-Hartman</th>\n <td>4580</td>\n </tr>\n </tbody>\n</table>\n</div>"}}]},{"source":"## 5. Wrangling the data\n<p>For our analysis, we want to visualize the contributions over time. For this, we use the information in the <code>timestamp</code> column to create a time series-based column.</p>","metadata":{"dc":{"key":"32"},"run_control":{"frozen":true},"tags":["context"],"deletable":false,"editable":false},"cell_type":"markdown"},{"source":"# converting the timestamp column\n# ... YOUR CODE FOR TASK 5 ...\ngit_log.timestamp = pd.to_datetime(git_log['timestamp'], unit='s')\n\n# summarizing the converted timestamp column\n# ... YOUR CODE FOR TASK 5 ...\ngit_log.timestamp.describe()","metadata":{"dc":{"key":"32"},"trusted":true,"tags":["sample_code"]},"cell_type":"code","execution_count":184,"outputs":[{"output_type":"execute_result","execution_count":184,"metadata":{},"data":{"text/plain":"count 699071\nunique 668448\ntop 2008-09-04 05:30:19\nfreq 99\nfirst 1970-01-01 00:00:01\nlast 2037-04-25 08:08:26\nName: timestamp, dtype: object"}}]},{"source":"## 6. Treating wrong timestamps\n<p>As we can see from the results above, some contributors had their operating system's time incorrectly set when they committed to the repository. We'll clean up the <code>timestamp</code> column by dropping the rows with the incorrect timestamps.</p>","metadata":{"dc":{"key":"39"},"run_control":{"frozen":true},"tags":["context"],"deletable":false,"editable":false},"cell_type":"markdown"},{"source":"# determining the first real commit timestamp\nfrom_2005_to_2018 = (git_log.timestamp > '2005-04-16 22:20:00') & (git_log.timestamp <= '2018-02-17 00:00:00')\nvalid_timestamps = git_log[from_2005_to_2018].sort_values(by=['timestamp']).timestamp\n\nvalid_timestamps = valid_timestamps.reset_index()\n\nfirst_commit_timestamp = valid_timestamps.timestamp[0]\n\n# determining the last sensible commit timestamp\nlast_commit_timestamp = valid_timestamps.timestamp[len(valid_timestamps)-1]\n\n# filtering out wrong timestamps\ncorrected_log = git_log[(git_log.timestamp >= first_commit_timestamp) & (git_log.timestamp <= last_commit_timestamp)]\n\n# summarizing the corrected timestamp column\n# ... YOUR CODE FOR TASK 6 ...\ncorrected_log.describe()","metadata":{"dc":{"key":"39"},"trusted":true,"tags":["sample_code"]},"cell_type":"code","execution_count":186,"outputs":[{"output_type":"execute_result","execution_count":186,"metadata":{},"data":{"text/plain":" timestamp author\ncount 698569 698568\nunique 667977 17375\ntop 2008-09-04 05:30:19 Linus Torvalds\nfreq 99 23361\nfirst 2005-04-16 22:20:36 NaN\nlast 2017-10-03 12:57:00 NaN","text/html":"<div>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>timestamp</th>\n <th>author</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>count</th>\n <td>698569</td>\n <td>698568</td>\n </tr>\n <tr>\n <th>unique</th>\n <td>667977</td>\n <td>17375</td>\n </tr>\n <tr>\n <th>top</th>\n <td>2008-09-04 05:30:19</td>\n <td>Linus Torvalds</td>\n </tr>\n <tr>\n <th>freq</th>\n <td>99</td>\n <td>23361</td>\n </tr>\n <tr>\n <th>first</th>\n <td>2005-04-16 22:20:36</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>last</th>\n <td>2017-10-03 12:57:00</td>\n <td>NaN</td>\n </tr>\n </tbody>\n</table>\n</div>"}}]},{"source":"## 7. Grouping commits per year\n<p>To find out how the development activity has increased over time, we'll group the commits by year and count them up.</p>","metadata":{"dc":{"key":"46"},"run_control":{"frozen":true},"tags":["context"],"deletable":false,"editable":false},"cell_type":"markdown"},{"source":"# Counting the no. commits per year\n# commits_per_year = corrected_log.groupby(corrected_log.timestamp.dt.year).agg('count')\ncommits_per_year = corrected_log.groupby(pd.Grouper(key='timestamp', freq='AS')).agg('count')\n\n# Listing the first rows\n# ... YOUR CODE FOR TASK 7 ...\nprint(commits_per_year.head())","metadata":{"dc":{"key":"46"},"trusted":true,"tags":["sample_code"]},"cell_type":"code","execution_count":188,"outputs":[{"output_type":"stream","name":"stdout","text":" author\ntimestamp \n2005-01-01 16229\n2006-01-01 29255\n2007-01-01 33759\n2008-01-01 48847\n2009-01-01 52572\n"}]},{"source":"## 8. Visualizing the history of Linux\n<p>Finally, we'll make a plot out of these counts to better see how the development effort on Linux has increased over the the last few years. </p>","metadata":{"dc":{"key":"53"},"run_control":{"frozen":true},"tags":["context"],"deletable":false,"editable":false},"cell_type":"markdown"},{"source":"# Setting up plotting in Jupyter notebooks\n%matplotlib inline\n\n# plot the data\n# ... YOUR CODE FOR TASK 8 ...\ncommits_per_year.plot(title='Linux commits evolution', kind='bar', legend='off')","metadata":{"dc":{"key":"53"},"trusted":true,"tags":["sample_code"]},"cell_type":"code","execution_count":190,"outputs":[{"output_type":"execute_result","execution_count":190,"metadata":{},"data":{"text/plain":"<matplotlib.axes._subplots.AxesSubplot at 0x7f7b157f0b38>"}},{"output_type":"display_data","metadata":{},"data":{"text/plain":"<matplotlib.figure.Figure at 0x7f7b12aa84e0>","image/png":"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\n"}}]},{"source":"## 9. Conclusion\n<p>Thanks to the solid foundation and caretaking of Linux Torvalds, many other developers are now able to contribute to the Linux kernel as well. There is no decrease of development activity at sight!</p>","metadata":{"dc":{"key":"60"},"run_control":{"frozen":true},"tags":["context"],"deletable":false,"editable":false},"cell_type":"markdown"},{"source":"# calculating or setting the year with the most commits to Linux\n\nyear_with_most_commits = commits_per_year.idxmax()","metadata":{"dc":{"key":"60"},"trusted":true,"tags":["sample_code"]},"cell_type":"code","execution_count":192,"outputs":[]}]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment