{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# How Jupyter Notebooks Will Improve Your Computational Life\n", "The bioinformatics community offers a wealth of tools, each honed to perform a specific function. Performing complex tasks will invariably involve passing your data from one of these tools to another - along with suitable parameters - and writing some scripts to connect the pieces. To record this sequence of steps and describe the results, a log or README is usually written. This certainly gets the job done, but I argue there is a better way to create and record workflows involving a mixture of command line tools, scripting languages, and written narrative: Jupyter Notebook. The Jupyter Notebook is a browser-based command shell for interactive computing in several languages: [Python, bash, R, Julya, Haskell, Ruby, and more](https://github.com/ipython/ipython/wiki/IPython-kernels-for-other-languages). To provide a feel for what jupyter notebook can do I'll first present an overview of the user interface. The second part of this blog post will discuss use cases.\n", "\n", "# Overview\n", "Once you've got Jupyter Notebook installed ([instructions here](http://jupyter.readthedocs.org/en/latest/install.html) or try it out in your browser without installing anything [here](https://try.jupyter.org/)) you can start a notebook server from the terminal with `$ jupyter notebook`. With a new notebook opened, you'll see an empty cell much like this:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Cells\n", "The cell (the box with `In [ ]`) at the top of the page is the place to provide some sort of input:\n", "* code\n", "* terminal commands\n", "* markdown text\n", "* mathematical expressions\n", "* html\n", "\n", "Pressing shift-enter will compute the input will and return results in an output cell as shown below:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[i**2 for i in xrange(10)]" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def F(n):\n", " if n in [0, 1]: return n\n", " else: return F(n-1)+F(n-2)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(0, 1, 1, 2, 3)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "F(0), F(1), F(2), F(3), F(4)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0\n", "1 1\n", "2 1\n", "3 2\n", "4 3\n", "5 5\n", "6 8\n", "7 13\n", "8 21\n", "9 34\n" ] } ], "source": [ "for i in xrange(10):\n", " print i, F(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A useful aspect of this input/output configuration is that after saving, closing and reopening the notebook, all of your work will be reproduced immediately without the need to recompute anything again. In addition, with the rich text formatting (markdown, latex math), you are able to discuss code, output and plots alike:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n5YwZM4axY8cyduxYMjIyePrppzl06NBZjxOEwUzUBAhCjElKSmLZsmU8/fTTvPrqq9x6662nbD/+\nQXr33Xdzxx13oNfreeWVV0hISGDGjBmnne+yyy7j0ksv5amnnuKyyy4jPj7+tH2WLl3Ku+++y403\n3si3v/1tpkyZgiRJ7Ny5k5deeoklS5aQmZkJwJ133snTTz9NYmIis2bNYseOHbz77rusXr2apKQk\nlixZwh//+EdkWWb69Ons2LGDF198kaVLl2Kz2c5a7u9973vccMMNLF++nOuvvx6/38+aNWtoaGhg\n9OjRF/KUCkLMktQv1psJgqAJS5YswWaz8bvf/e60bYFAgAULFuB2u1m3bh1//vOfefHFF/nkk08A\n2Lt3L8888wylpaUEAgEmTpzIvffe29W/YPTo0dx333185zvfAaCqqoprr72Wr371qzz22GNnjMfh\ncPDcc8+xadOmrjkHCgsLWbx4Mddff/0p+/71r3/l5Zdfpr6+ntzcXL7//e9z5ZVXdm3/wx/+wOuv\nv05DQwPZ2dncdNNN3HzzzV3bvxjfcZ9++im/+tWv+PzzzzEajUydOpWf/OQnFBQU9OzJFYRBQiQB\ngiAIgjBIiT4BgiAIgjBIiSRAEARBEAYpkQQIgiAIwiAlkgBBEARBGKREEiAIgiAIg5RIAgRBEARh\nkBJJgCAIgiAMUiIJEARBEIRB6v8DW27l9P80sJUAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import seaborn as sns\n", "\n", "controls = np.random.randn(100)*5\n", "cases = np.hstack((np.random.randn(100)*3 + 5,\n", " np.random.randn(100)*5 + 20))\n", "\n", "sns.distplot(controls, label=\"Controls\")\n", "sns.distplot(cases, label=\"Cases\")\n", "plt.legend(fontsize=16)\n", "plt.ylabel('Pr(Risk Score)', fontsize=16)\n", "plt.xlabel('Risk Score', fontsize=16);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The controls are modeled nicely by $\\mathcal{N}(\\mu=5, \\sigma^2=0)$, while the cases appear to be a mixture of normals which may be an artefact of some batch effect. **Cases requires more QC.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Terminal commands\n", "If you are using the Python kernel, Jupyter will interpret any cells that start with `!` as terminal commands and `%%bash` as bash commands. This enables you to quickly change directories, list directory contents, do some awk, submit jobs and check on job status all from one notebook (and record your activity too):" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "total 0\r\n", "drwxr-xr-x 2 dr9 1159 68 29 Feb 13:22 \u001b[34mtest2\u001b[m\u001b[m\r\n", "-rw-r--r-- 1 dr9 1159 0 29 Feb 13:19 1\r\n", "-rw-r--r-- 1 dr9 1159 0 29 Feb 13:19 2\r\n", "-rw-r--r-- 1 dr9 1159 0 29 Feb 13:19 3\r\n" ] } ], "source": [ "!ls -lt ../test" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "item 1\n", "item 2\n", "item 3\n", "item test2\n" ] } ], "source": [ "%%bash\n", "\n", "for i in $( ls ../test ); do\n", " echo item $i\n", "done" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%%bash\n", "\n", "bsub \\\n", "-e shapeit.e \\\n", "-o shapeit.o \\\n", "-n 2 \\\n", "-M4000 \\\n", "-R\"select[mem>4000] rusage[mem=4000] span[hosts=1]\" \\\n", "./shapeit.sh" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that this doesn't require a kernel change, other cells will still be interpreted as Python." ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "### Multiple programming language support\n", "You'll notice that at the top of the page is the word Python. This indicates which kernel is being used. You can change this at any point Kernel > Change kernel (to install more kernels, following instructions [here](https://github.com/ipython/ipython/wiki/IPython-kernels-for-other-languages)). This ability enables you in one notebook to:\n", "\n", "* prepare some data with Python\n", "* run command line tools\n", "* change kernel\n", "* analyze and plot the output with R\n", "\n", "### Export and share\n", "As well as the standard `ipynb` file type, a notebook can be exported in html, pdf and markdown. These exports make it very convenient to share all computational aspects of some analysis with collaborators. If your analysis can be in the pubic domain, you can push your code to github repository where it can be hosted and rendered for free with the [nbviewer](http://nbviewer.jupyter.org/). This blog post, for example, is based on a Jupyter notebook in a [github repository](https://github.com/dlrice/jupyter-blog-post/blob/master/jupyter_blog_post_public.ipynb) and is rendered [here](http://nbviewer.jupyter.org/github/dlrice/jupyter-blog-post/blob/master/jupyter_blog_post_public.ipynb).\n", "\n", "\n", "### Magic, Autcomoplete and Help\n", "To draw this feature showcase to a close it is worth mentioning the following utilities:\n", "#### Autocompletion\n", "Pressing `` after typing a few characters will present:\n", "* available variables that match your characters\n", "* a list of modules/functions for a package\n", "\n", "#### Magic\n", "[There are several](http://ipython.readthedocs.org/en/stable/interactive/magics.html) built-in Jupyter functions called magic commands, all preceded by `%%`. Particularly useful are:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### `%%perl`\n", "Executes the input cell contents as a perl subprocess, without needing to change kernel." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ACGT" ] } ], "source": [ "%%perl\n", "\n", "@bases = (\"A\", \"C\", \"G\", \"T\");\n", "print @bases" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "##### `%%who_ls`\n", "Lists all interactive variables entered so far." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": true }, "outputs": [], "source": [ "a,b,c = (1,2,3)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['F', 'a', 'b', 'c', 'cases', 'controls', 'i', 'np', 'plt', 'sns']" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%who_ls" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### `%%timeit`\n", "Times function execution, useful when optimizing code to be as quick as possible." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "A = range(100)\n", "B = range(100, 200)\n", "\n", "def dot(A,B):\n", " return sum([a*b for a,b in zip(A,B)])" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The slowest run took 4.06 times longer than the fastest. This could mean that an intermediate result is being cached \n", "100000 loops, best of 3: 16.3 µs per loop\n" ] } ], "source": [ "%timeit dot(A,B)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "A, B = np.array(A), np.array(B)\n", "\n", "def np_dot(A, B):\n", " return np.dot(A,B)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The slowest run took 71.07 times longer than the fastest. This could mean that an intermediate result is being cached \n", "100000 loops, best of 3: 1.69 µs per loop\n" ] } ], "source": [ "%timeit np_dot(A,B)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Help\n", "A time saving feature is immediate access to the help or docstring. Typing a question mark after any object, function or method will return the docstring within the browser.\n", "\n", "# Use Cases\n", "\n", "### Personal log\n", "The features described above make a compelling case for a one-stop-shop solution to recording your daily computational work. Often scripts, results, logs are in separate files. Jupyter, on the other hand, provides a unifying platform to view all of these.\n", "\n", "### Education and training\n", "Being able to present a mix of narrative, code, and output, a notebook is a great vehicle for teaching. If the learner has the `.ipynb` file, it is a great way to modify and play around with the code and observe immediately observe the effects. There are some great examples of using a notebook as an educational medium:\n", "\n", "* [Probabilistic Programming & Bayesian Methods for Hackers](http://camdavidsonpilon.github.io/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/)\n", "* [An Introduction to Applied Bioinformatics](http://readiab.org/)\n", "* [Scientific Computing with Python](http://nbviewer.jupyter.org/url/atwallab.cshl.edu/teaching/QBbootcamp3.ipynb)\n", "\n", "An extensive gallery of interesting IPython Notebooks has been collected and is available [here](https://github.com/ipython/ipython/wiki/A-gallery-of-interesting-IPython-Notebooks)\n", "\n", "Learning material is rarely static and is constantly being evolved. Adding a notebook to a publicly available github repository would be an excellent way to iteratively improve material, as is done for several of the notebooks listed above.\n", "\n", "### Reproducibility\n", "Providing a self contained notebook that lists all steps performed in an analysis is a great way to supplement papers. [Several papers](\n", "https://github.com/ipython/ipython/wiki/A-gallery-of-interesting-IPython-Notebooks#reproducible-academic-publications) currently have notebooks included in the supplementary material. For example, [The probability of improvement in Fisher’s geometric model: A probabilistic approach by Yoav Ram and Lilach Hadany](http://nbviewer.jupyter.org/url/www.sciencedirect.com/science/MiamiMultiMediaURL/1-s2.0-S0040580914000811/1-s2.0-S0040580914000811-mmc1.txt/272364/FULL/S0040580914000811/471cf02085a52c248dc76ae65ad4409d/mmc1.txt) has provided an excellent publicly available notebook which details the steps used to generate a figure from their article.\n", "\n", "\n", "# Conclusion\n", "Jupyter notebooks can serve to record daily computational work, provide an excellent teaching platform, and capture and share computational steps in supplementary material. As most of science is becoming increasingly computational, tools such as Jupyter Notebook will help to record and share the many computations a scientist will perform on a daily basis.\n", "\n", "\n", "# Resources and Further Reading\n", "* An easy way to install Jupyter is using [miniconda](http://conda.pydata.org/miniconda.html)\n", "* An essay by Fernando Perez and Brian E. Granger about the Jupyter and Collaborative Data Science [Project Jupyter: Computational Narratives as the Engine of Collaborative Data Science](http://blog.jupyter.org/2015/07/07/project-jupyter-computational-narratives-as-the-engine-of-collaborative-data-science/)\n", "* [Jupyter's blog](https://blog.jupyter.org/)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.11" } }, "nbformat": 4, "nbformat_minor": 0 }