{ "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# The IPython Notebook: A Comprehensive Tool for Data Science" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "##### - revised 03 december 2015
- revised 17 december 2014
- revised 16 setembre 2014
- created 17 june 2014
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "#### Patrick BROCKMANN - LSCE (Climate and Environment Sciences Laboratory)


" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "## A very good introduction to what is IPython Notebook by Brian Granger" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "slideshow": { "slide_type": "skip" } }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "YouTubeVideo('nRHBdkxVn48')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "#### The script from 0:00 to 1:32" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "[...]\n", "Today, I want to introduce you to the IPython Notebook and in particuliar\n", "describe how the notebook is emerging as an important tool for Data Science.\n", "\n", "If you have a bunch of data, the first thing you'll notice \n", "it that data is useless on its own.\n", "To be usefull, you need to leverage the data to tell a story.\n", "\n", "In the process of telling that story, there are many different things that\n", "are coming into play :\n", "* you'll need to write code to process and analyze the data\n", "* you'll need to visualize the data\n", "* you'll need to write narrative text\n", "* and possibly perform mathematical derivations\n", "* you'll need to record everything \n", "* share everything with collaborators and finally, \n", "* you'll need to present the story to different audiences.\n", "\n", "The IPython Notebook is an open source web-based interactive computing \n", "environment for python and other languages that helps you tell stories using data.\n", "\n", "As its core, the notebook is designed for writing and running code.\n", "For that, you can use the full power of python and its many\n", "libraries or even collate other languages such as R (Author Note: or ferret)\n", "but in addition to that, the notebook allows you to \n", "build shareable documents that combine that \n", "* Code with\n", "* Text\n", "* Equations\n", "* Visualisations\n", "* Images and\n", "* Video\n", "\n", "In other words everything that is part of the story you are telling.\n", "[...]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "## Your first example" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "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\nUk66zlkS7TIAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "t = np.arange(0.0, 5.0, 0.01)\n", "s = np.sin(3*np.pi*t)\n", "plt.plot(t, s, linewidth=4.0, color='b')\n", "\n", "plt.xlabel('time (s)')\n", "plt.ylabel('voltage (mV)')\n", "plt.title('About as simple as it gets, folks')\n", "plt.grid(True)\n", "plt.savefig(\"test.png\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## The IPython Notebook: A web-based UI for writing and running code" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "The IPython Notebook is an open source (BSD) tool for telling **stories** with code and data that are:\n", "\n", "* Interactive\n", "* Exploratory\n", "* Collaborative\n", "* Open\n", "* Reproducible" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Start the IPython Notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To start the notebook, type\n", "\n", "$ ipython notebook\n", "\n", "or with the option --notebook-dir to specify that your directory of notebooks is ~/IPy_Notebooks\n", "\n", "$ ipython notebook --notebook-dir=~/IPy_Notebooks\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Loading Notebook Files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also load IPython Notebooks that other people have created, saved as IPython Notebook files (File extension .ipynb.) \n", "Try downloading and opening some notebook files from http://nbviewer.ipython.org/github/Unidata/unidata-python-workshop/tree/master/ or http://nbviewer.ipython.org/.\n", "\n", "\n", "\n", "After you download the Notebook file, move it into your IPython Notebook working directory and then choose File -> Open in Notebook to open it.\n", "\n", "That Notebook contains some additional code, and some suggestions for changes you can make by going back and editing the existing files. Take a few moments to play with the Notebook - rerun the cells, edit the cells to change them, don't be afraid to break things!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Loading Python Files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also load a pre-existing Python file into an IPython Notebook cell by typing\n", "\n", "%load \"myprogram.py\"\n", "\n", "Into a cell and running it. This loads up a new cell containing the contents of myprogram.py.\n", "\n", "Test this feature out by loading one of the scripts you wrote during the recap session. You may have to specify the full path to the script file, depending on the directory IPython Notebook started up from.\n", "\n", "There is one other useful built-in tool for working with Python files:\n", "\n", "%run \"myprogram.py\"\n", "\n", "This will run myprogram.py and load the output into a Notebook cell." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## The IPython project" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* [IPython](http://ipython.org): open source (BSD) interactive computing environment in Python\n", "* History:\n", " - Started in 2001 by Fernando Perez (BDFL)\n", " - The project now has an [extremely dedicated and talented team](https://github.com/ipython/ipython/contributors)\n", "* $>$ 20 person years of development, $>$ 150 contributors\n", "* IPython is the de facto standard environment for interactive work in Python\n", "* Funded by:\n", " - Mostly by volunteers\n", " - NASA, DOD/DRC, NIH\n", " - Microsoft, Enthought\n", " - Alfred P. Sloan Foundation ($1.15 million dollar grant starting in Jan. 2013)\n", "* Components:\n", " - IPython Kernel\n", " - Stateful computation engine\n", " - Runs code and returns results\n", " - Uses language agnostic JSON based message protocol over ZeroMQ/WebSockets\n", " - Frontends:\n", " - Terminal Console\n", " - Qt Console\n", " - Notebook\n", " - Parallel computing framework" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## What are IPython Notebook documents ?" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "* JSON files\n", "* Are stored as files in your local directory\n", "* Can store:\n", " - **Code in any language**\n", " - Text (Markdown)\n", " - Equations (LaTeX)\n", " - Images\n", " - Links to video\n", " - HTML\n", "* Can be version controlled\n", " - Change 1 line of code, get a 1 line diff\n", "* Can be viewed by anyone online without IPython installed ()\n", "* Can be exported to HTML, Markdown, reStructured Text, LaTeX, PDF\n", "* Can be viewed as slideshows with live computations" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "We try to make writing code pleasant:\n", "\n", "* Tab completion\n", "* Integrated help\n", "* Syntax highlighting\n", "* Civilized multiline editing\n", "* Interactive shorthands (aliases, magics)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Not just Python code though! Though cell magics (`%%`) the Notebook supports running code in other languages:\n", "\n", "* R\n", "* ferret (read https://github.com/ipython/ipython/wiki/Extensions-Index#ferret)\n", "* Octave\n", "* Cython\n", "* Bash\n", "* Perl\n", "* Ruby\n", "* Julia\n", "* etc." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello bash world\n" ] } ], "source": [ "%%bash\n", "echo \"Hello bash world\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can enter latex directly with the %%latex cell magic:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/latex": [ "\\begin{aligned}\n", "\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\\n", "\\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\\n", "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\\n", "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0\n", "\\end{aligned}" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%latex\n", "\\begin{aligned}\n", "\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\\n", "\\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\\n", "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\\n", "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0\n", "\\end{aligned}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can do the same with R or octave.\n", " * http://nbviewer.ipython.org/github/ipython/ipython/blob/3607712653c66d63e0d7f13f073bde8c0f209ba8/docs/examples/notebooks/rmagic_extension.ipynb\n", " * http://nbviewer.ipython.org/github/ipython/ipython/blob/3607712653c66d63e0d7f13f073bde8c0f209ba8/docs/examples/notebooks/octavemagic_extension.ipynb" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Essential Shortcuts\n", "\n", "* ``Esc/Enter``: Mode Switch\n", "* ``j/k``: Move up/down\n", "* Execute Cells\n", " * ``Shift-Enter``: Run and go down\n", " * ``Alt-Enter``: Run and make new\n", " * ``Control-Enter``: Run in place\n", "* ``a/b``: Insert cell above/below\n", "* ``x``: cut cell\n", "* Cell mode switch:\n", " * `r`: raw\n", " * `m`: markdown\n", " * `y`: p**y**thon code\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Building slides\n", "\n", "* Turn on the 'slideshow' cell toolbar\n", "* Types:\n", " * Slide: start a new slide\n", " * ``-``: Continue a slide\n", " * Sub-Slide: Make a 'down' slide\n", " * Fragment: Make a 'bullet' type incoming slide\n", " * Skip: keep in the notebook, not the deck\n", " * Notes: speaker notes\n", " \n", "Then type\n", "ipython nbconvert Presentation.ipynb --to slides" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Installation and use" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Standalone installation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* My recommendation is to install the completely free Python distribution called Anaconda\n", " - http://continuum.io/downloads\n", " \n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then just type: ipython notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### From your local machine to asterixN, obelixN (LSCE), ~~curie (TGCC)~~ or ciclad (IPSL) machines" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Chained SSH connections through a proxy gateway\n", "\n", "Read more at http://www.onlamp.com/pub/a/onlamp/excerpt/ssh_11/index1.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Make an ssh tunnel from your local machine (through a gateway or not) to the remote machine (replace XXXXX,... by appropriate logins)\n", "1. Launch IPython Notebook in the remote terminal\n", "1. Open a browser on your local machine\n", "\n", "***From your local machine to obelixN (LSCE)***\n", " * ssh -X -t -L70xx:localhost:70xx XXXXX@idefix1.extra.cea.fr ssh -L70xx:localhost:70xx YYYYY@obelix.lscelb.extra.cea.fr\n", " * export PATH=\"/home/share/unix_files/anaconda/anaconda3/bin:$PATH\"\n", "
to get the python from the shared anaconda distribution\n", " * module load R/3.1.2 (if you want to use the R magic extension, use in IPython Notebook %load_ext rpy2.ipython)\n", " * jupyter notebook --no-browser --port=70xx --notebook-dir=~/IPy_Notebooks\n", "\n", "***From your local machine to curie (TGCC)***\n", "\n", "Forwarding ssh port has been forbidden since 10/02/2015 \n", "\n", " * ~~ssh -X -t -L70xx:localhost:70xx XXXXX@idefix1.extra.cea.fr ssh -L70xx:localhost:70xx YYYYY@curie-ccrt.ccc.cea.fr~~\n", " * ~~module load python/2.7.8~~\n", " * ~~module load R/3.0.2 (if you want to use the R magic extension, use in IPython Notebook %load_ext rpy2.ipython)~~\n", " * ~~module load octave/3.6.3 (if you want to use octave magic extensions)~~\n", " * ~~ipython notebook --no-browser --port=70xx --notebook-dir=~/IPy_Notebooks~~\n", " \n", "***From your local machine to ciclad-ng (IPSL)***\n", " * ssh -X -t -L70xx:localhost:70xx XXXXX@ciclad-ng.ipsl.jussieu.fr\n", " * module load python/3.6-anaconda50\n", " * ipython notebook --no-browser --port=70xx --notebook-dir=~/IPy_Notebooks\n", " \n", "\n", "Beware not sharing the same port number, indicated above as 70xx. Please visit and update http://wiki.ipsl.jussieu.fr/IGCMG/Outils/IPython_Notebook with an available port number.\n", "\n", "Now, you should be able to work **directly** on the remote file system from **the browser of your local machine** (NOT the remote cluster or marchine) by opening http://localhost:70xx\n", "\n", "Remember that ressources from cluster machines are shared among many users. So please shutdown notebooks that are not used anymore (press the red button to do so) and shutdown the notebook server when finish your work (press twice CTRL+C in the console you launch the server). The notebook server has an autosave system and you will certainly find back your notebook in the state you let it." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Publish to share your notebooks with gist or gitHub" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When ready to publish:\n", "\n", "* choose File -> Save in the notebook menu\n", "* in the directory where you run the notebook, find .ipynb file (or do File -> Download as -> IPython (.ipynb)); it is a JSON file\n", "* paste this JSON on http://gist.github.com/ or other pastebin service\n", "* go to http://nbviewer.ipython.org/ and insert Gist's URL (any public URL works)\n", "\n", "You can also use gitHub and structure all your notebooks in a repository as https://github.com/PBrockmann/IPy_Notebooks and browsable from http://nbviewer.ipython.org/github/PBrockmann/IPy_Notebooks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A very good talk from Josh Barratt at last OSCON 2014 (Open Source Conference - July 20–24, 2014 Portland)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "YouTubeVideo('XkXXpaVpNSc')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "An article from Nature that describes the IPython notebook in a study on Workflow software Platforms
\n", "http://www.nature.com/naturejobs/2014/140327/pdf/nj7493-523a.pdf" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Original workflow** \n", "* slow (read whole data file each time, lots of context switching)\n", "* version controlled analysis, but not commentary, difficult to 'go back to'\n", "* Automating requires non-trivial additional dev\n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Now workflow**\n", " * Speedups primarily from no context switching, interactivity, and reusable data loading.\n", " * Reproducible, literate, annotatable, *auditable*.\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Conclusion" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The IPython Notebook provides an open source environment and foundation for telling stories with code and data.
\n", "It puts the fun back into working with code and data\n", "\n", "It is finally all about a documented and reproductible workflow that brings you a fluid transition between:\n", " * Exploratory work\n", " * Collaborative development\n", " * Production\n", " * Publication\n", " * Communication \n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## My selection of lectures or interesting notebooks " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Official website**\n", " * Visit the [IPython website](http://ipython.org/index.html)\n", " \n", "**A good introduction**\n", "* http://opentechschool.github.io/python-data-intro/core/notebook.html\n", "\n", "**Lectures organized by Unidata team**\n", "* http://nbviewer.ipython.org/github/Unidata/unidata-python-workshop/tree/master/\n", "\n", "**The ferret extension for pyferret**\n", "* http://nbviewer.ipython.org/github/PBrockmann/ipython-ferretmagic\n", "\n", "**Must have python packages**\n", "* numpy\n", " - http://www.numpy.org/\n", " - http://nbviewer.ipython.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-2-Numpy.ipynb\n", "* netCDF4\n", " - https://code.google.com/p/netcdf4-python/\n", " - http://nbviewer.ipython.org/github/Unidata/unidata-python-workshop/blob/master/reading_netCDF.ipynb\n", "* matplotlib\n", " - http://matplotlib.org/\n", " - http://nbviewer.ipython.org/github/jrjohansson/scientific-python-lectures/blob/master/Lecture-4-Matplotlib.ipynb\n", "* pandas\n", " - http://pandas.pydata.org/\n", " - http://nbviewer.ipython.org/gist/rsignell-usgs/4740419\n", "* cdo.py\n", " - https://code.zmaw.de/projects/cdo/wiki/Cdo{rbpy}\n", "* cartopy\n", " - http://scitools.org.uk/cartopy/docs/latest/index.html\n", " - http://nbviewer.ipython.org/github/rsignell-usgs/notebook/blob/master/Cartopy%20Examples.ipynb\n", "\n", "**Promising packages**\n", "* mpld3\n", " - http://mpld3.github.io/\n", " - Jake Vanderplas - Python in the Browser Age: Data Exploration in the IPython Notebook https://www.youtube.com/watch?v=NzX7DDRkecU\n", "\n", "**Collection of notebooks**\n", "* https://github.com/ipython/ipython/wiki/A-gallery-of-interesting-IPython-Notebooks\n", "* http://earthpy.org/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Issues of interest" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* IPython Notebook run as a server\n", "* Cluster usage and parallel computing from notebooks\n", "* Setting a private nbviewer\n", "\n", "Please contact me " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "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.10" } }, "nbformat": 4, "nbformat_minor": 0 }