├── quanto ├── secret_quantopian_stuff │ ├── secret_plans.py │ └── kittens │ │ └── super_secret_kitten.jpg ├── Quantopian_Meetup_Talk_Outline.ipynb ├── Quantopian_Meetup_Talk_Notes.ipynb ├── Quantopian_Meetup_IPython_Shell.ipynb ├── examples │ └── Groupby Example.ipynb └── Quantopian_Meetup_Talk_IPython_Notebook.ipynb ├── .gitignore ├── README.md ├── LICENSE └── tutorials └── TwoSampleOLS.ipynb /quanto/secret_quantopian_stuff/secret_plans.py: -------------------------------------------------------------------------------- 1 | print \ 2 | """ 3 | Step 1: Make awesome tools for Quants. 4 | Step 2: ???????? 5 | Step 3: Profit! 6 | """ 7 | -------------------------------------------------------------------------------- /quanto/secret_quantopian_stuff/kittens/super_secret_kitten.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ssanderson/notebooks/HEAD/quanto/secret_quantopian_stuff/kittens/super_secret_kitten.jpg -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.py[co] 2 | *~ 3 | 4 | # Packages 5 | *.egg 6 | *.egg-info 7 | dist 8 | build 9 | eggs 10 | parts 11 | bin 12 | var 13 | sdist 14 | develop-eggs 15 | .installed.cfg 16 | .noseids 17 | 18 | # Installer logs 19 | pip-log.txt 20 | 21 | # Unit test / coverage reports 22 | .coverage 23 | .tox 24 | test.log 25 | 26 | # vim 27 | *.swp 28 | *.swo 29 | 30 | # Developer project-specific git configurations 31 | .gitconfig 32 | 33 | # Mac OSX folder properties 34 | .DS_Store 35 | 36 | # Sublime Text 2 37 | *.sublime-* 38 | 39 | # generated xml files when using jenkins nose config 40 | coverage.xml 41 | nosetests.xml 42 | 43 | # Generated from algoproxy algo code 44 | test_algorithm_sycheck.py 45 | 46 | # PyCharm custom settings 47 | .idea 48 | 49 | # Cache files 50 | .*-*.cache 51 | 52 | # etags 53 | *TAGS -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | notebooks 2 | ========= 3 | IPython Notebooks by Scott Sanderson 4 | 5 | Running IPython Notebook 6 | ------------------------ 7 | Assuming you have the below dependencies installed, you can run a local 8 | notebook server by running: 9 | ``` 10 | ipython notebook --matplotlib=inline --notebook-dir=path/to/directory/containing/notebooks 11 | ``` 12 | If you're already in the directory containing your notebook, you can omit the `--notebook-dir` flag. 13 | 14 | 15 | Once your server is running, you can open, run, and edit your notebooks by going to your browser and 16 | entering `127.0.0.1:8888` as the URL. `127.0.0.1` tells your browser to connect to your computer rather 17 | than to a remote server, and `:8888` tells it to connect to port 8888, which is the default port on which 18 | `ipython notebook` runs. You can change the port for the server by passing `--port=`. 19 | 20 | Creating an Isolated Python Environment 21 | --------------------------------------- 22 | I highly recommend using [`virtualenv`](https://pypi.python.org/pypi/virtualenv) 23 | for maintaining isolated python installs for particular projects. I also use 24 | the excellent [`virtualenvwrapper`](http://virtualenvwrapper.readthedocs.org/en/latest/) 25 | library, which provides a nicer interface for displaying and switching between 26 | virtualenvs. You can get both of these modules by running: 27 | ``` 28 | pip install virtualenv virtualenvwrapper 29 | ``` 30 | Assuming you have both `virtualenv` and `virtualenvwrapper` installed, you can 31 | create an isolated environment for these notebooks by running 32 | ``` 33 | mkvirtualenv 34 | ``` 35 | (where you can replace `` with the name you actually want to use). 36 | 37 | You can then switch between environments using the `workon` command 38 | ##### Example 39 | ``` 40 | workon notebook_env 41 | \# Do notebook stuff. 42 | ... 43 | workon some_other_project_env 44 | \# Do other project stuff. 45 | ``` 46 | 47 | Installing Dependencies 48 | ----------------------- 49 | 50 | 1. If you haven't already done so, create a virtual environment so we 51 | have a clean slate and don't interfere with any other projects. 52 | 2. Install `IPython` with all optional dependencies by running 53 | `pip install ipython[all]` 54 | 3. Install `zipline` by running `pip install zipline`. This will also install `zipline`'s 55 | dependencies, including 56 | - `numpy` 57 | - `scipy` 58 | - `pandas` 59 | 4. Install `matplotlib` by running `pip install matplotlib`. If this is your first time installing 60 | `matplotlib`, you may get errors complaining that you're missing certain C libraries. If you're on 61 | `OSX` I recommend [Homebrew](http://brew.sh/) for installing these dependencies. It provides an 62 | interface similar to package managers like `apt-get` or `yum` that you might use on a Linux 63 | distribution. 64 | -------------------------------------------------------------------------------- /quanto/Quantopian_Meetup_Talk_Outline.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": { 3 | "kernelspec": { 4 | "codemirror_mode": { 5 | "name": "ipython", 6 | "version": 2 7 | }, 8 | "display_name": "IPython (Python 2)", 9 | "language": "python", 10 | "name": "python2" 11 | }, 12 | "name": "", 13 | "signature": "sha256:7e2371ccb6aedc3ff6c939f51a6c7ba8650227d3d243a97864ce245a5c5497cd" 14 | }, 15 | "nbformat": 3, 16 | "nbformat_minor": 0, 17 | "worksheets": [ 18 | { 19 | "cells": [ 20 | { 21 | "cell_type": "markdown", 22 | "metadata": {}, 23 | "source": [ 24 | "#Zipline, Pandas, and IPython Notebook: A Pythonic Toolbox for Quants" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "\n", 34 | "\n", 35 | "##Why Python?\n", 36 | "- Clear, concise, readable syntax.\n", 37 | "- Interactive shell is great for exploring data.\n", 38 | "- Strong support for stream-based programming allows for natural\n", 39 | "expression of out-of-memory computation.\n", 40 | "- Easy to interface with C/Fortran, directly or via `Cython`\n", 41 | "- Large, dedicated community for **scientific**, **numerical** and **high\n", 42 | " performance** computing.\n", 43 | " - `numpy`\n", 44 | " - `scipy`\n", 45 | " - `pandas`\n", 46 | " - `ipython`" 47 | ] 48 | }, 49 | { 50 | "cell_type": "markdown", 51 | "metadata": {}, 52 | "source": [ 53 | "##The Toolbox" 54 | ] 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "metadata": {}, 59 | "source": [ 60 | "1. ###IPython and IPython Notebook\n", 61 | " - **Takeaways**: \n", 62 | " - IPython is a **Better Python Shell**\u2122 \n", 63 | " - IPython Notebook allows you to create **saveable** and **shareable** interactive sessions.\n", 64 | "2. ###Pandas\n", 65 | " - **Takeaways**:\n", 66 | " - Pandas provides powerful **data structures** for tabular and time series data.\n", 67 | " - If you understand `Series`, you understand `DataFrame` and `Panel`.\n", 68 | "3. ###Zipline\n", 69 | " - **Takeaways**:\n", 70 | " - Zipline is the **open source** backtesting engine that powers Quantopian.\n", 71 | " - Anything you want to do on Quantopian that doesn't require our data, you can do with Zipline." 72 | ] 73 | }, 74 | { 75 | "cell_type": "markdown", 76 | "metadata": {}, 77 | "source": [ 78 | "###Research on Quantopian\n", 79 | " - **Takeaways**:\n", 80 | " - Quantopian is bringing together the full toolbox, in one place, with access to our curated data sets and APIs for analyzing your Quantopian algorithms." 81 | ] 82 | } 83 | ], 84 | "metadata": {} 85 | } 86 | ] 87 | } -------------------------------------------------------------------------------- /quanto/Quantopian_Meetup_Talk_Notes.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": { 3 | "kernelspec": { 4 | "codemirror_mode": { 5 | "name": "ipython", 6 | "version": 2 7 | }, 8 | "display_name": "IPython (Python 2)", 9 | "language": "python", 10 | "name": "python2" 11 | }, 12 | "name": "", 13 | "signature": "sha256:727983a7ac9d8ef7f464dabb7501013df70050f5013a10e703ea633d67202502" 14 | }, 15 | "nbformat": 3, 16 | "nbformat_minor": 0, 17 | "worksheets": [ 18 | { 19 | "cells": [ 20 | { 21 | "cell_type": "markdown", 22 | "metadata": {}, 23 | "source": [ 24 | "1. Shell Notebook\n", 25 | "2. Notebook Notebook:\n", 26 | "\n", 27 | " - What we just saw is awesome as an interactive shell, but not the best for:\n", 28 | "\n", 29 | " 1. Saving/Reusing Work:\n", 30 | " - Don't want to have to keep a session open forever.\n", 31 | " - No good way to share a session.\n", 32 | " - `%edit` helps for writing larger chunks of code.\n", 33 | "\n", 34 | " 2. Minimal support for rich display.\n", 35 | "\n", 36 | " 3. Sometimes you want to include other content besides Python code\n", 37 | " (e.g. instructions, annotations, diagrams...).\n", 38 | "\n", 39 | " - Quit IPython, run `ipython notebook`.\n", 40 | "\n", 41 | " - This runs a **notebook server**, which I can connect to by pointing my\n", 42 | " browser (or another application that knows how to read the format) to\n", 43 | " localhost on the appropriate port (default is 8888).\n", 44 | "\n", 45 | "2. Pandas Notebook\n", 46 | "\n", 47 | "3. Zipline Notebook\n", 48 | "\n", 49 | "4. Research Env Sneak Peek:\n", 50 | "\n", 51 | " - We've seen that IPython Notebook acts as a nice middle ground between the\n", 52 | " static nature of a script/library and the dynamic (but impermanent) nature\n", 53 | " of a shell session.\n", 54 | "\n", 55 | " - We've also seen that IPython Notebook enables sharing computation, which\n", 56 | " includes not just Python code but also data visualizations, documentation,\n", 57 | " and other content.\n", 58 | "\n", 59 | " - And we've seen that we can use IPython Notebook with the state of the art\n", 60 | " tools (like `pandas` and `zipline`) to get even more out of these tools.\n", 61 | "\n", 62 | " - Said at the start that we're thinking now about how to make the research\n", 63 | " process on Quantopian better...\n", 64 | "\n", 65 | " - One of the most powerful features of notebook is the fact that it you\n", 66 | " don't actually need to be running the notebook server to connect to and\n", 67 | " edit a notebook.\n", 68 | "\n", 69 | " - We want to make it possible for people to run notebooks on our computing\n", 70 | " environment in a way that can still take advantage of all awesome data\n", 71 | " sources and APIs that are currently only available on Quantopian.\n", 72 | "\n", 73 | " - `get_pricing` notebook.\n", 74 | " - `get_backtests` notebook.\n", 75 | " - `local_csv` notebook.\n", 76 | "\n", 77 | " - This project is in a **very** early alpha, but we're very excited about\n", 78 | " the possibilities this opens up. We're already starting to use the idea\n", 79 | " of remote notebooks in our internal research and operations efforts." 80 | ] 81 | } 82 | ], 83 | "metadata": {} 84 | } 85 | ] 86 | } -------------------------------------------------------------------------------- /quanto/Quantopian_Meetup_IPython_Shell.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": { 3 | "kernelspec": { 4 | "codemirror_mode": { 5 | "name": "ipython", 6 | "version": 2 7 | }, 8 | "display_name": "IPython (Python 2)", 9 | "language": "python", 10 | "name": "python2" 11 | }, 12 | "name": "", 13 | "signature": "sha256:840944d494a6a11df876fb500302beb480ad90b1f3b7fa18245f0d31d161a730" 14 | }, 15 | "nbformat": 3, 16 | "nbformat_minor": 0, 17 | "worksheets": [ 18 | { 19 | "cells": [ 20 | { 21 | "cell_type": "markdown", 22 | "metadata": {}, 23 | "source": [ 24 | "# The IPython Shell\n", 25 | "*(Note: If you're looking at this notebook after the presentation, this portion of the talk was given at the interactive IPython console. The cells here were used as notes, and describe roughly what appeared on the screen.*" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": {}, 31 | "source": [ 32 | "###Learn Your Keybinds!\n", 33 | "\n", 34 | "These commands aren't IPython-specific, but learning them will make your\n", 35 | "command-line life much better. \n", 36 | "\n", 37 | "Commands listed in **bold** also work in `IPython Notebook`.\n", 38 | "\n", 39 | "- **`CTRL-f`** -> Move Cursor Forward One Character.\n", 40 | "- **`CTRL-b`** -> Move Cursor Backward One Character.\n", 41 | "- **`ALT-f`** -> Move Cursor Forward One Word.\n", 42 | "- **`ALT-b`** -> Move Cursor Backward One Word.\n", 43 | "- **`CTRL-a`** -> Move Cursor to Line Start.\n", 44 | "- **`CTRL-e`** -> Move Cursor to Line End.\n", 45 | "- **`CTRL-k`** -> Cut to End of Line.\n", 46 | "- `CTRL-y` -> Paste to End of Line.\n", 47 | "- `CTRL-r` -> Reverse Incremental Search (aka search history matching what you type).\n", 48 | "- `CTRL-p` -> Previous History Entry.\n", 49 | "- `CTRL-n` -> Next History Entry.\n", 50 | "- `CTRL-l` -> Clear Screen.\n", 51 | "- `CTRL-c` -> Interrupt Current Execution.\n", 52 | "- `CTRL-d` -> Shutdown." 53 | ] 54 | }, 55 | { 56 | "cell_type": "markdown", 57 | "metadata": {}, 58 | "source": [ 59 | "##IPython Magics: Shell Emulation\n", 60 | "IPython has various built-in **magic functions** that extend standard Python syntax. Many IPython magics provide aliases of common shell commands.\n", 61 | "\n", 62 | "```python\n", 63 | "In [1]: %ls\n", 64 | "Quantopian-Meetup-Talk-Notes.ipynb\n", 65 | "Quantopian_Meetup_Pandas.ipynb\n", 66 | "Quantopian_Meetup_Talk_IPython_Goodies.ipynb\n", 67 | "Quantopian_Meetup_Zipline.ipynb\n", 68 | "secret_quantopian_stuff/\n", 69 | "\n", 70 | "In [2]: %cd secret_quantopian_stuff/\n", 71 | "/Users/ssanderson/projects/notebooks/quanto/secret_quantopian_stuff\n", 72 | "In [3]: %ls\n", 73 | "kittens/ secret_plans.py\n", 74 | "\n", 75 | "In [4]: %cat secret_plans.py\n", 76 | "print \\\n", 77 | "\"\"\"\n", 78 | "Step 1: Make awesome tools for Quants.\n", 79 | "Step 2: ????????\n", 80 | "Step 3: Profit!\n", 81 | "\"\"\"\n", 82 | "In [5]: ! open kittens/super_secret_kitten.jpg\n", 83 | "```\n", 84 | "" 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "metadata": {}, 95 | "source": [ 96 | "###More Builtin Shell Command Aliases\n", 97 | " - `%cd` -> Change Directory.\n", 98 | " - `%ls` -> List Directory Content.\n", 99 | " - `%env` -> List Environment Variables.\n", 100 | " - `%cat` -> Print Contents of File.\n", 101 | " - `%mv` -> Move a File/Directory.\n", 102 | " - `%rm` -> Remove a File/Directory.\n", 103 | " - `%mkdir` -> Make a directory.\n", 104 | " - `%man` -> View a man page." 105 | ] 106 | }, 107 | { 108 | "cell_type": "markdown", 109 | "metadata": {}, 110 | "source": [ 111 | "###Defining Custom Shell Commands\n", 112 | " - `%alias ` -> Bind an alias to a command.\n", 113 | " - `! ` -> Run , printing its output.\n", 114 | " - `!! ` -> Run , capturing its output as a list." 115 | ] 116 | }, 117 | { 118 | "cell_type": "markdown", 119 | "metadata": {}, 120 | "source": [ 121 | "####Example: Use git from IPython\n", 122 | "```\n", 123 | "In [1]: alias git git\n", 124 | "\n", 125 | "In [2]: git status\n", 126 | "On branch master\n", 127 | "Your branch is up-to-date with 'origin/master'.\n", 128 | "\n", 129 | "nothing to commit, working directory clean\n", 130 | "```\n" 131 | ] 132 | }, 133 | { 134 | "cell_type": "markdown", 135 | "metadata": {}, 136 | "source": [ 137 | "####Example: Use Unix Pipes to Create a Complex Shell Command\n", 138 | "Suppose we want a list of the currently running `ipython` process ids. This requires a moderate amount of code to do correctly in Python, requiring us to use `psutil` and iterate over the output of `psutil.process_iter()`. Using the `!!` magic, however, we can write this using Unix pipes in two lines.\n", 139 | "```\n", 140 | "In [1]: ipython_pid_strings = !! ps | grep ipython | cut -d't' -f1\n", 141 | "\n", 142 | "In [2]: map(int, ipython_pid_strings)\n", 143 | "Out[2]: [23546, 34983, 35040, 35042, 35048, 37696, 37703, 37827, 38290, 38291, 38293]\n", 144 | "```\n", 145 | "\n", 146 | "The above pipeline says roughly:\n", 147 | "1. Run `ps` to print the list of currently running processes.\n", 148 | "2. Filter the output of `ps` with `grep` to get just the lines that have the word 'ipython' in them.\n", 149 | "3. Break each line into sub-sections with `cut`, using the letter `t` as a\n", 150 | " delimiter. Then select just the first subsection of each line. (The `-d`\n", 151 | " flag says to use a specific delimiter, and the `-f` flag says which \n", 152 | " subsections to keep.)\n", 153 | "4. Convert the resulting text output into a list of integers that we can use\n", 154 | " in our shell." 155 | ] 156 | }, 157 | { 158 | "cell_type": "markdown", 159 | "metadata": {}, 160 | "source": [ 161 | "###Editing Long Commands:\n", 162 | "```\n", 163 | "In [1]: edit\n", 164 | "IPython will make a temporary file named: /var/folders/bunch/of/gibberish.py\n", 165 | "```\n", 166 | "Edit file in your `$EDITOR` of choice and quit when done.\n", 167 | "```python\n", 168 | "class Foo(object):\n", 169 | " def bar(self, x):\n", 170 | " print x\n", 171 | " \n", 172 | "foo = Foo()\n", 173 | "foo.bar(3)\n", 174 | "```\n", 175 | "```\n", 176 | "done. Executing edited code...\n", 177 | "3\n", 178 | "Out[1]: 'class Foo(object):\\n\\n def bar(self, x):\\n print x\\n\\n\\nfoo = Foo()\\nfoo.bar(3)\\n'\n", 179 | "```" 180 | ] 181 | }, 182 | { 183 | "cell_type": "markdown", 184 | "metadata": {}, 185 | "source": [ 186 | "###Convenience Features: Autocomplete\n", 187 | "\n", 188 | "You can autocomplete any variable name currently in your namespace with `TAB`.\n", 189 | "```\n", 190 | "big_variable_name = 5\n", 191 | "big_ -> Autocomplete variable name.\n", 192 | "```\n", 193 | "Autocomplete also works on attributes of objects.\n", 194 | "```\n", 195 | "import pandas\n", 196 | "pandas. -> Show top-level pandas attributes.\n", 197 | "```" 198 | ] 199 | }, 200 | { 201 | "cell_type": "markdown", 202 | "metadata": {}, 203 | "source": [ 204 | "###Convenience Features: Documentation\n", 205 | "You can get information about any callable object by evaluating `?` or `??`.\n", 206 | "These are syntactic sugar for the `pinfo` and `pinfo2` magics, respectively.\n", 207 | "```\n", 208 | "import pandas\n", 209 | "pandas.DataFrame? -> Show docstring.\n", 210 | "pandas.DataFrame.plot?? -> Show source.\n", 211 | "```\n", 212 | "\n", 213 | "```\n", 214 | "import zipline; zipline. -> Autocomplete to zipline.data.loader.load_bars_from_yahoo\n", 215 | "load_bars_from_yahoo(stocks=['AAPL', 'TSLA'])\n", 216 | "```\n", 217 | "I wish someone would do a tutorial on how to use this cool-looking `Panel` class..." 218 | ] 219 | }, 220 | { 221 | "cell_type": "markdown", 222 | "metadata": {}, 223 | "source": [ 224 | "###Convenience Features: History\n", 225 | "You can view your command history with\n", 226 | "```\n", 227 | "history\n", 228 | "```\n", 229 | "You can output your history to a file with\n", 230 | "```\n", 231 | "history -f \n", 232 | "```\n", 233 | "As mentioned above, you can search through your recent command history with\n", 234 | "**CTRL-r** " 235 | ] 236 | }, 237 | { 238 | "cell_type": "markdown", 239 | "metadata": {}, 240 | "source": [ 241 | "###And More...\n", 242 | "```\n", 243 | "%quickref -> Show Output\n", 244 | "```" 245 | ] 246 | }, 247 | { 248 | "cell_type": "markdown", 249 | "metadata": {}, 250 | "source": [ 251 | "###Further Reading:\n", 252 | "1. [Configuration and Profiles](http://ipython.org/ipython-doc/dev/config/intro.html)\n", 253 | "2. [Output Caching](http://ipython.org/ipython-doc/dev/interactive/reference.html#output-caching-system)\n", 254 | "3. [Defining Custom Magics](http://ipython.org/ipython-doc/dev/config/custommagics.html#defining-magics)" 255 | ] 256 | } 257 | ], 258 | "metadata": {} 259 | } 260 | ] 261 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /quanto/examples/Groupby Example.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat_minor": 0, "cells": [{"execution_count": 37, "cell_type": "code", "source": "pricing = get_pricing(['AAPL', 'MSFT'], \n start_date='2014-01-01', \n end_date='2014-01-07', \n frequency='minute',\n fields='price')", "outputs": [], "metadata": {"collapsed": false, "trusted": true}}, {"source": "`pricing` is a `DataFrame` with the same structure as the return value of `history` on quantopian.", "cell_type": "markdown", "metadata": {}}, {"execution_count": 38, "cell_type": "code", "source": "pricing.head(10)", "outputs": [{"execution_count": 38, "output_type": "execute_result", "data": {"text/plain": " Security(24 [AAPL]) Security(5061 [MSFT])\n2014-01-02 14:31:00+00:00 79.446 37.340\n2014-01-02 14:32:00+00:00 79.424 37.375\n2014-01-02 14:33:00+00:00 79.490 37.260\n2014-01-02 14:34:00+00:00 79.502 37.260\n2014-01-02 14:35:00+00:00 79.252 37.280\n2014-01-02 14:36:00+00:00 79.184 37.283\n2014-01-02 14:37:00+00:00 79.260 37.270\n2014-01-02 14:38:00+00:00 79.300 37.300\n2014-01-02 14:39:00+00:00 79.259 37.300\n2014-01-02 14:40:00+00:00 79.222 37.280", "text/html": "
\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Security(24 [AAPL])Security(5061 [MSFT])
2014-01-02 14:31:00+00:00 79.446 37.340
2014-01-02 14:32:00+00:00 79.424 37.375
2014-01-02 14:33:00+00:00 79.490 37.260
2014-01-02 14:34:00+00:00 79.502 37.260
2014-01-02 14:35:00+00:00 79.252 37.280
2014-01-02 14:36:00+00:00 79.184 37.283
2014-01-02 14:37:00+00:00 79.260 37.270
2014-01-02 14:38:00+00:00 79.300 37.300
2014-01-02 14:39:00+00:00 79.259 37.300
2014-01-02 14:40:00+00:00 79.222 37.280
\n
"}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}, {"source": "Pandas' built-in `groupby` and `apply` operations are extremely powerful. For more information on these features, see http://pandas.pydata.org/pandas-docs/stable/groupby.html.", "cell_type": "markdown", "metadata": {}}, {"execution_count": 39, "cell_type": "code", "source": "from pandas.tseries.tools import normalize_date\n\ndef my_grouper(ts):\n \"Function to apply to the index of the DataFrame to break it into groups.\"\n # Returns midnight of the supplied date.\n return normalize_date(ts)\n\n\ndef first_thirty_minutes(frame):\n \"Function to apply to the resulting groups.\"\n return frame.iloc[:30]", "outputs": [], "metadata": {"collapsed": true, "trusted": true}}, {"source": "The result of a `groupby` computation is a [Hierarchichally-Indexed DataFrame](http://pandas.pydata.org/pandas-docs/stable/advanced.html) where the outermost layer of the index is the groupby key, and the secondary layers are the values from the frame's original index.", "cell_type": "markdown", "metadata": {}}, {"execution_count": 40, "cell_type": "code", "source": "data = pricing.groupby(my_grouper).apply(first_thirty_minutes)\ndata.head(40)", "outputs": [{"execution_count": 40, "output_type": "execute_result", "data": {"text/plain": " Security(24 [AAPL]) \\\n2014-01-02 00:00:00+00:00 2014-01-02 14:31:00+00:00 79.446 \n 2014-01-02 14:32:00+00:00 79.424 \n 2014-01-02 14:33:00+00:00 79.490 \n 2014-01-02 14:34:00+00:00 79.502 \n 2014-01-02 14:35:00+00:00 79.252 \n 2014-01-02 14:36:00+00:00 79.184 \n 2014-01-02 14:37:00+00:00 79.260 \n 2014-01-02 14:38:00+00:00 79.300 \n 2014-01-02 14:39:00+00:00 79.259 \n 2014-01-02 14:40:00+00:00 79.222 \n 2014-01-02 14:41:00+00:00 79.187 \n 2014-01-02 14:42:00+00:00 79.069 \n 2014-01-02 14:43:00+00:00 79.160 \n 2014-01-02 14:44:00+00:00 79.186 \n 2014-01-02 14:45:00+00:00 79.213 \n 2014-01-02 14:46:00+00:00 79.152 \n 2014-01-02 14:47:00+00:00 79.183 \n 2014-01-02 14:48:00+00:00 79.202 \n 2014-01-02 14:49:00+00:00 79.159 \n 2014-01-02 14:50:00+00:00 79.190 \n 2014-01-02 14:51:00+00:00 79.150 \n 2014-01-02 14:52:00+00:00 79.064 \n 2014-01-02 14:53:00+00:00 79.134 \n 2014-01-02 14:54:00+00:00 79.074 \n 2014-01-02 14:55:00+00:00 79.139 \n 2014-01-02 14:56:00+00:00 79.164 \n 2014-01-02 14:57:00+00:00 79.163 \n 2014-01-02 14:58:00+00:00 79.217 \n 2014-01-02 14:59:00+00:00 79.165 \n 2014-01-02 15:00:00+00:00 79.144 \n2014-01-03 00:00:00+00:00 2014-01-03 14:31:00+00:00 78.937 \n 2014-01-03 14:32:00+00:00 78.702 \n 2014-01-03 14:33:00+00:00 78.756 \n 2014-01-03 14:34:00+00:00 78.552 \n 2014-01-03 14:35:00+00:00 78.573 \n 2014-01-03 14:36:00+00:00 78.616 \n 2014-01-03 14:37:00+00:00 78.693 \n 2014-01-03 14:38:00+00:00 78.630 \n 2014-01-03 14:39:00+00:00 78.589 \n 2014-01-03 14:40:00+00:00 78.543 \n\n Security(5061 [MSFT]) \n2014-01-02 00:00:00+00:00 2014-01-02 14:31:00+00:00 37.3400 \n 2014-01-02 14:32:00+00:00 37.3750 \n 2014-01-02 14:33:00+00:00 37.2600 \n 2014-01-02 14:34:00+00:00 37.2600 \n 2014-01-02 14:35:00+00:00 37.2800 \n 2014-01-02 14:36:00+00:00 37.2830 \n 2014-01-02 14:37:00+00:00 37.2700 \n 2014-01-02 14:38:00+00:00 37.3000 \n 2014-01-02 14:39:00+00:00 37.3000 \n 2014-01-02 14:40:00+00:00 37.2800 \n 2014-01-02 14:41:00+00:00 37.2500 \n 2014-01-02 14:42:00+00:00 37.2500 \n 2014-01-02 14:43:00+00:00 37.2300 \n 2014-01-02 14:44:00+00:00 37.2325 \n 2014-01-02 14:45:00+00:00 37.1950 \n 2014-01-02 14:46:00+00:00 37.1601 \n 2014-01-02 14:47:00+00:00 37.1800 \n 2014-01-02 14:48:00+00:00 37.1900 \n 2014-01-02 14:49:00+00:00 37.1550 \n 2014-01-02 14:50:00+00:00 37.1700 \n 2014-01-02 14:51:00+00:00 37.1600 \n 2014-01-02 14:52:00+00:00 37.2150 \n 2014-01-02 14:53:00+00:00 37.2500 \n 2014-01-02 14:54:00+00:00 37.2400 \n 2014-01-02 14:55:00+00:00 37.2350 \n 2014-01-02 14:56:00+00:00 37.1800 \n 2014-01-02 14:57:00+00:00 37.1600 \n 2014-01-02 14:58:00+00:00 37.1800 \n 2014-01-02 14:59:00+00:00 37.2001 \n 2014-01-02 15:00:00+00:00 37.2501 \n2014-01-03 00:00:00+00:00 2014-01-03 14:31:00+00:00 37.1800 \n 2014-01-03 14:32:00+00:00 37.1700 \n 2014-01-03 14:33:00+00:00 37.1301 \n 2014-01-03 14:34:00+00:00 37.1450 \n 2014-01-03 14:35:00+00:00 37.1500 \n 2014-01-03 14:36:00+00:00 37.1400 \n 2014-01-03 14:37:00+00:00 37.1100 \n 2014-01-03 14:38:00+00:00 37.1250 \n 2014-01-03 14:39:00+00:00 37.0900 \n 2014-01-03 14:40:00+00:00 37.1040 ", "text/html": "
\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Security(24 [AAPL])Security(5061 [MSFT])
2014-01-02 00:00:00+00:002014-01-02 14:31:00+00:00 79.446 37.3400
2014-01-02 14:32:00+00:00 79.424 37.3750
2014-01-02 14:33:00+00:00 79.490 37.2600
2014-01-02 14:34:00+00:00 79.502 37.2600
2014-01-02 14:35:00+00:00 79.252 37.2800
2014-01-02 14:36:00+00:00 79.184 37.2830
2014-01-02 14:37:00+00:00 79.260 37.2700
2014-01-02 14:38:00+00:00 79.300 37.3000
2014-01-02 14:39:00+00:00 79.259 37.3000
2014-01-02 14:40:00+00:00 79.222 37.2800
2014-01-02 14:41:00+00:00 79.187 37.2500
2014-01-02 14:42:00+00:00 79.069 37.2500
2014-01-02 14:43:00+00:00 79.160 37.2300
2014-01-02 14:44:00+00:00 79.186 37.2325
2014-01-02 14:45:00+00:00 79.213 37.1950
2014-01-02 14:46:00+00:00 79.152 37.1601
2014-01-02 14:47:00+00:00 79.183 37.1800
2014-01-02 14:48:00+00:00 79.202 37.1900
2014-01-02 14:49:00+00:00 79.159 37.1550
2014-01-02 14:50:00+00:00 79.190 37.1700
2014-01-02 14:51:00+00:00 79.150 37.1600
2014-01-02 14:52:00+00:00 79.064 37.2150
2014-01-02 14:53:00+00:00 79.134 37.2500
2014-01-02 14:54:00+00:00 79.074 37.2400
2014-01-02 14:55:00+00:00 79.139 37.2350
2014-01-02 14:56:00+00:00 79.164 37.1800
2014-01-02 14:57:00+00:00 79.163 37.1600
2014-01-02 14:58:00+00:00 79.217 37.1800
2014-01-02 14:59:00+00:00 79.165 37.2001
2014-01-02 15:00:00+00:00 79.144 37.2501
2014-01-03 00:00:00+00:002014-01-03 14:31:00+00:00 78.937 37.1800
2014-01-03 14:32:00+00:00 78.702 37.1700
2014-01-03 14:33:00+00:00 78.756 37.1301
2014-01-03 14:34:00+00:00 78.552 37.1450
2014-01-03 14:35:00+00:00 78.573 37.1500
2014-01-03 14:36:00+00:00 78.616 37.1400
2014-01-03 14:37:00+00:00 78.693 37.1100
2014-01-03 14:38:00+00:00 78.630 37.1250
2014-01-03 14:39:00+00:00 78.589 37.0900
2014-01-03 14:40:00+00:00 78.543 37.1040
\n
"}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}, {"source": "Because our `DataFrame` is Hierarchically-Indexed, we can query it by our groupby keys.", "cell_type": "markdown", "metadata": {}}, {"execution_count": 41, "cell_type": "code", "source": "from pandas import Timestamp\n# This gives us the first thirty minutes of January 3rd.\ndata.loc[Timestamp('2014-01-03', tz='UTC')]", "outputs": [{"execution_count": 41, "output_type": "execute_result", "data": {"text/plain": " Security(24 [AAPL]) Security(5061 [MSFT])\n2014-01-03 14:31:00+00:00 78.937 37.1800\n2014-01-03 14:32:00+00:00 78.702 37.1700\n2014-01-03 14:33:00+00:00 78.756 37.1301\n2014-01-03 14:34:00+00:00 78.552 37.1450\n2014-01-03 14:35:00+00:00 78.573 37.1500\n2014-01-03 14:36:00+00:00 78.616 37.1400\n2014-01-03 14:37:00+00:00 78.693 37.1100\n2014-01-03 14:38:00+00:00 78.630 37.1250\n2014-01-03 14:39:00+00:00 78.589 37.0900\n2014-01-03 14:40:00+00:00 78.543 37.1040\n2014-01-03 14:41:00+00:00 78.424 37.1000\n2014-01-03 14:42:00+00:00 78.462 37.1400\n2014-01-03 14:43:00+00:00 78.539 37.1500\n2014-01-03 14:44:00+00:00 78.573 37.1600\n2014-01-03 14:45:00+00:00 78.509 37.1120\n2014-01-03 14:46:00+00:00 78.510 37.0600\n2014-01-03 14:47:00+00:00 78.477 37.0600\n2014-01-03 14:48:00+00:00 78.519 37.0600\n2014-01-03 14:49:00+00:00 78.501 37.0200\n2014-01-03 14:50:00+00:00 78.419 37.0100\n2014-01-03 14:51:00+00:00 78.392 37.0400\n2014-01-03 14:52:00+00:00 78.317 37.0450\n2014-01-03 14:53:00+00:00 78.287 37.0200\n2014-01-03 14:54:00+00:00 78.216 37.0300\n2014-01-03 14:55:00+00:00 78.230 37.0200\n2014-01-03 14:56:00+00:00 78.244 37.0150\n2014-01-03 14:57:00+00:00 78.299 37.0200\n2014-01-03 14:58:00+00:00 78.252 37.0301\n2014-01-03 14:59:00+00:00 78.344 37.0500\n2014-01-03 15:00:00+00:00 78.332 37.0372", "text/html": "
\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Security(24 [AAPL])Security(5061 [MSFT])
2014-01-03 14:31:00+00:00 78.937 37.1800
2014-01-03 14:32:00+00:00 78.702 37.1700
2014-01-03 14:33:00+00:00 78.756 37.1301
2014-01-03 14:34:00+00:00 78.552 37.1450
2014-01-03 14:35:00+00:00 78.573 37.1500
2014-01-03 14:36:00+00:00 78.616 37.1400
2014-01-03 14:37:00+00:00 78.693 37.1100
2014-01-03 14:38:00+00:00 78.630 37.1250
2014-01-03 14:39:00+00:00 78.589 37.0900
2014-01-03 14:40:00+00:00 78.543 37.1040
2014-01-03 14:41:00+00:00 78.424 37.1000
2014-01-03 14:42:00+00:00 78.462 37.1400
2014-01-03 14:43:00+00:00 78.539 37.1500
2014-01-03 14:44:00+00:00 78.573 37.1600
2014-01-03 14:45:00+00:00 78.509 37.1120
2014-01-03 14:46:00+00:00 78.510 37.0600
2014-01-03 14:47:00+00:00 78.477 37.0600
2014-01-03 14:48:00+00:00 78.519 37.0600
2014-01-03 14:49:00+00:00 78.501 37.0200
2014-01-03 14:50:00+00:00 78.419 37.0100
2014-01-03 14:51:00+00:00 78.392 37.0400
2014-01-03 14:52:00+00:00 78.317 37.0450
2014-01-03 14:53:00+00:00 78.287 37.0200
2014-01-03 14:54:00+00:00 78.216 37.0300
2014-01-03 14:55:00+00:00 78.230 37.0200
2014-01-03 14:56:00+00:00 78.244 37.0150
2014-01-03 14:57:00+00:00 78.299 37.0200
2014-01-03 14:58:00+00:00 78.252 37.0301
2014-01-03 14:59:00+00:00 78.344 37.0500
2014-01-03 15:00:00+00:00 78.332 37.0372
\n
"}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}, {"source": "If we want to query on the second layer of the index, we have to use `.xs` with a level argument instead of `.loc`. \n\nNote that `level=1` means the **second** level of the index, because the levels start at index 0.", "cell_type": "markdown", "metadata": {}}, {"execution_count": 42, "cell_type": "code", "source": "data.xs(Timestamp('2014-01-03 14:58:00', tz='UTC'), level=1)", "outputs": [{"execution_count": 42, "output_type": "execute_result", "data": {"text/plain": " Security(24 [AAPL]) Security(5061 [MSFT])\n2014-01-03 00:00:00+00:00 78.252 37.0301", "text/html": "
\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Security(24 [AAPL])Security(5061 [MSFT])
2014-01-03 00:00:00+00:00 78.252 37.0301
\n
"}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}, {"source": "If we just want to work with the original index values, we can drop the extra level from our index.", "cell_type": "markdown", "metadata": {}}, {"execution_count": 43, "cell_type": "code", "source": "data_copy = data.copy()\ndata_copy.index = data_copy.index.droplevel(0)\ndata_copy.head()", "outputs": [{"execution_count": 43, "output_type": "execute_result", "data": {"text/plain": " Security(24 [AAPL]) Security(5061 [MSFT])\n2014-01-02 14:31:00+00:00 79.446 37.340\n2014-01-02 14:32:00+00:00 79.424 37.375\n2014-01-02 14:33:00+00:00 79.490 37.260\n2014-01-02 14:34:00+00:00 79.502 37.260\n2014-01-02 14:35:00+00:00 79.252 37.280", "text/html": "
\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Security(24 [AAPL])Security(5061 [MSFT])
2014-01-02 14:31:00+00:00 79.446 37.340
2014-01-02 14:32:00+00:00 79.424 37.375
2014-01-02 14:33:00+00:00 79.490 37.260
2014-01-02 14:34:00+00:00 79.502 37.260
2014-01-02 14:35:00+00:00 79.252 37.280
\n
"}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}], "nbformat": 4, "metadata": {"kernelspec": {"display_name": "IPython (Python 2)", "name": "python2"}, "language_info": {"mimetype": "text/x-python", "pygments_lexer": "ipython2", "name": "python", "codemirror_mode": {"version": 2, "name": "ipython"}}, "signature": "sha256:f8ca5d9a28878a778ccc762cb4d3011af7dcb5d3604e3777a81ae42408e195c0"}} -------------------------------------------------------------------------------- /quanto/Quantopian_Meetup_Talk_IPython_Notebook.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": { 3 | "kernelspec": { 4 | "codemirror_mode": { 5 | "name": "ipython", 6 | "version": 2 7 | }, 8 | "display_name": "IPython (Python 2)", 9 | "language": "python", 10 | "name": "python2" 11 | }, 12 | "name": "", 13 | "signature": "sha256:4c39b0f7509ced2c0a6f0beb3aafe86071b5cf2821358800807e15f39f7f9aef" 14 | }, 15 | "nbformat": 3, 16 | "nbformat_minor": 0, 17 | "worksheets": [ 18 | { 19 | "cells": [ 20 | { 21 | "cell_type": "markdown", 22 | "metadata": {}, 23 | "source": [ 24 | "#IPython Notebook" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "collapsed": true, 30 | "input": [ 31 | "# This is a python execution cell.\n", 32 | "# Anything you could do in a python shell or script, you can do here.\n", 33 | "\n", 34 | "# To execute a cell, type CTRL-Enter.\n", 35 | "# You can also type SHIFT-Enter to execute and move to the next cell,\n", 36 | "# and you can type OPTION-Enter to execute and insert a new cell below.\n", 37 | "\n", 38 | "def foo():\n", 39 | " print \"IPython Notebook is Awesome!\"\n", 40 | "\n", 41 | "foo()\n", 42 | "\n", 43 | "# The last expression in a cell is always displayed as the cell's output when\n", 44 | "# it's executed.\n", 45 | "[1,2,3,4]" 46 | ], 47 | "language": "python", 48 | "metadata": {}, 49 | "outputs": [ 50 | { 51 | "output_type": "stream", 52 | "stream": "stdout", 53 | "text": [ 54 | "IPython Notebook is Awesome!\n" 55 | ] 56 | }, 57 | { 58 | "metadata": {}, 59 | "output_type": "pyout", 60 | "prompt_number": 24, 61 | "text": [ 62 | "[1, 2, 3, 4]" 63 | ] 64 | } 65 | ], 66 | "prompt_number": 24 67 | }, 68 | { 69 | "cell_type": "raw", 70 | "metadata": {}, 71 | "source": [ 72 | "IPython Notebook supports more than just Python cells. This is a raw text\n", 73 | "cell. Use it to insert unformatted text between cells." 74 | ] 75 | }, 76 | { 77 | "cell_type": "heading", 78 | "level": 1, 79 | "metadata": {}, 80 | "source": [ 81 | "This is a level 1 header cell." 82 | ] 83 | }, 84 | { 85 | "cell_type": "heading", 86 | "level": 2, 87 | "metadata": {}, 88 | "source": [ 89 | "This is a level 2 header cell." 90 | ] 91 | }, 92 | { 93 | "cell_type": "heading", 94 | "level": 3, 95 | "metadata": {}, 96 | "source": [ 97 | "This is a level 3 header cell." 98 | ] 99 | }, 100 | { 101 | "cell_type": "heading", 102 | "level": 4, 103 | "metadata": {}, 104 | "source": [ 105 | "This is a level 4 header cell." 106 | ] 107 | }, 108 | { 109 | "cell_type": "heading", 110 | "level": 5, 111 | "metadata": {}, 112 | "source": [ 113 | "This is a level 5 header cell." 114 | ] 115 | }, 116 | { 117 | "cell_type": "heading", 118 | "level": 6, 119 | "metadata": {}, 120 | "source": [ 121 | "This is a level 6 header cell." 122 | ] 123 | }, 124 | { 125 | "cell_type": "markdown", 126 | "metadata": {}, 127 | "source": [ 128 | "###This is a [Markdown](http://daringfireball.net/projects/markdown/) cell.\n", 129 | "\n", 130 | "> Markdown is a text-to-HTML conversion tool for web writers. Markdown allows\n", 131 | " you to write using an easy-to-read, easy-to-write plain text format, then\n", 132 | " convert it to structurally valid XHTML (or HTML). \n", 133 | "\n", 134 | "- Markdown supports bulleted lists.\n", 135 | " - You can nest lists as deep as you want.\n", 136 | " - List elements don't have to be text either.\n", 137 | " - ![So much deeper!](http://static3.wikia.nocookie.net/__cb20130123200725/glee/images/6/6f/We-need-to-go-deeper_inception.jpg)\n", 138 | " - Reasons to like Markdown:\n", 139 | " 1. It also supports numbered lists.\n", 140 | " 2. It has support for `code()` formatting.\n", 141 | " 3. You can embed arbitrary HTML\n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | "
Such as,for example,
a table.
\n", 146 | "\n", 147 | " 4. It even has support for code blocks:\n", 148 | "\n", 149 | " class Monad m where\n", 150 | " (>>=) :: m a -> (a -> m b) -> m b\n", 151 | " (>>) :: m a -> m b -> m b\n", 152 | " return :: a -> m a\n", 153 | " fail :: String -> m a\n", 154 | " m >> k = m >>= \\_ -> k" 155 | ] 156 | }, 157 | { 158 | "cell_type": "markdown", 159 | "metadata": {}, 160 | "source": [ 161 | "##Notebook Magics:\n", 162 | "**Most** of the magics that work in the `IPython` shell also work in the notebook. Additionally, there are some magics that **only** work in the notebook.\n", 163 | "###Autocomplete and Inline Documentation\n", 164 | " * Pressing the `TAB` key part of the way through a variable name autocompletes that name.\n", 165 | " * Autocomplete also works on attributes (e.g. `pandas.DataF -> pandas.DataFrame`).\n", 166 | " * You can bring up documentation for a function or class inline with SHIFT+TAB" 167 | ] 168 | }, 169 | { 170 | "cell_type": "markdown", 171 | "metadata": {}, 172 | "source": [ 173 | "####Execute this cell before trying the autocomplete examples in the next cell." 174 | ] 175 | }, 176 | { 177 | "cell_type": "code", 178 | "collapsed": false, 179 | "input": [ 180 | "import pandas\n", 181 | "class Point(object):\n", 182 | " \"\"\"\n", 183 | " A class-level docstring.\n", 184 | " \"\"\"\n", 185 | " def __init__(self, x, y=3):\n", 186 | " \"\"\"\n", 187 | " Constructor docstring. SHIFT+TAB will show you this first line.\n", 188 | " \n", 189 | " SHIFT + two TABs will show you the entire docstring.\n", 190 | " \"\"\"\n", 191 | " self.x, self.y = x, y\n", 192 | " \n", 193 | "long_variable_name = Point(3,4)" 194 | ], 195 | "language": "python", 196 | "metadata": {}, 197 | "outputs": [], 198 | "prompt_number": 25 199 | }, 200 | { 201 | "cell_type": "markdown", 202 | "metadata": {}, 203 | "source": [ 204 | "####Try it out!" 205 | ] 206 | }, 207 | { 208 | "cell_type": "code", 209 | "collapsed": false, 210 | "input": [ 211 | "pan # Pressing TAB here will autocomplete pandas.\n", 212 | "pandas. # Pressing TAB here will show you the top-level attributes of pandas.\n", 213 | "pandas.D # Pressing TAB here will show you DataFrame, DatetimeIndex, and DateOffset.\n", 214 | "pandas.DataFrame # Pressing TAB here will show you methods and attributes of DataFrame.\n", 215 | "\n", 216 | "long_variable_name # Pressing TAB here will autocomplete long_variable_name\n", 217 | "\n", 218 | " # Hold SHIFT and press TAB with your cursor in \n", 219 | "x = Point(1,2) # the parentheses to see info on how to make a Point object." 220 | ], 221 | "language": "python", 222 | "metadata": {}, 223 | "outputs": [], 224 | "prompt_number": 26 225 | }, 226 | { 227 | "cell_type": "markdown", 228 | "metadata": {}, 229 | "source": [ 230 | "###Documentation:\n", 231 | " * Typing `?` shows the function signature and documentation for that expression.\n", 232 | " * Typing `??` takes you to the source code for the expression.\n", 233 | " * You can also use the `pinfo` and `pinfo2` magics to get the same info.\n", 234 | " * **Notebook Only:** Press `SHIFT+TAB` while hovering over an object to open in-line documentation for that callable." 235 | ] 236 | }, 237 | { 238 | "cell_type": "code", 239 | "collapsed": false, 240 | "input": [ 241 | "pandas.DataFrame?" 242 | ], 243 | "language": "python", 244 | "metadata": {}, 245 | "outputs": [], 246 | "prompt_number": 27 247 | }, 248 | { 249 | "cell_type": "code", 250 | "collapsed": false, 251 | "input": [ 252 | "pandas.DataFrame.plot??" 253 | ], 254 | "language": "python", 255 | "metadata": {}, 256 | "outputs": [], 257 | "prompt_number": 29 258 | }, 259 | { 260 | "cell_type": "code", 261 | "collapsed": false, 262 | "input": [ 263 | "pandas.DataFrame.|plot" 264 | ], 265 | "language": "python", 266 | "metadata": {}, 267 | "outputs": [] 268 | }, 269 | { 270 | "cell_type": "markdown", 271 | "metadata": {}, 272 | "source": [ 273 | "##Cell Magics\n", 274 | "In addition to all the magics we saw above, there are additional magics that operate at the cell level. Many of these are focused around interoperation with other languages." 275 | ] 276 | }, 277 | { 278 | "cell_type": "markdown", 279 | "metadata": {}, 280 | "source": [ 281 | "###Javascript" 282 | ] 283 | }, 284 | { 285 | "cell_type": "code", 286 | "collapsed": false, 287 | "input": [ 288 | "%%javascript\n", 289 | "alert('foo')" 290 | ], 291 | "language": "python", 292 | "metadata": {}, 293 | "outputs": [] 294 | }, 295 | { 296 | "cell_type": "markdown", 297 | "metadata": {}, 298 | "source": [ 299 | "###R\n", 300 | "Some cell magics are provided by **extensions**. Here we load the `rpy2`'s cell magic for interacting with `R`." 301 | ] 302 | }, 303 | { 304 | "cell_type": "code", 305 | "collapsed": false, 306 | "input": [ 307 | "%load_ext rpy2.ipython" 308 | ], 309 | "language": "python", 310 | "metadata": {}, 311 | "outputs": [ 312 | { 313 | "output_type": "stream", 314 | "stream": "stdout", 315 | "text": [ 316 | "The rpy2.ipython extension is already loaded. To reload it, use:\n", 317 | " %reload_ext rpy2.ipython\n" 318 | ] 319 | } 320 | ], 321 | "prompt_number": 31 322 | }, 323 | { 324 | "cell_type": "code", 325 | "collapsed": false, 326 | "input": [ 327 | "import pandas as pd\n", 328 | "import numpy as np\n", 329 | "\n", 330 | "df = pd.DataFrame(np.random.randn(10,5), columns=['A','B','C','D','E'])\n", 331 | "df" 332 | ], 333 | "language": "python", 334 | "metadata": {}, 335 | "outputs": [ 336 | { 337 | "html": [ 338 | "
\n", 339 | "\n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | "
ABCDE
0-0.289653 0.035397 0.269596-0.123346-0.226254
1 1.610621-0.213442 0.646168 0.170514 1.779766
2 1.135251-1.238080 0.576340-0.603030-0.595476
3-0.819130-1.518475 1.292778 1.065084-1.714239
4 0.669536-1.068135-2.177952 0.287773-0.768615
5-0.182392-0.012740-0.427951 0.485842 1.201008
6-0.543909-0.123381-0.130659-0.614535 2.536462
7 0.658801-0.033578 0.587168-0.076015 0.998674
8 0.711228-1.877669-1.090271-1.858527 0.112624
9 1.879868 0.527192 0.837595-0.416209 1.090820
\n", 433 | "
" 434 | ], 435 | "metadata": {}, 436 | "output_type": "pyout", 437 | "prompt_number": 32, 438 | "text": [ 439 | " A B C D E\n", 440 | "0 -0.289653 0.035397 0.269596 -0.123346 -0.226254\n", 441 | "1 1.610621 -0.213442 0.646168 0.170514 1.779766\n", 442 | "2 1.135251 -1.238080 0.576340 -0.603030 -0.595476\n", 443 | "3 -0.819130 -1.518475 1.292778 1.065084 -1.714239\n", 444 | "4 0.669536 -1.068135 -2.177952 0.287773 -0.768615\n", 445 | "5 -0.182392 -0.012740 -0.427951 0.485842 1.201008\n", 446 | "6 -0.543909 -0.123381 -0.130659 -0.614535 2.536462\n", 447 | "7 0.658801 -0.033578 0.587168 -0.076015 0.998674\n", 448 | "8 0.711228 -1.877669 -1.090271 -1.858527 0.112624\n", 449 | "9 1.879868 0.527192 0.837595 -0.416209 1.090820" 450 | ] 451 | } 452 | ], 453 | "prompt_number": 32 454 | }, 455 | { 456 | "cell_type": "code", 457 | "collapsed": false, 458 | "input": [ 459 | "# Push our DataFrame into R.\n", 460 | "%Rpush df" 461 | ], 462 | "language": "python", 463 | "metadata": {}, 464 | "outputs": [], 465 | "prompt_number": 33 466 | }, 467 | { 468 | "cell_type": "code", 469 | "collapsed": false, 470 | "input": [ 471 | "%%R\n", 472 | "# Despite also being valid python, this is actually R code!\n", 473 | "col_A = df['A']\n", 474 | "plot(col_A)" 475 | ], 476 | "language": "python", 477 | "metadata": {}, 478 | "outputs": [ 479 | { 480 | "metadata": {}, 481 | "output_type": "display_data", 482 | "png": "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\n" 483 | } 484 | ], 485 | "prompt_number": 34 486 | }, 487 | { 488 | "cell_type": "code", 489 | "collapsed": false, 490 | "input": [ 491 | "# We can also pull values back out of R!\n", 492 | "%Rpull col_A\n", 493 | "col_A" 494 | ], 495 | "language": "python", 496 | "metadata": {}, 497 | "outputs": [ 498 | { 499 | "html": [ 500 | "
\n", 501 | "\n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | "
A
0-0.289653
1 1.610621
2 1.135251
3-0.819130
4 0.669536
5-0.182392
6-0.543909
7 0.658801
8 0.711228
9 1.879868
\n", 551 | "
" 552 | ], 553 | "metadata": {}, 554 | "output_type": "pyout", 555 | "prompt_number": 35, 556 | "text": [ 557 | " A\n", 558 | "0 -0.289653\n", 559 | "1 1.610621\n", 560 | "2 1.135251\n", 561 | "3 -0.819130\n", 562 | "4 0.669536\n", 563 | "5 -0.182392\n", 564 | "6 -0.543909\n", 565 | "7 0.658801\n", 566 | "8 0.711228\n", 567 | "9 1.879868" 568 | ] 569 | } 570 | ], 571 | "prompt_number": 35 572 | }, 573 | { 574 | "cell_type": "markdown", 575 | "metadata": {}, 576 | "source": [ 577 | "##Builtin Rich Display Formats\n", 578 | "IPython supports a wide array of rich display formats, including:\n", 579 | "* LaTeX\n", 580 | "* Markdown\n", 581 | "* HTML\n", 582 | "* SVG\n", 583 | "* PNG\n", 584 | "\n", 585 | "...and more" 586 | ] 587 | }, 588 | { 589 | "cell_type": "code", 590 | "collapsed": false, 591 | "input": [ 592 | "import IPython.display\n", 593 | "dir(IPython.display)[:18]" 594 | ], 595 | "language": "python", 596 | "metadata": {}, 597 | "outputs": [ 598 | { 599 | "metadata": {}, 600 | "output_type": "pyout", 601 | "prompt_number": 36, 602 | "text": [ 603 | "['Audio',\n", 604 | " 'DisplayObject',\n", 605 | " 'FileLink',\n", 606 | " 'FileLinks',\n", 607 | " 'HTML',\n", 608 | " 'IFrame',\n", 609 | " 'Image',\n", 610 | " 'JSON',\n", 611 | " 'Javascript',\n", 612 | " 'Latex',\n", 613 | " 'Markdown',\n", 614 | " 'Math',\n", 615 | " 'Pretty',\n", 616 | " 'SVG',\n", 617 | " 'ScribdDocument',\n", 618 | " 'TextDisplayObject',\n", 619 | " 'VimeoVideo',\n", 620 | " 'YouTubeVideo']" 621 | ] 622 | } 623 | ], 624 | "prompt_number": 36 625 | }, 626 | { 627 | "cell_type": "markdown", 628 | "metadata": {}, 629 | "source": [ 630 | "###LaTeX" 631 | ] 632 | }, 633 | { 634 | "cell_type": "code", 635 | "collapsed": false, 636 | "input": [ 637 | "from IPython.display import Math\n", 638 | "Math(r'w_A = \\frac{\\sigma_B - Cov(r_A, r_B)}{\\sigma_B^2 + \\sigma_A^2 - 2 Cov(r_A, r_B)}')" 639 | ], 640 | "language": "python", 641 | "metadata": {}, 642 | "outputs": [ 643 | { 644 | "latex": [ 645 | "$$w_A = \\frac{\\sigma_B - Cov(r_A, r_B)}{\\sigma_B^2 + \\sigma_A^2 - 2 Cov(r_A, r_B)}$$" 646 | ], 647 | "metadata": {}, 648 | "output_type": "pyout", 649 | "prompt_number": 37, 650 | "text": [ 651 | "" 652 | ] 653 | } 654 | ], 655 | "prompt_number": 37 656 | }, 657 | { 658 | "cell_type": "markdown", 659 | "metadata": {}, 660 | "source": [ 661 | "###HTML" 662 | ] 663 | }, 664 | { 665 | "cell_type": "code", 666 | "collapsed": false, 667 | "input": [ 668 | "from IPython.display import HTML\n", 669 | "HTML('''\\\n", 670 | "To learn more about IPython's rich display capabilities, click\n", 671 | "here.\n", 672 | "''')" 673 | ], 674 | "language": "python", 675 | "metadata": {}, 676 | "outputs": [ 677 | { 678 | "html": [ 679 | "To learn more about IPython's rich display capabilities, click\n", 680 | "here.\n" 681 | ], 682 | "metadata": {}, 683 | "output_type": "pyout", 684 | "prompt_number": 38, 685 | "text": [ 686 | "" 687 | ] 688 | } 689 | ], 690 | "prompt_number": 38 691 | }, 692 | { 693 | "cell_type": "markdown", 694 | "metadata": {}, 695 | "source": [ 696 | "###YouTube Video" 697 | ] 698 | }, 699 | { 700 | "cell_type": "code", 701 | "collapsed": false, 702 | "input": [ 703 | "from IPython.display import YouTubeVideo\n", 704 | "YouTubeVideo(\"https://www.youtube.com/watch?v=B_XiSozs-SE\")" 705 | ], 706 | "language": "python", 707 | "metadata": {}, 708 | "outputs": [ 709 | { 710 | "html": [ 711 | "\n", 712 | " \n", 719 | " " 720 | ], 721 | "metadata": {}, 722 | "output_type": "pyout", 723 | "prompt_number": 39, 724 | "text": [ 725 | "" 726 | ] 727 | } 728 | ], 729 | "prompt_number": 39 730 | }, 731 | { 732 | "cell_type": "markdown", 733 | "metadata": {}, 734 | "source": [ 735 | "### Customizing Object Display\n", 736 | "If a class implements one of many `_repr_` methods, IPython will use that method to display the object." 737 | ] 738 | }, 739 | { 740 | "cell_type": "code", 741 | "collapsed": false, 742 | "input": [ 743 | "class Table(object):\n", 744 | " \"\"\"\n", 745 | " A simple table represented as a list of lists.\n", 746 | " \"\"\"\n", 747 | "\n", 748 | " def __init__(self, lists):\n", 749 | " self.lists = lists\n", 750 | " \n", 751 | " def make_row(self, l):\n", 752 | " columns = ''.join('{value}'.format(value=value) for value in l)\n", 753 | " return '{columns}'.format(columns=columns)\n", 754 | " \n", 755 | " def _repr_html_(self):\n", 756 | " rows = ''.join(self.make_row(l) for l in self.lists)\n", 757 | " return \"{rows}
\".format(rows=rows)" 758 | ], 759 | "language": "python", 760 | "metadata": {}, 761 | "outputs": [] 762 | }, 763 | { 764 | "cell_type": "code", 765 | "collapsed": false, 766 | "input": [ 767 | "Table(\n", 768 | " [\n", 769 | " [1,2,3], \n", 770 | " [4,5,6]\n", 771 | " ]\n", 772 | ")" 773 | ], 774 | "language": "python", 775 | "metadata": {}, 776 | "outputs": [] 777 | }, 778 | { 779 | "cell_type": "markdown", 780 | "metadata": {}, 781 | "source": [ 782 | "##Further Reading:\n", 783 | " * [UI Widgets](http://nbviewer.ipython.org/github/ipython/ipython/blob/2.x/examples/Interactive%20Widgets/Index.ipynb)\n", 784 | " * [IPython Parallel](http://ipython.org/ipython-doc/dev/parallel)\n", 785 | " * [IPython Extensions](http://ipython.org/ipython-doc/dev/config/extensions)\n", 786 | " * [Custom Language Kernels](http://ipython.org/ipython-doc/dev/development/kernels.html)" 787 | ] 788 | } 789 | ], 790 | "metadata": {} 791 | } 792 | ] 793 | } -------------------------------------------------------------------------------- /tutorials/TwoSampleOLS.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": { 3 | "kernelspec": { 4 | "codemirror_mode": { 5 | "name": "ipython", 6 | "version": 2 7 | }, 8 | "display_name": "IPython (Python 2)", 9 | "language": "python", 10 | "name": "python2" 11 | }, 12 | "name": "", 13 | "signature": "sha256:c580f4b6af3d9f6086a859ea58c9d51929c138fac8a5515d17dceed25cec76ce" 14 | }, 15 | "nbformat": 3, 16 | "nbformat_minor": 0, 17 | "worksheets": [ 18 | { 19 | "cells": [ 20 | { 21 | "cell_type": "code", 22 | "collapsed": false, 23 | "input": [ 24 | "# Tell IPython that we want to show matplotlib plots using the inline renderer.\n", 25 | "%matplotlib inline\n", 26 | "\n", 27 | "import pandas as pd\n", 28 | "from pandas.stats.api import ols\n", 29 | "import numpy as np" 30 | ], 31 | "language": "python", 32 | "metadata": {}, 33 | "outputs": [], 34 | "prompt_number": 38 35 | }, 36 | { 37 | "cell_type": "code", 38 | "collapsed": false, 39 | "input": [ 40 | "# Build some fake data on which to do a regression.\n", 41 | "x_start = 50\n", 42 | "x_stop = 150\n", 43 | "\n", 44 | "# np.arange(X, Y) returns a numpy array containing integer values in [X,Y).\n", 45 | "x_vals = np.arange(x_start, x_stop)\n", 46 | "\n", 47 | "# Build fake observations by taking a linear model \n", 48 | "# and adding a random fuzz value to each entry.\n", 49 | "base = 5.6 + (3 * x_vals)\n", 50 | "observations_0 = base + 15 * np.random.randn(len(x_vals))\n", 51 | "observations_1 = base + 15 * np.random.randn(len(x_vals))\n", 52 | "\n", 53 | "df = pd.DataFrame(\n", 54 | " {\n", 55 | " 'x': x_vals,\n", 56 | " 'y0': observations_0,\n", 57 | " 'y1': observations_1,\n", 58 | " },\n", 59 | " # This isn't strictly necessary, but will make it easier to align\n", 60 | " # our plots later.\n", 61 | " index=x_vals,\n", 62 | ")\n", 63 | "df" 64 | ], 65 | "language": "python", 66 | "metadata": {}, 67 | "outputs": [ 68 | { 69 | "html": [ 70 | "
\n", 71 | "\n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | "
xy0y1
50 50 172.854190 145.772328
51 51 146.172851 177.290998
52 52 150.585412 166.771689
53 53 167.788975 164.723109
54 54 192.526672 176.700035
55 55 173.087062 196.051053
56 56 169.319521 179.012183
57 57 171.688592 174.852734
58 58 169.765965 192.957446
59 59 195.677395 165.677555
60 60 211.965887 187.194226
61 61 174.972141 200.603028
62 62 214.138771 192.090558
63 63 206.196159 209.814485
64 64 191.253703 225.309439
65 65 210.448703 192.892762
66 66 211.215431 206.644236
67 67 193.563510 203.880360
68 68 197.270521 201.113099
69 69 220.618016 201.688256
70 70 207.151778 196.817555
71 71 213.060158 232.184963
72 72 247.754713 211.653061
73 73 213.057432 234.618208
74 74 226.267727 226.889442
75 75 232.616644 243.718635
76 76 238.005354 220.478286
77 77 227.736492 238.212674
78 78 263.640435 261.701072
79 79 230.519727 245.474255
............
120 120 364.626304 347.354081
121 121 398.163848 372.939704
122 122 354.719352 357.856101
123 123 381.885688 375.899306
124 124 386.171630 366.608254
125 125 383.883295 385.406969
126 126 390.743554 347.937944
127 127 408.241602 377.825537
128 128 370.128210 389.405398
129 129 392.087396 377.953093
130 130 390.125402 396.472032
131 131 401.071693 395.520709
132 132 391.293586 384.902955
133 133 419.354889 398.454692
134 134 414.409858 408.179517
135 135 397.060690 396.944569
136 136 423.654914 372.181352
137 137 416.444577 421.441720
138 138 414.907222 408.083432
139 139 438.579730 418.188859
140 140 419.688440 437.514931
141 141 449.265980 421.402262
142 142 424.936533 421.858118
143 143 448.530916 451.793766
144 144 403.320395 448.833260
145 145 448.641680 438.132560
146 146 464.186444 438.631212
147 147 439.629830 457.988423
148 148 449.603870 459.015180
149 149 477.391707 469.187296
\n", 449 | "

