Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fonnesbeck/880c4ea34fbd965b2c3dc34d17ad5446 to your computer and use it in GitHub Desktop.
Save fonnesbeck/880c4ea34fbd965b2c3dc34d17ad5446 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Jupyter Notebooks <img src=\"http://blog.jupyter.org/content/images/2015/02/jupyter-sq-text.png\" width='150' align='right'>\n",
"## for Collaborative and Reproducible Research "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Reproducible Research\n",
"\n",
"> reproducing conclusions from a single experiment based on the measurements from that experiment\n",
"\n",
"The most basic form of reproducibility is a complete description of the data and associated analyses (including code!) so the results can be *exactly* reproduced by others.\n",
"\n",
"Reproducing calculations can be onerous, even with one's own work!\n",
"\n",
"Scientific data are becoming larger and more complex, making simple descriptions inadequate for reproducibility. As a result, most modern research is irreproducible without tremendous effort.\n",
"\n",
"*** Reproducible research is not yet part of the culture of science in general, or scientific computing in particular. ***"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Scientific Computing Workflow\n",
"\n",
"There are a number of steps to scientific endeavors that involve computing:\n",
"\n",
"![workflow](images/workflow.png)\n",
"\n",
"\n",
"Many of the standard tools impose barriers between one or more of these steps. This can make it difficult to iterate, reproduce work.\n",
"\n",
"The Jupyter notebook [eliminates or reduces these barriers to reproducibility](http://www.nature.com/news/interactive-notebooks-sharing-the-code-1.16261).\n",
"\n",
"Jupyter/IPython notebooks have already motivated the generation of [reproducible publications](https://github.com/ipython/ipython/wiki/A-gallery-of-interesting-IPython-Notebooks#reproducible-academic-publications) and an [open source statistics textbook](http://camdavidsonpilon.github.io/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Jupyter Notebook\n",
"\n",
"The Jupyter Notebook is an **interactive computing environment** that enables users to author notebook documents that include: \n",
"- Live code\n",
"- Interactive widgets\n",
"- Plots\n",
"- Narrative text\n",
"- Equations\n",
"- Images\n",
"- Video\n",
"\n",
"These documents provide a **complete and self-contained record of a computation** that can be converted to various formats and shared with others using email, [Dropbox](http://dropbox.com), version control systems (like git/[GitHub](http://github.com)) or [nbviewer.ipython.org](http://nbviewer.ipython.org)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Components\n",
"\n",
"The Jupyter Notebook combines three components:\n",
"\n",
"* **The notebook web application**: An interactive web application for writing and running code interactively and authoring notebook documents.\n",
"* **Kernels**: Separate processes started by the notebook web application that runs users' code in a given language and returns output back to the notebook web application. The kernel also handles things like computations for interactive widgets, tab completion and introspection. \n",
"* **Notebook documents**: Self-contained documents that contain a representation of all content visible in the notebook web application, including inputs and outputs of the computations, narrative\n",
"text, equations, images, and rich media representations of objects. Each notebook document has its own kernel."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Kernels\n",
"\n",
"Through IPython's kernel and messaging architecture, the Notebook allows code to be run in a range of different programming languages. For each notebook document that a user opens, the web application starts a kernel that runs the code for that notebook. Each kernel is capable of running code in a single programming language and there are kernels available in the following languages:\n",
"\n",
"* [Python](https://github.com/ipython/ipython)\n",
"* [Julia](https://github.com/JuliaLang/IJulia.jl)\n",
"* [R](https://github.com/takluyver/IRkernel)\n",
"* [Ruby](https://github.com/minrk/iruby)\n",
"* [Haskell](https://github.com/gibiansky/IHaskell)\n",
"* [Scala](https://github.com/Bridgewater/scala-notebook)\n",
"* [node.js](https://github.com/n-riesco/ijavascript)\n",
"* [Go](https://github.com/takluyver/igo)\n",
"\n",
"The default kernel runs Python code. IPython 3.0 provides a simple way for users to pick which of these kernels is used for a given notebook. \n",
"\n",
"Each of these kernels communicate with the notebook web application and web browser using a JSON over ZeroMQ/WebSockets message protocol that is described [here](http://ipython.org/ipython-doc/dev/development/messaging.html). Most users don't need to know about these details, but it helps to understand that \"kernels run code.\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Notebook Documents\n",
"\n",
"Notebook documents contain the **inputs and outputs** of an interactive session as well as **narrative text** that accompanies the code but is not meant for execution. **Rich output** generated by running code, including HTML, images, video, and plots, is embeddeed in the notebook, which makes it a complete and self-contained record of a computation. \n",
"\n",
"When you run the notebook web application on your computer, notebook documents are just **files on your local filesystem with a `.ipynb` extension**. This allows you to use familiar workflows for organizing your notebooks into folders and sharing them with others.\n",
"\n",
"Notebooks consist of a **linear sequence of cells**. There are three basic cell types:\n",
"\n",
"* **Code cells:** Input and output of live code that is run in the kernel\n",
"* **Markdown cells:** Narrative text with embedded LaTeX equations\n",
"* **Raw cells:** Unformatted text that is included, without modification, when notebooks are converted to different formats using nbconvert\n",
"\n",
"Internally, notebook documents are **[JSON](http://en.wikipedia.org/wiki/JSON) data** with **binary values [base64](http://en.wikipedia.org/wiki/Base64)** encoded. This allows them to be **read and manipulated programmatically** by any programming language. Because JSON is a text format, notebook documents are version control friendly.\n",
"\n",
"**Notebooks can be exported** to different static formats including HTML, reStructeredText, LaTeX, PDF, and slide shows ([reveal.js](http://lab.hakim.se/reveal-js/#/)) using IPython's `nbconvert` utility.\n",
"\n",
"Furthermore, any notebook document available from a **public URL** can be shared via [nbviewer](http://nbviewer.ipython.org). This service loads the notebook document from the URL and renders it as a static web page. The resulting web page may thus be shared with others **without their needing to install IPython**."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Installation and Configuration\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"While Jupyter runs code in many different programming languages, Python is a prerequisite for installing Jupyter notebook.\n",
"\n",
"Perhaps the easiest way to get a feature-complete version of Python on your system is to install the [Anaconda](http://continuum.io/downloads.html) distribution by Continuum Analytics. Anaconda is a completely free Python environment that includes includes almost 200 of the best Python packages for science and data analysis. Its simply a matter of downloading the installer (either graphical or command line), and running it on your system.\n",
"\n",
"Be sure to download the Python 3.5 installer, by following the **Python 3.5 link** for your computing platform (Mac OS X example shown below).\n",
"\n",
"![get Python 3](http://fonnesbeck-dropshare.s3.amazonaws.com/687474703a2f2f666f6e6e65736265636b2d64726f7073686172652e73332e616d617a6f6e6177732e636f6d2f53637265656e2d53686f742d323031362d30332d31382d61742d332e32342e32362d504d2e706e67.png)\n",
"\n",
"Once Python is installed, installing Jupyter is a matter of running a single command:\n",
"\n",
" conda install jupyter\n",
" \n",
"If you prefer to install Jupyter from source, or you did not use Anaconda to install Python, you can also use `pip`:\n",
"\n",
" pip install jupyter"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Installing Kernels\n",
"\n",
"Individual language kernels must be installed from each respective language. We will show the R kernel installation as an example.\n",
"\n",
"Setting up the R kernel involves two commands from within the R shell. The first installs the packages:\n",
"\n",
"```r\n",
"install.packages(c('repr', 'IRkernel', 'IRdisplay'),\n",
" repos = c('http://irkernel.github.io/', getOption('repos')))\n",
"```\n",
"\n",
"and the second links the kernel to Jupyter:\n",
"\n",
"```r\n",
"IRkernel::installspec()\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Running Jupyter Notebooks\n",
"\n",
"Once installed, a notebook session can be initiated from the command line via:\n",
"\n",
" jupyter notebook\n",
" \n",
"If you installed Jupyter via Anaconda, you will also have a graphical launcher available."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## IPython\n",
"\n",
"**IPython** (Interactive Python) is an enhanced Python shell which provides a more robust and productive development environment for users. There are several key features that set it apart from the standard Python shell.\n",
"\n",
"* Interactive data analysis and visualization\n",
"* Python kernel for Jupyter notebooks\n",
"* Easy parallel computation\n",
"\n",
"Over time, the IPython project grew to include several components, including:\n",
"\n",
"* an interactive shell\n",
"* a REPL protocol\n",
"* a notebook document fromat\n",
"* a notebook document conversion tool\n",
"* a web-based notebook authoring tool\n",
"* tools for building interactive UI (widgets)\n",
"* interactive parallel Python\n",
"\n",
"As each component has evolved, several had grown to the point that they warrented projects of their own. For example, pieces like the notebook and protocol are not even specific to Python. As the result, the IPython team created Project Jupyter, which is the new home of language-agnostic projects that began as part of IPython, such as the notebook in which you are reading this text.\n",
"\n",
"The HTML notebook that is part of the Jupyter project supports **interactive data visualization** and easy high-performance **parallel computing**.\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x105ad77b8>]"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n/wCfeihEYJJO8gAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1041558d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"plt.style.use('fivethirtyeight')\n",
"\n",
"def f(x):\n",
" return (x-3)*(x-5)*(x-7)+85\n",
"\n",
"import numpy as np\n",
"x = np.linspace(0, 10, 200)\n",
"y = f(x)\n",
"plt.plot(x,y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The Notebook gives you everything that a browser gives you. For example, you can embed images, videos, or entire websites."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <iframe\n",
" width=\"100%\"\n",
" height=\"350\"\n",
" src=\"http://biostat.mc.vanderbilt.edu/wiki\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" ></iframe>\n",
" "
],
"text/plain": [
"<IPython.lib.display.IFrame at 0x104135fd0>"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.display import IFrame\n",
"IFrame('http://biostat.mc.vanderbilt.edu/wiki', width='100%', height=350)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"data": {
"image/jpeg": "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\n",
"text/html": [
"\n",
" <iframe\n",
" width=\"400\"\n",
" height=\"300\"\n",
" src=\"https://www.youtube.com/embed/rl5DaFbLc60\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" ></iframe>\n",
" "
],
"text/plain": [
"<IPython.lib.display.YouTubeVideo at 0x104135f60>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.display import YouTubeVideo\n",
"YouTubeVideo(\"rl5DaFbLc60\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Running Code"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First and foremost, the IPython Notebook is an interactive environment for writing and running code. IPython is capable of running code in a wide range of languages. However, this notebook, and the default kernel in IPython 3, runs Python code."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Code cells allow you to enter and run Python code"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Run a code cell using `Shift-Enter` or pressing the <button class='btn btn-default btn-xs'><i class=\"icon-play fa fa-play\"></i></button> button in the toolbar above:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"a = 10"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10\n"
]
}
],
"source": [
"print(a)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are three keyboard shortcuts for running code:\n",
"\n",
"* `Shift-Enter` runs the current cell, enters command mode, and select next cell. \n",
"* `Ctrl-Enter` runs the current cell and enters command mode.\n",
"* `Alt-Enter` runs the current cell and inserts a new one below, enters edit mode.\n",
"\n",
"These keyboard shortcuts works both in command and edit mode."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Managing the IPython Kernel"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Code is run in a separate process called the IPython Kernel. The Kernel can be interrupted or restarted. Try running the following cell and then hit the <button class='btn btn-default btn-xs'><i class='icon-stop fa fa-stop'></i></button> button in the toolbar above."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-6-d7b436e260d5>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"import time\n",
"time.sleep(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If the Kernel dies it will be automatically restarted up to 3 times.\n",
"If it cannot be restarted automatically you will be prompted to try again, or abort.\n",
"Here we call the low-level system libc.time routine with the wrong argument via\n",
"ctypes to segfault the Python interpreter:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import sys\n",
"from ctypes import CDLL\n",
"# This will crash a Linux or Mac system\n",
"# equivalent calls can be made on Windows\n",
"dll = 'dylib' if sys.platform == 'darwin' else 'so.6'\n",
"libc = CDLL(\"libc.%s\" % dll) \n",
"libc.time(-1) # BOOM!!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cell menu"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The \"Cell\" menu has a number of menu items for running code in different ways. These includes:\n",
"\n",
"* Run\n",
"* Run and Select Below\n",
"* Run and Insert Below\n",
"* Run All\n",
"* Run All Above\n",
"* Run All Below"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Restarting the kernels"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The kernel maintains the state of a notebook's computations. You can reset this state by restarting the kernel. This is done by clicking on the <button class='btn btn-default btn-xs'><i class='fa fa-repeat icon-repeat'></i></button> in the toolbar above, or by using the `00` (press 0 twice) shortcut in command mode. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Output is asynchronous"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"All output is displayed asynchronously as it is generated in the Kernel. If you execute the next cell, you will see the output one piece at a time, not all at the end."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"6\n",
"7\n"
]
}
],
"source": [
"import time, sys\n",
"for i in range(8):\n",
" print(i)\n",
" time.sleep(0.5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Large outputs"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To better handle large outputs, the output area can be collapsed. Run the following cell and then single- or double- click on the active area to the left of the output:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"6\n",
"7\n",
"8\n",
"9\n",
"10\n",
"11\n",
"12\n",
"13\n",
"14\n",
"15\n",
"16\n",
"17\n",
"18\n",
"19\n",
"20\n",
"21\n",
"22\n",
"23\n",
"24\n",
"25\n",
"26\n",
"27\n",
"28\n",
"29\n",
"30\n",
"31\n",
"32\n",
"33\n",
"34\n",
"35\n",
"36\n",
"37\n",
"38\n",
"39\n",
"40\n",
"41\n",
"42\n",
"43\n",
"44\n",
"45\n",
"46\n",
"47\n",
"48\n",
"49\n"
]
}
],
"source": [
"for i in range(50):\n",
" print(i)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Beyond a certain point, output will scroll automatically:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n",
"1\n",
"3\n",
"7\n",
"15\n",
"31\n",
"63\n",
"127\n",
"255\n",
"511\n",
"1023\n",
"2047\n",
"4095\n",
"8191\n",
"16383\n",
"32767\n",
"65535\n",
"131071\n",
"262143\n",
"524287\n",
"1048575\n",
"2097151\n",
"4194303\n",
"8388607\n",
"16777215\n",
"33554431\n",
"67108863\n",
"134217727\n",
"268435455\n",
"536870911\n",
"1073741823\n",
"2147483647\n",
"4294967295\n",
"8589934591\n",
"17179869183\n",
"34359738367\n",
"68719476735\n",
"137438953471\n",
"274877906943\n",
"549755813887\n",
"1099511627775\n",
"2199023255551\n",
"4398046511103\n",
"8796093022207\n",
"17592186044415\n",
"35184372088831\n",
"70368744177663\n",
"140737488355327\n",
"281474976710655\n",
"562949953421311\n",
"1125899906842623\n",
"2251799813685247\n",
"4503599627370495\n",
"9007199254740991\n",
"18014398509481983\n",
"36028797018963967\n",
"72057594037927935\n",
"144115188075855871\n",
"288230376151711743\n",
"576460752303423487\n",
"1152921504606846975\n",
"2305843009213693951\n",
"4611686018427387903\n",
"9223372036854775807\n",
"18446744073709551615\n",
"36893488147419103231\n",
"73786976294838206463\n",
"147573952589676412927\n",
"295147905179352825855\n",
"590295810358705651711\n",
"1180591620717411303423\n",
"2361183241434822606847\n",
"4722366482869645213695\n",
"9444732965739290427391\n",
"18889465931478580854783\n",
"37778931862957161709567\n",
"75557863725914323419135\n",
"151115727451828646838271\n",
"302231454903657293676543\n",
"604462909807314587353087\n",
"1208925819614629174706175\n",
"2417851639229258349412351\n",
"4835703278458516698824703\n",
"9671406556917033397649407\n",
"19342813113834066795298815\n",
"38685626227668133590597631\n",
"77371252455336267181195263\n",
"154742504910672534362390527\n",
"309485009821345068724781055\n",
"618970019642690137449562111\n",
"1237940039285380274899124223\n",
"2475880078570760549798248447\n",
"4951760157141521099596496895\n",
"9903520314283042199192993791\n",
"19807040628566084398385987583\n",
"39614081257132168796771975167\n",
"79228162514264337593543950335\n",
"158456325028528675187087900671\n",
"316912650057057350374175801343\n",
"633825300114114700748351602687\n",
"1267650600228229401496703205375\n",
"2535301200456458802993406410751\n",
"5070602400912917605986812821503\n",
"10141204801825835211973625643007\n",
"20282409603651670423947251286015\n",
"40564819207303340847894502572031\n",
"81129638414606681695789005144063\n",
"162259276829213363391578010288127\n",
"324518553658426726783156020576255\n",
"649037107316853453566312041152511\n",
"1298074214633706907132624082305023\n",
"2596148429267413814265248164610047\n",
"5192296858534827628530496329220095\n",
"10384593717069655257060992658440191\n",
"20769187434139310514121985316880383\n",
"41538374868278621028243970633760767\n",
"83076749736557242056487941267521535\n",
"166153499473114484112975882535043071\n",
"332306998946228968225951765070086143\n",
"664613997892457936451903530140172287\n",
"1329227995784915872903807060280344575\n",
"2658455991569831745807614120560689151\n",
"5316911983139663491615228241121378303\n",
"10633823966279326983230456482242756607\n",
"21267647932558653966460912964485513215\n",
"42535295865117307932921825928971026431\n",
"85070591730234615865843651857942052863\n",
"170141183460469231731687303715884105727\n",
"340282366920938463463374607431768211455\n",
"680564733841876926926749214863536422911\n",
"1361129467683753853853498429727072845823\n",
"2722258935367507707706996859454145691647\n",
"5444517870735015415413993718908291383295\n",
"10889035741470030830827987437816582766591\n",
"21778071482940061661655974875633165533183\n",
"43556142965880123323311949751266331066367\n",
"87112285931760246646623899502532662132735\n",
"174224571863520493293247799005065324265471\n",
"348449143727040986586495598010130648530943\n",
"696898287454081973172991196020261297061887\n",
"1393796574908163946345982392040522594123775\n",
"2787593149816327892691964784081045188247551\n",
"5575186299632655785383929568162090376495103\n",
"11150372599265311570767859136324180752990207\n",
"22300745198530623141535718272648361505980415\n",
"44601490397061246283071436545296723011960831\n",
"89202980794122492566142873090593446023921663\n",
"178405961588244985132285746181186892047843327\n",
"356811923176489970264571492362373784095686655\n",
"713623846352979940529142984724747568191373311\n",
"1427247692705959881058285969449495136382746623\n",
"2854495385411919762116571938898990272765493247\n",
"5708990770823839524233143877797980545530986495\n",
"11417981541647679048466287755595961091061972991\n",
"22835963083295358096932575511191922182123945983\n",
"45671926166590716193865151022383844364247891967\n",
"91343852333181432387730302044767688728495783935\n",
"182687704666362864775460604089535377456991567871\n",
"365375409332725729550921208179070754913983135743\n",
"730750818665451459101842416358141509827966271487\n",
"1461501637330902918203684832716283019655932542975\n",
"2923003274661805836407369665432566039311865085951\n",
"5846006549323611672814739330865132078623730171903\n",
"11692013098647223345629478661730264157247460343807\n",
"23384026197294446691258957323460528314494920687615\n",
"46768052394588893382517914646921056628989841375231\n",
"93536104789177786765035829293842113257979682750463\n",
"187072209578355573530071658587684226515959365500927\n",
"374144419156711147060143317175368453031918731001855\n",
"748288838313422294120286634350736906063837462003711\n",
"1496577676626844588240573268701473812127674924007423\n",
"2993155353253689176481146537402947624255349848014847\n",
"5986310706507378352962293074805895248510699696029695\n",
"11972621413014756705924586149611790497021399392059391\n",
"23945242826029513411849172299223580994042798784118783\n",
"47890485652059026823698344598447161988085597568237567\n",
"95780971304118053647396689196894323976171195136475135\n",
"191561942608236107294793378393788647952342390272950271\n",
"383123885216472214589586756787577295904684780545900543\n",
"766247770432944429179173513575154591809369561091801087\n",
"1532495540865888858358347027150309183618739122183602175\n",
"3064991081731777716716694054300618367237478244367204351\n",
"6129982163463555433433388108601236734474956488734408703\n",
"12259964326927110866866776217202473468949912977468817407\n",
"24519928653854221733733552434404946937899825954937634815\n",
"49039857307708443467467104868809893875799651909875269631\n",
"98079714615416886934934209737619787751599303819750539263\n",
"196159429230833773869868419475239575503198607639501078527\n",
"392318858461667547739736838950479151006397215279002157055\n",
"784637716923335095479473677900958302012794430558004314111\n",
"1569275433846670190958947355801916604025588861116008628223\n",
"3138550867693340381917894711603833208051177722232017256447\n",
"6277101735386680763835789423207666416102355444464034512895\n",
"12554203470773361527671578846415332832204710888928069025791\n",
"25108406941546723055343157692830665664409421777856138051583\n",
"50216813883093446110686315385661331328818843555712276103167\n",
"100433627766186892221372630771322662657637687111424552206335\n",
"200867255532373784442745261542645325315275374222849104412671\n",
"401734511064747568885490523085290650630550748445698208825343\n",
"803469022129495137770981046170581301261101496891396417650687\n",
"1606938044258990275541962092341162602522202993782792835301375\n",
"3213876088517980551083924184682325205044405987565585670602751\n",
"6427752177035961102167848369364650410088811975131171341205503\n",
"12855504354071922204335696738729300820177623950262342682411007\n",
"25711008708143844408671393477458601640355247900524685364822015\n",
"51422017416287688817342786954917203280710495801049370729644031\n",
"102844034832575377634685573909834406561420991602098741459288063\n",
"205688069665150755269371147819668813122841983204197482918576127\n",
"411376139330301510538742295639337626245683966408394965837152255\n",
"822752278660603021077484591278675252491367932816789931674304511\n",
"1645504557321206042154969182557350504982735865633579863348609023\n",
"3291009114642412084309938365114701009965471731267159726697218047\n",
"6582018229284824168619876730229402019930943462534319453394436095\n",
"13164036458569648337239753460458804039861886925068638906788872191\n",
"26328072917139296674479506920917608079723773850137277813577744383\n",
"52656145834278593348959013841835216159447547700274555627155488767\n",
"105312291668557186697918027683670432318895095400549111254310977535\n",
"210624583337114373395836055367340864637790190801098222508621955071\n",
"421249166674228746791672110734681729275580381602196445017243910143\n",
"842498333348457493583344221469363458551160763204392890034487820287\n",
"1684996666696914987166688442938726917102321526408785780068975640575\n",
"3369993333393829974333376885877453834204643052817571560137951281151\n",
"6739986666787659948666753771754907668409286105635143120275902562303\n",
"13479973333575319897333507543509815336818572211270286240551805124607\n",
"26959946667150639794667015087019630673637144422540572481103610249215\n",
"53919893334301279589334030174039261347274288845081144962207220498431\n",
"107839786668602559178668060348078522694548577690162289924414440996863\n",
"215679573337205118357336120696157045389097155380324579848828881993727\n",
"431359146674410236714672241392314090778194310760649159697657763987455\n",
"862718293348820473429344482784628181556388621521298319395315527974911\n",
"1725436586697640946858688965569256363112777243042596638790631055949823\n",
"3450873173395281893717377931138512726225554486085193277581262111899647\n",
"6901746346790563787434755862277025452451108972170386555162524223799295\n",
"13803492693581127574869511724554050904902217944340773110325048447598591\n",
"27606985387162255149739023449108101809804435888681546220650096895197183\n",
"55213970774324510299478046898216203619608871777363092441300193790394367\n",
"110427941548649020598956093796432407239217743554726184882600387580788735\n",
"220855883097298041197912187592864814478435487109452369765200775161577471\n",
"441711766194596082395824375185729628956870974218904739530401550323154943\n",
"883423532389192164791648750371459257913741948437809479060803100646309887\n",
"1766847064778384329583297500742918515827483896875618958121606201292619775\n",
"3533694129556768659166595001485837031654967793751237916243212402585239551\n",
"7067388259113537318333190002971674063309935587502475832486424805170479103\n",
"14134776518227074636666380005943348126619871175004951664972849610340958207\n",
"28269553036454149273332760011886696253239742350009903329945699220681916415\n",
"56539106072908298546665520023773392506479484700019806659891398441363832831\n",
"113078212145816597093331040047546785012958969400039613319782796882727665663\n",
"226156424291633194186662080095093570025917938800079226639565593765455331327\n",
"452312848583266388373324160190187140051835877600158453279131187530910662655\n",
"904625697166532776746648320380374280103671755200316906558262375061821325311\n",
"1809251394333065553493296640760748560207343510400633813116524750123642650623\n",
"3618502788666131106986593281521497120414687020801267626233049500247285301247\n",
"7237005577332262213973186563042994240829374041602535252466099000494570602495\n",
"14474011154664524427946373126085988481658748083205070504932198000989141204991\n",
"28948022309329048855892746252171976963317496166410141009864396001978282409983\n",
"57896044618658097711785492504343953926634992332820282019728792003956564819967\n",
"115792089237316195423570985008687907853269984665640564039457584007913129639935\n",
"231584178474632390847141970017375815706539969331281128078915168015826259279871\n",
"463168356949264781694283940034751631413079938662562256157830336031652518559743\n",
"926336713898529563388567880069503262826159877325124512315660672063305037119487\n",
"1852673427797059126777135760139006525652319754650249024631321344126610074238975\n",
"3705346855594118253554271520278013051304639509300498049262642688253220148477951\n",
"7410693711188236507108543040556026102609279018600996098525285376506440296955903\n",
"14821387422376473014217086081112052205218558037201992197050570753012880593911807\n",
"29642774844752946028434172162224104410437116074403984394101141506025761187823615\n",
"59285549689505892056868344324448208820874232148807968788202283012051522375647231\n",
"118571099379011784113736688648896417641748464297615937576404566024103044751294463\n",
"237142198758023568227473377297792835283496928595231875152809132048206089502588927\n",
"474284397516047136454946754595585670566993857190463750305618264096412179005177855\n",
"948568795032094272909893509191171341133987714380927500611236528192824358010355711\n",
"1897137590064188545819787018382342682267975428761855001222473056385648716020711423\n",
"3794275180128377091639574036764685364535950857523710002444946112771297432041422847\n",
"7588550360256754183279148073529370729071901715047420004889892225542594864082845695\n",
"15177100720513508366558296147058741458143803430094840009779784451085189728165691391\n",
"30354201441027016733116592294117482916287606860189680019559568902170379456331382783\n",
"60708402882054033466233184588234965832575213720379360039119137804340758912662765567\n",
"121416805764108066932466369176469931665150427440758720078238275608681517825325531135\n",
"242833611528216133864932738352939863330300854881517440156476551217363035650651062271\n",
"485667223056432267729865476705879726660601709763034880312953102434726071301302124543\n",
"971334446112864535459730953411759453321203419526069760625906204869452142602604249087\n",
"1942668892225729070919461906823518906642406839052139521251812409738904285205208498175\n",
"3885337784451458141838923813647037813284813678104279042503624819477808570410416996351\n",
"7770675568902916283677847627294075626569627356208558085007249638955617140820833992703\n",
"15541351137805832567355695254588151253139254712417116170014499277911234281641667985407\n",
"31082702275611665134711390509176302506278509424834232340028998555822468563283335970815\n",
"62165404551223330269422781018352605012557018849668464680057997111644937126566671941631\n",
"124330809102446660538845562036705210025114037699336929360115994223289874253133343883263\n",
"248661618204893321077691124073410420050228075398673858720231988446579748506266687766527\n",
"497323236409786642155382248146820840100456150797347717440463976893159497012533375533055\n",
"994646472819573284310764496293641680200912301594695434880927953786318994025066751066111\n",
"1989292945639146568621528992587283360401824603189390869761855907572637988050133502132223\n",
"3978585891278293137243057985174566720803649206378781739523711815145275976100267004264447\n",
"7957171782556586274486115970349133441607298412757563479047423630290551952200534008528895\n",
"15914343565113172548972231940698266883214596825515126958094847260581103904401068017057791\n",
"31828687130226345097944463881396533766429193651030253916189694521162207808802136034115583\n",
"63657374260452690195888927762793067532858387302060507832379389042324415617604272068231167\n",
"127314748520905380391777855525586135065716774604121015664758778084648831235208544136462335\n",
"254629497041810760783555711051172270131433549208242031329517556169297662470417088272924671\n",
"509258994083621521567111422102344540262867098416484062659035112338595324940834176545849343\n",
"1018517988167243043134222844204689080525734196832968125318070224677190649881668353091698687\n",
"2037035976334486086268445688409378161051468393665936250636140449354381299763336706183397375\n",
"4074071952668972172536891376818756322102936787331872501272280898708762599526673412366794751\n",
"8148143905337944345073782753637512644205873574663745002544561797417525199053346824733589503\n",
"16296287810675888690147565507275025288411747149327490005089123594835050398106693649467179007\n",
"32592575621351777380295131014550050576823494298654980010178247189670100796213387298934358015\n",
"65185151242703554760590262029100101153646988597309960020356494379340201592426774597868716031\n",
"130370302485407109521180524058200202307293977194619920040712988758680403184853549195737432063\n",
"260740604970814219042361048116400404614587954389239840081425977517360806369707098391474864127\n",
"521481209941628438084722096232800809229175908778479680162851955034721612739414196782949728255\n",
"1042962419883256876169444192465601618458351817556959360325703910069443225478828393565899456511\n",
"2085924839766513752338888384931203236916703635113918720651407820138886450957656787131798913023\n",
"4171849679533027504677776769862406473833407270227837441302815640277772901915313574263597826047\n",
"8343699359066055009355553539724812947666814540455674882605631280555545803830627148527195652095\n",
"16687398718132110018711107079449625895333629080911349765211262561111091607661254297054391304191\n",
"33374797436264220037422214158899251790667258161822699530422525122222183215322508594108782608383\n",
"66749594872528440074844428317798503581334516323645399060845050244444366430645017188217565216767\n",
"133499189745056880149688856635597007162669032647290798121690100488888732861290034376435130433535\n",
"266998379490113760299377713271194014325338065294581596243380200977777465722580068752870260867071\n",
"533996758980227520598755426542388028650676130589163192486760401955554931445160137505740521734143\n",
"1067993517960455041197510853084776057301352261178326384973520803911109862890320275011481043468287\n",
"2135987035920910082395021706169552114602704522356652769947041607822219725780640550022962086936575\n",
"4271974071841820164790043412339104229205409044713305539894083215644439451561281100045924173873151\n",
"8543948143683640329580086824678208458410818089426611079788166431288878903122562200091848347746303\n",
"17087896287367280659160173649356416916821636178853222159576332862577757806245124400183696695492607\n",
"34175792574734561318320347298712833833643272357706444319152665725155515612490248800367393390985215\n",
"68351585149469122636640694597425667667286544715412888638305331450311031224980497600734786781970431\n",
"136703170298938245273281389194851335334573089430825777276610662900622062449960995201469573563940863\n",
"273406340597876490546562778389702670669146178861651554553221325801244124899921990402939147127881727\n",
"546812681195752981093125556779405341338292357723303109106442651602488249799843980805878294255763455\n",
"1093625362391505962186251113558810682676584715446606218212885303204976499599687961611756588511526911\n",
"2187250724783011924372502227117621365353169430893212436425770606409952999199375923223513177023053823\n",
"4374501449566023848745004454235242730706338861786424872851541212819905998398751846447026354046107647\n",
"8749002899132047697490008908470485461412677723572849745703082425639811996797503692894052708092215295\n",
"17498005798264095394980017816940970922825355447145699491406164851279623993595007385788105416184430591\n",
"34996011596528190789960035633881941845650710894291398982812329702559247987190014771576210832368861183\n",
"69992023193056381579920071267763883691301421788582797965624659405118495974380029543152421664737722367\n",
"139984046386112763159840142535527767382602843577165595931249318810236991948760059086304843329475444735\n",
"279968092772225526319680285071055534765205687154331191862498637620473983897520118172609686658950889471\n",
"559936185544451052639360570142111069530411374308662383724997275240947967795040236345219373317901778943\n",
"1119872371088902105278721140284222139060822748617324767449994550481895935590080472690438746635803557887\n",
"2239744742177804210557442280568444278121645497234649534899989100963791871180160945380877493271607115775\n",
"4479489484355608421114884561136888556243290994469299069799978201927583742360321890761754986543214231551\n",
"8958978968711216842229769122273777112486581988938598139599956403855167484720643781523509973086428463103\n",
"17917957937422433684459538244547554224973163977877196279199912807710334969441287563047019946172856926207\n",
"35835915874844867368919076489095108449946327955754392558399825615420669938882575126094039892345713852415\n",
"71671831749689734737838152978190216899892655911508785116799651230841339877765150252188079784691427704831\n",
"143343663499379469475676305956380433799785311823017570233599302461682679755530300504376159569382855409663\n",
"286687326998758938951352611912760867599570623646035140467198604923365359511060601008752319138765710819327\n",
"573374653997517877902705223825521735199141247292070280934397209846730719022121202017504638277531421638655\n",
"1146749307995035755805410447651043470398282494584140561868794419693461438044242404035009276555062843277311\n",
"2293498615990071511610820895302086940796564989168281123737588839386922876088484808070018553110125686554623\n",
"4586997231980143023221641790604173881593129978336562247475177678773845752176969616140037106220251373109247\n",
"9173994463960286046443283581208347763186259956673124494950355357547691504353939232280074212440502746218495\n",
"18347988927920572092886567162416695526372519913346248989900710715095383008707878464560148424881005492436991\n",
"36695977855841144185773134324833391052745039826692497979801421430190766017415756929120296849762010984873983\n",
"73391955711682288371546268649666782105490079653384995959602842860381532034831513858240593699524021969747967\n",
"146783911423364576743092537299333564210980159306769991919205685720763064069663027716481187399048043939495935\n",
"293567822846729153486185074598667128421960318613539983838411371441526128139326055432962374798096087878991871\n",
"587135645693458306972370149197334256843920637227079967676822742883052256278652110865924749596192175757983743\n",
"1174271291386916613944740298394668513687841274454159935353645485766104512557304221731849499192384351515967487\n",
"2348542582773833227889480596789337027375682548908319870707290971532209025114608443463698998384768703031934975\n",
"4697085165547666455778961193578674054751365097816639741414581943064418050229216886927397996769537406063869951\n",
"9394170331095332911557922387157348109502730195633279482829163886128836100458433773854795993539074812127739903\n",
"18788340662190665823115844774314696219005460391266558965658327772257672200916867547709591987078149624255479807\n",
"37576681324381331646231689548629392438010920782533117931316655544515344401833735095419183974156299248510959615\n",
"75153362648762663292463379097258784876021841565066235862633311089030688803667470190838367948312598497021919231\n",
"150306725297525326584926758194517569752043683130132471725266622178061377607334940381676735896625196994043838463\n",
"300613450595050653169853516389035139504087366260264943450533244356122755214669880763353471793250393988087676927\n",
"601226901190101306339707032778070279008174732520529886901066488712245510429339761526706943586500787976175353855\n",
"1202453802380202612679414065556140558016349465041059773802132977424491020858679523053413887173001575952350707711\n",
"2404907604760405225358828131112281116032698930082119547604265954848982041717359046106827774346003151904701415423\n",
"4809815209520810450717656262224562232065397860164239095208531909697964083434718092213655548692006303809402830847\n",
"9619630419041620901435312524449124464130795720328478190417063819395928166869436184427311097384012607618805661695\n",
"19239260838083241802870625048898248928261591440656956380834127638791856333738872368854622194768025215237611323391\n",
"38478521676166483605741250097796497856523182881313912761668255277583712667477744737709244389536050430475222646783\n",
"76957043352332967211482500195592995713046365762627825523336510555167425334955489475418488779072100860950445293567\n",
"153914086704665934422965000391185991426092731525255651046673021110334850669910978950836977558144201721900890587135\n",
"307828173409331868845930000782371982852185463050511302093346042220669701339821957901673955116288403443801781174271\n",
"615656346818663737691860001564743965704370926101022604186692084441339402679643915803347910232576806887603562348543\n",
"1231312693637327475383720003129487931408741852202045208373384168882678805359287831606695820465153613775207124697087\n",
"2462625387274654950767440006258975862817483704404090416746768337765357610718575663213391640930307227550414249394175\n",
"4925250774549309901534880012517951725634967408808180833493536675530715221437151326426783281860614455100828498788351\n",
"9850501549098619803069760025035903451269934817616361666987073351061430442874302652853566563721228910201656997576703\n",
"19701003098197239606139520050071806902539869635232723333974146702122860885748605305707133127442457820403313995153407\n",
"39402006196394479212279040100143613805079739270465446667948293404245721771497210611414266254884915640806627990306815\n",
"78804012392788958424558080200287227610159478540930893335896586808491443542994421222828532509769831281613255980613631\n",
"157608024785577916849116160400574455220318957081861786671793173616982887085988842445657065019539662563226511961227263\n",
"315216049571155833698232320801148910440637914163723573343586347233965774171977684891314130039079325126453023922454527\n",
"630432099142311667396464641602297820881275828327447146687172694467931548343955369782628260078158650252906047844909055\n",
"1260864198284623334792929283204595641762551656654894293374345388935863096687910739565256520156317300505812095689818111\n",
"2521728396569246669585858566409191283525103313309788586748690777871726193375821479130513040312634601011624191379636223\n",
"5043456793138493339171717132818382567050206626619577173497381555743452386751642958261026080625269202023248382759272447\n",
"10086913586276986678343434265636765134100413253239154346994763111486904773503285916522052161250538404046496765518544895\n",
"20173827172553973356686868531273530268200826506478308693989526222973809547006571833044104322501076808092993531037089791\n",
"40347654345107946713373737062547060536401653012956617387979052445947619094013143666088208645002153616185987062074179583\n",
"80695308690215893426747474125094121072803306025913234775958104891895238188026287332176417290004307232371974124148359167\n",
"161390617380431786853494948250188242145606612051826469551916209783790476376052574664352834580008614464743948248296718335\n",
"322781234760863573706989896500376484291213224103652939103832419567580952752105149328705669160017228929487896496593436671\n",
"645562469521727147413979793000752968582426448207305878207664839135161905504210298657411338320034457858975792993186873343\n",
"1291124939043454294827959586001505937164852896414611756415329678270323811008420597314822676640068915717951585986373746687\n",
"2582249878086908589655919172003011874329705792829223512830659356540647622016841194629645353280137831435903171972747493375\n",
"5164499756173817179311838344006023748659411585658447025661318713081295244033682389259290706560275662871806343945494986751\n",
"10328999512347634358623676688012047497318823171316894051322637426162590488067364778518581413120551325743612687890989973503\n",
"20657999024695268717247353376024094994637646342633788102645274852325180976134729557037162826241102651487225375781979947007\n",
"41315998049390537434494706752048189989275292685267576205290549704650361952269459114074325652482205302974450751563959894015\n",
"82631996098781074868989413504096379978550585370535152410581099409300723904538918228148651304964410605948901503127919788031\n",
"165263992197562149737978827008192759957101170741070304821162198818601447809077836456297302609928821211897803006255839576063\n",
"330527984395124299475957654016385519914202341482140609642324397637202895618155672912594605219857642423795606012511679152127\n",
"661055968790248598951915308032771039828404682964281219284648795274405791236311345825189210439715284847591212025023358304255\n",
"1322111937580497197903830616065542079656809365928562438569297590548811582472622691650378420879430569695182424050046716608511\n",
"2644223875160994395807661232131084159313618731857124877138595181097623164945245383300756841758861139390364848100093433217023\n",
"5288447750321988791615322464262168318627237463714249754277190362195246329890490766601513683517722278780729696200186866434047\n",
"10576895500643977583230644928524336637254474927428499508554380724390492659780981533203027367035444557561459392400373732868095\n",
"21153791001287955166461289857048673274508949854856999017108761448780985319561963066406054734070889115122918784800747465736191\n",
"42307582002575910332922579714097346549017899709713998034217522897561970639123926132812109468141778230245837569601494931472383\n",
"84615164005151820665845159428194693098035799419427996068435045795123941278247852265624218936283556460491675139202989862944767\n",
"169230328010303641331690318856389386196071598838855992136870091590247882556495704531248437872567112920983350278405979725889535\n",
"338460656020607282663380637712778772392143197677711984273740183180495765112991409062496875745134225841966700556811959451779071\n",
"676921312041214565326761275425557544784286395355423968547480366360991530225982818124993751490268451683933401113623918903558143\n",
"1353842624082429130653522550851115089568572790710847937094960732721983060451965636249987502980536903367866802227247837807116287\n",
"2707685248164858261307045101702230179137145581421695874189921465443966120903931272499975005961073806735733604454495675614232575\n",
"5415370496329716522614090203404460358274291162843391748379842930887932241807862544999950011922147613471467208908991351228465151\n",
"10830740992659433045228180406808920716548582325686783496759685861775864483615725089999900023844295226942934417817982702456930303\n",
"21661481985318866090456360813617841433097164651373566993519371723551728967231450179999800047688590453885868835635965404913860607\n",
"43322963970637732180912721627235682866194329302747133987038743447103457934462900359999600095377180907771737671271930809827721215\n",
"86645927941275464361825443254471365732388658605494267974077486894206915868925800719999200190754361815543475342543861619655442431\n",
"173291855882550928723650886508942731464777317210988535948154973788413831737851601439998400381508723631086950685087723239310884863\n",
"346583711765101857447301773017885462929554634421977071896309947576827663475703202879996800763017447262173901370175446478621769727\n",
"693167423530203714894603546035770925859109268843954143792619895153655326951406405759993601526034894524347802740350892957243539455\n",
"1386334847060407429789207092071541851718218537687908287585239790307310653902812811519987203052069789048695605480701785914487078911\n",
"2772669694120814859578414184143083703436437075375816575170479580614621307805625623039974406104139578097391210961403571828974157823\n",
"5545339388241629719156828368286167406872874150751633150340959161229242615611251246079948812208279156194782421922807143657948315647\n",
"11090678776483259438313656736572334813745748301503266300681918322458485231222502492159897624416558312389564843845614287315896631295\n",
"22181357552966518876627313473144669627491496603006532601363836644916970462445004984319795248833116624779129687691228574631793262591\n",
"44362715105933037753254626946289339254982993206013065202727673289833940924890009968639590497666233249558259375382457149263586525183\n",
"88725430211866075506509253892578678509965986412026130405455346579667881849780019937279180995332466499116518750764914298527173050367\n",
"177450860423732151013018507785157357019931972824052260810910693159335763699560039874558361990664932998233037501529828597054346100735\n",
"354901720847464302026037015570314714039863945648104521621821386318671527399120079749116723981329865996466075003059657194108692201471\n",
"709803441694928604052074031140629428079727891296209043243642772637343054798240159498233447962659731992932150006119314388217384402943\n",
"1419606883389857208104148062281258856159455782592418086487285545274686109596480318996466895925319463985864300012238628776434768805887\n",
"2839213766779714416208296124562517712318911565184836172974571090549372219192960637992933791850638927971728600024477257552869537611775\n",
"5678427533559428832416592249125035424637823130369672345949142181098744438385921275985867583701277855943457200048954515105739075223551\n",
"11356855067118857664833184498250070849275646260739344691898284362197488876771842551971735167402555711886914400097909030211478150447103\n",
"22713710134237715329666368996500141698551292521478689383796568724394977753543685103943470334805111423773828800195818060422956300894207\n",
"45427420268475430659332737993000283397102585042957378767593137448789955507087370207886940669610222847547657600391636120845912601788415\n",
"90854840536950861318665475986000566794205170085914757535186274897579911014174740415773881339220445695095315200783272241691825203576831\n",
"181709681073901722637330951972001133588410340171829515070372549795159822028349480831547762678440891390190630401566544483383650407153663\n",
"363419362147803445274661903944002267176820680343659030140745099590319644056698961663095525356881782780381260803133088966767300814307327\n",
"726838724295606890549323807888004534353641360687318060281490199180639288113397923326191050713763565560762521606266177933534601628614655\n",
"1453677448591213781098647615776009068707282721374636120562980398361278576226795846652382101427527131121525043212532355867069203257229311\n",
"2907354897182427562197295231552018137414565442749272241125960796722557152453591693304764202855054262243050086425064711734138406514458623\n",
"5814709794364855124394590463104036274829130885498544482251921593445114304907183386609528405710108524486100172850129423468276813028917247\n",
"11629419588729710248789180926208072549658261770997088964503843186890228609814366773219056811420217048972200345700258846936553626057834495\n",
"23258839177459420497578361852416145099316523541994177929007686373780457219628733546438113622840434097944400691400517693873107252115668991\n",
"46517678354918840995156723704832290198633047083988355858015372747560914439257467092876227245680868195888801382801035387746214504231337983\n",
"93035356709837681990313447409664580397266094167976711716030745495121828878514934185752454491361736391777602765602070775492429008462675967\n",
"186070713419675363980626894819329160794532188335953423432061490990243657757029868371504908982723472783555205531204141550984858016925351935\n",
"372141426839350727961253789638658321589064376671906846864122981980487315514059736743009817965446945567110411062408283101969716033850703871\n",
"744282853678701455922507579277316643178128753343813693728245963960974631028119473486019635930893891134220822124816566203939432067701407743\n",
"1488565707357402911845015158554633286356257506687627387456491927921949262056238946972039271861787782268441644249633132407878864135402815487\n",
"2977131414714805823690030317109266572712515013375254774912983855843898524112477893944078543723575564536883288499266264815757728270805630975\n",
"5954262829429611647380060634218533145425030026750509549825967711687797048224955787888157087447151129073766576998532529631515456541611261951\n",
"11908525658859223294760121268437066290850060053501019099651935423375594096449911575776314174894302258147533153997065059263030913083222523903\n",
"23817051317718446589520242536874132581700120107002038199303870846751188192899823151552628349788604516295066307994130118526061826166445047807\n",
"47634102635436893179040485073748265163400240214004076398607741693502376385799646303105256699577209032590132615988260237052123652332890095615\n",
"95268205270873786358080970147496530326800480428008152797215483387004752771599292606210513399154418065180265231976520474104247304665780191231\n",
"190536410541747572716161940294993060653600960856016305594430966774009505543198585212421026798308836130360530463953040948208494609331560382463\n",
"381072821083495145432323880589986121307201921712032611188861933548019011086397170424842053596617672260721060927906081896416989218663120764927\n",
"762145642166990290864647761179972242614403843424065222377723867096038022172794340849684107193235344521442121855812163792833978437326241529855\n",
"1524291284333980581729295522359944485228807686848130444755447734192076044345588681699368214386470689042884243711624327585667956874652483059711\n",
"3048582568667961163458591044719888970457615373696260889510895468384152088691177363398736428772941378085768487423248655171335913749304966119423\n",
"6097165137335922326917182089439777940915230747392521779021790936768304177382354726797472857545882756171536974846497310342671827498609932238847\n",
"12194330274671844653834364178879555881830461494785043558043581873536608354764709453594945715091765512343073949692994620685343654997219864477695\n",
"24388660549343689307668728357759111763660922989570087116087163747073216709529418907189891430183531024686147899385989241370687309994439728955391\n",
"48777321098687378615337456715518223527321845979140174232174327494146433419058837814379782860367062049372295798771978482741374619988879457910783\n",
"97554642197374757230674913431036447054643691958280348464348654988292866838117675628759565720734124098744591597543956965482749239977758915821567\n",
"195109284394749514461349826862072894109287383916560696928697309976585733676235351257519131441468248197489183195087913930965498479955517831643135\n",
"390218568789499028922699653724145788218574767833121393857394619953171467352470702515038262882936496394978366390175827861930996959911035663286271\n",
"780437137578998057845399307448291576437149535666242787714789239906342934704941405030076525765872992789956732780351655723861993919822071326572543\n",
"1560874275157996115690798614896583152874299071332485575429578479812685869409882810060153051531745985579913465560703311447723987839644142653145087\n",
"3121748550315992231381597229793166305748598142664971150859156959625371738819765620120306103063491971159826931121406622895447975679288285306290175\n",
"6243497100631984462763194459586332611497196285329942301718313919250743477639531240240612206126983942319653862242813245790895951358576570612580351\n",
"12486994201263968925526388919172665222994392570659884603436627838501486955279062480481224412253967884639307724485626491581791902717153141225160703\n",
"24973988402527937851052777838345330445988785141319769206873255677002973910558124960962448824507935769278615448971252983163583805434306282450321407\n",
"49947976805055875702105555676690660891977570282639538413746511354005947821116249921924897649015871538557230897942505966327167610868612564900642815\n",
"99895953610111751404211111353381321783955140565279076827493022708011895642232499843849795298031743077114461795885011932654335221737225129801285631\n",
"199791907220223502808422222706762643567910281130558153654986045416023791284464999687699590596063486154228923591770023865308670443474450259602571263\n",
"399583814440447005616844445413525287135820562261116307309972090832047582568929999375399181192126972308457847183540047730617340886948900519205142527\n",
"799167628880894011233688890827050574271641124522232614619944181664095165137859998750798362384253944616915694367080095461234681773897801038410285055\n",
"1598335257761788022467377781654101148543282249044465229239888363328190330275719997501596724768507889233831388734160190922469363547795602076820570111\n",
"3196670515523576044934755563308202297086564498088930458479776726656380660551439995003193449537015778467662777468320381844938727095591204153641140223\n",
"6393341031047152089869511126616404594173128996177860916959553453312761321102879990006386899074031556935325554936640763689877454191182408307282280447\n",
"12786682062094304179739022253232809188346257992355721833919106906625522642205759980012773798148063113870651109873281527379754908382364816614564560895\n",
"25573364124188608359478044506465618376692515984711443667838213813251045284411519960025547596296126227741302219746563054759509816764729633229129121791\n",
"51146728248377216718956089012931236753385031969422887335676427626502090568823039920051095192592252455482604439493126109519019633529459266458258243583\n",
"102293456496754433437912178025862473506770063938845774671352855253004181137646079840102190385184504910965208878986252219038039267058918532916516487167\n",
"204586912993508866875824356051724947013540127877691549342705710506008362275292159680204380770369009821930417757972504438076078534117837065833032974335\n",
"409173825987017733751648712103449894027080255755383098685411421012016724550584319360408761540738019643860835515945008876152157068235674131666065948671\n",
"818347651974035467503297424206899788054160511510766197370822842024033449101168638720817523081476039287721671031890017752304314136471348263332131897343\n",
"1636695303948070935006594848413799576108321023021532394741645684048066898202337277441635046162952078575443342063780035504608628272942696526664263794687\n"
]
}
],
"source": [
"for i in range(500):\n",
" print(2**i - 1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Markdown cells\n",
"\n",
"Markdown is a simple *markup* language that allows plain text to be converted into HTML.\n",
"\n",
"The advantages of using Markdown over HTML (and LaTeX):\n",
"\n",
"- its a **human-readable** format \n",
"- allows writers to focus on content rather than formatting and layout\n",
"- easier to learn and use\n",
"\n",
"For example, instead of writing:\n",
"\n",
"```html\n",
"<p>In order to create valid \n",
"<a href=\"http://en.wikipedia.org/wiki/HTML\">HTML</a>, you \n",
"need properly coded syntax that can be cumbersome for \n",
"&#8220;non-programmers&#8221; to write. Sometimes, you\n",
"just want to easily make certain words <strong>bold\n",
"</strong>, and certain words <em>italicized</em> without\n",
"having to remember the syntax. Additionally, for example,\n",
"creating lists:</p>\n",
"<ul>\n",
"<li>should be easy</li>\n",
"<li>should not involve programming</li>\n",
"</ul>\n",
"```\n",
"\n",
"we can write the following in Markdown:\n",
"\n",
"```markdown\n",
"In order to create valid [HTML], you need properly\n",
"coded syntax that can be cumbersome for \n",
"\"non-programmers\" to write. Sometimes, you just want\n",
"to easily make certain words **bold**, and certain \n",
"words *italicized* without having to remember the \n",
"syntax. Additionally, for example, creating lists:\n",
"\n",
"* should be easy\n",
"* should not involve programming\n",
"```\n",
"\n",
"### Emphasis\n",
"\n",
"Markdown uses `*` (asterisk) and `_` (underscore) characters as \n",
"indicators of emphasis. \n",
"\n",
" *italic*, _italic_ \n",
" **bold**, __bold__\n",
" ***bold-italic***, ___bold-italic___\n",
"\n",
"*italic*, _italic_ \n",
"**bold**, __bold__ \n",
"***bold-italic***, ___bold-italic___\n",
"\n",
"### Lists\n",
"\n",
"Markdown supports both unordered and ordered lists. Unordered lists can use `*`, `-`, or \n",
"`+` to define a list. This is an unordered list: \n",
"\n",
" * Apples\n",
" * Bananas\n",
" * Oranges\n",
"\n",
"* Apples\n",
"* Bananas\n",
"* Oranges\n",
"\n",
"Ordered lists are numbered lists in plain text:\n",
"\n",
" 1. Bryan Ferry\n",
" 2. Brian Eno\n",
" 3. Andy Mackay\n",
" 4. Paul Thompson\n",
" 5. Phil Manzanera\n",
"\n",
"1. Bryan Ferry\n",
"2. Brian Eno\n",
"3. Andy Mackay\n",
"4. Paul Thompson\n",
"5. Phil Manzanera\n",
"\n",
"### Links\n",
"\n",
"Markdown inline links are equivalent to HTML `<a href='foo.com'>` \n",
"links, they just have a different syntax. \n",
"\n",
" [Biostatistics home page](http://biostat.mc.vanderbilt.edu \"Visit Biostat!\")\n",
"\n",
"[Biostatistics home page](http://biostat.mc.vanderbilt.edu \"Visit Biostat!\")\n",
"\n",
"### Block quotes\n",
"\n",
"Block quotes are denoted by a `>` (greater than) character \n",
"before each line of the block quote.\n",
"\n",
" > Sometimes a simple model will outperform a more complex model . . . \n",
" > Nevertheless, I believe that deliberately limiting the complexity \n",
" > of the model is not fruitful when the problem is evidently complex. \n",
"\n",
"> Sometimes a simple model will outperform a more complex model . . .\n",
"> Nevertheless, I believe that deliberately limiting the complexity \n",
"> of the model is not fruitful when the problem is evidently complex.\n",
"\n",
"### Images\n",
"\n",
"Images look an awful lot like Markdown links, they just have an extra \n",
"`!` (exclamation mark) in front of them. \n",
"\n",
" ![Python logo](images/python-logo-master-v3-TM.png)\n",
"\n",
"![Python logo](images/python-logo-master-v3-TM.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Mathjax Support\n",
"\n",
"Mathjax ia a javascript implementation $\\alpha$ of LaTeX that allows equations to be embedded into HTML. For example, this markup:\n",
"\n",
" \"\"\"$$ \\int_{a}^{b} f(x)\\, dx \\approx \\frac{1}{2} \\sum_{k=1}^{N} \\left( x_{k} - x_{k-1} \\right) \\left( f(x_{k}) + f(x_{k-1}) \\right). $$\"\"\"\n",
" \n",
"becomes this:\n",
"\n",
"$$\n",
"\\int_{a}^{b} f(x)\\, dx \\approx \\frac{1}{2} \\sum_{k=1}^{N} \\left( x_{k} - x_{k-1} \\right) \\left( f(x_{k}) + f(x_{k-1}) \\right).\n",
"$$"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Running other Kernels\n",
"\n",
"The kernel of a Jupyter session can be switched from the menu. [Here is an example of a notebook running R code](rtutorial.ipynb)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## IPython in Jupyter Notebooks\n",
"\n",
"Running IPython within a Jupyter Notebook provides an enhanced interactive scientific computing environment.\n",
"\n",
"### SymPy\n",
"\n",
"SymPy is a Python library for symbolic mathematics. It supports:\n",
"\n",
"* polynomials\n",
"* calculus\n",
"* solving equations\n",
"* discrete math\n",
"* matrices"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from sympy import *\n",
"init_printing()\n",
"x, y = symbols(\"x y\")"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAIoAAAAbBAMAAABRkwqxAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIma7zZnddlTvRIkQ\nqzLsm4+cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACBklEQVQ4Ea2Uv0tCURTHv09LTa2koKHpDf0B\nFkRLkcEjIigkioYIoqXaWiQioqZ+bA1BEEFONQTVkPsLAqeooKaG/A+0xhDsnPvj4ZVnBXqH673n\nfs7Hcw96gYZHbtBt2IFYoj3VuCWU6PhsgiVrfTduASLlZlhC682w5Ehi2TT5jkBChi3b95iCggik\nadVdDwFe5NEfxBWugTF/y6ELPMijOgQfEtExcTAMUY+ked6Xy/jbhwvERNtMImK0koi2SqWEkLq8\nzNYWYIcs8SOOmoRpkQTQo9LVh6pFWjDJUZMwLZIAMsTlt3u3VKGmZY4tJqEt+XlYZ4AggAEq/Daw\nEkpxgtcXVUsfh0xCW24PES4BggBWqYlurBxR7TFr2WOLSSiLtTuLYBIQBHBKtaCF9jTuHGfNcabE\nmruLIi+riJjjjB87zjPnnKBzXRGCgdhzQu2NtKWK0DeKllEseBaql9a0l8O80QUHTUJbWlPYpENB\niN5F3B2EXU6orUV3t4rQluAzRohX3c0BN7uj6BKOWssCR01CW1qT0S86FIQo6XEjP2MzT0PfaPF8\nygamOURFVxHaEn/P8EMpiNrft2fhdFhLPNf7B1BnFEFPRJpJb9x7K1rQf42GScQTknjFU1YTFOmX\nUb/5QQZ9iWUM0akifn2lVLrvK3WZKZDF+wLLpp3v+OeLSbk/1b9+k2E2U1MAAAAASUVORK5CYII=\n",
"text/latex": [
"$$\\left(x + 1\\right) \\left(x + y\\right)^{2}$$"
],
"text/plain": [
" 2\n",
"(x + 1)⋅(x + y) "
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"eq = ((x+y)**2 * (x+1))\n",
"eq"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAASgAAAAYBAMAAAC7JH0zAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADRElEQVRIDZ2WP2jUYBjG31yTXLw/NbTgWNMK\nbmeriNjJLKI4aOngJPQ8xa3YTReXooiTh5OnQys4VdRqxyJmdWrVQUotViddtCf+owjn5Xvzfu/3\nfblEaIYv7/f8nudJLhe4A8Cj8dZPpvTJXX+dFknJhdMvslupwDxzpjpTXTSp3F+EcTmnhjzohn3N\nVOA/gpKp1otbme7rsBLuCHph5UdmMANomZwndQPOTGRUAORBb8L+mRnMAFpmKMpwxfJTf4ew1M4J\nZiDOFO5kWIQ8u1PoBXnJ3kzJmF+fvbEcUchdpanHORdOGwG11UByq2Qq21IVwyC48n24piN9lweL\n5qdRW/UauePMUGT/RrkU4PkgwNfE6NSdKBnjEzlQklCXEZ6FczgQVFoRxCtBVGQGvLD4ETVyfAY4\nFqH0auGR+qKTw4C6LGDl3sIzdBFUWhHEK0GhcAYqjQuh0KRjzpc39a3TQaY7cCehVo2sv9PZ0jNK\nK4J41ZKYGdh3fH/Q03Hbt0YOTzYEs2oBnMbnRR0MhUOXB96AnTz7mBLsjtTKDoKsWPXirNcUtWIh\nB4DzC/bA1eCWkN3SJoyiixwMtSDK9SdQSJ5STCmjtLKDICuu77ZLoagVCzkAvDE4D5f9h0I+VW3C\nMrrIwVALCtmeX4PyIvrjlTLcqjgSqCgW7OKw22rd/dJqjYm2DQAf7ifFfn8A37uz4mCYli34BLuD\nJKtkAKiVHAxJESkZFjv5mQqr8T6+EXFM+ZW/OEkHwxjostOGlQj9GuRWdlCSFdDCSvdjsEOgGwFY\ng8ImXoQ6FKhdV2S63/YBtItVZriVHQQVxR+Fgs95clRWoRA+6L6sw8iWoIzfqnwkCowtFES5a17C\noFgJKq3sIMjK1PxLONEjfvLS9FFnu7xlzyBch6lkSjpUGFt0ubroJD8RIk7XVVrZQZCVwZGBd8nV\ntPhcp/PHOjRcuyJUgMHGhxDHpEOFMdBl60hN/X9H11Va2UGQFbwQr+Rghaa1ZMhwmHL3DeHDhIKQ\ngyEpHMTJCk1F7PuaFv1pyHDo8jjsnVCKdCgAOwiyoiTzRm+mHORxk92E56Zk7NOOtGJEzK0z8t6U\ncveTtSiXA6QdUvkH2CcEhPLLBkAAAAAASUVORK5CYII=\n",
"text/latex": [
"$$x^{3} + 2 x^{2} y + x^{2} + x y^{2} + 2 x y + y^{2}$$"
],
"text/plain": [
" 3 2 2 2 2\n",
"x + 2⋅x ⋅y + x + x⋅y + 2⋅x⋅y + y "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"expand(eq)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAM4AAAAwBAMAAACrqVieAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVO8Qq5l2zWaJ3SJE\nuzID+9VZAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD30lEQVRYCbVXW0gUURj+x9mLszc3LF8k2pDw\noaKhRJAeXMIs8mVDhXwwB2yF6CGhYCGM9iFBimihNCpC6aJEF/ZFEErch+ytlB57KAmip1DTMsra\n/nNmzuzM7MyssqcDzvzf953//+bMuewI4NSk7nYnSeXn3eWNqnfhiGtXYcVV3rD4BBazbp2bOPk8\nhZmcm08vJx+AHbKLT6Sam894kY2/N3JcIyWRl4+UKPKpyOczGnmVm89gkQ34b57RSFHh5RPKhBas\nTh6dEDo7v6d1VE7wZcv2onVQ8AEIlj0/Yl/b6xHYl88XPaZnKLkAqgzXVqNF+uaIJriiTNimhOXg\nOjjLtjnO5A0YlWud5PfgKjul2fEyXLSjVa4n6yoXJUoj6SJOJ37okTnAk3U0B+AkmzuraCAYs6Mp\nF/nrINUD9MjgKBuyIjkV+OKiAooaW6/VviXotZIU4wkxAc6yIeerFleQRfnKIBTC0HJ4KZguYEM0\nCZW7XWRDz3NaXFWTlEFKGxQ9FFt7k0M6MgXBrsOyiwyzB+6s5UiGVyFXbDOJ0BjAAxpzu/gSb972\nrJNyM+woaY4CEkmkhDpuPq2hOvCtkXLDrGZVDn6iLUBDBzunBIWJ1nuNlTBjJnvj+3MA9LTayXr4\n02Q8gTSAj5vPnNyN5S/hK4uwmhCaF/pxuuZ5+jyCKPp8xL/KGF7UNjiMvr4YR5+QurvfYX0vjgEa\nT708reAdWwjHx+29edWXtQvrhvE9iZnK8QDxw0ZOEG4+4SVakqxrfxxAkqUVIUso/E1EUvWRUqkL\n9alUHMmqvN5I5q1U6n4qdR4jo0K7mGU/HU+4HzsGEjge8M+TJNKCy8wHQbnr2kPnh37EkvHgYynk\nSlphPAjK9ZFWsYg4QOqqPosLJCYt8pvjeMR8GmA6R+p68I0J8lnwyQRxXm9wfbV2to3WJftlLvoR\npiii+8l7aO2oisp9bxA59uukWorsl4a+xhNpzYecB3oz+kx2f9B5AHaAEUpTPjvIGr3HIGPoVwxY\nzOpAjNPvAIYPsgDnWVOeFSgwyIztYoF6b9bmycziPMpQEbOSFGuKb6+tqpOf9IgGl81QRxVjoO4G\nnWGBpky5fHmRrp4oS6D35yZUALi1HXw0JVPCR+wvFMPlljEicxxQT0UzSREqldkSPrDNmDhtBJZ4\nzvEZUGl0+2KlhYScoV67IbaGD62EjlHJlPTRe5cIvAmnDqgIC9x8kk425BupCXj5CAl4Ye9ElK0t\nLd9a7eVNsnissP94LZmaUmKfWpKcYPDx7Y4xW5Epf2zVzZJ+/Fm299GUe3ntkN9s5f/d/x92Igne\nI1si4AAAAABJRU5ErkJggg==\n",
"text/latex": [
"$$1 + \\frac{x^{2}}{2} + \\frac{5 x^{4}}{24} + \\mathcal{O}\\left(x^{6}\\right)$$"
],
"text/plain": [
" 2 4 \n",
" x 5⋅x ⎛ 6⎞\n",
"1 + ── + ──── + O⎝x ⎠\n",
" 2 24 "
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"(1/cos(x)).series(x, 0, 6)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAB0AAAAqBAMAAAC9wk0pAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMlTvq5l2ZolE\nuyKPVsvzAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAg0lEQVQoFWNgwA3CBJDlGCvqUfgMDPMHN789\nX30BsgcGhi1kDAIqDAz/QeADLR2xe7YDsvFCBzgUkPk3GHgvIPF5/iFxgEzeBFQ+v8rOHmQReS0G\ntgAkAfmPDByJSHx+AwauP0h8ZgUGrl9IfPYEVHkWoP4EJHmGagYxZPMZuDtKGBgAryghjPEQrtEA\nAAAASUVORK5CYII=\n",
"text/latex": [
"$$- \\frac{1}{6}$$"
],
"text/plain": [
"-1/6"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"limit((sin(x)-x)/x**3, x, 0)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAASoAAAA4BAMAAAC4fag4AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMpm7du8iZolU\nq0RaI+fpAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF7klEQVRoBcVYXYgcRRCu2Z29vd2d21vyYJQQ\nXDeiLwox/pzngxxB1Jd4Fx8iGIRRUPRBMnkIF4nBKIoI/qyIIfjgrYrEGIQ1cIQo6AoaFYJ3ir/B\n6D4ICkGykUs05met6p6Z7p6d6fm5VQt2uqqr6uva7t6ebxsgrczfX0ubEhFf2bQx4EmNbXY5QqU5\nVgcngJbNPARf8cTs2Le6I+eb5hn4PVsZgaxJmG6yruzYl3lVdUsXoNIKDJDJvBnmuixRi23ORIMX\nxKJZJwGuiY5M41moUbQeO29TTLjMsXzmy2OB28Kj0vZOsAQ99nY7GnVeuEidE+YytMoMS9Zil163\no0d41neVCSrf8u1lKG/yXC12JWdHjmDiXnLlOPyCW8H2zGW01XZ1CtP12PuwKmP2h18PYqSxeb4D\nq2Y/APPRvXW0y7vwsXLnqzsc86oj9wIUyU4vKuz6I4dpt2qxDQerWgVvOOswck/HfMachBHnIoC1\naBfqWGm7PJGvj/b7PYCqmDv0JhYV9oV+nzK12BXAqt6FD2ufY2QDrKV8G8yl32rsIB+xASq1ykmr\nSTg460u8TfkMwrJ0LfbHVFUNrqBI4xQ+pjsAZ/OnH6GO3CJ2UoAreJJmkAFYhqHDNtp80D8pskrP\nhS7AaeNAfwb1PD1g3KEnSekcb9M9B2BZug7bOnbs5+ccd2n8L3XqRSjTtND3wdmboidJ3FwN0gHK\nGoClzjjsURs+KvZgK0Y2AKzRGahe+BTgqJtp1R6DYo1wcF+d4W3U06cDakAQlnnpG2uwx+3quZFe\nqYWxe1pwyHwScu3PavAQ2mM2wInOFngFdZKo3+Ad3A1EB4quLjVBWObSY1e2nH/tu63b3qZQ45sd\nTXj5/Z/g+N79XbTpfFo9u/LuFuok7Izhqvw0bdciOlBlqy67B2CZMyG2AsSN4NxEnO05d4ExCenA\neyFAIV0JsUMy4Xm1M+eotmvdJXon8IcrahT9IVoy7JBE2Kx2XuoPaD4tPCVx4hMdKOIniURixybf\nrka845vmWV8Fl5lQB9GBUk+4dFokti6J+cY6Ssh1iuUZo34QpwM3eQ59mwg7FMKoy93ltmz5+nTN\nUzkd2OSZ+taoy/4IbDlE6J8IFWC3MEq3CP0tX+V0YLtv65UobH0Wea2uFLOR60S+dp+H9U/dttOh\nnjvx4zE0sk/4c0dWtIRhR0fHeRj5uhrgBqfE3kAPYILH0ChXvDfjkIbpZ+TrYYAHAf4mXCzQZ2hk\nu3/3SE0pK64luRzG+ymlh8ckkS+s6j4ARoCux7FdhsaqmOtgY6yhAdZNoZp4DIzNLox8YVW4cqwq\nmitXZVr2uWLpGR+MfAWrksize42QBj2cmKVBAEa+pKq+xWyPoRFQ0t+gNGgEMZMiYlVGvnD5vBXE\n88lnaJQszq9YKC/Av6fxOtK3RL429L/c0P/68F+LmI5zY3gMjdASnu3ywP49jdy5PH20q+ZfqZrJ\nrIWERy9Hsx6PRS20lRBDEBulX28gMUsguKVJVt8TP4a5iyJ9KdOqDohH/QccsI+6JDY0GCF63Kqg\nGF8V/CjSUMtPKSY3SnZIJ+8aa2JLxCyBpKlqhYK3X7FcI0dDDwrtD6OOv2F+TzMYQD3s+oW70lRl\nzUhw4bOizoXl8AS+Pw4CuPc0EoxQ+fULt9NUBV8IDCjUJMNXJ32NFK8qvj8uBnDvaZQgz5CvX1JV\n5QFEtqW1ikutKtdVnEHDv3450Gjc2Giwt26S3R7EGbTpf49EDNWqCujUirh+Ge5cjbQUYqhWVa5r\na5Jp5HCryncUYqhWZanLGyxRviIZblX0UvKIYaXRWPNEo7FIo7P9YfaChSi2fP0y/KokYqjOVUxV\n8vWLW1Xh+z+OKpVnM2gFpVtVtaqqfgXlEb25kvuy67TbJWKoVhW728W4lwh1CBq+fGViqFYV4BxD\nGC4hBC6STAy9qvj+yE0lRBl6WMQbh43z0tBHSwqovp2NppyHb+f/SUaUOpQijLpi/pdGOL9hFWgK\n/tcrjGHIbPx/AGlnE7s84I3fAAAAAElFTkSuQmCC\n",
"text/latex": [
"$$- \\frac{4 x \\cos{\\left (x^{2} \\right )}}{x + 1} \\sin{\\left (x^{2} \\right )} - \\frac{\\cos^{2}{\\left (x^{2} \\right )}}{\\left(x + 1\\right)^{2}}$$"
],
"text/plain": [
" ⎛ 2⎞ ⎛ 2⎞ 2⎛ 2⎞\n",
" 4⋅x⋅sin⎝x ⎠⋅cos⎝x ⎠ cos ⎝x ⎠\n",
"- ─────────────────── - ────────\n",
" x + 1 2\n",
" (x + 1) "
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"diff(cos(x**2)**2 / (1+x), x)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Magic functions\n",
"\n",
"IPython has a set of predefined ‘magic functions’ that you can call with a command line style syntax. These include:\n",
"\n",
"* `%run`\n",
"* `%edit`\n",
"* `%debug`\n",
"* `%timeit`\n",
"* `%paste`\n",
"* `%load_ext`\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/json": {
"cell": {
"!": "OSMagics",
"HTML": "Other",
"SVG": "Other",
"bash": "Other",
"capture": "ExecutionMagics",
"debug": "ExecutionMagics",
"file": "Other",
"html": "DisplayMagics",
"javascript": "DisplayMagics",
"latex": "DisplayMagics",
"perl": "Other",
"prun": "ExecutionMagics",
"pypy": "Other",
"python": "Other",
"python2": "Other",
"python3": "Other",
"ruby": "Other",
"script": "ScriptMagics",
"sh": "Other",
"svg": "DisplayMagics",
"sx": "OSMagics",
"system": "OSMagics",
"time": "ExecutionMagics",
"timeit": "ExecutionMagics",
"writefile": "OSMagics"
},
"line": {
"alias": "OSMagics",
"alias_magic": "BasicMagics",
"autocall": "AutoMagics",
"automagic": "AutoMagics",
"autosave": "KernelMagics",
"bookmark": "OSMagics",
"cat": "Other",
"cd": "OSMagics",
"clear": "KernelMagics",
"colors": "BasicMagics",
"config": "ConfigMagics",
"connect_info": "KernelMagics",
"cp": "Other",
"debug": "ExecutionMagics",
"dhist": "OSMagics",
"dirs": "OSMagics",
"doctest_mode": "BasicMagics",
"ed": "Other",
"edit": "KernelMagics",
"env": "OSMagics",
"gui": "BasicMagics",
"hist": "Other",
"history": "HistoryMagics",
"install_default_config": "DeprecatedMagics",
"install_ext": "ExtensionMagics",
"install_profiles": "DeprecatedMagics",
"killbgscripts": "ScriptMagics",
"ldir": "Other",
"less": "KernelMagics",
"lf": "Other",
"lk": "Other",
"ll": "Other",
"load": "CodeMagics",
"load_ext": "ExtensionMagics",
"loadpy": "CodeMagics",
"logoff": "LoggingMagics",
"logon": "LoggingMagics",
"logstart": "LoggingMagics",
"logstate": "LoggingMagics",
"logstop": "LoggingMagics",
"ls": "Other",
"lsmagic": "BasicMagics",
"lx": "Other",
"macro": "ExecutionMagics",
"magic": "BasicMagics",
"man": "KernelMagics",
"matplotlib": "PylabMagics",
"mkdir": "Other",
"more": "KernelMagics",
"mv": "Other",
"notebook": "BasicMagics",
"page": "BasicMagics",
"pastebin": "CodeMagics",
"pdb": "ExecutionMagics",
"pdef": "NamespaceMagics",
"pdoc": "NamespaceMagics",
"pfile": "NamespaceMagics",
"pinfo": "NamespaceMagics",
"pinfo2": "NamespaceMagics",
"popd": "OSMagics",
"pprint": "BasicMagics",
"precision": "BasicMagics",
"profile": "BasicMagics",
"prun": "ExecutionMagics",
"psearch": "NamespaceMagics",
"psource": "NamespaceMagics",
"pushd": "OSMagics",
"pwd": "OSMagics",
"pycat": "OSMagics",
"pylab": "PylabMagics",
"qtconsole": "KernelMagics",
"quickref": "BasicMagics",
"recall": "HistoryMagics",
"rehashx": "OSMagics",
"reload_ext": "ExtensionMagics",
"rep": "Other",
"rerun": "HistoryMagics",
"reset": "NamespaceMagics",
"reset_selective": "NamespaceMagics",
"rm": "Other",
"rmdir": "Other",
"run": "ExecutionMagics",
"save": "CodeMagics",
"sc": "OSMagics",
"set_env": "OSMagics",
"store": "StoreMagics",
"sx": "OSMagics",
"system": "OSMagics",
"tb": "ExecutionMagics",
"time": "ExecutionMagics",
"timeit": "ExecutionMagics",
"unalias": "OSMagics",
"unload_ext": "ExtensionMagics",
"who": "NamespaceMagics",
"who_ls": "NamespaceMagics",
"whos": "NamespaceMagics",
"xdel": "NamespaceMagics",
"xmode": "BasicMagics"
}
},
"text/plain": [
"Available line magics:\n",
"%alias %alias_magic %autocall %automagic %autosave %bookmark %cat %cd %clear %colors %config %connect_info %cp %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %install_default_config %install_ext %install_profiles %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %man %matplotlib %mkdir %more %mv %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode\n",
"\n",
"Available cell magics:\n",
"%%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%latex %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile\n",
"\n",
"Automagic is ON, % prefix IS NOT needed for line magics."
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%lsmagic"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"IPython also creates aliases for a few common interpreters, such as bash, ruby, perl, etc.\n",
"\n",
"These are all equivalent to `%%script <name>`"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hello from Ruby 2.0.0\n"
]
}
],
"source": [
"%%ruby\n",
"puts \"Hello from Ruby #{RUBY_VERSION}\""
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"hello from /bin/bash\n"
]
}
],
"source": [
"%%bash\n",
"echo \"hello from $BASH\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"IPython has an `rmagic` extension that contains a some magic functions for working with R via rpy2. This extension can be loaded using the `%load_ext` magic as follows:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%load_ext rpy2.ipython"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If the above generates an error, it is likely that you do not have the `rpy2` module installed. You can install this now via:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied (use --upgrade to upgrade): rpy2 in /Users/fonnescj/anaconda3/lib/python3.5/site-packages\r\n",
"Requirement already satisfied (use --upgrade to upgrade): six in /Users/fonnescj/anaconda3/lib/python3.5/site-packages (from rpy2)\r\n"
]
}
],
"source": [
"!pip install rpy2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"or, if you are running Anaconda, via `conda`:"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fetching package metadata: ......\n",
"Solving package specifications: .\n",
"Error: Package missing in current osx-64 channels: \n",
" - rpy2\n",
"\n",
"You can search for this package on anaconda.org with\n",
"\n",
" anaconda search -t conda rpy2\n"
]
}
],
"source": [
"!conda install rpy2"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"\n",
"Call:\n",
"lm(formula = rnorm(10) ~ rnorm(10))\n",
"\n",
"Coefficients:\n",
"(Intercept) \n",
" -0.3007 \n",
"\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"i am python\n"
]
}
],
"source": [
"%R print(lm(rnorm(10)~rnorm(10)))\n",
"\n",
"print('i am python')"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import numpy as np\n",
"x,y = np.arange(10), np.random.normal(size=10)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"\n",
"Call:\n",
"lm(formula = y ~ x)\n",
"\n",
"Residuals:\n",
" Min 1Q Median 3Q Max \n",
"-1.11158 -0.69414 -0.00033 0.37181 1.55186 \n",
"\n",
"Coefficients:\n",
" Estimate Std. Error t value Pr(>|t|) \n",
"(Intercept) -1.38481 0.53340 -2.596 0.0318 *\n",
"x 0.29939 0.09991 2.996 0.0172 *\n",
"---\n",
"Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1\n",
"\n",
"Residual standard error: 0.9075 on 8 degrees of freedom\n",
"Multiple R-squared: 0.5288,\tAdjusted R-squared: 0.4699 \n",
"F-statistic: 8.979 on 1 and 8 DF, p-value: 0.01716\n",
"\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n/vPOO0/22WcfOfDAA4O2rVu3yvXXXy833XSTTfull16SV1991e5/+eWXMm7cuJjz7NOnjwwfPjzm\n5/QBRSAeCDRu3FiaN28elNQPP/xg+4ddu3YFnU/GQenSpeWDDz4Im9Xzzz8vDRs2lOOPP14qVaok\nzZo1k9dffz3sve5J2izt+cgjj5STTz7Z9iN33323e1n/Y0RAGXCMgOV3O8zyiy++sNvGjRuFBnfj\njTfm90i+15YtWyZVq1bN9550uThs2DBhoBK4MWC54YYb5LrrrrPVGD9+vNDAIQYZCxcutPv6owik\nEwK020cffdTTRZ41a5b0799fBg0aJJ999pl8+umnMmTIEDn//PPl5ZdfDlt2BsWNGjWSBg0aCP3b\n5s2bZdGiRUJa/fr1C/uMnswfAWXA+eNT6KsHHXSQHV26YhpENjAhZsYwnjvvvFM4B02bNk3KlCkj\nhxxyiLRv3162b99uz3fp0kU+/vhju//MM89IjRo1pFy5cvLss8/ac/zcdddd8r///c9/TB4wMmjT\npk3SpEkTKVGihJQtW1ZGjRrlv8/doRHVr19fDjjgADurXrlypXvJ/3/FFVfIU0895T9+7rnnpFev\nXvLPP/9I9+7dpWTJkjb9kSNH+u+JdueRRx6xndXkyZNtY2ZGzMx3wIABsnjxYrnkkktsUkuWLJFa\ntWrZvBiBf//99/Y8GNKRlCpVSk477TShk1BSBFKJAEyNgWUk6RffMt/wwQcfLOeee6588803tri0\nn6FDh9o+om/fvnLPPffY7dRTT5XDDz/cSnbmzZsnSMbq1asnbltFhNy7d2/br5AmfciOHTvyheC+\n++6zebVt21b22msve2/Tpk1tuUePHh32WfqAE044QQYOHGjLw01HHHGE0DfRZn/99dewz+nJyAgo\nA46MTcxXaFiMHl988UUZO3as0KBcBgKTnT59utCA5syZI08++aSsXr1a/vjjD7nyyisFprZlyxbZ\nuXOnPPzwwzZvmC/X+Yfh0Th5/pVXXvGXbdu2bX5mxEkaPSIviLxbtWolX331lWW+zDR//PFHe839\nYYbepk0bIZ1LL71UrrrqKveS/x9RE+V3iXqcdNJJMnv2bPnoo49suakzgwqOw9GqVatk4sSJ/u2t\nt96yt7nl79SpkyC+u+WWW6Rnz55yxx132AEMWHz33Xdyzjnn2Jnye++9ZwcUrpj5oYcesmKz1157\n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\n"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%%R -i x,y -o XYcoef\n",
"lm.fit <- lm(y~x)\n",
"par(mfrow=c(2,2))\n",
"print(summary(lm.fit))\n",
"plot(lm.fit)\n",
"XYcoef <- coef(lm.fit)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([-1.38481025, 0.29938957])"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"XYcoef"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Remote Code\n",
"\n",
"Use `%load` to add remote code"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nP/7xjxQWFvLee++Rk5NjT1hCCCFEj1w6WjIiIoJ58+bxq1/9iiFDhhAVFcUvf/lLxo0b1zl6EuD7\n3/8+3/3ud1m1ahUAr7/+OmvXrmXz5s2MHDmy8/lcUFAQERERrgxRCCHEIODS4gawbt06zGYzCxYs\noKWlhalTp7Jp0yYURencp7KykpSUlM6vt2zZgs1mY/78+V3ONXfuXP70pz+5OkQhhBB+Tqmvr+99\ndrUQQgjhg3xibUl/WdJry5YtTJgwgWHDhpGXl0dpaWmf+3/55Zc89thjJCQkkJWVRWFhoYcitZ8j\nOR04cIBnnnmGMWPGkJiYyJQpU9i2bZsHo7Wfo9fqltOnTzN8+HCSk5PdHKFznMlrw4YN5OTkMHTo\nUDIzM1mzZo0HIrWfoznt27ePhx9+mOTkZEaNGsUzzzzD6dOnPRStfT7//HPmzp3Ld77zHaKjo3n3\n3XfveIy3txeO5tTf9sInips/LOn1/vvvs2LFCpYtW0ZJSQk5OTnMmjWLixcv9rh/Y2MjM2fOZNiw\nYRQXF/PKK69QVFTkVd20juZ0+PBhsrKy2Lp1K6WlpSxcuJClS5eyc+dOD0feN0fzuqW9vZ2FCxcy\nZcoUD0XqGGfyWrlyJW+//TZr1qzh8OHDvPfee3aNfPYUR3OqrKzkBz/4AVOmTKGkpITdu3fT2trK\n7NmzPRx535qamsjKymLdunWEhITccX9faC8czam/7YXXd0s2NDSQlpbGxo0bu4zAHDduHDt37ux1\nSa+eZGRksGzZsgFZ0uvBBx9k3Lhx/OEPf+jcds899/Dkk092Dqy53Ztvvsnq1as5deoUAQEBAPz+\n97/n7bff5r///a/H4u6Lozn1ZP78+ei6zjvvvOOuMB3mbF4rVqygsbGRyZMns3z5cs6fP++JcO3m\naF4VFRVMnjyZ0tJS0tLSPBmq3RzNaffu3SxcuJDq6urOcQAlJSXMmDGD06dP2zUq3NOGDx/O7373\nO+bOndvrPr7QXtzOnpx64kh74fV3bv6wpFd7ezvl5eXk5eV12T5t2rReczhy5AiTJk3q/EEFmD59\nOpcvX+bcuXPuDNcuzuTUk8bGRq9aZs3ZvP7+97/z8ccfe11X0C3O5PXhhx8yYsQI/vGPf5Cdnc34\n8eP56U9/ytWrVz0Q8Z05k9Pdd9+NxWJh69at6LpOY2Mj27dv55577vHKwmYvb28vXMWR9sLri5s/\nLOlVU1ODpmnEx8d32d5XDlVVVT3ubxiGQ3m7izM5fdtHH33EZ5991m2U7EByJq/Lly+zdOlSNm/e\nbFd3y0BwJq+zZ89y7tw5du3axZ///GfeeOMNKioqHP607S7O5JScnMz777/Pb3/7W+Lj40lNTeXr\nr7/mL3/5iydCdhtvby9cwdH2YsCK29q1azsnh/f0JyYmhoMHD7rke91a0mvbtm2Dbkkvb3Xo0CGe\nf/55CgsLfX41mkWLFrFw4UImTpwI0OezYF+i6zptbW288cYb5Obmkpuby6ZNm/jXv/7FF198MdDh\nOaWqqoolS5Ywd+5c9u/fz969ewkLC+NHP/rRQIcm+uBMe+HyeW72GkxLesXGxmIymbp9gqquru72\naeuW+Pj4HvdXFKXXYzzJmZxuKS0tZc6cObz00ks899xzbozScc7kVVJSQmlpKevWrQM6ipuu68TF\nxbF+/Xp++MMfuj3uO3Emr6FDh2I2mxkxYkTntlGjRmEymTh//jx33323W2O+E2dy2rx5M6Ghobz8\n8sud2zZt2kRWVhZlZWXcd9997gzZbby9vegPZ9uLAbtzi46OJi0trc8/QUFBXZb0usWRJb3WrVs3\n4Et6WSwWsrOzKS4u7rJ9//79veaQk5NDaWkpbW1tnds+/fRTEhISukyAHyjO5ARw8OBBZs+ezYoV\nK1i0aJGbo3ScM3mVlpZSUlLCgQMHOHDgACtXriQkJIQDBw4wY8YMD0R9Z87klZubi81m4+zZs53b\nzpw5g6ZpPvsz2NzcjMlk6rJNVTuaQV3X3RKnJ3h7e+Gs/rQXXv/M7fYlvf75z39y9OhRXnjhhR6X\n9Pr1r3/d+fXrr7/OmjVrKCoq6lzSq6qqioaGhoFIg4KCArZv387WrVs5efIky5cvx2q1dvYfr169\nuktD+NRTTxESEsLixYv56quv2LNnD6+99hoFBQUDEn9PHM2ppKSE2bNns2DBAvLz8zuvSU1NzUCl\n0CNH8xozZkyXPwkJCaiqSkZGBpGRkQOVRjeO5pWXl8eECRN48cUXOXbsGEePHuXFF18kJyenswt2\noDma08MPP8zRo0cpLCzkm2++oby8nIKCAoYPH+5V3eNNTU0cP36cY8eOoes6Fy5c4Pjx41y4cAHw\nzfbC0Zz6214MWLekI/xhSa+ZM2dSV1fH+vXrsVqtZGZmsmPHDpKSkgCwWq1UVlZ27h8REcGuXbtY\ntmwZ06ZNIyoqiiVLlrB48WKPx94bR3N69913aW5upqioiKKios7tycnJHD161OPx98bRvHyFo3kp\nisJf//pXli9fzuOPP05QUBAPPPAAv/nNbwYqhW4czen+++9ny5YtvPbaaxQVFREcHMy9997Lzp07\nCQ4OHqg0uvn3v//NE0880dnGvfLKK7zyyiud7ZcvtheO5tTf9sLr57kJIYQQjvL6bkkhhBDCUVLc\nhBBC+B0pbkIIIfyOFDchhBB+R4qbEEIIvyPFTQghhN+R4iaEEMLvSHETQgjhd6S4CSGE8Dv/D3/O\njgONPOqQAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10cb069b0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# %load http://matplotlib.org/mpl_examples/shapes_and_collections/scatter_demo.py\n",
"\"\"\"\n",
"Simple demo of a scatter plot.\n",
"\"\"\"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"\n",
"N = 50\n",
"x = np.random.rand(N)\n",
"y = np.random.rand(N)\n",
"colors = np.random.rand(N)\n",
"area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radiuses\n",
"\n",
"plt.scatter(x, y, s=area, c=colors, alpha=0.5)\n",
"plt.show()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Debugging and Profiling\n",
"\n",
"The `%debug` magic can be used to trigger the IPython debugger (`ipd`) for a cell that raises an exception. The debugger allows you to step through code line-by-line and inspect variables and execute code."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import numpy\n",
"\n",
"def abc(y, N, epsilon=[0.2, 0.8]):\n",
" \n",
" trace = []\n",
"\n",
" while len(trace) < N:\n",
"\n",
" # Simulate from priors\n",
" mu = numpy.random.normal(0, 10)\n",
" sigma = numpy.random.uniform(0, 20)\n",
"\n",
" x = numpy.random.normal(mu, sigma, 50)\n",
"\n",
" #if (np.linalg.norm(y - x) < epsilon):\n",
" if ((abs(x.mean() - y.mean()) < epsilon) &\n",
" (abs(x.std() - y.std()) < epsilon[1])):\n",
" trace.append([mu, sigma])\n",
"\n",
" return trace"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "ValueError",
"evalue": "The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-28-7c206d122281>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnormal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m50\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mabc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m<ipython-input-27-1624751c5798>\u001b[0m in \u001b[0;36mabc\u001b[0;34m(y, N, epsilon)\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;31m#if (np.linalg.norm(y - x) < epsilon):\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m if ((abs(x.mean() - y.mean()) < epsilon) &\n\u001b[0;32m---> 17\u001b[0;31m (abs(x.std() - y.std()) < epsilon[1])):\n\u001b[0m\u001b[1;32m 18\u001b[0m \u001b[0mtrace\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mmu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msigma\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()"
]
}
],
"source": [
"y = numpy.random.normal(4, 2, 50)\n",
"abc(y, 10)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"> \u001b[0;32m<ipython-input-27-1624751c5798>\u001b[0m(17)\u001b[0;36mabc\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32m 15 \u001b[0;31m \u001b[0;31m#if (np.linalg.norm(y - x) < epsilon):\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0m\u001b[0;32m 16 \u001b[0;31m if ((abs(x.mean() - y.mean()) < epsilon) &\n",
"\u001b[0m\u001b[0;32m---> 17 \u001b[0;31m (abs(x.std() - y.std()) < epsilon[1])):\n",
"\u001b[0m\u001b[0;32m 18 \u001b[0;31m \u001b[0mtrace\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mmu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msigma\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0m\u001b[0;32m 19 \u001b[0;31m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0m\n",
"\u0001\u0002ipdb> \u0001\u0002q\n"
]
}
],
"source": [
"%debug"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Timing the execution of code is easy with the `timeit` magic:"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1000 loops, best of 3: 458 µs per loop\n"
]
}
],
"source": [
"%timeit [i**2 for i in range(1000)]"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The slowest run took 17.53 times longer than the fastest. This could mean that an intermediate result is being cached.\n",
"100000 loops, best of 3: 3.26 µs per loop\n"
]
}
],
"source": [
"%timeit numpy.arange(1000)**2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exporting and Converting Notebooks\n",
"\n",
"In Jupyter, one can convert an `.ipynb` notebook document file into various static formats via the `nbconvert` tool. Currently, nbconvert is a command line tool, run as a script using Jupyter."
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[NbConvertApp] Converting notebook Introduction to Jupyter Notebooks.ipynb to html\n",
"[NbConvertApp] Writing 485237 bytes to Introduction to Jupyter Notebooks.html\n"
]
}
],
"source": [
"!jupyter nbconvert --to html \"Introduction to Jupyter Notebooks.ipynb\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Currently, `nbconvert` supports HTML (default), LaTeX, Markdown, reStructuredText, Python and HTML5 slides for presentations. Some types can be post-processed, such as LaTeX to PDF (this requires [Pandoc](http://johnmacfarlane.net/pandoc/) to be installed, however)."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[NbConvertApp] Converting notebook Introduction to Jupyter Notebooks.ipynb to pdf\n",
"[NbConvertApp] Support files will be in Introduction to Jupyter Notebooks_files/\n",
"[NbConvertApp] Making directory Introduction to Jupyter Notebooks_files\n",
"[NbConvertApp] Making directory Introduction to Jupyter Notebooks_files\n",
"[NbConvertApp] Making directory Introduction to Jupyter Notebooks_files\n",
"[NbConvertApp] Making directory Introduction to Jupyter Notebooks_files\n",
"[NbConvertApp] Making directory Introduction to Jupyter Notebooks_files\n",
"[NbConvertApp] Making directory Introduction to Jupyter Notebooks_files\n",
"[NbConvertApp] Making directory Introduction to Jupyter Notebooks_files\n",
"[NbConvertApp] Making directory Introduction to Jupyter Notebooks_files\n",
"[NbConvertApp] Making directory Introduction to Jupyter Notebooks_files\n",
"[NbConvertApp] Writing 106012 bytes to notebook.tex\n",
"[NbConvertApp] Building PDF\n",
"[NbConvertApp] Running pdflatex 3 times: ['pdflatex', 'notebook.tex']\n",
"[NbConvertApp] CRITICAL | pdflatex failed: ['pdflatex', 'notebook.tex']\n",
"This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015) (preloaded format=pdflatex)\n",
" restricted \\write18 enabled.\n",
"entering extended mode\n",
"(./notebook.tex\n",
"LaTeX2e <2015/01/01>\n",
"Babel <3.9l> and hyphenation patterns for 79 languages loaded.\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/article.cls\n",
"Document Class: article 2014/09/29 v1.4h Standard LaTeX document class\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/size11.clo))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/fontenc.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/t1enc.def))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/psnfss/palatino.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/graphics/graphicx.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/graphics/keyval.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/graphics/graphics.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/graphics/trig.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/latexconfig/graphics.cfg)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/pdftex-def/pdftex.def\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/infwarerr.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/ltxcmds.sty))))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/caption/caption.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/caption/caption3.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/adjustbox/adjustbox.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/xkeyval/xkeyval.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/xkeyval/xkeyval.tex\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/xkeyval/xkvutils.tex)))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/adjustbox/adjcalc.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/adjustbox/trimclip.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/collectbox/collectbox.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/adjustbox/tc-pdftex.def))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/varwidth/varwidth.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/xcolor/xcolor.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/latexconfig/color.cfg))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/tools/enumerate.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/geometry/geometry.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/ifpdf.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/ifvtex.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/ifxetex/ifxetex.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsmath/amsmath.sty\n",
"For additional information on amsmath, use the `?' option.\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsmath/amstext.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsmath/amsgen.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsmath/amsbsy.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsmath/amsopn.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsfonts/amssymb.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsfonts/amsfonts.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/textcomp.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/ts1enc.def))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/upquote/upquote.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/eurosym/eurosym.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/ucs/ucs.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/ucs/data/uni-global.def))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/inputenc.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/ucs/utf8x.def))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty\n",
"Style option: `fancyvrb' v2.7a, with DG/SPQR fixes, and firstline=lastline fix \n",
"<2008/02/07> (tvz))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/oberdiek/grffile.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/oberdiek/kvoptions.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/etexcmds.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/ifluatex.sty))))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/hyperref/hyperref.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/oberdiek/auxhook.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/hyperref/pd1enc.def)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/latexconfig/hyperref.cfg)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/url/url.sty))\n",
"\n",
"Package hyperref Message: Driver (autodetected): hpdftex.\n",
"\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/hyperref/hpdftex.def\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/tools/longtable.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/booktabs/booktabs.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/ulem/ulem.sty)\n",
"No file notebook.aux.\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/ts1cmr.fd)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/psnfss/t1ppl.fd)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/context/base/supp-pdf.mkii\n",
"[Loading MPS to PDF converter (version 2006.09.02).]\n",
") (/usr/local/texlive/2015/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/oberdiek/grfext.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/caption/ltcaption.sty)\n",
"*geometry* driver: auto-detecting\n",
"*geometry* detected driver: pdftex\n",
"*geometry* verbose mode - [ preamble ] result:\n",
"* driver: pdftex\n",
"* paper: <default>\n",
"* layout: <same size as paper>\n",
"* layoutoffset:(h,v)=(0.0pt,0.0pt)\n",
"* modes: \n",
"* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt)\n",
"* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt)\n",
"* \\paperwidth=614.295pt\n",
"* \\paperheight=794.96999pt\n",
"* \\textwidth=469.75502pt\n",
"* \\textheight=650.43001pt\n",
"* \\oddsidemargin=0.0pt\n",
"* \\evensidemargin=0.0pt\n",
"* \\topmargin=-37.0pt\n",
"* \\headheight=12.0pt\n",
"* \\headsep=25.0pt\n",
"* \\topskip=11.0pt\n",
"* \\footskip=30.0pt\n",
"* \\marginparwidth=59.0pt\n",
"* \\marginparsep=10.0pt\n",
"* \\columnsep=10.0pt\n",
"* \\skip\\footins=10.0pt plus 4.0pt minus 2.0pt\n",
"* \\hoffset=0.0pt\n",
"* \\voffset=0.0pt\n",
"* \\mag=1000\n",
"* \\@twocolumnfalse\n",
"* \\@twosidefalse\n",
"* \\@mparswitchfalse\n",
"* \\@reversemarginfalse\n",
"* (1in=72.27pt=25.4mm, 1cm=28.453pt)\n",
"\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/ucs/ucsencs.def)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/hyperref/nameref.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/gettitlestring.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsfonts/umsa.fd)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsfonts/umsb.fd)\n",
"\n",
"LaTeX Warning: No \\author given.\n",
"\n",
"<images/workflow.png, id=4, 430.2474pt x 47.6982pt> <use images/workflow.png>\n",
"[1{/usr/local/texlive/2015/texmf-var/fonts/map/pdftex/updmap/pdftex.map} </User\n",
"s/fonnescj/Dropbox/Statistical Computing Series/Jupyter/images/workflow.png>]\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/psnfss/ts1ppl.fd)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/psnfss/t1pcr.fd) [2]\n",
"\n",
"LaTeX Warning: File `http://fonnesbeck-dropshare.s3.amazonaws.com/687474703a2f2\n",
"f666f6e6e65736265636b2d64726f7073686172652e73332e616d617a6f6e6177732e636f6d2f53\n",
"637265656e2d53686f742d323031362d30332d31382d61742d332e32342e32362d504d2e706e67.\n",
"png' not found on input line 474.\n",
"\n",
"\n",
"! Package pdftex.def Error: File `http://fonnesbeck-dropshare.s3.amazonaws.com/\n",
"687474703a2f2f666f6e6e65736265636b2d64726f7073686172652e73332e616d617a6f6e61777\n",
"32e636f6d2f53637265656e2d53686f742d323031362d30332d31382d61742d332e32342e32362d\n",
"504d2e706e67.png' not found.\n",
"\n",
"See the pdftex.def package documentation for explanation.\n",
"Type H <return> for immediate help.\n",
" ... \n",
" \n",
"l.474 ...2d61742d332e32342e32362d504d2e706e67.png}\n",
" \n",
"? \n",
"! Emergency stop.\n",
" ... \n",
" \n",
"l.474 ...2d61742d332e32342e32362d504d2e706e67.png}\n",
" \n",
"! ==> Fatal error occurred, no output PDF file produced!\n",
"Transcript written on notebook.log.\n",
"\n",
"Traceback (most recent call last):\n",
" File \"/Users/fonnescj/anaconda3/bin/jupyter-nbconvert\", line 11, in <module>\n",
" sys.exit(main())\n",
" File \"/Users/fonnescj/anaconda3/lib/python3.5/site-packages/jupyter_core/application.py\", line 267, in launch_instance\n",
" return super(JupyterApp, cls).launch_instance(argv=argv, **kwargs)\n",
" File \"/Users/fonnescj/anaconda3/lib/python3.5/site-packages/traitlets/config/application.py\", line 596, in launch_instance\n",
" app.start()\n",
" File \"/Users/fonnescj/anaconda3/lib/python3.5/site-packages/nbconvert/nbconvertapp.py\", line 293, in start\n",
" self.convert_notebooks()\n",
" File \"/Users/fonnescj/anaconda3/lib/python3.5/site-packages/nbconvert/nbconvertapp.py\", line 457, in convert_notebooks\n",
" self.convert_single_notebook(notebook_filename)\n",
" File \"/Users/fonnescj/anaconda3/lib/python3.5/site-packages/nbconvert/nbconvertapp.py\", line 428, in convert_single_notebook\n",
" output, resources = self.export_single_notebook(notebook_filename, resources, input_buffer=input_buffer)\n",
" File \"/Users/fonnescj/anaconda3/lib/python3.5/site-packages/nbconvert/nbconvertapp.py\", line 357, in export_single_notebook\n",
" output, resources = self.exporter.from_filename(notebook_filename, resources=resources)\n",
" File \"/Users/fonnescj/anaconda3/lib/python3.5/site-packages/nbconvert/exporters/exporter.py\", line 165, in from_filename\n",
" return self.from_file(f, resources=resources, **kw)\n",
" File \"/Users/fonnescj/anaconda3/lib/python3.5/site-packages/nbconvert/exporters/exporter.py\", line 183, in from_file\n",
" return self.from_notebook_node(nbformat.read(file_stream, as_version=4), resources=resources, **kw)\n",
" File \"/Users/fonnescj/anaconda3/lib/python3.5/site-packages/nbconvert/exporters/pdf.py\", line 175, in from_notebook_node\n",
" raise LatexFailed('\\n'.join(self._captured_output))\n",
"nbconvert.exporters.pdf.LatexFailed: PDF creating failed, captured latex output:\n",
"This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015) (preloaded format=pdflatex)\n",
" restricted \\write18 enabled.\n",
"entering extended mode\n",
"(./notebook.tex\n",
"LaTeX2e <2015/01/01>\n",
"Babel <3.9l> and hyphenation patterns for 79 languages loaded.\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/article.cls\n",
"Document Class: article 2014/09/29 v1.4h Standard LaTeX document class\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/size11.clo))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/fontenc.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/t1enc.def))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/psnfss/palatino.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/graphics/graphicx.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/graphics/keyval.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/graphics/graphics.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/graphics/trig.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/latexconfig/graphics.cfg)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/pdftex-def/pdftex.def\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/infwarerr.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/ltxcmds.sty))))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/caption/caption.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/caption/caption3.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/adjustbox/adjustbox.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/xkeyval/xkeyval.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/xkeyval/xkeyval.tex\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/xkeyval/xkvutils.tex)))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/adjustbox/adjcalc.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/adjustbox/trimclip.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/collectbox/collectbox.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/adjustbox/tc-pdftex.def))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/varwidth/varwidth.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/xcolor/xcolor.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/latexconfig/color.cfg))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/tools/enumerate.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/geometry/geometry.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/ifpdf.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/ifvtex.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/ifxetex/ifxetex.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsmath/amsmath.sty\n",
"For additional information on amsmath, use the `?' option.\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsmath/amstext.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsmath/amsgen.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsmath/amsbsy.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsmath/amsopn.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsfonts/amssymb.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsfonts/amsfonts.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/textcomp.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/ts1enc.def))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/upquote/upquote.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/eurosym/eurosym.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/ucs/ucs.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/ucs/data/uni-global.def))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/inputenc.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/ucs/utf8x.def))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/fancyvrb/fancyvrb.sty\n",
"Style option: `fancyvrb' v2.7a, with DG/SPQR fixes, and firstline=lastline fix \n",
"<2008/02/07> (tvz))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/oberdiek/grffile.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/oberdiek/kvoptions.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/etexcmds.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/ifluatex.sty))))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/hyperref/hyperref.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/oberdiek/auxhook.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/hyperref/pd1enc.def)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/latexconfig/hyperref.cfg)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/url/url.sty))\n",
"\n",
"Package hyperref Message: Driver (autodetected): hpdftex.\n",
"\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/hyperref/hpdftex.def\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/tools/longtable.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/booktabs/booktabs.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/ulem/ulem.sty)\n",
"No file notebook.aux.\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/base/ts1cmr.fd)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/psnfss/t1ppl.fd)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/context/base/supp-pdf.mkii\n",
"[Loading MPS to PDF converter (version 2006.09.02).]\n",
") (/usr/local/texlive/2015/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/oberdiek/grfext.sty)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/caption/ltcaption.sty)\n",
"*geometry* driver: auto-detecting\n",
"*geometry* detected driver: pdftex\n",
"*geometry* verbose mode - [ preamble ] result:\n",
"* driver: pdftex\n",
"* paper: <default>\n",
"* layout: <same size as paper>\n",
"* layoutoffset:(h,v)=(0.0pt,0.0pt)\n",
"* modes: \n",
"* h-part:(L,W,R)=(72.26999pt, 469.75502pt, 72.26999pt)\n",
"* v-part:(T,H,B)=(72.26999pt, 650.43001pt, 72.26999pt)\n",
"* \\paperwidth=614.295pt\n",
"* \\paperheight=794.96999pt\n",
"* \\textwidth=469.75502pt\n",
"* \\textheight=650.43001pt\n",
"* \\oddsidemargin=0.0pt\n",
"* \\evensidemargin=0.0pt\n",
"* \\topmargin=-37.0pt\n",
"* \\headheight=12.0pt\n",
"* \\headsep=25.0pt\n",
"* \\topskip=11.0pt\n",
"* \\footskip=30.0pt\n",
"* \\marginparwidth=59.0pt\n",
"* \\marginparsep=10.0pt\n",
"* \\columnsep=10.0pt\n",
"* \\skip\\footins=10.0pt plus 4.0pt minus 2.0pt\n",
"* \\hoffset=0.0pt\n",
"* \\voffset=0.0pt\n",
"* \\mag=1000\n",
"* \\@twocolumnfalse\n",
"* \\@twosidefalse\n",
"* \\@mparswitchfalse\n",
"* \\@reversemarginfalse\n",
"* (1in=72.27pt=25.4mm, 1cm=28.453pt)\n",
"\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/ucs/ucsencs.def)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/hyperref/nameref.sty\n",
"(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/gettitlestring.sty))\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsfonts/umsa.fd)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/amsfonts/umsb.fd)\n",
"\n",
"LaTeX Warning: No \\author given.\n",
"\n",
"<images/workflow.png, id=4, 430.2474pt x 47.6982pt> <use images/workflow.png>\n",
"[1{/usr/local/texlive/2015/texmf-var/fonts/map/pdftex/updmap/pdftex.map} </User\n",
"s/fonnescj/Dropbox/Statistical Computing Series/Jupyter/images/workflow.png>]\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/psnfss/ts1ppl.fd)\n",
"(/usr/local/texlive/2015/texmf-dist/tex/latex/psnfss/t1pcr.fd) [2]\n",
"\n",
"LaTeX Warning: File `http://fonnesbeck-dropshare.s3.amazonaws.com/687474703a2f2\n",
"f666f6e6e65736265636b2d64726f7073686172652e73332e616d617a6f6e6177732e636f6d2f53\n",
"637265656e2d53686f742d323031362d30332d31382d61742d332e32342e32362d504d2e706e67.\n",
"png' not found on input line 474.\n",
"\n",
"\n",
"! Package pdftex.def Error: File `http://fonnesbeck-dropshare.s3.amazonaws.com/\n",
"687474703a2f2f666f6e6e65736265636b2d64726f7073686172652e73332e616d617a6f6e61777\n",
"32e636f6d2f53637265656e2d53686f742d323031362d30332d31382d61742d332e32342e32362d\n",
"504d2e706e67.png' not found.\n",
"\n",
"See the pdftex.def package documentation for explanation.\n",
"Type H <return> for immediate help.\n",
" ... \n",
" \n",
"l.474 ...2d61742d332e32342e32362d504d2e706e67.png}\n",
" \n",
"? \n",
"! Emergency stop.\n",
" ... \n",
" \n",
"l.474 ...2d61742d332e32342e32362d504d2e706e67.png}\n",
" \n",
"! ==> Fatal error occurred, no output PDF file produced!\n",
"Transcript written on notebook.log.\n",
"\n"
]
}
],
"source": [
"!jupyter nbconvert --to pdf \"Introduction to Jupyter Notebooks.ipynb\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A very useful online service is the [IPython Notebook Viewer](http://nbviewer.ipython.org) which allows you to display your notebook as a static HTML page, which is useful for sharing with others:"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <iframe\n",
" width=\"100%\"\n",
" height=\"350\"\n",
" src=\"http://nbviewer.ipython.org/2352771\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" ></iframe>\n",
" "
],
"text/plain": [
"<IPython.lib.display.IFrame at 0x10cfc5978>"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"IFrame(\"http://nbviewer.ipython.org/2352771\", width='100%', height=350)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"GitHub supports the [rendering of Jupyter Notebooks](https://gist.github.com/fonnesbeck/670e777406a2f2bfb67e) stored on its repositories."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Parallel IPython\n",
"\n",
"The IPython architecture consists of four components, which reside in the `ipyparallel` package:\n",
"\n",
"1. **Engine** The IPython engine is a Python instance that accepts Python commands over a network connection. When multiple engines are started, parallel and distributed computing becomes possible. An important property of an IPython engine is that it blocks while user code is being executed. \n",
"\n",
"2. **Hub** The hub keeps track of engine connections, schedulers, clients, as well as persist all task requests and results in a database for later use.\n",
"\n",
"3. **Schedulers** All actions that can be performed on the engine go through a Scheduler. While the engines themselves block when user code is run, the schedulers hide that from the user to provide a fully asynchronous interface to a set of engines.\n",
"\n",
"4. **Client** The primary object for connecting to a cluster.\n",
"\n",
"![IPython architecture](images/ipython_architecture.png)\n",
"(courtesy Min Ragan-Kelley)\n",
"\n",
"This architecture is implemented using the ØMQ messaging library and the associated Python bindings in `pyzmq`.\n",
"\n",
"### Running parallel IPython\n",
"\n",
"To enable the IPython Clusters tab in Jupyter Notebook:\n",
"\n",
" ipcluster nbextension enable\n",
" \n",
"When you then start a Jupyter session, you should see the following in your **IPython Clusters** tab: \n",
"\n",
"![parallel tab](images/parallel_tab.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Before running the next cell, make sure you have first started your cluster, you can use the [clusters tab in the dashboard](/#tab2) to do so. \n",
"\n",
"Select the number if IPython engines (nodes) that you want to use, then click **Start**."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from ipyparallel import Client\n",
"client = Client()\n",
"dv = client.direct_view()"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAAkAAAAOBAMAAAAPuiubAAAALVBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAOrOgAAAADnRSTlMAIpm7MhCriUTv3c12VLge\nopIAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABOSURBVAgdY2BUMnZgYAhjYH/BwJDKwDCTgWEWA0Oe\nA8O+ABAJBOsCgATHcxCTKwFEKoEIHgUQeYmBUYCBRYGBR4BBqrwoi4Fh37t3rxgAK5QOlzv7snYA\nAAAASUVORK5CYII=\n",
"text/latex": [
"$$2$$"
],
"text/plain": [
"2"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(dv)"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def where_am_i():\n",
" import os\n",
" import socket\n",
" \n",
" return \"In process with pid {0} on host: '{1}'\".format(\n",
" os.getpid(), socket.gethostname())"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[\"In process with pid 26980 on host: 'Christy.local'\",\n",
" \"In process with pid 26981 on host: 'Christy.local'\"]"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"where_am_i_direct_results = dv.apply(where_am_i)\n",
"where_am_i_direct_results.get()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's now consider a useful function that we might want to run in parallel. Here is a version of the approximate Bayesian computing (ABC) algorithm."
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy\n",
"\n",
"def abc(y, N, epsilon=[0.2, 0.8]):\n",
" \n",
" trace = []\n",
"\n",
" while len(trace) < N:\n",
"\n",
" # Simulate from priors\n",
" mu = numpy.random.normal(0, 10)\n",
" sigma = numpy.random.uniform(0, 20)\n",
"\n",
" x = numpy.random.normal(mu, sigma, 50)\n",
"\n",
" #if (np.linalg.norm(y - x) < epsilon):\n",
" if ((abs(x.mean() - y.mean()) < epsilon[0]) &\n",
" (abs(x.std() - y.std()) < epsilon[1])):\n",
" trace.append([mu, sigma])\n",
"\n",
" return trace"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"y = numpy.random.normal(4, 2, 50)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's try running this on one of the cluster engines:"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "RemoteError",
"evalue": "NameError(name 'numpy' is not defined)",
"output_type": "error",
"traceback": [
"\u001b[0;31m\u001b[0m\u001b[0;31mNameError\u001b[0mTraceback (most recent call last)\u001b[0;32m<string>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m",
"\u001b[0;32m<ipython-input-41-02c6cbe59268>\u001b[0m in \u001b[0;36mabc\u001b[0;34m(y, N, epsilon)\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name 'numpy' is not defined"
]
}
],
"source": [
"dv0 = client[0]\n",
"dv0.block = True\n",
"dv0.apply(abc, y, 10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This fails with a NameError because NumPy has not been imported on the engine to which we sent the task. Each engine has its own namespace, so we need to import whatever modules we will need prior to running our code:"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<AsyncResult: finished>"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dv0.execute(\"import numpy\")"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAEFQAAAAUBAMAAABP68NVAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdt3NMolEIrtUmWbv\nEKuZuDQ+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4Ad2db4ynV1n+z3Z3dmd2d2aXIiES\nkU0LWE1sF4MGQygTE9400S7KNoQCHfSVRsJGQ0yQhA0xWo3AvtAY/5ROgkVspAwhxBeANGJKiVSG\nEl5IgA7in1hKWyj0D6WM9/W57vOc8332mTpJZ77J9smPZ57n3Ofc93Vd93XO9+vsdn/l8pcfuHK1\nXLLXx146Af3yl08MXiJDk4Qu6RY14Se5XaLNejZxoUOThC5l4x37ubVmvfp0KRMqky26RPdPbUiZ\nZnWJ9unZ5zn6FMaL/3dDWVgrR86+/oLGlm9787my/Jw3rJWy8NrXMauUr5z9Hz1dV8ov3X/27Jnl\n2z6+Wg6+8NDfZ+QrN8bEI7ffvBqrI8LqQ1ffdvZseceH/iBTtB9MjNfRgvL2s39cyss2rwNGxFUe\nNM5CGAwUAa9x3tByD0+MBd56AYQUX3zeB2Pw7PNWHaq8SwGxYZsbExAh+XvF+M4Ma3VoPRFDg3LW\nU6L6YpB8zJkJB17CU4SiRZCPu1NI8zqSfXHHyNv4WqgGoClM7Y6q8s1enotWFiwIhlBxQ0XC1lPr\nyOfuMghOplNkV81qFa25ymKvlscAGLTx0rnhqOHJGglUd1Xj4R+yeKS5O20RBJ3KDAJDZwvWODzV\np8549KDRIDnCWAmQEdbNFS6KzHa5I5PiWpwmNzUtYts/9rBTRYoZz8U70wEyRSiMV2thN/dbfRnr\nSG2HBTS7IbcYkAa5OpZ1qMwcFRZDqfxEKq8Cp/I5YjPIki5HuCVl17RXnhgTqoCoM6slNyHRcPI0\nXkzk2HMFuECV2pNclHu4Ur3Y3ORnL5AvjW0p44BwfrYXla2awr5o41SLxp6jBwk+ypKH5C5LBVAx\nh5uPASp0Fho48DDsH3068OJ8Hc6By+zKPC+Yjvt8UrUGT7HqTrzmLJ580Gizu2M0PVtC4ehumlOv\nI0900Oqa1CoiSIc2NNZZkIWI9nBaUtaxakSUypEdPJfdzc81SejVguMno6DfurGg0og2svuYw2Cn\no2LdVftE1qQR9nKzOi76PG+fstXIMQh/ulrLx8Ro0Q3+qvCOsvSkyn1148hny9FS/rcs/0L5QClL\n94TF/7W8Ux91V5Xy6e3t7a2DF5Z/qhzf3j6TkV8s954rXy8LjxYirD4WE3+0vFVuWlPW/mJiDIwW\nHFkvt26UL2x/P0J/sxlFVR40ZHEYDBQBL5VE4qKLscCrK7J1KdbLyoXypbWjp80tecccEHMzN1MX\nisrf6epdysQFTmtVLjtvxNAwYhhwIx+DzgfVLixuXjNFCANCyHPQHDnIS1+MQnk7vhA0AHRtCjNI\nGyul4acaEBdz0cqCiWDhhoqEeQID+dxdDRon0ymyq2YNFa0RZZNq1E6wQsEgN3dQ3Wi9rLUDbbuq\n8fAPuBip3Q1xG0tSOYsGO1uwxpWm+tSMRw86GiRHLSsx7CzmuMIoYpbucuOhp4EgEgxyU9Nt6/YP\nG9kqqrGd5/CwNDfOKUILa0MtgMAALmMd2eyEsUN2Q82iq7iPm1nOEjJyjdWtWJTKspCKVcapfI7Y\njbIkcxx2JXFbWJutojfGhCqPoJYcQgBxckumPGwvE0KtPNciyxQXH2AqEFyqemEv8uNh8rm7SElL\nnJ/tRWVUI4ye3t1TLRp5DuE665CH5C6rCkZFGW6gooIbwRox6K66f6DMi/M1nI0LiH2jG9iC6VA1\nl9bgKVb0iRPPkDTbT00td0wfT45kxSCY5owG9J7o2MRjrsnDZMBpbY7qM9D52T8wEEF7A/4+jwZg\njoB7tpA8l9315wXJvVr28hONQEJuLEga+uhl9zGHwU7HUbHaJ7JSibmo34R3Pt4JM5FB86erLs8p\nES3KrwovulC+q5IPlHJ/+etSfrcsrpeby9fveKqUlTvLynopB+4u5e/irXyylF8rB9/8/Iwcu7Ms\nnC7fLuXzjrD66LlStlY2y/E7lbW/mBgDowUHnignTpWf/8a5snz/Q3GgLao8aMjiMBgoD14q7fhV\nQXjDD8rWUixtlCOny5+UxfPmRh7mgJibuUEdFMm/JxHHjJSJixncSvmJ80YMDSOGATcWMOh8ourp\nhNHXa3baOCbEnGNojhzkpS9GobyNb4EgFaxrU5hB2jjLLBsQg0BEK24Q5GYVFfYTGMj3bdmAQXNh\nOkV206xW0RqpbFKVuAk2nhh0BIIAaL2stWeIAS1G8A+4GMnuStzGklTOosHOFqwh/P8Yjx40GiS3\nWigBYsLcXGEUMUG6PMMkvMJuKdahyU1Ni7g47B+eSGUH0CduYGC6cU4br9bCoWaAUGMdtdkdbt2w\nZQbPGYCdMMvIyHO7IgapLAtys8o4lc8R55c3mEPYRcCww7Gdq3wEteQQAgjJrT552F5uumpXsFF2\niosBJJdUT/YiPx4mn/MjJd1wfnFxRJW6k2pRDd2N5xDOKbAOeUhOWciDijmeCCoqdBaa7ZDVijEo\nf1v73PkazsYF1bghhm3BdKhSqWvwtPH8kROfMoOzDK6p5Y7p48kRKkKQCLU7T4wIeU1uoobTHYMl\nWRpYumHjwR/VoEEqR3bwXHa3kI3krAYxT8c40pGQGwsAkDqEhTyHwabjiNXQJ7JSibmoT3V3A2/w\nTpiJVDJ/ukoli9q+Kvz22vIjqhm3m8rrS7m3vC2MGkvjA/HE6bLwcCm//4pSzpTyuvLeUm7dXFGU\nyOJWWXqq/HMpD60SYfVCfH1fPX6qrHxP8/qLiTEwWnD4rnLf6bLFzBdtFpcHDVkcBgNFwEulHXeP\n8OqKbC3FwvmyfOrwYwTELXnHHBBzi29DuhRGhOTPYLspHBczrNWRj523ftAwYhhwIx+Dzrel1V1Y\n3Lxmp41jQsyx5shBXvpiFMrb+JqgAUiJTmEGTVVQ+ksT49qK/6FVCiaCRTdUJOwnMJCPrlpkGsp0\niuyqWUNFNKJsUlVZg9UTg464g7O9tI6Bvr+q8d4r+4KLkeyu1H+M6cpPUrIw2NmCNa451SeNuU/0\noNFwHrnP2wvJCHNzBWskLgz2Xe6ZRFcsrnVoclPTLcYMtISnTKXGMsgNDEyn3OROWlirtSDmWgg1\n0pHanR2skcQ0INzHzSxnCRm5xgKit6K0siykYpVxbsU0R2gjN+Y47EpScYdj26vyCGrJIWQaOr1S\nMuVhe5mQaidYcZviAoeYxs9UT54g/4rGyUd+e45uOP/gblRLSwqDd/cuPEcPOutsqSLJKQt5UDHH\nE0FFBXNjjdZ1V90/UObF+bZiDjg7LnaWYLuh+J7pzZLgdBunWKl33U5itsE1tVCUpmdLqCgJiVC7\n94TgtCvXeBM1nO4YLMmCLJSHoBHDH9UaMEd28Jy7m20kOasRiqdmB+vIAgCkDiGGm8Vg07ER8lPt\nE1mpxFzUb1yclHfCTGTQ/LeUzOURNVqUv1WIX8c/GbHlx0Oy1be9p9xY/lRzYXLf+XIgPvHPvEID\nh0+WHwXhCwAhcmKrHH6ivHozvioQYXXMfEs5+NTEVwUmRvjiBbdudIeKyhtNzRJhMFAEvK405TON\nGS8WaCkOP765sLF4Z4TNLXnH+RTXW/IGN6gjQvJXsLu8DyyTtVo4eN6Ik0a5dYP3X0ZU7574mNpw\nvq3I1YcTb7CcIiQDVkKRwpp7xECiL0ahvI1vvCw9mag4QhVGEw+aKmPdzXJAA61SsCAYZ2jcUJGw\nn8TN+ehqDgZOT6fIrpq1FSAohkY8JVWVJQ8AGMwIzrUIeNjgVXv2AloM2T/Kx0h2N8SlnBGnLYJB\nDsoblM8sqjTVp2Y8etBokMfCWAkhJpwAVGEU6bs8yyXeIMiMJrf7vqW5bf9gi0wV2vSeQzVNN4Yp\nQpx8KWZoRC1rMtKR2gmldQPLqAKe880sGRtu1bE5LcSorNiUITerjHPLyxQhPzfZIKUMlt7dOxzb\nXpVHUDtJIFSBvKWkZOYS28ue2IqfOUdlp7hUDvWn1NPeJT8m4hglP1LW/SlTKakrq5KVbkfRbjyH\ncAleZZUnLiXX6V3J5yHiiaDCKOa2pRWjK51vyvmifFsxD5w9F1SzdNGN2svDJ02VSnUw2riT8QQ/\n5WY24Dq1UJSmZ0uoKAltTp14vSeUrV25pja6wxkdo7FkaWCzG9qp8Ee1BiwyR2Qnz7kBPqRJzmpa\ny1OzQy0THUsa6BA3N0uDt/CZArRGyE9Ai0eyqlIVrH5EpPBKqgQOp5GtePDfUjKXR9Ro0fBV4d4z\nCn4mfquwtrL98Y3yyGtesOYNdzx+q/BoOXaOvi2W5R8E1JMrn3jBaiFy33o5/B2tveZrjmh1XOd1\nu4wvlnrqrms2/TK7YPklpXzro38boWiay4MmBpRFYWFw+fi9x5kCzkmfBbHEW/drTfHQkzeWEy9/\n7Qcjq50Mb1VMxOdDZHEjjAjmrwn95dXGaa3+MSxqxKYhxLx70Ati0PmY04WNV2t22DgDoZhjzT3i\nvIspWUo4SIZQBoCuTWEGTbXnpWfLQSq0SsFEsHCTiq7EE1plkRLd9aC4MJ0iu2qW0FEMjXhKe6ms\nweqJwYzICRf1ktqiMnPJeOkfaIRnN90NSdmzJKk8l4Nyc9VKWVRzqk+98aIHjYbzIIyVUNsIGwDu\nG0X6Ls/wiBcT9IxObvWdFmNJWsJTaqXGMuhmYR1NN4YpQjr5UkzsplpwGesYmKK2odiS0giZm+dw\nllmOCeHYGBy2olP5GIlUrDJO5yNCfvcy5qSUpBCGnY7tbH5Uy14qeT1YDCQ9Vp0V28tNz9o6TpRl\nmkvuH3ORepLO+dNEkY+W2Ba5dapgbpYqpfvExWfMVItGnqMHTkHHErGSF9Ew+UDFHE8ElSvQxlwj\n0v0ltQbKelG+AWfPBQfYBhIjexnTmyXr4PnpnRS9Az71B2epOYNaVrTuH7WEikGw9jJq954gV3/T\nmjxMaZZxqmPNEZZFkeyGLRnWcS+TG6nO7+w5nyhuI67xaiHmiUZQoZa590zSQAfdmOPBTseekJ/d\nJ32KUSkFC/UbF4vLO2Eb2YqLv7qa5RE1TFa/Krz9Z2SD+NOH8uqNctMjm8uPbJTPWfv404eDT5Yv\nFr4q3FiOxN88vP7M4uaRRwuRd50ph/SXEQ9/3xGtjteFDeV72xndZ6/Dmh3X7IIjv/rhUt5T3rXG\naeHyRkMWwsKQRcBLpR12T+KtZ08AIcXC9qvKfa8sxy+kr8ybvQ1i3eAm2xmF+QO5uyGgZ3ja8sk4\nOowYGpTj3YMs0KDzMacLg5c1U4Ri41RCmmPNPWIgNybYlFDCk6yIoAGwGQaFPWiqHS0e86jTXLSy\nYBDkVqSiK/HEFs0i6i6DlGe6i+ymWUNFNKKsqbY8PDGYxqODiNB6aepjWhjP/jGNsGB2Q1J2LFEN\nAT2Im1MrZaHSVJ9irPZJtm00nMdqoYQQE7YdvF9mI32XR1ySoGc0udkqErHtn0+xkVMrNbbzHKpp\nujFMEQrjVTEhplpwGesYAMNzJjh0wzKrQu5DnAXLESFWa2zYik7FpkRurTJO51OE/C6iOSklKdA3\nyo6vIJTNj8jQy0ieB4uBRPKUDC7xW9ZsumuLqrNMcgFArNBP1JN0zp8minzkty28dcSApK6sSum+\nwOCG7vT1tPccPXAKho0YCUXDsIWKOZ4oVFlhsNBYOKsVo6bMZpIsA86eC6pZOongXqq8qNqSOag2\n7mC8i1hFtRB+UMuKZtMV4RwSwdrLqN174iJKWlMbPeC036sj3uQPwsH39ZMt+LuXyU2pxCX8ddGl\nMTcgRZaEXi2NeKIRSJhNjwVJAx10Y44HOx0vKkdrMr8qWbBQP6uDWPn87jBdpRL81dUsTxujRfWr\nQlm4SyUPnly66cLSf19z1/L2ZvmHTX9Ne1n58yfKmUgdRnu4HPmBvirE87vjP8SJyLvW/VXhsi1H\ntDqi98X/Srma++ztsi2/jxaUN67F+OIpdpjLgyYGyRJhYajlA68rTfksxow3FssCLcX7f/2Ha/c9\nVY7ek18VzJs5IDZscQuFUgT4K0l/eR8w42totVDiq0JFLBoixLsHvUCDmS/mdOHEG+EpQmG2gVCk\nsOYeIW/0JcFawkGy8O5dFZWVSIXroKiOL0+M0cVTaGXBIMitSEXC+SQMSV3dzXBw8XR5ZXfNqhXR\niLKm2vLwxGA1npxrcfGwwUftiy6MZ/9kPo0M7u5Yolqsf2P1yn1OJq3IokpTfeqNpx4oeSchwlgJ\nEFPbdlCFUaTvsut3dwh6RpM7fb54qu2fWzBnaiVtOs9ZNe05MEwRCuNh5LhjN9WC0EU6UttQhm7U\ntlXPsRnNsqPixzwqaJ/EcCoLH3J7lbXilFCE/FlELXGYFMIA+FGhGKuoWi+VvB4sbJ1InpLBJbaX\nqkWFtr3IMs0FADHVP984e3Bpwykf+e253DqRn6RZedgL3VE01aKx5yScU+SRIfUBr7KVfB4itVZ5\n93B+0AjWxLL+wvnZiKIXy1Jx9lxQzTaQCO6lpouqLdk1eIpV9KmdeAHJKdScQa3sWHpCsGl6nMO1\nl6rdeaInwzNUU4KGU2f04Ig3bfNBqPImmJ9sFiN62YAR2cFz6R6LXF0Tq61ReAIUVMgy0bGkgQ66\nMceDnY4XsTK0GM5T14KF+tliECtfOyX4zM8tnvt98VSWB2K0aPiqUD4fspby0R+7afWfyoEfbsZ/\nEPHpNTM59pzXfG9pla8KB07XX0uU8pFzRZH71sth/QHE7RlhdSnPVbaj67qPrtvzfbSgHI+P73I0\n/sqUmubyQlOzHL8HDPV3S4HXlaZ8dkNJvJFR2RLI8XuObZUX3XPiVDn26NAl8WYOiLnBTQoZhVhG\njtkre8wMbn+mrwroFxNFA0Iw4JYLgmXm05whXPFGeIrQwlqdQF40zxHyRl8SrGtbeBRVY60jLAeF\nK9Ro4/jyxBg9+hhaWTAIckNFwvkEBheJ7tZwlLco0nN3zaoV0YiytlfLwxOD1XgimOIOvbSZRrww\nnv2T+TQyuLtjGcNKFVk8aDdji/C5rghP9ak3nnqg5KTgZmGsBIhxgu0g440ifZdVc+ait8zo5E6f\nh7Pa/uEptaKxg+eqajEdDFOEOPmohd2oBZeLdFTthDJ0o7ZNVqe2bmY5QyZe6lHBtBAjU+V+rJvd\nWuFhRchfi0RLHCaFMOxwbNcFOrN0Obn/+DSBRPKUDC7aXkyMm7gILFmmuQAgpvrn+OCKDad85E97\neesEEJJm5WEv0Cc3dKpFI88hHCnqkSHEOFZlK/nj9zCn1ood6grNQlo0c1mtpKyXlGXmlPCxYtWi\nBYhQbSEVRZVKXYOnWPUnXnMWLqlqZcfcdCIqK4L1Q0IN6DwhOP3FmtromJuQdHiIpfM3sNksW9Ji\nfORcriGVIjt4LiKcKGSrrpET0CjUpxFUyDKxwABoIzfmJLdBx56Qnw0tnuupi2BqVuNib/BOS4BU\nDcN+P/pYVgJitCi/KvxeKe+74EIPbX42fm1w4cr4qrBRmaw89eXCV4XLzvOXHW698M34XdJaLFh5\n6sRWWXoibLOeEVbnfwz+gpgxvjRR1+yCI+fK4hMrp8vCo95hLh9/yhXNjiyEjSH+rsWtF8DrSlM+\nu6Ek3qjDfq0pjp8rh5647HQ59qS/KiRv5lwlVLqZmxSqKFbcUE2oV/aYGbp96gxfFYQYGiDWZDHQ\nTQvq4MpTSXUIg9fhKUILa5UQc9A8RwCivgAl81a+pTZWKIJlhuGr2t/MNgpouxxmLlpxWxZBbuW4\nVCTMk6WM5WK5Hh+wCoNzGVEosptmkTK7E87iCaotz1vJyCC3JCgRWi+rzI2RntJ48s8tblaOpLsb\nS6ciS6K5KtZbK61xpak+9caz+ZMGeY5LmGIl0j84SzdVGEUgWPse4XZVgswga45EzRU2EWaIBQ9t\n8sTE3AuD57Ckp2sjT373iX9XQTszMgGEWtbkIh2jNuG2syxzVsBUupllI+Mnq5UQQ4xMFU+Wu64a\ntk5Elpslq88lJZWk7/SxzSqKDr0kOQcLpw3dSMmG7UWF5BJgnaWimmXj/QMQ1HMPyW8TabuSP+2l\nlii/BSNCpQwLgxu6C88dl8lIQVkjtjxR1rBBxRxutnZaZrDQLKdh/5gyW0c0Gs6Oiz83bPEQA0jx\nO5yYHldaMgevipEpVu3EoyU5O11itS5kx+RdfUhgvGW2dkbciMETmtJfzmYJ5BqK2O/NEchCJAkK\nMYcJveyBKbKwpvDsFWPVn2QjOasRiidQUMFlWAAN2sjNSCvr1HG2VLzlqUbW6s84maU+1UFsS/Ie\nS/Izn0H4r3CIuBJtjBblV4XtzeGrwrXLD4cBNh5ov1WI3/lsvf/BB3/4jfgqvFX0n/d+evMz8Z1F\nn4EHtxbPl2PRqr+Kz0FFvsbqshxlytK6JBpdmqih2QUnnooD6fjpcjRSqcEuX8q1zkLYGCgvvLe4\n0pTPbiiJN+oom4CQQr+1/NbKncNvFZK35oCYm7lJoYri4Fasm728DzxD037zwQcf+reTMefaAg3K\naUkw4KYFdfDgVlIdwuB1eIrQwlolxJxFaZ4jAFFfAOu8S5VvSYKgCJadwqCqbRTGdkmOOKzVDbTi\ntiSCPw5LVCTME1tUK4KqusogOFlzUkXSFlPcWrNaxUh2cIuyUG15/h0ADHJLghIhqQb4KrMwtSuN\nd3M0y1kAG/F0d2N5klRkYdDesFbK4kpPz6WaP2mQB2G8vXyYqjYAqDCOQLD2vfGIp0qQGU1uarrF\nDwTLtZh5rW1hrfwhOngODJ4OkClCC2u1FkCoZU1uHum4FJ4jbDtIo7+kWVkh+sJmTJbx0l9azbum\naRc6FftRqXKzC6fzKdJZUnMuRALpSSU5YvrYtplUrPbSyUVo021T8pRs2F5UcG2BJcsLH9ZRqVQz\nFwBiJH6inntIfptI25X8ljKmXot9LRgRKmVYGB6goVMtavsH8AhHCsoaMeB1eps8qJjDTX9T8COb\nrrAU3LxmhlK8eP9k+3gRjYaz4zL6qpC20PS40pJdg6dYtROvseLJKSCEovEeTRdsjGeCGXEjBk9o\naXd5TVn0B1jMBRLamCVZHpDwREwQSyIGqpkGqYhMe64eTrTxrbjGTlBreQIFFVymEaSN3IwUVEEj\ndewI+dF9Imueuux4qd+42JK8K5X5Mgh/O8CV2AHRovyqcHf8ZeBzseaT5w49pq/9i+eujz+i8aY/\n9tlyvWIxp1y/zj8l8oESP68sRI7dWeLfPjy0Xg6c+2SJf9yQ1eXQD2L2daU8P37MXEyMkdGC4+fL\nZY8djW+ep73VKQ8ashCOVYGBIvHzmnOuNOUzxmKOLtlFQEgR36jKHx2Kv6twp7mRx3NAzG2dr19S\nCBSVv5K1CwFzhrUqUQHE0KCc301DCxgkn6kScVjcvGaKEAa8W9WdAs3dEoBcv55QnPe6yleCXXMu\nK4QSDqMJg7HsSmWdvSRZ/JZV3UCrFEy1AYCKhHmylOSjqwyC09PXVWQ3zWoV0YiythdlycMTg45A\nkKPJT+JWa0f5dlXj4R+yMFK7e3fpWJKKLB5stmCNK031qTPeddGDRoM8VstKqG2EDYAK40jX5cZD\nT5UgEnRyqyYi2rm0xB52KjWWQW6oxnRjmCK0sFZrRdlwaNs/Ix29xxSe2Vmx2oDwHDeznCXUjgpB\nlBjWClmQm1XgdD4iKMGNOabhStJ3h2M7V/kIaslN6LqQEABpvGF7MdG1mUOWSS4GEAQ7K8Zq8q+z\n4a6PH+S3vegG+UlKhEppSWHwGTPVopHnEC7BR8eM2MlVlgrHddoyxxNj/MqscN1gIc3trrp/oOwX\n5SM/ODsuo68K7mXR9GbJrsFTrNqJ1zlL4JwCQijqphNxWe2ONGc0oPdEx0aPXuNGuFmyL9r4uCIL\nwgPWBDEe/IPOlelTUhHZwXPgjZpkQ0JWg5gnGtHp2AjGqnjRzc0CVdNRof6qfVofTl1v9utjoHGJ\nFZGUd8LVyPkhdJRPYqvIDogW5VeFT5Sl7+jfQHru5pc2ym/EH26XlTPLn/OmP/Cq5VcKy+Pxv1vX\nI8eF5X8p71APHPnp8tXV8jtn3/AfjrC6LMVuP/KSs3ec8j/tpPW+mBiVRguObZRbTx5ZDx/4g5vy\noCEL4UgQGCgPXleSz8ZF8N7jHg67tBSHX1WOnSz/Vb56wdzI44pCDGxzo4mggOW4AuGgwQxrVU6c\nt37QMGIYcGMBg+Qz1S4sbl4D+EjdXxgQQp6D5m4JnVRfQEHexrdA0AB0cnUKM0gbL+IWE2PMc9HK\ngolg/F+05wsqEraecCMfXWXQOJlOkd00q1W0syibVKMsechYGOTmDkqE1ktqj1lV4+EfsjDiSkjZ\nWJLKDBjEG5RnjSs9vfHoQUdDeayWlRBiwp5DhVHELIE2ssNAUBI0ualpETEDLbE5rWI01ha1I4SB\n6cYwbbyhloCYAZqMdKS2w9ghuxFtMyB/fgoALEeEWE3HNENiOBWykIpV4HQ+IjaDLMkc03AlcWPX\njCoxFgtiuPWS5BACiI8BS6Y8HHtUoLbnUHuKC8dJ5WIT0UPy28Paru4uUtKNJhgRsySMnm7jLjxn\n4Qw+OuY8Tk5ZqWVUzOEGKp8fOrNZs9P+gTLSIUuHs3EBsW/qRtpC5ZsluwZPGy8k4sRrzrLwTS0U\ntScE20c6fUlzRu3OEyMnkE0srVXFaW2aI5DFYCGI8eCPakQMjMgOnqMBAYBsJLcTZC8/gYIK3FiQ\nNEIHxDBSBpuOO/WJrFRiLs3quGBJ3gkzkSLwd1ddnh0QLcqvCodv/9Ca/lLrwu0fjC/198f/bxbl\nDXeslqMPPPKteLo9Xsvrt+PxnRfic/m1P7lajtx2f+xpIl9+zn/GfwGzvf1dR7z6SHzPOLi9vX2q\nXBHzuouJUWm84Ldu/8MQ7c0fLuWOL1y74fKgcRbCYKA8eF0Jn42KaEx4r3a2LsWv3BYEF24PxHAj\njysKcfFN3JJ6iGCWowqE9VdNJWMPTy8AAAOxSURBVJNvC+/70QaITQPEvHNzPgZRDaotbLyEIXTZ\nzwaadsmASYg5aM6I86ovRqG8HV8IGhW6NoUZdBtH3JgY0iXE0ArBigj6hoqEeQID+ehqYRCcTKfI\nrprVKqIRZU1VtQ0WFAxygyAAul5Se8SqGg//gMtgm7sbS6ciC4PNFqxx+OmN5x40GuRBGJRw2whz\no8I40ro8skMBWrSIGYPcromImMF9x6FMpLEMcjMGpoNhB+PVWtiNWnAZ6ejahLtu0CwqUJsbLEeE\nvDq3q3chqZAFue0fcJKPSLOkW0KYImDQrimjShoTqnoEteQQMhCSI5k10vZyBdX2HLJMcfFxUrmg\nHtKR3x5mu5IfKemG8zd3w5KwMdDG3XgO4UhOWfI4OWWpACrmcDMqVTA31uywf6DsrUO+hrNxAbFh\n0w0g8eHRWbI1eAfjAf/qhKTZBtfUsgXVdEdcUQQdoXbzxMgJXlM3UcOJNrDM/DrhAQtBvAF/q9aA\nEdnBczSgfl6QnNUgdp7eDnHkssAA0IEbcxjsdNyhT2SlkufSLEwEFyfVO2Emdh9CdJVKFjValF8V\nYkvt17V0br8yOy8+GxVhbG/LjirsbfKZbAb/FzNjGHBmZC9f5sxtVG4fmoU4ozJ7KRi55mQ84561\nw55zaYTKbKV9M95smf0hZPCzlfaD0GyF/eHirPP03H7vn6bTvE68efRpXp5r6s2lT9Gi/f+qsNBI\n7csTPhsVsff2tNyowp7mnk1m8GdmBvfjgGsF5sxtVG4fmgW1UZlGd4+e5mQ8o521wx4xGKWZq/Hm\nQci7ZrbSfuyk2QojVff0dZ6e2+/904SZl/Hm0ad5ea6pN5c+RYv2/6vCFxupfXnCZ6Mi9t6elhtV\n2NPcs8kAv3xyZnA/DrhWYM7cRuX2oVlQG5VpdPfoaU7GA+3IDnvEYJRmnsabCyF2zajSPuykUYWR\nqnv6Ok/P7ff+acLMyXhz6dOcPNfEi38edg5XtGj/vyps7DMRfDYqwtje1h1V2NvkM9kAf2xmaPLv\ncs/OeCZvc+Y2KrcPzUKMUZlnItDk2jkZj9ojO0ziecaD8zTeXAhxbI8q7cNXhVGFZ9yHp0kwT8/t\n9/5pNOdkvLn0aU6ea+KVufQpWnRDufzFB65Y7SpfYo+Xv3QC8OUvnhi8RIYmCR24YvUSgf+0MCe5\nXaLNejZxoWmThA5csUrwUrwduGLtYtgHrli9ePBSGZls0SW6f5rmk6wOXLHaZlw6T88+z6F9tOjy\nl/4fIenQJ1x9WBEAAAAASUVORK5CYII=\n",
"text/latex": [
"$$\\left [ \\left [ 3.9861947059020872, \\quad 2.20835169234038\\right ], \\quad \\left [ 4.12386131775169, \\quad 1.6649539913959943\\right ], \\quad \\left [ 4.3041765233915195, \\quad 1.5664485819283458\\right ], \\quad \\left [ 4.569604540031313, \\quad 2.04294643367523\\right ], \\quad \\left [ 4.296688199781904, \\quad 3.083256960199159\\right ], \\quad \\left [ 3.486042281345118, \\quad 2.178738957443911\\right ], \\quad \\left [ 4.23802701735248, \\quad 1.1340570693405616\\right ], \\quad \\left [ 4.280453743005625, \\quad 2.8275669111879687\\right ], \\quad \\left [ 4.28293092140191, \\quad 2.018380686725827\\right ], \\quad \\left [ 3.6851506630440096, \\quad 2.589768469843501\\right ]\\right ]$$"
],
"text/plain": [
"[[3.9861947059020872, 2.20835169234038], [4.12386131775169, 1.6649539913959943\n",
"], [4.3041765233915195, 1.5664485819283458], [4.569604540031313, 2.04294643367\n",
"523], [4.296688199781904, 3.083256960199159], [3.486042281345118, 2.1787389574\n",
"43911], [4.23802701735248, 1.1340570693405616], [4.280453743005625, 2.82756691\n",
"11879687], [4.28293092140191, 2.018380686725827], [3.6851506630440096, 2.58976\n",
"8469843501]]"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dv0.apply(abc, y, 10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"An easier approach is to use the parallel cell magic to import everywhere:"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%%px\n",
"import numpy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This magic can be used to execute the same code on all nodes."
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[stdout:0] 26980\n",
"[stdout:1] 26981\n"
]
}
],
"source": [
"%%px \n",
"import os\n",
"print(os.getpid())"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[output:0]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\nxIN6uC/rAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x104d26e80>"
]
},
"metadata": {
"engine": 0
},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[output:1]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x105aa9ac8>"
]
},
"metadata": {
"engine": 1
},
"output_type": "display_data"
}
],
"source": [
"%%px \n",
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"import os\n",
"tsamples = numpy.random.randn(100)\n",
"plt.hist(tsamples)\n",
"_ = plt.title('PID %i' % os.getpid())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## JupyterHub\n",
"\n",
"[JupyterHub](https://github.com/jupyterhub/jupyterhub) is a server that gives multiple users access to Jupyter notebooks, running an independent Jupyter notebook server for each user.\n",
"\n",
"To use JupyterHub, you need a Unix server (typically Linux) running somewhere that is accessible to your team on the network. The JupyterHub server can be on an internal network at your organisation, or it can run on the public internet (in which case, take care with security). Users access JupyterHub in a web browser, by going to the IP address or domain name of the server.\n",
"\n",
"Three actors:\n",
"\n",
"- multi-user Hub (tornado process)\n",
"- configurable http proxy (node-http-proxy)\n",
"- multiple single-user IPython notebook servers (Python/IPython/tornado)\n",
"\n",
"Basic principles:\n",
"\n",
"- Hub spawns proxy\n",
"- Proxy forwards requests to hub by default\n",
"- Hub handles login, and spawns single-user servers on demand\n",
"- Hub configures proxy to forward url prefixes to single-user servers\n",
"\n",
"To start the server, run the command:\n",
"\n",
" jupyterhub\n",
"\n",
"and then visit http://localhost:8000, and sign in with your unix credentials.\n",
"\n",
"To allow multiple users to sign into the server, you will need to run the jupyterhub command as a privileged user, such as root. The wiki describes how to run the server as a less privileged user, which requires more configuration of the system.\n",
"\n",
"![jupyterhub animation](https://657cea1304d5d92ee105-33ee89321dddef28209b83f19f06774f.ssl.cf1.rackcdn.com/jupyterhub-00f39fede1ec8780cdc3163052f632fb6980b72d43a72b3c3650257a6b9ed02d.gif)\n",
"\n",
"*(animation courtesy of Jessica Hamrick)*"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Links and References"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* [IPython Notebook Viewer](http://nbviewer.ipython.org) Displays static HTML versions of notebooks, and includes a gallery of notebook examples.\n",
"\n",
"* [A Reference-Free Algorithm for Computational Normalization of Shotgun Sequencing Data](http://ged.msu.edu/papers/2012-diginorm/) A landmark example of reproducible research in genomics: Git repo, iPython notebook, data and scripts.\n",
"\n",
"* Jacques Ravel and K Eric Wommack. 2014. [All Hail Reproducibility in Microbiome Research](http://www.microbiomejournal.com/content/pdf/2049-2618-2-8.pdf). Microbiome, 2:8.\n",
"\n",
"* Benjamin Ragan-Kelley et al.. 2013. [Collaborative cloud-enabled tools allow rapid, reproducible biological insights](http://www.nature.com/ismej/journal/v7/n3/full/ismej2012123a.html). The ISME Journal, 7, 461–464; doi:10.1038/ismej.2012.123;"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.1"
},
"widgets": {
"state": {},
"version": "1.0.0"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment