diff --git a/.gitignore b/.gitignore index 6321dc27f..fc94a546f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,51 @@ +# File created using '.gitignore Generator' for Visual Studio Code: https://bit.ly/vscode-gig + +# Created by https://www.toptal.com/developers/gitignore/api/jupyternotebooks,macos,python +# Edit at https://www.toptal.com/developers/gitignore?templates=jupyternotebooks,macos,python + +### JupyterNotebooks ### +# gitignore template for Jupyter Notebooks +# website: http://jupyter.org/ + +.ipynb_checkpoints +*/.ipynb_checkpoints/* + +# IPython +profile_default/ +ipython_config.py + +# Remove previous ipynb_checkpoints +# git rm -r .ipynb_checkpoints/ + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Python ### # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -8,7 +56,6 @@ __pycache__/ # Distribution / packaging .Python -env/ build/ develop-eggs/ dist/ @@ -20,9 +67,12 @@ lib64/ parts/ sdist/ var/ +wheels/ +share/python-wheels/ *.egg-info/ .installed.cfg *.egg +MANIFEST # PyInstaller # Usually these files are written by a python script from a template @@ -37,13 +87,17 @@ pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ +.nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml -*,cover +*.cover +*.py,cover .hypothesis/ +.pytest_cache/ +cover/ # Translations *.mo @@ -52,6 +106,8 @@ coverage.xml # Django stuff: *.log local_settings.py +db.sqlite3 +db.sqlite3-journal # Flask stuff: instance/ @@ -64,39 +120,83 @@ instance/ docs/_build/ # PyBuilder +.pybuilder/ target/ -# IPython Notebook -.ipynb_checkpoints +# Jupyter Notebook -# pyenv -.python-version +# IPython -# celery beat schedule file +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff celerybeat-schedule +celerybeat.pid -# dotenv -.env +# SageMath parsed files +*.sage.py -# virtualenv +# Environments +.env +.venv +env/ venv/ ENV/ +env.bak/ +venv.bak/ # Spyder project settings .spyderproject +.spyproject # Rope project settings .ropeproject +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ -# Emacs -*~ +# End of https://www.toptal.com/developers/gitignore/api/jupyternotebooks,macos,python +# Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option) -# Temporary data files -notebooks/recipeitems-latest.json -notebooks/FremontBridge.csv -notebooks/gistemp250.nc -notebooks/marathon-data.csv -notebooks/my_figure.png -notebooks/hello.png \ No newline at end of file diff --git a/notebooks/00.00-Preface.ipynb b/notebooks/00.00-Preface.ipynb index 7d635a808..5828f7a19 100644 --- a/notebooks/00.00-Preface.ipynb +++ b/notebooks/00.00-Preface.ipynb @@ -195,9 +195,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/01.00-IPython-Beyond-Normal-Python.ipynb b/notebooks/01.00-IPython-Beyond-Normal-Python.ipynb index 5d01277e6..0d6889c7a 100644 --- a/notebooks/01.00-IPython-Beyond-Normal-Python.ipynb +++ b/notebooks/01.00-IPython-Beyond-Normal-Python.ipynb @@ -144,9 +144,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/01.01-Help-And-Documentation.ipynb b/notebooks/01.01-Help-And-Documentation.ipynb index 39879ee90..393b23d57 100644 --- a/notebooks/01.01-Help-And-Documentation.ipynb +++ b/notebooks/01.01-Help-And-Documentation.ipynb @@ -333,9 +333,9 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [conda env:py3k]", "language": "python", - "name": "python3" + "name": "conda-env-py3k-py" }, "language_info": { "codemirror_mode": { @@ -347,9 +347,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/01.02-Shell-Keyboard-Shortcuts.ipynb b/notebooks/01.02-Shell-Keyboard-Shortcuts.ipynb index f50e9fb1c..81f3a90bf 100644 --- a/notebooks/01.02-Shell-Keyboard-Shortcuts.ipynb +++ b/notebooks/01.02-Shell-Keyboard-Shortcuts.ipynb @@ -185,9 +185,9 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [conda env:py3k]", "language": "python", - "name": "python3" + "name": "conda-env-py3k-py" }, "language_info": { "codemirror_mode": { @@ -199,9 +199,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/01.03-Magic-Commands.ipynb b/notebooks/01.03-Magic-Commands.ipynb index e5ee9d164..61fa7a6a0 100644 --- a/notebooks/01.03-Magic-Commands.ipynb +++ b/notebooks/01.03-Magic-Commands.ipynb @@ -230,9 +230,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/01.04-Input-Output-History.ipynb b/notebooks/01.04-Input-Output-History.ipynb index c8e5463fe..b06eb76fd 100644 --- a/notebooks/01.04-Input-Output-History.ipynb +++ b/notebooks/01.04-Input-Output-History.ipynb @@ -214,9 +214,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/01.05-IPython-And-Shell-Commands.ipynb b/notebooks/01.05-IPython-And-Shell-Commands.ipynb index 6fe0dd875..94a6efcf4 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.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/01.06-Errors-and-Debugging.ipynb b/notebooks/01.06-Errors-and-Debugging.ipynb index a7625d5ef..446c7ee5c 100644 --- a/notebooks/01.06-Errors-and-Debugging.ipynb +++ b/notebooks/01.06-Errors-and-Debugging.ipynb @@ -53,13 +53,17 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ "def func1(a, b):\n", " return a / b\n", "\n", + "\n", "def func2(x):\n", " a = x\n", " b = x - 1\n", @@ -70,7 +74,10 @@ "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -78,10 +85,11 @@ "evalue": "division by zero", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mfunc2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mfunc2\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m\u001b[0m in \u001b[0;36mfunc1\u001b[0;34m(a, b)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfunc2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mfunc2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mfunc2\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m\u001b[0m in \u001b[0;36mfunc1\u001b[0;34m(a, b)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfunc2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mZeroDivisionError\u001b[0m: division by zero" ] } @@ -107,7 +115,10 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -126,7 +137,10 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -135,9 +149,9 @@ "output_type": "error", "traceback": [ "Traceback \u001b[0;36m(most recent call last)\u001b[0m:\n", - " File \u001b[1;32m\"\"\u001b[0m, line \u001b[1;32m1\u001b[0m, in \u001b[1;35m\u001b[0m\n func2(1)\n", - " File \u001b[1;32m\"\"\u001b[0m, line \u001b[1;32m7\u001b[0m, in \u001b[1;35mfunc2\u001b[0m\n return func1(a, b)\n", - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0;36m, in \u001b[0;35mfunc1\u001b[0;36m\u001b[0m\n\u001b[0;31m return a / b\u001b[0m\n", + " File \u001b[1;32m\"\"\u001b[0m, line \u001b[1;32m1\u001b[0m, in \u001b[1;35m\u001b[0m\n func2(1)\n", + " File \u001b[1;32m\"\"\u001b[0m, line \u001b[1;32m8\u001b[0m, in \u001b[1;35mfunc2\u001b[0m\n return func1(a, b)\n", + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0;36m, in \u001b[0;35mfunc1\u001b[0;36m\u001b[0m\n\u001b[0;31m return a / b\u001b[0m\n", "\u001b[0;31mZeroDivisionError\u001b[0m\u001b[0;31m:\u001b[0m division by zero\n" ] } @@ -157,7 +171,10 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -176,7 +193,10 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -184,10 +204,11 @@ "evalue": "division by zero", "output_type": "error", "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mfunc2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m \u001b[0;36mglobal\u001b[0m \u001b[0;36mfunc2\u001b[0m \u001b[0;34m= \u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mfunc2\u001b[0;34m(x=1)\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m \u001b[0;36mglobal\u001b[0m \u001b[0;36mfunc1\u001b[0m \u001b[0;34m= \u001b[0m\u001b[0;34m\n \u001b[0m\u001b[0;36ma\u001b[0m \u001b[0;34m= 1\u001b[0m\u001b[0;34m\n \u001b[0m\u001b[0;36mb\u001b[0m \u001b[0;34m= 0\u001b[0m\n", - "\u001b[0;32m\u001b[0m in \u001b[0;36mfunc1\u001b[0;34m(a=1, b=0)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m \u001b[0;36ma\u001b[0m \u001b[0;34m= 1\u001b[0m\u001b[0;34m\n \u001b[0m\u001b[0;36mb\u001b[0m \u001b[0;34m= 0\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfunc2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mfunc2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m \u001b[0;36mglobal\u001b[0m \u001b[0;36mfunc2\u001b[0m \u001b[0;34m= \u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mfunc2\u001b[0;34m(x=1)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m \u001b[0;36mglobal\u001b[0m \u001b[0;36mfunc1\u001b[0m \u001b[0;34m= \u001b[0m\u001b[0;34m\n \u001b[0m\u001b[0;36ma\u001b[0m \u001b[0;34m= 1\u001b[0m\u001b[0;34m\n \u001b[0m\u001b[0;36mb\u001b[0m \u001b[0;34m= 0\u001b[0m\n", + "\u001b[0;32m\u001b[0m in \u001b[0;36mfunc1\u001b[0;34m(a=1, b=0)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m \u001b[0;36ma\u001b[0m \u001b[0;34m= 1\u001b[0m\u001b[0;34m\n \u001b[0m\u001b[0;36mb\u001b[0m \u001b[0;34m= 0\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfunc2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mZeroDivisionError\u001b[0m: division by zero" ] } @@ -230,23 +251,45 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "> \u001b[0;32m\u001b[0m(2)\u001b[0;36mfunc1\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m 1 \u001b[0;31m\u001b[0;32mdef\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\u001b[0;32m----> 2 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "> \u001b[0;32m\u001b[0m(2)\u001b[0;36mfunc1\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m 1 \u001b[0;31m\u001b[0;32mdef\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m----> 2 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 3 \u001b[0;31m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\n", - "ipdb> print(a)\n", - "1\n", - "ipdb> print(b)\n", - "0\n", - "ipdb> quit\n" + "\u001b[0m\u001b[0;32m 4 \u001b[0;31m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m 5 \u001b[0;31m\u001b[0;32mdef\u001b[0m \u001b[0mfunc2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> a\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a = 1\n", + "b = 0\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> quit\n" ] } ], @@ -265,37 +308,45 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "> \u001b[0;32m\u001b[0m(2)\u001b[0;36mfunc1\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m 1 \u001b[0;31m\u001b[0;32mdef\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\u001b[0;32m----> 2 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "> \u001b[0;32m\u001b[0m(2)\u001b[0;36mfunc1\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m 1 \u001b[0;31m\u001b[0;32mdef\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m----> 2 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 3 \u001b[0;31m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\n", - "ipdb> up\n", - "> \u001b[0;32m\u001b[0m(7)\u001b[0;36mfunc2\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m 5 \u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\u001b[0;32m 6 \u001b[0;31m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\u001b[0;32m----> 7 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\n", - "ipdb> print(x)\n", - "1\n", - "ipdb> up\n", - "> \u001b[0;32m\u001b[0m(1)\u001b[0;36m\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m----> 1 \u001b[0;31m\u001b[0mfunc2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\n", - "ipdb> down\n", - "> \u001b[0;32m\u001b[0m(7)\u001b[0;36mfunc2\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m 5 \u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\u001b[0;32m 6 \u001b[0;31m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\u001b[0;32m----> 7 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\n", - "ipdb> quit\n" + "\u001b[0m\u001b[0;32m 4 \u001b[0;31m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m 5 \u001b[0;31m\u001b[0;32mdef\u001b[0m \u001b[0mfunc2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> a\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a = 1\n", + "b = 0\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> quit\n" ] } ], @@ -316,7 +367,10 @@ "cell_type": "code", "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -333,9 +387,9 @@ "output_type": "error", "traceback": [ "Traceback \u001b[0;36m(most recent call last)\u001b[0m:\n", - " File \u001b[1;32m\"\"\u001b[0m, line \u001b[1;32m3\u001b[0m, in \u001b[1;35m\u001b[0m\n func2(1)\n", - " File \u001b[1;32m\"\"\u001b[0m, line \u001b[1;32m7\u001b[0m, in \u001b[1;35mfunc2\u001b[0m\n return func1(a, b)\n", - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0;36m, in \u001b[0;35mfunc1\u001b[0;36m\u001b[0m\n\u001b[0;31m return a / b\u001b[0m\n", + " File \u001b[1;32m\"\"\u001b[0m, line \u001b[1;32m3\u001b[0m, in \u001b[1;35m\u001b[0m\n func2(1)\n", + " File \u001b[1;32m\"\"\u001b[0m, line \u001b[1;32m8\u001b[0m, in \u001b[1;35mfunc2\u001b[0m\n return func1(a, b)\n", + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0;36m, in \u001b[0;35mfunc1\u001b[0;36m\u001b[0m\n\u001b[0;31m return a / b\u001b[0m\n", "\u001b[0;31mZeroDivisionError\u001b[0m\u001b[0;31m:\u001b[0m division by zero\n" ] }, @@ -343,14 +397,35 @@ "name": "stdout", "output_type": "stream", "text": [ - "> \u001b[0;32m\u001b[0m(2)\u001b[0;36mfunc1\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m 1 \u001b[0;31m\u001b[0;32mdef\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\u001b[0;32m----> 2 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "> \u001b[0;32m\u001b[0m(2)\u001b[0;36mfunc1\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m 1 \u001b[0;31m\u001b[0;32mdef\u001b[0m \u001b[0mfunc1\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m----> 2 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 3 \u001b[0;31m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\n", - "ipdb> print(b)\n", - "0\n", - "ipdb> quit\n" + "\u001b[0m\u001b[0;32m 4 \u001b[0;31m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m 5 \u001b[0;31m\u001b[0;32mdef\u001b[0m \u001b[0mfunc2\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> a\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a = 1\n", + "b = 0\n" + ] + }, + { + "name": "stdin", + "output_type": "stream", + "text": [ + "ipdb> quit\n" ] } ], @@ -404,9 +479,9 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [conda env:py3k]", "language": "python", - "name": "python3" + "name": "conda-env-py3k-py" }, "language_info": { "codemirror_mode": { @@ -418,9 +493,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/01.07-Timing-and-Profiling.ipynb b/notebooks/01.07-Timing-and-Profiling.ipynb index 76f0db5cb..9b085d229 100644 --- a/notebooks/01.07-Timing-and-Profiling.ipynb +++ b/notebooks/01.07-Timing-and-Profiling.ipynb @@ -69,7 +69,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "100000 loops, best of 3: 1.54 µs per loop\n" + "891 ns ± 57 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)\n" ] } ], @@ -94,7 +94,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "1 loops, best of 3: 407 ms per loop\n" + "341 ms ± 30.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], @@ -124,7 +124,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "100 loops, best of 3: 1.9 ms per loop\n" + "476 µs ± 23.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" ] } ], @@ -152,8 +152,8 @@ "output_type": "stream", "text": [ "sorting an unsorted list:\n", - "CPU times: user 40.6 ms, sys: 896 µs, total: 41.5 ms\n", - "Wall time: 41.5 ms\n" + "CPU times: user 20 ms, sys: 694 µs, total: 20.7 ms\n", + "Wall time: 20.2 ms\n" ] } ], @@ -174,8 +174,8 @@ "output_type": "stream", "text": [ "sorting an already sorted list:\n", - "CPU times: user 8.18 ms, sys: 10 µs, total: 8.19 ms\n", - "Wall time: 8.24 ms\n" + "CPU times: user 1.04 ms, sys: 1 µs, total: 1.04 ms\n", + "Wall time: 1.05 ms\n" ] } ], @@ -205,8 +205,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 504 ms, sys: 979 µs, total: 505 ms\n", - "Wall time: 505 ms\n" + "CPU times: user 439 ms, sys: 3.92 ms, total: 443 ms\n", + "Wall time: 443 ms\n" ] } ], @@ -269,6 +269,25 @@ "text": [ " " ] + }, + { + "data": { + "text/plain": [ + " 14 function calls in 0.731 seconds\n", + "\n", + " Ordered by: internal time\n", + "\n", + " ncalls tottime percall cumtime percall filename:lineno(function)\n", + " 5 0.630 0.126 0.630 0.126 :4()\n", + " 5 0.046 0.009 0.046 0.009 {built-in method builtins.sum}\n", + " 1 0.041 0.041 0.718 0.718 :1(sum_of_lists)\n", + " 1 0.013 0.013 0.731 0.731 :1()\n", + " 1 0.000 0.000 0.731 0.731 {built-in method builtins.exec}\n", + " 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -308,10 +327,10 @@ "\n", "The function-by-function profiling of ``%prun`` is useful, but sometimes it's more convenient to have a line-by-line profile report.\n", "This is not built into Python or IPython, but there is a ``line_profiler`` package available for installation that can do this.\n", - "Start by using Python's packaging tool, ``pip``, to install the ``line_profiler`` package:\n", + "Start by using Python's packaging tool, ``pip`` (or `conda`), to install the ``line_profiler`` package:\n", "\n", "```\n", - "$ pip install line_profiler\n", + "$ conda install line_profiler\n", "```\n", "\n", "Next, you can use IPython to load the ``line_profiler`` IPython extension, offered as part of this package:" @@ -319,7 +338,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -335,9 +354,32 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Timer unit: 1e-06 s\n", + "\n", + "Total time: 0.006939 s\n", + "File: \n", + "Function: sum_of_lists at line 1\n", + "\n", + "Line # Hits Time Per Hit % Time Line Contents\n", + "==============================================================\n", + " 1 def sum_of_lists(N):\n", + " 2 1 1.0 1.0 0.0 total = 0\n", + " 3 6 4.0 0.7 0.1 for i in range(5):\n", + " 4 5 6753.0 1350.6 97.3 L = [j ^ (j >> i) for j in range(N)]\n", + " 5 5 180.0 36.0 2.6 total += sum(L)\n", + " 6 1 1.0 1.0 0.0 return total" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "%lprun -f sum_of_lists sum_of_lists(5000)" ] @@ -379,10 +421,10 @@ "\n", "Another aspect of profiling is the amount of memory an operation uses.\n", "This can be evaluated with another IPython extension, the ``memory_profiler``.\n", - "As with the ``line_profiler``, we start by ``pip``-installing the extension:\n", + "As with the ``line_profiler``, we start by ``pip`` (or `conda`) to install the extension:\n", "\n", "```\n", - "$ pip install memory_profiler\n", + "$ conda install memory_profiler\n", "```\n", "\n", "Then we can use IPython to load the extension:" @@ -390,9 +432,18 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The memory_profiler extension is already loaded. To reload it, use:\n", + " %reload_ext memory_profiler\n" + ] + } + ], "source": [ "%load_ext memory_profiler" ] @@ -407,14 +458,14 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "peak memory: 100.08 MiB, increment: 61.36 MiB\n" + "peak memory: 123.43 MiB, increment: 68.98 MiB\n" ] } ], @@ -434,14 +485,14 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Overwriting mprun_demo.py\n" + "Writing mprun_demo.py\n" ] } ], @@ -465,7 +516,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -474,6 +525,25 @@ "text": [ "\n" ] + }, + { + "data": { + "text/plain": [ + "Filename: /Users/evrard/Documents/GitHub/PythonDataScienceHandbook-fork/notebooks/mprun_demo.py\n", + "\n", + "Line # Mem usage Increment Occurences Line Contents\n", + "============================================================\n", + " 1 55.3 MiB 55.3 MiB 1 def sum_of_lists(N):\n", + " 2 55.3 MiB 0.0 MiB 1 total = 0\n", + " 3 63.6 MiB -46.1 MiB 6 for i in range(5):\n", + " 4 89.7 MiB -59178580.1 MiB 5000015 L = [j ^ (j >> i) for j in range(N)]\n", + " 5 94.3 MiB 18.4 MiB 5 total += sum(L)\n", + " 6 63.6 MiB -169.0 MiB 5 del L # remove reference to L\n", + " 7 52.1 MiB -11.5 MiB 1 return total" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -526,9 +596,9 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python [default]", + "display_name": "Python [conda env:py3k]", "language": "python", - "name": "python3" + "name": "conda-env-py3k-py" }, "language_info": { "codemirror_mode": { @@ -540,9 +610,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 4 } diff --git a/notebooks/01.08-More-IPython-Resources.ipynb b/notebooks/01.08-More-IPython-Resources.ipynb index ad87f002d..a18fc3217 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.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/02.00-Introduction-to-NumPy.ipynb b/notebooks/02.00-Introduction-to-NumPy.ipynb index e527c4355..78e2150df 100644 --- a/notebooks/02.00-Introduction-to-NumPy.ipynb +++ b/notebooks/02.00-Introduction-to-NumPy.ipynb @@ -73,13 +73,16 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "'1.11.1'" + "'1.19.2'" ] }, "execution_count": 1, @@ -89,6 +92,7 @@ ], "source": [ "import numpy\n", + "\n", "numpy.__version__" ] }, @@ -109,7 +113,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ @@ -169,9 +176,9 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [conda env:py3k]", "language": "python", - "name": "python3" + "name": "conda-env-py3k-py" }, "language_info": { "codemirror_mode": { @@ -183,9 +190,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/02.01-Understanding-Data-Types.ipynb b/notebooks/02.01-Understanding-Data-Types.ipynb index 82b128e48..4f7af4b9a 100644 --- a/notebooks/02.01-Understanding-Data-Types.ipynb +++ b/notebooks/02.01-Understanding-Data-Types.ipynb @@ -141,7 +141,10 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -164,7 +167,10 @@ "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -193,7 +199,10 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -216,7 +225,10 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -245,7 +257,10 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -304,7 +319,10 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -342,7 +360,10 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ @@ -362,7 +383,10 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -393,13 +417,16 @@ "cell_type": "code", "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "array([ 3.14, 4. , 2. , 3. ])" + "array([3.14, 4. , 2. , 3. ])" ] }, "execution_count": 9, @@ -422,13 +449,16 @@ "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "array([ 1., 2., 3., 4.], dtype=float32)" + "array([1., 2., 3., 4.], dtype=float32)" ] }, "execution_count": 10, @@ -451,7 +481,10 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -493,7 +526,10 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -516,15 +552,18 @@ "cell_type": "code", "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "array([[ 1., 1., 1., 1., 1.],\n", - " [ 1., 1., 1., 1., 1.],\n", - " [ 1., 1., 1., 1., 1.]])" + "array([[1., 1., 1., 1., 1.],\n", + " [1., 1., 1., 1., 1.],\n", + " [1., 1., 1., 1., 1.]])" ] }, "execution_count": 13, @@ -541,15 +580,18 @@ "cell_type": "code", "execution_count": 14, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "array([[ 3.14, 3.14, 3.14, 3.14, 3.14],\n", - " [ 3.14, 3.14, 3.14, 3.14, 3.14],\n", - " [ 3.14, 3.14, 3.14, 3.14, 3.14]])" + "array([[3.14, 3.14, 3.14, 3.14, 3.14],\n", + " [3.14, 3.14, 3.14, 3.14, 3.14],\n", + " [3.14, 3.14, 3.14, 3.14, 3.14]])" ] }, "execution_count": 14, @@ -566,7 +608,10 @@ "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -591,13 +636,16 @@ "cell_type": "code", "execution_count": 16, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "array([ 0. , 0.25, 0.5 , 0.75, 1. ])" + "array([0. , 0.25, 0.5 , 0.75, 1. ])" ] }, "execution_count": 16, @@ -614,15 +662,18 @@ "cell_type": "code", "execution_count": 17, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "array([[ 0.99844933, 0.52183819, 0.22421193],\n", - " [ 0.08007488, 0.45429293, 0.20941444],\n", - " [ 0.14360941, 0.96910973, 0.946117 ]])" + "array([[0.03526603, 0.04579856, 0.30735613],\n", + " [0.84758384, 0.88839896, 0.61820317],\n", + " [0.27470506, 0.85873925, 0.05836655]])" ] }, "execution_count": 17, @@ -640,15 +691,18 @@ "cell_type": "code", "execution_count": 18, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "array([[ 1.51772646, 0.39614948, -0.10634696],\n", - " [ 0.25671348, 0.00732722, 0.37783601],\n", - " [ 0.68446945, 0.15926039, -0.70744073]])" + "array([[ 0.80333608, 0.0906819 , 0.05903283],\n", + " [-0.92533693, -0.08616984, -0.10378843],\n", + " [ 0.39269173, 0.74022239, -0.41236877]])" ] }, "execution_count": 18, @@ -666,15 +720,18 @@ "cell_type": "code", "execution_count": 19, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "array([[2, 3, 4],\n", - " [5, 7, 8],\n", - " [0, 5, 0]])" + "array([[4, 9, 6],\n", + " [8, 4, 0],\n", + " [8, 9, 1]])" ] }, "execution_count": 19, @@ -691,15 +748,18 @@ "cell_type": "code", "execution_count": 20, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "array([[ 1., 0., 0.],\n", - " [ 0., 1., 0.],\n", - " [ 0., 0., 1.]])" + "array([[1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.]])" ] }, "execution_count": 20, @@ -716,7 +776,10 @@ "cell_type": "code", "execution_count": 21, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -808,9 +871,9 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [conda env:py3k]", "language": "python", - "name": "python3" + "name": "conda-env-py3k-py" }, "language_info": { "codemirror_mode": { @@ -822,9 +885,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/03.01-Introducing-Pandas-Objects.ipynb b/notebooks/03.01-Introducing-Pandas-Objects.ipynb index 2e5f8f7b3..8758bfcbf 100644 --- a/notebooks/03.01-Introducing-Pandas-Objects.ipynb +++ b/notebooks/03.01-Introducing-Pandas-Objects.ipynb @@ -44,7 +44,7 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": true + "tags": [] }, "outputs": [], "source": [ @@ -66,7 +66,10 @@ "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -101,13 +104,16 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "array([ 0.25, 0.5 , 0.75, 1. ])" + "array([0.25, 0.5 , 0.75, 1. ])" ] }, "execution_count": 3, @@ -130,7 +136,10 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -159,7 +168,10 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -181,7 +193,10 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -230,7 +245,10 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -249,8 +267,7 @@ } ], "source": [ - "data = pd.Series([0.25, 0.5, 0.75, 1.0],\n", - " index=['a', 'b', 'c', 'd'])\n", + "data = pd.Series([0.25, 0.5, 0.75, 1.0], index=[\"a\", \"b\", \"c\", \"d\"])\n", "data" ] }, @@ -265,7 +282,10 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -280,7 +300,7 @@ } ], "source": [ - "data['b']" + "data[\"b\"]" ] }, { @@ -294,7 +314,10 @@ "cell_type": "code", "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -313,8 +336,7 @@ } ], "source": [ - "data = pd.Series([0.25, 0.5, 0.75, 1.0],\n", - " index=[2, 5, 3, 7])\n", + "data = pd.Series([0.25, 0.5, 0.75, 1.0], index=[2, 5, 3, 7])\n", "data" ] }, @@ -322,7 +344,10 @@ "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -357,17 +382,20 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ "California 38332521\n", + "Texas 26448193\n", + "New York 19651127\n", "Florida 19552860\n", "Illinois 12882135\n", - "New York 19651127\n", - "Texas 26448193\n", "dtype: int64" ] }, @@ -377,11 +405,13 @@ } ], "source": [ - "population_dict = {'California': 38332521,\n", - " 'Texas': 26448193,\n", - " 'New York': 19651127,\n", - " 'Florida': 19552860,\n", - " 'Illinois': 12882135}\n", + "population_dict = {\n", + " \"California\": 38332521,\n", + " \"Texas\": 26448193,\n", + " \"New York\": 19651127,\n", + " \"Florida\": 19552860,\n", + " \"Illinois\": 12882135,\n", + "}\n", "population = pd.Series(population_dict)\n", "population" ] @@ -398,7 +428,10 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -413,7 +446,7 @@ } ], "source": [ - "population['California']" + "population[\"California\"]" ] }, { @@ -427,7 +460,10 @@ "cell_type": "code", "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -445,7 +481,7 @@ } ], "source": [ - "population['California':'Illinois']" + "population[\"California\" : \"Illinois\"]" ] }, { @@ -474,9 +510,12 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -488,7 +527,7 @@ "dtype: int64" ] }, - "execution_count": 14, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -506,9 +545,12 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -520,7 +562,7 @@ "dtype: int64" ] }, - "execution_count": 15, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -538,27 +580,30 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "1 b\n", "2 a\n", + "1 b\n", "3 c\n", "dtype: object" ] }, - "execution_count": 16, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "pd.Series({2:'a', 1:'b', 3:'c'})" + "pd.Series({2: \"a\", 1: \"b\", 3: \"c\"})" ] }, { @@ -570,9 +615,12 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -583,13 +631,13 @@ "dtype: object" ] }, - "execution_count": 17, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "pd.Series({2:'a', 1:'b', 3:'c'}, index=[3, 2])" + "pd.Series({2: \"a\", 1: \"b\", 3: \"c\"}, index=[3, 2])" ] }, { @@ -624,30 +672,38 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ "California 423967\n", + "Texas 695662\n", + "New York 141297\n", "Florida 170312\n", "Illinois 149995\n", - "New York 141297\n", - "Texas 695662\n", "dtype: int64" ] }, - "execution_count": 18, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "area_dict = {'California': 423967, 'Texas': 695662, 'New York': 141297,\n", - " 'Florida': 170312, 'Illinois': 149995}\n", + "area_dict = {\n", + " \"California\": 423967,\n", + " \"Texas\": 695662,\n", + " \"New York\": 141297,\n", + " \"Florida\": 170312,\n", + " \"Illinois\": 149995,\n", + "}\n", "area = pd.Series(area_dict)\n", "area" ] @@ -661,70 +717,85 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "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", "
areapopulationarea
California42396738332521423967
Florida17031219552860
Illinois14999512882135Texas26448193695662
New York14129719651127141297
Texas69566226448193Florida19552860170312
Illinois12882135149995
\n", "
" ], "text/plain": [ - " area population\n", - "California 423967 38332521\n", - "Florida 170312 19552860\n", - "Illinois 149995 12882135\n", - "New York 141297 19651127\n", - "Texas 695662 26448193" + " population area\n", + "California 38332521 423967\n", + "Texas 26448193 695662\n", + "New York 19651127 141297\n", + "Florida 19552860 170312\n", + "Illinois 12882135 149995" ] }, - "execution_count": 19, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "states = pd.DataFrame({'population': population,\n", - " 'area': area})\n", + "states = pd.DataFrame({\"population\": population, \"area\": area})\n", "states" ] }, @@ -737,18 +808,21 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "Index(['California', 'Florida', 'Illinois', 'New York', 'Texas'], dtype='object')" + "Index(['California', 'Texas', 'New York', 'Florida', 'Illinois'], dtype='object')" ] }, - "execution_count": 20, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -766,18 +840,21 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "Index(['area', 'population'], dtype='object')" + "Index(['population', 'area'], dtype='object')" ] }, - "execution_count": 21, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -806,29 +883,32 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ "California 423967\n", + "Texas 695662\n", + "New York 141297\n", "Florida 170312\n", "Illinois 149995\n", - "New York 141297\n", - "Texas 695662\n", "Name: area, dtype: int64" ] }, - "execution_count": 22, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "states['area']" + "states[\"area\"]" ] }, { @@ -861,15 +941,31 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -883,20 +979,20 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
38332521
Florida19552860
Illinois12882135Texas26448193
New York19651127
Texas26448193Florida19552860
Illinois12882135
\n", @@ -905,19 +1001,19 @@ "text/plain": [ " population\n", "California 38332521\n", - "Florida 19552860\n", - "Illinois 12882135\n", + "Texas 26448193\n", "New York 19651127\n", - "Texas 26448193" + "Florida 19552860\n", + "Illinois 12882135" ] }, - "execution_count": 23, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "pd.DataFrame(population, columns=['population'])" + "pd.DataFrame(population, columns=[\"population\"])" ] }, { @@ -934,13 +1030,29 @@ "cell_type": "code", "execution_count": 24, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -982,8 +1094,7 @@ } ], "source": [ - "data = [{'a': i, 'b': 2 * i}\n", - " for i in range(3)]\n", + "data = [{\"a\": i, \"b\": 2 * i} for i in range(3)]\n", "pd.DataFrame(data)" ] }, @@ -996,15 +1107,31 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 27, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "
\n", " \n", " \n", @@ -1037,13 +1164,13 @@ "1 NaN 3 4.0" ] }, - "execution_count": 25, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "pd.DataFrame([{'a': 1, 'b': 2}, {'b': 3, 'c': 4}])" + "pd.DataFrame([{\"a\": 1, \"b\": 2}, {\"b\": 3, \"c\": 4}])" ] }, { @@ -1057,70 +1184,85 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 28, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "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", "
areapopulationarea
California42396738332521423967
Florida17031219552860
Illinois14999512882135Texas26448193695662
New York14129719651127141297
Texas69566226448193Florida19552860170312
Illinois12882135149995
\n", "
" ], "text/plain": [ - " area population\n", - "California 423967 38332521\n", - "Florida 170312 19552860\n", - "Illinois 149995 12882135\n", - "New York 141297 19651127\n", - "Texas 695662 26448193" + " population area\n", + "California 38332521 423967\n", + "Texas 26448193 695662\n", + "New York 19651127 141297\n", + "Florida 19552860 170312\n", + "Illinois 12882135 149995" ] }, - "execution_count": 26, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "pd.DataFrame({'population': population,\n", - " 'area': area})" + "pd.DataFrame({\"population\": population, \"area\": area})" ] }, { @@ -1135,15 +1277,31 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 29, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1155,18 +1313,18 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
a0.8652570.2131690.2295450.214515
b0.4427590.1082670.9892480.548080
c0.0471100.9057180.7525130.149196
\n", @@ -1174,20 +1332,20 @@ ], "text/plain": [ " foo bar\n", - "a 0.865257 0.213169\n", - "b 0.442759 0.108267\n", - "c 0.047110 0.905718" + "a 0.229545 0.214515\n", + "b 0.989248 0.548080\n", + "c 0.752513 0.149196" ] }, - "execution_count": 27, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "pd.DataFrame(np.random.rand(3, 2),\n", - " columns=['foo', 'bar'],\n", - " index=['a', 'b', 'c'])" + "pd.DataFrame(\n", + " np.random.rand(3, 2), columns=[\"foo\", \"bar\"], index=[\"a\", \"b\", \"c\"]\n", + ")" ] }, { @@ -1204,7 +1362,10 @@ "cell_type": "code", "execution_count": 28, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1220,7 +1381,7 @@ } ], "source": [ - "A = np.zeros(3, dtype=[('A', 'i8'), ('B', 'f8')])\n", + "A = np.zeros(3, dtype=[(\"A\", \"i8\"), (\"B\", \"f8\")])\n", "A" ] }, @@ -1228,7 +1389,10 @@ "cell_type": "code", "execution_count": 29, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1295,7 +1459,10 @@ "cell_type": "code", "execution_count": 30, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1328,7 +1495,10 @@ "cell_type": "code", "execution_count": 31, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1350,7 +1520,10 @@ "cell_type": "code", "execution_count": 32, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1379,7 +1552,10 @@ "cell_type": "code", "execution_count": 33, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1405,7 +1581,10 @@ "cell_type": "code", "execution_count": 34, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1446,7 +1625,10 @@ "cell_type": "code", "execution_count": 35, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ @@ -1458,7 +1640,10 @@ "cell_type": "code", "execution_count": 36, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1480,7 +1665,10 @@ "cell_type": "code", "execution_count": 37, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1502,7 +1690,10 @@ "cell_type": "code", "execution_count": 38, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1541,9 +1732,9 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [conda env:py3k]", "language": "python", - "name": "python3" + "name": "conda-env-py3k-py" }, "language_info": { "codemirror_mode": { @@ -1555,9 +1746,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.11" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/03.02-Data-Indexing-and-Selection.ipynb b/notebooks/03.02-Data-Indexing-and-Selection.ipynb index 9cce1353f..75027cdb4 100644 --- a/notebooks/03.02-Data-Indexing-and-Selection.ipynb +++ b/notebooks/03.02-Data-Indexing-and-Selection.ipynb @@ -64,7 +64,10 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -84,8 +87,8 @@ ], "source": [ "import pandas as pd\n", - "data = pd.Series([0.25, 0.5, 0.75, 1.0],\n", - " index=['a', 'b', 'c', 'd'])\n", + "\n", + "data = pd.Series([0.25, 0.5, 0.75, 1.0], index=[\"a\", \"b\", \"c\", \"d\"])\n", "data" ] }, @@ -93,7 +96,10 @@ "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -108,7 +114,7 @@ } ], "source": [ - "data['b']" + "data[\"b\"]" ] }, { @@ -122,7 +128,10 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -137,14 +146,17 @@ } ], "source": [ - "'a' in data" + "\"a\" in data" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -166,7 +178,10 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -196,7 +211,10 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -216,7 +234,7 @@ } ], "source": [ - "data['e'] = 1.25\n", + "data[\"e\"] = 1.25\n", "data" ] }, @@ -246,7 +264,10 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -265,14 +286,17 @@ ], "source": [ "# slicing by explicit index\n", - "data['a':'c']" + "data[\"a\":\"c\"]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -297,7 +321,10 @@ "cell_type": "code", "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -322,7 +349,10 @@ "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -340,7 +370,7 @@ ], "source": [ "# fancy indexing\n", - "data[['a', 'e']]" + "data[[\"a\", \"e\"]]" ] }, { @@ -365,7 +395,10 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -383,7 +416,7 @@ } ], "source": [ - "data = pd.Series(['a', 'b', 'c'], index=[1, 3, 5])\n", + "data = pd.Series([\"a\", \"b\", \"c\"], index=[1, 3, 5])\n", "data" ] }, @@ -391,7 +424,10 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -414,7 +450,10 @@ "cell_type": "code", "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -449,7 +488,10 @@ "cell_type": "code", "execution_count": 14, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -471,7 +513,10 @@ "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -502,7 +547,10 @@ "cell_type": "code", "execution_count": 16, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -524,7 +572,10 @@ "cell_type": "code", "execution_count": 17, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -579,7 +630,10 @@ "cell_type": "code", "execution_count": 18, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -639,13 +693,25 @@ } ], "source": [ - "area = pd.Series({'California': 423967, 'Texas': 695662,\n", - " 'New York': 141297, 'Florida': 170312,\n", - " 'Illinois': 149995})\n", - "pop = pd.Series({'California': 38332521, 'Texas': 26448193,\n", - " 'New York': 19651127, 'Florida': 19552860,\n", - " 'Illinois': 12882135})\n", - "data = pd.DataFrame({'area':area, 'pop':pop})\n", + "area = pd.Series(\n", + " {\n", + " \"California\": 423967,\n", + " \"Texas\": 695662,\n", + " \"New York\": 141297,\n", + " \"Florida\": 170312,\n", + " \"Illinois\": 149995,\n", + " }\n", + ")\n", + "pop = pd.Series(\n", + " {\n", + " \"California\": 38332521,\n", + " \"Texas\": 26448193,\n", + " \"New York\": 19651127,\n", + " \"Florida\": 19552860,\n", + " \"Illinois\": 12882135,\n", + " }\n", + ")\n", + "data = pd.DataFrame({\"area\": area, \"pop\": pop})\n", "data" ] }, @@ -660,7 +726,10 @@ "cell_type": "code", "execution_count": 19, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -680,7 +749,7 @@ } ], "source": [ - "data['area']" + "data[\"area\"]" ] }, { @@ -694,7 +763,10 @@ "cell_type": "code", "execution_count": 20, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -728,7 +800,10 @@ "cell_type": "code", "execution_count": 21, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -743,7 +818,7 @@ } ], "source": [ - "data.area is data['area']" + "data.area is data[\"area\"]" ] }, { @@ -759,7 +834,10 @@ "cell_type": "code", "execution_count": 22, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -774,7 +852,7 @@ } ], "source": [ - "data.pop is data['pop']" + "data.pop is data[\"pop\"]" ] }, { @@ -790,7 +868,10 @@ "cell_type": "code", "execution_count": 23, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -856,7 +937,7 @@ } ], "source": [ - "data['density'] = data['pop'] / data['area']\n", + "data[\"density\"] = data[\"pop\"] / data[\"area\"]\n", "data" ] }, @@ -881,7 +962,10 @@ "cell_type": "code", "execution_count": 24, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -915,7 +999,10 @@ "cell_type": "code", "execution_count": 25, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -990,7 +1077,10 @@ "cell_type": "code", "execution_count": 26, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1019,7 +1109,10 @@ "cell_type": "code", "execution_count": 27, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1039,14 +1132,12 @@ } ], "source": [ - "data['area']" + "data[\"area\"]" ] }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "Thus for array-style indexing, we need another convention.\n", "Here Pandas again uses the ``loc``, ``iloc``, and ``ix`` indexers mentioned earlier.\n", @@ -1057,7 +1148,10 @@ "cell_type": "code", "execution_count": 28, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1119,7 +1213,10 @@ "cell_type": "code", "execution_count": 29, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1167,14 +1264,12 @@ } ], "source": [ - "data.loc[:'Illinois', :'pop']" + "data.loc[:\"Illinois\", :\"pop\"]" ] }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "The ``ix`` indexer allows a hybrid of these two approaches:" ] @@ -1183,7 +1278,10 @@ "cell_type": "code", "execution_count": 30, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1231,7 +1329,7 @@ } ], "source": [ - "data.ix[:3, :'pop']" + "data.ix[:3, :\"pop\"]" ] }, { @@ -1248,7 +1346,10 @@ "cell_type": "code", "execution_count": 31, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1290,7 +1391,7 @@ } ], "source": [ - "data.loc[data.density > 100, ['pop', 'density']]" + "data.loc[data.density > 100, [\"pop\", \"density\"]]" ] }, { @@ -1304,7 +1405,10 @@ "cell_type": "code", "execution_count": 32, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1395,7 +1499,10 @@ "cell_type": "code", "execution_count": 33, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1440,7 +1547,7 @@ } ], "source": [ - "data['Florida':'Illinois']" + "data[\"Florida\":\"Illinois\"]" ] }, { @@ -1454,7 +1561,10 @@ "cell_type": "code", "execution_count": 34, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1513,7 +1623,10 @@ "cell_type": "code", "execution_count": 35, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1596,9 +1709,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/03.03-Operations-in-Pandas.ipynb b/notebooks/03.03-Operations-in-Pandas.ipynb index 6206ac790..47cdbba74 100644 --- a/notebooks/03.03-Operations-in-Pandas.ipynb +++ b/notebooks/03.03-Operations-in-Pandas.ipynb @@ -55,19 +55,25 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ - "import pandas as pd\n", - "import numpy as np" + "import numpy as np\n", + "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -95,7 +101,10 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -151,8 +160,7 @@ } ], "source": [ - "df = pd.DataFrame(rng.randint(0, 10, (3, 4)),\n", - " columns=['A', 'B', 'C', 'D'])\n", + "df = pd.DataFrame(rng.randint(0, 10, (3, 4)), columns=[\"A\", \"B\", \"C\", \"D\"])\n", "df" ] }, @@ -167,7 +175,10 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -200,7 +211,10 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -289,14 +303,20 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ - "area = pd.Series({'Alaska': 1723337, 'Texas': 695662,\n", - " 'California': 423967}, name='area')\n", - "population = pd.Series({'California': 38332521, 'Texas': 26448193,\n", - " 'New York': 19651127}, name='population')" + "area = pd.Series(\n", + " {\"Alaska\": 1723337, \"Texas\": 695662, \"California\": 423967}, name=\"area\"\n", + ")\n", + "population = pd.Series(\n", + " {\"California\": 38332521, \"Texas\": 26448193, \"New York\": 19651127},\n", + " name=\"population\",\n", + ")" ] }, { @@ -310,7 +330,10 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -343,7 +366,10 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -373,7 +399,10 @@ "cell_type": "code", "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -409,7 +438,10 @@ "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -444,7 +476,10 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -486,8 +521,7 @@ } ], "source": [ - "A = pd.DataFrame(rng.randint(0, 20, (2, 2)),\n", - " columns=list('AB'))\n", + "A = pd.DataFrame(rng.randint(0, 20, (2, 2)), columns=list(\"AB\"))\n", "A" ] }, @@ -495,7 +529,10 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -547,8 +584,7 @@ } ], "source": [ - "B = pd.DataFrame(rng.randint(0, 10, (3, 3)),\n", - " columns=list('BAC'))\n", + "B = pd.DataFrame(rng.randint(0, 10, (3, 3)), columns=list(\"BAC\"))\n", "B" ] }, @@ -556,7 +592,10 @@ "cell_type": "code", "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -624,7 +663,10 @@ "cell_type": "code", "execution_count": 14, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -712,7 +754,10 @@ "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -737,7 +782,10 @@ "cell_type": "code", "execution_count": 16, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -770,7 +818,10 @@ "cell_type": "code", "execution_count": 17, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -826,7 +877,7 @@ } ], "source": [ - "df = pd.DataFrame(A, columns=list('QRST'))\n", + "df = pd.DataFrame(A, columns=list(\"QRST\"))\n", "df - df.iloc[0]" ] }, @@ -841,7 +892,10 @@ "cell_type": "code", "execution_count": 18, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -897,7 +951,7 @@ } ], "source": [ - "df.subtract(df['R'], axis=0)" + "df.subtract(df[\"R\"], axis=0)" ] }, { @@ -911,7 +965,10 @@ "cell_type": "code", "execution_count": 19, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -936,7 +993,10 @@ "cell_type": "code", "execution_count": 20, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1030,9 +1090,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/03.04-Missing-Values.ipynb b/notebooks/03.04-Missing-Values.ipynb index 180ca09e7..d86b85194 100644 --- a/notebooks/03.04-Missing-Values.ipynb +++ b/notebooks/03.04-Missing-Values.ipynb @@ -93,7 +93,10 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ @@ -105,7 +108,10 @@ "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -136,7 +142,10 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -153,9 +162,9 @@ } ], "source": [ - "for dtype in ['object', 'int']:\n", + "for dtype in [\"object\", \"int\"]:\n", " print(\"dtype =\", dtype)\n", - " %timeit np.arange(1E6, dtype=dtype).sum()\n", + " %timeit np.arange(1e6, dtype=dtype).sum()\n", " print()" ] }, @@ -170,7 +179,10 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -210,7 +222,10 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -225,7 +240,7 @@ } ], "source": [ - "vals2 = np.array([1, np.nan, 3, 4]) \n", + "vals2 = np.array([1, np.nan, 3, 4])\n", "vals2.dtype" ] }, @@ -242,7 +257,10 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -264,7 +282,10 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -279,7 +300,7 @@ } ], "source": [ - "0 * np.nan" + "0 * np.nan" ] }, { @@ -293,7 +314,10 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -322,7 +346,10 @@ "cell_type": "code", "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -360,7 +387,10 @@ "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -394,7 +424,10 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -419,7 +452,10 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -492,18 +528,24 @@ "cell_type": "code", "execution_count": 13, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ - "data = pd.Series([1, np.nan, 'hello', None])" + "data = pd.Series([1, np.nan, \"hello\", None])" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -536,7 +578,10 @@ "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -578,7 +623,10 @@ "cell_type": "code", "execution_count": 16, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -610,7 +658,10 @@ "cell_type": "code", "execution_count": 17, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -662,9 +713,7 @@ } ], "source": [ - "df = pd.DataFrame([[1, np.nan, 2],\n", - " [2, 3, 5],\n", - " [np.nan, 4, 6]])\n", + "df = pd.DataFrame([[1, np.nan, 2], [2, 3, 5], [np.nan, 4, 6]])\n", "df" ] }, @@ -682,7 +731,10 @@ "cell_type": "code", "execution_count": 18, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -734,7 +786,10 @@ "cell_type": "code", "execution_count": 19, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -778,7 +833,7 @@ } ], "source": [ - "df.dropna(axis='columns')" + "df.dropna(axis=\"columns\")" ] }, { @@ -796,7 +851,10 @@ "cell_type": "code", "execution_count": 20, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -860,7 +918,10 @@ "cell_type": "code", "execution_count": 21, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -912,7 +973,7 @@ } ], "source": [ - "df.dropna(axis='columns', how='all')" + "df.dropna(axis=\"columns\", how=\"all\")" ] }, { @@ -926,7 +987,10 @@ "cell_type": "code", "execution_count": 22, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -966,7 +1030,7 @@ } ], "source": [ - "df.dropna(axis='rows', thresh=3)" + "df.dropna(axis=\"rows\", thresh=3)" ] }, { @@ -993,7 +1057,10 @@ "cell_type": "code", "execution_count": 23, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1013,7 +1080,7 @@ } ], "source": [ - "data = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'))\n", + "data = pd.Series([1, np.nan, 2, None, 3], index=list(\"abcde\"))\n", "data" ] }, @@ -1028,7 +1095,10 @@ "cell_type": "code", "execution_count": 24, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1062,7 +1132,10 @@ "cell_type": "code", "execution_count": 25, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1083,7 +1156,7 @@ ], "source": [ "# forward-fill\n", - "data.fillna(method='ffill')" + "data.fillna(method=\"ffill\")" ] }, { @@ -1097,7 +1170,10 @@ "cell_type": "code", "execution_count": 26, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1118,14 +1194,12 @@ ], "source": [ "# back-fill\n", - "data.fillna(method='bfill')" + "data.fillna(method=\"bfill\")" ] }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "For ``DataFrame``s, the options are similar, but we can also specify an ``axis`` along which the fills take place:" ] @@ -1134,7 +1208,10 @@ "cell_type": "code", "execution_count": 27, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1197,7 +1274,10 @@ "cell_type": "code", "execution_count": 28, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1253,7 +1333,7 @@ } ], "source": [ - "df.fillna(method='ffill', axis=1)" + "df.fillna(method=\"ffill\", axis=1)" ] }, { @@ -1291,9 +1371,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/03.05-Hierarchical-Indexing.ipynb b/notebooks/03.05-Hierarchical-Indexing.ipynb index 1122989bb..e9a05ed00 100644 --- a/notebooks/03.05-Hierarchical-Indexing.ipynb +++ b/notebooks/03.05-Hierarchical-Indexing.ipynb @@ -56,14 +56,14 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": true, "deletable": true, - "editable": true + "editable": true, + "tags": [] }, "outputs": [], "source": [ - "import pandas as pd\n", - "import numpy as np" + "import numpy as np\n", + "import pandas as pd" ] }, { @@ -98,7 +98,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -119,12 +122,15 @@ } ], "source": [ - "index = [('California', 2000), ('California', 2010),\n", - " ('New York', 2000), ('New York', 2010),\n", - " ('Texas', 2000), ('Texas', 2010)]\n", - "populations = [33871648, 37253956,\n", - " 18976457, 19378102,\n", - " 20851820, 25145561]\n", + "index = [\n", + " (\"California\", 2000),\n", + " (\"California\", 2010),\n", + " (\"New York\", 2000),\n", + " (\"New York\", 2010),\n", + " (\"Texas\", 2000),\n", + " (\"Texas\", 2010),\n", + "]\n", + "populations = [33871648, 37253956, 18976457, 19378102, 20851820, 25145561]\n", "pop = pd.Series(populations, index=index)\n", "pop" ] @@ -145,7 +151,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -164,7 +173,7 @@ } ], "source": [ - "pop[('California', 2010):('Texas', 2000)]" + "pop[(\"California\", 2010):(\"Texas\", 2000)]" ] }, { @@ -183,7 +192,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -233,14 +245,22 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "MultiIndex(levels=[['California', 'New York', 'Texas'], [2000, 2010]],\n", - " labels=[[0, 0, 1, 1, 2, 2], [0, 1, 0, 1, 0, 1]])" + "MultiIndex([('California', 2000),\n", + " ('California', 2010),\n", + " ( 'New York', 2000),\n", + " ( 'New York', 2010),\n", + " ( 'Texas', 2000),\n", + " ( 'Texas', 2010)],\n", + " )" ] }, "execution_count": 5, @@ -271,7 +291,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -323,7 +346,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -375,13 +401,29 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -443,7 +485,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -485,13 +530,29 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "
\n", " \n", " \n", @@ -555,10 +616,12 @@ } ], "source": [ - "pop_df = pd.DataFrame({'total': pop,\n", - " 'under18': [9267089, 9284094,\n", - " 4687374, 4318033,\n", - " 5906301, 6879014]})\n", + "pop_df = pd.DataFrame(\n", + " {\n", + " \"total\": pop,\n", + " \"under18\": [9267089, 9284094, 4687374, 4318033, 5906301, 6879014],\n", + " }\n", + ")\n", "pop_df" ] }, @@ -579,13 +642,29 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "
\n", " \n", " \n", @@ -627,7 +706,7 @@ } ], "source": [ - "f_u18 = pop_df['under18'] / pop_df['total']\n", + "f_u18 = pop_df[\"under18\"] / pop_df[\"total\"]\n", "f_u18.unstack()" ] }, @@ -659,13 +738,29 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "
\n", " \n", " \n", @@ -679,24 +774,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.6243170.471001
20.9252440.2194740.9475330.916573
b10.4417590.6100540.5950930.096396
20.1714950.8866880.4730710.379134
\n", @@ -704,10 +799,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.624317 0.471001\n", + " 2 0.947533 0.916573\n", + "b 1 0.595093 0.096396\n", + " 2 0.473071 0.379134" ] }, "execution_count": 12, @@ -716,9 +811,11 @@ } ], "source": [ - "df = pd.DataFrame(np.random.rand(4, 2),\n", - " index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],\n", - " columns=['data1', 'data2'])\n", + "df = pd.DataFrame(\n", + " np.random.rand(4, 2),\n", + " index=[[\"a\", \"a\", \"b\", \"b\"], [1, 2, 1, 2]],\n", + " columns=[\"data1\", \"data2\"],\n", + ")\n", "df" ] }, @@ -740,7 +837,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -748,10 +848,10 @@ "text/plain": [ "California 2000 33871648\n", " 2010 37253956\n", - "New York 2000 18976457\n", - " 2010 19378102\n", "Texas 2000 20851820\n", " 2010 25145561\n", + "New York 2000 18976457\n", + " 2010 19378102\n", "dtype: int64" ] }, @@ -761,12 +861,14 @@ } ], "source": [ - "data = {('California', 2000): 33871648,\n", - " ('California', 2010): 37253956,\n", - " ('Texas', 2000): 20851820,\n", - " ('Texas', 2010): 25145561,\n", - " ('New York', 2000): 18976457,\n", - " ('New York', 2010): 19378102}\n", + "data = {\n", + " (\"California\", 2000): 33871648,\n", + " (\"California\", 2010): 37253956,\n", + " (\"Texas\", 2000): 20851820,\n", + " (\"Texas\", 2010): 25145561,\n", + " (\"New York\", 2000): 18976457,\n", + " (\"New York\", 2010): 19378102,\n", + "}\n", "pd.Series(data)" ] }, @@ -799,14 +901,20 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "MultiIndex(levels=[['a', 'b'], [1, 2]],\n", - " labels=[[0, 0, 1, 1], [0, 1, 0, 1]])" + "MultiIndex([('a', 1),\n", + " ('a', 2),\n", + " ('b', 1),\n", + " ('b', 2)],\n", + " )" ] }, "execution_count": 14, @@ -815,7 +923,7 @@ } ], "source": [ - "pd.MultiIndex.from_arrays([['a', 'a', 'b', 'b'], [1, 2, 1, 2]])" + "pd.MultiIndex.from_arrays([[\"a\", \"a\", \"b\", \"b\"], [1, 2, 1, 2]])" ] }, { @@ -834,14 +942,20 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "MultiIndex(levels=[['a', 'b'], [1, 2]],\n", - " labels=[[0, 0, 1, 1], [0, 1, 0, 1]])" + "MultiIndex([('a', 1),\n", + " ('a', 2),\n", + " ('b', 1),\n", + " ('b', 2)],\n", + " )" ] }, "execution_count": 15, @@ -850,7 +964,7 @@ } ], "source": [ - "pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1), ('b', 2)])" + "pd.MultiIndex.from_tuples([(\"a\", 1), (\"a\", 2), (\"b\", 1), (\"b\", 2)])" ] }, { @@ -869,14 +983,20 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "MultiIndex(levels=[['a', 'b'], [1, 2]],\n", - " labels=[[0, 0, 1, 1], [0, 1, 0, 1]])" + "MultiIndex([('a', 1),\n", + " ('a', 2),\n", + " ('b', 1),\n", + " ('b', 2)],\n", + " )" ] }, "execution_count": 16, @@ -885,7 +1005,7 @@ } ], "source": [ - "pd.MultiIndex.from_product([['a', 'b'], [1, 2]])" + "pd.MultiIndex.from_product([[\"a\", \"b\"], [1, 2]])" ] }, { @@ -904,14 +1024,20 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "MultiIndex(levels=[['a', 'b'], [1, 2]],\n", - " labels=[[0, 0, 1, 1], [0, 1, 0, 1]])" + "MultiIndex([('a', 1),\n", + " ('a', 2),\n", + " ('b', 1),\n", + " ('b', 2)],\n", + " )" ] }, "execution_count": 17, @@ -920,8 +1046,10 @@ } ], "source": [ - "pd.MultiIndex(levels=[['a', 'b'], [1, 2]],\n", - " labels=[[0, 0, 1, 1], [0, 1, 0, 1]])" + "# Changed in version 0.24.0: MultiIndex.labels has been renamed to\n", + "# MultiIndex.codes and MultiIndex.set_labels to MultiIndex.set_codes.\n", + "\n", + "pd.MultiIndex(levels=[[\"a\", \"b\"], [1, 2]], codes=[[0, 0, 1, 1], [0, 1, 0, 1]])" ] }, { @@ -953,7 +1081,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -975,7 +1106,7 @@ } ], "source": [ - "pop.index.names = ['state', 'year']\n", + "pop.index.names = [\"state\", \"year\"]\n", "pop" ] }, @@ -1008,13 +1139,33 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1049,40 +1200,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", " \n", " \n", "
2013131.038.732.036.735.037.245.036.045.037.053.037.1
244.037.750.035.029.036.738.036.434.038.833.037.1
2014130.037.439.037.861.036.947.037.532.037.938.036.6
247.037.848.037.351.036.520.035.641.036.949.037.5
\n", @@ -1092,10 +1243,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 45.0 36.0 45.0 37.0 53.0 37.1\n", + " 2 38.0 36.4 34.0 38.8 33.0 37.1\n", + "2014 1 47.0 37.5 32.0 37.9 38.0 36.6\n", + " 2 20.0 35.6 41.0 36.9 49.0 37.5" ] }, "execution_count": 19, @@ -1105,10 +1256,12 @@ ], "source": [ "# hierarchical indices and columns\n", - "index = pd.MultiIndex.from_product([[2013, 2014], [1, 2]],\n", - " names=['year', 'visit'])\n", - "columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'], ['HR', 'Temp']],\n", - " names=['subject', 'type'])\n", + "index = pd.MultiIndex.from_product(\n", + " [[2013, 2014], [1, 2]], names=[\"year\", \"visit\"]\n", + ")\n", + "columns = pd.MultiIndex.from_product(\n", + " [[\"Bob\", \"Guido\", \"Sue\"], [\"HR\", \"Temp\"]], names=[\"subject\", \"type\"]\n", + ")\n", "\n", "# mock some data\n", "data = np.round(np.random.randn(4, 6), 1)\n", @@ -1138,13 +1291,29 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1164,24 +1333,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.745.037.0
250.035.034.038.8
2014139.037.832.037.9
248.037.341.036.9
\n", @@ -1190,10 +1359,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 45.0 37.0\n", + " 2 34.0 38.8\n", + "2014 1 32.0 37.9\n", + " 2 41.0 36.9" ] }, "execution_count": 20, @@ -1202,7 +1371,7 @@ } ], "source": [ - "health_data['Guido']" + "health_data[\"Guido\"]" ] }, { @@ -1246,7 +1415,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1287,7 +1459,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1302,7 +1477,7 @@ } ], "source": [ - "pop['California', 2000]" + "pop[\"California\", 2000]" ] }, { @@ -1322,7 +1497,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1340,7 +1518,7 @@ } ], "source": [ - "pop['California']" + "pop[\"California\"]" ] }, { @@ -1359,7 +1537,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1379,7 +1560,7 @@ } ], "source": [ - "pop.loc['California':'New York']" + "pop.loc[\"California\":\"New York\"]" ] }, { @@ -1398,7 +1579,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1436,7 +1620,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1474,7 +1661,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1494,7 +1684,7 @@ } ], "source": [ - "pop[['California', 'Texas']]" + "pop[[\"California\", \"Texas\"]]" ] }, { @@ -1516,13 +1706,33 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1557,40 +1767,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", " \n", " \n", "
2013131.038.732.036.735.037.245.036.045.037.053.037.1
244.037.750.035.029.036.738.036.434.038.833.037.1
2014130.037.439.037.861.036.947.037.532.037.938.036.6
247.037.848.037.351.036.520.035.641.036.949.037.5
\n", @@ -1600,10 +1810,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 45.0 36.0 45.0 37.0 53.0 37.1\n", + " 2 38.0 36.4 34.0 38.8 33.0 37.1\n", + "2014 1 47.0 37.5 32.0 37.9 38.0 36.6\n", + " 2 20.0 35.6 41.0 36.9 49.0 37.5" ] }, "execution_count": 28, @@ -1632,17 +1842,20 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "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 45.0\n", + " 2 34.0\n", + "2014 1 32.0\n", + " 2 41.0\n", "Name: (Guido, HR), dtype: float64" ] }, @@ -1652,7 +1865,7 @@ } ], "source": [ - "health_data['Guido', 'HR']" + "health_data[\"Guido\", \"HR\"]" ] }, { @@ -1671,13 +1884,33 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1702,13 +1935,13 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
2013131.038.745.036.0
244.037.738.036.4
\n", @@ -1718,8 +1951,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 45.0 36.0\n", + " 2 38.0 36.4" ] }, "execution_count": 30, @@ -1747,17 +1980,20 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "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 45.0\n", + " 2 38.0\n", + "2014 1 47.0\n", + " 2 20.0\n", "Name: (Bob, HR), dtype: float64" ] }, @@ -1767,7 +2003,7 @@ } ], "source": [ - "health_data.loc[:, ('Bob', 'HR')]" + "health_data.loc[:, (\"Bob\", \"HR\")]" ] }, { @@ -1786,20 +2022,23 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "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" ] } ], "source": [ - "health_data.loc[(:, 1), (:, 'HR')]" + "health_data.loc[(:, 1), (:, \"HR\")]" ] }, { @@ -1819,13 +2058,33 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -1854,16 +2113,16 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", "
2013131.032.035.045.045.053.0
2014130.039.061.047.032.038.0
\n", @@ -1873,8 +2132,8 @@ "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" + "2013 1 45.0 45.0 53.0\n", + "2014 1 47.0 32.0 38.0" ] }, "execution_count": 33, @@ -1884,7 +2143,7 @@ ], "source": [ "idx = pd.IndexSlice\n", - "health_data.loc[idx[:, 1], idx[:, 'HR']]" + "health_data.loc[idx[:, 1], idx[:, \"HR\"]]" ] }, { @@ -1933,19 +2192,22 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "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", + "a 1 0.665457\n", + " 2 0.761459\n", + "c 1 0.792556\n", + " 2 0.547949\n", + "b 1 0.249977\n", + " 2 0.162951\n", "dtype: float64" ] }, @@ -1955,9 +2217,9 @@ } ], "source": [ - "index = pd.MultiIndex.from_product([['a', 'c', 'b'], [1, 2]])\n", + "index = pd.MultiIndex.from_product([[\"a\", \"c\", \"b\"], [1, 2]])\n", "data = pd.Series(np.random.rand(6), index=index)\n", - "data.index.names = ['char', 'int']\n", + "data.index.names = [\"char\", \"int\"]\n", "data" ] }, @@ -1977,21 +2239,24 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", + "\n", "'Key length (1) was greater than MultiIndex lexsort depth (0)'\n" ] } ], "source": [ "try:\n", - " data['a':'b']\n", + " data[\"a\":\"b\"]\n", "except KeyError as e:\n", " print(type(e))\n", " print(e)" @@ -2016,19 +2281,22 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "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", + "a 1 0.665457\n", + " 2 0.761459\n", + "b 1 0.249977\n", + " 2 0.162951\n", + "c 1 0.792556\n", + " 2 0.547949\n", "dtype: float64" ] }, @@ -2058,17 +2326,20 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "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", + "a 1 0.665457\n", + " 2 0.761459\n", + "b 1 0.249977\n", + " 2 0.162951\n", "dtype: float64" ] }, @@ -2078,7 +2349,7 @@ } ], "source": [ - "data['a':'b']" + "data[\"a\":\"b\"]" ] }, { @@ -2099,13 +2370,29 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -2160,13 +2447,29 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "
\n", " \n", " \n", @@ -2233,7 +2536,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -2278,13 +2584,29 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "
\n", " \n", " \n", @@ -2351,7 +2673,7 @@ } ], "source": [ - "pop_flat = pop.reset_index(name='population')\n", + "pop_flat = pop.reset_index(name=\"population\")\n", "pop_flat" ] }, @@ -2372,13 +2694,29 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "
\n", " \n", " \n", @@ -2441,7 +2779,7 @@ } ], "source": [ - "pop_flat.set_index(['state', 'year'])" + "pop_flat.set_index([\"state\", \"year\"])" ] }, { @@ -2475,13 +2813,33 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "
\n", " \n", " \n", @@ -2516,40 +2874,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", " \n", " \n", "
2013131.038.732.036.735.037.245.036.045.037.053.037.1
244.037.750.035.029.036.738.036.434.038.833.037.1
2014130.037.439.037.861.036.947.037.532.037.938.036.6
247.037.848.037.351.036.520.035.641.036.949.037.5
\n", @@ -2559,10 +2917,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 45.0 36.0 45.0 37.0 53.0 37.1\n", + " 2 38.0 36.4 34.0 38.8 33.0 37.1\n", + "2014 1 47.0 37.5 32.0 37.9 38.0 36.6\n", + " 2 20.0 35.6 41.0 36.9 49.0 37.5" ] }, "execution_count": 43, @@ -2590,13 +2948,33 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -2627,32 +3005,32 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", " \n", " \n", "
201337.538.241.035.8532.036.9541.536.2039.537.943.037.10
201438.537.633.536.5536.537.443.537.5556.036.7037.05
\n", "
" ], "text/plain": [ - "subject Bob Guido Sue \n", - "type HR Temp HR Temp HR Temp\n", + "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" + "2013 41.5 36.20 39.5 37.9 43.0 37.10\n", + "2014 33.5 36.55 36.5 37.4 43.5 37.05" ] }, "execution_count": 44, @@ -2661,7 +3039,7 @@ } ], "source": [ - "data_mean = health_data.mean(level='year')\n", + "data_mean = health_data.mean(level=\"year\")\n", "data_mean" ] }, @@ -2681,13 +3059,29 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/html": [ "
\n", + "\n", "\n", " \n", " \n", @@ -2704,13 +3098,13 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
201336.83333337.00000041.33333337.066667
201446.00000037.28333337.83333337.000000
\n", @@ -2719,8 +3113,8 @@ "text/plain": [ "type HR Temp\n", "year \n", - "2013 36.833333 37.000000\n", - "2014 46.000000 37.283333" + "2013 41.333333 37.066667\n", + "2014 37.833333 37.000000" ] }, "execution_count": 45, @@ -2729,7 +3123,7 @@ } ], "source": [ - "data_mean.mean(axis=1, level='type')" + "data_mean.mean(axis=1, level=\"type\")" ] }, { @@ -2782,9 +3176,9 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [conda env:py3k]", "language": "python", - "name": "python3" + "name": "conda-env-py3k-py" }, "language_info": { "codemirror_mode": { @@ -2796,9 +3190,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/03.06-Concat-And-Append.ipynb b/notebooks/03.06-Concat-And-Append.ipynb index 7566c851c..a3c5a5e07 100644 --- a/notebooks/03.06-Concat-And-Append.ipynb +++ b/notebooks/03.06-Concat-And-Append.ipynb @@ -46,12 +46,15 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ - "import pandas as pd\n", - "import numpy as np" + "import numpy as np\n", + "import pandas as pd" ] }, { @@ -65,7 +68,10 @@ "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -119,12 +125,12 @@ "source": [ "def make_df(cols, ind):\n", " \"\"\"Quickly make a DataFrame\"\"\"\n", - " data = {c: [str(c) + str(i) for i in ind]\n", - " for c in cols}\n", + " data = {c: [str(c) + str(i) for i in ind] for c in cols}\n", " return pd.DataFrame(data, ind)\n", "\n", + "\n", "# example DataFrame\n", - "make_df('ABC', range(3))" + "make_df(\"ABC\", range(3))" ] }, { @@ -138,26 +144,30 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ "class display(object):\n", " \"\"\"Display HTML representation of multiple objects\"\"\"\n", + "\n", " template = \"\"\"
\n", "

{0}

{1}\n", "
\"\"\"\n", + "\n", " def __init__(self, *args):\n", " self.args = args\n", - " \n", + "\n", " def _repr_html_(self):\n", - " return '\\n'.join(self.template.format(a, eval(a)._repr_html_())\n", - " for a in self.args)\n", - " \n", + " return \"\\n\".join(\n", + " self.template.format(a, eval(a)._repr_html_()) for a in self.args\n", + " )\n", + "\n", " def __repr__(self):\n", - " return '\\n\\n'.join(a + '\\n' + repr(eval(a))\n", - " for a in self.args)\n", - " " + " return \"\\n\\n\".join(a + \"\\n\" + repr(eval(a)) for a in self.args)" ] }, { @@ -181,7 +191,10 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -214,7 +227,10 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -230,8 +246,7 @@ } ], "source": [ - "x = [[1, 2],\n", - " [3, 4]]\n", + "x = [[1, 2], [3, 4]]\n", "np.concatenate([x, x], axis=1)" ] }, @@ -262,7 +277,10 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -283,8 +301,8 @@ } ], "source": [ - "ser1 = pd.Series(['A', 'B', 'C'], index=[1, 2, 3])\n", - "ser2 = pd.Series(['D', 'E', 'F'], index=[4, 5, 6])\n", + "ser1 = pd.Series([\"A\", \"B\", \"C\"], index=[1, 2, 3])\n", + "ser2 = pd.Series([\"D\", \"E\", \"F\"], index=[4, 5, 6])\n", "pd.concat([ser1, ser2])" ] }, @@ -299,7 +317,10 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -416,9 +437,9 @@ } ], "source": [ - "df1 = make_df('AB', [1, 2])\n", - "df2 = make_df('AB', [3, 4])\n", - "display('df1', 'df2', 'pd.concat([df1, df2])')" + "df1 = make_df(\"AB\", [1, 2])\n", + "df2 = make_df(\"AB\", [3, 4])\n", + "display(\"df1\", \"df2\", \"pd.concat([df1, df2])\")" ] }, { @@ -434,7 +455,10 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -545,9 +569,9 @@ } ], "source": [ - "df3 = make_df('AB', [0, 1])\n", - "df4 = make_df('CD', [0, 1])\n", - "display('df3', 'df4', \"pd.concat([df3, df4], axis='col')\")" + "df3 = make_df(\"AB\", [0, 1])\n", + "df4 = make_df(\"CD\", [0, 1])\n", + "display(\"df3\", \"df4\", \"pd.concat([df3, df4], axis='col')\")" ] }, { @@ -571,7 +595,10 @@ "cell_type": "code", "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -688,10 +715,10 @@ } ], "source": [ - "x = make_df('AB', [0, 1])\n", - "y = make_df('AB', [2, 3])\n", + "x = make_df(\"AB\", [0, 1])\n", + "y = make_df(\"AB\", [2, 3])\n", "y.index = x.index # make duplicate indices!\n", - "display('x', 'y', 'pd.concat([x, y])')" + "display(\"x\", \"y\", \"pd.concat([x, y])\")" ] }, { @@ -718,7 +745,10 @@ "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -751,7 +781,10 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -868,7 +901,7 @@ } ], "source": [ - "display('x', 'y', 'pd.concat([x, y], ignore_index=True)')" + "display(\"x\", \"y\", \"pd.concat([x, y], ignore_index=True)\")" ] }, { @@ -884,7 +917,10 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1004,7 +1040,7 @@ } ], "source": [ - "display('x', 'y', \"pd.concat([x, y], keys=['x', 'y'])\")" + "display(\"x\", \"y\", \"pd.concat([x, y], keys=['x', 'y'])\")" ] }, { @@ -1029,7 +1065,10 @@ "cell_type": "code", "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1162,9 +1201,9 @@ } ], "source": [ - "df5 = make_df('ABC', [1, 2])\n", - "df6 = make_df('BCD', [3, 4])\n", - "display('df5', 'df6', 'pd.concat([df5, df6])')" + "df5 = make_df(\"ABC\", [1, 2])\n", + "df6 = make_df(\"BCD\", [3, 4])\n", + "display(\"df5\", \"df6\", \"pd.concat([df5, df6])\")" ] }, { @@ -1180,7 +1219,10 @@ "cell_type": "code", "execution_count": 14, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1303,8 +1345,7 @@ } ], "source": [ - "display('df5', 'df6',\n", - " \"pd.concat([df5, df6], join='inner')\")" + "display(\"df5\", \"df6\", \"pd.concat([df5, df6], join='inner')\")" ] }, { @@ -1319,7 +1360,10 @@ "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1447,8 +1491,7 @@ } ], "source": [ - "display('df5', 'df6',\n", - " \"pd.concat([df5, df6], join_axes=[df5.columns])\")" + "display(\"df5\", \"df6\", \"pd.concat([df5, df6], join_axes=[df5.columns])\")" ] }, { @@ -1472,7 +1515,10 @@ "cell_type": "code", "execution_count": 16, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1589,7 +1635,7 @@ } ], "source": [ - "display('df1', 'df2', 'df1.append(df2)')" + "display(\"df1\", \"df2\", \"df1.append(df2)\")" ] }, { @@ -1632,9 +1678,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/03.07-Merge-and-Join.ipynb b/notebooks/03.07-Merge-and-Join.ipynb index c46383e57..41e815666 100644 --- a/notebooks/03.07-Merge-and-Join.ipynb +++ b/notebooks/03.07-Merge-and-Join.ipynb @@ -44,28 +44,34 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ - "import pandas as pd\n", "import numpy as np\n", + "import pandas as pd\n", + "\n", "\n", "class display(object):\n", " \"\"\"Display HTML representation of multiple objects\"\"\"\n", + "\n", " template = \"\"\"
\n", "

{0}

{1}\n", "
\"\"\"\n", + "\n", " def __init__(self, *args):\n", " self.args = args\n", - " \n", + "\n", " def _repr_html_(self):\n", - " return '\\n'.join(self.template.format(a, eval(a)._repr_html_())\n", - " for a in self.args)\n", - " \n", + " return \"\\n\".join(\n", + " self.template.format(a, eval(a)._repr_html_()) for a in self.args\n", + " )\n", + "\n", " def __repr__(self):\n", - " return '\\n\\n'.join(a + '\\n' + repr(eval(a))\n", - " for a in self.args)" + " return \"\\n\\n\".join(a + \"\\n\" + repr(eval(a)) for a in self.args)" ] }, { @@ -107,7 +113,10 @@ "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -206,11 +215,19 @@ } ], "source": [ - "df1 = pd.DataFrame({'employee': ['Bob', 'Jake', 'Lisa', 'Sue'],\n", - " 'group': ['Accounting', 'Engineering', 'Engineering', 'HR']})\n", - "df2 = pd.DataFrame({'employee': ['Lisa', 'Bob', 'Jake', 'Sue'],\n", - " 'hire_date': [2004, 2008, 2012, 2014]})\n", - "display('df1', 'df2')" + "df1 = pd.DataFrame(\n", + " {\n", + " \"employee\": [\"Bob\", \"Jake\", \"Lisa\", \"Sue\"],\n", + " \"group\": [\"Accounting\", \"Engineering\", \"Engineering\", \"HR\"],\n", + " }\n", + ")\n", + "df2 = pd.DataFrame(\n", + " {\n", + " \"employee\": [\"Lisa\", \"Bob\", \"Jake\", \"Sue\"],\n", + " \"hire_date\": [2004, 2008, 2012, 2014],\n", + " }\n", + ")\n", + "display(\"df1\", \"df2\")" ] }, { @@ -224,7 +241,10 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -317,7 +337,10 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -467,9 +490,13 @@ } ], "source": [ - "df4 = pd.DataFrame({'group': ['Accounting', 'Engineering', 'HR'],\n", - " 'supervisor': ['Carly', 'Guido', 'Steve']})\n", - "display('df3', 'df4', 'pd.merge(df3, df4)')" + "df4 = pd.DataFrame(\n", + " {\n", + " \"group\": [\"Accounting\", \"Engineering\", \"HR\"],\n", + " \"supervisor\": [\"Carly\", \"Guido\", \"Steve\"],\n", + " }\n", + ")\n", + "display(\"df3\", \"df4\", \"pd.merge(df3, df4)\")" ] }, { @@ -501,7 +528,10 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -687,11 +717,27 @@ } ], "source": [ - "df5 = pd.DataFrame({'group': ['Accounting', 'Accounting',\n", - " 'Engineering', 'Engineering', 'HR', 'HR'],\n", - " 'skills': ['math', 'spreadsheets', 'coding', 'linux',\n", - " 'spreadsheets', 'organization']})\n", - "display('df1', 'df5', \"pd.merge(df1, df5)\")" + "df5 = pd.DataFrame(\n", + " {\n", + " \"group\": [\n", + " \"Accounting\",\n", + " \"Accounting\",\n", + " \"Engineering\",\n", + " \"Engineering\",\n", + " \"HR\",\n", + " \"HR\",\n", + " ],\n", + " \"skills\": [\n", + " \"math\",\n", + " \"spreadsheets\",\n", + " \"coding\",\n", + " \"linux\",\n", + " \"spreadsheets\",\n", + " \"organization\",\n", + " ],\n", + " }\n", + ")\n", + "display(\"df1\", \"df5\", \"pd.merge(df1, df5)\")" ] }, { @@ -731,7 +777,10 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -877,7 +926,7 @@ } ], "source": [ - "display('df1', 'df2', \"pd.merge(df1, df2, on='employee')\")" + "display(\"df1\", \"df2\", \"pd.merge(df1, df2, on='employee')\")" ] }, { @@ -901,7 +950,10 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1052,9 +1104,13 @@ } ], "source": [ - "df3 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],\n", - " 'salary': [70000, 80000, 120000, 90000]})\n", - "display('df1', 'df3', 'pd.merge(df1, df3, left_on=\"employee\", right_on=\"name\")')" + "df3 = pd.DataFrame(\n", + " {\n", + " \"name\": [\"Bob\", \"Jake\", \"Lisa\", \"Sue\"],\n", + " \"salary\": [70000, 80000, 120000, 90000],\n", + " }\n", + ")\n", + "display(\"df1\", \"df3\", 'pd.merge(df1, df3, left_on=\"employee\", right_on=\"name\")')" ] }, { @@ -1068,7 +1124,10 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1127,7 +1186,7 @@ } ], "source": [ - "pd.merge(df1, df3, left_on=\"employee\", right_on=\"name\").drop('name', axis=1)" + "pd.merge(df1, df3, left_on=\"employee\", right_on=\"name\").drop(\"name\", axis=1)" ] }, { @@ -1144,7 +1203,10 @@ "cell_type": "code", "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1243,9 +1305,9 @@ } ], "source": [ - "df1a = df1.set_index('employee')\n", - "df2a = df2.set_index('employee')\n", - "display('df1a', 'df2a')" + "df1a = df1.set_index(\"employee\")\n", + "df2a = df2.set_index(\"employee\")\n", + "display(\"df1a\", \"df2a\")" ] }, { @@ -1259,7 +1321,10 @@ "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1406,8 +1471,9 @@ } ], "source": [ - "display('df1a', 'df2a',\n", - " \"pd.merge(df1a, df2a, left_index=True, right_index=True)\")" + "display(\n", + " \"df1a\", \"df2a\", \"pd.merge(df1a, df2a, left_index=True, right_index=True)\"\n", + ")" ] }, { @@ -1421,7 +1487,10 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1568,7 +1637,7 @@ } ], "source": [ - "display('df1a', 'df2a', 'df1a.join(df2a)')" + "display(\"df1a\", \"df2a\", \"df1a.join(df2a)\")" ] }, { @@ -1582,7 +1651,10 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1728,7 +1800,7 @@ } ], "source": [ - "display('df1a', 'df3', \"pd.merge(df1a, df3, left_index=True, right_on='name')\")" + "display(\"df1a\", \"df3\", \"pd.merge(df1a, df3, left_index=True, right_on='name')\")" ] }, { @@ -1758,7 +1830,10 @@ "cell_type": "code", "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1865,13 +1940,15 @@ } ], "source": [ - "df6 = pd.DataFrame({'name': ['Peter', 'Paul', 'Mary'],\n", - " 'food': ['fish', 'beans', 'bread']},\n", - " columns=['name', 'food'])\n", - "df7 = pd.DataFrame({'name': ['Mary', 'Joseph'],\n", - " 'drink': ['wine', 'beer']},\n", - " columns=['name', 'drink'])\n", - "display('df6', 'df7', 'pd.merge(df6, df7)')" + "df6 = pd.DataFrame(\n", + " {\"name\": [\"Peter\", \"Paul\", \"Mary\"], \"food\": [\"fish\", \"beans\", \"bread\"]},\n", + " columns=[\"name\", \"food\"],\n", + ")\n", + "df7 = pd.DataFrame(\n", + " {\"name\": [\"Mary\", \"Joseph\"], \"drink\": [\"wine\", \"beer\"]},\n", + " columns=[\"name\", \"drink\"],\n", + ")\n", + "display(\"df6\", \"df7\", \"pd.merge(df6, df7)\")" ] }, { @@ -1887,7 +1964,10 @@ "cell_type": "code", "execution_count": 14, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1925,7 +2005,7 @@ } ], "source": [ - "pd.merge(df6, df7, how='inner')" + "pd.merge(df6, df7, how=\"inner\")" ] }, { @@ -1940,7 +2020,10 @@ "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -2068,7 +2151,7 @@ } ], "source": [ - "display('df6', 'df7', \"pd.merge(df6, df7, how='outer')\")" + "display(\"df6\", \"df7\", \"pd.merge(df6, df7, how='outer')\")" ] }, { @@ -2083,7 +2166,10 @@ "cell_type": "code", "execution_count": 16, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -2204,7 +2290,7 @@ } ], "source": [ - "display('df6', 'df7', \"pd.merge(df6, df7, how='left')\")" + "display(\"df6\", \"df7\", \"pd.merge(df6, df7, how='left')\")" ] }, { @@ -2236,7 +2322,10 @@ "cell_type": "code", "execution_count": 17, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -2382,11 +2471,13 @@ } ], "source": [ - "df8 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],\n", - " 'rank': [1, 2, 3, 4]})\n", - "df9 = pd.DataFrame({'name': ['Bob', 'Jake', 'Lisa', 'Sue'],\n", - " 'rank': [3, 1, 4, 2]})\n", - "display('df8', 'df9', 'pd.merge(df8, df9, on=\"name\")')" + "df8 = pd.DataFrame(\n", + " {\"name\": [\"Bob\", \"Jake\", \"Lisa\", \"Sue\"], \"rank\": [1, 2, 3, 4]}\n", + ")\n", + "df9 = pd.DataFrame(\n", + " {\"name\": [\"Bob\", \"Jake\", \"Lisa\", \"Sue\"], \"rank\": [3, 1, 4, 2]}\n", + ")\n", + "display(\"df8\", \"df9\", 'pd.merge(df8, df9, on=\"name\")')" ] }, { @@ -2401,7 +2492,10 @@ "cell_type": "code", "execution_count": 18, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -2547,7 +2641,7 @@ } ], "source": [ - "display('df8', 'df9', 'pd.merge(df8, df9, on=\"name\", suffixes=[\"_L\", \"_R\"])')" + "display(\"df8\", \"df9\", 'pd.merge(df8, df9, on=\"name\", suffixes=[\"_L\", \"_R\"])')" ] }, { @@ -2580,7 +2674,10 @@ "cell_type": "code", "execution_count": 19, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ @@ -2601,7 +2698,10 @@ "cell_type": "code", "execution_count": 20, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -2772,11 +2872,11 @@ } ], "source": [ - "pop = pd.read_csv('data/state-population.csv')\n", - "areas = pd.read_csv('data/state-areas.csv')\n", - "abbrevs = pd.read_csv('data/state-abbrevs.csv')\n", + "pop = pd.read_csv(\"data/state-population.csv\")\n", + "areas = pd.read_csv(\"data/state-areas.csv\")\n", + "abbrevs = pd.read_csv(\"data/state-abbrevs.csv\")\n", "\n", - "display('pop.head()', 'areas.head()', 'abbrevs.head()')" + "display(\"pop.head()\", \"areas.head()\", \"abbrevs.head()\")" ] }, { @@ -2795,7 +2895,10 @@ "cell_type": "code", "execution_count": 21, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -2873,9 +2976,10 @@ } ], "source": [ - "merged = pd.merge(pop, abbrevs, how='outer',\n", - " left_on='state/region', right_on='abbreviation')\n", - "merged = merged.drop('abbreviation', 1) # drop duplicate info\n", + "merged = pd.merge(\n", + " pop, abbrevs, how=\"outer\", left_on=\"state/region\", right_on=\"abbreviation\"\n", + ")\n", + "merged = merged.drop(\"abbreviation\", 1) # drop duplicate info\n", "merged.head()" ] }, @@ -2890,7 +2994,10 @@ "cell_type": "code", "execution_count": 22, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -2924,7 +3031,10 @@ "cell_type": "code", "execution_count": 23, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -3002,7 +3112,7 @@ } ], "source": [ - "merged[merged['population'].isnull()].head()" + "merged[merged[\"population\"].isnull()].head()" ] }, { @@ -3019,7 +3129,10 @@ "cell_type": "code", "execution_count": 24, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -3034,7 +3147,7 @@ } ], "source": [ - "merged.loc[merged['state'].isnull(), 'state/region'].unique()" + "merged.loc[merged[\"state\"].isnull(), \"state/region\"].unique()" ] }, { @@ -3049,7 +3162,10 @@ "cell_type": "code", "execution_count": 25, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -3069,8 +3185,8 @@ } ], "source": [ - "merged.loc[merged['state/region'] == 'PR', 'state'] = 'Puerto Rico'\n", - "merged.loc[merged['state/region'] == 'USA', 'state'] = 'United States'\n", + "merged.loc[merged[\"state/region\"] == \"PR\", \"state\"] = \"Puerto Rico\"\n", + "merged.loc[merged[\"state/region\"] == \"USA\", \"state\"] = \"United States\"\n", "merged.isnull().any()" ] }, @@ -3088,7 +3204,10 @@ "cell_type": "code", "execution_count": 26, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -3172,7 +3291,7 @@ } ], "source": [ - "final = pd.merge(merged, areas, on='state', how='left')\n", + "final = pd.merge(merged, areas, on=\"state\", how=\"left\")\n", "final.head()" ] }, @@ -3187,7 +3306,10 @@ "cell_type": "code", "execution_count": 27, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -3222,7 +3344,10 @@ "cell_type": "code", "execution_count": 28, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -3237,7 +3362,7 @@ } ], "source": [ - "final['state'][final['area (sq. mi)'].isnull()].unique()" + "final[\"state\"][final[\"area (sq. mi)\"].isnull()].unique()" ] }, { @@ -3252,7 +3377,10 @@ "cell_type": "code", "execution_count": 29, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -3352,7 +3480,10 @@ "cell_type": "code", "execution_count": 30, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -3452,19 +3583,25 @@ "cell_type": "code", "execution_count": 31, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ - "data2010.set_index('state', inplace=True)\n", - "density = data2010['population'] / data2010['area (sq. mi)']" + "data2010.set_index(\"state\", inplace=True)\n", + "density = data2010[\"population\"] / data2010[\"area (sq. mi)\"]" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -3503,7 +3640,10 @@ "cell_type": "code", "execution_count": 33, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -3565,9 +3705,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/03.08-Aggregation-and-Grouping.ipynb b/notebooks/03.08-Aggregation-and-Grouping.ipynb index be00723d1..124c35ab0 100644 --- a/notebooks/03.08-Aggregation-and-Grouping.ipynb +++ b/notebooks/03.08-Aggregation-and-Grouping.ipynb @@ -31,9 +31,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "An essential piece of analysis of large data is efficient summarization: computing aggregations like ``sum()``, ``mean()``, ``median()``, ``min()``, and ``max()``, in which a single number gives insight into the nature of a potentially large dataset.\n", "In this section, we'll explore aggregations in Pandas, from simple operations akin to what we've seen on NumPy arrays, to more sophisticated operations based on the concept of a ``groupby``." @@ -50,28 +48,34 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "\n", + "\n", "class display(object):\n", " \"\"\"Display HTML representation of multiple objects\"\"\"\n", + "\n", " template = \"\"\"
\n", "

{0}

{1}\n", "
\"\"\"\n", + "\n", " def __init__(self, *args):\n", " self.args = args\n", - " \n", + "\n", " def _repr_html_(self):\n", - " return '\\n'.join(self.template.format(a, eval(a)._repr_html_())\n", - " for a in self.args)\n", - " \n", + " return \"\\n\".join(\n", + " self.template.format(a, eval(a)._repr_html_()) for a in self.args\n", + " )\n", + "\n", " def __repr__(self):\n", - " return '\\n\\n'.join(a + '\\n' + repr(eval(a))\n", - " for a in self.args)" + " return \"\\n\\n\".join(a + \"\\n\" + repr(eval(a)) for a in self.args)" ] }, { @@ -88,7 +92,10 @@ "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -104,7 +111,8 @@ ], "source": [ "import seaborn as sns\n", - "planets = sns.load_dataset('planets')\n", + "\n", + "planets = sns.load_dataset(\"planets\")\n", "planets.shape" ] }, @@ -112,7 +120,10 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -225,7 +236,10 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -254,7 +268,10 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -276,7 +293,10 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -305,7 +325,10 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -365,8 +388,7 @@ } ], "source": [ - "df = pd.DataFrame({'A': rng.rand(5),\n", - " 'B': rng.rand(5)})\n", + "df = pd.DataFrame({\"A\": rng.rand(5), \"B\": rng.rand(5)})\n", "df" ] }, @@ -374,7 +396,10 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -405,7 +430,10 @@ "cell_type": "code", "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -425,7 +453,7 @@ } ], "source": [ - "df.mean(axis='columns')" + "df.mean(axis=\"columns\")" ] }, { @@ -440,7 +468,10 @@ "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -633,7 +664,10 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -699,8 +733,10 @@ } ], "source": [ - "df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],\n", - " 'data': range(6)}, columns=['key', 'data'])\n", + "df = pd.DataFrame(\n", + " {\"key\": [\"A\", \"B\", \"C\", \"A\", \"B\", \"C\"], \"data\": range(6)},\n", + " columns=[\"key\", \"data\"],\n", + ")\n", "df" ] }, @@ -715,7 +751,10 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -730,7 +769,7 @@ } ], "source": [ - "df.groupby('key')" + "df.groupby(\"key\")" ] }, { @@ -748,7 +787,10 @@ "cell_type": "code", "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -797,7 +839,7 @@ } ], "source": [ - "df.groupby('key').sum()" + "df.groupby(\"key\").sum()" ] }, { @@ -834,7 +876,10 @@ "cell_type": "code", "execution_count": 14, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -849,14 +894,17 @@ } ], "source": [ - "planets.groupby('method')" + "planets.groupby(\"method\")" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -871,7 +919,7 @@ } ], "source": [ - "planets.groupby('method')['orbital_period']" + "planets.groupby(\"method\")[\"orbital_period\"]" ] }, { @@ -886,7 +934,10 @@ "cell_type": "code", "execution_count": 16, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -912,7 +963,7 @@ } ], "source": [ - "planets.groupby('method')['orbital_period'].median()" + "planets.groupby(\"method\")[\"orbital_period\"].median()" ] }, { @@ -935,7 +986,10 @@ "cell_type": "code", "execution_count": 17, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -956,7 +1010,7 @@ } ], "source": [ - "for (method, group) in planets.groupby('method'):\n", + "for (method, group) in planets.groupby(\"method\"):\n", " print(\"{0:30s} shape={1}\".format(method, group.shape))" ] }, @@ -981,7 +1035,10 @@ "cell_type": "code", "execution_count": 18, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1162,7 +1219,7 @@ } ], "source": [ - "planets.groupby('method')['year'].describe().unstack()" + "planets.groupby(\"method\")[\"year\"].describe().unstack()" ] }, { @@ -1193,7 +1250,10 @@ "cell_type": "code", "execution_count": 19, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1267,10 +1327,14 @@ ], "source": [ "rng = np.random.RandomState(0)\n", - "df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],\n", - " 'data1': range(6),\n", - " 'data2': rng.randint(0, 10, 6)},\n", - " columns = ['key', 'data1', 'data2'])\n", + "df = pd.DataFrame(\n", + " {\n", + " \"key\": [\"A\", \"B\", \"C\", \"A\", \"B\", \"C\"],\n", + " \"data1\": range(6),\n", + " \"data2\": rng.randint(0, 10, 6),\n", + " },\n", + " columns=[\"key\", \"data1\", \"data2\"],\n", + ")\n", "df" ] }, @@ -1289,7 +1353,10 @@ "cell_type": "code", "execution_count": 20, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1369,7 +1436,7 @@ } ], "source": [ - "df.groupby('key').aggregate(['min', np.median, max])" + "df.groupby(\"key\").aggregate([\"min\", np.median, max])" ] }, { @@ -1383,7 +1450,10 @@ "cell_type": "code", "execution_count": 21, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1437,8 +1507,7 @@ } ], "source": [ - "df.groupby('key').aggregate({'data1': 'min',\n", - " 'data2': 'max'})" + "df.groupby(\"key\").aggregate({\"data1\": \"min\", \"data2\": \"max\"})" ] }, { @@ -1455,7 +1524,10 @@ "cell_type": "code", "execution_count": 22, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1621,9 +1693,12 @@ ], "source": [ "def filter_func(x):\n", - " return x['data2'].std() > 4\n", + " return x[\"data2\"].std() > 4\n", "\n", - "display('df', \"df.groupby('key').std()\", \"df.groupby('key').filter(filter_func)\")" + "\n", + "display(\n", + " \"df\", \"df.groupby('key').std()\", \"df.groupby('key').filter(filter_func)\"\n", + ")" ] }, { @@ -1648,7 +1723,10 @@ "cell_type": "code", "execution_count": 23, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1714,7 +1792,7 @@ } ], "source": [ - "df.groupby('key').transform(lambda x: x - x.mean())" + "df.groupby(\"key\").transform(lambda x: x - x.mean())" ] }, { @@ -1733,7 +1811,10 @@ "cell_type": "code", "execution_count": 24, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1872,10 +1953,11 @@ "source": [ "def norm_by_data2(x):\n", " # x is a DataFrame of group values\n", - " x['data1'] /= x['data2'].sum()\n", + " x[\"data1\"] /= x[\"data2\"].sum()\n", " return x\n", "\n", - "display('df', \"df.groupby('key').apply(norm_by_data2)\")" + "\n", + "display(\"df\", \"df.groupby('key').apply(norm_by_data2)\")" ] }, { @@ -1908,7 +1990,10 @@ "cell_type": "code", "execution_count": 25, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -2021,7 +2106,7 @@ ], "source": [ "L = [0, 1, 0, 1, 2, 0]\n", - "display('df', 'df.groupby(L).sum()')" + "display(\"df\", \"df.groupby(L).sum()\")" ] }, { @@ -2035,7 +2120,10 @@ "cell_type": "code", "execution_count": 26, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -2153,7 +2241,7 @@ } ], "source": [ - "display('df', \"df.groupby(df['key']).sum()\")" + "display(\"df\", \"df.groupby(df['key']).sum()\")" ] }, { @@ -2169,7 +2257,10 @@ "cell_type": "code", "execution_count": 27, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -2274,9 +2365,9 @@ } ], "source": [ - "df2 = df.set_index('key')\n", - "mapping = {'A': 'vowel', 'B': 'consonant', 'C': 'consonant'}\n", - "display('df2', 'df2.groupby(mapping).sum()')" + "df2 = df.set_index(\"key\")\n", + "mapping = {\"A\": \"vowel\", \"B\": \"consonant\", \"C\": \"consonant\"}\n", + "display(\"df2\", \"df2.groupby(mapping).sum()\")" ] }, { @@ -2292,7 +2383,10 @@ "cell_type": "code", "execution_count": 28, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -2403,7 +2497,7 @@ } ], "source": [ - "display('df2', 'df2.groupby(str.lower).mean()')" + "display(\"df2\", \"df2.groupby(str.lower).mean()\")" ] }, { @@ -2419,7 +2513,10 @@ "cell_type": "code", "execution_count": 29, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -2487,7 +2584,10 @@ "cell_type": "code", "execution_count": 30, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -2607,10 +2707,10 @@ } ], "source": [ - "decade = 10 * (planets['year'] // 10)\n", - "decade = decade.astype(str) + 's'\n", - "decade.name = 'decade'\n", - "planets.groupby(['method', decade])['number'].sum().unstack().fillna(0)" + "decade = 10 * (planets[\"year\"] // 10)\n", + "decade = decade.astype(str) + \"s\"\n", + "decade.name = \"decade\"\n", + "planets.groupby([\"method\", decade])[\"number\"].sum().unstack().fillna(0)" ] }, { @@ -2652,9 +2752,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/03.09-Pivot-Tables.ipynb b/notebooks/03.09-Pivot-Tables.ipynb index 717549875..f484133cc 100644 --- a/notebooks/03.09-Pivot-Tables.ipynb +++ b/notebooks/03.09-Pivot-Tables.ipynb @@ -53,21 +53,28 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", - "titanic = sns.load_dataset('titanic')" + "\n", + "titanic = sns.load_dataset(\"titanic\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -236,7 +243,10 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -280,7 +290,7 @@ } ], "source": [ - "titanic.groupby('sex')[['survived']].mean()" + "titanic.groupby(\"sex\")[[\"survived\"]].mean()" ] }, { @@ -298,7 +308,10 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -350,7 +363,7 @@ } ], "source": [ - "titanic.groupby(['sex', 'class'])['survived'].aggregate('mean').unstack()" + "titanic.groupby([\"sex\", \"class\"])[\"survived\"].aggregate(\"mean\").unstack()" ] }, { @@ -375,7 +388,10 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -427,7 +443,7 @@ } ], "source": [ - "titanic.pivot_table('survived', index='sex', columns='class')" + "titanic.pivot_table(\"survived\", index=\"sex\", columns=\"class\")" ] }, { @@ -454,7 +470,10 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -524,8 +543,8 @@ } ], "source": [ - "age = pd.cut(titanic['age'], [0, 18, 80])\n", - "titanic.pivot_table('survived', ['sex', age], 'class')" + "age = pd.cut(titanic[\"age\"], [0, 18, 80])\n", + "titanic.pivot_table(\"survived\", [\"sex\", age], \"class\")" ] }, { @@ -539,7 +558,10 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -642,8 +664,8 @@ } ], "source": [ - "fare = pd.qcut(titanic['fare'], 2)\n", - "titanic.pivot_table('survived', ['sex', age], [fare, 'class'])" + "fare = pd.qcut(titanic[\"fare\"], 2)\n", + "titanic.pivot_table(\"survived\", [\"sex\", age], [fare, \"class\"])" ] }, { @@ -680,7 +702,10 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -750,8 +775,9 @@ } ], "source": [ - "titanic.pivot_table(index='sex', columns='class',\n", - " aggfunc={'survived':sum, 'fare':'mean'})" + "titanic.pivot_table(\n", + " index=\"sex\", columns=\"class\", aggfunc={\"survived\": sum, \"fare\": \"mean\"}\n", + ")" ] }, { @@ -763,9 +789,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "At times it's useful to compute totals along each grouping.\n", "This can be done via the ``margins`` keyword:" @@ -775,7 +799,10 @@ "cell_type": "code", "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -839,7 +866,7 @@ } ], "source": [ - "titanic.pivot_table('survived', index='sex', columns='class', margins=True)" + "titanic.pivot_table(\"survived\", index=\"sex\", columns=\"class\", margins=True)" ] }, { @@ -865,7 +892,10 @@ "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ @@ -877,11 +907,14 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ - "births = pd.read_csv('data/births.csv')" + "births = pd.read_csv(\"data/births.csv\")" ] }, { @@ -895,7 +928,10 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -988,7 +1024,10 @@ "cell_type": "code", "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1054,8 +1093,8 @@ } ], "source": [ - "births['decade'] = 10 * (births['year'] // 10)\n", - "births.pivot_table('births', index='decade', columns='gender', aggfunc='sum')" + "births[\"decade\"] = 10 * (births[\"year\"] // 10)\n", + "births.pivot_table(\"births\", index=\"decade\", columns=\"gender\", aggfunc=\"sum\")" ] }, { @@ -1070,7 +1109,10 @@ "cell_type": "code", "execution_count": 14, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1087,9 +1129,12 @@ "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", + "\n", "sns.set() # use Seaborn styles\n", - "births.pivot_table('births', index='year', columns='gender', aggfunc='sum').plot()\n", - "plt.ylabel('total births per year');" + "births.pivot_table(\n", + " \"births\", index=\"year\", columns=\"gender\", aggfunc=\"sum\"\n", + ").plot()\n", + "plt.ylabel(\"total births per year\");" ] }, { @@ -1114,11 +1159,14 @@ "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ - "quartiles = np.percentile(births['births'], [25, 50, 75])\n", + "quartiles = np.percentile(births[\"births\"], [25, 50, 75])\n", "mu = quartiles[1]\n", "sig = 0.74 * (quartiles[2] - quartiles[0])" ] @@ -1136,11 +1184,14 @@ "cell_type": "code", "execution_count": 16, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ - "births = births.query('(births > @mu - 5 * @sig) & (births < @mu + 5 * @sig)')" + "births = births.query(\"(births > @mu - 5 * @sig) & (births < @mu + 5 * @sig)\")" ] }, { @@ -1154,12 +1205,15 @@ "cell_type": "code", "execution_count": 17, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ "# set 'day' column to integer; it originally was a string due to nulls\n", - "births['day'] = births['day'].astype(int)" + "births[\"day\"] = births[\"day\"].astype(int)" ] }, { @@ -1174,16 +1228,19 @@ "cell_type": "code", "execution_count": 18, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ "# create a datetime index from the year, month, day\n", - "births.index = pd.to_datetime(10000 * births.year +\n", - " 100 * births.month +\n", - " births.day, format='%Y%m%d')\n", + "births.index = pd.to_datetime(\n", + " 10000 * births.year + 100 * births.month + births.day, format=\"%Y%m%d\"\n", + ")\n", "\n", - "births['dayofweek'] = births.index.dayofweek" + "births[\"dayofweek\"] = births.index.dayofweek" ] }, { @@ -1197,7 +1254,10 @@ "cell_type": "code", "execution_count": 19, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1212,13 +1272,14 @@ } ], "source": [ - "import matplotlib.pyplot as plt\n", "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", "\n", - "births.pivot_table('births', index='dayofweek',\n", - " columns='decade', aggfunc='mean').plot()\n", - "plt.gca().set_xticklabels(['Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun'])\n", - "plt.ylabel('mean births by day');" + "births.pivot_table(\n", + " \"births\", index=\"dayofweek\", columns=\"decade\", aggfunc=\"mean\"\n", + ").plot()\n", + "plt.gca().set_xticklabels([\"Mon\", \"Tues\", \"Wed\", \"Thurs\", \"Fri\", \"Sat\", \"Sun\"])\n", + "plt.ylabel(\"mean births by day\");" ] }, { @@ -1235,7 +1296,10 @@ "cell_type": "code", "execution_count": 20, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1255,8 +1319,9 @@ } ], "source": [ - "births_by_date = births.pivot_table('births', \n", - " [births.index.month, births.index.day])\n", + "births_by_date = births.pivot_table(\n", + " \"births\", [births.index.month, births.index.day]\n", + ")\n", "births_by_date.head()" ] }, @@ -1272,7 +1337,10 @@ "cell_type": "code", "execution_count": 21, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1292,8 +1360,9 @@ } ], "source": [ - "births_by_date.index = [pd.datetime(2012, month, day)\n", - " for (month, day) in births_by_date.index]\n", + "births_by_date.index = [\n", + " pd.datetime(2012, month, day) for (month, day) in births_by_date.index\n", + "]\n", "births_by_date.head()" ] }, @@ -1309,7 +1378,10 @@ "cell_type": "code", "execution_count": 22, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1331,9 +1403,7 @@ }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ "In particular, the striking feature of this graph is the dip in birthrate on US holidays (e.g., Independence Day, Labor Day, Thanksgiving, Christmas, New Year's Day) although this likely reflects trends in scheduled/induced births rather than some deep psychosomatic effect on natural births.\n", "For more discussion on this trend, see the analysis and links in [Andrew Gelman's blog post](http://andrewgelman.com/2012/06/14/cool-ass-signal-processing-using-gaussian-processes/) on the subject.\n", @@ -1375,5 +1445,5 @@ } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/03.10-Working-With-Strings.ipynb b/notebooks/03.10-Working-With-Strings.ipynb index 75c004b84..29164589a 100644 --- a/notebooks/03.10-Working-With-Strings.ipynb +++ b/notebooks/03.10-Working-With-Strings.ipynb @@ -51,7 +51,10 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -67,6 +70,7 @@ ], "source": [ "import numpy as np\n", + "\n", "x = np.array([2, 3, 5, 7, 11, 13])\n", "x * 2" ] @@ -83,7 +87,10 @@ "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -98,7 +105,7 @@ } ], "source": [ - "data = ['peter', 'Paul', 'MARY', 'gUIDO']\n", + "data = [\"peter\", \"Paul\", \"MARY\", \"gUIDO\"]\n", "[s.capitalize() for s in data]" ] }, @@ -114,7 +121,10 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -131,7 +141,7 @@ } ], "source": [ - "data = ['peter', 'Paul', None, 'MARY', 'gUIDO']\n", + "data = [\"peter\", \"Paul\", None, \"MARY\", \"gUIDO\"]\n", "[s.capitalize() for s in data]" ] }, @@ -147,7 +157,10 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -168,6 +181,7 @@ ], "source": [ "import pandas as pd\n", + "\n", "names = pd.Series(data)\n", "names" ] @@ -183,7 +197,10 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -227,12 +244,23 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ - "monte = pd.Series(['Graham Chapman', 'John Cleese', 'Terry Gilliam',\n", - " 'Eric Idle', 'Terry Jones', 'Michael Palin'])" + "monte = pd.Series(\n", + " [\n", + " \"Graham Chapman\",\n", + " \"John Cleese\",\n", + " \"Terry Gilliam\",\n", + " \"Eric Idle\",\n", + " \"Terry Jones\",\n", + " \"Michael Palin\",\n", + " ]\n", + ")" ] }, { @@ -260,7 +288,10 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -295,7 +326,10 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -330,7 +364,10 @@ "cell_type": "code", "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -351,7 +388,7 @@ } ], "source": [ - "monte.str.startswith('T')" + "monte.str.startswith(\"T\")" ] }, { @@ -365,7 +402,10 @@ "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -428,7 +468,10 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -449,7 +492,7 @@ } ], "source": [ - "monte.str.extract('([A-Za-z]+)', expand=False)" + "monte.str.extract(\"([A-Za-z]+)\", expand=False)" ] }, { @@ -463,7 +506,10 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -484,7 +530,7 @@ } ], "source": [ - "monte.str.findall(r'^[^AEIOU].*[^aeiou]$')" + "monte.str.findall(r\"^[^AEIOU].*[^aeiou]$\")" ] }, { @@ -530,7 +576,10 @@ "cell_type": "code", "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -568,7 +617,10 @@ "cell_type": "code", "execution_count": 14, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -607,7 +659,10 @@ "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -673,9 +728,9 @@ } ], "source": [ - "full_monte = pd.DataFrame({'name': monte,\n", - " 'info': ['B|C|D', 'B|D', 'A|C',\n", - " 'B|D', 'B|C', 'B|C|D']})\n", + "full_monte = pd.DataFrame(\n", + " {\"name\": monte, \"info\": [\"B|C|D\", \"B|D\", \"A|C\", \"B|D\", \"B|C\", \"B|C|D\"]}\n", + ")\n", "full_monte" ] }, @@ -690,7 +745,10 @@ "cell_type": "code", "execution_count": 16, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -770,7 +828,7 @@ } ], "source": [ - "full_monte['info'].str.get_dummies('|')" + "full_monte[\"info\"].str.get_dummies(\"|\")" ] }, { @@ -801,7 +859,10 @@ "cell_type": "code", "execution_count": 17, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ @@ -820,7 +881,10 @@ "cell_type": "code", "execution_count": 18, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -833,7 +897,7 @@ ], "source": [ "try:\n", - " recipes = pd.read_json('recipeitems-latest.json')\n", + " recipes = pd.read_json(\"recipeitems-latest.json\")\n", "except ValueError as e:\n", " print(\"ValueError:\", e)" ] @@ -851,7 +915,10 @@ "cell_type": "code", "execution_count": 19, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -866,7 +933,7 @@ } ], "source": [ - "with open('recipeitems-latest.json') as f:\n", + "with open(\"recipeitems-latest.json\") as f:\n", " line = f.readline()\n", "pd.read_json(line).shape" ] @@ -883,16 +950,19 @@ "cell_type": "code", "execution_count": 20, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ "# read the entire file into a Python array\n", - "with open('recipeitems-latest.json', 'r') as f:\n", + "with open(\"recipeitems-latest.json\", \"r\") as f:\n", " # Extract each line\n", " data = (line.strip() for line in f)\n", " # Reformat so each line is the element of a list\n", - " data_json = \"[{0}]\".format(','.join(data))\n", + " data_json = \"[{0}]\".format(\",\".join(data))\n", "# read the result as a JSON\n", "recipes = pd.read_json(data_json)" ] @@ -901,7 +971,10 @@ "cell_type": "code", "execution_count": 21, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -931,7 +1004,10 @@ "cell_type": "code", "execution_count": 22, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -979,7 +1055,10 @@ "cell_type": "code", "execution_count": 23, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1018,7 +1097,10 @@ "cell_type": "code", "execution_count": 24, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1049,7 +1131,10 @@ "cell_type": "code", "execution_count": 25, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1064,7 +1149,7 @@ } ], "source": [ - "recipes.description.str.contains('[Bb]reakfast').sum()" + "recipes.description.str.contains(\"[Bb]reakfast\").sum()" ] }, { @@ -1078,7 +1163,10 @@ "cell_type": "code", "execution_count": 26, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1093,7 +1181,7 @@ } ], "source": [ - "recipes.ingredients.str.contains('[Cc]innamon').sum()" + "recipes.ingredients.str.contains(\"[Cc]innamon\").sum()" ] }, { @@ -1107,7 +1195,10 @@ "cell_type": "code", "execution_count": 27, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1122,7 +1213,7 @@ } ], "source": [ - "recipes.ingredients.str.contains('[Cc]inamon').sum()" + "recipes.ingredients.str.contains(\"[Cc]inamon\").sum()" ] }, { @@ -1149,12 +1240,25 @@ "cell_type": "code", "execution_count": 28, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ - "spice_list = ['salt', 'pepper', 'oregano', 'sage', 'parsley',\n", - " 'rosemary', 'tarragon', 'thyme', 'paprika', 'cumin']" + "spice_list = [\n", + " \"salt\",\n", + " \"pepper\",\n", + " \"oregano\",\n", + " \"sage\",\n", + " \"parsley\",\n", + " \"rosemary\",\n", + " \"tarragon\",\n", + " \"thyme\",\n", + " \"paprika\",\n", + " \"cumin\",\n", + "]" ] }, { @@ -1168,7 +1272,10 @@ "cell_type": "code", "execution_count": 29, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1277,8 +1384,13 @@ ], "source": [ "import re\n", - "spice_df = pd.DataFrame(dict((spice, recipes.ingredients.str.contains(spice, re.IGNORECASE))\n", - " for spice in spice_list))\n", + "\n", + "spice_df = pd.DataFrame(\n", + " dict(\n", + " (spice, recipes.ingredients.str.contains(spice, re.IGNORECASE))\n", + " for spice in spice_list\n", + " )\n", + ")\n", "spice_df.head()" ] }, @@ -1294,7 +1406,10 @@ "cell_type": "code", "execution_count": 30, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1309,7 +1424,7 @@ } ], "source": [ - "selection = spice_df.query('parsley & paprika & tarragon')\n", + "selection = spice_df.query(\"parsley & paprika & tarragon\")\n", "len(selection)" ] }, @@ -1324,7 +1439,10 @@ "cell_type": "code", "execution_count": 31, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1399,9 +1517,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/03.11-Working-with-Time-Series.ipynb b/notebooks/03.11-Working-with-Time-Series.ipynb index c9b4d828b..91af5b4b7 100644 --- a/notebooks/03.11-Working-with-Time-Series.ipynb +++ b/notebooks/03.11-Working-with-Time-Series.ipynb @@ -71,7 +71,10 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -87,6 +90,7 @@ ], "source": [ "from datetime import datetime\n", + "\n", "datetime(year=2015, month=7, day=4)" ] }, @@ -101,7 +105,10 @@ "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -117,15 +124,14 @@ ], "source": [ "from dateutil import parser\n", + "\n", "date = parser.parse(\"4th of July, 2015\")\n", "date" ] }, { "cell_type": "markdown", - "metadata": { - "collapsed": false - }, + "metadata": {}, "source": [ "Once you have a ``datetime`` object, you can do things like printing the day of the week:" ] @@ -134,7 +140,10 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -149,7 +158,7 @@ } ], "source": [ - "date.strftime('%A')" + "date.strftime(\"%A\")" ] }, { @@ -180,7 +189,10 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -196,7 +208,8 @@ ], "source": [ "import numpy as np\n", - "date = np.array('2015-07-04', dtype=np.datetime64)\n", + "\n", + "date = np.array(\"2015-07-04\", dtype=np.datetime64)\n", "date" ] }, @@ -211,7 +224,10 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -250,7 +266,10 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -265,7 +284,7 @@ } ], "source": [ - "np.datetime64('2015-07-04')" + "np.datetime64(\"2015-07-04\")" ] }, { @@ -279,7 +298,10 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -294,7 +316,7 @@ } ], "source": [ - "np.datetime64('2015-07-04 12:00')" + "np.datetime64(\"2015-07-04 12:00\")" ] }, { @@ -309,7 +331,10 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -324,7 +349,7 @@ } ], "source": [ - "np.datetime64('2015-07-04 12:59:59.50', 'ns')" + "np.datetime64(\"2015-07-04 12:59:59.50\", \"ns\")" ] }, { @@ -382,7 +407,10 @@ "cell_type": "code", "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -398,6 +426,7 @@ ], "source": [ "import pandas as pd\n", + "\n", "date = pd.to_datetime(\"4th of July, 2015\")\n", "date" ] @@ -406,7 +435,10 @@ "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -421,7 +453,7 @@ } ], "source": [ - "date.strftime('%A')" + "date.strftime(\"%A\")" ] }, { @@ -435,7 +467,10 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -453,7 +488,7 @@ } ], "source": [ - "date + pd.to_timedelta(np.arange(12), 'D')" + "date + pd.to_timedelta(np.arange(12), \"D\")" ] }, { @@ -477,7 +512,10 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -496,8 +534,9 @@ } ], "source": [ - "index = pd.DatetimeIndex(['2014-07-04', '2014-08-04',\n", - " '2015-07-04', '2015-08-04'])\n", + "index = pd.DatetimeIndex(\n", + " [\"2014-07-04\", \"2014-08-04\", \"2015-07-04\", \"2015-08-04\"]\n", + ")\n", "data = pd.Series([0, 1, 2, 3], index=index)\n", "data" ] @@ -513,7 +552,10 @@ "cell_type": "code", "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -531,7 +573,7 @@ } ], "source": [ - "data['2014-07-04':'2015-07-04']" + "data[\"2014-07-04\":\"2015-07-04\"]" ] }, { @@ -545,7 +587,10 @@ "cell_type": "code", "execution_count": 14, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -562,7 +607,7 @@ } ], "source": [ - "data['2015']" + "data[\"2015\"]" ] }, { @@ -599,7 +644,10 @@ "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -616,8 +664,15 @@ } ], "source": [ - "dates = pd.to_datetime([datetime(2015, 7, 3), '4th of July, 2015',\n", - " '2015-Jul-6', '07-07-2015', '20150708'])\n", + "dates = pd.to_datetime(\n", + " [\n", + " datetime(2015, 7, 3),\n", + " \"4th of July, 2015\",\n", + " \"2015-Jul-6\",\n", + " \"07-07-2015\",\n", + " \"20150708\",\n", + " ]\n", + ")\n", "dates" ] }, @@ -632,7 +687,10 @@ "cell_type": "code", "execution_count": 16, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -649,7 +707,7 @@ } ], "source": [ - "dates.to_period('D')" + "dates.to_period(\"D\")" ] }, { @@ -663,7 +721,10 @@ "cell_type": "code", "execution_count": 17, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -697,7 +758,10 @@ "cell_type": "code", "execution_count": 18, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -714,7 +778,7 @@ } ], "source": [ - "pd.date_range('2015-07-03', '2015-07-10')" + "pd.date_range(\"2015-07-03\", \"2015-07-10\")" ] }, { @@ -728,7 +792,10 @@ "cell_type": "code", "execution_count": 19, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -745,7 +812,7 @@ } ], "source": [ - "pd.date_range('2015-07-03', periods=8)" + "pd.date_range(\"2015-07-03\", periods=8)" ] }, { @@ -760,7 +827,10 @@ "cell_type": "code", "execution_count": 20, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -779,7 +849,7 @@ } ], "source": [ - "pd.date_range('2015-07-03', periods=8, freq='H')" + "pd.date_range(\"2015-07-03\", periods=8, freq=\"H\")" ] }, { @@ -794,7 +864,10 @@ "cell_type": "code", "execution_count": 21, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -811,7 +884,7 @@ } ], "source": [ - "pd.period_range('2015-07', periods=8, freq='M')" + "pd.period_range(\"2015-07\", periods=8, freq=\"M\")" ] }, { @@ -825,7 +898,10 @@ "cell_type": "code", "execution_count": 22, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -842,7 +918,7 @@ } ], "source": [ - "pd.timedelta_range(0, periods=10, freq='H')" + "pd.timedelta_range(0, periods=10, freq=\"H\")" ] }, { @@ -922,7 +998,10 @@ "cell_type": "code", "execution_count": 23, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -954,7 +1033,10 @@ "cell_type": "code", "execution_count": 24, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -972,7 +1054,8 @@ ], "source": [ "from pandas.tseries.offsets import BDay\n", - "pd.date_range('2015-07-01', periods=5, freq=BDay())" + "\n", + "pd.date_range(\"2015-07-01\", periods=5, freq=BDay())" ] }, { @@ -1001,7 +1084,10 @@ "cell_type": "code", "execution_count": 25, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1090,8 +1176,7 @@ "source": [ "from pandas_datareader import data\n", "\n", - "goog = data.DataReader('GOOG', start='2004', end='2016',\n", - " data_source='google')\n", + "goog = data.DataReader(\"GOOG\", start=\"2004\", end=\"2016\", data_source=\"google\")\n", "goog.head()" ] }, @@ -1106,11 +1191,14 @@ "cell_type": "code", "execution_count": 26, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ - "goog = goog['Close']" + "goog = goog[\"Close\"]" ] }, { @@ -1124,20 +1212,29 @@ "cell_type": "code", "execution_count": 27, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", - "import seaborn; seaborn.set()" + "\n", + "import seaborn\n", + "\n", + "seaborn.set()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1173,7 +1270,10 @@ "cell_type": "code", "execution_count": 29, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1188,11 +1288,10 @@ } ], "source": [ - "goog.plot(alpha=0.5, style='-')\n", - "goog.resample('BA').mean().plot(style=':')\n", - "goog.asfreq('BA').plot(style='--');\n", - "plt.legend(['input', 'resample', 'asfreq'],\n", - " loc='upper left');" + "goog.plot(alpha=0.5, style=\"-\")\n", + "goog.resample(\"BA\").mean().plot(style=\":\")\n", + "goog.asfreq(\"BA\").plot(style=\"--\")\n", + "plt.legend([\"input\", \"resample\", \"asfreq\"], loc=\"upper left\");" ] }, { @@ -1216,7 +1315,10 @@ "cell_type": "code", "execution_count": 30, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1234,10 +1336,10 @@ "fig, ax = plt.subplots(2, sharex=True)\n", "data = goog.iloc[:10]\n", "\n", - "data.asfreq('D').plot(ax=ax[0], marker='o')\n", + "data.asfreq(\"D\").plot(ax=ax[0], marker=\"o\")\n", "\n", - "data.asfreq('D', method='bfill').plot(ax=ax[1], style='-o')\n", - "data.asfreq('D', method='ffill').plot(ax=ax[1], style='--o')\n", + "data.asfreq(\"D\", method=\"bfill\").plot(ax=ax[1], style=\"-o\")\n", + "data.asfreq(\"D\", method=\"ffill\").plot(ax=ax[1], style=\"--o\")\n", "ax[1].legend([\"back-fill\", \"forward-fill\"]);" ] }, @@ -1267,7 +1369,10 @@ "cell_type": "code", "execution_count": 31, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1285,27 +1390,27 @@ "fig, ax = plt.subplots(3, sharey=True)\n", "\n", "# apply a frequency to the data\n", - "goog = goog.asfreq('D', method='pad')\n", + "goog = goog.asfreq(\"D\", method=\"pad\")\n", "\n", "goog.plot(ax=ax[0])\n", "goog.shift(900).plot(ax=ax[1])\n", "goog.tshift(900).plot(ax=ax[2])\n", "\n", "# legends and annotations\n", - "local_max = pd.to_datetime('2007-11-05')\n", - "offset = pd.Timedelta(900, 'D')\n", + "local_max = pd.to_datetime(\"2007-11-05\")\n", + "offset = pd.Timedelta(900, \"D\")\n", "\n", - "ax[0].legend(['input'], loc=2)\n", - "ax[0].get_xticklabels()[2].set(weight='heavy', color='red')\n", - "ax[0].axvline(local_max, alpha=0.3, color='red')\n", + "ax[0].legend([\"input\"], loc=2)\n", + "ax[0].get_xticklabels()[2].set(weight=\"heavy\", color=\"red\")\n", + "ax[0].axvline(local_max, alpha=0.3, color=\"red\")\n", "\n", - "ax[1].legend(['shift(900)'], loc=2)\n", - "ax[1].get_xticklabels()[2].set(weight='heavy', color='red')\n", - "ax[1].axvline(local_max + offset, alpha=0.3, color='red')\n", + "ax[1].legend([\"shift(900)\"], loc=2)\n", + "ax[1].get_xticklabels()[2].set(weight=\"heavy\", color=\"red\")\n", + "ax[1].axvline(local_max + offset, alpha=0.3, color=\"red\")\n", "\n", - "ax[2].legend(['tshift(900)'], loc=2)\n", - "ax[2].get_xticklabels()[1].set(weight='heavy', color='red')\n", - "ax[2].axvline(local_max + offset, alpha=0.3, color='red');" + "ax[2].legend([\"tshift(900)\"], loc=2)\n", + "ax[2].get_xticklabels()[1].set(weight=\"heavy\", color=\"red\")\n", + "ax[2].axvline(local_max + offset, alpha=0.3, color=\"red\");" ] }, { @@ -1321,7 +1426,10 @@ "cell_type": "code", "execution_count": 32, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1338,7 +1446,7 @@ "source": [ "ROI = 100 * (goog.tshift(-365) / goog - 1)\n", "ROI.plot()\n", - "plt.ylabel('% Return on Investment');" + "plt.ylabel(\"% Return on Investment\");" ] }, { @@ -1365,7 +1473,10 @@ "cell_type": "code", "execution_count": 33, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1382,10 +1493,14 @@ "source": [ "rolling = goog.rolling(365, center=True)\n", "\n", - "data = pd.DataFrame({'input': goog,\n", - " 'one-year rolling_mean': rolling.mean(),\n", - " 'one-year rolling_std': rolling.std()})\n", - "ax = data.plot(style=['-', '--', ':'])\n", + "data = pd.DataFrame(\n", + " {\n", + " \"input\": goog,\n", + " \"one-year rolling_mean\": rolling.mean(),\n", + " \"one-year rolling_std\": rolling.std(),\n", + " }\n", + ")\n", + "ax = data.plot(style=[\"-\", \"--\", \":\"])\n", "ax.lines[0].set_alpha(0.3)" ] }, @@ -1428,7 +1543,10 @@ "cell_type": "code", "execution_count": 34, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ @@ -1447,7 +1565,10 @@ "cell_type": "code", "execution_count": 35, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1521,7 +1642,7 @@ } ], "source": [ - "data = pd.read_csv('FremontBridge.csv', index_col='Date', parse_dates=True)\n", + "data = pd.read_csv(\"FremontBridge.csv\", index_col=\"Date\", parse_dates=True)\n", "data.head()" ] }, @@ -1536,12 +1657,15 @@ "cell_type": "code", "execution_count": 36, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ - "data.columns = ['West', 'East']\n", - "data['Total'] = data.eval('West + East')" + "data.columns = [\"West\", \"East\"]\n", + "data[\"Total\"] = data.eval(\"West + East\")" ] }, { @@ -1555,7 +1679,10 @@ "cell_type": "code", "execution_count": 37, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1659,19 +1786,27 @@ "cell_type": "code", "execution_count": 38, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ "%matplotlib inline\n", - "import seaborn; seaborn.set()" + "import seaborn\n", + "\n", + "seaborn.set()" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1687,7 +1822,7 @@ ], "source": [ "data.plot()\n", - "plt.ylabel('Hourly Bicycle Count');" + "plt.ylabel(\"Hourly Bicycle Count\");" ] }, { @@ -1703,7 +1838,10 @@ "cell_type": "code", "execution_count": 40, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1718,9 +1856,9 @@ } ], "source": [ - "weekly = data.resample('W').sum()\n", - "weekly.plot(style=[':', '--', '-'])\n", - "plt.ylabel('Weekly bicycle count');" + "weekly = data.resample(\"W\").sum()\n", + "weekly.plot(style=[\":\", \"--\", \"-\"])\n", + "plt.ylabel(\"Weekly bicycle count\");" ] }, { @@ -1737,7 +1875,10 @@ "cell_type": "code", "execution_count": 41, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1752,9 +1893,9 @@ } ], "source": [ - "daily = data.resample('D').sum()\n", - "daily.rolling(30, center=True).sum().plot(style=[':', '--', '-'])\n", - "plt.ylabel('mean hourly count');" + "daily = data.resample(\"D\").sum()\n", + "daily.rolling(30, center=True).sum().plot(style=[\":\", \"--\", \"-\"])\n", + "plt.ylabel(\"mean hourly count\");" ] }, { @@ -1770,7 +1911,10 @@ "cell_type": "code", "execution_count": 42, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1785,8 +1929,9 @@ } ], "source": [ - "daily.rolling(50, center=True,\n", - " win_type='gaussian').sum(std=10).plot(style=[':', '--', '-']);" + "daily.rolling(50, center=True, win_type=\"gaussian\").sum(std=10).plot(\n", + " style=[\":\", \"--\", \"-\"]\n", + ");" ] }, { @@ -1804,7 +1949,10 @@ "cell_type": "code", "execution_count": 43, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1821,7 +1969,7 @@ "source": [ "by_time = data.groupby(data.index.time).mean()\n", "hourly_ticks = 4 * 60 * 60 * np.arange(6)\n", - "by_time.plot(xticks=hourly_ticks, style=[':', '--', '-']);" + "by_time.plot(xticks=hourly_ticks, style=[\":\", \"--\", \"-\"]);" ] }, { @@ -1839,7 +1987,10 @@ "cell_type": "code", "execution_count": 44, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1855,8 +2006,8 @@ ], "source": [ "by_weekday = data.groupby(data.index.dayofweek).mean()\n", - "by_weekday.index = ['Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun']\n", - "by_weekday.plot(style=[':', '--', '-']);" + "by_weekday.index = [\"Mon\", \"Tues\", \"Wed\", \"Thurs\", \"Fri\", \"Sat\", \"Sun\"]\n", + "by_weekday.plot(style=[\":\", \"--\", \"-\"]);" ] }, { @@ -1873,11 +2024,14 @@ "cell_type": "code", "execution_count": 45, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ - "weekend = np.where(data.index.weekday < 5, 'Weekday', 'Weekend')\n", + "weekend = np.where(data.index.weekday < 5, \"Weekday\", \"Weekend\")\n", "by_time = data.groupby([weekend, data.index.time]).mean()" ] }, @@ -1892,7 +2046,10 @@ "cell_type": "code", "execution_count": 46, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1908,11 +2065,14 @@ ], "source": [ "import matplotlib.pyplot as plt\n", + "\n", "fig, ax = plt.subplots(1, 2, figsize=(14, 5))\n", - "by_time.ix['Weekday'].plot(ax=ax[0], title='Weekdays',\n", - " xticks=hourly_ticks, style=[':', '--', '-'])\n", - "by_time.ix['Weekend'].plot(ax=ax[1], title='Weekends',\n", - " xticks=hourly_ticks, style=[':', '--', '-']);" + "by_time.ix[\"Weekday\"].plot(\n", + " ax=ax[0], title=\"Weekdays\", xticks=hourly_ticks, style=[\":\", \"--\", \"-\"]\n", + ")\n", + "by_time.ix[\"Weekend\"].plot(\n", + " ax=ax[1], title=\"Weekends\", xticks=hourly_ticks, style=[\":\", \"--\", \"-\"]\n", + ");" ] }, { @@ -1956,5 +2116,5 @@ } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/03.12-Performance-Eval-and-Query.ipynb b/notebooks/03.12-Performance-Eval-and-Query.ipynb index b6e2a142b..5077285e1 100644 --- a/notebooks/03.12-Performance-Eval-and-Query.ipynb +++ b/notebooks/03.12-Performance-Eval-and-Query.ipynb @@ -54,7 +54,10 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -67,6 +70,7 @@ ], "source": [ "import numpy as np\n", + "\n", "rng = np.random.RandomState(42)\n", "x = rng.rand(1000000)\n", "y = rng.rand(1000000)\n", @@ -84,7 +88,10 @@ "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -111,7 +118,10 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ @@ -129,12 +139,15 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ - "tmp1 = (x > 0.5)\n", - "tmp2 = (y < 0.5)\n", + "tmp1 = x > 0.5\n", + "tmp2 = y < 0.5\n", "mask = tmp1 & tmp2" ] }, @@ -151,7 +164,10 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -167,7 +183,8 @@ ], "source": [ "import numexpr\n", - "mask_numexpr = numexpr.evaluate('(x > 0.5) & (y < 0.5)')\n", + "\n", + "mask_numexpr = numexpr.evaluate(\"(x > 0.5) & (y < 0.5)\")\n", "np.allclose(mask, mask_numexpr)" ] }, @@ -193,15 +210,18 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ "import pandas as pd\n", + "\n", "nrows, ncols = 100000, 100\n", "rng = np.random.RandomState(42)\n", - "df1, df2, df3, df4 = (pd.DataFrame(rng.rand(nrows, ncols))\n", - " for i in range(4))" + "df1, df2, df3, df4 = (pd.DataFrame(rng.rand(nrows, ncols)) for i in range(4))" ] }, { @@ -215,7 +235,10 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -241,7 +264,10 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -267,7 +293,10 @@ "cell_type": "code", "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -282,8 +311,7 @@ } ], "source": [ - "np.allclose(df1 + df2 + df3 + df4,\n", - " pd.eval('df1 + df2 + df3 + df4'))" + "np.allclose(df1 + df2 + df3 + df4, pd.eval(\"df1 + df2 + df3 + df4\"))" ] }, { @@ -300,12 +328,16 @@ "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ - "df1, df2, df3, df4, df5 = (pd.DataFrame(rng.randint(0, 1000, (100, 3)))\n", - " for i in range(5))" + "df1, df2, df3, df4, df5 = (\n", + " pd.DataFrame(rng.randint(0, 1000, (100, 3))) for i in range(5)\n", + ")" ] }, { @@ -320,7 +352,10 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -336,7 +371,7 @@ ], "source": [ "result1 = -df1 * df2 / (df3 + df4) - df5\n", - "result2 = pd.eval('-df1 * df2 / (df3 + df4) - df5')\n", + "result2 = pd.eval(\"-df1 * df2 / (df3 + df4) - df5\")\n", "np.allclose(result1, result2)" ] }, @@ -352,7 +387,10 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -368,7 +406,7 @@ ], "source": [ "result1 = (df1 < df2) & (df2 <= df3) & (df3 != df4)\n", - "result2 = pd.eval('df1 < df2 <= df3 != df4')\n", + "result2 = pd.eval(\"df1 < df2 <= df3 != df4\")\n", "np.allclose(result1, result2)" ] }, @@ -384,7 +422,10 @@ "cell_type": "code", "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -400,7 +441,7 @@ ], "source": [ "result1 = (df1 < 0.5) & (df2 < 0.5) | (df3 < df4)\n", - "result2 = pd.eval('(df1 < 0.5) & (df2 < 0.5) | (df3 < df4)')\n", + "result2 = pd.eval(\"(df1 < 0.5) & (df2 < 0.5) | (df3 < df4)\")\n", "np.allclose(result1, result2)" ] }, @@ -415,7 +456,10 @@ "cell_type": "code", "execution_count": 14, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -430,7 +474,7 @@ } ], "source": [ - "result3 = pd.eval('(df1 < 0.5) and (df2 < 0.5) or (df3 < df4)')\n", + "result3 = pd.eval(\"(df1 < 0.5) and (df2 < 0.5) or (df3 < df4)\")\n", "np.allclose(result1, result3)" ] }, @@ -447,7 +491,10 @@ "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -463,7 +510,7 @@ ], "source": [ "result1 = df2.T[0] + df3.iloc[1]\n", - "result2 = pd.eval('df2.T[0] + df3.iloc[1]')\n", + "result2 = pd.eval(\"df2.T[0] + df3.iloc[1]\")\n", "np.allclose(result1, result2)" ] }, @@ -491,7 +538,10 @@ "cell_type": "code", "execution_count": 16, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -557,7 +607,7 @@ } ], "source": [ - "df = pd.DataFrame(rng.rand(1000, 3), columns=['A', 'B', 'C'])\n", + "df = pd.DataFrame(rng.rand(1000, 3), columns=[\"A\", \"B\", \"C\"])\n", "df.head()" ] }, @@ -572,7 +622,10 @@ "cell_type": "code", "execution_count": 17, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -587,7 +640,7 @@ } ], "source": [ - "result1 = (df['A'] + df['B']) / (df['C'] - 1)\n", + "result1 = (df[\"A\"] + df[\"B\"]) / (df[\"C\"] - 1)\n", "result2 = pd.eval(\"(df.A + df.B) / (df.C - 1)\")\n", "np.allclose(result1, result2)" ] @@ -603,7 +656,10 @@ "cell_type": "code", "execution_count": 18, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -618,7 +674,7 @@ } ], "source": [ - "result3 = df.eval('(A + B) / (C - 1)')\n", + "result3 = df.eval(\"(A + B) / (C - 1)\")\n", "np.allclose(result1, result3)" ] }, @@ -643,7 +699,10 @@ "cell_type": "code", "execution_count": 19, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -723,7 +782,10 @@ "cell_type": "code", "execution_count": 20, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -795,7 +857,7 @@ } ], "source": [ - "df.eval('D = (A + B) / C', inplace=True)\n", + "df.eval(\"D = (A + B) / C\", inplace=True)\n", "df.head()" ] }, @@ -810,7 +872,10 @@ "cell_type": "code", "execution_count": 21, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -882,7 +947,7 @@ } ], "source": [ - "df.eval('D = (A - B) / C', inplace=True)\n", + "df.eval(\"D = (A - B) / C\", inplace=True)\n", "df.head()" ] }, @@ -900,7 +965,10 @@ "cell_type": "code", "execution_count": 22, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -916,8 +984,8 @@ ], "source": [ "column_mean = df.mean(1)\n", - "result1 = df['A'] + column_mean\n", - "result2 = df.eval('A + @column_mean')\n", + "result1 = df[\"A\"] + column_mean\n", + "result2 = df.eval(\"A + @column_mean\")\n", "np.allclose(result1, result2)" ] }, @@ -943,7 +1011,10 @@ "cell_type": "code", "execution_count": 23, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -959,7 +1030,7 @@ ], "source": [ "result1 = df[(df.A < 0.5) & (df.B < 0.5)]\n", - "result2 = pd.eval('df[(df.A < 0.5) & (df.B < 0.5)]')\n", + "result2 = pd.eval(\"df[(df.A < 0.5) & (df.B < 0.5)]\")\n", "np.allclose(result1, result2)" ] }, @@ -976,7 +1047,10 @@ "cell_type": "code", "execution_count": 24, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -991,7 +1065,7 @@ } ], "source": [ - "result2 = df.query('A < 0.5 and B < 0.5')\n", + "result2 = df.query(\"A < 0.5 and B < 0.5\")\n", "np.allclose(result1, result2)" ] }, @@ -1007,7 +1081,10 @@ "cell_type": "code", "execution_count": 25, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1022,9 +1099,9 @@ } ], "source": [ - "Cmean = df['C'].mean()\n", + "Cmean = df[\"C\"].mean()\n", "result1 = df[(df.A < Cmean) & (df.B < Cmean)]\n", - "result2 = df.query('A < @Cmean and B < @Cmean')\n", + "result2 = df.query(\"A < @Cmean and B < @Cmean\")\n", "np.allclose(result1, result2)" ] }, @@ -1043,7 +1120,10 @@ "cell_type": "code", "execution_count": 26, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ @@ -1061,7 +1141,10 @@ "cell_type": "code", "execution_count": 27, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ @@ -1083,7 +1166,10 @@ "cell_type": "code", "execution_count": 28, "metadata": { - "collapsed": false + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1142,9 +1228,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/03.13-Further-Resources.ipynb b/notebooks/03.13-Further-Resources.ipynb index 16c8a8ebd..1a0c6fbf5 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.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/05.02-Introducing-Scikit-Learn.ipynb b/notebooks/05.02-Introducing-Scikit-Learn.ipynb index 8d3ecb877..501a1f664 100644 --- a/notebooks/05.02-Introducing-Scikit-Learn.ipynb +++ b/notebooks/05.02-Introducing-Scikit-Learn.ipynb @@ -93,7 +93,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -172,7 +175,8 @@ ], "source": [ "import seaborn as sns\n", - "iris = sns.load_dataset('iris')\n", + "\n", + "iris = sns.load_dataset(\"iris\")\n", "iris.head()" ] }, @@ -236,7 +240,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -252,8 +259,10 @@ ], "source": [ "%matplotlib inline\n", - "import seaborn as sns; sns.set()\n", - "sns.pairplot(iris, hue='species', size=1.5);" + "import seaborn as sns\n", + "\n", + "sns.set()\n", + "sns.pairplot(iris, hue=\"species\", size=1.5);" ] }, { @@ -272,7 +281,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -287,7 +299,7 @@ } ], "source": [ - "X_iris = iris.drop('species', axis=1)\n", + "X_iris = iris.drop(\"species\", axis=1)\n", "X_iris.shape" ] }, @@ -297,7 +309,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -312,7 +327,7 @@ } ], "source": [ - "y_iris = iris['species']\n", + "y_iris = iris[\"species\"]\n", "y_iris.shape" ] }, @@ -425,7 +440,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -476,9 +494,9 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": true, "deletable": true, - "editable": true + "editable": true, + "tags": [] }, "outputs": [], "source": [ @@ -489,7 +507,8 @@ "cell_type": "markdown", "metadata": { "deletable": true, - "editable": true + "editable": true, + "tags": [] }, "source": [ "Note that other more general linear regression models exist as well; you can read more about them in the [``sklearn.linear_model`` module documentation](http://Scikit-Learn.org/stable/modules/linear_model.html)." @@ -529,7 +548,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -579,7 +601,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -617,7 +642,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -652,7 +680,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -676,7 +707,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -730,7 +764,10 @@ "metadata": { "collapsed": true, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ @@ -753,7 +790,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ @@ -777,7 +817,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -829,22 +872,23 @@ "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": true, "deletable": true, - "editable": true + "editable": true, + "tags": [] }, "outputs": [], "source": [ "from sklearn.cross_validation import train_test_split\n", - "Xtrain, Xtest, ytrain, ytest = train_test_split(X_iris, y_iris,\n", - " random_state=1)" + "\n", + "Xtrain, Xtest, ytrain, ytest = train_test_split(X_iris, y_iris, random_state=1)" ] }, { "cell_type": "markdown", "metadata": { "deletable": true, - "editable": true + "editable": true, + "tags": [] }, "source": [ "With the data arranged, we can follow our recipe to predict the labels:" @@ -856,14 +900,18 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ - "from sklearn.naive_bayes import GaussianNB # 1. choose model class\n", - "model = GaussianNB() # 2. instantiate model\n", - "model.fit(Xtrain, ytrain) # 3. fit model to data\n", - "y_model = model.predict(Xtest) # 4. predict on new data" + "from sklearn.naive_bayes import GaussianNB # 1. choose model class\n", + "\n", + "model = GaussianNB() # 2. instantiate model\n", + "model.fit(Xtrain, ytrain) # 3. fit model to data\n", + "y_model = model.predict(Xtest) # 4. predict on new data" ] }, { @@ -882,7 +930,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -898,6 +949,7 @@ ], "source": [ "from sklearn.metrics import accuracy_score\n", + "\n", "accuracy_score(ytest, y_model)" ] }, @@ -938,14 +990,18 @@ "metadata": { "collapsed": true, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ "from sklearn.decomposition import PCA # 1. Choose the model class\n", - "model = PCA(n_components=2) # 2. Instantiate the model with hyperparameters\n", - "model.fit(X_iris) # 3. Fit to data. Notice y is not specified!\n", - "X_2D = model.transform(X_iris) # 4. Transform the data to two dimensions" + "\n", + "model = PCA(n_components=2) # 2. Instantiate the model with hyperparameters\n", + "model.fit(X_iris) # 3. Fit to data. Notice y is not specified!\n", + "X_2D = model.transform(X_iris) # 4. Transform the data to two dimensions" ] }, { @@ -964,7 +1020,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -979,9 +1038,9 @@ } ], "source": [ - "iris['PCA1'] = X_2D[:, 0]\n", - "iris['PCA2'] = X_2D[:, 1]\n", - "sns.lmplot(\"PCA1\", \"PCA2\", hue='species', data=iris, fit_reg=False);" + "iris[\"PCA1\"] = X_2D[:, 0]\n", + "iris[\"PCA2\"] = X_2D[:, 1]\n", + "sns.lmplot(\"PCA1\", \"PCA2\", hue=\"species\", data=iris, fit_reg=False);" ] }, { @@ -1018,15 +1077,20 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [], "source": [ - "from sklearn.mixture import GMM # 1. Choose the model class\n", - "model = GMM(n_components=3,\n", - " covariance_type='full') # 2. Instantiate the model with hyperparameters\n", - "model.fit(X_iris) # 3. Fit to data. Notice y is not specified!\n", - "y_gmm = model.predict(X_iris) # 4. Determine cluster labels" + "from sklearn.mixture import GMM # 1. Choose the model class\n", + "\n", + "model = GMM(\n", + " n_components=3, covariance_type=\"full\"\n", + ") # 2. Instantiate the model with hyperparameters\n", + "model.fit(X_iris) # 3. Fit to data. Notice y is not specified!\n", + "y_gmm = model.predict(X_iris) # 4. Determine cluster labels" ] }, { @@ -1045,7 +1109,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1060,9 +1127,10 @@ } ], "source": [ - "iris['cluster'] = y_gmm\n", - "sns.lmplot(\"PCA1\", \"PCA2\", data=iris, hue='species',\n", - " col='cluster', fit_reg=False);" + "iris[\"cluster\"] = y_gmm\n", + "sns.lmplot(\n", + " \"PCA1\", \"PCA2\", data=iris, hue=\"species\", col=\"cluster\", fit_reg=False\n", + ");" ] }, { @@ -1112,11 +1180,14 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 1, "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1125,13 +1196,14 @@ "(1797, 8, 8)" ] }, - "execution_count": 22, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.datasets import load_digits\n", + "\n", "digits = load_digits()\n", "digits.images.shape" ] @@ -1149,18 +1221,21 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 2, "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "
" ] }, "metadata": {}, @@ -1170,14 +1245,19 @@ "source": [ "import matplotlib.pyplot as plt\n", "\n", - "fig, axes = plt.subplots(10, 10, figsize=(8, 8),\n", - " subplot_kw={'xticks':[], 'yticks':[]},\n", - " gridspec_kw=dict(hspace=0.1, wspace=0.1))\n", + "fig, axes = plt.subplots(\n", + " 10,\n", + " 10,\n", + " figsize=(8, 8),\n", + " subplot_kw={\"xticks\": [], \"yticks\": []},\n", + " gridspec_kw=dict(hspace=0.1, wspace=0.1),\n", + ")\n", "\n", "for i, ax in enumerate(axes.flat):\n", - " ax.imshow(digits.images[i], cmap='binary', interpolation='nearest')\n", - " ax.text(0.05, 0.05, str(digits.target[i]),\n", - " transform=ax.transAxes, color='green')" + " ax.imshow(digits.images[i], cmap=\"binary\", interpolation=\"nearest\")\n", + " ax.text(\n", + " 0.05, 0.05, str(digits.target[i]), transform=ax.transAxes, color=\"green\"\n", + " )" ] }, { @@ -1195,11 +1275,14 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 3, "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1208,7 +1291,7 @@ "(1797, 64)" ] }, - "execution_count": 24, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -1220,11 +1303,14 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 4, "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1233,7 +1319,7 @@ "(1797,)" ] }, - "execution_count": 25, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -1269,11 +1355,14 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 5, "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1282,13 +1371,14 @@ "(1797, 2)" ] }, - "execution_count": 26, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.manifold import Isomap\n", + "\n", "iso = Isomap(n_components=2)\n", "iso.fit(digits.data)\n", "data_projected = iso.transform(digits.data)\n", @@ -1308,30 +1398,22 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 7, "metadata": { "collapsed": false, "deletable": true, - "editable": true - }, - "outputs": [ - { - "data": { - "image/png": "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\npJZlWZY1Dv8fbutNhc9gqb8AAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" + "editable": true, + "jupyter": { + "outputs_hidden": false } - ], + }, + "outputs": [], "source": [ - "plt.scatter(data_projected[:, 0], data_projected[:, 1], c=digits.target,\n", - " edgecolor='none', alpha=0.5,\n", - " cmap=plt.cm.get_cmap('spectral', 10))\n", - "plt.colorbar(label='digit label', ticks=range(10))\n", - "plt.clim(-0.5, 9.5);" + "# plt.scatter(data_projected[:, 0], data_projected[:, 1], c=digits.target,\n", + "# edgecolor='none', alpha=0.5,\n", + "# cmap=plt.cm.get_cmap('spectral', 10))\n", + "# plt.colorbar(label='digit label', ticks=range(10))\n", + "# plt.clim(-0.5, 9.5);" ] }, { @@ -1364,28 +1446,31 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 9, "metadata": { - "collapsed": true, "deletable": true, - "editable": true + "editable": true, + "tags": [] }, "outputs": [], "source": [ + "from sklearn.model_selection import train_test_split\n", + "\n", "Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, random_state=0)" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 10, "metadata": { - "collapsed": true, "deletable": true, - "editable": true + "editable": true, + "tags": [] }, "outputs": [], "source": [ "from sklearn.naive_bayes import GaussianNB\n", + "\n", "model = GaussianNB()\n", "model.fit(Xtrain, ytrain)\n", "y_model = model.predict(Xtest)" @@ -1403,26 +1488,30 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 11, "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { "text/plain": [ - "0.83333333333333337" + "0.8333333333333334" ] }, - "execution_count": 30, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import accuracy_score\n", + "\n", "accuracy_score(ytest, y_model)" ] }, @@ -1439,32 +1528,60 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 13, "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "# from sklearn.metrics import confusion_matrix\n", + "\n", + "# mat = confusion_matrix(ytest, y_model)\n", + "\n", + "# sns.heatmap(mat, square=True, annot=True, cbar=False)\n", + "# plt.xlabel('predicted value')\n", + "# plt.ylabel('true value');" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "
" ] }, - "metadata": {}, + "metadata": { + "needs_background": "light" + }, "output_type": "display_data" } ], "source": [ - "from sklearn.metrics import confusion_matrix\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.metrics import plot_confusion_matrix\n", "\n", - "mat = confusion_matrix(ytest, y_model)\n", "\n", - "sns.heatmap(mat, square=True, annot=True, cbar=False)\n", - "plt.xlabel('predicted value')\n", - "plt.ylabel('true value');" + "plot_confusion_matrix(\n", + " model, Xtest, ytest, display_labels=range(10), cmap=plt.cm.Blues\n", + ")\n", + "plt.savefig(\"minst_conf_mtx.pdf\")" ] }, { @@ -1485,7 +1602,10 @@ "metadata": { "collapsed": false, "deletable": true, - "editable": true + "editable": true, + "jupyter": { + "outputs_hidden": false + } }, "outputs": [ { @@ -1500,17 +1620,25 @@ } ], "source": [ - "fig, axes = plt.subplots(10, 10, figsize=(8, 8),\n", - " subplot_kw={'xticks':[], 'yticks':[]},\n", - " gridspec_kw=dict(hspace=0.1, wspace=0.1))\n", + "fig, axes = plt.subplots(\n", + " 10,\n", + " 10,\n", + " figsize=(8, 8),\n", + " subplot_kw={\"xticks\": [], \"yticks\": []},\n", + " gridspec_kw=dict(hspace=0.1, wspace=0.1),\n", + ")\n", "\n", "test_images = Xtest.reshape(-1, 8, 8)\n", "\n", "for i, ax in enumerate(axes.flat):\n", - " ax.imshow(test_images[i], cmap='binary', interpolation='nearest')\n", - " ax.text(0.05, 0.05, str(y_model[i]),\n", - " transform=ax.transAxes,\n", - " color='green' if (ytest[i] == y_model[i]) else 'red')" + " ax.imshow(test_images[i], cmap=\"binary\", interpolation=\"nearest\")\n", + " ax.text(\n", + " 0.05,\n", + " 0.05,\n", + " str(y_model[i]),\n", + " transform=ax.transAxes,\n", + " color=\"green\" if (ytest[i] == y_model[i]) else \"red\",\n", + " )" ] }, { @@ -1565,9 +1693,9 @@ "metadata": { "anaconda-cloud": {}, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [conda env:py3k]", "language": "python", - "name": "python3" + "name": "conda-env-py3k-py" }, "language_info": { "codemirror_mode": { @@ -1579,9 +1707,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.1" + "version": "3.8.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/notebooks/mprun_demo.py b/notebooks/mprun_demo.py new file mode 100644 index 000000000..cab697fde --- /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