100 rows \u00d7 3 columns

\n", 450 | "
" 451 | ], 452 | "metadata": {}, 453 | "output_type": "pyout", 454 | "prompt_number": 39, 455 | "text": [ 456 | " x y0 y1\n", 457 | "50 50 172.854190 145.772328\n", 458 | "51 51 146.172851 177.290998\n", 459 | "52 52 150.585412 166.771689\n", 460 | "53 53 167.788975 164.723109\n", 461 | "54 54 192.526672 176.700035\n", 462 | "55 55 173.087062 196.051053\n", 463 | "56 56 169.319521 179.012183\n", 464 | "57 57 171.688592 174.852734\n", 465 | "58 58 169.765965 192.957446\n", 466 | "59 59 195.677395 165.677555\n", 467 | "60 60 211.965887 187.194226\n", 468 | "61 61 174.972141 200.603028\n", 469 | "62 62 214.138771 192.090558\n", 470 | "63 63 206.196159 209.814485\n", 471 | "64 64 191.253703 225.309439\n", 472 | "65 65 210.448703 192.892762\n", 473 | "66 66 211.215431 206.644236\n", 474 | "67 67 193.563510 203.880360\n", 475 | "68 68 197.270521 201.113099\n", 476 | "69 69 220.618016 201.688256\n", 477 | "70 70 207.151778 196.817555\n", 478 | "71 71 213.060158 232.184963\n", 479 | "72 72 247.754713 211.653061\n", 480 | "73 73 213.057432 234.618208\n", 481 | "74 74 226.267727 226.889442\n", 482 | "75 75 232.616644 243.718635\n", 483 | "76 76 238.005354 220.478286\n", 484 | "77 77 227.736492 238.212674\n", 485 | "78 78 263.640435 261.701072\n", 486 | "79 79 230.519727 245.474255\n", 487 | ".. ... ... ...\n", 488 | "120 120 364.626304 347.354081\n", 489 | "121 121 398.163848 372.939704\n", 490 | "122 122 354.719352 357.856101\n", 491 | "123 123 381.885688 375.899306\n", 492 | "124 124 386.171630 366.608254\n", 493 | "125 125 383.883295 385.406969\n", 494 | "126 126 390.743554 347.937944\n", 495 | "127 127 408.241602 377.825537\n", 496 | "128 128 370.128210 389.405398\n", 497 | "129 129 392.087396 377.953093\n", 498 | "130 130 390.125402 396.472032\n", 499 | "131 131 401.071693 395.520709\n", 500 | "132 132 391.293586 384.902955\n", 501 | "133 133 419.354889 398.454692\n", 502 | "134 134 414.409858 408.179517\n", 503 | "135 135 397.060690 396.944569\n", 504 | "136 136 423.654914 372.181352\n", 505 | "137 137 416.444577 421.441720\n", 506 | "138 138 414.907222 408.083432\n", 507 | "139 139 438.579730 418.188859\n", 508 | "140 140 419.688440 437.514931\n", 509 | "141 141 449.265980 421.402262\n", 510 | "142 142 424.936533 421.858118\n", 511 | "143 143 448.530916 451.793766\n", 512 | "144 144 403.320395 448.833260\n", 513 | "145 145 448.641680 438.132560\n", 514 | "146 146 464.186444 438.631212\n", 515 | "147 147 439.629830 457.988423\n", 516 | "148 148 449.603870 459.015180\n", 517 | "149 149 477.391707 469.187296\n", 518 | "\n", 519 | "[100 rows x 3 columns]" 520 | ] 521 | } 522 | ], 523 | "prompt_number": 39 524 | }, 525 | { 526 | "cell_type": "code", 527 | "collapsed": false, 528 | "input": [ 529 | "regression = ols(x=df.x, y=pd.concat([df.y0, df.y1]))\n", 530 | "regression" 531 | ], 532 | "language": "python", 533 | "metadata": {}, 534 | "outputs": [ 535 | { 536 | "metadata": {}, 537 | "output_type": "pyout", 538 | "prompt_number": 40, 539 | "text": [ 540 | "\n", 541 | "-------------------------Summary of Regression Analysis-------------------------\n", 542 | "\n", 543 | "Formula: Y ~ + \n", 544 | "\n", 545 | "Number of Observations: 200\n", 546 | "Number of Degrees of Freedom: 2\n", 547 | "\n", 548 | "R-squared: 0.9741\n", 549 | "Adj R-squared: 0.9740\n", 550 | "\n", 551 | "Rmse: 14.0016\n", 552 | "\n", 553 | "F-stat (1, 198): 7446.3785, p-value: 0.0000\n", 554 | "\n", 555 | "Degrees of Freedom: model 1, resid 198\n", 556 | "\n", 557 | "-----------------------Summary of Estimated Coefficients------------------------\n", 558 | " Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%\n", 559 | "--------------------------------------------------------------------------------\n", 560 | " x 2.9597 0.0343 86.29 0.0000 2.8925 3.0269\n", 561 | " intercept 9.9445 3.5534 2.80 0.0056 2.9799 16.9092\n", 562 | "---------------------------------End of Summary---------------------------------" 563 | ] 564 | } 565 | ], 566 | "prompt_number": 40 567 | }, 568 | { 569 | "cell_type": "markdown", 570 | "metadata": {}, 571 | "source": [ 572 | "###Plot our data to get a visual sense of whether this is a reasonable model." 573 | ] 574 | }, 575 | { 576 | "cell_type": "code", 577 | "collapsed": false, 578 | "input": [ 579 | "import matplotlib.pyplot as plt\n", 580 | "from matplotlib import lines\n", 581 | "\n", 582 | "axis = df.plot(\n", 583 | " x='x',\n", 584 | " y='y0',\n", 585 | " kind='scatter',\n", 586 | " # Everything after this is optional.\n", 587 | " marker='x',\n", 588 | " linewidth='1.5',\n", 589 | " color='red',\n", 590 | " xlim=(45, 155),\n", 591 | " ylim=(125, 485),\n", 592 | " figsize=(12, 7),\n", 593 | " label='Trial 0',\n", 594 | ")\n", 595 | "df.plot(\n", 596 | " x='x',\n", 597 | " y='y1',\n", 598 | " kind='scatter',\n", 599 | " ax=axis, # This tells matplotlib to add this plot on top of the previous one.\n", 600 | " # Everything after this is optional.\n", 601 | " marker='x',\n", 602 | " linewidth='1.5',\n", 603 | " color='blue',\n", 604 | " label='Trial 1',\n", 605 | ")\n", 606 | "ols_result.y_fitted.plot(\n", 607 | " ax=axis,\n", 608 | " color='purple',\n", 609 | " linewidth='2',\n", 610 | " # See https://docs.python.org/2/library/string.html#format-specification-mini-language\n", 611 | " # for an explanation of the format of the strings inside the curly braces here.\n", 612 | " label='Regression: Y = {m:.4f}X + {b:.5}'.format(\n", 613 | " m=regression.beta.x,\n", 614 | " b=regression.beta.intercept,\n", 615 | " )\n", 616 | ")\n", 617 | "\n", 618 | "plt.xlabel('My Awesome X Axis')\n", 619 | "plt.ylabel('My Awesome Y Axis')\n", 620 | "\n", 621 | "plt.legend(\n", 622 | " loc='upper left',\n", 623 | " scatterpoints=1,\n", 624 | ")\n", 625 | "\n", 626 | "plt.title('My Awesome Regression Analysis')" 627 | ], 628 | "language": "python", 629 | "metadata": {}, 630 | "outputs": [ 631 | { 632 | "metadata": {}, 633 | "output_type": "pyout", 634 | "prompt_number": 65, 635 | "text": [ 636 | "" 637 | ] 638 | }, 639 | { 640 | "metadata": {}, 641 | "output_type": "display_data", 642 | "png": "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\n", 643 | "text": [ 644 | "" 645 | ] 646 | } 647 | ], 648 | "prompt_number": 65 649 | } 650 | ], 651 | "metadata": {} 652 | } 653 | ] 654 | } --------------------------------------------------------------------------------