Skip to content

Instantly share code, notes, and snippets.

@apatlpo
Created October 20, 2023 10:30
Show Gist options
  • Select an option

  • Save apatlpo/fbe104eac858bc01312ec059cc799be8 to your computer and use it in GitHub Desktop.

Select an option

Save apatlpo/fbe104eac858bc01312ec059cc799be8 to your computer and use it in GitHub Desktop.
guerledan_202310_seabot
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "fae5db15-f69f-407b-82ea-7901fb9c0718",
"metadata": {},
"source": [
"# Guerlédan 2023/10: seabot"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "ddadbdee-1dea-4d2f-a3ac-88432bda5334",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"application/javascript": [
"(function(root) {\n",
" function now() {\n",
" return new Date();\n",
" }\n",
"\n",
" var force = true;\n",
" var py_version = '3.1.1'.replace('rc', '-rc.');\n",
" var is_dev = py_version.indexOf(\"+\") !== -1 || py_version.indexOf(\"-\") !== -1;\n",
" var reloading = false;\n",
" var Bokeh = root.Bokeh;\n",
" var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n",
"\n",
" if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n",
" root._bokeh_timeout = Date.now() + 5000;\n",
" root._bokeh_failed_load = false;\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, js_modules, js_exports, callback) {\n",
" if (css_urls == null) css_urls = [];\n",
" if (js_urls == null) js_urls = [];\n",
" if (js_modules == null) js_modules = [];\n",
" if (js_exports == null) js_exports = {};\n",
"\n",
" root._bokeh_onload_callbacks.push(callback);\n",
"\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.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n",
" run_callbacks();\n",
" return null;\n",
" }\n",
" if (!reloading) {\n",
" console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
" }\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",
" window._bokeh_on_load = on_load\n",
"\n",
" function on_error() {\n",
" console.error(\"failed to load \" + url);\n",
" }\n",
"\n",
" var skip = [];\n",
" if (window.requirejs) {\n",
" window.requirejs.config({'packages': {}, 'paths': {'jspanel': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/jspanel', 'jspanel-modal': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal', 'jspanel-tooltip': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip', 'jspanel-hint': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint', 'jspanel-layout': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout', 'jspanel-contextmenu': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu', 'jspanel-dock': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock', 'gridstack': 'https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all', 'notyf': 'https://cdn.jsdelivr.net/npm/notyf@3/notyf.min'}, 'shim': {'jspanel': {'exports': 'jsPanel'}, 'gridstack': {'exports': 'GridStack'}}});\n",
" require([\"jspanel\"], function(jsPanel) {\n",
"\twindow.jsPanel = jsPanel\n",
"\ton_load()\n",
" })\n",
" require([\"jspanel-modal\"], function() {\n",
"\ton_load()\n",
" })\n",
" require([\"jspanel-tooltip\"], function() {\n",
"\ton_load()\n",
" })\n",
" require([\"jspanel-hint\"], function() {\n",
"\ton_load()\n",
" })\n",
" require([\"jspanel-layout\"], function() {\n",
"\ton_load()\n",
" })\n",
" require([\"jspanel-contextmenu\"], function() {\n",
"\ton_load()\n",
" })\n",
" require([\"jspanel-dock\"], function() {\n",
"\ton_load()\n",
" })\n",
" require([\"gridstack\"], function(GridStack) {\n",
"\twindow.GridStack = GridStack\n",
"\ton_load()\n",
" })\n",
" require([\"notyf\"], function() {\n",
"\ton_load()\n",
" })\n",
" root._bokeh_is_loading = css_urls.length + 9;\n",
" } else {\n",
" root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n",
" }\n",
"\n",
" var existing_stylesheets = []\n",
" var links = document.getElementsByTagName('link')\n",
" for (var i = 0; i < links.length; i++) {\n",
" var link = links[i]\n",
" if (link.href != null) {\n",
"\texisting_stylesheets.push(link.href)\n",
" }\n",
" }\n",
" for (var i = 0; i < css_urls.length; i++) {\n",
" var url = css_urls[i];\n",
" if (existing_stylesheets.indexOf(url) !== -1) {\n",
"\ton_load()\n",
"\tcontinue;\n",
" }\n",
" const element = document.createElement(\"link\");\n",
" element.onload = on_load;\n",
" element.onerror = on_error;\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",
" } if (((window['jsPanel'] !== undefined) && (!(window['jsPanel'] instanceof HTMLElement))) || window.requirejs) {\n",
" var urls = ['https://cdn.holoviz.org/panel/1.0.4/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.0.4/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.0.4/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.0.4/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.0.4/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.0.4/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.0.4/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock.js'];\n",
" for (var i = 0; i < urls.length; i++) {\n",
" skip.push(urls[i])\n",
" }\n",
" } if (((window['GridStack'] !== undefined) && (!(window['GridStack'] instanceof HTMLElement))) || window.requirejs) {\n",
" var urls = ['https://cdn.holoviz.org/panel/1.0.4/dist/bundled/gridstack/gridstack@7.2.3/dist/gridstack-all.js'];\n",
" for (var i = 0; i < urls.length; i++) {\n",
" skip.push(urls[i])\n",
" }\n",
" } if (((window['Notyf'] !== undefined) && (!(window['Notyf'] instanceof HTMLElement))) || window.requirejs) {\n",
" var urls = ['https://cdn.holoviz.org/panel/1.0.4/dist/bundled/notificationarea/notyf@3/notyf.min.js'];\n",
" for (var i = 0; i < urls.length; i++) {\n",
" skip.push(urls[i])\n",
" }\n",
" } var existing_scripts = []\n",
" var scripts = document.getElementsByTagName('script')\n",
" for (var i = 0; i < scripts.length; i++) {\n",
" var script = scripts[i]\n",
" if (script.src != null) {\n",
"\texisting_scripts.push(script.src)\n",
" }\n",
" }\n",
" for (var i = 0; i < js_urls.length; i++) {\n",
" var url = js_urls[i];\n",
" if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n",
"\tif (!window.requirejs) {\n",
"\t on_load();\n",
"\t}\n",
"\tcontinue;\n",
" }\n",
" var element = document.createElement('script');\n",
" element.onload = on_load;\n",
" element.onerror = on_error;\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",
" for (var i = 0; i < js_modules.length; i++) {\n",
" var url = js_modules[i];\n",
" if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n",
"\tif (!window.requirejs) {\n",
"\t on_load();\n",
"\t}\n",
"\tcontinue;\n",
" }\n",
" var element = document.createElement('script');\n",
" element.onload = on_load;\n",
" element.onerror = on_error;\n",
" element.async = false;\n",
" element.src = url;\n",
" element.type = \"module\";\n",
" console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
" document.head.appendChild(element);\n",
" }\n",
" for (const name in js_exports) {\n",
" var url = js_exports[name];\n",
" if (skip.indexOf(url) >= 0 || root[name] != null) {\n",
"\tif (!window.requirejs) {\n",
"\t on_load();\n",
"\t}\n",
"\tcontinue;\n",
" }\n",
" var element = document.createElement('script');\n",
" element.onerror = on_error;\n",
" element.async = false;\n",
" element.type = \"module\";\n",
" console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
" element.textContent = `\n",
" import ${name} from \"${url}\"\n",
" window.${name} = ${name}\n",
" window._bokeh_on_load()\n",
" `\n",
" document.head.appendChild(element);\n",
" }\n",
" if (!js_urls.length && !js_modules.length) {\n",
" on_load()\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",
" var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.holoviz.org/panel/1.0.4/dist/panel.min.js\"];\n",
" var js_modules = [];\n",
" var js_exports = {};\n",
" var css_urls = [];\n",
" var inline_js = [ function(Bokeh) {\n",
" Bokeh.set_log_level(\"info\");\n",
" },\n",
"function(Bokeh) {} // ensure no trailing comma for IE\n",
" ];\n",
"\n",
" function run_inline_js() {\n",
" if ((root.Bokeh !== undefined) || (force === true)) {\n",
" for (var i = 0; i < inline_js.length; i++) {\n",
" inline_js[i].call(root, root.Bokeh);\n",
" }\n",
" // Cache old bokeh versions\n",
" if (Bokeh != undefined && !reloading) {\n",
"\tvar NewBokeh = root.Bokeh;\n",
"\tif (Bokeh.versions === undefined) {\n",
"\t Bokeh.versions = new Map();\n",
"\t}\n",
"\tif (NewBokeh.version !== Bokeh.version) {\n",
"\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n",
"\t}\n",
"\troot.Bokeh = Bokeh;\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",
" }\n",
" root._bokeh_is_initializing = false\n",
" }\n",
"\n",
" function load_or_wait() {\n",
" // Implement a backoff loop that tries to ensure we do not load multiple\n",
" // versions of Bokeh and its dependencies at the same time.\n",
" // In recent versions we use the root._bokeh_is_initializing flag\n",
" // to determine whether there is an ongoing attempt to initialize\n",
" // bokeh, however for backward compatibility we also try to ensure\n",
" // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n",
" // before older versions are fully initialized.\n",
" if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n",
" root._bokeh_is_initializing = false;\n",
" root._bokeh_onload_callbacks = undefined;\n",
" console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n",
" load_or_wait();\n",
" } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n",
" setTimeout(load_or_wait, 100);\n",
" } else {\n",
" Bokeh = root.Bokeh;\n",
" bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n",
" root._bokeh_is_initializing = true\n",
" root._bokeh_onload_callbacks = []\n",
" if (!reloading && (!bokeh_loaded || is_dev)) {\n",
"\troot.Bokeh = undefined;\n",
" }\n",
" load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n",
"\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n",
"\trun_inline_js();\n",
" });\n",
" }\n",
" }\n",
" // Give older versions of the autoload script a head-start to ensure\n",
" // they initialize before we start loading newer version.\n",
" setTimeout(load_or_wait, 100)\n",
"}(window));"
],
"application/vnd.holoviews_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n var py_version = '3.1.1'.replace('rc', '-rc.');\n var is_dev = py_version.indexOf(\"+\") !== -1 || py_version.indexOf(\"-\") !== -1;\n var reloading = false;\n var Bokeh = root.Bokeh;\n var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\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, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\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.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n run_callbacks();\n return null;\n }\n if (!reloading) {\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\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 window._bokeh_on_load = on_load\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n var skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {'jspanel': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/jspanel', 'jspanel-modal': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal', 'jspanel-tooltip': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip', 'jspanel-hint': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint', 'jspanel-layout': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout', 'jspanel-contextmenu': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu', 'jspanel-dock': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock', 'gridstack': 'https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all', 'notyf': 'https://cdn.jsdelivr.net/npm/notyf@3/notyf.min'}, 'shim': {'jspanel': {'exports': 'jsPanel'}, 'gridstack': {'exports': 'GridStack'}}});\n require([\"jspanel\"], function(jsPanel) {\n\twindow.jsPanel = jsPanel\n\ton_load()\n })\n require([\"jspanel-modal\"], function() {\n\ton_load()\n })\n require([\"jspanel-tooltip\"], function() {\n\ton_load()\n })\n require([\"jspanel-hint\"], function() {\n\ton_load()\n })\n require([\"jspanel-layout\"], function() {\n\ton_load()\n })\n require([\"jspanel-contextmenu\"], function() {\n\ton_load()\n })\n require([\"jspanel-dock\"], function() {\n\ton_load()\n })\n require([\"gridstack\"], function(GridStack) {\n\twindow.GridStack = GridStack\n\ton_load()\n })\n require([\"notyf\"], function() {\n\ton_load()\n })\n root._bokeh_is_loading = css_urls.length + 9;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n var existing_stylesheets = []\n var links = document.getElementsByTagName('link')\n for (var i = 0; i < links.length; i++) {\n var link = links[i]\n if (link.href != null) {\n\texisting_stylesheets.push(link.href)\n }\n }\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n if (existing_stylesheets.indexOf(url) !== -1) {\n\ton_load()\n\tcontinue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\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 } if (((window['jsPanel'] !== undefined) && (!(window['jsPanel'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.0.4/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.0.4/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.0.4/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.0.4/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.0.4/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.0.4/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.0.4/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['GridStack'] !== undefined) && (!(window['GridStack'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.0.4/dist/bundled/gridstack/gridstack@7.2.3/dist/gridstack-all.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['Notyf'] !== undefined) && (!(window['Notyf'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.0.4/dist/bundled/notificationarea/notyf@3/notyf.min.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } var existing_scripts = []\n var scripts = document.getElementsByTagName('script')\n for (var i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n\texisting_scripts.push(script.src)\n }\n }\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\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 for (var i = 0; i < js_modules.length; i++) {\n var url = js_modules[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n var url = js_exports[name];\n if (skip.indexOf(url) >= 0 || root[name] != null) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\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 var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.holoviz.org/panel/1.0.4/dist/panel.min.js\"];\n var js_modules = [];\n var js_exports = {};\n var css_urls = [];\n var inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n\tvar NewBokeh = root.Bokeh;\n\tif (Bokeh.versions === undefined) {\n\t Bokeh.versions = new Map();\n\t}\n\tif (NewBokeh.version !== Bokeh.version) {\n\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n\t}\n\troot.Bokeh = Bokeh;\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 }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n Bokeh = root.Bokeh;\n bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n if (!reloading && (!bokeh_loaded || is_dev)) {\n\troot.Bokeh = undefined;\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n\trun_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));"
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
"if ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n",
" window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n",
"}\n",
"\n",
"\n",
" function JupyterCommManager() {\n",
" }\n",
"\n",
" JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n",
" if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n",
" var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n",
" comm_manager.register_target(comm_id, function(comm) {\n",
" comm.on_msg(msg_handler);\n",
" });\n",
" } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n",
" window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n",
" comm.onMsg = msg_handler;\n",
" });\n",
" } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n",
" google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n",
" var messages = comm.messages[Symbol.asyncIterator]();\n",
" function processIteratorResult(result) {\n",
" var message = result.value;\n",
" console.log(message)\n",
" var content = {data: message.data, comm_id};\n",
" var buffers = []\n",
" for (var buffer of message.buffers || []) {\n",
" buffers.push(new DataView(buffer))\n",
" }\n",
" var metadata = message.metadata || {};\n",
" var msg = {content, buffers, metadata}\n",
" msg_handler(msg);\n",
" return messages.next().then(processIteratorResult);\n",
" }\n",
" return messages.next().then(processIteratorResult);\n",
" })\n",
" }\n",
" }\n",
"\n",
" JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n",
" if (comm_id in window.PyViz.comms) {\n",
" return window.PyViz.comms[comm_id];\n",
" } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n",
" var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n",
" var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n",
" if (msg_handler) {\n",
" comm.on_msg(msg_handler);\n",
" }\n",
" } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n",
" var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n",
" comm.open();\n",
" if (msg_handler) {\n",
" comm.onMsg = msg_handler;\n",
" }\n",
" } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n",
" var comm_promise = google.colab.kernel.comms.open(comm_id)\n",
" comm_promise.then((comm) => {\n",
" window.PyViz.comms[comm_id] = comm;\n",
" if (msg_handler) {\n",
" var messages = comm.messages[Symbol.asyncIterator]();\n",
" function processIteratorResult(result) {\n",
" var message = result.value;\n",
" var content = {data: message.data};\n",
" var metadata = message.metadata || {comm_id};\n",
" var msg = {content, metadata}\n",
" msg_handler(msg);\n",
" return messages.next().then(processIteratorResult);\n",
" }\n",
" return messages.next().then(processIteratorResult);\n",
" }\n",
" }) \n",
" var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n",
" return comm_promise.then((comm) => {\n",
" comm.send(data, metadata, buffers, disposeOnDone);\n",
" });\n",
" };\n",
" var comm = {\n",
" send: sendClosure\n",
" };\n",
" }\n",
" window.PyViz.comms[comm_id] = comm;\n",
" return comm;\n",
" }\n",
" window.PyViz.comm_manager = new JupyterCommManager();\n",
" \n",
"\n",
"\n",
"var JS_MIME_TYPE = 'application/javascript';\n",
"var HTML_MIME_TYPE = 'text/html';\n",
"var EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\n",
"var CLASS_NAME = 'output';\n",
"\n",
"/**\n",
" * Render data to the DOM node\n",
" */\n",
"function render(props, node) {\n",
" var div = document.createElement(\"div\");\n",
" var script = document.createElement(\"script\");\n",
" node.appendChild(div);\n",
" node.appendChild(script);\n",
"}\n",
"\n",
"/**\n",
" * Handle when a new output is added\n",
" */\n",
"function handle_add_output(event, handle) {\n",
" var output_area = handle.output_area;\n",
" var output = handle.output;\n",
" if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n",
" return\n",
" }\n",
" var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n",
" var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n",
" if (id !== undefined) {\n",
" var nchildren = toinsert.length;\n",
" var html_node = toinsert[nchildren-1].children[0];\n",
" html_node.innerHTML = output.data[HTML_MIME_TYPE];\n",
" var scripts = [];\n",
" var nodelist = html_node.querySelectorAll(\"script\");\n",
" for (var i in nodelist) {\n",
" if (nodelist.hasOwnProperty(i)) {\n",
" scripts.push(nodelist[i])\n",
" }\n",
" }\n",
"\n",
" scripts.forEach( function (oldScript) {\n",
" var newScript = document.createElement(\"script\");\n",
" var attrs = [];\n",
" var nodemap = oldScript.attributes;\n",
" for (var j in nodemap) {\n",
" if (nodemap.hasOwnProperty(j)) {\n",
" attrs.push(nodemap[j])\n",
" }\n",
" }\n",
" attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n",
" newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n",
" oldScript.parentNode.replaceChild(newScript, oldScript);\n",
" });\n",
" if (JS_MIME_TYPE in output.data) {\n",
" toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n",
" }\n",
" output_area._hv_plot_id = id;\n",
" if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n",
" window.PyViz.plot_index[id] = Bokeh.index[id];\n",
" } else {\n",
" window.PyViz.plot_index[id] = null;\n",
" }\n",
" } else 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].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\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",
"/**\n",
" * Handle when an output is cleared or removed\n",
" */\n",
"function handle_clear_output(event, handle) {\n",
" var id = handle.cell.output_area._hv_plot_id;\n",
" var server_id = handle.cell.output_area._bokeh_server_id;\n",
" if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n",
" var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n",
" if (server_id !== null) {\n",
" comm.send({event_type: 'server_delete', 'id': server_id});\n",
" return;\n",
" } else if (comm !== null) {\n",
" comm.send({event_type: 'delete', 'id': id});\n",
" }\n",
" delete PyViz.plot_index[id];\n",
" if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n",
" var doc = window.Bokeh.index[id].model.document\n",
" doc.clear();\n",
" const i = window.Bokeh.documents.indexOf(doc);\n",
" if (i > -1) {\n",
" window.Bokeh.documents.splice(i, 1);\n",
" }\n",
" }\n",
"}\n",
"\n",
"/**\n",
" * Handle kernel restart event\n",
" */\n",
"function handle_kernel_cleanup(event, handle) {\n",
" delete PyViz.comms[\"hv-extension-comm\"];\n",
" window.PyViz.plot_index = {}\n",
"}\n",
"\n",
"/**\n",
" * Handle update_display_data messages\n",
" */\n",
"function handle_update_output(event, handle) {\n",
" handle_clear_output(event, {cell: {output_area: handle.output_area}})\n",
" handle_add_output(event, handle)\n",
"}\n",
"\n",
"function register_renderer(events, OutputArea) {\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[0]);\n",
" element.append(toinsert);\n",
" return toinsert\n",
" }\n",
"\n",
" events.on('output_added.OutputArea', handle_add_output);\n",
" events.on('output_updated.OutputArea', handle_update_output);\n",
" events.on('clear_output.CodeCell', handle_clear_output);\n",
" events.on('delete.Cell', handle_clear_output);\n",
" events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n",
"\n",
" OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n",
" safe: true,\n",
" index: 0\n",
" });\n",
"}\n",
"\n",
"if (window.Jupyter !== undefined) {\n",
" try {\n",
" var events = require('base/js/events');\n",
" var OutputArea = require('notebook/js/outputarea').OutputArea;\n",
" if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n",
" register_renderer(events, OutputArea);\n",
" }\n",
" } catch(err) {\n",
" }\n",
"}\n"
],
"application/vnd.holoviews_load.v0+json": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n console.log(message)\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n comm.open();\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n }) \n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else 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].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\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/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\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[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n"
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<style>*[data-root-id],\n",
"*[data-root-id] > * {\n",
" box-sizing: border-box;\n",
" font-family: var(--jp-ui-font-family);\n",
" font-size: var(--jp-ui-font-size1);\n",
" color: var(--vscode-editor-foreground, var(--jp-ui-font-color1));\n",
"}\n",
"\n",
"/* Override VSCode background color */\n",
".cell-output-ipywidget-background:has(> .cell-output-ipywidget-background\n",
" > .lm-Widget\n",
" > *[data-root-id]),\n",
".cell-output-ipywidget-background:has(> .lm-Widget > *[data-root-id]) {\n",
" background-color: transparent !important;\n",
"}\n",
"</style>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import os\n",
"from glob import glob\n",
"\n",
"import xarray as xr\n",
"import pandas as pd\n",
"import numpy as np\n",
"from scipy.signal import lfilter\n",
"\n",
"#%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"import hvplot.pandas # noqa\n",
"from cmocean import cm\n",
"\n",
"import pynsitu as pin"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "c5fd677e-e3af-4cfa-b31c-77700b05e12f",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"text/plain": [
"['/Users/aponte/Current_Projects/ensta/guerledan_202310/data_seabot/export_data_2023_10_10_seabot1.txt',\n",
" '/Users/aponte/Current_Projects/ensta/guerledan_202310/data_seabot/export_data_2023_10_10_seabot2.txt',\n",
" '/Users/aponte/Current_Projects/ensta/guerledan_202310/data_seabot/export_data_2023_10_10_seabot3.txt',\n",
" '/Users/aponte/Current_Projects/ensta/guerledan_202310/data_seabot/export_data_2023_10_10_seabot4.txt',\n",
" '/Users/aponte/Current_Projects/ensta/guerledan_202310/data_seabot/export_data_2023_10_10_seabot5.txt',\n",
" '/Users/aponte/Current_Projects/ensta/guerledan_202310/data_seabot/export_data_2023_10_11_seabot2.txt',\n",
" '/Users/aponte/Current_Projects/ensta/guerledan_202310/data_seabot/export_data_2023_10_11_seabot4.txt',\n",
" '/Users/aponte/Current_Projects/ensta/guerledan_202310/data_seabot/export_data_2023_10_11_seabot5.txt',\n",
" '/Users/aponte/Current_Projects/ensta/guerledan_202310/data_seabot/export_data_2023_10_13_seabot1.txt',\n",
" '/Users/aponte/Current_Projects/ensta/guerledan_202310/data_seabot/export_data_2023_10_13_seabot2.txt',\n",
" '/Users/aponte/Current_Projects/ensta/guerledan_202310/data_seabot/export_data_2023_10_13_seabot4.txt',\n",
" '/Users/aponte/Current_Projects/ensta/guerledan_202310/data_seabot/export_data_2023_10_13_seabot5.txt']"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"root_path = \"/Users/aponte/Current_Projects/ensta/guerledan_202310/data_seabot\"\n",
"\n",
"data_files = sorted(glob(os.path.join(root_path, \"*.txt\")))\n",
"data_files"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "3b3491a1-012f-46a8-a38f-e1e85a23a393",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"def load_txt(file):\n",
" columns = [\n",
" \"time_posix\", \n",
" \"depth_raw\", \"velocity_raw\", \n",
" \"depth\", \"velocity\", \"temperature\", \"altitude\",\n",
" ]\n",
" df = pd.DataFrame(np.loadtxt(file).T, columns=columns)\n",
" df[\"time\"] = pd.to_datetime(df[\"time_posix\"], unit=\"s\")\n",
" df = df.set_index(\"time\")\n",
" df = df.resample(\"1s\").mean()\n",
" append_depth_filtered(df, 2.)\n",
" dt = (df.reset_index()[\"time\"].diff().bfill() / pd.Timedelta(\"1s\")).values\n",
" df[\"velocity_filtered\"] = df[\"depth_filtered\"].diff().bfill().values / dt\n",
" return df\n",
"\n",
"def append_depth_filtered(df, tau):\n",
" \"\"\" filter pressure, inplace \"\"\"\n",
" #dt, tau = 1, 2.5\n",
" dt = 1\n",
" alpha = dt/2/tau\n",
" b, a = [alpha], [1, -(1-alpha)]\n",
" df[\"depth_filtered\"] = lfilter(b, a, df.depth.bfill())\n",
"\n",
"# follows Thomas implementation\n",
"#a[0]*y[n] = b[0]*x[n] + b[1]*x[n-1] + ... + b[M]*x[n-M]\n",
"# - a[1]*y[n-1] - ... - a[N]*y[n-N]\n",
"\n",
"# T_(n+1) = T_(n) * (1-alpha) + mesure*(alpha)\n",
"# alpha = 0.04\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "36752bd2-8e00-4f7f-9a46-29baa8b2b067",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"DF = [load_txt(f) for f in data_files] "
]
},
{
"cell_type": "markdown",
"id": "ce8377b5-34f0-4ffd-99b2-345b47b7430a",
"metadata": {},
"source": [
"\n",
"### overview of all dives"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "f416b5e4-9fe1-4c2a-a296-a3bb76d8018f",
"metadata": {
"tags": []
},
"outputs": [],
"source": [
"colors = pin.get_cmap_colors(len(DF))\n",
"\n",
"def get_hv_plot(D, v, revert_yaxis=False):\n",
" \n",
" p = None\n",
" for df, c in zip(D, colors):\n",
" if p is None:\n",
" p = df[v].hvplot(color=c, grid=True)\n",
" else:\n",
" p = p * df[v].hvplot(color=c)\n",
" \n",
" if revert_yaxis:\n",
" p = p.opts(invert_yaxis=True)\n",
" \n",
" return p"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "22b27efa-2ede-4801-b084-d96428036702",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABMUAAAFfCAYAAABOa3vjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB/P0lEQVR4nO3dd3xb1d0/8M+5V9t7O07i7EmAkISRsBIgEMIqpZRVRguhlNKWUkqh9MdqA22h5elDW0ZLSdcDhVJaRhhhQwkQQgIkISHbiR3HjvfSuvf8/pAtS7ZkyY7GvdLn/XqBI+nq6kj3nvW955wrpJQSREREREREREREWURJdwKIiIiIiIiIiIhSjUExIiIiIiIiIiLKOgyKERERERERERFR1mFQjIiIiIiIiIiIsg6DYkRERERERERElHUYFCMiIiIiIiIioqzDoBgREREREREREWUdS7oTcLBycnLgdruhqirKy8vTnRwiIiIiIiIiIkqjhoYGaJoGh8OBrq6uqNsJKaVMYboSTlVV6Lqe7mQQEREREREREZGBKIoCTdOivm76kWJ9QTFFUTBq1Kh0J4dGwO12w+FwpDsZRIbGfEIUG/MJUWzMJ0SxMZ8QxWb0fLJv3z7oug5VVYfczvRBsfLyctTW1mLUqFHYu3dvupNDw+Tz+bBy5UosXboUVqs13ckhMiTmE6LYmE+IYmM+IYqN+YQoNjPkkzFjxqC2tjbmMltcaJ+IiIiIiIiIiLIOg2JERERERERERJR1GBQjIiIiIiIiIqKsw6AYERERERERERFlHQbFiIiIiIiIiIgo6zAoRkREREREREREWYdBMSIiIiIiIiIiyjoMihERERERERERUdZhUIyIiIiIiIiIiLIOg2JERERERERERJR1GBQjIiJT2/fqF1h/60pobl+6k0JERERERCbCoBgREZnauhufQ90Ln2PnX9emOylEREQpJ3090L5YBen3pDspRESmY4ig2O9//3tMmDABDocDc+fOxTvvvJPuJBERDSKlRMPDj6LmezdC6+hId3JogJ79PCZERJR9tA/+BP+rd8P/9m/SnRQiItNJe1DsH//4B66//nrceuutWLduHY4//nicfvrpqKmpSXfSiOgg6LqOV3+/FZ+/1ZDupCSMv7ERXas/gNbWjprv/CDdyaEBpKanOwlEREQpp+0IDCjQ96xJc0qI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mB9tLTgRKDgRUndD9qyDcM2DEOY+xzIhnww7KFZaWorS0tK4tq2trcWiRYswd+5cPPbYY1AUJez1+fPnY/ny5di3bx9GjQrcMvWVV16B3W7H3LlzI+2SiIiIiIiIiExECAHECoilkBAConh84N/FV0B2rII6/nHA3ww4ZkKJMnMNAJTiS6Dvuw0iZwHUUbcBAKR/H4SSA+E6CrL7Q+iN/xv9sxUHRM78hH4fGrmkrSlWV1eHhQsXorq6Gvfddx8aGxuDr1VWVgIATj31VMycOROXXnop7r33XjQ3N+PGG2/EsmXLeOdJIiIiIiIiIkoqtfJWyIofBwJ31lExtxeFF0J1HArYp/Tvo+Lm/tdzjob0H4Bs+T9AyQf09qSkmxIjaUGxV155Bdu2bcO2bdswZsyYsNf67hipqipeeOEFXHvttTj22GPhdDpx8cUX47777ktWsoiIiIiIiIiIgqKtaR51W+fQ0zyVytuAoosAANqOswAoQ25P6ZO0oNgVV1yBK664IuZ21dXVeP7555OVDCIiIiIiIiKilBFCBRzTAQDqxOcBS1maU0TRJC0oRkRERERERESUzYRjWrqTQEPgGD4iIiIiIiIiIso6DIoREREREREREVHWYVCMiIiIiIiIiIiyDoNiRERERERERESUdRgUIyIiIiIiIiKirMOgGBERERERERERZR0GxYiIiIiIiIiIKOswKEZERERERERERFmHQTEiIiIiIiIiIso6DIoREREREREREVHWEVJKme5EHAybzQafzwdFUTBq1Kh0J4dGwO12w+FwpDsZRIbGfEIUG/MJUWzMJ0SxMZ8QxWb0fLJv3z7oug6r1Qqv1xt1O9MHxVRVha7r6U4GEREREREREREZiKIo0DQt6uuWFKYlKRwOB9xuN1RVRXl5ebqTQ8MkpURdXR2qqqoghEh3cogMifmEKDbmE6LYmE+IYmM+IYrNDPmkoaEBmqbFHM1m+pFiZG7t7e0oKChAW1sb8vPz050cIkNiPiGKjfmEKDbmE6LYmE+IYsukfMKF9omIiIiIiIiIKOswKEZERERERERERFmHQTFKK7vdjttvvx12uz3dSSEyLOYTotiYT4hiYz4hio35hCi2TMonXFOMiIiIiIiIiIiyDkeKERERERERERFR1mFQjIiIiIiIiIiIsg6DYkRERERERERElHUYFCMiIiIi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",
"text/plain": [
"<Figure size 1500x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(1,1, figsize=(15,4))\n",
"for df, c in zip(DF, colors):\n",
" ax.plot(df.index, -df.depth, color=c)\n",
"ax.grid()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "baa2e38f-0e67-4e3b-a390-2d65e26a5a80",
"metadata": {
"tags": []
},
"outputs": [
{
"data": {},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.holoviews_exec.v0+json": "",
"text/html": [
"<div id='p1003'>\n",
" <div id=\"b854873a-9218-45dc-bd7b-8f7078c7938a\" data-root-id=\"p1003\" style=\"display: contents;\"></div>\n",
"</div>\n",
"<script type=\"application/javascript\">(function(root) {\n",
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment