{ "metadata": { "name": "StrataIPythonSlides" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "The IPython Notebook" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "A Comprehensive Tool for Data Science" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Brian E. Granger" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Strata 2013" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "About me" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Physics Professor\n", "\n", "* I teach Physics and do research with undergraduates\n", "* [Cal Poly](http://www.calpoly.edu/), San Luis Obispo\n", "* Research in theoretical and computational quantum mechanics and quantum computing\n", "* A **user** of scientific and technical computing tools and libraries" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Open source hacker\n", "\n", "* I am a **developer** of tools and libraries for scientific and technical computing\n", "* Creator and lead developer of the [IPython](http://ipython.org) Notebook\n", "* Creator of [PyZMQ](https://github.com/zeromq/pyzmq) (Python bindings to ZeroMQ)\n", "* Contributor to [SymPy](http://sympy.org/en/index.html) (symbolic mathematics library for Python)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "CEO and co-founder\n", "\n", "* [Chronicle Labs](http://chronicle.io)\n", "* Early stage startup\n", "* Building a web/cloud-based environment for interactive and collaborative computing" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Telling stories with code and data" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Data science is about more than just code and data. \n", "\n", "It is about **telling stories** with code and data.\n", "\n", "These data driven stories include other types of content:\n", "\n", "* Narrative text\n", "* Images and video\n", "* Equations\n", "* Plots and other visualizations" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "We go through different phases as we tell these stories:\n", "\n", "* Individual exploration\n", "* Collaborative development\n", "* Production execution\n", "* Debugging\n", "* Publication\n", "* Presentation\n", "* Education" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Telling stories with code and data" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "We need to tell these stories in different contexts:\n", "\n", "* In collaboration with colleagues\n", "* In written publications\n", "* In talks/presentations\n", "* In the classroom\n", "* In meetings\n", "* In boardrooms\n", "* On the internet" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "How do you tell your data driven stories?" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Telling stories with code and data is super painful" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* A complex set of tools:\n", " - Matlab Mathematica Excel Python R MPI Hadoop sed awk grep Perl Bash git svn Word LaTeX Powerpoint Keynote gnuplot C C++ Java Hive Pig\n", " - Some of which are expensive and proprietary\n", " - Users often have to install and maintain all of these tools on all of their computers" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Painful workflow:\n", " - Complex pipeline of tools\n", " - Difficult to reproduce\n", " - Detached from the final presentation formats\n", " - Do you ever have to manually copy and paste content into Word, PowerPoint, HTML?\n", " - What if the content changes?\n", " - Leads to an incomprehensible tangle of code, data, emails, documents, etc.\n", " - Many of the products are not version control friendly" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Difficult to collaborate with others\n", "* Painful to communicate computational results" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "The IPython Notebook" ] }, { "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": "heading", "level": 1, "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": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Terminal Console" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This shows the classic terminal based IPython with Matplotlib for interactive plotting:\n", "\n", "" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Qt Console" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Qt Console adds inline plotting, syntax highlighting, multiline editing, rich output display and the two process Kernel model.\n", "\n", "" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "What is the IPython Notebook?" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "An open, JSON based document format" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.nbformat import current\n", "with open('StrataIPythonSlides.ipynb') as f:\n", " nb = current.read(f,'json')" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "nb.worksheets[0].cells[0:5]" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "pyout", "prompt_number": 2, "text": [ "[{u'cell_type': u'heading',\n", " u'level': 1,\n", " u'metadata': {u'slideshow': {u'slide_type': u'slide'}},\n", " u'source': u'The IPython Notebook'},\n", " {u'cell_type': u'heading',\n", " u'level': 1,\n", " u'metadata': {},\n", " u'source': u'A Comprehensive Tool for Data Science'},\n", " {u'cell_type': u'heading',\n", " u'level': 1,\n", " u'metadata': {u'slideshow': {u'slide_type': u'fragment'}},\n", " u'source': u'Brian E. Granger'},\n", " {u'cell_type': u'heading',\n", " u'level': 1,\n", " u'metadata': {},\n", " u'source': u'Strata 2013'},\n", " {u'cell_type': u'markdown',\n", " u'metadata': {u'slideshow': {u'slide_type': u'slide'}},\n", " u'source': u''}]" ] } ], "prompt_number": 2 }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Notebook documents" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "* 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": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "What is the IPython Notebook?" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "A web-based UI for writing and running code" ] }, { "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": "code", "collapsed": false, "input": [ "%pylab inline" ], "language": "python", "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.kernel.zmq.pylab.backend_inline].\n", "For more information, type 'help(pylab)'.\n" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "plot(rand(50))" ], "language": "python", "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "output_type": "pyout", "prompt_number": 4, "text": [ "[]" ] }, { "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 4 }, { "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", "* Octave\n", "* Cython\n", "* Bash\n", "* Perl\n", "* Ruby\n", "* Julia\n", "* etc." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%bash\n", "echo \"Hi there Strata!\"" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Hi there Strata!\n" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "IPython message protocol and Notebook web application is language independent:\n", " \n", "* The IPython Kernel can be replaced by kernels in other languages\n", "* Initial work has begun on Ruby, node.js\n", "* Plans for native R, Julia, MATLAB kernels\n", "\n", "This is not just about Python! While we are passionate about Python, we deeply believe that data science is a multi-language enterprise and any tool that ignores that is fatally flawed." ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Live demo Notebooks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the live talk, I will show some live Notebook examples.\n", "\n", "If you are viewing this slide show later, here are static versions of IPython's demo notebooks:\n", "\n", "[IPython Demo Notebooks](https://github.com/ipython/ipython/tree/master/examples/notebooks#a-collection-of-notebooks-for-using-ipython-effectively)" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "What are users doing with IPython Notebooks?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "They are:\n", "\n", "* Telling data driven stories\n", "* Using the Notebook as their daily working environment for data science\n", "* Sharing their Notebooks on [GitHub](http://github.com) and http://nbviewer.ipython.org\n", "\n", "We have collected some of the highlights in our [notebook gallery](https://github.com/ipython/ipython/wiki/A-gallery-of-interesting-IPython-Notebooks)" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "An ecosystem of third party tools" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "IPython provides an **open source foundation** for an ecosystem of tools and products\n", "\n", "* [Software Carpentry](http://software-carpentry.org/): helping scientist build better software using IPython Notebooks\n", "* Microsoft:\n", " - Visual Studio Integration through [Python Tools for Visual Studio](http://pytools.codeplex.com/)\n", " - Featured project on Microsoft Azure\n", "* Commercial Python distributions that include IPython:\n", " - [Enthought Python Distribution (EPD)](http://www.enthought.com/products/epd.php)\n", " - [Continuum Analytics Anaconda](https://store.continuum.io/)\n", "* Deploy the single user Notebook on Amazon\n", " - [StarCluster](http://star.mit.edu/cluster/)\n", " - [Notebook Cloud](https://notebookcloud.appspot.com/docs)\n", "* Cloud hosted Notebooks:\n", " - [PiCloud](http://www.picloud.com/)\n", " - [Wakari](http://continuum.io/wakari.html)\n", "* Other IPython Frontends:\n", " - Vim frontend: https://github.com/ivanov/vim-ipython\n", " - Emacs Notebook frontend: https://github.com/tkf/emacs-ipython-notebook\n", " - vIPer: https://github.com/damianavila/vIPer" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "The future" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Notebook conversion (2012)\n", " - To and from a wide range of formats\n", " - HTML, LaTeX, PDF, Markdown, reStructured Text\n", "* Interactive widgets (2012)\n", " - The IPython kernel already knows how to send JSON representations of objects to the browser\n", " - We are developing an architecture that will allow interactive JavaScript widgets and Python objects to pass JSON data back and forth.\n", " - Imagine all of your d3 visualizations backed by the power of Python/NumPy/SciPy/Pandas/etc.\n", " - Automatic generation of UI controls\n", "* Multiuser Notebook server (2013)\n", " - Small to medium groups of users\n", " - Trusted users - you would give these folks shell accounts\n", "\n", "See our [development roadmap](https://github.com/ipython/ipython/wiki/Roadmap:-IPython) for details" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "More information" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Visit the [IPython website](http://ipython.org/index.html)\n", "* IPython is completely open source so you can download it and play with it today\n", "* The IPython Notebook is a single user web application that you run on your local computer\n", "\n", " $ipython notebook\n", "\n", "* [Quick installation instructions](http://ipython.org/install.html)\n", "* Strata Office Hours\n", " - Myself and Wes McKinney (author of Pandas)\n", " - Today, 3 pm, Expo Hall, Table B\n", " - All things related to Python and data science\n", "* Strata BOF on Python\n", " - Thursday, lunch, Expo Hall, Table 6\n", "* I am ellisonbg on GitHub, Twitter, Gmail" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Chronicle Labs" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[chronicle.io](http://chronicle.io)\n", "\n", "Team: founded by the folks who created and lead the IPython project\n", "\n", "* Brian Granger (CEO and co-founder)\n", "* Fernando Perez (co-founder)\n", "* Min Ragan-Kelley (co-founder)\n", "* Stefan van der Walt\n", "\n", "Vision: Simple, collaborative and interactive computing in the cloud based on the IPython Notebook\n", "\n", "Focus:\n", "\n", "* Scientific and technical computing\n", "* Data science $\\neq$ Big Data\n", "* Education\n", " \n", "More details coming soon...visit our website and sign up for further information...\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Conclusion" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "The IPython Notebook provides an open source environment and foundation for telling stories with code and data" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "It puts the fun back into working with code and data" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "skip" } }, "source": [ "Formatting" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.display import HTML\n", "HTML(\"\"\"\n", "\"\"\")" ], "language": "python", "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "html": [ "\n", "" ], "output_type": "pyout", "prompt_number": 1, "text": [ "" ] } ], "prompt_number": 1 } ], "metadata": {} } ] }