Last active
June 27, 2016 09:25
-
-
Save steven-murray/27a02f4329f828171fd9862931dd5956 to your computer and use it in GitHub Desktop.
intro_jupyter.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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 </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 </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 </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 </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 </span>Markdown Cell Features</a></div><div class=\"lev4\"><a href=\"#Tools\"><span class=\"toc-item-num\">1.1.2.2 </span>Tools</a></div><div class=\"lev4\"><a href=\"#Other-Features\"><span class=\"toc-item-num\">1.1.2.3 </span>Other Features</a></div><div class=\"lev4\"><a href=\"#Integration-with-other-software\"><span class=\"toc-item-num\">1.1.2.4 </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 </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 </span>Jupyter Basics</a></div><div class=\"lev2\"><a href=\"#What-is-Jupyter-really-capable-of?\"><span class=\"toc-item-num\">1.3 </span>What is Jupyter really capable of?</a></div><div class=\"lev3\"><a href=\"#Useful-Magics\"><span class=\"toc-item-num\">1.3.1 </span>Useful Magics</a></div><div class=\"lev3\"><a href=\"#Useful-Extensions\"><span class=\"toc-item-num\">1.3.2 </span>Useful Extensions</a></div><div class=\"lev4\"><a href=\"#Fortran-Magic-(Get-it-here.)\"><span class=\"toc-item-num\">1.3.2.1 </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 </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 </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