Last active
July 20, 2022 09:12
-
-
Save brazilbean/1095e0af3ff2b5f37faeb0f63f0fb917 to your computer and use it in GitHub Desktop.
Create a report using a Jupyter Notebook
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "# Gist - Creating reports using Jupyter Notebooks\nGordon Bean \n*brazilbean* on **GitHub**" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Overview\nThis gist demonstrates one way to use Jupyter Notebooks to create HTML reports generated with in-line or dynamic code.\n\nNote: this method relies on the [Python Markdown](https://github.com/ipython-contrib/IPython-notebook-extensions/tree/master/nbextensions/usability/python-markdown) notebook extension." | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## The gist\n### Key ideas\n- Use Raw notebook cells to insert open and close HTML comment tags to hide swaths of cells from the final HTML output.\n - For other formats (e.g. $\\LaTeX$) or custom use-cases, you can create a nbconvert pre-processor that screens cells for special comment tags and excludes them.\n- Use the Python Markdown extension to embed code in Markdown cells. \n\n### Putting it together\n- Compute results first\n- Capture figures using `save_img_tag`\n- Compile report sections in Markdown cells\n- Export the report using nbconvert\n\n### Caveats\n- The Python Markdown extension requires that you execute all of the code in a notebook session before exporting. If you want to embed results in markdown cells using nbconvert on a notebook that hasn't already been rendered (i.e. using the Execution pre-processor), you need to get fancy with the pre-processing (out of scope for this gist)." | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Example" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "raw", | |
"source": "<!-- hide code" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### Imports\n*NOTE: You can continue to use Markdown cells to structure the hidden sections.*" | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "import matplotlib.pyplot as plt\nimport numpy as np\nimport io, base64\n\n%matplotlib inline", | |
"execution_count": 9, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### Handy functions" | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "def save_img_tag(fig=None, format='png', alt=\"image\", bbox_inches='tight'):\n if fig is None:\n fig = plt.gcf()\n \n # Save data to BytesIO stream\n data = io.BytesIO();\n plt.savefig(data, format=format, bbox_inches=bbox_inches);\n data.seek(0)\n \n # Encode in base64\n data64 = base64.b64encode(data.read())\n \n # Convert to <img> tag with URI\n uri = 'data:image/png;base64,' + (data64.decode())\n img_tag = '<img alt=\"{}\" src = \"{}\" />'.format(alt, uri)\n \n return img_tag", | |
"execution_count": 10, | |
"outputs": [] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "### Compute results" | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "foo = np.random.rand(6,6)\nfoo", | |
"execution_count": 3, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/plain": "array([[ 0.20258051, 0.45594695, 0.59081644, 0.77863322, 0.95562066,\n 0.77541216],\n [ 0.2313933 , 0.7773782 , 0.63143983, 0.22231121, 0.51016535,\n 0.93809008],\n [ 0.54847662, 0.15736908, 0.61739686, 0.21555361, 0.27859176,\n 0.30264647],\n [ 0.13091739, 0.51608414, 0.63882124, 0.18896472, 0.23827327,\n 0.48095137],\n [ 0.35712307, 0.80664108, 0.078699 , 0.09834737, 0.97956833,\n 0.81227637],\n [ 0.48393442, 0.95500417, 0.07009516, 0.83570162, 0.41744175,\n 0.84856411]])" | |
}, | |
"metadata": {}, | |
"execution_count": 3 | |
} | |
] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "plt.imshow(foo, interpolation='none')\nplt.title('An example heatmap')\n\nexample_heatmap = save_img_tag()", | |
"execution_count": 11, | |
"outputs": [ | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "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\n", | |
"text/plain": "<matplotlib.figure.Figure at 0x7bd7588>" | |
}, | |
"metadata": {} | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "raw", | |
"source": "end hide code -->" | |
}, | |
{ | |
"metadata": { | |
"variables": { | |
"\"{}x{}\".format(*foo.shape)": "6x6", | |
"example_heatmap": "<img alt=\"image\" src = \"data:image/png;base64,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\" />" | |
} | |
}, | |
"cell_type": "markdown", | |
"source": "In order to create this example plot (who's dimensions are {{\"{}x{}\".format(*foo.shape)}}):\n\n{{example_heatmap}}\n\nI did the computation in hidden cells, saved the results, and displayed those results in this Markdown cells using the Python Markdown Jupyter Notebook extension. " | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "raw", | |
"source": "<!-- hide more code" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Convert the notebook to HTML" | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": true | |
}, | |
"cell_type": "code", | |
"source": "import tempfile, subprocess\n\ndef nbconvert(notebook, to='html', path_to_python_markdown=None):\n '''Execute a system call to nbconvert\n \n If python-markdown is not on you PYTHONPATH, provide the path to the nbextension as an argument.\n '''\n \n if path_to_python_markdown is None:\n # Guess\n path_to_python_markdown = os.path.expandvars(r\"C:\\Users\\%USERNAME%\\.jupyter\\nbextensions\\usability\\python-markdown\")\n \n with tempfile.NamedTemporaryFile() as f:\n tmpf = f.name + '.py'\n \n with open(tmpf, 'wt') as tmp:\n print(\"import sys\", file=tmp)\n print(\"sys.path.append(r'{}')\".format(path_to_python_markdown), file=tmp)\n print(\"c=get_config()\", file=tmp)\n print(\"c.NbConvertApp.notebooks = ['{}']\".format(notebook), file=tmp)\n if os.path.exists(path_to_python_markdown):\n print(\"c.Exporter.preprocessors = [ 'pymdpreprocessor.PyMarkdownPreprocessor' ]\", file=tmp)\n else:\n print(\"Could not find python-markdown extension - simple markdown formatting will be used.\")\n \n cmd = 'jupyter nbconvert --config \"{}\" --to {} --reveal-prefix=\"http://cdn.jsdelivr.net/reveal.js/2.5.0\"'.format(tmpf, to)\n print(subprocess.check_output(cmd, stderr=subprocess.STDOUT).decode())\n \n os.remove(tmpf)\n ", | |
"execution_count": 16, | |
"outputs": [] | |
}, | |
{ | |
"metadata": { | |
"trusted": true, | |
"collapsed": false | |
}, | |
"cell_type": "code", | |
"source": "import os\n\n# Provide the name of this notebook\nname = 'Gist - Creating reports using Jupyter Notebooks'\n\n# Convert the notebook\n# Be sure to save the notebook before converting to HTML\nnbconvert(name + '.ipynb', to='html')\n\nreport = name + '.html'\nprint (report)", | |
"execution_count": 20, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"text": "[NbConvertApp] Converting notebook Gist - Creating reports using Jupyter Notebooks.ipynb to html\r\n[NbConvertApp] Writing 280004 bytes to Gist - Creating reports using Jupyter Notebooks.html\r\n\nGist - Creating reports using Jupyter Notebooks.html\n", | |
"name": "stdout" | |
} | |
] | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "raw", | |
"source": "end hide code -->" | |
}, | |
{ | |
"metadata": {}, | |
"cell_type": "markdown", | |
"source": "## Output\nGitHub uses nbviewer to render the notebook file. Thus, what you see in the gist is an almost-rendered version of the final report. To see the actual output, see [here](https://gist.github.com/brazilbean/832ac5006551d1dea5758909d84c50b9).\n\nTo see the underlying notebook, download the gist and open it with your Jupyter Notebook server." | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3", | |
"language": "python" | |
}, | |
"toc": { | |
"threshold": 6, | |
"number_sections": false, | |
"toc_cell": false, | |
"toc_window_display": true, | |
"toc_section_display": "block", | |
"sideBar": true, | |
"navigate_menu": true | |
}, | |
"nav_menu": {}, | |
"language_info": { | |
"codemirror_mode": { | |
"version": 3, | |
"name": "ipython" | |
}, | |
"version": "3.5.1", | |
"mimetype": "text/x-python", | |
"pygments_lexer": "ipython3", | |
"nbconvert_exporter": "python", | |
"file_extension": ".py", | |
"name": "python" | |
}, | |
"gist": { | |
"id": "1095e0af3ff2b5f37faeb0f63f0fb917", | |
"data": { | |
"description": "Create a report using a Jupyter Notebook", | |
"public": true | |
} | |
}, | |
"_draft": { | |
"nbviewer_url": "https://gist.github.com/1095e0af3ff2b5f37faeb0f63f0fb917" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment