From 31c9c3fa76f068f049c0b499ba1f65724c6ce77c Mon Sep 17 00:00:00 2001 From: Spencer Barton Date: Tue, 5 Mar 2019 22:34:34 -0800 Subject: [PATCH] A few lessons learned --- notebooks/!LEARNINGS.ipynb | 479 +++++++++ notebooks/01.04-Input-Output-History.ipynb | 11 +- .../01.05-IPython-And-Shell-Commands.ipynb | 4 +- notebooks/01.06-Errors-and-Debugging.ipynb | 4 +- notebooks/01.07-Timing-and-Profiling.ipynb | 60 +- notebooks/01.08-More-IPython-Resources.ipynb | 4 +- notebooks/02.00-Introduction-to-NumPy.ipynb | 6 +- .../02.01-Understanding-Data-Types.ipynb | 4 +- .../02.02-The-Basics-Of-NumPy-Arrays.ipynb | 4 +- .../02.03-Computation-on-arrays-ufuncs.ipynb | 4 +- ....04-Computation-on-arrays-aggregates.ipynb | 12 +- ...5-Computation-on-arrays-broadcasting.ipynb | 4 +- notebooks/02.07-Fancy-Indexing.ipynb | 204 +++- notebooks/02.08-Sorting.ipynb | 4 +- notebooks/02.09-Structured-Data-NumPy.ipynb | 40 +- notebooks/03.04-Missing-Values.ipynb | 8 +- notebooks/03.05-Hierarchical-Indexing.ipynb | 930 +++++------------- notebooks/03.06-Concat-And-Append.ipynb | 4 +- .../03.12-Performance-Eval-and-Query.ipynb | 4 +- notebooks/03.13-Further-Resources.ipynb | 4 +- .../04.04-Density-and-Contour-Plots.ipynb | 4 +- notebooks/04.06-Customizing-Legends.ipynb | 4 +- .../04.11-Settings-and-Stylesheets.ipynb | 4 +- .../04.13-Geographic-Data-With-Basemap.ipynb | 4 +- .../04.14-Visualization-With-Seaborn.ipynb | 4 +- notebooks/04.15-Further-Resources.ipynb | 4 +- notebooks/05.04-Feature-Engineering.ipynb | 4 +- notebooks/mprun_demo.py | 7 + 28 files changed, 1054 insertions(+), 775 deletions(-) create mode 100644 notebooks/!LEARNINGS.ipynb create mode 100644 notebooks/mprun_demo.py diff --git a/notebooks/!LEARNINGS.ipynb b/notebooks/!LEARNINGS.ipynb new file mode 100644 index 000000000..d1a41830f --- /dev/null +++ b/notebooks/!LEARNINGS.ipynb @@ -0,0 +1,479 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Learnings" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Who knew these methods existed!" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0 1 2 3]\n" + ] + }, + { + "data": { + "text/plain": [ + "array([0, 1, 3, 6])" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = np.arange(4)\n", + "print(a)\n", + "np.add.accumulate(np.arange(4))" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.add.reduce(np.arange(4))" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "6" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.sum(np.arange(4))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1, 1, 1],\n", + " [6, 6, 2],\n", + " [7, 9, 0]])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = np.random.randint(10, size=(3, 3))\n", + "a" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-6917529027641081856, 6917537815407072623, 5],\n", + " [ 0, 0, 0],\n", + " [-6917529027641081856, 3458773301586529315, -6917529027641081854]])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "b = np.empty_like(a)\n", + "b" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 2, 2, 2],\n", + " [ 64, 64, 4],\n", + " [128, 512, 1]])" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.power(2, a, out=b)\n", + "b" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0 1 2]]\n", + "[[0]\n", + " [1]\n", + " [2]]\n" + ] + }, + { + "data": { + "text/plain": [ + "array([[0, 1, 2],\n", + " [1, 2, 3],\n", + " [2, 3, 4]])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x = np.arange(3).reshape(1, -1)\n", + "y = np.arange(3).reshape(-1, 1)\n", + "\n", + "print(x)\n", + "print(y)\n", + "x + y" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 0. 1. nan 3. 4.]\n", + "[ 0. 1. nan nan nan]\n" + ] + }, + { + "data": { + "text/plain": [ + "array([0., 1., 1., 4., 8.])" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = np.linspace(0, 4, 5)\n", + "a[2] = np.nan\n", + "\n", + "print(a)\n", + "print(np.cumsum(a))\n", + "np.nancumsum(a)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[0;31mType:\u001b[0m _IndexSlice\n", + "\u001b[0;31mString form:\u001b[0m \n", + "\u001b[0;31mFile:\u001b[0m ~/venv/lib/python3.6/site-packages/pandas/core/indexing.py\n", + "\u001b[0;31mDocstring:\u001b[0m \n", + "Create an object to more easily perform multi-index slicing\n", + "\n", + "Examples\n", + "--------\n", + "\n", + ">>> midx = pd.MultiIndex.from_product([['A0','A1'], ['B0','B1','B2','B3']])\n", + ">>> columns = ['foo', 'bar']\n", + ">>> dfmi = pd.DataFrame(np.arange(16).reshape((len(midx), len(columns))),\n", + " index=midx, columns=columns)\n", + "\n", + "Using the default slice command:\n", + "\n", + ">>> dfmi.loc[(slice(None), slice('B0', 'B1')), :]\n", + " foo bar\n", + " A0 B0 0 1\n", + " B1 2 3\n", + " A1 B0 8 9\n", + " B1 10 11\n", + "\n", + "Using the IndexSlice class for a more intuitive command:\n", + "\n", + ">>> idx = pd.IndexSlice\n", + ">>> dfmi.loc[idx[:, 'B0':'B1'], :]\n", + " foo bar\n", + " A0 B0 0 1\n", + " B1 2 3\n", + " A1 B0 8 9\n", + " B1 10 11\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "?pd.IndexSlice" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "nrows, ncols = 100000, 3\n", + "rng = np.random.RandomState(42)\n", + "df1, df2, df3, df4 = (pd.DataFrame(rng.rand(nrows, ncols))\n", + " for i in range(4))\n", + "\n", + "# Eval is faster\n", + "pd.eval('-df1 * df2 / (df3 + df4)');" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "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", + "
ABCD
00.0601420.2177640.0293729.461580
10.2512820.8831460.7642471.484373
20.9904630.1515280.6318081.807498
30.0706410.9513940.07503013.621750
40.0989040.7447020.1697764.968946
\n", + "
" + ], + "text/plain": [ + " A B C D\n", + "0 0.060142 0.217764 0.029372 9.461580\n", + "1 0.251282 0.883146 0.764247 1.484373\n", + "2 0.990463 0.151528 0.631808 1.807498\n", + "3 0.070641 0.951394 0.075030 13.621750\n", + "4 0.098904 0.744702 0.169776 4.968946" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame(rng.rand(5, 3), columns=['A', 'B', 'C'])\n", + "df.eval('D = (A + B) / C', inplace=True)\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ABCD
00.0601420.2177640.0293729.46158
\n", + "
" + ], + "text/plain": [ + " A B C D\n", + "0 0.060142 0.217764 0.029372 9.46158" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.query('A < 0.5 and B < 0.5')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/notebooks/01.04-Input-Output-History.ipynb b/notebooks/01.04-Input-Output-History.ipynb index c8e5463fe..7088afd2b 100644 --- a/notebooks/01.04-Input-Output-History.ipynb +++ b/notebooks/01.04-Input-Output-History.ipynb @@ -195,6 +195,13 @@ "\n", "\"Open\n" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -214,9 +221,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/01.05-IPython-And-Shell-Commands.ipynb b/notebooks/01.05-IPython-And-Shell-Commands.ipynb index 6fe0dd875..c87905110 100644 --- a/notebooks/01.05-IPython-And-Shell-Commands.ipynb +++ b/notebooks/01.05-IPython-And-Shell-Commands.ipynb @@ -247,9 +247,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/01.06-Errors-and-Debugging.ipynb b/notebooks/01.06-Errors-and-Debugging.ipynb index a7625d5ef..9a2782033 100644 --- a/notebooks/01.06-Errors-and-Debugging.ipynb +++ b/notebooks/01.06-Errors-and-Debugging.ipynb @@ -418,9 +418,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/01.07-Timing-and-Profiling.ipynb b/notebooks/01.07-Timing-and-Profiling.ipynb index 76f0db5cb..737223ba9 100644 --- a/notebooks/01.07-Timing-and-Profiling.ipynb +++ b/notebooks/01.07-Timing-and-Profiling.ipynb @@ -390,7 +390,32 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting memory_profiler\n", + " Using cached https://files.pythonhosted.org/packages/9f/fe/1fca7273dd111108f204a686b12a12b6422d405fe4614087aa7d5a66ea87/memory_profiler-0.55.0.tar.gz\n", + "Requirement already satisfied: psutil in /Users/spencer/venv/lib/python3.6/site-packages (from memory_profiler) (5.5.1)\n", + "Building wheels for collected packages: memory-profiler\n", + " Building wheel for memory-profiler (setup.py) ... \u001b[?25ldone\n", + "\u001b[?25h Stored in directory: /Users/spencer/Library/Caches/pip/wheels/f0/ff/63/fdbff3f1e1b76ad4eae491dd5b190902906b093e93eb86dd5a\n", + "Successfully built memory-profiler\n", + "Installing collected packages: memory-profiler\n", + "Successfully installed memory-profiler-0.55.0\n" + ] + } + ], + "source": [ + "! pip install memory_profiler" + ] + }, + { + "cell_type": "code", + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -407,14 +432,14 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "peak memory: 100.08 MiB, increment: 61.36 MiB\n" + "peak memory: 74.11 MiB, increment: 34.29 MiB\n" ] } ], @@ -434,7 +459,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -465,7 +490,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -474,6 +499,25 @@ "text": [ "\n" ] + }, + { + "data": { + "text/plain": [ + "Filename: /Users/spencer/Documents/Personal/PythonDataScienceHandbook/notebooks/mprun_demo.py\n", + "\n", + "Line # Mem usage Increment Line Contents\n", + "================================================\n", + " 1 39.8 MiB 39.8 MiB def sum_of_lists(N):\n", + " 2 39.8 MiB 0.0 MiB total = 0\n", + " 3 39.8 MiB 0.0 MiB for i in range(5):\n", + " 4 71.1 MiB 0.1 MiB L = [j ^ (j >> i) for j in range(N)]\n", + " 5 77.6 MiB 6.5 MiB total += sum(L)\n", + " 6 39.7 MiB 0.0 MiB del L # remove reference to L\n", + " 7 39.2 MiB 0.0 MiB return total" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -526,7 +570,7 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python [default]", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -540,9 +584,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 2 } diff --git a/notebooks/01.08-More-IPython-Resources.ipynb b/notebooks/01.08-More-IPython-Resources.ipynb index ad87f002d..d30ef72ff 100644 --- a/notebooks/01.08-More-IPython-Resources.ipynb +++ b/notebooks/01.08-More-IPython-Resources.ipynb @@ -91,9 +91,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/02.00-Introduction-to-NumPy.ipynb b/notebooks/02.00-Introduction-to-NumPy.ipynb index e527c4355..c393bee45 100644 --- a/notebooks/02.00-Introduction-to-NumPy.ipynb +++ b/notebooks/02.00-Introduction-to-NumPy.ipynb @@ -79,7 +79,7 @@ { "data": { "text/plain": [ - "'1.11.1'" + "'1.15.1'" ] }, "execution_count": 1, @@ -183,9 +183,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/02.01-Understanding-Data-Types.ipynb b/notebooks/02.01-Understanding-Data-Types.ipynb index 82b128e48..8ce05a77e 100644 --- a/notebooks/02.01-Understanding-Data-Types.ipynb +++ b/notebooks/02.01-Understanding-Data-Types.ipynb @@ -822,9 +822,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/02.02-The-Basics-Of-NumPy-Arrays.ipynb b/notebooks/02.02-The-Basics-Of-NumPy-Arrays.ipynb index f9dad509a..2e5f1d91c 100644 --- a/notebooks/02.02-The-Basics-Of-NumPy-Arrays.ipynb +++ b/notebooks/02.02-The-Basics-Of-NumPy-Arrays.ipynb @@ -1564,9 +1564,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/02.03-Computation-on-arrays-ufuncs.ipynb b/notebooks/02.03-Computation-on-arrays-ufuncs.ipynb index 5296859e5..c6b31423d 100644 --- a/notebooks/02.03-Computation-on-arrays-ufuncs.ipynb +++ b/notebooks/02.03-Computation-on-arrays-ufuncs.ipynb @@ -1101,9 +1101,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/02.04-Computation-on-arrays-aggregates.ipynb b/notebooks/02.04-Computation-on-arrays-aggregates.ipynb index 53e6462fd..fcb460615 100644 --- a/notebooks/02.04-Computation-on-arrays-aggregates.ipynb +++ b/notebooks/02.04-Computation-on-arrays-aggregates.ipynb @@ -451,10 +451,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "order,name,height(cm)\r\n", - "1,George Washington,189\r\n", - "2,John Adams,170\r\n", - "3,Thomas Jefferson,189\r\n" + "order,name,height(cm)\n", + "1,George Washington,189\n", + "2,John Adams,170\n", + "3,Thomas Jefferson,189\n" ] } ], @@ -638,9 +638,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/02.05-Computation-on-arrays-broadcasting.ipynb b/notebooks/02.05-Computation-on-arrays-broadcasting.ipynb index c1cae6ddf..be236cf2b 100644 --- a/notebooks/02.05-Computation-on-arrays-broadcasting.ipynb +++ b/notebooks/02.05-Computation-on-arrays-broadcasting.ipynb @@ -796,9 +796,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/02.07-Fancy-Indexing.ipynb b/notebooks/02.07-Fancy-Indexing.ipynb index 00cc188a5..2afda8c5f 100644 --- a/notebooks/02.07-Fancy-Indexing.ipynb +++ b/notebooks/02.07-Fancy-Indexing.ipynb @@ -478,9 +478,9 @@ "outputs": [ { "data": { - "image/png": "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\nVH5+flSfq68/Y6oKKSE/v0GR1dI+SY7y8xsT/jM4dGiIOt8QHDo0xIqfe15ethX1cIuX2+/ltku0\nn/b3f2NiLJx//OMf68knn9TMmTMlSU899ZSpotNK59XShYVntWxZ4ldLBwKn2g8cidwQsH0KAOzm\ncxzH6f9tieP1u6dktL+xMazy8pou26dsmHPm7tm77fdy2yXaT/uT2HOGvdg+BQCphRPCAACwDOEM\nAIBlCGcAACxDOAMAYBnCGQAAyxDOAABYhnAGAMAyhDMAAJYhnAEAsAzhDACAZQhnAAAsQzgDAGAZ\nwhkAAMsQzgAAWIZwBgDAMoQzAACWIZwBALAM4QwAgGUIZwAALEM4AwBgGcIZAADLZLhdAcSmoSGs\niooaHT06QoHAKQWDRfL7c9yuFgDAIMI5xVRU1Ki6ep4kn+rqHElVWrfudrerBQAwiGHtFHP06AhJ\nvvZXvvbXAIB0QjinmEDglCSn/ZWjQOC0m9UBACSAsWHtpqYmLViwQF999ZWysrL0m9/8RqNGjTJV\nPNoFg0WSqtrnnE8rGJzkdpUAAIYZC+dt27ZpzJgxWrRokV555RWtX79eFRUVpopHO78/hzlmAEhz\nxoa1CwsL1dTUJCnSi7788stNFQ0AgKfE1XPeunWrNm7c2OVrS5Ys0VtvvaVbb71Vp06d0qZNm4xU\nEAAAr/E5juP0/7b+Pfjgg5owYYJKS0v14Ycf6le/+pV27NhhomgAADzF2JzzyJEjNXz4cElSbm6u\nmpubo/pcff0ZU1VIOXl52bSf9rtdDVd4ue0S7af92f2+x1g4//KXv9QTTzyhTZs2qbW1Vb/+9a9N\nFQ0AgKcYC+crrrhCzz//vKniAADwLA4hAQDAMoQzAACWIZwBALAM4QwAgGUIZwAALEM4AwBgGcIZ\nAADLEM4AAFiGcAYAwDKEMwAAliGcAQCwDOEMAIBlCGcAACxDOAMAYBnCGQAAyxDOAABYhnAGAMAy\nhDMAAJYhnAEAsAzhDACAZQhnAAAsQzgDAGAZwhkAAMsQzgAAWIZwBgDAMoQzAACWGVA4v/HGG3rk\nkUcuvt6/f79KS0t111136bnnnhtw5QAA8KK4w3n58uV69tlnu3xt6dKlWrFihTZt2qS//vWvOnjw\n4IArCACA18QdzmPHjtWTTz558XVTU5POnz+vb37zm5KkH/zgB3r77bcHXEEAALwmo783bN26VRs3\nbuzytcrKSk2dOlXvvffexa81Nzdr+PDhF18PGzZMx44dM1hVAAC8od9wLikpUUlJSb8FDRs2TE1N\nTRdfNzc3a8SIEf1+Li8vu9/3pDPaT/u9ysttl2i/19vfH2OrtYcPH67MzEx99tlnchxH+/bt07hx\n40wVDwCAZ/Tbc47FU089pUWLFqmtrU033nijvve975ksHgAAT/A5juO4XQkAAHAJh5AAAGAZwhkA\nAMsQzgAAWIZwBgDAMlaE8+HDh3XdddeppaXF7aok1dmzZzV//nzNnTtXP/3pT/Xll1+6XaWkampq\n0i9+8QvNmzdPs2bNUl1dndtVSrru59OnO8dxtHTpUs2aNUt33323PvvsM7erlHT79+/XvHnz3K5G\n0rW2tqq8vFxz5sxRaWmp9uzZ43aVkqqtrU2PPfaYZs+erTlz5ujjjz/u8/2uh3NTU5OCwaCysrLc\nrkrS/eEPf9DVV1+tl156SbfddpvWrVvndpWS6oUXXtANN9ygqqoqVVZW6umnn3a7SknV0/n06e7N\nN99US0uLNm/erEceeUSVlZVuVymp1q9fryeeeELnz593uypJt2PHDvn9fv3+97/XunXrtGzZMrer\nlFR79uyRz+fTyy+/rIceekgrVqzo8/1G9znHY8mSJVq4cKHmz5/vdlWS7p577lHHTrZQKKSRI0e6\nXKPkuvfee5WZmSkpclfttRu0sWPHavLkydqyZYvbVUma999/XxMmTJAkXXPNNTpw4IDLNUquQCCg\nVatWqby83O2qJN3UqVM1ZcoUSZFeZEaG6/GTVDfffLOKiookSZ9//nm//79P2k+npzO68/Pzdeut\nt2rMmDFK9+3WvZ1RfvXVV+uee+7RRx99pA0bNrhUu8Trq/319fUqLy/X448/7lLtEiva8+m9oKmp\nSdnZl45tzMjIUFtbmwYNcn0QLykmT56szz//3O1quGLIkCGSIn8DDz30kBYsWOByjZJv0KBBevTR\nR/Xmm2/qt7/9bd9vdlxUXFzszJs3z5k7d67z3e9+15k7d66b1XHV4cOHnZtvvtntaiTdwYMHnWnT\npjl/+tOf3K6KK959911n4cKFblcjaSorK52dO3defD1x4kT3KuOSY8eOOTNnznS7Gq4IhULOHXfc\n4Wzbts3tqrjqxIkTzqRJk5yzZ8/2+h5XxxV27dp18b+LiorSuufYk+eff15XXnmlpk+frqFDh+qy\nyy5zu0pJ9fHHH+vhhx/WypUrNWbMGLergyQYO3asampqNGXKFNXV1amwsNDtKrnCSfORwp6cOHFC\n9913n5YjwwUsAAAAzklEQVQsWaLrr7/e7eokXXV1tY4fP66f/exnysrK0qBBg/ocMbJm0N/n83nu\nD/bOO+9URUWFtm7dKsdxPLc4ZsWKFWppadHy5cvlOI5GjBihVatWuV0tJNDkyZP11ltvadasWZLk\nub/5Dj6fz+0qJN3atWt1+vRprV69WqtWrZLP59P69esvrjtJd8XFxVq8eLHmzp2r1tZWPf744322\nnbO1AQCwjDdWYQAAkEIIZwAALEM4AwBgGcIZAADLEM4AAFiGcAYAwDKEMwAAlvn/5iKbJb8BcnkA\nAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "
" ] }, "metadata": {}, @@ -512,8 +512,8 @@ { "data": { "text/plain": [ - "array([93, 45, 73, 81, 50, 10, 98, 94, 4, 64, 65, 89, 47, 84, 82, 80, 25,\n", - " 90, 63, 20])" + "array([ 3, 46, 63, 38, 21, 99, 93, 31, 14, 89, 16, 28, 6, 48, 86, 24, 90,\n", + " 51, 77, 9])" ] }, "execution_count": 15, @@ -565,9 +565,9 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAecAAAFVCAYAAADVDycqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl0U+edN/CvVsuWbXnFYPbVQAATGYLBFjtmD4QQCA1M\n2+k5mZnMdEmaJm2aN+mWciZzTpqZt0lP0rztZNKkpFCSAGELBowNMZvACRBMWIONMbbBsiUv0pXu\n+4fHAiHJWnwtXVvfzz+tru599Hts4p+eXSGKoggiIiKSDWW0AyAiIiJPTM5EREQyw+RMREQkM0zO\nREREMsPkTEREJDNMzkRERDKjlrIwQRDw/PPPo7q6Gmq1Gr/+9a8xfPhwKT+CiIioz5O05VxSUgKX\ny4VNmzbhqaeewu9+9zspiyciIooJkibnYcOGwel0QhRFNDc3Q6PRSFk8ERFRTJC0W1uv16OqqgqL\nFi1CY2Mj3nrrLSmLJyIiigmStpz/+7//GyaTCXv27MG2bdvw/PPPw263+72fO4cSERF5k7TlbDAY\noFZ3FJmUlARBEOByufzer1AoUFfXLGUIvUpmZhLrz/pHO4yoiOW6A6w/658U8B5Jk/O3v/1tvPDC\nC3jiiScgCAJ+/OMfQ6fTSfkRREREfZ6kyTkhIQGvv/66lEUSERHFHG5CQkREJDNMzkRERDLD5ExE\nRCQzTM5EREQyw+RMREQkM0zOREREMsPkTEREJDNMzkRERDLD5ExERCQzTM5EREQyw+RMREQkM0zO\nREREMsPkTEREJDNMzkRERDLD5ExERCQzTM5EREQyw+RMREQkM0zOREREMsPkTEREJDNMzkRERDLD\n5ExERCQzTM5EREQyw+RMREQkM+poB0BERBSqq1ev4Msvv4BWq4UoigAAQRAwfXoB0tPToxxd9zE5\nExFRr9HUZMGePbuQkzMWy5ev8HjP5XLh888P49atWixbtgIajSZKUXYfkzMREfUKFksj9uzZhcce\nexwKhcLrfaVSiYICE9ra2rB58yasWbMOanXvTHOSjzm//fbbePzxx/Hoo4/i73//u9TFExFRjNq7\nd7ffxHwvnU6HlSsfxe7dOyMUmfQk/Upx7NgxnDp1Cps2bUJLSwv+9Kc/SVk8ERHFqG++uYZRo0YH\nTMydEhISoFar0d7ejri4uB6OTnqSJueysjKMGTMGTz31FGw2G5577jkpiycioj7CbnfAbK6HzaaG\n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\nZyIiIplhciYiIpIZJmciIiKZYXImIiKSGSZnIiIimWFyJiIikhkmZyIiIplhciYiIpIZJmciIiKZ\nYXImIiKSGSZnIiIimVFHOwCKLLvdAbO5HjabGnq9AKMxA1qtJtphERHRPdhyjjFmcz0slkEQhP6w\nWAbBbK6PdkhERHQfJucYY7Opu3xNRETRx+QcY/R6ocvXREQUfZI1m1wuFzZu3IizZ8/Cbrfj+9//\nPmbNmiVV8SQRozEDZnOVx5gzERHJi2TJ+ZNPPoHT6cQHH3yA2tpa7NmzR6qiSUJarQb5+QOiHQYR\nEXVBsuRcVlaG0aNH45/+6Z8AAC+++KJURfcp986WHjiwCSNGxHO2NBEReQgrOW/ZsgXvvvuux7W0\ntDTExcXhrbfewvHjx/Gzn/0Mf/nLXyQJsi/pnC0NAI2NCTCbL/R4S5bLp4iIeheFKIqiFAU988wz\nWLx4MRYsWAAAKCwsRFlZmRRF9ym7dtVCELLcr9XqWixenNXFE91XWlqNxsaB7tcpKdUwmQZ28QQR\nEUWTZN3aeXl5KCkpwYIFC3D+/HlkZ2cH9VxdXbNUIfQKgmCBxZIEADAYEiAIFtTVJfToZ1ZXt0MQ\nWtyvbbZ2WfzcMzOTZBFHtMRy/WO57gDrz/onBbxHsqVUjz32GFwuF9auXYuXX34Zv/zlL6Uquk8x\nGjNgMFRBrb6JlJTqiMyW5vIpIqLeRbKWs1arxW9/+1upiuuz7p0tHalvj1w+RUTUu3B7qBjA5VNE\nRL0LdwgjIiKSGSZnIiIimWFyJiIikhkmZyIiIplhciYiIpIZJmciIiKZYXImIiKSGSZnIiIimWFy\nJiIikhkmZyIiIplhciYiIpIZJmciIiKZYXImIiKSGSZnIiIimWFyJiIikhkmZyIiIplhciYiIpIZ\nJmciIiKZYXImIiKSGSZnIiIimWFyJiIikhl1tAOg0NjtDpjN9bDZ1NDrBRiNGdBqNdEOi4iIJMSW\ncy9jNtfDYhkEQegPi2UQzOb6aIdEREQSY3LuZWw2dZeviYio92Ny7mX0eqHL10RE1PtJ1uyyWq14\n+umn0dLSgri4OPzHf/wH0tPTpSqe/pfRmAGzucpjzJmIiPoWyVrOW7duRU5ODt5//30sXrwY77zz\njlRF0z20Wg3y8wdg3rxM5OcP4GQwIqI+SLLkPGbMGFitVgAdrWiNhkmDiIgoHGF1a2/ZsgXvvvuu\nx7WXXnoJhw8fxtKlS2GxWPDBBx9IEiAREVGsUYiiKEpR0Pe//32YTCasWbMGlZWV+MlPfoJt27ZJ\nUTQREVFMkWxCmMFgQGJiIgAgLS0NNpstqOfq6pqlCqHXycxMYv1Z/2iHERWxXHeA9Wf9kwLeI1ly\n/sEPfoAXX3wRH3zwAQRBwG9+8xupiiYiIoopkiXnfv364e2335aqOCIiopjFTUiIiIhkhsmZiIhI\nZpiciYiIZIbJmYiISGaYnImIiGSGyZmIiEhmmJyJiIhkhsmZiIhIZpiciYiIZIbJmYiISGaYnImI\niGSGyZmIiEhmmJyJiIhkhsmZiIhIZpiciYiIZIbJmYiISGaYnImIiGSGyZmIiEhmmJyJiIhkhsmZ\niIhIZpiciYiIZIbJmYiISGaYnImIiGSGyZmIiEhmmJyJiIhkhsmZiIhIZrqVnD/77DP8+Mc/dr+u\nqKjAmjVr8K1vfQu///3vux0cERFRLAo7Ob/yyiv43e9+53Ht5ZdfxmuvvYYPPvgAX3zxBc6fP9/t\nAImIiGJN2MnZaDTiF7/4hfu11WqFw+HAoEGDAACFhYU4cuRItwMkIiKKNepAN2zZsgXvvvuux7WN\nGzdi8eLFOHbsmPuazWZDYmKi+7Ver0dVVZWEoRIREcWGgMl59erVWL16dcCC9Ho9rFar+7XNZkNy\ncnLA5zIzkwLe05ex/qx/rIrlugOsf6zXPxDJZmsnJiZCq9Xi+vXrEEURZWVlyMvLk6p4IiKimBGw\n5RyKX/7yl3j22WfhcrlQUFCASZMmSVk8ERFRTFCIoihGOwgiIiK6i5uQEBERyQyTMxERkcwwORMR\nEckMkzMREZHMyCI5X7p0CVOmTIHdbo92KBHV2tqKp556CuvXr8c//uM/4tatW9EOKaKsViv++Z//\nGRs2bMDjjz+O06dPRzukiLt/f/q+ThRFvPzyy3j88cfxD//wD7h+/Xq0Q4q4iooKbNiwIdphRJwg\nCHjuuefwxBNPYM2aNdi/f3+0Q4ool8uFF154AevWrcMTTzyBixcvdnl/1JOz1WrFq6++iri4uGiH\nEnF/+9vfMGHCBPzlL3/B8uXL8cc//jHaIUXUn//8Z8yYMQPvvfceNm7ciF/96lfRDimifO1P39ft\n27cPdrsdmzZtwo9//GNs3Lgx2iFF1DvvvIMXX3wRDocj2qFE3LZt25Camor3338ff/zjH/HrX/86\n2iFF1P79+6FQKPDXv/4VP/zhD/Haa691eb+k65zD8dJLL+GZZ57BU089Fe1QIu7b3/42Oley3bhx\nAwaDIcoRRdZ3v/tdaLVaAB3fqmPtC5rRaMSCBQvw4YcfRjuUiDl58iRMJhMAIDc3F2fOnIlyRJE1\ndOhQvPHGG3juueeiHUrELV68GIsWLQLQ0YpUq6OefiJq/vz5mDt3LgCguro64N/7iP10fO3RnZ2d\njaVLlyInJwd9fbm1vz3KJ0yYgG9/+9v4+uuv8ac//SlK0fW8rupfV1eH5557Dj//+c+jFF3PCnZ/\n+lhgtVqRlHR320a1Wg2XywWlMuqdeBGxYMECVFdXRzuMqIiPjwfQ8W/ghz/8IZ5++ukoRxR5SqUS\nP/3pT7Fv3z7813/9V9c3i1FUVFQkbtiwQVy/fr04ceJEcf369dEMJ6ouXbokzp8/P9phRNz58+fF\nZcuWiaWlpdEOJSqOHj0qPvPMM9EOI2I2btwo7tq1y/161qxZ0QsmSqqqqsS1a9dGO4youHHjhrhq\n1Spx69at0Q4lqurr68U5c+aIra2tfu+Jar/Cnj173P9/7ty5fbrl6Mvbb7+NrKwsrFixAgkJCVCp\nVNEOKaIuXryIH/3oR3j99deRk5MT7XAoAoxGIw4cOIBFixbh9OnTGDNmTLRDigqxj/cU+lJfX4/v\nfe97eOmll5Cfnx/tcCLuk08+QW1tLZ588knExcVBqVR22WMkm05/hUIRc/9gH330UTz//PPYsmUL\nRFGMuckxr732Gux2O1555RWIoojk5GS88cYb0Q6LetCCBQtw+PBhPP744wAQc//mOykUimiHEHFv\nvfUWmpqa8Oabb+KNN96AQqHAO++845530tcVFRXhZz/7GdavXw9BEPDzn/+8y7pzb20iIiKZiY1Z\nGERERL0IkzMREZHMMDkTERHJDJMzERGRzDA5ExERyQyTMxERkcwwORMREcnM/wcUk78ohTcyEwAA\nAABJRU5ErkJggg==\n", + "image/png": "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\n", "text/plain": [ - "" + "
" ] }, "metadata": {}, @@ -664,7 +664,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ 6. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n" + "[6. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n" ] } ], @@ -694,7 +694,7 @@ { "data": { "text/plain": [ - "array([ 6., 0., 1., 1., 1., 0., 0., 0., 0., 0.])" + "array([6., 0., 1., 1., 1., 0., 0., 0., 0., 0.])" ] }, "execution_count": 21, @@ -730,7 +730,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ 0. 0. 1. 2. 3. 0. 0. 0. 0. 0.]\n" + "[0. 0. 1. 2. 3. 0. 0. 0. 0. 0.]\n" ] } ], @@ -781,6 +781,176 @@ "np.add.at(counts, i, 1)" ] }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[0;31mSignature:\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msearchsorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mside\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'left'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msorter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mDocstring:\u001b[0m\n", + "Find indices where elements should be inserted to maintain order.\n", + "\n", + "Find the indices into a sorted array `a` such that, if the\n", + "corresponding elements in `v` were inserted before the indices, the\n", + "order of `a` would be preserved.\n", + "\n", + "Assuming that `a` is sorted:\n", + "\n", + "====== ============================\n", + "`side` returned index `i` satisfies\n", + "====== ============================\n", + "left ``a[i-1] < v <= a[i]``\n", + "right ``a[i-1] <= v < a[i]``\n", + "====== ============================\n", + "\n", + "Parameters\n", + "----------\n", + "a : 1-D array_like\n", + " Input array. If `sorter` is None, then it must be sorted in\n", + " ascending order, otherwise `sorter` must be an array of indices\n", + " that sort it.\n", + "v : array_like\n", + " Values to insert into `a`.\n", + "side : {'left', 'right'}, optional\n", + " If 'left', the index of the first suitable location found is given.\n", + " If 'right', return the last such index. If there is no suitable\n", + " index, return either 0 or N (where N is the length of `a`).\n", + "sorter : 1-D array_like, optional\n", + " Optional array of integer indices that sort array a into ascending\n", + " order. They are typically the result of argsort.\n", + "\n", + " .. versionadded:: 1.7.0\n", + "\n", + "Returns\n", + "-------\n", + "indices : array of ints\n", + " Array of insertion points with the same shape as `v`.\n", + "\n", + "See Also\n", + "--------\n", + "sort : Return a sorted copy of an array.\n", + "histogram : Produce histogram from 1-D data.\n", + "\n", + "Notes\n", + "-----\n", + "Binary search is used to find the required insertion points.\n", + "\n", + "As of NumPy 1.4.0 `searchsorted` works with real/complex arrays containing\n", + "`nan` values. The enhanced sort order is documented in `sort`.\n", + "\n", + "This function is a faster version of the builtin python `bisect.bisect_left`\n", + "(``side='left'``) and `bisect.bisect_right` (``side='right'``) functions,\n", + "which is also vectorized in the `v` argument.\n", + "\n", + "Examples\n", + "--------\n", + ">>> np.searchsorted([1,2,3,4,5], 3)\n", + "2\n", + ">>> np.searchsorted([1,2,3,4,5], 3, side='right')\n", + "3\n", + ">>> np.searchsorted([1,2,3,4,5], [-10, 10, 2, 3])\n", + "array([0, 5, 1, 2])\n", + "\u001b[0;31mFile:\u001b[0m ~/venv/lib/python3.6/site-packages/numpy/core/fromnumeric.py\n", + "\u001b[0;31mType:\u001b[0m function\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "?np.searchsorted" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[0;31mDocstring:\u001b[0m\n", + "empty(shape, dtype=float, order='C')\n", + "\n", + "Return a new array of given shape and type, without initializing entries.\n", + "\n", + "Parameters\n", + "----------\n", + "shape : int or tuple of int\n", + " Shape of the empty array, e.g., ``(2, 3)`` or ``2``.\n", + "dtype : data-type, optional\n", + " Desired output data-type for the array, e.g, `numpy.int8`. Default is\n", + " `numpy.float64`.\n", + "order : {'C', 'F'}, optional, default: 'C'\n", + " Whether to store multi-dimensional data in row-major\n", + " (C-style) or column-major (Fortran-style) order in\n", + " memory.\n", + "\n", + "Returns\n", + "-------\n", + "out : ndarray\n", + " Array of uninitialized (arbitrary) data of the given shape, dtype, and\n", + " order. Object arrays will be initialized to None.\n", + "\n", + "See Also\n", + "--------\n", + "empty_like : Return an empty array with shape and type of input.\n", + "ones : Return a new array setting values to one.\n", + "zeros : Return a new array setting values to zero.\n", + "full : Return a new array of given shape filled with value.\n", + "\n", + "\n", + "Notes\n", + "-----\n", + "`empty`, unlike `zeros`, does not set the array values to zero,\n", + "and may therefore be marginally faster. On the other hand, it requires\n", + "the user to manually set all the values in the array, and should be\n", + "used with caution.\n", + "\n", + "Examples\n", + "--------\n", + ">>> np.empty([2, 2])\n", + "array([[ -9.74499359e+001, 6.69583040e-309],\n", + " [ 2.13182611e-314, 3.06959433e-309]]) #random\n", + "\n", + ">>> np.empty([2, 2], dtype=int)\n", + "array([[-1073741821, -1067949133],\n", + " [ 496041986, 19249760]]) #random\n", + "\u001b[0;31mType:\u001b[0m builtin_function_or_method\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "?np.empty" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 1, 3, 6])" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.add.accumulate(np.arange(4))" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -797,9 +967,9 @@ "outputs": [ { "data": { - "image/png": "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\n9a9/PdavXx8zZszIHqdfeeKJJ+ITn/jExRPerFmz4uWXX84dqh87evRoPPjgg7F06dJYsGBB9jj9\n0tKlS6OsrCwiIpqamuKmm26K73//+zF69OjkyfqXb3/72zF69OhYsWJFRETcdddd8cwzz8S11177\nvrfvk/ddpkyZEq+88kpUV1dHU1NTXH/99X3xsAPSv/97+ezZs7v994Sh6q233oqvfe1r8d3vfjcm\nTJiQPU6/c8cdd8Qvf/nLmDt3ruu7d+PEiRNRU1MTmzZtiunTp2eP02/9+7uXy5Yti61btwrw+5gy\nZUrs3r07VqxYEceOHYt//OMfUVVVdcnb90mE77nnntiyZUvce++9ERHx2GOP9cXDDnhlZWXekr6E\n73znO3H27NnYtm1bdHZ2xqhRo6Kuri57rH6juro6fvWrX8XixYsj4t2373l/DQ0NcerUqaivr4+6\nurooKyuLXbt2XfyeA97rnydi3mvWrFnxm9/8JhYuXHjxpxS62i/XjgaAJL5LAwCSiDAAJBFhAEgi\nwgCQRIQBIIkIA0ASEQaAJP8P7quNPHF17C4AAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "
" ] }, "metadata": {}, @@ -838,9 +1008,9 @@ "output_type": "stream", "text": [ "NumPy routine:\n", - "10000 loops, best of 3: 97.6 µs per loop\n", + "28.8 µs ± 800 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n", "Custom routine:\n", - "10000 loops, best of 3: 19.5 µs per loop\n" + "20.2 µs ± 611 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" ] } ], @@ -872,9 +1042,9 @@ "output_type": "stream", "text": [ "NumPy routine:\n", - "10 loops, best of 3: 68.7 ms per loop\n", + "67.3 ms ± 1.42 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", "Custom routine:\n", - "10 loops, best of 3: 135 ms per loop\n" + "149 ms ± 2.41 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], @@ -924,9 +1094,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/02.08-Sorting.ipynb b/notebooks/02.08-Sorting.ipynb index 8be3373c0..c6b9ecd05 100644 --- a/notebooks/02.08-Sorting.ipynb +++ b/notebooks/02.08-Sorting.ipynb @@ -778,9 +778,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/02.09-Structured-Data-NumPy.ipynb b/notebooks/02.09-Structured-Data-NumPy.ipynb index ea4ee0bec..a4e65b21a 100644 --- a/notebooks/02.09-Structured-Data-NumPy.ipynb +++ b/notebooks/02.09-Structured-Data-NumPy.ipynb @@ -89,6 +89,26 @@ "x = np.zeros(4, dtype=int)" ] }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 0, 0, 0])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -98,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": { "collapsed": false }, @@ -109,13 +129,25 @@ "text": [ "[('name', '\n", + "\n", "\n", " \n", " \n", @@ -492,6 +505,19 @@ "data": { "text/html": [ "
\n", + "\n", "
\n", " \n", " \n", @@ -586,6 +612,19 @@ "data": { "text/html": [ "
\n", + "\n", "
\n", " \n", " \n", @@ -666,6 +705,19 @@ "data": { "text/html": [ "
\n", + "\n", "
\n", " \n", " \n", @@ -679,24 +731,24 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
a10.5542330.3560720.3809280.870058
20.9252440.2194740.6726020.673678
b10.4417590.6100540.0814530.778800
20.1714950.8866880.2732700.231333
\n", @@ -704,10 +756,10 @@ ], "text/plain": [ " data1 data2\n", - "a 1 0.554233 0.356072\n", - " 2 0.925244 0.219474\n", - "b 1 0.441759 0.610054\n", - " 2 0.171495 0.886688" + "a 1 0.380928 0.870058\n", + " 2 0.672602 0.673678\n", + "b 1 0.081453 0.778800\n", + " 2 0.273270 0.231333" ] }, "execution_count": 12, @@ -1015,6 +1067,23 @@ "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1049,40 +1118,40 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
2013131.038.732.036.735.037.224.039.441.039.250.037.1
224.037.044.036.838.037.750.035.029.036.7
2014130.037.439.037.861.036.927.038.132.037.029.036.6
247.037.848.037.351.036.533.037.633.038.631.036.7
\n", @@ -1092,10 +1161,10 @@ "subject Bob Guido Sue \n", "type HR Temp HR Temp HR Temp\n", "year visit \n", - "2013 1 31.0 38.7 32.0 36.7 35.0 37.2\n", - " 2 44.0 37.7 50.0 35.0 29.0 36.7\n", - "2014 1 30.0 37.4 39.0 37.8 61.0 36.9\n", - " 2 47.0 37.8 48.0 37.3 51.0 36.5" + "2013 1 24.0 39.4 41.0 39.2 50.0 37.1\n", + " 2 24.0 37.0 44.0 36.8 38.0 37.7\n", + "2014 1 27.0 38.1 32.0 37.0 29.0 36.6\n", + " 2 33.0 37.6 33.0 38.6 31.0 36.7" ] }, "execution_count": 19, @@ -1145,6 +1214,19 @@ "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1164,24 +1246,24 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
2013132.036.741.039.2
250.035.044.036.8
2014139.037.832.037.0
248.037.333.038.6
\n", @@ -1190,10 +1272,10 @@ "text/plain": [ "type HR Temp\n", "year visit \n", - "2013 1 32.0 36.7\n", - " 2 50.0 35.0\n", - "2014 1 39.0 37.8\n", - " 2 48.0 37.3" + "2013 1 41.0 39.2\n", + " 2 44.0 36.8\n", + "2014 1 32.0 37.0\n", + " 2 33.0 38.6" ] }, "execution_count": 20, @@ -1523,6 +1605,23 @@ "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1557,40 +1656,40 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", + " \n", + " \n", " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
2013131.038.732.036.735.037.224.039.441.039.250.037.1
224.037.044.036.838.037.750.035.029.036.7
2014130.037.439.037.861.036.927.038.132.037.029.036.6
247.037.848.037.351.036.533.037.633.038.631.036.7
\n", @@ -1600,10 +1699,10 @@ "subject Bob Guido Sue \n", "type HR Temp HR Temp HR Temp\n", "year visit \n", - "2013 1 31.0 38.7 32.0 36.7 35.0 37.2\n", - " 2 44.0 37.7 50.0 35.0 29.0 36.7\n", - "2014 1 30.0 37.4 39.0 37.8 61.0 36.9\n", - " 2 47.0 37.8 48.0 37.3 51.0 36.5" + "2013 1 24.0 39.4 41.0 39.2 50.0 37.1\n", + " 2 24.0 37.0 44.0 36.8 38.0 37.7\n", + "2014 1 27.0 38.1 32.0 37.0 29.0 36.6\n", + " 2 33.0 37.6 33.0 38.6 31.0 36.7" ] }, "execution_count": 28, @@ -1639,10 +1738,10 @@ "data": { "text/plain": [ "year visit\n", - "2013 1 32.0\n", - " 2 50.0\n", - "2014 1 39.0\n", - " 2 48.0\n", + "2013 1 41.0\n", + " 2 44.0\n", + "2014 1 32.0\n", + " 2 33.0\n", "Name: (Guido, HR), dtype: float64" ] }, @@ -1678,6 +1777,23 @@ "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1702,13 +1818,13 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
2013131.038.724.039.4
244.037.724.037.0
\n", @@ -1718,8 +1834,8 @@ "subject Bob \n", "type HR Temp\n", "year visit \n", - "2013 1 31.0 38.7\n", - " 2 44.0 37.7" + "2013 1 24.0 39.4\n", + " 2 24.0 37.0" ] }, "execution_count": 30, @@ -1754,10 +1870,10 @@ "data": { "text/plain": [ "year visit\n", - "2013 1 31.0\n", - " 2 44.0\n", - "2014 1 30.0\n", - " 2 47.0\n", + "2013 1 24.0\n", + " 2 24.0\n", + "2014 1 27.0\n", + " 2 33.0\n", "Name: (Bob, HR), dtype: float64" ] }, @@ -1791,10 +1907,10 @@ "outputs": [ { "ename": "SyntaxError", - "evalue": "invalid syntax (, line 1)", + "evalue": "invalid syntax (, line 1)", "output_type": "error", "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m health_data.loc[(:, 1), (:, 'HR')]\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m health_data.loc[(:, 1), (:, 'HR')]\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], @@ -1815,73 +1931,13 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, - "outputs": [ - { - "data": { - "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", - "
subjectBobGuidoSue
typeHRHRHR
yearvisit
2013131.032.035.0
2014130.039.061.0
\n", - "
" - ], - "text/plain": [ - "subject Bob Guido Sue\n", - "type HR HR HR\n", - "year visit \n", - "2013 1 31.0 32.0 35.0\n", - "2014 1 30.0 39.0 61.0" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "idx = pd.IndexSlice\n", "health_data.loc[idx[:, 1], idx[:, 'HR']]" @@ -1929,31 +1985,13 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, - "outputs": [ - { - "data": { - "text/plain": [ - "char int\n", - "a 1 0.003001\n", - " 2 0.164974\n", - "c 1 0.741650\n", - " 2 0.569264\n", - "b 1 0.001693\n", - " 2 0.526226\n", - "dtype: float64" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "index = pd.MultiIndex.from_product([['a', 'c', 'b'], [1, 2]])\n", "data = pd.Series(np.random.rand(6), index=index)\n", @@ -1973,22 +2011,13 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "'Key length (1) was greater than MultiIndex lexsort depth (0)'\n" - ] - } - ], + "outputs": [], "source": [ "try:\n", " data['a':'b']\n", @@ -2012,31 +2041,13 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, - "outputs": [ - { - "data": { - "text/plain": [ - "char int\n", - "a 1 0.003001\n", - " 2 0.164974\n", - "b 1 0.001693\n", - " 2 0.526226\n", - "c 1 0.741650\n", - " 2 0.569264\n", - "dtype: float64" - ] - }, - "execution_count": 36, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "data = data.sort_index()\n", "data" @@ -2054,29 +2065,13 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, - "outputs": [ - { - "data": { - "text/plain": [ - "char int\n", - "a 1 0.003001\n", - " 2 0.164974\n", - "b 1 0.001693\n", - " 2 0.526226\n", - "dtype: float64" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "data['a':'b']" ] @@ -2095,124 +2090,26 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, - "outputs": [ - { - "data": { - "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", - "
stateCaliforniaNew YorkTexas
year
2000338716481897645720851820
2010372539561937810225145561
\n", - "
" - ], - "text/plain": [ - "state California New York Texas\n", - "year \n", - "2000 33871648 18976457 20851820\n", - "2010 37253956 19378102 25145561" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pop.unstack(level=0)" ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, - "outputs": [ - { - "data": { - "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", - "
year20002010
state
California3387164837253956
New York1897645719378102
Texas2085182025145561
\n", - "
" - ], - "text/plain": [ - "year 2000 2010\n", - "state \n", - "California 33871648 37253956\n", - "New York 18976457 19378102\n", - "Texas 20851820 25145561" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pop.unstack(level=1)" ] @@ -2229,31 +2126,13 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, - "outputs": [ - { - "data": { - "text/plain": [ - "state year\n", - "California 2000 33871648\n", - " 2010 37253956\n", - "New York 2000 18976457\n", - " 2010 19378102\n", - "Texas 2000 20851820\n", - " 2010 25145561\n", - "dtype: int64" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pop.unstack().stack()" ] @@ -2274,82 +2153,13 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, - "outputs": [ - { - "data": { - "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", - "
stateyearpopulation
0California200033871648
1California201037253956
2New York200018976457
3New York201019378102
4Texas200020851820
5Texas201025145561
\n", - "
" - ], - "text/plain": [ - " state year population\n", - "0 California 2000 33871648\n", - "1 California 2010 37253956\n", - "2 New York 2000 18976457\n", - "3 New York 2010 19378102\n", - "4 Texas 2000 20851820\n", - "5 Texas 2010 25145561" - ] - }, - "execution_count": 41, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pop_flat = pop.reset_index(name='population')\n", "pop_flat" @@ -2368,78 +2178,13 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, - "outputs": [ - { - "data": { - "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", - "
population
stateyear
California200033871648
201037253956
New York200018976457
201019378102
Texas200020851820
201025145561
\n", - "
" - ], - "text/plain": [ - " population\n", - "state year \n", - "California 2000 33871648\n", - " 2010 37253956\n", - "New York 2000 18976457\n", - " 2010 19378102\n", - "Texas 2000 20851820\n", - " 2010 25145561" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pop_flat.set_index(['state', 'year'])" ] @@ -2471,105 +2216,13 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, - "outputs": [ - { - "data": { - "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", - "
subjectBobGuidoSue
typeHRTempHRTempHRTemp
yearvisit
2013131.038.732.036.735.037.2
244.037.750.035.029.036.7
2014130.037.439.037.861.036.9
247.037.848.037.351.036.5
\n", - "
" - ], - "text/plain": [ - "subject Bob Guido Sue \n", - "type HR Temp HR Temp HR Temp\n", - "year visit \n", - "2013 1 31.0 38.7 32.0 36.7 35.0 37.2\n", - " 2 44.0 37.7 50.0 35.0 29.0 36.7\n", - "2014 1 30.0 37.4 39.0 37.8 61.0 36.9\n", - " 2 47.0 37.8 48.0 37.3 51.0 36.5" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "health_data" ] @@ -2586,80 +2239,13 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, - "outputs": [ - { - "data": { - "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", - "
subjectBobGuidoSue
typeHRTempHRTempHRTemp
year
201337.538.241.035.8532.036.95
201438.537.643.537.5556.036.70
\n", - "
" - ], - "text/plain": [ - "subject Bob Guido Sue \n", - "type HR Temp HR Temp HR Temp\n", - "year \n", - "2013 37.5 38.2 41.0 35.85 32.0 36.95\n", - "2014 38.5 37.6 43.5 37.55 56.0 36.70" - ] - }, - "execution_count": 44, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "data_mean = health_data.mean(level='year')\n", "data_mean" @@ -2677,57 +2263,13 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": null, "metadata": { "collapsed": false, "deletable": true, "editable": true }, - "outputs": [ - { - "data": { - "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", - "
typeHRTemp
year
201336.83333337.000000
201446.00000037.283333
\n", - "
" - ], - "text/plain": [ - "type HR Temp\n", - "year \n", - "2013 36.833333 37.000000\n", - "2014 46.000000 37.283333" - ] - }, - "execution_count": 45, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "data_mean.mean(axis=1, level='type')" ] @@ -2796,9 +2338,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/03.06-Concat-And-Append.ipynb b/notebooks/03.06-Concat-And-Append.ipynb index 7566c851c..055084923 100644 --- a/notebooks/03.06-Concat-And-Append.ipynb +++ b/notebooks/03.06-Concat-And-Append.ipynb @@ -1632,9 +1632,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/03.12-Performance-Eval-and-Query.ipynb b/notebooks/03.12-Performance-Eval-and-Query.ipynb index b6e2a142b..8fc8a87af 100644 --- a/notebooks/03.12-Performance-Eval-and-Query.ipynb +++ b/notebooks/03.12-Performance-Eval-and-Query.ipynb @@ -1142,9 +1142,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/03.13-Further-Resources.ipynb b/notebooks/03.13-Further-Resources.ipynb index 16c8a8ebd..eb85bca31 100644 --- a/notebooks/03.13-Further-Resources.ipynb +++ b/notebooks/03.13-Further-Resources.ipynb @@ -88,9 +88,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/04.04-Density-and-Contour-Plots.ipynb b/notebooks/04.04-Density-and-Contour-Plots.ipynb index 3fea071b4..b088a7447 100644 --- a/notebooks/04.04-Density-and-Contour-Plots.ipynb +++ b/notebooks/04.04-Density-and-Contour-Plots.ipynb @@ -323,9 +323,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/04.06-Customizing-Legends.ipynb b/notebooks/04.06-Customizing-Legends.ipynb index ada12a045..27f4b377c 100644 --- a/notebooks/04.06-Customizing-Legends.ipynb +++ b/notebooks/04.06-Customizing-Legends.ipynb @@ -430,9 +430,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/04.11-Settings-and-Stylesheets.ipynb b/notebooks/04.11-Settings-and-Stylesheets.ipynb index bc8b6bcde..b3ce8c1ec 100644 --- a/notebooks/04.11-Settings-and-Stylesheets.ipynb +++ b/notebooks/04.11-Settings-and-Stylesheets.ipynb @@ -645,9 +645,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/04.13-Geographic-Data-With-Basemap.ipynb b/notebooks/04.13-Geographic-Data-With-Basemap.ipynb index b724893ad..abd1959e6 100644 --- a/notebooks/04.13-Geographic-Data-With-Basemap.ipynb +++ b/notebooks/04.13-Geographic-Data-With-Basemap.ipynb @@ -741,9 +741,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/04.14-Visualization-With-Seaborn.ipynb b/notebooks/04.14-Visualization-With-Seaborn.ipynb index 21817be21..d8249a20c 100644 --- a/notebooks/04.14-Visualization-With-Seaborn.ipynb +++ b/notebooks/04.14-Visualization-With-Seaborn.ipynb @@ -1791,9 +1791,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/04.15-Further-Resources.ipynb b/notebooks/04.15-Further-Resources.ipynb index 4aed29225..8e0673bcb 100644 --- a/notebooks/04.15-Further-Resources.ipynb +++ b/notebooks/04.15-Further-Resources.ipynb @@ -89,9 +89,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/05.04-Feature-Engineering.ipynb b/notebooks/05.04-Feature-Engineering.ipynb index 7315fb277..6b77e60fc 100644 --- a/notebooks/05.04-Feature-Engineering.ipynb +++ b/notebooks/05.04-Feature-Engineering.ipynb @@ -903,9 +903,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.6.5" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/notebooks/mprun_demo.py b/notebooks/mprun_demo.py new file mode 100644 index 000000000..a14e8d976 --- /dev/null +++ b/notebooks/mprun_demo.py @@ -0,0 +1,7 @@ +def sum_of_lists(N): + total = 0 + for i in range(5): + L = [j ^ (j >> i) for j in range(N)] + total += sum(L) + del L # remove reference to L + return total \ No newline at end of file