{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": true }, "source": [ "

Table of Contents

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction\n", "In this blog post / notebook, we want to take a look at how much information you can extract from a simple [Git log](https://git-scm.com/docs/git-log) output. We want to know\n", "\n", "* where the developers come from\n", "* on which weekdays the developers don't work\n", "* which developers are working on weekends\n", "* what the normal working hours are and\n", "* if the is any sight of overtime periods.\n", "\n", "We use [Pandas](https://pandas.pydata.org/) as data analysis toolkit to accomplish these tasks for the big open source project [IntelliJ](https://github.com/JetBrains/intellij-community)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Gaining the data\n", "\n", "To get the necessary data, we clone the Git repository with\n", "\n", "```\n", "git clone https://github.com/JetBrains/intellij-community.git\n", "```\n", "\n", "and create a latin-1 encoded log file of the complete commit history with\n", "\n", "```\n", "git log --date=raw --encoding=LATIN-1 --pretty=\"%ad%x09%aN%x09%ae\" > git_timestamp_author_email.log\n", "```\n", "\n", "on the command line.\n", "\n", "\n", "This gives us a nice file with the following content:\n", "\n", "```\n", "1514469569 +0300\tKirill Kirichenko\tkirill.kirichenko@jetbrains.com\n", "1514469402 +0100\tAnna Kozlova\tanna.kozlova@jetbrains.com\n", "1514469119 +0100\tVladimir Krivosheev\tvladimir.krivosheev@jetbrains.com\n", "1514468066 +0100\tVladimir Krivosheev\tvladimir.krivosheev@jetbrains.com\n", "1514462548 +0100\tVladimir Krivosheev\tvladimir.krivosheev@jetbrains.com\n", "...\n", "```\n", "\n", "It includes the UNIX timestamp (in seconds since epoch), a whitespace, the time zone (where the authors live in), a tab separator, the name of the author, a tab and the email address of the author.\n", "\n", "Note:\n", "* We use the `--date=raw` option that returns the UNIX timestamp in the UTC time zone and the author's time zone. We use the UNIX timestamp because Pandas can parse that data format very efficient. We need also the time zone because we want to know when each committer works at their local time.\n", "* We've created and implicitly used a `.mailmap` file for this task to map multiple author names and email addresses to the same person. You can find this file in this [GitHub Gist](https://gist.github.com/feststelltaste/c341ca49c37e143b22bb9adeb84bf89e). To use it, the file has to be put into the root of the Git repository before the execution of the `git log` command." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Wrangling the raw data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We import the data by using Pandas' `read_csv` function and the appropriate parameters." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
unix_timestampauthoremail
01514469569 +0300Kirill Kirichenkokirill.kirichenko@jetbrains.com
11514469402 +0100Anna Kozlovaanna.kozlova@jetbrains.com
21514469119 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com
31514468066 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com
41514462548 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com
\n", "
" ], "text/plain": [ " unix_timestamp author email\n", "0 1514469569 +0300 Kirill Kirichenko kirill.kirichenko@jetbrains.com\n", "1 1514469402 +0100 Anna Kozlova anna.kozlova@jetbrains.com\n", "2 1514469119 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com\n", "3 1514468066 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com\n", "4 1514462548 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "raw = pd.read_csv(\n", " r'../../intellij-community/git_timestamp_author_email.log',\n", " sep=\"\\t\",\n", " encoding=\"latin-1\",\n", " header=None,\n", " names=['unix_timestamp', 'author', 'email'])\n", "\n", "raw.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We need to split the information in `unix_timestamp` into the separate columns `timestamp` and `timezone`." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
unix_timestampauthoremailtimestamptimezone
01514469569 +0300Kirill Kirichenkokirill.kirichenko@jetbrains.com1514469569+0300
11514469402 +0100Anna Kozlovaanna.kozlova@jetbrains.com1514469402+0100
21514469119 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com1514469119+0100
31514468066 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com1514468066+0100
41514462548 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com1514462548+0100
\n", "
" ], "text/plain": [ " unix_timestamp author email \\\n", "0 1514469569 +0300 Kirill Kirichenko kirill.kirichenko@jetbrains.com \n", "1 1514469402 +0100 Anna Kozlova anna.kozlova@jetbrains.com \n", "2 1514469119 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com \n", "3 1514468066 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com \n", "4 1514462548 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com \n", "\n", " timestamp timezone \n", "0 1514469569 +0300 \n", "1 1514469402 +0100 \n", "2 1514469119 +0100 \n", "3 1514468066 +0100 \n", "4 1514462548 +0100 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "raw[['timestamp', 'timezone']] = raw['unix_timestamp'].str.split(\" \", expand=True)\n", "raw.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also create a new numeric column for the timezone offset for later calculations." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
unix_timestampauthoremailtimestamptimezonetimezone_offset
01514469569 +0300Kirill Kirichenkokirill.kirichenko@jetbrains.com1514469569+03003.0
11514469402 +0100Anna Kozlovaanna.kozlova@jetbrains.com1514469402+01001.0
21514469119 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com1514469119+01001.0
31514468066 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com1514468066+01001.0
41514462548 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com1514462548+01001.0
\n", "
" ], "text/plain": [ " unix_timestamp author email \\\n", "0 1514469569 +0300 Kirill Kirichenko kirill.kirichenko@jetbrains.com \n", "1 1514469402 +0100 Anna Kozlova anna.kozlova@jetbrains.com \n", "2 1514469119 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com \n", "3 1514468066 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com \n", "4 1514462548 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com \n", "\n", " timestamp timezone timezone_offset \n", "0 1514469569 +0300 3.0 \n", "1 1514469402 +0100 1.0 \n", "2 1514469119 +0100 1.0 \n", "3 1514468066 +0100 1.0 \n", "4 1514462548 +0100 1.0 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "raw['timezone_offset'] = pd.to_numeric(raw['timezone']) / 100.0\n", "raw.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get a real time column, we convert the information in `timestamp` accordingly." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
unix_timestampauthoremailtimestamptimezonetimezone_offset
01514469569 +0300Kirill Kirichenkokirill.kirichenko@jetbrains.com2017-12-28 13:59:29+03003.0
11514469402 +0100Anna Kozlovaanna.kozlova@jetbrains.com2017-12-28 13:56:42+01001.0
21514469119 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com2017-12-28 13:51:59+01001.0
31514468066 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com2017-12-28 13:34:26+01001.0
41514462548 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com2017-12-28 12:02:28+01001.0
\n", "
" ], "text/plain": [ " unix_timestamp author email \\\n", "0 1514469569 +0300 Kirill Kirichenko kirill.kirichenko@jetbrains.com \n", "1 1514469402 +0100 Anna Kozlova anna.kozlova@jetbrains.com \n", "2 1514469119 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com \n", "3 1514468066 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com \n", "4 1514462548 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com \n", "\n", " timestamp timezone timezone_offset \n", "0 2017-12-28 13:59:29 +0300 3.0 \n", "1 2017-12-28 13:56:42 +0100 1.0 \n", "2 2017-12-28 13:51:59 +0100 1.0 \n", "3 2017-12-28 13:34:26 +0100 1.0 \n", "4 2017-12-28 12:02:28 +0100 1.0 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "raw['timestamp'] = pd.to_datetime(raw['timestamp'], unit=\"s\")\n", "raw.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also calculate the local time of each commit by adding the `timezone_offset` data to the `timestamp` entries." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
unix_timestampauthoremailtimestamptimezonetimezone_offsettimestamp_local
01514469569 +0300Kirill Kirichenkokirill.kirichenko@jetbrains.com2017-12-28 13:59:29+03003.02017-12-28 16:59:29
11514469402 +0100Anna Kozlovaanna.kozlova@jetbrains.com2017-12-28 13:56:42+01001.02017-12-28 14:56:42
21514469119 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com2017-12-28 13:51:59+01001.02017-12-28 14:51:59
31514468066 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com2017-12-28 13:34:26+01001.02017-12-28 14:34:26
41514462548 +0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com2017-12-28 12:02:28+01001.02017-12-28 13:02:28
\n", "
" ], "text/plain": [ " unix_timestamp author email \\\n", "0 1514469569 +0300 Kirill Kirichenko kirill.kirichenko@jetbrains.com \n", "1 1514469402 +0100 Anna Kozlova anna.kozlova@jetbrains.com \n", "2 1514469119 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com \n", "3 1514468066 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com \n", "4 1514462548 +0100 Vladimir Krivosheev vladimir.krivosheev@jetbrains.com \n", "\n", " timestamp timezone timezone_offset timestamp_local \n", "0 2017-12-28 13:59:29 +0300 3.0 2017-12-28 16:59:29 \n", "1 2017-12-28 13:56:42 +0100 1.0 2017-12-28 14:56:42 \n", "2 2017-12-28 13:51:59 +0100 1.0 2017-12-28 14:51:59 \n", "3 2017-12-28 13:34:26 +0100 1.0 2017-12-28 14:34:26 \n", "4 2017-12-28 12:02:28 +0100 1.0 2017-12-28 13:02:28 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "raw[\"timestamp_local\"] = raw['timestamp'] + pd.to_timedelta(raw['timezone_offset'], unit='h')\n", "raw.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At last, we copy only the needed data from the `raw` dataset into the new DataFrame `git_authors`." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timestamp_localtimezoneauthoremail
02017-12-28 16:59:29+0300Kirill Kirichenkokirill.kirichenko@jetbrains.com
12017-12-28 14:56:42+0100Anna Kozlovaanna.kozlova@jetbrains.com
22017-12-28 14:51:59+0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com
32017-12-28 14:34:26+0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com
42017-12-28 13:02:28+0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.com
\n", "
" ], "text/plain": [ " timestamp_local timezone author \\\n", "0 2017-12-28 16:59:29 +0300 Kirill Kirichenko \n", "1 2017-12-28 14:56:42 +0100 Anna Kozlova \n", "2 2017-12-28 14:51:59 +0100 Vladimir Krivosheev \n", "3 2017-12-28 14:34:26 +0100 Vladimir Krivosheev \n", "4 2017-12-28 13:02:28 +0100 Vladimir Krivosheev \n", "\n", " email \n", "0 kirill.kirichenko@jetbrains.com \n", "1 anna.kozlova@jetbrains.com \n", "2 vladimir.krivosheev@jetbrains.com \n", "3 vladimir.krivosheev@jetbrains.com \n", "4 vladimir.krivosheev@jetbrains.com " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "git_authors = raw[['timestamp_local', 'timezone', 'author', 'email']].copy()\n", "git_authors.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Refining the dataset\n", "In this section, we add some additional information to the `DataFrame` to accomplish our tasks." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Adding weekdays\n", "First, we add the information about the weekdays based on the `dayofweek` information of the `timestamp_local` column. We round down possible non-integer values and extract the weekday name from the `calender.day_name` list. Because we want to preserve the order of the weekdays, we convert the `day` entries to a `Categorial` data type, too." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timestamp_localtimezoneauthoremailday
02017-12-28 16:59:29+0300Kirill Kirichenkokirill.kirichenko@jetbrains.comThursday
12017-12-28 14:56:42+0100Anna Kozlovaanna.kozlova@jetbrains.comThursday
22017-12-28 14:51:59+0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.comThursday
32017-12-28 14:34:26+0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.comThursday
42017-12-28 13:02:28+0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.comThursday
\n", "
" ], "text/plain": [ " timestamp_local timezone author \\\n", "0 2017-12-28 16:59:29 +0300 Kirill Kirichenko \n", "1 2017-12-28 14:56:42 +0100 Anna Kozlova \n", "2 2017-12-28 14:51:59 +0100 Vladimir Krivosheev \n", "3 2017-12-28 14:34:26 +0100 Vladimir Krivosheev \n", "4 2017-12-28 13:02:28 +0100 Vladimir Krivosheev \n", "\n", " email day \n", "0 kirill.kirichenko@jetbrains.com Thursday \n", "1 anna.kozlova@jetbrains.com Thursday \n", "2 vladimir.krivosheev@jetbrains.com Thursday \n", "3 vladimir.krivosheev@jetbrains.com Thursday \n", "4 vladimir.krivosheev@jetbrains.com Thursday " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import calendar\n", "\n", "git_authors['day'] = git_authors[\"timestamp_local\"].apply(lambda x : calendar.day_name[int(x.dayofweek)])\n", "git_authors['day'] = pd.Categorical(git_authors['day'], categories=calendar.day_name, ordered=True)\n", "git_authors.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Adding working hours\n", "For the working hour analysis, we extract the hour information from the `timestamp_local` columns." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timestamp_localtimezoneauthoremaildayhour
02017-12-28 16:59:29+0300Kirill Kirichenkokirill.kirichenko@jetbrains.comThursday16
12017-12-28 14:56:42+0100Anna Kozlovaanna.kozlova@jetbrains.comThursday14
22017-12-28 14:51:59+0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.comThursday14
32017-12-28 14:34:26+0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.comThursday14
42017-12-28 13:02:28+0100Vladimir Krivosheevvladimir.krivosheev@jetbrains.comThursday13
\n", "
" ], "text/plain": [ " timestamp_local timezone author \\\n", "0 2017-12-28 16:59:29 +0300 Kirill Kirichenko \n", "1 2017-12-28 14:56:42 +0100 Anna Kozlova \n", "2 2017-12-28 14:51:59 +0100 Vladimir Krivosheev \n", "3 2017-12-28 14:34:26 +0100 Vladimir Krivosheev \n", "4 2017-12-28 13:02:28 +0100 Vladimir Krivosheev \n", "\n", " email day hour \n", "0 kirill.kirichenko@jetbrains.com Thursday 16 \n", "1 anna.kozlova@jetbrains.com Thursday 14 \n", "2 vladimir.krivosheev@jetbrains.com Thursday 14 \n", "3 vladimir.krivosheev@jetbrains.com Thursday 14 \n", "4 vladimir.krivosheev@jetbrains.com Thursday 13 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "git_authors['hour'] = git_authors['timestamp_local'].dt.hour\n", "git_authors.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Analyzing the data\n", "With the prepared `git_authors` DataFrame, we are now able to deliver insights into the past years of development." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Developers' timezones\n", "First, we want to know where the developers roughly live. For this, we plot the values of the `timezone` columns as a pie chart." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "git_authors['timezone'].value_counts().plot(kind='pie', figsize=(7,7), title=\"Developer's timezones\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Result**\n", "\n", "The majority of the developers' lives in the time zones +0300 and +0400. Looking at a time zone map ([source](https://commons.wikimedia.org/wiki/File:Standard_World_Time_Zones.png)) and on the [website](https://www.jetbrains.com/company/contacts/) of the company that mainly maintains the project, we can defer that most of the developers are probably working from Russia.\n", "\n", "![](resources/developers_habits_timezone.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Weekdays with the most commits\n", "\n", "Next, we want to know on which days the developers are working during the week. We count by the weekdays but avoid sorting the results to keep the order along our categories." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Monday 38605\n", "Tuesday 40611\n", "Wednesday 40988\n", "Thursday 40487\n", "Friday 37459\n", "Saturday 6896\n", "Sunday 5355\n", "Name: day, dtype: int64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "commits_per_weekday = git_authors['day'].value_counts(sort=False)\n", "commits_per_weekday" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We plot the result as a standard bar chart." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = commits_per_weekday.plot(kind='bar', title=\"Commits per weekday\")\n", "ax.set_xlabel('weekday')\n", "ax.set_ylabel('# commits')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Result:** \n", "\n", "Most of the commits occur during normal working days. There are just a few commits on weekends." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Working behavior on weekends\n", "We take a look at the type of weekend workers. We want to see, if the commits come from the main developing company JetBrains or from other voluntary contributors that work on the open source project on weekends.\n", "\n", "As an approximation, we use the domain name that is included in the author's email addresses to decide if an author is an employee of JetBrains or not. We use a separate DataFrame `weekend_workers` for this task." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
dayemailemployee
0Thursdaykirill.kirichenko@jetbrains.comTrue
1Thursdayanna.kozlova@jetbrains.comTrue
2Thursdayvladimir.krivosheev@jetbrains.comTrue
3Thursdayvladimir.krivosheev@jetbrains.comTrue
4Thursdayvladimir.krivosheev@jetbrains.comTrue
\n", "
" ], "text/plain": [ " day email employee\n", "0 Thursday kirill.kirichenko@jetbrains.com True\n", "1 Thursday anna.kozlova@jetbrains.com True\n", "2 Thursday vladimir.krivosheev@jetbrains.com True\n", "3 Thursday vladimir.krivosheev@jetbrains.com True\n", "4 Thursday vladimir.krivosheev@jetbrains.com True" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "weekend_workers = git_authors[['day', 'email']].copy()\n", "weekend_workers['employee'] = weekend_workers['email'].str.lower().str.endswith(\"@jetbrains.com\")\n", "weekend_workers.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We group and count the weekdays and employee information and store the result in the new DataFrame `commits_per_weekday_employee`. " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
email
employeeFalseTrue
day
Monday642832177
Tuesday641134200
Wednesday651534473
Thursday665833829
Friday572031739
Saturday13535543
Sunday9334422
\n", "
" ], "text/plain": [ " email \n", "employee False True \n", "day \n", "Monday 6428 32177\n", "Tuesday 6411 34200\n", "Wednesday 6515 34473\n", "Thursday 6658 33829\n", "Friday 5720 31739\n", "Saturday 1353 5543\n", "Sunday 933 4422" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "commits_per_weekday_employee = weekend_workers.groupby(['day', 'employee']).count().unstack()\n", "commits_per_weekday_employee" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To be able to spot differences more easily, we calculate the ratio between the employed developers and all developers." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
emailemployed_ratio
employeeFalseTrue
day
Monday6428321770.833493
Tuesday6411342000.842136
Wednesday6515344730.841051
Thursday6658338290.835552
Friday5720317390.847300
Saturday135355430.803799
Sunday93344220.825770
\n", "
" ], "text/plain": [ " email employed_ratio\n", "employee False True \n", "day \n", "Monday 6428 32177 0.833493\n", "Tuesday 6411 34200 0.842136\n", "Wednesday 6515 34473 0.841051\n", "Thursday 6658 33829 0.835552\n", "Friday 5720 31739 0.847300\n", "Saturday 1353 5543 0.803799\n", "Sunday 933 4422 0.825770" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "commits_per_weekday_employee['employed_ratio'] = \\\n", " commits_per_weekday_employee['email'][True] / \\\n", " commits_per_weekday_employee['email'].sum(axis=1)\n", "commits_per_weekday_employee" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We plot this new information in a second bar chart to see possible differences in the committing behavior between IntelliJ employees and other contributors." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nrkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = commits_per_weekday_employee['employed_ratio'].plot(\n", " kind='bar', color='g', title=\"Ratio of commits from employed authors\")\n", "ax.set_xlabel(\"weekdays\")\n", "ax.set_xlabel(\"ratio\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Result**\n", "\n", "There is only a slight, non-significant difference between the ratio of employed and non-employed contributors on weekends." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Usual working hours\n", "To find out about the working habits of the contributors, we group the commits by `hour` and count the entries (in this case we choose `author`) to see if there are any irregularities." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "hour\n", "0 2083\n", "1 1397\n", "2 825\n", "3 485\n", "4 311\n", "Name: author, dtype: int64" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "working_hours = git_authors.groupby(['hour'])['author'].count()\n", "working_hours.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, we plot the results with a standard bar chart." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nispBwJeBnYBzgPuBlyLi6HYkZmZmnafmMZWI+GJETACWATOBQcBISb+SdG2b8jMzsw7SzCnFN6bT\neudJ+v8Rsb+kEa1OzMzMOk/DU4oj4gulh0eltqdblZCZmXWubt2mJSLua1UiZmbW+dp97y8zM9uA\nuaiYmVk2LipmZpaNi4qZmWXjomJmZtm4qJiZWTYuKmZmlo2LipmZZeOiYmZm2biomJlZNi4qZmaW\njYuKmZll46JiZmbZuKiYmVk2LipmZpaNi4qZmWXjomJmZtm4qJiZWTYuKmZmlo2LipmZZeOiYmZm\n2biomJlZNoP7OgEzM+udMdOuq7ls2fRJbczEeypmZpaRi4qZmWXjomJmZtm4qJiZWTYuKmZmlo2L\nipmZZdMnRUXSMknzJd0raV5q20rSzZIeTj+HldY/RdJiSQ9JOqjUvlfqZ7GkcyWpL56PmZkV+nJP\n5f0RsWdEjEuPpwG3RsRY4Nb0GEm7AZOB3YGJwPmSBqWYC4BPAWPTNLGN+ZuZWYX+dPHjIcD4NH8x\ncDtwcmq/IiJeBpZKWgzsLWkZMCQi7gSQdAlwKDCnvWnbQNGfLjAz66/6ak8lgFsk3SNpamobFRFP\npPkngVFpfjTwWCl2eWobneYr2/+CpKmS5kmat2rVqlzPwczMKvTVnsr+EbFC0puBmyU9WF4YESEp\ncm0sImYAMwDGjRuXrV8zM1tfn+ypRMSK9HMlcDWwN/CUpG0A0s+VafUVwPal8O1S24o0X9luZmZ9\npO1FRdIbJW3ZNQ98AFgAzAampNWmANek+dnAZEmbStqR4oD8XWmobI2kfdNZX0eWYszMrA/0xfDX\nKODqdPbvYOCyiLhB0t3ALEnHAI8AHwWIiIWSZgEPAGuB4yJiXerrWOAiYDOKA/Q+SG9m1ofaXlQi\nYgnwrirtq4EJNWLOBM6s0j4P2CN3jmZm1jO+ot7MzLJxUTEzs2xcVMzMLBsXFTMzy8ZFxczMsnFR\nMTOzbFxUzMwsm/50l2IzM2ujVtx523sqZmaWjYuKmZll46JiZmbZuKiYmVk2LipmZpaNi4qZmWXj\nomJmZtm4qJiZWTYuKmZmlo2LipmZZeOiYmZm2fjeXzbgtOJ+R2ZW8J6KmZll46JiZmbZDPjhLw+F\nmJnl4z0VMzPLxkXFzMyycVExM7NsXFTMzCwbFxUzM8tmwJ/91VO1zhrzGWNmNpB5T8XMzLJxUTEz\n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\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = working_hours.plot(kind='bar')\n", "ax.set_title(\"Distribution of working hours\")\n", "ax.yaxis.set_label_text(\"# commits\")\n", "ax.xaxis.set_label_text(\"hour\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Result**\n", "\n", "The distribution of the working hours is a nice Gaussian distribution. It seems that this open source project is mainly developed by developers in their full-time jobs." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Signs of overtime \n", "\n", "At last, we have a look at possible overtime periods. For this, we first group all commits on a weekly basis per authors. As grouping function, we choose `max()` to get the hour where each author committed at latest per week." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hour
timestamp_localauthor
2004-11-07Olesya Smirnova20
2004-11-14Alexey Kudravtsev16
Olesya Smirnova22
2004-11-21Anna Kozlova21
Olesya Smirnova19
\n", "
" ], "text/plain": [ " hour\n", "timestamp_local author \n", "2004-11-07 Olesya Smirnova 20\n", "2004-11-14 Alexey Kudravtsev 16\n", " Olesya Smirnova 22\n", "2004-11-21 Anna Kozlova 21\n", " Olesya Smirnova 19" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "latest_hour_per_week = git_authors.groupby(\n", " [\n", " pd.Grouper(key='timestamp_local', freq='1w'), \n", " 'author']\n", ")[['hour']].max()\n", "\n", "latest_hour_per_week.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we want to know if there were any stressful time periods that forced the developers to work overtime over a longer period of time. We calculate the mean of all late stays of all authors for each week." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hour
timestamp_local
2004-11-0720.000000
2004-11-1419.000000
2004-11-2113.666667
2004-12-0516.666667
2004-12-1215.333333
\n", "
" ], "text/plain": [ " hour\n", "timestamp_local \n", "2004-11-07 20.000000\n", "2004-11-14 19.000000\n", "2004-11-21 13.666667\n", "2004-12-05 16.666667\n", "2004-12-12 15.333333" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mean_latest_hours_per_week = latest_hour_per_week.reset_index().groupby('timestamp_local').mean()\n", "mean_latest_hours_per_week.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also create a trend line that shows how the contributors are working over the span of the past years. We use the `polyfit` function from `numpy` for this which needs a numeric index to calculate the polynomial coefficients later on." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "range(0, 684)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numeric_index = range(0, len(mean_latest_hours_per_week.index.week))\n", "numeric_index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We then calculate the coeffiecients with a three-dimensional polynomial based on the hours of the `mean_latest_hours_per_week` DataFrame." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ -2.35626413e-08, 2.54703899e-05, -9.85330587e-03,\n", " 2.02637516e+01])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "coefficients = np.polyfit(numeric_index, mean_latest_hours_per_week.hour, 3)\n", "coefficients" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For visualization, we decrease the number of degrees and calculate the y-coordinates for all weeks that are encoded in `numeric_index`." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 20.2637516 , 20.25392374, 20.24414669, 20.23442028, 20.2247444 ])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "polynomial = np.poly1d(coefficients)\n", "ys = polynomial(numeric_index)\n", "ys[:5]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At last, we plot the results of the `mean_latest_hours_per_week` DataFrame as well as the trend line in one line plot." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nHzPbqZbI+FwEAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = mean_latest_hours_per_week['hour'].plot(\n", " figsize=(10, 6), color='k', alpha=0.2, title=\"Late hours per weeks\")\n", "ax.set_xlabel(\"time\")\n", "ax.set_ylabel(\"hour\")\n", "ax.plot(mean_latest_hours_per_week.index, ys)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Result**\n", "\n", "We can see that the late hours are decreasing over time (almost two hours during the last 12 years). There is no sign of regular death marches. In general, this could be a good sign, leading to a work-life balance." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Closing remarks\n", "\n", "We've seen that various metrics and results can be easily created from a simple Git log output file. With Pandas, it's possible to get to know the habits of the developers of software projects." ] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.2" }, "toc": { "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "toc_cell": true, "toc_position": { "height": "441px", "left": "0px", "right": "1040.17px", "top": "107px", "width": "212px" }, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }