Skip to content

Instantly share code, notes, and snippets.

@michael-simons
Last active June 14, 2018 11:43
Show Gist options
  • Select an option

  • Save michael-simons/84306eafc19f35318d3a888cfeb80166 to your computer and use it in GitHub Desktop.

Select an option

Save michael-simons/84306eafc19f35318d3a888cfeb80166 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I'll announced that I'll write a Spring Boot back in [November 2016](https://twitter.com/rotnroll666/status/811528714743857152). It's now end of April 2018, about 12 months after I wrote about [\"getting there\"](http://info.michael-simons.eu/2017/04/01/spring-boot-buch-getting-there/).\n",
"\n",
"I had several real good converstations the last week: At our INNOQ booth, in the hallway track and also after my talk with [@bitboss](https://twitter.com/bitboss) about [Hot topics in Spring Boot 2](https://speakerdeck.com/michaelsimons/jax-2018-spring-boot-2-hot-topics) at JAX 2018. Some of them centered around the process of writing a book, how much time I spend and when I spent it. My previous company, [ENERKO INFORMATIK](http://www.enerko-informatik.de) in Aachen did support me a lot throughout the first half of 2017, when I did most of the actual writing. \n",
"\n",
"In this analysis I'll try to use some of the techniques and tools [Markus Harrer](https://twitter.com/feststelltaste) is promoting in his very good blog [feststelltaste](https://www.feststelltaste.de). Thanks a lot Markus for introducing me to this approach.\n",
"\n",
"First we define the base directory of my books repository relativ to the folder where this notebook is stored:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"repository_base = '../springbootbuch'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Analysis based on the Git commit log\n",
"\n",
"### Retrieving the log\n",
"\n",
"The book is written in LaTeX and split around a whole bunch of `*.tex` files in a private Git repository. Therefor the history can be easily retrieved with:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"!git --git-dir={repository_base}/.git --work-tree={repository_base} \\\n",
" log --reverse --date=raw --encoding=LATIN-1 --pretty=\"%ad%x09%aN%x09%ae\" \\\n",
" > git_timestamp_author_email.log"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One might say I'm the only author so author information isn't relevant, but that's not entirely true. My wife [Christina](https://twitter.com/tinasimons) actually not only helped on a moral level, but during review and spellchecking."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Prepare the raw log data\n",
"\n",
"This is the part why I start stealing pretty bluntly from Markus:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>unix_timestamp</th>\n",
" <th>author</th>\n",
" <th>email</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1480439402 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1480439474 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1480440285 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1480440484 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1480603776 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" unix_timestamp author email\n",
"0 1480439402 +0100 Michael J. Simons michael@simons.ac\n",
"1 1480439474 +0100 Michael J. Simons michael@simons.ac\n",
"2 1480440285 +0100 Michael J. Simons michael@simons.ac\n",
"3 1480440484 +0100 Michael J. Simons michael@simons.ac\n",
"4 1480603776 +0100 Michael J. Simons michael@simons.ac"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"\n",
"raw = pd.read_csv(\n",
" r'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": [
"I'm only interested in the timestamp, not in the timezone, but I need it to compute my local time:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>unix_timestamp</th>\n",
" <th>author</th>\n",
" <th>email</th>\n",
" <th>timestamp</th>\n",
" <th>timezone</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1480439402 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:10:02</td>\n",
" <td>+0100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1480439474 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:11:14</td>\n",
" <td>+0100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1480440285 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:24:45</td>\n",
" <td>+0100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1480440484 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:28:04</td>\n",
" <td>+0100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1480603776 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-12-01 15:49:36</td>\n",
" <td>+0100</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" unix_timestamp author email timestamp \\\n",
"0 1480439402 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:10:02 \n",
"1 1480439474 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:11:14 \n",
"2 1480440285 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:24:45 \n",
"3 1480440484 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:28:04 \n",
"4 1480603776 +0100 Michael J. Simons michael@simons.ac 2016-12-01 15:49:36 \n",
"\n",
" timezone \n",
"0 +0100 \n",
"1 +0100 \n",
"2 +0100 \n",
"3 +0100 \n",
"4 +0100 "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"raw[['timestamp', 'timezone']] = raw['unix_timestamp'].str.split(\" \", expand=True)\n",
"raw['timestamp'] = pd.to_datetime(\n",
" raw['timestamp'], unit=\"s\") + pd.to_timedelta(pd.to_numeric(raw['timezone']) / 100.0, unit='h')\n",
"raw.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Generate additional data\n",
"\n",
"To do some interesting analysis, there are some things missing:\n",
"\n",
"* Day of the week\n",
"* \"Working\" hours\n",
"* time between comits\n",
"\n",
"The last point is interesting: I'm doing usually very fine granular commits very often and I don't squash them in my private projects. I guess I can compute the net time spend on this pretty well from the days where I didn't commit anything.\n",
"\n",
"First, add the weekdays as a set of categorical data"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>unix_timestamp</th>\n",
" <th>author</th>\n",
" <th>email</th>\n",
" <th>timestamp</th>\n",
" <th>timezone</th>\n",
" <th>weekday</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1480439402 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:10:02</td>\n",
" <td>+0100</td>\n",
" <td>Tuesday</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1480439474 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:11:14</td>\n",
" <td>+0100</td>\n",
" <td>Tuesday</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1480440285 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:24:45</td>\n",
" <td>+0100</td>\n",
" <td>Tuesday</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1480440484 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:28:04</td>\n",
" <td>+0100</td>\n",
" <td>Tuesday</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1480603776 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-12-01 15:49:36</td>\n",
" <td>+0100</td>\n",
" <td>Thursday</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" unix_timestamp author email timestamp \\\n",
"0 1480439402 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:10:02 \n",
"1 1480439474 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:11:14 \n",
"2 1480440285 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:24:45 \n",
"3 1480440484 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:28:04 \n",
"4 1480603776 +0100 Michael J. Simons michael@simons.ac 2016-12-01 15:49:36 \n",
"\n",
" timezone weekday \n",
"0 +0100 Tuesday \n",
"1 +0100 Tuesday \n",
"2 +0100 Tuesday \n",
"3 +0100 Tuesday \n",
"4 +0100 Thursday "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import calendar\n",
"\n",
"raw['weekday'] = pd.Categorical(\n",
" raw[\"timestamp\"].dt.weekday_name, \n",
" categories=calendar.day_name,\n",
" ordered=True)\n",
"raw.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Extract the hour of all the timestamps for using in groups etc."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>unix_timestamp</th>\n",
" <th>author</th>\n",
" <th>email</th>\n",
" <th>timestamp</th>\n",
" <th>timezone</th>\n",
" <th>weekday</th>\n",
" <th>hour</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1480439402 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:10:02</td>\n",
" <td>+0100</td>\n",
" <td>Tuesday</td>\n",
" <td>18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1480439474 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:11:14</td>\n",
" <td>+0100</td>\n",
" <td>Tuesday</td>\n",
" <td>18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1480440285 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:24:45</td>\n",
" <td>+0100</td>\n",
" <td>Tuesday</td>\n",
" <td>18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1480440484 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:28:04</td>\n",
" <td>+0100</td>\n",
" <td>Tuesday</td>\n",
" <td>18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1480603776 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-12-01 15:49:36</td>\n",
" <td>+0100</td>\n",
" <td>Thursday</td>\n",
" <td>15</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" unix_timestamp author email timestamp \\\n",
"0 1480439402 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:10:02 \n",
"1 1480439474 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:11:14 \n",
"2 1480440285 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:24:45 \n",
"3 1480440484 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:28:04 \n",
"4 1480603776 +0100 Michael J. Simons michael@simons.ac 2016-12-01 15:49:36 \n",
"\n",
" timezone weekday hour \n",
"0 +0100 Tuesday 18 \n",
"1 +0100 Tuesday 18 \n",
"2 +0100 Tuesday 18 \n",
"3 +0100 Tuesday 18 \n",
"4 +0100 Thursday 15 "
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"raw['hour'] = raw['timestamp'].dt.hour\n",
"raw.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One interesting note is the number of days between commits"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>unix_timestamp</th>\n",
" <th>author</th>\n",
" <th>email</th>\n",
" <th>timestamp</th>\n",
" <th>timezone</th>\n",
" <th>weekday</th>\n",
" <th>hour</th>\n",
" <th>days_between_previous</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1480439402 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:10:02</td>\n",
" <td>+0100</td>\n",
" <td>Tuesday</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1480439474 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:11:14</td>\n",
" <td>+0100</td>\n",
" <td>Tuesday</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1480440285 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:24:45</td>\n",
" <td>+0100</td>\n",
" <td>Tuesday</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1480440484 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-11-29 18:28:04</td>\n",
" <td>+0100</td>\n",
" <td>Tuesday</td>\n",
" <td>18</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1480603776 +0100</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>michael@simons.ac</td>\n",
" <td>2016-12-01 15:49:36</td>\n",
" <td>+0100</td>\n",
" <td>Thursday</td>\n",
" <td>15</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" unix_timestamp author email timestamp \\\n",
"0 1480439402 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:10:02 \n",
"1 1480439474 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:11:14 \n",
"2 1480440285 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:24:45 \n",
"3 1480440484 +0100 Michael J. Simons michael@simons.ac 2016-11-29 18:28:04 \n",
"4 1480603776 +0100 Michael J. Simons michael@simons.ac 2016-12-01 15:49:36 \n",
"\n",
" timezone weekday hour days_between_previous \n",
"0 +0100 Tuesday 18 0 \n",
"1 +0100 Tuesday 18 0 \n",
"2 +0100 Tuesday 18 0 \n",
"3 +0100 Tuesday 18 0 \n",
"4 +0100 Thursday 15 1 "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"raw['days_between_previous'] = (raw['timestamp']-raw['timestamp'].shift()).fillna(0).dt.days\n",
"raw.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That should be enough. I'll copy the raw content into a new data frame, without the columns I don't need. We're are gonna work a lot with the timestamp, so let's add an index to it, too:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>weekday</th>\n",
" <th>hour</th>\n",
" <th>author</th>\n",
" <th>days_between_previous</th>\n",
" </tr>\n",
" <tr>\n",
" <th>timestamp</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2016-11-29 18:10:02</th>\n",
" <td>Tuesday</td>\n",
" <td>18</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2016-11-29 18:11:14</th>\n",
" <td>Tuesday</td>\n",
" <td>18</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2016-11-29 18:24:45</th>\n",
" <td>Tuesday</td>\n",
" <td>18</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2016-11-29 18:28:04</th>\n",
" <td>Tuesday</td>\n",
" <td>18</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2016-12-01 15:49:36</th>\n",
" <td>Thursday</td>\n",
" <td>15</td>\n",
" <td>Michael J. Simons</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" weekday hour author days_between_previous\n",
"timestamp \n",
"2016-11-29 18:10:02 Tuesday 18 Michael J. Simons 0\n",
"2016-11-29 18:11:14 Tuesday 18 Michael J. Simons 0\n",
"2016-11-29 18:24:45 Tuesday 18 Michael J. Simons 0\n",
"2016-11-29 18:28:04 Tuesday 18 Michael J. Simons 0\n",
"2016-12-01 15:49:36 Thursday 15 Michael J. Simons 1"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"git_log = raw[[\n",
" 'timestamp', 'weekday', 'hour', 'author', 'days_between_previous']][\n",
" (raw['author'] != 'Christina Simons')].copy().set_index('timestamp')\n",
"git_log.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Analyse the log\n",
"\n",
"First have a look at over the last couple of months. As I said, the manuscript was basically complete by August 2017 when I sent it to my publisher for review. The review was done - among others - by [Jürgen Höller](https://twitter.com/springjuergen) and [Eberhard Wolff](https://twitter.com/ewolff). Thanks a lot."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5,0.98,'Number of commits per month')"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_number_of_commits_per_month = git_log.groupby(pd.Grouper(freq='M')).size().plot(figsize=(12,4))\n",
"plot_number_of_commits_per_month.figure.suptitle(\"Number of commits per month\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There's a nice rampup in the end of 2016, when I got the green light from [dpunkt](https://www.dpunkt.de) and started writing. I was on vacation in January and had a lot of time to write. Easter holidy in April was also spent on writing. By the end of July, everything slowed down (apart from the fact that I got a new Job).\n",
"\n",
"By the beginning of October I started rewriting the text and mostly the example based on the first Spring Boot 2 milestones. Jürgen warned me as early as October that Boot 2 was gonna be delayed. From the end of 2017 on until March 1st I was continuoulsy updating text and examples.\n",
"\n",
"The longest period of days without a commit can easily be determined:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/markdown": [
"\n",
" I only spent 22 days without the book in the last 18 months. Oh my gosh.\n",
" "
],
"text/plain": [
"<IPython.core.display.Markdown object>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.display import Markdown\n",
"\n",
"Markdown(\n",
" \"\"\"\n",
" I only spent {max_days_without_the_book} days without the book in the last 18 months. Oh my gosh.\n",
" \"\"\".format(\n",
" max_days_without_the_book=git_log['days_between_previous'].max()))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now the interesting parts. Did I slow down during the week? First we get the commits per week and then plot them:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0,0.5,'# commits')"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_commits_per_weekday = git_log['weekday'].value_counts(sort=False).plot(\n",
" kind='bar', title=\"Commits per weekday\")\n",
"plot_commits_per_weekday.set_ylabel('# commits')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Obviously not. I did some of the stuff during working hours as supported by my previous employee, however, most during the evening and on weekends. Let's group by weekday and hour:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5,0,'Hour of the day')"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x576 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_hours_by_weekday = pd.DataFrame.boxplot(\n",
" self=git_log,\n",
" by='weekday',\n",
" column='hour',\n",
" vert=False,\n",
" showmeans=True,\n",
" autorange=True,\n",
" figsize=(12,8))\n",
"plot_hours_by_weekday.figure.suptitle(\"Distribution of hours per weekday\")\n",
"plot_hours_by_weekday.set_title(\"\")\n",
"plot_hours_by_weekday.invert_yaxis()\n",
"plot_hours_by_weekday.xaxis.set_label_text(\"Hour of the day\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"That have been quite some long days :)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Some facts of the repository itself\n",
"\n",
"Lets have a look at some other metrics. The book consists of "
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 27\r\n"
]
}
],
"source": [
"! find {repository_base} -type f -iname \"*.tex\" | wc -l"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"tex files with a accumulated size of"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"896K\ttotal\r\n"
]
}
],
"source": [
"! find {repository_base} -type f -iname \"*.tex\" | xargs du -chs | tail -1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"And that's about the effort I have put into my book."
]
}
],
"metadata": {
"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.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment