Skip to content

Instantly share code, notes, and snippets.

@steven-murray
Last active June 27, 2016 09:25
Show Gist options
  • Save steven-murray/27a02f4329f828171fd9862931dd5956 to your computer and use it in GitHub Desktop.
Save steven-murray/27a02f4329f828171fd9862931dd5956 to your computer and use it in GitHub Desktop.
intro_jupyter.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {
"toc": "true"
},
"cell_type": "markdown",
"source": "# Table of Contents\n <p><div class=\"lev1\"><a href=\"#An-Intro-to-the-Jupyter-notebook\"><span class=\"toc-item-num\">1&nbsp;&nbsp;</span>An Intro to the Jupyter notebook</a></div><div class=\"lev2\"><a href=\"#High-Level-Intro-and-Teasers\"><span class=\"toc-item-num\">1.1&nbsp;&nbsp;</span>High-Level Intro and Teasers</a></div><div class=\"lev3\"><a href=\"#What-is-a-Jupyter-notebook?\"><span class=\"toc-item-num\">1.1.1&nbsp;&nbsp;</span>What is a Jupyter notebook?</a></div><div class=\"lev3\"><a href=\"#Quick-Feature-Run-down-(to-whet-your-appetite)\"><span class=\"toc-item-num\">1.1.2&nbsp;&nbsp;</span>Quick Feature Run-down (to whet your appetite)</a></div><div class=\"lev4\"><a href=\"#Markdown-Cell-Features\"><span class=\"toc-item-num\">1.1.2.1&nbsp;&nbsp;</span>Markdown Cell Features</a></div><div class=\"lev4\"><a href=\"#Tools\"><span class=\"toc-item-num\">1.1.2.2&nbsp;&nbsp;</span>Tools</a></div><div class=\"lev4\"><a href=\"#Other-Features\"><span class=\"toc-item-num\">1.1.2.3&nbsp;&nbsp;</span>Other Features</a></div><div class=\"lev4\"><a href=\"#Integration-with-other-software\"><span class=\"toc-item-num\">1.1.2.4&nbsp;&nbsp;</span>Integration with other software</a></div><div class=\"lev3\"><a href=\"#What-should-I-use-Jupyter-for?-(a.k.a-is-it-the-only-solution?)\"><span class=\"toc-item-num\">1.1.3&nbsp;&nbsp;</span>What should I use Jupyter for? (a.k.a is it the only solution?)</a></div><div class=\"lev2\"><a href=\"#Jupyter-Basics\"><span class=\"toc-item-num\">1.2&nbsp;&nbsp;</span>Jupyter Basics</a></div><div class=\"lev2\"><a href=\"#What-is-Jupyter-really-capable-of?\"><span class=\"toc-item-num\">1.3&nbsp;&nbsp;</span>What is Jupyter really capable of?</a></div><div class=\"lev3\"><a href=\"#Useful-Magics\"><span class=\"toc-item-num\">1.3.1&nbsp;&nbsp;</span>Useful Magics</a></div><div class=\"lev3\"><a href=\"#Useful-Extensions\"><span class=\"toc-item-num\">1.3.2&nbsp;&nbsp;</span>Useful Extensions</a></div><div class=\"lev4\"><a href=\"#Fortran-Magic-(Get-it-here.)\"><span class=\"toc-item-num\">1.3.2.1&nbsp;&nbsp;</span>Fortran Magic (<a target=\"_blank\" href=\"https://github.com/mgaitan/fortran_magic\">Get it here.</a>)</a></div><div class=\"lev4\"><a href=\"#Contributed-Extensions-(Get-them-here.)\"><span class=\"toc-item-num\">1.3.2.2&nbsp;&nbsp;</span>Contributed Extensions (<a target=\"_blank\" href=\"https://github.com/ipython-contrib/IPython-notebook-extensions\">Get them here.</a>)</a></div><div class=\"lev3\"><a href=\"#Other-uses-of-Jupyter\"><span class=\"toc-item-num\">1.3.3&nbsp;&nbsp;</span>Other uses of Jupyter</a></div>"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# An Intro to the Jupyter notebook\n\nWritten by Steven Murray, June 2016"
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "from ipywidgets import interact\nimport numpy as np",
"execution_count": 1,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "This notebook introduces the Jupyter notebook for those who have little to no experience with it. Its aim is to first give a quick overview of the pros and cons of the notebook, with a rundown of the features. This will be useful if you're trying to decide whether to give it a go, or if you've been using it but not aware of some of the really neat things it can do. It *doesn't* go into detail about *how* to do various things.\n\nA disclaimer: some of these things are being developed pretty quickly, so some things may be wrong in even a year, and certainly in not too long there will be much cooler things you can do with the notebook than that outlined here."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## High-Level Intro and Teasers"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### What is a Jupyter notebook?"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* Browser-based environment for writing *and* running python code.\n* Display comments, text, code, equations, images etc. all in the same place.\n* Two elements: *Jupyter* web-app frontend, *IPython* engine backend.\n* In short: a complete environment for interactive coding."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Quick Feature Run-down (to whet your appetite)"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* Complete python code environment. Anything you can write with python can be written here:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "def print_the_square(a):\n print a**2\n\nprint_the_square(2)",
"execution_count": 2,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": "4\n"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "#### Markdown Cell Features"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* Display markdown, for better narrating of the code: eg. *italics*, **bold**, ``simple_code_style``, [links](http://ipython.org), headings as above, dot points and enumerations. There is even support for writing non-functional syntax-highlighted code:\n\n```python\nprint(\"Hello World\")\n```\n\n* Display latex equations inline: $E = mc^2$, or as display:\n\n$$ c^2 = \\sqrt{a^2 + b^2}.$$\n\n* Show images from URL's: \n\n![Image](http://www.icrar.org/?a=410225)\n\n* Show images from files.\n* Use HTML/CSS to further style things (if you ever care to)."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "#### Tools"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* Editing tools including cut/paste/merge cells, show/hide cells, find/replace.\n* Interrupt execution, or restart entire *kernel*\n* Heaps of keyboard shortcuts (remember Esc - m - Enter!)\n* Checkpointing.\n* Save/Export to various formats including HTML and PDF via LaTeX!\n* TAB Completion:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "np.",
"execution_count": 3,
"outputs": [
{
"ename": "SyntaxError",
"evalue": "invalid syntax (<ipython-input-3-a58a88215da2>, line 1)",
"traceback": [
"\u001b[1;36m File \u001b[1;32m\"<ipython-input-3-a58a88215da2>\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m np.\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n"
],
"output_type": "error"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "#### Other Features\n\n* Python2 or Python3.\n* Not just for running python -- other kernels can be used (Julia, Haskell etc.)\n* Deep configurability\n * config files can instantly change startup routines, styling, cell metadata etc.\n* Deep extensibility\n * Add custom JS extensions to add editing/visual features\n * Add custom \"magics\" which do neat things easily (more on this later).\n* Can run standard python scripts from within notebook using %run\n* Easily profiling and benchmarking\n* Runnable over a network (SSH)\n* IPy widgets can do some pretty cool stuff (more on this later):"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "@interact(x=(0,10))\ndef cube(x):\n print \"The cube of %d is %d\" %(x,x**3)",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* Use IPython as an extended shell:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "name = %pwd",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "%ls -la",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* Easy to find help on functions (even your own!):"
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "np.dot?",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "def spell_stuff_backwards(word):\n \"\"\"\n A function to write things backward, because why not.\n \n Parameters\n ----------\n word : the word to write backwards.\n \"\"\"\n return word[::-1]\n\nspell_stuff_backwards?",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* Even look at the actual source code:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "source(np.sum)",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "#### Integration with other software"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* Matplotlib can plot inline, which is really useful:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "## Could also use %matplotlib inline\n%matplotlib inline\nimport matplotlib.pyplot as plt\nimport numpy as np\n\n\nplt.plot(np.sin(np.linspace(0,1,100)))\nplt.show()",
"execution_count": 17,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": "<matplotlib.figure.Figure at 0x7f8a6c1d6610>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "And it can be made interactive:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "x = np.linspace(0,2*np.pi,100)\n\n@interact(a=(1,10))\ndef plot_sin(a):\n plt.plot(x,np.sin(a*x))\n plt.show()",
"execution_count": 19,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": "<matplotlib.figure.Figure at 0x7f8a68e42110>"
},
"metadata": {}
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* Pandas support for displaying tables etc:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "import pandas\n\ndf = pandas.DataFrame({\"col1\":np.linspace(0,1,15),\"col2\":np.linspace(1,0,15)})\n\ndf",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* Bokeh interactive plots:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "from bokeh.plotting import output_notebook, figure, show\nfrom bokeh.models import ColumnDataSource\n\n\noutput_notebook()\n\nfig = figure(plot_height=400)\n\nx = np.linspace(0,6*np.pi,1000)\ny1 = np.sin(x)\ny2 = np.cos(y1)\n\ndef update(a=1):\n y1 = np.sin(a*x)\n y2 = np.cos(a*y1)\n \n source1.data['y'] = y1\n source2.data['y'] = y2\n source1.push_notebook()\n source2.push_notebook()\n \nsource1 = ColumnDataSource({\"x\":x,\"y\":y1})\nsource2 = ColumnDataSource({\"x\":x,\"y\":y2})\n\nfig.line(x,y1,source=source1,color=\"red\",line_width=4)\nfig.line(x,y2,source=source2,line_width=4)\n\nshow(fig)",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "interact(update,a=(0.1,4))",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* SymPy pretty-prints with LaTeX:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "from sympy import *\nfrom sympy.abc import *\ninit_printing(use_latex=True)\n\ny = Integral(x**2 + 2*x**3 + exp(-x)*cos(x),x)\ny",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "y.doit()",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* All sorts of display options can be added by writing custom methods that convert the object into html/latex/markdown."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### What should I use Jupyter for? (a.k.a is it the only solution?)"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* Excellent for quick **exploratory data analysis** -- load up a dataset, quickly plot it inline, muck around with it, get your results fast, with the full capability of python.\n* Great for **first steps** at something larger -- first write functions/classes in the notebook, much around with them to see if they're working, then copy them over to a more static library.\n* Good way to start a **new science project** -- code up some bits and pieces in Jupyter, have a look at some results, write extended comments about each plot *alongside the plots*, use LaTeX equations etc. Saves your sanity later (better even than documentation!)\n* Awesome for **collaborative work** -- export files as HTML to share, with all embedded graphics and equations to let everyone know what's going on (oh, they display nicely on github as well!)\n* Good for writing tutorials -- both scientific (e.g. [this 3-body problem tute](http://nbviewer.jupyter.org/github/pjpmarques/Julia-Modeling-the-World/blob/master/Three-Body%20Problem.ipynb)) and python! (eg. [this python tute](nbviewer.jupyter.org/gist/rpmuller/5920182))\n* Look [here](http://nb.bianp.net/sort/views/) for some great examples."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "There's some things that it's not great for also, and some drawbacks:\n\n* Obviously not useful for writing large-scale software.\n* Not useful in a pipeline.\n* Not great for editing code (compared to say an IDE or good text editor)\n* Kind of annoying having to open a browser to edit files."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Jupyter Basics"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "There are lots of basic tutorials to get you started, especially look at [The IPython Minibook](https://github.com/ipython-books/minibook-2nd-code) and the official docs."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## What is Jupyter really capable of?"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Useful Magics"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "There are several in-built magic functions which are really useful, and you can create or download others. Some of the most useful:"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "To see available magic functions"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "%lsmagic",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "## Benchmarking\n\n%timeit np.array([i for i in range(100)])\n%timeit np.arange(100)",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "%%timeit\n\ns = 0\nfor i in range(10):\n s += i**5",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "%history -l 5",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "%%capture output\n\n%ls",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "output.stdout",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "%%bash\n\nmkdir tmp\ncd tmp\ntouch afile\nls\npwd\ncd ..\nrm -r tmp",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "You can even write simple magics to compile and run C or C++ code written directly in the cell!"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Profiling functions is easy, using the %prun magic:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "%prun np.linspace(0,1,100)",
"execution_count": 20,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": " "
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Useful Extensions"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "#### Fortran Magic ([Get it here.](https://github.com/mgaitan/fortran_magic))\n\nDefines a magic function which can compile fortran code and import the symbols automatically. If installed, you can run the following:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "%load_ext fortranmagic",
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": "/home/steven/anaconda2/lib/python2.7/site-packages/IPython/utils/path.py:264: UserWarning: get_ipython_cache_dir has moved to the IPython.paths module\n warn(\"get_ipython_cache_dir has moved to the IPython.paths module\")\n"
},
{
"output_type": "display_data",
"data": {
"application/javascript": "$.getScript(\"https://raw.github.com/marijnh/CodeMirror/master/mode/fortran/fortran.js\", function () {\nIPython.config.cell_magic_highlight['magic_fortran'] = {'reg':[/^%%fortran/]};});\n"
},
"metadata": {}
}
]
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "%%fortran\n\nsubroutine f1(x, y, z)\n real, intent(in) :: x,y\n real, intent(out) :: z\n\n z = sin(x+y)\n\nend subroutine f1",
"execution_count": 5,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Now the symbol ``f1`` is the fortran subroutine, and can be used in normal python code:"
},
{
"metadata": {
"collapsed": false,
"trusted": true
},
"cell_type": "code",
"source": "%timeit f1(1,-1)\n%timeit np.sin(1+-1)",
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": "The slowest run took 25.84 times longer than the fastest. This could mean that an intermediate result is being cached.\n1000000 loops, best of 3: 194 ns per loop\nThe slowest run took 19.38 times longer than the fastest. This could mean that an intermediate result is being cached.\n1000000 loops, best of 3: 984 ns per loop\n"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "#### Contributed Extensions ([Get them here.](https://github.com/ipython-contrib/IPython-notebook-extensions))"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "These are a bunch of useful extensions for doing various things with Jupyter, e.g. adding a Table of Contents, Collapsible Headings, Codefolding, add auto-run Initialisation Cells, edit Keyboard Shortcuts etc."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Other uses of Jupyter"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* Writing blogs (e.g. [Jake Vanderplass](https://jakevdp.github.io/))\n* Generating annotated figures for science publications (e.g. [the LIGO GW detection!](nbviewer.jupyter.org/urls/losc.ligo.org/s/events/LOSC_Event_tutorial.ipynb))\n* Example documentation for code libraries (eg. my ``mrpy`` [code examples](http://mrpy.readthedocs.io/en/latest/example_toc.html) which are generated from [these notebooks](https://github.com/steven-murray/mrpy/docs/examples/)) "
}
],
"metadata": {
"kernelspec": {
"name": "python2",
"display_name": "Python 2",
"language": "python"
},
"nav_menu": {},
"language_info": {
"mimetype": "text/x-python",
"nbconvert_exporter": "python",
"name": "python",
"pygments_lexer": "ipython2",
"version": "2.7.11",
"file_extension": ".py",
"codemirror_mode": {
"version": 2,
"name": "ipython"
}
},
"gist": {
"id": "27a02f4329f828171fd9862931dd5956",
"data": {
"description": "intro_jupyter.ipynb",
"public": true
}
},
"toc": {
"threshold": 6,
"number_sections": false,
"toc_cell": true,
"toc_window_display": true,
"toc_section_display": "block",
"sideBar": false,
"navigate_menu": true
},
"toc_position": {
"width": "275px",
"top": "146px",
"right": "57px",
"left": "969px",
"height": "253px"
},
"_draft": {
"nbviewer_url": "https://gist.github.com/27a02f4329f828171fd9862931dd5956"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment