Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save brazilbean/1095e0af3ff2b5f37faeb0f63f0fb917 to your computer and use it in GitHub Desktop.
Save brazilbean/1095e0af3ff2b5f37faeb0f63f0fb917 to your computer and use it in GitHub Desktop.
Create a report using a Jupyter Notebook
Display the source blob
Display the rendered blob
Raw
{
"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