Skip to content

Instantly share code, notes, and snippets.

@tiwo
Last active March 31, 2021 11:21
Show Gist options
  • Save tiwo/3d84b02d29f68443862b46fad2ae1ddf to your computer and use it in GitHub Desktop.
Save tiwo/3d84b02d29f68443862b46fad2ae1ddf to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "japanese-bubble",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"6.3.0\r\n"
]
}
],
"source": [
"! pip install -q bokeh==2.3.0 ipywidgets==7.6.3\n",
"! jupyter notebook --version"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "parliamentary-assist",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div class=\"bk-root\">\n",
" <a href=\"https://bokeh.org\" target=\"_blank\" class=\"bk-logo bk-logo-small bk-logo-notebook\"></a>\n",
" <span id=\"1001\">Loading BokehJS ...</span>\n",
" </div>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
"(function(root) {\n",
" function now() {\n",
" return new Date();\n",
" }\n",
"\n",
" var force = true;\n",
"\n",
" if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n",
" root._bokeh_onload_callbacks = [];\n",
" root._bokeh_is_loading = undefined;\n",
" }\n",
"\n",
" var JS_MIME_TYPE = 'application/javascript';\n",
" var HTML_MIME_TYPE = 'text/html';\n",
" var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n",
" var CLASS_NAME = 'output_bokeh rendered_html';\n",
"\n",
" /**\n",
" * Render data to the DOM node\n",
" */\n",
" function render(props, node) {\n",
" var script = document.createElement(\"script\");\n",
" node.appendChild(script);\n",
" }\n",
"\n",
" /**\n",
" * Handle when an output is cleared or removed\n",
" */\n",
" function handleClearOutput(event, handle) {\n",
" var cell = handle.cell;\n",
"\n",
" var id = cell.output_area._bokeh_element_id;\n",
" var server_id = cell.output_area._bokeh_server_id;\n",
" // Clean up Bokeh references\n",
" if (id != null && id in Bokeh.index) {\n",
" Bokeh.index[id].model.document.clear();\n",
" delete Bokeh.index[id];\n",
" }\n",
"\n",
" if (server_id !== undefined) {\n",
" // Clean up Bokeh references\n",
" var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n",
" cell.notebook.kernel.execute(cmd, {\n",
" iopub: {\n",
" output: function(msg) {\n",
" var id = msg.content.text.trim();\n",
" if (id in Bokeh.index) {\n",
" Bokeh.index[id].model.document.clear();\n",
" delete Bokeh.index[id];\n",
" }\n",
" }\n",
" }\n",
" });\n",
" // Destroy server and session\n",
" var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n",
" cell.notebook.kernel.execute(cmd);\n",
" }\n",
" }\n",
"\n",
" /**\n",
" * Handle when a new output is added\n",
" */\n",
" function handleAddOutput(event, handle) {\n",
" var output_area = handle.output_area;\n",
" var output = handle.output;\n",
"\n",
" // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n",
" if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n",
" return\n",
" }\n",
"\n",
" var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n",
"\n",
" if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n",
" toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n",
" // store reference to embed id on output_area\n",
" output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n",
" }\n",
" if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n",
" var bk_div = document.createElement(\"div\");\n",
" bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n",
" var script_attrs = bk_div.children[0].attributes;\n",
" for (var i = 0; i < script_attrs.length; i++) {\n",
" toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n",
" toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n",
" }\n",
" // store reference to server id on output_area\n",
" output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n",
" }\n",
" }\n",
"\n",
" function register_renderer(events, OutputArea) {\n",
"\n",
" function append_mime(data, metadata, element) {\n",
" // create a DOM node to render to\n",
" var toinsert = this.create_output_subarea(\n",
" metadata,\n",
" CLASS_NAME,\n",
" EXEC_MIME_TYPE\n",
" );\n",
" this.keyboard_manager.register_events(toinsert);\n",
" // Render to node\n",
" var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n",
" render(props, toinsert[toinsert.length - 1]);\n",
" element.append(toinsert);\n",
" return toinsert\n",
" }\n",
"\n",
" /* Handle when an output is cleared or removed */\n",
" events.on('clear_output.CodeCell', handleClearOutput);\n",
" events.on('delete.Cell', handleClearOutput);\n",
"\n",
" /* Handle when a new output is added */\n",
" events.on('output_added.OutputArea', handleAddOutput);\n",
"\n",
" /**\n",
" * Register the mime type and append_mime function with output_area\n",
" */\n",
" OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n",
" /* Is output safe? */\n",
" safe: true,\n",
" /* Index of renderer in `output_area.display_order` */\n",
" index: 0\n",
" });\n",
" }\n",
"\n",
" // register the mime type if in Jupyter Notebook environment and previously unregistered\n",
" if (root.Jupyter !== undefined) {\n",
" var events = require('base/js/events');\n",
" var OutputArea = require('notebook/js/outputarea').OutputArea;\n",
"\n",
" if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n",
" register_renderer(events, OutputArea);\n",
" }\n",
" }\n",
"\n",
" \n",
" if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n",
" root._bokeh_timeout = Date.now() + 5000;\n",
" root._bokeh_failed_load = false;\n",
" }\n",
"\n",
" var NB_LOAD_WARNING = {'data': {'text/html':\n",
" \"<div style='background-color: #fdd'>\\n\"+\n",
" \"<p>\\n\"+\n",
" \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
" \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
" \"</p>\\n\"+\n",
" \"<ul>\\n\"+\n",
" \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n",
" \"<li>use INLINE resources instead, as so:</li>\\n\"+\n",
" \"</ul>\\n\"+\n",
" \"<code>\\n\"+\n",
" \"from bokeh.resources import INLINE\\n\"+\n",
" \"output_notebook(resources=INLINE)\\n\"+\n",
" \"</code>\\n\"+\n",
" \"</div>\"}};\n",
"\n",
" function display_loaded() {\n",
" var el = document.getElementById(\"1001\");\n",
" if (el != null) {\n",
" el.textContent = \"BokehJS is loading...\";\n",
" }\n",
" if (root.Bokeh !== undefined) {\n",
" if (el != null) {\n",
" el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n",
" }\n",
" } else if (Date.now() < root._bokeh_timeout) {\n",
" setTimeout(display_loaded, 100)\n",
" }\n",
" }\n",
"\n",
"\n",
" function run_callbacks() {\n",
" try {\n",
" root._bokeh_onload_callbacks.forEach(function(callback) {\n",
" if (callback != null)\n",
" callback();\n",
" });\n",
" } finally {\n",
" delete root._bokeh_onload_callbacks\n",
" }\n",
" console.debug(\"Bokeh: all callbacks have finished\");\n",
" }\n",
"\n",
" function load_libs(css_urls, js_urls, callback) {\n",
" if (css_urls == null) css_urls = [];\n",
" if (js_urls == null) js_urls = [];\n",
"\n",
" root._bokeh_onload_callbacks.push(callback);\n",
" if (root._bokeh_is_loading > 0) {\n",
" console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
" return null;\n",
" }\n",
" if (js_urls == null || js_urls.length === 0) {\n",
" run_callbacks();\n",
" return null;\n",
" }\n",
" console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
" root._bokeh_is_loading = css_urls.length + js_urls.length;\n",
"\n",
" function on_load() {\n",
" root._bokeh_is_loading--;\n",
" if (root._bokeh_is_loading === 0) {\n",
" console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n",
" run_callbacks()\n",
" }\n",
" }\n",
"\n",
" function on_error(url) {\n",
" console.error(\"failed to load \" + url);\n",
" }\n",
"\n",
" for (let i = 0; i < css_urls.length; i++) {\n",
" const url = css_urls[i];\n",
" const element = document.createElement(\"link\");\n",
" element.onload = on_load;\n",
" element.onerror = on_error.bind(null, url);\n",
" element.rel = \"stylesheet\";\n",
" element.type = \"text/css\";\n",
" element.href = url;\n",
" console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n",
" document.body.appendChild(element);\n",
" }\n",
"\n",
" const hashes = {\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.0.min.js\": \"HjagQp6T0/7bxYTAXbLotF1MLAGWmhkY5siA1Gc/pcEgvgRPtMsRn0gQtMwGKiw1\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.0.min.js\": \"ZEPPTjL+mdyqgIq+/pl9KTwzji8Kow2NnI3zWY8+sFinWP/SYJ80BnfeJsa45iYj\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.0.min.js\": \"exLqv2ACDRIaV7ZK1iL8aGzGYQvKVuT3U2CT7FsQREBxRah6JrkVCoFy0koY1YqV\"};\n",
"\n",
" for (let i = 0; i < js_urls.length; i++) {\n",
" const url = js_urls[i];\n",
" const element = document.createElement('script');\n",
" element.onload = on_load;\n",
" element.onerror = on_error.bind(null, url);\n",
" element.async = false;\n",
" element.src = url;\n",
" if (url in hashes) {\n",
" element.crossOrigin = \"anonymous\";\n",
" element.integrity = \"sha384-\" + hashes[url];\n",
" }\n",
" console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
" document.head.appendChild(element);\n",
" }\n",
" };\n",
"\n",
" function inject_raw_css(css) {\n",
" const element = document.createElement(\"style\");\n",
" element.appendChild(document.createTextNode(css));\n",
" document.body.appendChild(element);\n",
" }\n",
"\n",
" \n",
" var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.0.min.js\"];\n",
" var css_urls = [];\n",
" \n",
"\n",
" var inline_js = [\n",
" function(Bokeh) {\n",
" Bokeh.set_log_level(\"info\");\n",
" },\n",
" function(Bokeh) {\n",
" \n",
" \n",
" }\n",
" ];\n",
"\n",
" function run_inline_js() {\n",
" \n",
" if (root.Bokeh !== undefined || force === true) {\n",
" \n",
" for (var i = 0; i < inline_js.length; i++) {\n",
" inline_js[i].call(root, root.Bokeh);\n",
" }\n",
" if (force === true) {\n",
" display_loaded();\n",
" }} else if (Date.now() < root._bokeh_timeout) {\n",
" setTimeout(run_inline_js, 100);\n",
" } else if (!root._bokeh_failed_load) {\n",
" console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
" root._bokeh_failed_load = true;\n",
" } else if (force !== true) {\n",
" var cell = $(document.getElementById(\"1001\")).parents('.cell').data().cell;\n",
" cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
" }\n",
"\n",
" }\n",
"\n",
" if (root._bokeh_is_loading === 0) {\n",
" console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
" run_inline_js();\n",
" } else {\n",
" load_libs(css_urls, js_urls, function() {\n",
" console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n",
" run_inline_js();\n",
" });\n",
" }\n",
"}(window));"
],
"application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"<div style='background-color: #fdd'>\\n\"+\n \"<p>\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"</p>\\n\"+\n \"<ul>\\n\"+\n \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n \"<li>use INLINE resources instead, as so:</li>\\n\"+\n \"</ul>\\n\"+\n \"<code>\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"</code>\\n\"+\n \"</div>\"}};\n\n function display_loaded() {\n var el = document.getElementById(\"1001\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n const hashes = {\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.0.min.js\": \"HjagQp6T0/7bxYTAXbLotF1MLAGWmhkY5siA1Gc/pcEgvgRPtMsRn0gQtMwGKiw1\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.0.min.js\": \"ZEPPTjL+mdyqgIq+/pl9KTwzji8Kow2NnI3zWY8+sFinWP/SYJ80BnfeJsa45iYj\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.0.min.js\": \"exLqv2ACDRIaV7ZK1iL8aGzGYQvKVuT3U2CT7FsQREBxRah6JrkVCoFy0koY1YqV\"};\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n if (url in hashes) {\n element.crossOrigin = \"anonymous\";\n element.integrity = \"sha384-\" + hashes[url];\n }\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n \n var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.0.min.js\"];\n var css_urls = [];\n \n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n function(Bokeh) {\n \n \n }\n ];\n\n function run_inline_js() {\n \n if (root.Bokeh !== undefined || force === true) {\n \n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(\"1001\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));"
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from bokeh.io import output_notebook\n",
"from bokeh.io.state import curstate\n",
"from bokeh.io.notebook import show_app\n",
"from bokeh.models import ColumnDataSource, DataTable\n",
"from bokeh.application import Application\n",
"from bokeh.application.handlers import FunctionHandler\n",
"\n",
"output_notebook()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "previous-ability",
"metadata": {},
"outputs": [],
"source": [
"data_source = ColumnDataSource(dict(a=(10,20,30,40), b=(30,40,50,60), c=(\"x\",\"y\",\"z\",\"?\")))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "regular-corps",
"metadata": {},
"outputs": [],
"source": [
"def add_my_table(doc):\n",
" \n",
" \n",
" data_table = DataTable(source=data_source)\n",
" doc.add_root(data_table)\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "cooked-wells",
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"application/vnd.bokehjs_exec.v0+json": "",
"text/html": [
"\n",
"<script id=\"1003\">\n",
" var xhr = new XMLHttpRequest()\n",
" xhr.responseType = 'blob';\n",
" xhr.open('GET', \"http://localhost:8889/autoload.js?bokeh-autoload-element=1003&bokeh-absolute-url=http://localhost:8889&resources=none\", true);\n",
" \n",
" xhr.onload = function (event) {\n",
" var script = document.createElement('script'),\n",
" src = URL.createObjectURL(event.target.response);\n",
" script.src = src;\n",
" document.body.appendChild(script);\n",
" };\n",
"xhr.send();\n",
"</script>"
]
},
"metadata": {
"application/vnd.bokehjs_exec.v0+json": {
"server_id": "c97e7f32d5dc4b09a4f2278d399aa8e6"
}
},
"output_type": "display_data"
}
],
"source": [
"handler = FunctionHandler(add_my_table)\n",
" \n",
"app = Application(handler)\n",
"\n",
"show_app(app, state=curstate(), notebook_url=\"localhost:8000\", port=8889)"
]
},
{
"attachments": {
"Screenshot_2021-03-31%20minimal_table%20-%20Jupyter%20Notebook.png": {
"image/png": "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"
}
},
"cell_type": "markdown",
"id": "casual-boards",
"metadata": {},
"source": [
"On my sytem, the previous cell outputs this - note the table's contents are missing, while the number of rows is correct.\n",
"![Screenshot_2021-03-31%20minimal_table%20-%20Jupyter%20Notebook.png](attachment:Screenshot_2021-03-31%20minimal_table%20-%20Jupyter%20Notebook.png)\n",
"\n",
"(Image cropped, it has significant white space at the bottom and right.)\n",
"\n",
"---\n",
"\n",
"My browser does receive the following message from ws://localhost:8889/ws:\n",
"\n",
"```json\n",
"{\"doc\": {\"defs\": [{\"extends\": null, \"module\": null, \"name\": \"DataModel\", \"overrides\": [], \"properties\": []}], \"roots\": {\"references\": [{\"attributes\": {\"data\": {\"a\": [10, 20, 30, 40], \"b\": [30, 40, 50, 60], \"c\": [\"x\", \"y\", \"z\", \"?\"]}, \"selected\": {\"id\": \"1008\"}, \"selection_policy\": {\"id\": \"1007\"}}, \"id\": \"1002\", \"type\": \"ColumnDataSource\"}, {\"attributes\": {}, \"id\": \"1007\", \"type\": \"UnionRenderers\"}, {\"attributes\": {}, \"id\": \"1008\", \"type\": \"Selection\"}, {\"attributes\": {\"source\": {\"id\": \"1002\"}, \"view\": {\"id\": \"1006\"}}, \"id\": \"1004\", \"type\": \"DataTable\"}, {\"attributes\": {\"source\": {\"id\": \"1002\"}}, \"id\": \"1006\", \"type\": \"CDSView\"}], \"root_ids\": [\"1004\"]}, \"title\": \"Bokeh Application\", \"version\": \"2.3.0\"}}\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "virtual-intervention",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.8.8 (default, Mar 12 2021, 19:33:56) \n",
"[GCC 8.3.0]\n",
"aiofiles==0.6.0\n",
"anyio==2.2.0\n",
"argon2-cffi==20.1.0\n",
"async-generator==1.10\n",
"attrs==20.3.0\n",
"Babel==2.9.0\n",
"backcall==0.2.0\n",
"bleach==3.3.0\n",
"bokeh==2.3.0\n",
"certifi==2020.12.5\n",
"cffi==1.14.5\n",
"chardet==4.0.0\n",
"click==7.1.2\n",
"decorator==4.4.2\n",
"defusedxml==0.7.1\n",
"Disda @ file:///DISDA/src\n",
"entrypoints==0.3\n",
"fastapi==0.63.0\n",
"h11==0.12.0\n",
"httptools==0.1.1\n",
"idna==2.10\n",
"ipykernel==5.5.3\n",
"ipython==7.22.0\n",
"ipython-genutils==0.2.0\n",
"ipywidgets==7.6.3\n",
"jedi==0.18.0\n",
"Jinja2==2.11.3\n",
"json5==0.9.5\n",
"jsonschema==3.2.0\n",
"jupyter-client==6.1.12\n",
"jupyter-core==4.7.1\n",
"jupyter-packaging==0.7.12\n",
"jupyter-server==1.5.1\n",
"jupyterlab==3.0.12\n",
"jupyterlab-pygments==0.1.2\n",
"jupyterlab-server==2.4.0\n",
"jupyterlab-widgets==1.0.0\n",
"MarkupSafe==1.1.1\n",
"mistune==0.8.4\n",
"nbclassic==0.2.6\n",
"nbclient==0.5.3\n",
"nbconvert==6.0.7\n",
"nbformat==5.1.2\n",
"nest-asyncio==1.5.1\n",
"notebook==6.3.0\n",
"numpy==1.20.2\n",
"packaging==20.9\n",
"pandas==1.2.3\n",
"pandocfilters==1.4.3\n",
"parso==0.8.2\n",
"pexpect==4.8.0\n",
"pickleshare==0.7.5\n",
"Pillow==8.1.2\n",
"prometheus-client==0.9.0\n",
"prompt-toolkit==3.0.18\n",
"ptyprocess==0.7.0\n",
"pycparser==2.20\n",
"pydantic==1.8.1\n",
"Pygments==2.8.1\n",
"pyodbc==4.0.30\n",
"pyparsing==2.4.7\n",
"pyrsistent==0.17.3\n",
"python-dateutil==2.8.1\n",
"python-dotenv==0.16.0\n",
"pytz==2021.1\n",
"PyYAML==5.4.1\n",
"pyzmq==22.0.3\n",
"requests==2.25.1\n",
"Send2Trash==1.5.0\n",
"six==1.15.0\n",
"sniffio==1.2.0\n",
"starlette==0.13.6\n",
"terminado==0.9.4\n",
"testpath==0.4.4\n",
"tornado==6.1\n",
"traitlets==5.0.5\n",
"typing-extensions==3.7.4.3\n",
"urllib3==1.26.4\n",
"uvicorn==0.13.4\n",
"uvloop==0.15.2\n",
"watchgod==0.7\n",
"wcwidth==0.2.5\n",
"webencodings==0.5.1\n",
"websockets==8.1\n",
"widgetsnbextension==3.5.1\n"
]
}
],
"source": [
"import sys; print(sys.version)\n",
"! pip freeze"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "interpreted-jimmy",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment