diff --git a/notebook/indicator.ipynb b/notebook/indicator.ipynb index 0d7f2f2..b0725e6 100644 --- a/notebook/indicator.ipynb +++ b/notebook/indicator.ipynb @@ -7,8 +7,8 @@ "variableName$1": "dailies_df" }, "ExecuteTime": { - "end_time": "2026-01-28T06:57:21.310184Z", - "start_time": "2026-01-28T06:57:14.416129Z" + "end_time": "2026-01-28T09:02:14.676305Z", + "start_time": "2026-01-28T09:02:07.695819Z" } }, "cell_type": "code", @@ -199,26 +199,26 @@ "" ] }, - "execution_count": 18, + "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 18 + "execution_count": 115 }, { "metadata": { "ExecuteTime": { - "end_time": "2026-01-28T06:57:23.888645Z", - "start_time": "2026-01-28T06:57:23.837853Z" + "end_time": "2026-01-28T09:02:14.810005Z", + "start_time": "2026-01-28T09:02:14.717550Z" } }, "cell_type": "code", "source": [ "import pandas as pd\n", "\n", - "dailies_df['trade_date'] = pd.to_datetime(dailies_df['trade_date'], format='%Y-%m-%d')\n", - "dailies_df.set_index('trade_date', inplace=True)\n", + "dailies_df[\"trade_date\"] = pd.to_datetime(dailies_df[\"trade_date\"], format='%Y-%m-%d')\n", + "dailies_df.set_index(\"trade_date\", inplace=True)\n", "dailies_df" ], "id": "4a56612617ffcebe", @@ -398,18 +398,18 @@ "" ] }, - "execution_count": 19, + "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 19 + "execution_count": 116 }, { "metadata": { "ExecuteTime": { - "end_time": "2026-01-28T06:57:27.063408Z", - "start_time": "2026-01-28T06:57:27.035139Z" + "end_time": "2026-01-28T09:02:15.548521Z", + "start_time": "2026-01-28T09:02:15.510447Z" } }, "cell_type": "code", @@ -697,18 +697,18 @@ "" ] }, - "execution_count": 20, + "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], - "execution_count": 20 + "execution_count": 117 }, { "metadata": { "ExecuteTime": { - "end_time": "2026-01-28T07:06:16.204280Z", - "start_time": "2026-01-28T07:06:15.674005Z" + "end_time": "2026-01-28T09:02:16.150130Z", + "start_time": "2026-01-28T09:02:15.595633Z" } }, "cell_type": "code", @@ -748,7 +748,126 @@ } } ], - "execution_count": 41 + "execution_count": 118 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-01-28T09:02:16.319469Z", + "start_time": "2026-01-28T09:02:16.309796Z" + } + }, + "cell_type": "code", + "source": [ + "dailies_df.reset_index(inplace=True)\n", + "dailies_df_inc = dailies_df[dailies_df[\"Close\"] > dailies_df[\"Open\"]]\n", + "dailies_df_dec = dailies_df[dailies_df[\"Close\"] < dailies_df[\"Open\"]]" + ], + "id": "29759a1d33476c0f", + "outputs": [], + "execution_count": 119 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2026-01-28T09:07:40.981251Z", + "start_time": "2026-01-28T09:07:40.392017Z" + } + }, + "cell_type": "code", + "source": [ + "from bokeh.io import show, output_notebook\n", + "from bokeh.plotting import figure\n", + "\n", + "output_notebook()\n", + "\n", + "p = figure(\n", + " x_axis_type=\"datetime\",\n", + " sizing_mode=\"stretch_width\",\n", + " tools=\"pan,wheel_zoom,box_zoom,reset,save,hover\",\n", + ")\n", + "p.min_border = 0\n", + "\n", + "p.xaxis.major_label_overrides = {\n", + " i: date.strftime(\"%Y-%m-%d\") for i, date in zip(dailies_df.index, dailies_df[\"trade_date\"])\n", + "}\n", + "\n", + "p.segment(dailies_df.index, dailies_df[\"High\"], dailies_df.index, dailies_df[\"Low\"], color=\"black\")\n", + "\n", + "p.vbar(dailies_df_inc.index, 0.6, dailies_df_inc[\"Open\"], dailies_df_inc[\"Close\"], color=\"grey\")\n", + "p.vbar(dailies_df_dec.index, 0.6, dailies_df_dec[\"Open\"], dailies_df_dec[\"Close\"], color=\"black\")\n", + "\n", + "p.line(dailies_df.index, dailies_df[\"sma30\"], color=\"orange\")\n", + "p.line(dailies_df.index, dailies_df[\"sma60\"], color=\"red\")\n", + "\n", + "show(p)" + ], + "id": "96bdbedea2ddc1c", + "outputs": [ + { + "data": { + "text/html": [ + " \n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "application/javascript": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const 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\nconst JS_MIME_TYPE = 'application/javascript';\n const HTML_MIME_TYPE = 'text/html';\n const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n const CLASS_NAME = 'output_bokeh rendered_html';\n\n /**\n * Render data to the DOM node\n */\n function render(props, node) {\n const 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 function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\n const cell = handle.cell;\n\n const id = cell.output_area._bokeh_element_id;\n const server_id = cell.output_area._bokeh_server_id;\n\n // Clean up Bokeh references\n if (id != null) {\n drop(id)\n }\n\n if (server_id !== undefined) {\n // Clean up Bokeh references\n const cmd_clean = \"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_clean, {\n iopub: {\n output: function(msg) {\n const id = msg.content.text.trim()\n drop(id)\n }\n }\n });\n // Destroy server and session\n const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n cell.notebook.kernel.execute(cmd_destroy);\n }\n }\n\n /**\n * Handle when a new output is added\n */\n function handleAddOutput(event, handle) {\n const output_area = handle.output_area;\n const 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 const 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 const bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n const script_attrs = bk_div.children[0].attributes;\n for (let 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 const 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 const 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 const events = require('base/js/events');\n const 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 if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\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 \"

\\n\"+\n \"\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"b86774a5-59b5-4032-84a1-593268fb9b24\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\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 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 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 const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.8.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.8.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.8.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.8.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.8.2.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\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 const cell = $(document.getElementById(\"b86774a5-59b5-4032-84a1-593268fb9b24\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\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": "'use strict';\n(function(root) {\n function now() {\n return new Date();\n }\n\n const 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 if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\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 \"

\\n\"+\n \"\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded(error = null) {\n const el = document.getElementById(\"b86774a5-59b5-4032-84a1-593268fb9b24\");\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 100);\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 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 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 const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.8.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.8.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.8.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.8.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.8.2.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {display_loaded(error);throw error;\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 const cell = $(document.getElementById(\"b86774a5-59b5-4032-84a1-593268fb9b24\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\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", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "text/html": [ + "\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + }, + { + "data": { + "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"b6a8a91e-b91f-4fb3-afc0-b28b4ee0ed96\":{\"version\":\"3.8.2\",\"title\":\"Bokeh Application\",\"config\":{\"type\":\"object\",\"name\":\"DocumentConfig\",\"id\":\"p5840\",\"attributes\":{\"notifications\":{\"type\":\"object\",\"name\":\"Notifications\",\"id\":\"p5841\"}}},\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p5747\",\"attributes\":{\"sizing_mode\":\"stretch_width\",\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p5748\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p5749\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p5756\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p5757\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p5754\",\"attributes\":{\"text_color\":\"#5B5B5B\",\"text_font\":\"Helvetica\",\"text_font_size\":\"1.15em\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p5801\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p5795\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p5796\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p5797\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x0\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4sIAAEAAAAC/w3DB1cOAAAAwC9KKlsD2StR2UpJmdkyUiqkECLKKqNEyiwzhGhZobISf87dexcIBAJBDnGowYY4zFCHG2a4EY5wpKMc7RjHOs7xRhpltDFOcKKTjHWyU5zqNKc7w5nOcrZznGuc84x3vgtMMNEkF7rIxS5xqctc7gqTTXGlqaa5ynRXm2Gma1zrOte7wY1mucnNbnGr29zuDnea7S53u8e95rjPXPPcb74FFnrAgx6yyMMWW+IRj3rMUo97wpOWecrTlnvGs1ZY6TnPe8GLXrLKai97xates8Zar1vnDW9a7y0bbPS2d7zrPe/7wCabfegjH/vEpz6zxee+8KWtvvK1b2zzre9st8NOu+z2vR/86Cc/2+MXv/rNXvvs97s//OkvfzvgHwf96z//A0NX/L7wAgAA\"},\"shape\":[188],\"dtype\":\"int32\",\"order\":\"little\"}],[\"y0\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4sIAAEAAAAC/3VUa1BUZRjmmolTuxKXuAxMxhAoLlgEzOTigxYOsismGjRgg0JckhiCILC4mEqECirs+c45XBVZQGgyaXNRN4KQi0Jxi0VIEYiQiKJVQKEk+vFxZpzp1zPve773eb/3ed7zvXJrS8BzmQQBJ1y4IyYEPNYeH5hiEHqhxyLKmGAkba/kqBfBYaPreWvnGNR9si+rdITBhZ+Cgt79mME/bltTHjQxsDcrODdrR2A6N+1g6kDwelyWTZmIILotpWCHHkEDb2h05GcGgYadEy6lQt3qgHuzWg3zv+cp0v7Kdy4/fe1XBgP9AUt+PUIdRVGGvD86j8CvZGrRbYTAYH9l8LECAsyPd8wdIkg/6eATvZ+AaY/f7BpEVu5tPLC9UuIszFs+YXHFdDeB5667xdfMBP4vjTWeczKCnJob3/qHCjw0v1B/1tlfQqCubYp0qyP4zH19/LlWgucdA43LZ4VzVG+qM62j83eoqw9HaoU5Kf5lWrQgbhP0s3g/N/GqmkHqvoYwbZ7wner6hexhxbNiBucrdMl91QpoRrwTCksV2Kpq/Fzdo0CU6GuD8O8VqH+v5EWdCQOx1Dl//YQCd5pPFRUtKpCtM94YYc9Ar2q0pTiIgX9oq1rnxeCsZLfTBnOB/8mY8vUof7Or1xN4p0Y9rDPnhH6U3+oXSVOEnMGQfEZ+P1LYE+o39Z/qQPMU6d5Rv6iftI7q/eS+UP+pT7W5tpMytRBbFd8PlOUQyM1P7BhMIiiLTz4YoyGIe3j7w6FugsvE3bfGkgWfmiBvdGEx25vRb7udxavim5G5ySzuNdsNVr7JIi3k4h6tD4tt9i7hhrEsEmUW80sVLPZK9jw2v8qiPFXv+N/DLDJlB3sHLnHw0M8az5vgMKLyt4kTcYiVbvNqCefwsn6Dr+4kh5rU3DbPfA5d5M7j0E08smWPxGaRPFKlrFlpPI+d4iR7nOJRINs5/XtCITaMDUfZhhdi9fW3ugrsCjGh7PR6ZpBHXartU4m+PIaVWxa7HXm8pi8/utGHR7C9KM3ShYeTzmHSWschPyQ/bkqfx5AyJdS9k0NuSMeP8ipuJZ5U3QqubuKwpu/AjNsqHp3EMqxBK9y7nexqfCGdwwdSE224hsMBSfXgH61CPUU6V332n8212QKOq0yvrInh8E22k6PIlcNMc63lmBGHYyHeZ0xn2RX8b98eWQm6UV7aV6v8SsMkcvhIdltRvMRCKn77fLszBy/xGWOXLhYRUtVCzkXBF6Oxuz2nNwv+Uh8pUr9vKENHNJGC79XZvX4e61hsEhu1zdiykEtavhtcxaJPNeetMGDRpPyh/NPl92F4+T+LLVl+t3SH3GIGCHS9as+MaSGfFLLOsiiXIEgaZnepnMBJnJyjiiEw0dWdvplO0K1yLZuvIoiSNVq/xBHojVm5PxglMMy3eYMxZPEvJpUInuAFAAA=\"},\"shape\":[188],\"dtype\":\"float64\",\"order\":\"little\"}],[\"x1\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4sIAAEAAAAC/w3DB1cOAAAAwC9KKlsD2StR2UpJmdkyUiqkECLKKqNEyiwzhGhZobISf87dexcIBAJBDnGowYY4zFCHG2a4EY5wpKMc7RjHOs7xRhpltDFOcKKTjHWyU5zqNKc7w5nOcrZznGuc84x3vgtMMNEkF7rIxS5xqctc7gqTTXGlqaa5ynRXm2Gma1zrOte7wY1mucnNbnGr29zuDnea7S53u8e95rjPXPPcb74FFnrAgx6yyMMWW+IRj3rMUo97wpOWecrTlnvGs1ZY6TnPe8GLXrLKai97xates8Zar1vnDW9a7y0bbPS2d7zrPe/7wCabfegjH/vEpz6zxee+8KWtvvK1b2zzre9st8NOu+z2vR/86Cc/2+MXv/rNXvvs97s//OkvfzvgHwf96z//A0NX/L7wAgAA\"},\"shape\":[188],\"dtype\":\"int32\",\"order\":\"little\"}],[\"y1\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4sIAAEAAAAC/3VSbUyTVxSmAhGmHcUIrNu0qOgKluIYi4wEPRTkY6PiwImD6mDlswoRmKSIcziGFogQN9573/fdAIlahrqZ6IoIVNSVDw3sg4+BikYoDHEkQlsgQ5D5Y29vwrJfT8495zz3nPM8jlFPpvv1CKR19zO//BHBA/mk3JyCYF2p31TVVQQLW2Rqy20EAe0FE8l1CE4zKxRVRQg0JnvvJBECm++H2ypjSb92/zWH5j8RjFimj3p3kf6EdTnJApb0CUekt5Pk5D/XjLKcpgYEMbZdY5JqBHn7WhL6yxEc3C40misIPzdX2OgmVcQ5wj/wR9RiRDeCkMwTb5xxwgCzo50zRzCcHXNtXBWNoSPI8R29DFvzW3c9rmxejeHq0X0nqofI3Fx83K613HkGQQtra1c4iKCzoe54Sj8CFpxLB/5CYD8QViv1xFbkeNM61BXv2xB+cRPzu08RhhkZ70ENQ/7jeLi4bP0B/vQkAsd/9eD2W7o3pwOXv9AXG5ucT+5Yb17oDc8l98tYsFTrJiqg/HHo3fpwyop3FkeeHWMp0A9ty/62moKdPanLv+uiINXpp2XKnymIm+IXfdFBgUx3q7ihm4JWTUhNnz0CQaDnN15jFNiJCl3CJihrPGvzECunCK6J/1Xw6jAF4rzDZVODFOR4xxWE3iC4tK9GGi3e7ILgA0V7g8kfga97vn5zMNmH88f/+YG7G6cT5wfOH5wfufxSXRUXul1T7YlezRuUunth//XPsVMeQWmJGISV5pjIEgwBoqqNHQ0Y1vIGJY+6XuqLM2r5NzC8LbDrmHyThl7dzDZqGQ2KwLf0UQsY5NK2m/eX01b8UHrqE3UiDfd0+oe+Cho+ku5+4dJEw2IPf/XeORqe94QebjxDwxVN4smsPhrqNeJNTj4MOBvfvayKYMC2t/fKdAwDYpPH+OsmBgojfbNzV7Iwb+BZmpxZWGMsKQ3ew0IfPl85V8KCSrr1Na98FvaKnD53k7CQFfhKv1LPwG5R+KO8bsLThd0SWvoZsBhy6gv2M+BinJc7nGXgYGCwf5uSvHM4qlvVuCKdYKDg43N3PBmYNFxyM9ox0IaL13/lQea+rnlmuKRhIEjgHpxaSJBWpXhvDCF7cft2a5+u/VvIgIOxNssH0RAmMvNqWmn4RbuhIP4mDROGUfWOi+SdiytU1WUnn9JWPn/B1/aS32jIiXSdXTxP6u9qFUP6FKIHm5ctvyWhwcYo9LMMYzgQqbluMBH92rSUzJ1PW3Xm8Br2C73oRlvr8+LHde89weBkOrIlfQBDjWbHyueZL30myC3RpRPs1KXx4qIwzA9HU3uKMVzGWodDSeT9UHy8+oUfhk8j5/KLt5OYqxvv8ZoLDiCxf4S5/bMfMPwDTI5TiOAFAAA=\"},\"shape\":[188],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p5802\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p5803\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Segment\",\"id\":\"p5798\",\"attributes\":{\"x0\":{\"type\":\"field\",\"field\":\"x0\"},\"y0\":{\"type\":\"field\",\"field\":\"y0\"},\"x1\":{\"type\":\"field\",\"field\":\"x1\"},\"y1\":{\"type\":\"field\",\"field\":\"y1\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Segment\",\"id\":\"p5799\",\"attributes\":{\"x0\":{\"type\":\"field\",\"field\":\"x0\"},\"y0\":{\"type\":\"field\",\"field\":\"y0\"},\"x1\":{\"type\":\"field\",\"field\":\"x1\"},\"y1\":{\"type\":\"field\",\"field\":\"y1\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Segment\",\"id\":\"p5800\",\"attributes\":{\"x0\":{\"type\":\"field\",\"field\":\"x0\"},\"y0\":{\"type\":\"field\",\"field\":\"y0\"},\"x1\":{\"type\":\"field\",\"field\":\"x1\"},\"y1\":{\"type\":\"field\",\"field\":\"y1\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p5810\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p5804\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p5805\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p5806\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4sIAAEAAAAC/w3DyyvDAQAA4F92MZdZHsNOUySbcpADeTSvXGzLUpSFA3LA1MaiHZQssVYOIicXnLRSXv+c76uvJQiCkK2GbTNiu1E77LTLbmP22GufcRP2O+CgQw6bNOWIo4457oSTTjntjLOmnXPeBRddctkVM2bNuWreNdfdcNOCW26746577nvgoUceW/TEkmVPPbPiuRdWvfTKa2veeOuddRve++CjTz774qtvvvth00+//PbHX//8B3jw17KMAQAA\"},\"shape\":[99],\"dtype\":\"int32\",\"order\":\"little\"}],[\"top\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4sIAAEAAAAC/2VQa0hTcRx1OSsE6yplbJVgRhjMUTBipdXBHlZoYhmViiTla9kkLdE00XxrLBXv/z6YVmCbj/CDZj4jfGRSs2IaDBNJZ5EpqNOtNIW+dL0f+nQ458f5cc7xvKVL7WonmFqyZ/kNESyWBJztjCLw/Kef1BbufLKVgWxK2XsjhOCad2osxYv3I29zZmPrCZT1o9oHTaK+diAwfamXYMFDv0INiv91e2662ecJXCxBRuV+Bvj1zeS4x8AQ3ba5+ztBVIPZM95F5AmD6VXnnBhM3L+kzFczCH2o4PJcmXX/hhjjlYIqBo5AyZenHAMe7mWWGTGHd5lqoaaF4OXi2siZNIKk4zLrYhVBWu3Kh7kLNA5v6Y7ITqLBFgUvzzfRKEs0ZLq9oHF+OH6TfohGYGtPSbuZhm/GXd3CGI0OTY2PzZVgZvKQPMdBw2z46dXhJHLBN95frtf/odd1mnreECQncKqbHKi+TJCfGTveWSrmE/Z6zTtL88ZEzJW+eeTuIOt7CP2FvinJ2X35cSL3kowpxocYkIzGJp9hBm2M6nTjDhY/+r1GjWEs9kk0Glkui3KNZW66nIWaqnRRfGLRXBxTdPszi6zgWpX/VQ5JR0+oB65ziFZO+odpOfja9k7LbRxW+yVLXe48ioOXqW1xPKyGjXxyDg+ZtW/22SoHXaTpY0jd/34BlZLfxnCViM4jI832ixz0Gj9Tb7XIhTwCCjkLIo9VethZvDNETbyKY3GQkg7O72LBZ6SE9ChYSK1fzRUBLFxtLRXvsxn4UmmlrYkM5JLtOtxhcEqpznscLuqm1gRJRKh4360tKiywMPgLDzXgARgDAAA=\"},\"shape\":[99],\"dtype\":\"float64\",\"order\":\"little\"}],[\"bottom\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4sIAAEAAAAC/12QfSzUcRzHkTNangotlYeUKXPNpTS69S5PU5mHVmsxJaFdspppd9N0WnQyl+L3/f1+ZylTFyk2Jeep/giTMXPOYw+4w0iGm5PF0l/nt/XXa+8/Pp/P+/PqUlVmJw8SZEy5bOWvEjjdkKc3qQgUsM8fmiXwFgS4De+gcdk9PclOQRA26SkKf0GgjK+3bJ4i4FeOpN2r5uaGBiLXw9UEE0uGOz7dHLPN2x7ZLxMEp+XufG5Lw6uJ7T2YQ8Ms4dWFnGIa1zrExadMaMyVrFalHKI3+jR7JNYNh9Go4bX4L5+h8aehbP9pPo3eaZsrvytofLeoGx0ppyGUhmRFTHF7jD2sIqcNgy0E7vl+i6XvuP5f1ifmsxQUtIG+syGFFFJs35slfqaQ7nNRGvqRgpckQ774jcKs9oizdJlCGT/Gy9uRYEu7LDg7hkCt/OnSYELQICr10G8maJMFl/XzCHbH9tjZaKmNLNPzfK66EgjcMlu8gwjuZyb9aHzIefrft9GPfM91a8MCQdxrtVMKj4Z/1NjTZgfOl/FvYzb6aFdSJ92sGRj67g7sCmMQzS+4JE5gUCgamp8p5FgrS3hwq5+BwPRTqL6AxSaNptZwlsVSa/oHaTyLeL42MDqNhZd+74yznsVLUZPV3ygFJELG4dlNBbKFnjEjHiVw0Cz4pDYqMKo8vtrrqcBXpTjOr5ubl8d29URUsFhpDTjnomJhrztcIwrn7lloSqKL3nJMFQYdbU9kUS4xyV8bZXDA1NeqfoTBQuub7TpzFo66tQjLcha/WifFIVUMtulP9FgIGJjrxtSPjzHoVMaNtyQzmOtbZMaLaAS4lu7rUNF4IpmwzZVwXNPGUOfzuEwkVdUefTQ68247qldo/AMyrvUEGAMAAA==\"},\"shape\":[99],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p5811\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p5812\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p5807\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"width\":{\"type\":\"value\",\"value\":0.6},\"bottom\":{\"type\":\"field\",\"field\":\"bottom\"},\"top\":{\"type\":\"field\",\"field\":\"top\"},\"line_color\":{\"type\":\"value\",\"value\":\"grey\"},\"fill_color\":{\"type\":\"value\",\"value\":\"grey\"},\"hatch_color\":{\"type\":\"value\",\"value\":\"grey\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p5808\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"width\":{\"type\":\"value\",\"value\":0.6},\"bottom\":{\"type\":\"field\",\"field\":\"bottom\"},\"top\":{\"type\":\"field\",\"field\":\"top\"},\"line_color\":{\"type\":\"value\",\"value\":\"grey\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"grey\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"value\",\"value\":\"grey\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p5809\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"width\":{\"type\":\"value\",\"value\":0.6},\"bottom\":{\"type\":\"field\",\"field\":\"bottom\"},\"top\":{\"type\":\"field\",\"field\":\"top\"},\"line_color\":{\"type\":\"value\",\"value\":\"grey\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"grey\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"value\",\"value\":\"grey\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p5819\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p5813\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p5814\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p5815\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4sIAAEAAAAC/w3DsUpCAQAAwNdgDWqDc5mgIC2KSdTQ0haioygoOIRDpJNNgZQYQjiEkRGEiWQNFhFJfp93cEEQBBuG3HTLsBGjbhtzx13j7pkwacq0+2bMmvPAvIceeeyJp55ZsGjJshWr1qzb8NymF17asm3HK6/teuOtPfveOfDeoQ+OfPTJsc+++OrEN6fOfHfuh58u/PLbH3/9c+m/K9ejT3x0SAEAAA==\"},\"shape\":[82],\"dtype\":\"int32\",\"order\":\"little\"}],[\"top\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4sIAAEAAAAC/0WRa0iTcRjFs2Z326tYgprmpVyQl0JU6HYUzZKNZXSDjbBCswkSiDYpc5qYhU0w3/9laqWCZC67MVNQDFlhpBk6vJRCeYmsoLk2A1OsD819Oh9+5+F5znnSU0eS6rIoetuaijKGCYokryo85wgWoxK09m6C1l+LlsN5BOqHA1suuNNl3mVYJbk+RpAWlJMuGFxz0kLFUGYFxbXbofGZZynIm0v7Ik9RfC44EVESRxF79FNthzdFoHdVvSOAIrNHW5WywuXrCDlvGk12+Z0890uAV8QfAn1wlofDSjDrVTMv9BBM2R1Xw/sI1im/OoY7CSKaPmQXtxB8n4jx1c2JkOXn6mfHRLRr7obY1pNldfKtqn5h04SIkSHl0pEBV26nJmaX+t2Xuvpx3mPU+8/I2yjS//f3ulFM2ObB4BgsHPJPZihQPTk+HM9QrvFMlccyKAOLDo5pOS7Lx8XaJYa9boqS8HgD5k2OwcCd1SiXv3z8tMuAFKFFVx9jQJ3Grkn7zbHBcs4atcYAmS10xtfG8bFRq47u49CrevsVDzhmTKOnm7o5VluqU+884tDJswZHnnG0l/00G8v48l6myQjfnsjRWibbIY3kqNLc09/4xmA1G30mJRybJxcUaxs47OacVt0ZDj9b/8aEaYY4odJ913uGH+ZpbVKzK0+QW8PbK2EMuwVJj9WfYdTUOb5HzfCCRh9q9mGwmOYOiCsZ1PvDOpWL//6nCvap0VN0N75rKH5OsTBxTDx5k6Iyf0pamk8hE/JumS5S/AW8YhjzkAIAAA==\"},\"shape\":[82],\"dtype\":\"float64\",\"order\":\"little\"}],[\"bottom\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4sIAAEAAAAC/0WPbUhTYRiGi81MTdRFBv1waCMlbFmIhl/cSiWWIiIi1WZa2NRIKik6aWaYdkybGex9z3uQ/AgktVwpSzOHGOsDSoQ50yIy8yN/LNLlTDCp/hzPr4uL54b7uSc+pP9NsRMEnjOWvOgjWItIurL0koDTD+aO1xP8qolL6dcRDIoKZeVngpkld9meYYJMxfD38CaCMsdJc4WGILg2cvF+D0H5HU1iQR7FwM7Tlo/JFP/PT5rjKVTLPzQqDUVbTu/mgTkCXYc90OBBcWkuSKVdJZi6lqW9eUDO3VC+qg9YJjCGnPV1L8iU+qV/Jca8qXDmtxN0jGVn55cS6Au6RsP0JiRZhmr67CZ8sd1tbFyVqVRXbkt2mnB80bfq+lsTvNLn3eNWeYfkPWX66qYpuVdys4c1ejmVru/1c12NKJygqCsKyEiNFqCc/mpviBPQSyMPd24XcFTd35ygZti9cZ9X7ycBZ7TnubpgEa/5gy1VJhFH/LsqWqNE+DhOLUR4ijBzWYYxJ0NL0VJR7m+GFVtMVlAfQ472W2xGMcOsRdXvU8jwjA/b5beXwXji/UjaQ4bn/E/bI55B4XB0uzMZ1C7SOZnA1vsfcBtq/0wK6Obzbl0Ykzne9tRKSti6S7nHvDg/WipgqytxZNN+ASJ3MW0oXEA7P5oSFSLvk1wXH2pNX6OYtmXHeq9QeLt6Gt6VU7Twh7asFlMYUod2hDKKe9yMXzVHEeZ/+balkMLa5ukxe4ziHwAaZj2QAgAA\"},\"shape\":[82],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p5820\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p5821\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p5816\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"width\":{\"type\":\"value\",\"value\":0.6},\"bottom\":{\"type\":\"field\",\"field\":\"bottom\"},\"top\":{\"type\":\"field\",\"field\":\"top\"},\"fill_color\":{\"type\":\"value\",\"value\":\"black\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p5817\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"width\":{\"type\":\"value\",\"value\":0.6},\"bottom\":{\"type\":\"field\",\"field\":\"bottom\"},\"top\":{\"type\":\"field\",\"field\":\"top\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"black\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"VBar\",\"id\":\"p5818\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"width\":{\"type\":\"value\",\"value\":0.6},\"bottom\":{\"type\":\"field\",\"field\":\"bottom\"},\"top\":{\"type\":\"field\",\"field\":\"top\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"black\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p5828\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p5822\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p5823\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p5824\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4sIAAEAAAAC/w3DB1cOAAAAwC9KKlsD2StR2UpJmdkyUiqkECLKKqNEyiwzhGhZobISf87dexcIBAJBDnGowYY4zFCHG2a4EY5wpKMc7RjHOs7xRhpltDFOcKKTjHWyU5zqNKc7w5nOcrZznGuc84x3vgtMMNEkF7rIxS5xqctc7gqTTXGlqaa5ynRXm2Gma1zrOte7wY1mucnNbnGr29zuDnea7S53u8e95rjPXPPcb74FFnrAgx6yyMMWW+IRj3rMUo97wpOWecrTlnvGs1ZY6TnPe8GLXrLKai97xates8Zar1vnDW9a7y0bbPS2d7zrPe/7wCabfegjH/vEpz6zxee+8KWtvvK1b2zzre9st8NOu+z2vR/86Cc/2+MXv/rNXvvs97s//OkvfzvgHwf96z//A0NX/L7wAgAA\"},\"shape\":[188],\"dtype\":\"int32\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4sIAAEAAAAC/0WTeTTVaRjHyzqEinI14YpcI3WdpqSQ+eZaRt2kxSldIVlKe1RkikqK1hHv+3vR4pREaUGLqDAUWepKlAoRZiRNMZapmN+Z0zn99Tnv+2zv832ed6i1qXjuZIqNPqrVGUYUy+xFWWtMKMZ1eqgpmlPsm69t0z2VYutspecTplHcirLzXc+fP5XOcVrJ25Weu6SLeep+8/cwya9pmULhODZri5YFRUfxUGq/iMLW/HX61EkUCj/e3PnLeIrHQ30WEi2K+VxJbrwyRbuNxExdiY877/UkdQT/nvoFSwu+Ejjdf5hpPEiwqvlixdo+gnzX4tARPQQvwncsu/2ewE1pqyHpIKg9Gz7/1zcEvtM7V75rItjvoSJM4ClSXeG++yXBxkUnnlc3EAw9XVvl10hwfMW84j7eX2YsSAlvIXAdo2aTxnOHtW/qtbcEJ6UZFzraCSbL9yZHdBKopFbl//GBwCBdohDbS6DLbZEI+gmCWls3VQwQhLQbaos/E5gd16kIHiJIbrVudlal+I3TE2mNo9BQiMEkIUVv83nhS14HecEh2c/GFBVZN1IKJ3/XKXXXgwkXzCgGazWUKkXf78WjrKe48uyWy33X8f5S23dqI/k8L9of9E7Wo4i9ee/cR17Pl/qnMkRqFOo+Pu+yFSlCR8Z1XeH1urGlNPgE34+rReg4Ea9H9OFXTxOfEOzNbio3LSFI6rYo7coj2NDyy2y/awTtEZpF19MJhm95FoSdIhjbVjNQlUiwLyKg8U4cgWTV+g+yvQRe7Fan8U6CXr85S6esIzhjX26gIiOwFxg6Rc4nqCgetDw3j6CowTyoyJogoXpuwywxQZ5maZiviGBU6Lk9iUYEp3Q6FmbqE4R+9ksbo8fXO/1GcEiXoNIj4/gsAcEBza2qbTxzZ5Zt+nsCgXKUbdL5iQQtMmHdZ57d3ivDvQ0JjHyudL6YSlD8rV7MrqL0xQ4Eke77tXykvL1yKM55Od+H1nh7N18Cz8I7zdnBBPIfXBoiwwj2HPw6WH6AwFRbamVyjCDK6bh5HiN4H9ccaZLG70fbrpcl2QSNEwe33S0kGFO9d2BNDYF3soZzKL8/jXqinUf4Pa07HKGyaBTFs4MtEf783GPzDe5qTqeYVJ+ftcSRYvn4N6LPyynOBoxTCFtPcWl4UapKJMWRAYG6J6Goqf3ikJFJYYZ97q8KKAwrbJKdnlIk1qelXv+L4ob2R039YQof2Y77eQIOOa4PstWsOJxekCcJWcwBh/okbps5yLB2bmg8h2NH1f7VyOZgXVe6caqcQ8xS9cbzHRza/JYlKX/hkO1x689gbQarqGGx3RSGNL3pX6VgSLBaV3N0Cfv/P9X6M9gdnaGctIXhIXUvmrSHIfLx7vSOWAadNTE5egl8fPSl6PtnGXzFBWmjMxkCZ17senSd4UKP8uIFtxmiKt9sLCtiqBCklj4uY2ix9L/8upwh9plkxeoqBlvVA/3r5QzOJ9s7P/EUR5gotT1h+HjPVuJQzbBd0mcgLGW4HhnkWMPny1UIWliYxWA+4Pr7bL5us2Wcg/AYz6s6Fy0jGW4oKx5s2s6wwznN2GczQ2t2iq44gEE30Pi9tRdDweHDQxXuDEnBgdNMHRkqDboULW0Z4t8qSndNY/hUwqTFxgy9LszjmoBhwgaXRA91hrqMkKP9wxxyD7kVuPdwKE0y9TrXxevsn+NS2cJhRpy+p289hxNBdjcflXFICTEb7XeHg7NQpaooncO2yjNeYyiHS8rJTW0xHAKweGZmGIfqjJro5GB+TjrLnh3x4iC/LOth7hy874w0NHLkYMdeScOtOUSvvhqYY8HBD3GJGkIOntY/XQrR4SC1cDf4qsjBaGf8P179FP8BIUxvteAFAAA=\"},\"shape\":[188],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p5829\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p5830\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p5825\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"orange\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p5826\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"orange\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p5827\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"orange\",\"line_alpha\":0.2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p5837\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p5831\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p5832\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p5833\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4sIAAEAAAAC/w3DB1cOAAAAwC9KKlsD2StR2UpJmdkyUiqkECLKKqNEyiwzhGhZobISf87dexcIBAJBDnGowYY4zFCHG2a4EY5wpKMc7RjHOs7xRhpltDFOcKKTjHWyU5zqNKc7w5nOcrZznGuc84x3vgtMMNEkF7rIxS5xqctc7gqTTXGlqaa5ynRXm2Gma1zrOte7wY1mucnNbnGr29zuDnea7S53u8e95rjPXPPcb74FFnrAgx6yyMMWW+IRj3rMUo97wpOWecrTlnvGs1ZY6TnPe8GLXrLKai97xates8Zar1vnDW9a7y0bbPS2d7zrPe/7wCabfegjH/vEpz6zxee+8KWtvvK1b2zzre9st8NOu+z2vR/86Cc/2+MXv/rNXvvs97s//OkvfzvgHwf96z//A0NX/L7wAgAA\"},\"shape\":[188],\"dtype\":\"int32\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4sIAAEAAAAC/22UezDWWRjHlRW5RO+WimWyiFKbSpKKL6V37Vtuu5sxsSTdiKalmWS0NpdRK7dyzu9XrouK5FpY127oQoQkm1ci5RLlkjt7dqaZ9o/96zNnznOe5/t9znNOlc3Lj9+BosHrzDHBFooqD2F1lhFFsFFmpL0BRUdS1eYBfQqtT7TVWo/CyWyfTaU2xRaj7IPx6hS5JeI/h1Uo7jQWRtsspShvCVrevJiiotu+zfJrinsDmp5PlSjqpWcc1yygcIw3nrSX/cLf7u4pl2B0+rzOGPC9eWE+RfqIhbmqNIVJRGngNSmKdijeippD8db6tbfkLEHwoEvXqWmCNGX/dE3G1l1X6xKnCOR9ZjZlzBA81J7QaGDxfZbKXX6M03u1vrf5H9pnx6f0z6VY65+l0cjqzOAvz1oZisDPugZ02/y95ShO5wVKRMhTRJdXNP7NfCwz279CgfnaF1i7/PlCCvHkATN15ld25VnDHAHF0RDZ+5sXUcDh7ZMrjF4BJoa5yhSJJQY9+Syu9XP8/M/xq3enTjgwjnwjdHVjeW+0tBy6xOrYhbjITcl/0aPukVQ+y3Qqea1P12L61cKadWSYb6kQ13bzUYI50RNTtoMEW5+PtmOAoMh9/KVMN0GyWyDZ3knQcMWiuVZM0F0zGBL3gmBmOGGjRyMBH9ez0b2O4PGLV91eNQSnwj3Lih4TRGdZtUk8ZPtlGvG/VhL4ZqWsuHeHoE2jQsKijGDHxTctlUUEouRC3qiQILL3g8a5AnYv8vXmdTcJOmxrdcpzCKpFDu3jGQTrynyL/dIIbN/tU8i4QmA/alCtlkKwe3hctziJQL8tWzMogSDpJ/mkw/EE4gvbxmrjCNy1MmW8Ywkqz1flyPIEQtVpdVEMgfNWsWlUNMGU2DFXJorp0I/12BFJUJo6+k43gvmsVxEXhxPM7V97/BSjjemxVfnnCcJPJ/6uxuhq6x92jtHRPL1mKTtXlqC3N4nlueynSMcYA1wmJI1Z/iXDqQWmFwiOmC7rGLr4hfYh2nK3CIGVQ0yFL2Pj+4iGJUznrrx6w1Dmx0BP6XoN85no9lGl4DrBxdS1yj65rI+L3IrsWN/OZhf/eJ/1s/UJ51j1iEDv6qvqqibGj4bawnYCT+NU54O9BFHaxSon2P0W86+Lm9i81hWmbi9l82HqJHhm+S17j4KxsAOGFIL9pSdeW1I4921Na3Ki2Baywa3Vh0LaSjF2zVmKnSJcHYijWJWp6yjIZnM/ovvo7W2Knrw5isI6iheuwoyJdvYPPA01KRykCFIY3JM2l0NW4eyDBwIOKTdaZk5rcIjkMyVF+hxWD9sqGoOD96hEa541h6/mCSUELhyGho/mhHtyuCu1vmaBHwf/oKEtmqEcFJZNbkokHAr+OLmhN5mDwSKTvarZHPR+TtwtVcLqJEtqaVVx0M9S2h5bz8E5rdNO1Mrh6WGim9XF4Yh1vtfRfg45nWTy/ScOOjqRD/hZDhuQ6H5Pmoea0Xi5pRKP/PgFtvFLeYx4uk0Ea/KYrraXOKPHo+PcyWZen7G1z912E4/R4ArloG08Eu6IFm8255GdtspDvJOHnFrwRh1LHsppXbqZjOIBH7nuH3hUx7nGqzP6zPNfLvMfRnd+CHAQ8fCrXnNJxNbvTRY+eybkMV9FMdrSgsdNC7cezoxHjM6tklojHrN1x1uM1v97PrJXdzWP592XI6y0eQQI/HbcVmN1u4Vhhxbz0Bq7FvpSluWJM1jnO8NhvEajJnaQQ1PG1OTIGw4aRrJ9MU0cYofi0mwfcgjgVtr1sz4+FqvK/5LH4R+fxKBb4AUAAA==\"},\"shape\":[188],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p5838\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p5839\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p5834\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"red\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p5835\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"red\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p5836\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"red\",\"line_alpha\":0.2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p5755\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p5782\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p5783\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p5784\",\"attributes\":{\"dimensions\":\"both\",\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p5785\",\"attributes\":{\"syncable\":false,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5,\"level\":\"overlay\",\"visible\":false,\"left\":{\"type\":\"number\",\"value\":\"nan\"},\"right\":{\"type\":\"number\",\"value\":\"nan\"},\"top\":{\"type\":\"number\",\"value\":\"nan\"},\"bottom\":{\"type\":\"number\",\"value\":\"nan\"},\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"top_units\":\"canvas\",\"bottom_units\":\"canvas\",\"handles\":{\"type\":\"object\",\"name\":\"BoxInteractionHandles\",\"id\":\"p5791\",\"attributes\":{\"all\":{\"type\":\"object\",\"name\":\"AreaVisuals\",\"id\":\"p5790\",\"attributes\":{\"fill_color\":\"white\",\"hover_fill_color\":\"lightgray\"}}}}}}}},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p5792\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p5793\"},{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p5794\",\"attributes\":{\"renderers\":\"auto\",\"sort_by\":null}}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p5777\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p5778\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p5779\"},\"axis_label_standoff\":10,\"axis_label_text_color\":\"#5B5B5B\",\"axis_label_text_font\":\"Helvetica\",\"axis_label_text_font_size\":\"1.25em\",\"axis_label_text_font_style\":\"normal\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p5780\"},\"major_label_text_color\":\"#5B5B5B\",\"major_label_text_font\":\"Helvetica\",\"major_label_text_font_size\":\"1.025em\",\"axis_line_color\":\"#5B5B5B\",\"axis_line_alpha\":0,\"major_tick_line_color\":\"#5B5B5B\",\"major_tick_line_alpha\":0,\"minor_tick_line_color\":\"#5B5B5B\",\"minor_tick_line_alpha\":0}}],\"below\":[{\"type\":\"object\",\"name\":\"DatetimeAxis\",\"id\":\"p5758\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"DatetimeTicker\",\"id\":\"p5759\",\"attributes\":{\"num_minor_ticks\":5,\"tickers\":[{\"type\":\"object\",\"name\":\"AdaptiveTicker\",\"id\":\"p5760\",\"attributes\":{\"num_minor_ticks\":0,\"mantissas\":[1,2,5],\"max_interval\":500.0}},{\"type\":\"object\",\"name\":\"AdaptiveTicker\",\"id\":\"p5761\",\"attributes\":{\"num_minor_ticks\":0,\"base\":60,\"mantissas\":[1,2,5,10,15,20,30],\"min_interval\":1000.0,\"max_interval\":1800000.0}},{\"type\":\"object\",\"name\":\"AdaptiveTicker\",\"id\":\"p5762\",\"attributes\":{\"num_minor_ticks\":0,\"base\":24,\"mantissas\":[1,2,4,6,8,12],\"min_interval\":3600000.0,\"max_interval\":43200000.0}},{\"type\":\"object\",\"name\":\"DaysTicker\",\"id\":\"p5763\",\"attributes\":{\"days\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]}},{\"type\":\"object\",\"name\":\"DaysTicker\",\"id\":\"p5764\",\"attributes\":{\"days\":[1,4,7,10,13,16,19,22,25,28]}},{\"type\":\"object\",\"name\":\"DaysTicker\",\"id\":\"p5765\",\"attributes\":{\"days\":[1,8,15,22]}},{\"type\":\"object\",\"name\":\"DaysTicker\",\"id\":\"p5766\",\"attributes\":{\"days\":[1,15]}},{\"type\":\"object\",\"name\":\"MonthsTicker\",\"id\":\"p5767\",\"attributes\":{\"months\":[0,1,2,3,4,5,6,7,8,9,10,11]}},{\"type\":\"object\",\"name\":\"MonthsTicker\",\"id\":\"p5768\",\"attributes\":{\"months\":[0,2,4,6,8,10]}},{\"type\":\"object\",\"name\":\"MonthsTicker\",\"id\":\"p5769\",\"attributes\":{\"months\":[0,4,8]}},{\"type\":\"object\",\"name\":\"MonthsTicker\",\"id\":\"p5770\",\"attributes\":{\"months\":[0,6]}},{\"type\":\"object\",\"name\":\"YearsTicker\",\"id\":\"p5771\"}]}},\"formatter\":{\"type\":\"object\",\"name\":\"DatetimeTickFormatter\",\"id\":\"p5774\",\"attributes\":{\"seconds\":\"%T\",\"minsec\":\"%T\",\"minutes\":\"%H:%M\",\"hours\":\"%H:%M\",\"days\":\"%b %d\",\"months\":\"%b %Y\",\"strip_leading_zeros\":[\"microseconds\",\"milliseconds\",\"seconds\"],\"boundary_scaling\":false,\"context\":{\"type\":\"object\",\"name\":\"DatetimeTickFormatter\",\"id\":\"p5773\",\"attributes\":{\"microseconds\":\"%T\",\"milliseconds\":\"%T\",\"seconds\":\"%b %d, %Y\",\"minsec\":\"%b %d, %Y\",\"minutes\":\"%b %d, %Y\",\"hourmin\":\"%b %d, %Y\",\"hours\":\"%b %d, %Y\",\"days\":\"%Y\",\"months\":\"\",\"years\":\"\",\"boundary_scaling\":false,\"hide_repeats\":true,\"context\":{\"type\":\"object\",\"name\":\"DatetimeTickFormatter\",\"id\":\"p5772\",\"attributes\":{\"microseconds\":\"%b %d, %Y\",\"milliseconds\":\"%b %d, %Y\",\"seconds\":\"\",\"minsec\":\"\",\"minutes\":\"\",\"hourmin\":\"\",\"hours\":\"\",\"days\":\"\",\"months\":\"\",\"years\":\"\",\"boundary_scaling\":false,\"hide_repeats\":true}},\"context_which\":\"all\"}},\"context_which\":\"all\"}},\"axis_label_standoff\":10,\"axis_label_text_color\":\"#5B5B5B\",\"axis_label_text_font\":\"Helvetica\",\"axis_label_text_font_size\":\"1.25em\",\"axis_label_text_font_style\":\"normal\",\"major_label_overrides\":{\"type\":\"map\",\"entries\":[[0,\"2025-01-02\"],[1,\"2025-01-03\"],[2,\"2025-01-06\"],[3,\"2025-01-07\"],[4,\"2025-01-08\"],[5,\"2025-01-09\"],[6,\"2025-01-10\"],[7,\"2025-01-13\"],[8,\"2025-01-14\"],[9,\"2025-01-15\"],[10,\"2025-01-16\"],[11,\"2025-01-17\"],[12,\"2025-01-20\"],[13,\"2025-01-21\"],[14,\"2025-01-22\"],[15,\"2025-01-23\"],[16,\"2025-01-24\"],[17,\"2025-01-27\"],[18,\"2025-02-05\"],[19,\"2025-02-06\"],[20,\"2025-02-07\"],[21,\"2025-02-10\"],[22,\"2025-02-11\"],[23,\"2025-02-12\"],[24,\"2025-02-13\"],[25,\"2025-02-14\"],[26,\"2025-02-17\"],[27,\"2025-02-18\"],[28,\"2025-02-19\"],[29,\"2025-02-20\"],[30,\"2025-02-21\"],[31,\"2025-02-24\"],[32,\"2025-02-25\"],[33,\"2025-02-26\"],[34,\"2025-02-27\"],[35,\"2025-02-28\"],[36,\"2025-03-03\"],[37,\"2025-03-04\"],[38,\"2025-03-05\"],[39,\"2025-03-06\"],[40,\"2025-03-07\"],[41,\"2025-03-10\"],[42,\"2025-03-11\"],[43,\"2025-03-12\"],[44,\"2025-03-13\"],[45,\"2025-03-14\"],[46,\"2025-03-17\"],[47,\"2025-03-18\"],[48,\"2025-03-19\"],[49,\"2025-03-20\"],[50,\"2025-03-21\"],[51,\"2025-03-24\"],[52,\"2025-03-25\"],[53,\"2025-03-26\"],[54,\"2025-03-27\"],[55,\"2025-03-28\"],[56,\"2025-03-31\"],[57,\"2025-04-01\"],[58,\"2025-04-02\"],[59,\"2025-04-03\"],[60,\"2025-04-07\"],[61,\"2025-04-08\"],[62,\"2025-04-09\"],[63,\"2025-04-10\"],[64,\"2025-04-11\"],[65,\"2025-04-14\"],[66,\"2025-04-15\"],[67,\"2025-04-16\"],[68,\"2025-04-17\"],[69,\"2025-04-18\"],[70,\"2025-04-21\"],[71,\"2025-04-22\"],[72,\"2025-04-23\"],[73,\"2025-04-24\"],[74,\"2025-04-25\"],[75,\"2025-04-28\"],[76,\"2025-04-29\"],[77,\"2025-04-30\"],[78,\"2025-05-06\"],[79,\"2025-05-07\"],[80,\"2025-05-08\"],[81,\"2025-05-09\"],[82,\"2025-05-12\"],[83,\"2025-05-13\"],[84,\"2025-05-14\"],[85,\"2025-05-15\"],[86,\"2025-05-16\"],[87,\"2025-05-19\"],[88,\"2025-05-20\"],[89,\"2025-05-21\"],[90,\"2025-05-22\"],[91,\"2025-05-23\"],[92,\"2025-05-26\"],[93,\"2025-05-27\"],[94,\"2025-05-28\"],[95,\"2025-05-29\"],[96,\"2025-05-30\"],[97,\"2025-06-03\"],[98,\"2025-06-04\"],[99,\"2025-06-05\"],[100,\"2025-06-06\"],[101,\"2025-06-09\"],[102,\"2025-06-10\"],[103,\"2025-06-11\"],[104,\"2025-06-12\"],[105,\"2025-06-13\"],[106,\"2025-06-16\"],[107,\"2025-06-17\"],[108,\"2025-06-18\"],[109,\"2025-06-19\"],[110,\"2025-06-20\"],[111,\"2025-06-23\"],[112,\"2025-06-24\"],[113,\"2025-06-25\"],[114,\"2025-06-26\"],[115,\"2025-06-27\"],[116,\"2025-06-30\"],[117,\"2025-07-01\"],[118,\"2025-07-02\"],[119,\"2025-07-03\"],[120,\"2025-07-04\"],[121,\"2025-07-07\"],[122,\"2025-07-08\"],[123,\"2025-07-09\"],[124,\"2025-07-10\"],[125,\"2025-07-11\"],[126,\"2025-07-14\"],[127,\"2025-07-15\"],[128,\"2025-07-16\"],[129,\"2025-07-17\"],[130,\"2025-07-18\"],[131,\"2025-07-21\"],[132,\"2025-07-22\"],[133,\"2025-07-23\"],[134,\"2025-07-24\"],[135,\"2025-07-25\"],[136,\"2025-07-28\"],[137,\"2025-07-29\"],[138,\"2025-07-30\"],[139,\"2025-07-31\"],[140,\"2025-08-01\"],[141,\"2025-08-04\"],[142,\"2025-08-05\"],[143,\"2025-08-06\"],[144,\"2025-08-07\"],[145,\"2025-08-08\"],[146,\"2025-08-11\"],[147,\"2025-08-12\"],[148,\"2025-08-13\"],[149,\"2025-08-14\"],[150,\"2025-08-15\"],[151,\"2025-08-18\"],[152,\"2025-08-19\"],[153,\"2025-08-20\"],[154,\"2025-08-21\"],[155,\"2025-08-22\"],[156,\"2025-08-25\"],[157,\"2025-08-26\"],[158,\"2025-08-27\"],[159,\"2025-08-28\"],[160,\"2025-08-29\"],[161,\"2025-09-01\"],[162,\"2025-09-02\"],[163,\"2025-09-03\"],[164,\"2025-09-04\"],[165,\"2025-09-05\"],[166,\"2025-09-08\"],[167,\"2025-09-09\"],[168,\"2025-09-10\"],[169,\"2025-09-11\"],[170,\"2025-09-12\"],[171,\"2025-09-15\"],[172,\"2025-09-16\"],[173,\"2025-09-17\"],[174,\"2025-09-18\"],[175,\"2025-09-19\"],[176,\"2025-09-22\"],[177,\"2025-09-23\"],[178,\"2025-09-24\"],[179,\"2025-09-25\"],[180,\"2025-09-26\"],[181,\"2025-09-29\"],[182,\"2025-09-30\"],[183,\"2025-10-09\"],[184,\"2025-10-10\"],[185,\"2025-10-13\"],[186,\"2025-10-14\"],[187,\"2025-10-15\"]]},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p5775\"},\"major_label_text_color\":\"#5B5B5B\",\"major_label_text_font\":\"Helvetica\",\"major_label_text_font_size\":\"1.025em\",\"axis_line_color\":\"#5B5B5B\",\"axis_line_alpha\":0,\"major_tick_line_color\":\"#5B5B5B\",\"major_tick_line_alpha\":0,\"minor_tick_line_color\":\"#5B5B5B\",\"minor_tick_line_alpha\":0}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p5776\",\"attributes\":{\"axis\":{\"id\":\"p5758\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p5781\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p5777\"}}}],\"min_border\":0}}]}};\n const render_items = [{\"docid\":\"b6a8a91e-b91f-4fb3-afc0-b28b4ee0ed96\",\"roots\":{\"p5747\":\"caf1a2ad-09d2-4ce5-bf68-6763f01a2967\"},\"root_ids\":[\"p5747\"]}];\n void root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n let attempts = 0;\n const timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", + "application/vnd.bokehjs_exec.v0+json": "" + }, + "metadata": { + "application/vnd.bokehjs_exec.v0+json": { + "id": "p5747" + } + }, + "output_type": "display_data", + "jetTransient": { + "display_id": null + } + } + ], + "execution_count": 130 } ], "metadata": { diff --git a/pyproject.toml b/pyproject.toml index 7268ea0..cf47c79 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,6 +7,7 @@ dependencies = [ "backtesting~=0.6.5", "duckdb>=1.4.3", "jupyter~=1.1.1", + "jupyter-bokeh>=4.0.5", "matplotlib~=3.10.8", "mplfinance>=0.12.10b0", "pandas~=2.3.3", diff --git a/uv.lock b/uv.lock index 0261d48..6f51b76 100644 --- a/uv.lock +++ b/uv.lock @@ -672,6 +672,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657, upload-time = "2024-08-30T07:15:47.045Z" }, ] +[[package]] +name = "jupyter-bokeh" +version = "4.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bokeh" }, + { name = "ipywidgets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/fd/8f0213c704bf36b5f523ae5bf7dc367f3687e75dcc2354084b75c05d2b53/jupyter_bokeh-4.0.5.tar.gz", hash = "sha256:a33d6ab85588f13640b30765fa15d1111b055cbe44f67a65ca57d3593af8245d", size = 149140, upload-time = "2024-06-03T06:33:33.488Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/78/33b2294aad62e5f95b89a89379c5995c2bd978018387ef8bec79f6dc272c/jupyter_bokeh-4.0.5-py3-none-any.whl", hash = "sha256:1110076c14c779071cf492646a1a871aefa8a477261e4721327a666e65df1a2c", size = 148593, upload-time = "2024-06-03T06:33:35.82Z" }, +] + [[package]] name = "jupyter-client" version = "8.8.0" @@ -904,6 +917,7 @@ dependencies = [ { name = "backtesting" }, { name = "duckdb" }, { name = "jupyter" }, + { name = "jupyter-bokeh" }, { name = "matplotlib" }, { name = "mplfinance" }, { name = "pandas" }, @@ -921,6 +935,7 @@ requires-dist = [ { name = "backtesting", specifier = "~=0.6.5" }, { name = "duckdb", specifier = ">=1.4.3" }, { name = "jupyter", specifier = "~=1.1.1" }, + { name = "jupyter-bokeh", specifier = ">=4.0.5" }, { name = "matplotlib", specifier = "~=3.10.8" }, { name = "mplfinance", specifier = ">=0.12.10b0" }, { name = "pandas", specifier = "~=2.3.3" },