-
-
Save zaleslaw/8b7bf432d9b449d6a8654b4211d3c416 to your computer and use it in GitHub Desktop.
Demo Notebook for blogpost in Kotlin Blog (SelectionDSL changes for KotlinDataFrame)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"collapsed": true, | |
"ExecuteTime": { | |
"end_time": "2024-06-26T15:35:42.090386Z", | |
"start_time": "2024-06-26T15:35:41.319844Z" | |
} | |
}, | |
"source": [ | |
"%useLatestDescriptors\n", | |
"%use dataframe\n" | |
], | |
"outputs": [], | |
"execution_count": 5 | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2024-06-26T15:36:07.905531Z", | |
"start_time": "2024-06-26T15:36:07.201702Z" | |
} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"val rawUserData = DataFrame.read(\"https://dummyjson.com/users\")\n", | |
" .getFrameColumn(\"users\")\n", | |
" .first()\n", | |
"\n", | |
"\n", | |
"rawUserData.select { cols(0..2) }.head(3)" | |
], | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
" <iframe onload=\"o_resize_iframe_out_6()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_6\" frameBorder=\"0\" srcdoc=\" <html>\n", | |
" <head>\n", | |
" <style type="text/css">\n", | |
" :root {\n", | |
" --background: #fff;\n", | |
" --background-odd: #f5f5f5;\n", | |
" --background-hover: #d9edfd;\n", | |
" --header-text-color: #474747;\n", | |
" --text-color: #848484;\n", | |
" --text-color-dark: #000;\n", | |
" --text-color-medium: #737373;\n", | |
" --text-color-pale: #b3b3b3;\n", | |
" --inner-border-color: #aaa;\n", | |
" --bold-border-color: #000;\n", | |
" --link-color: #296eaa;\n", | |
" --link-color-pale: #296eaa;\n", | |
" --link-hover: #1a466c;\n", | |
"}\n", | |
"\n", | |
":root[theme="dark"], :root [data-jp-theme-light="false"], .dataframe_dark{\n", | |
" --background: #303030;\n", | |
" --background-odd: #3c3c3c;\n", | |
" --background-hover: #464646;\n", | |
" --header-text-color: #dddddd;\n", | |
" --text-color: #b3b3b3;\n", | |
" --text-color-dark: #dddddd;\n", | |
" --text-color-medium: #b2b2b2;\n", | |
" --text-color-pale: #737373;\n", | |
" --inner-border-color: #707070;\n", | |
" --bold-border-color: #777777;\n", | |
" --link-color: #008dc0;\n", | |
" --link-color-pale: #97e1fb;\n", | |
" --link-hover: #00688e;\n", | |
"}\n", | |
"\n", | |
"p.dataframe_description {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe {\n", | |
" font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;\n", | |
" font-size: 12px;\n", | |
" background-color: var(--background);\n", | |
" color: var(--text-color-dark);\n", | |
" border: none;\n", | |
" border-collapse: collapse;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th, td {\n", | |
" padding: 6px;\n", | |
" border: 1px solid transparent;\n", | |
" text-align: left;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th {\n", | |
" background-color: var(--background);\n", | |
" color: var(--header-text-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td {\n", | |
" vertical-align: top;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.bottomBorder {\n", | |
" border-bottom-color: var(--bold-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(odd) {\n", | |
" background: var(--background-odd);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(even) {\n", | |
" background: var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:hover {\n", | |
" background: var(--background-hover);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a {\n", | |
" cursor: pointer;\n", | |
" color: var(--link-color);\n", | |
" text-decoration: none;\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover > td a {\n", | |
" color: var(--link-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a:hover {\n", | |
" color: var(--link-hover);\n", | |
" text-decoration: underline;\n", | |
"}\n", | |
"\n", | |
"table.dataframe img {\n", | |
" max-width: fit-content;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.complex {\n", | |
" background-color: var(--background);\n", | |
" border: 1px solid var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .leftBorder {\n", | |
" border-left-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightBorder {\n", | |
" border-right-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightAlign {\n", | |
" text-align: right;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expanderSvg {\n", | |
" width: 8px;\n", | |
" height: 8px;\n", | |
" margin-right: 3px;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expander {\n", | |
" display: flex;\n", | |
" align-items: center;\n", | |
"}\n", | |
"\n", | |
"/* formatting */\n", | |
"\n", | |
"table.dataframe .null {\n", | |
" color: var(--text-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .structural {\n", | |
" color: var(--text-color-medium);\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .dataFrameCaption {\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .numbers {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"\n", | |
":root {\n", | |
" --scroll-bg: #f5f5f5;\n", | |
" --scroll-fg: #b3b3b3;\n", | |
"}\n", | |
":root[theme="dark"], :root [data-jp-theme-light="false"]{\n", | |
" --scroll-bg: #3c3c3c;\n", | |
" --scroll-fg: #97e1fb;\n", | |
"}\n", | |
"body {\n", | |
" scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n", | |
"}\n", | |
"body::-webkit-scrollbar {\n", | |
" width: 10px; /* Mostly for vertical scrollbars */\n", | |
" height: 10px; /* Mostly for horizontal scrollbars */\n", | |
"}\n", | |
"body::-webkit-scrollbar-thumb {\n", | |
" background-color: var(--scroll-fg);\n", | |
"}\n", | |
"body::-webkit-scrollbar-track {\n", | |
" background-color: var(--scroll-bg);\n", | |
"}\n", | |
" </style>\n", | |
" </head>\n", | |
" <body>\n", | |
" <table class="dataframe" id="df_-285212662"></table>\n", | |
"\n", | |
"<p class="dataframe_description">DataFrame: rowsCount = 3, columnsCount = 3</p>\n", | |
"\n", | |
" </body>\n", | |
" <script>\n", | |
" (function () {\n", | |
" window.DataFrame = window.DataFrame || new (function () {\n", | |
" this.addTable = function (df) {\n", | |
" let cols = df.cols;\n", | |
" for (let i = 0; i < cols.length; i++) {\n", | |
" for (let c of cols[i].children) {\n", | |
" cols[c].parent = i;\n", | |
" }\n", | |
" }\n", | |
" df.nrow = 0\n", | |
" for (let i = 0; i < df.cols.length; i++) {\n", | |
" if (df.cols[i].values.length > df.nrow) df.nrow = df.cols[i].values.length\n", | |
" }\n", | |
" if (df.id === df.rootId) {\n", | |
" df.expandedFrames = new Set()\n", | |
" df.childFrames = {}\n", | |
" const table = this.getTableElement(df.id)\n", | |
" table.df = df\n", | |
" for (let i = 0; i < df.cols.length; i++) {\n", | |
" let col = df.cols[i]\n", | |
" if (col.parent === undefined && col.children.length > 0) col.expanded = true\n", | |
" }\n", | |
" } else {\n", | |
" const rootDf = this.getTableData(df.rootId)\n", | |
" rootDf.childFrames[df.id] = df\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.computeRenderData = function (df) {\n", | |
" let result = []\n", | |
" let pos = 0\n", | |
" for (let col = 0; col < df.cols.length; col++) {\n", | |
" if (df.cols[col].parent === undefined)\n", | |
" pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n", | |
" }\n", | |
" for (let i = 0; i < result.length; i++) {\n", | |
" let row = result[i]\n", | |
" for (let j = 0; j < row.length; j++) {\n", | |
" let cell = row[j]\n", | |
" if (j === 0)\n", | |
" cell.leftBd = false\n", | |
" if (j < row.length - 1) {\n", | |
" let nextData = row[j + 1]\n", | |
" if (nextData.leftBd) cell.rightBd = true\n", | |
" else if (cell.rightBd) nextData.leftBd = true\n", | |
" } else cell.rightBd = false\n", | |
" }\n", | |
" }\n", | |
" return result\n", | |
" }\n", | |
"\n", | |
" this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n", | |
" if (result.length === depth) {\n", | |
" const array = [];\n", | |
" if (pos > 0) {\n", | |
" let j = 0\n", | |
" for (let i = 0; j < pos; i++) {\n", | |
" let c = result[depth - 1][i]\n", | |
" j += c.span\n", | |
" let copy = Object.assign({empty: true}, c)\n", | |
" array.push(copy)\n", | |
" }\n", | |
" }\n", | |
" result.push(array)\n", | |
" }\n", | |
" const col = cols[colId];\n", | |
" let size = 0;\n", | |
" if (col.expanded) {\n", | |
" let childPos = pos\n", | |
" for (let i = 0; i < col.children.length; i++) {\n", | |
" let child = col.children[i]\n", | |
" let childLeft = i === 0 && (col.children.length > 1 || leftBorder)\n", | |
" let childRight = i === col.children.length - 1 && (col.children.length > 1 || rightBorder)\n", | |
" let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n", | |
" childPos += childSize\n", | |
" size += childSize\n", | |
" }\n", | |
" } else {\n", | |
" for (let i = depth + 1; i < result.length; i++)\n", | |
" result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n", | |
" size = 1\n", | |
" }\n", | |
" let left = leftBorder\n", | |
" let right = rightBorder\n", | |
" if (size > 1) {\n", | |
" left = true\n", | |
" right = true\n", | |
" }\n", | |
" result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n", | |
" return size\n", | |
" }\n", | |
"\n", | |
" this.getTableElement = function (id) {\n", | |
" return document.getElementById("df_" + id)\n", | |
" }\n", | |
"\n", | |
" this.getTableData = function (id) {\n", | |
" return this.getTableElement(id).df\n", | |
" }\n", | |
"\n", | |
" this.createExpander = function (isExpanded) {\n", | |
" const svgNs = "http://www.w3.org/2000/svg"\n", | |
" let svg = document.createElementNS(svgNs, "svg")\n", | |
" svg.classList.add("expanderSvg")\n", | |
" let path = document.createElementNS(svgNs, "path")\n", | |
" if (isExpanded) {\n", | |
" svg.setAttribute("viewBox", "0 -2 8 8")\n", | |
" path.setAttribute("d", "M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z")\n", | |
" } else {\n", | |
" svg.setAttribute("viewBox", "-2 0 8 8")\n", | |
" path.setAttribute("d", "M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z")\n", | |
" }\n", | |
" path.setAttribute("fill", "currentColor")\n", | |
" svg.appendChild(path)\n", | |
" return svg\n", | |
" }\n", | |
"\n", | |
" this.renderTable = function (id) {\n", | |
"\n", | |
" let table = this.getTableElement(id)\n", | |
"\n", | |
" if (table === null) return\n", | |
"\n", | |
" table.innerHTML = ""\n", | |
"\n", | |
" let df = table.df\n", | |
" let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n", | |
"\n", | |
" // header\n", | |
" let header = document.createElement("thead")\n", | |
" table.appendChild(header)\n", | |
"\n", | |
" let renderData = this.computeRenderData(df)\n", | |
" for (let j = 0; j < renderData.length; j++) {\n", | |
" let rowData = renderData[j]\n", | |
" let tr = document.createElement("tr");\n", | |
" let isLastRow = j === renderData.length - 1\n", | |
" header.appendChild(tr);\n", | |
" for (let i = 0; i < rowData.length; i++) {\n", | |
" let cell = rowData[i]\n", | |
" let th = document.createElement("th");\n", | |
" th.setAttribute("colspan", cell.span)\n", | |
" let colId = cell.id\n", | |
" let col = df.cols[colId];\n", | |
" if (!cell.empty) {\n", | |
" if (col.children.length === 0) {\n", | |
" th.innerHTML = col.name\n", | |
" } else {\n", | |
" let link = document.createElement("a")\n", | |
" link.className = "expander"\n", | |
" let that = this\n", | |
" link.onclick = function () {\n", | |
" col.expanded = !col.expanded\n", | |
" that.renderTable(id)\n", | |
" }\n", | |
" link.appendChild(this.createExpander(col.expanded))\n", | |
" link.innerHTML += col.name\n", | |
" th.appendChild(link)\n", | |
" }\n", | |
" }\n", | |
" let classes = (cell.leftBd ? " leftBorder" : "") + (cell.rightBd ? " rightBorder" : "")\n", | |
" if (col.rightAlign)\n", | |
" classes += " rightAlign"\n", | |
" if (isLastRow)\n", | |
" classes += " bottomBorder"\n", | |
" if (classes.length > 0)\n", | |
" th.setAttribute("class", classes)\n", | |
" tr.appendChild(th)\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" // body\n", | |
" let body = document.createElement("tbody")\n", | |
" table.appendChild(body)\n", | |
"\n", | |
" let columns = renderData.pop()\n", | |
" for (let row = 0; row < df.nrow; row++) {\n", | |
" let tr = document.createElement("tr");\n", | |
" body.appendChild(tr)\n", | |
" for (let i = 0; i < columns.length; i++) {\n", | |
" let cell = columns[i]\n", | |
" let td = document.createElement("td");\n", | |
" let colId = cell.id\n", | |
" let col = df.cols[colId]\n", | |
" let classes = (cell.leftBd ? " leftBorder" : "") + (cell.rightBd ? " rightBorder" : "")\n", | |
" if (col.rightAlign)\n", | |
" classes += " rightAlign"\n", | |
" if (classes.length > 0)\n", | |
" td.setAttribute("class", classes)\n", | |
" tr.appendChild(td)\n", | |
" let value = col.values[row]\n", | |
" if (value.frameId !== undefined) {\n", | |
" let frameId = value.frameId\n", | |
" let expanded = rootDf.expandedFrames.has(frameId)\n", | |
" let link = document.createElement("a")\n", | |
" link.className = "expander"\n", | |
" let that = this\n", | |
" link.onclick = function () {\n", | |
" if (rootDf.expandedFrames.has(frameId))\n", | |
" rootDf.expandedFrames.delete(frameId)\n", | |
" else rootDf.expandedFrames.add(frameId)\n", | |
" that.renderTable(id)\n", | |
" }\n", | |
" link.appendChild(this.createExpander(expanded))\n", | |
" link.innerHTML += value.value\n", | |
" if (expanded) {\n", | |
" td.appendChild(link)\n", | |
" td.appendChild(document.createElement("p"))\n", | |
" const childTable = document.createElement("table")\n", | |
" childTable.className = "dataframe"\n", | |
" childTable.id = "df_" + frameId\n", | |
" let childDf = rootDf.childFrames[frameId]\n", | |
" childTable.df = childDf\n", | |
" td.appendChild(childTable)\n", | |
" this.renderTable(frameId)\n", | |
" if (childDf.nrow !== childDf.totalRows) {\n", | |
" const footer = document.createElement("p")\n", | |
" footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n", | |
" td.appendChild(footer)\n", | |
" }\n", | |
" } else {\n", | |
" td.appendChild(link)\n", | |
" }\n", | |
" } else if (value.style !== undefined) {\n", | |
" td.innerHTML = value.value\n", | |
" td.setAttribute("style", value.style)\n", | |
" } else td.innerHTML = value\n", | |
" this.nodeScriptReplace(td)\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.nodeScriptReplace = function (node) {\n", | |
" if (this.nodeScriptIs(node) === true) {\n", | |
" node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n", | |
" } else {\n", | |
" let i = -1, children = node.childNodes;\n", | |
" while (++i < children.length) {\n", | |
" this.nodeScriptReplace(children[i]);\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" return node;\n", | |
" }\n", | |
"\n", | |
" this.nodeScriptClone = function (node) {\n", | |
" let script = document.createElement("script");\n", | |
" script.text = node.innerHTML;\n", | |
"\n", | |
" let i = -1, attrs = node.attributes, attr;\n", | |
" while (++i < attrs.length) {\n", | |
" script.setAttribute((attr = attrs[i]).name, attr.value);\n", | |
" }\n", | |
" return script;\n", | |
" }\n", | |
"\n", | |
" this.nodeScriptIs = function (node) {\n", | |
" return node.tagName === 'SCRIPT';\n", | |
" }\n", | |
" })()\n", | |
"\n", | |
" window.call_DataFrame = function (f) {\n", | |
" return f();\n", | |
" };\n", | |
"\n", | |
" let funQueue = window["kotlinQueues"] && window["kotlinQueues"]["DataFrame"];\n", | |
" if (funQueue) {\n", | |
" funQueue.forEach(function (f) {\n", | |
" f();\n", | |
" });\n", | |
" funQueue = [];\n", | |
" }\n", | |
"})()\n", | |
"\n", | |
"/*<!--*/\n", | |
"call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: "<span title=\"id: Int\">id</span>", children: [], rightAlign: true, values: ["<span class=\"formatted\" title=\"\"><span class=\"numbers\">1</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">2</span></span>","<span class=\"formatted\" title=\"\"><span class=\"numbers\">3</span></span>"] }, \n", | |
"{ name: "<span title=\"firstName: String\">firstName</span>", children: [], rightAlign: false, values: ["Emily","Michael","Sophia"] }, \n", | |
"{ name: "<span title=\"lastName: String\">lastName</span>", children: [], rightAlign: false, values: ["Johnson","Williams","Brown"] }, \n", | |
"], id: -285212662, rootId: -285212662, totalRows: 3 } ) });\n", | |
"/*-->*/\n", | |
"\n", | |
"call_DataFrame(function() { DataFrame.renderTable(-285212662) });\n", | |
"\n", | |
"\n", | |
" </script>\n", | |
" </html>\"></iframe>\n", | |
" <script>\n", | |
" function o_resize_iframe_out_6() {\n", | |
" let elem = document.getElementById(\"iframe_out_6\");\n", | |
" resize_iframe_out_6(elem);\n", | |
" setInterval(resize_iframe_out_6, 5000, elem);\n", | |
" }\n", | |
" function resize_iframe_out_6(el) {\n", | |
" let h = el.contentWindow.document.body.scrollHeight;\n", | |
" el.height = h === 0 ? 0 : h + 41;\n", | |
" }\n", | |
" </script> <html>\n", | |
" <head>\n", | |
" <style type=\"text/css\">\n", | |
" :root {\n", | |
" --background: #fff;\n", | |
" --background-odd: #f5f5f5;\n", | |
" --background-hover: #d9edfd;\n", | |
" --header-text-color: #474747;\n", | |
" --text-color: #848484;\n", | |
" --text-color-dark: #000;\n", | |
" --text-color-medium: #737373;\n", | |
" --text-color-pale: #b3b3b3;\n", | |
" --inner-border-color: #aaa;\n", | |
" --bold-border-color: #000;\n", | |
" --link-color: #296eaa;\n", | |
" --link-color-pale: #296eaa;\n", | |
" --link-hover: #1a466c;\n", | |
"}\n", | |
"\n", | |
":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n", | |
" --background: #303030;\n", | |
" --background-odd: #3c3c3c;\n", | |
" --background-hover: #464646;\n", | |
" --header-text-color: #dddddd;\n", | |
" --text-color: #b3b3b3;\n", | |
" --text-color-dark: #dddddd;\n", | |
" --text-color-medium: #b2b2b2;\n", | |
" --text-color-pale: #737373;\n", | |
" --inner-border-color: #707070;\n", | |
" --bold-border-color: #777777;\n", | |
" --link-color: #008dc0;\n", | |
" --link-color-pale: #97e1fb;\n", | |
" --link-hover: #00688e;\n", | |
"}\n", | |
"\n", | |
"p.dataframe_description {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe {\n", | |
" font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n", | |
" font-size: 12px;\n", | |
" background-color: var(--background);\n", | |
" color: var(--text-color-dark);\n", | |
" border: none;\n", | |
" border-collapse: collapse;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th, td {\n", | |
" padding: 6px;\n", | |
" border: 1px solid transparent;\n", | |
" text-align: left;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th {\n", | |
" background-color: var(--background);\n", | |
" color: var(--header-text-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td {\n", | |
" vertical-align: top;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.bottomBorder {\n", | |
" border-bottom-color: var(--bold-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(odd) {\n", | |
" background: var(--background-odd);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(even) {\n", | |
" background: var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:hover {\n", | |
" background: var(--background-hover);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a {\n", | |
" cursor: pointer;\n", | |
" color: var(--link-color);\n", | |
" text-decoration: none;\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover > td a {\n", | |
" color: var(--link-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a:hover {\n", | |
" color: var(--link-hover);\n", | |
" text-decoration: underline;\n", | |
"}\n", | |
"\n", | |
"table.dataframe img {\n", | |
" max-width: fit-content;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.complex {\n", | |
" background-color: var(--background);\n", | |
" border: 1px solid var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .leftBorder {\n", | |
" border-left-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightBorder {\n", | |
" border-right-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightAlign {\n", | |
" text-align: right;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expanderSvg {\n", | |
" width: 8px;\n", | |
" height: 8px;\n", | |
" margin-right: 3px;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expander {\n", | |
" display: flex;\n", | |
" align-items: center;\n", | |
"}\n", | |
"\n", | |
"/* formatting */\n", | |
"\n", | |
"table.dataframe .null {\n", | |
" color: var(--text-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .structural {\n", | |
" color: var(--text-color-medium);\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .dataFrameCaption {\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .numbers {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"\n", | |
" </style>\n", | |
" </head>\n", | |
" <body>\n", | |
" <table class=\"dataframe\" id=\"static_df_-285212661\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">id</th><th class=\"bottomBorder\" style=\"text-align:left\">firstName</th><th class=\"bottomBorder\" style=\"text-align:left\">lastName</th></tr></thead><tbody><tr><td style=\"vertical-align:top\">1</td><td style=\"vertical-align:top\">Emily</td><td style=\"vertical-align:top\">Johnson</td></tr><tr><td style=\"vertical-align:top\">2</td><td style=\"vertical-align:top\">Michael</td><td style=\"vertical-align:top\">Williams</td></tr><tr><td style=\"vertical-align:top\">3</td><td style=\"vertical-align:top\">Sophia</td><td style=\"vertical-align:top\">Brown</td></tr></tbody></table>\n", | |
" </body>\n", | |
" <script>\n", | |
" document.getElementById(\"static_df_-285212661\").style.display = \"none\";\n", | |
" </script>\n", | |
" </html>" | |
], | |
"application/kotlindataframe+json": "{\"$version\":\"2.0.0\",\"metadata\":{\"columns\":[\"id\",\"firstName\",\"lastName\"],\"nrow\":3,\"ncol\":3},\"kotlin_dataframe\":[{\"id\":1,\"firstName\":\"Emily\",\"lastName\":\"Johnson\"},{\"id\":2,\"firstName\":\"Michael\",\"lastName\":\"Williams\"},{\"id\":3,\"firstName\":\"Sophia\",\"lastName\":\"Brown\"}]}" | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"execution_count": 7 | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2024-06-26T15:41:18.074459Z", | |
"start_time": "2024-06-26T15:41:17.720151Z" | |
} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"data class Person(val firstName: String)\n", | |
"\n", | |
"\n", | |
"rawUserData.tail().forEach {\n", | |
" val name1 = firstName // Extension properties\n", | |
" val name2 = \"firstName\"<String>() // String API\n", | |
" val firstName by column<String>() // Column Accessors API\n", | |
" val nameRef = Person::firstName // KProperties API\n", | |
"\n", | |
" println(\"$name1 $name2 ${firstName()} ${this[nameRef]}\")\n", | |
"}" | |
], | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Evelyn Evelyn Evelyn Evelyn\n", | |
"Daniel Daniel Daniel Daniel\n", | |
"Lily Lily Lily Lily\n", | |
"Henry Henry Henry Henry\n", | |
"Addison Addison Addison Addison\n" | |
] | |
} | |
], | |
"execution_count": 13 | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2024-06-26T15:37:45.781617Z", | |
"start_time": "2024-06-26T15:37:45.659542Z" | |
} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"rawUserData.select {\n", | |
" firstName and address.cols(\"city\", \"state\")\n", | |
"}.tail()" | |
], | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
" <iframe onload=\"o_resize_iframe_out_8()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_8\" frameBorder=\"0\" srcdoc=\" <html>\n", | |
" <head>\n", | |
" <style type="text/css">\n", | |
" :root {\n", | |
" --background: #fff;\n", | |
" --background-odd: #f5f5f5;\n", | |
" --background-hover: #d9edfd;\n", | |
" --header-text-color: #474747;\n", | |
" --text-color: #848484;\n", | |
" --text-color-dark: #000;\n", | |
" --text-color-medium: #737373;\n", | |
" --text-color-pale: #b3b3b3;\n", | |
" --inner-border-color: #aaa;\n", | |
" --bold-border-color: #000;\n", | |
" --link-color: #296eaa;\n", | |
" --link-color-pale: #296eaa;\n", | |
" --link-hover: #1a466c;\n", | |
"}\n", | |
"\n", | |
":root[theme="dark"], :root [data-jp-theme-light="false"], .dataframe_dark{\n", | |
" --background: #303030;\n", | |
" --background-odd: #3c3c3c;\n", | |
" --background-hover: #464646;\n", | |
" --header-text-color: #dddddd;\n", | |
" --text-color: #b3b3b3;\n", | |
" --text-color-dark: #dddddd;\n", | |
" --text-color-medium: #b2b2b2;\n", | |
" --text-color-pale: #737373;\n", | |
" --inner-border-color: #707070;\n", | |
" --bold-border-color: #777777;\n", | |
" --link-color: #008dc0;\n", | |
" --link-color-pale: #97e1fb;\n", | |
" --link-hover: #00688e;\n", | |
"}\n", | |
"\n", | |
"p.dataframe_description {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe {\n", | |
" font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;\n", | |
" font-size: 12px;\n", | |
" background-color: var(--background);\n", | |
" color: var(--text-color-dark);\n", | |
" border: none;\n", | |
" border-collapse: collapse;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th, td {\n", | |
" padding: 6px;\n", | |
" border: 1px solid transparent;\n", | |
" text-align: left;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th {\n", | |
" background-color: var(--background);\n", | |
" color: var(--header-text-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td {\n", | |
" vertical-align: top;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.bottomBorder {\n", | |
" border-bottom-color: var(--bold-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(odd) {\n", | |
" background: var(--background-odd);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(even) {\n", | |
" background: var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:hover {\n", | |
" background: var(--background-hover);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a {\n", | |
" cursor: pointer;\n", | |
" color: var(--link-color);\n", | |
" text-decoration: none;\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover > td a {\n", | |
" color: var(--link-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a:hover {\n", | |
" color: var(--link-hover);\n", | |
" text-decoration: underline;\n", | |
"}\n", | |
"\n", | |
"table.dataframe img {\n", | |
" max-width: fit-content;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.complex {\n", | |
" background-color: var(--background);\n", | |
" border: 1px solid var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .leftBorder {\n", | |
" border-left-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightBorder {\n", | |
" border-right-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightAlign {\n", | |
" text-align: right;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expanderSvg {\n", | |
" width: 8px;\n", | |
" height: 8px;\n", | |
" margin-right: 3px;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expander {\n", | |
" display: flex;\n", | |
" align-items: center;\n", | |
"}\n", | |
"\n", | |
"/* formatting */\n", | |
"\n", | |
"table.dataframe .null {\n", | |
" color: var(--text-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .structural {\n", | |
" color: var(--text-color-medium);\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .dataFrameCaption {\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .numbers {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"\n", | |
":root {\n", | |
" --scroll-bg: #f5f5f5;\n", | |
" --scroll-fg: #b3b3b3;\n", | |
"}\n", | |
":root[theme="dark"], :root [data-jp-theme-light="false"]{\n", | |
" --scroll-bg: #3c3c3c;\n", | |
" --scroll-fg: #97e1fb;\n", | |
"}\n", | |
"body {\n", | |
" scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n", | |
"}\n", | |
"body::-webkit-scrollbar {\n", | |
" width: 10px; /* Mostly for vertical scrollbars */\n", | |
" height: 10px; /* Mostly for horizontal scrollbars */\n", | |
"}\n", | |
"body::-webkit-scrollbar-thumb {\n", | |
" background-color: var(--scroll-fg);\n", | |
"}\n", | |
"body::-webkit-scrollbar-track {\n", | |
" background-color: var(--scroll-bg);\n", | |
"}\n", | |
" </style>\n", | |
" </head>\n", | |
" <body>\n", | |
" <table class="dataframe" id="df_-285212658"></table>\n", | |
"\n", | |
"<p class="dataframe_description">DataFrame: rowsCount = 5, columnsCount = 3</p>\n", | |
"\n", | |
" </body>\n", | |
" <script>\n", | |
" (function () {\n", | |
" window.DataFrame = window.DataFrame || new (function () {\n", | |
" this.addTable = function (df) {\n", | |
" let cols = df.cols;\n", | |
" for (let i = 0; i < cols.length; i++) {\n", | |
" for (let c of cols[i].children) {\n", | |
" cols[c].parent = i;\n", | |
" }\n", | |
" }\n", | |
" df.nrow = 0\n", | |
" for (let i = 0; i < df.cols.length; i++) {\n", | |
" if (df.cols[i].values.length > df.nrow) df.nrow = df.cols[i].values.length\n", | |
" }\n", | |
" if (df.id === df.rootId) {\n", | |
" df.expandedFrames = new Set()\n", | |
" df.childFrames = {}\n", | |
" const table = this.getTableElement(df.id)\n", | |
" table.df = df\n", | |
" for (let i = 0; i < df.cols.length; i++) {\n", | |
" let col = df.cols[i]\n", | |
" if (col.parent === undefined && col.children.length > 0) col.expanded = true\n", | |
" }\n", | |
" } else {\n", | |
" const rootDf = this.getTableData(df.rootId)\n", | |
" rootDf.childFrames[df.id] = df\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.computeRenderData = function (df) {\n", | |
" let result = []\n", | |
" let pos = 0\n", | |
" for (let col = 0; col < df.cols.length; col++) {\n", | |
" if (df.cols[col].parent === undefined)\n", | |
" pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n", | |
" }\n", | |
" for (let i = 0; i < result.length; i++) {\n", | |
" let row = result[i]\n", | |
" for (let j = 0; j < row.length; j++) {\n", | |
" let cell = row[j]\n", | |
" if (j === 0)\n", | |
" cell.leftBd = false\n", | |
" if (j < row.length - 1) {\n", | |
" let nextData = row[j + 1]\n", | |
" if (nextData.leftBd) cell.rightBd = true\n", | |
" else if (cell.rightBd) nextData.leftBd = true\n", | |
" } else cell.rightBd = false\n", | |
" }\n", | |
" }\n", | |
" return result\n", | |
" }\n", | |
"\n", | |
" this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n", | |
" if (result.length === depth) {\n", | |
" const array = [];\n", | |
" if (pos > 0) {\n", | |
" let j = 0\n", | |
" for (let i = 0; j < pos; i++) {\n", | |
" let c = result[depth - 1][i]\n", | |
" j += c.span\n", | |
" let copy = Object.assign({empty: true}, c)\n", | |
" array.push(copy)\n", | |
" }\n", | |
" }\n", | |
" result.push(array)\n", | |
" }\n", | |
" const col = cols[colId];\n", | |
" let size = 0;\n", | |
" if (col.expanded) {\n", | |
" let childPos = pos\n", | |
" for (let i = 0; i < col.children.length; i++) {\n", | |
" let child = col.children[i]\n", | |
" let childLeft = i === 0 && (col.children.length > 1 || leftBorder)\n", | |
" let childRight = i === col.children.length - 1 && (col.children.length > 1 || rightBorder)\n", | |
" let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n", | |
" childPos += childSize\n", | |
" size += childSize\n", | |
" }\n", | |
" } else {\n", | |
" for (let i = depth + 1; i < result.length; i++)\n", | |
" result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n", | |
" size = 1\n", | |
" }\n", | |
" let left = leftBorder\n", | |
" let right = rightBorder\n", | |
" if (size > 1) {\n", | |
" left = true\n", | |
" right = true\n", | |
" }\n", | |
" result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n", | |
" return size\n", | |
" }\n", | |
"\n", | |
" this.getTableElement = function (id) {\n", | |
" return document.getElementById("df_" + id)\n", | |
" }\n", | |
"\n", | |
" this.getTableData = function (id) {\n", | |
" return this.getTableElement(id).df\n", | |
" }\n", | |
"\n", | |
" this.createExpander = function (isExpanded) {\n", | |
" const svgNs = "http://www.w3.org/2000/svg"\n", | |
" let svg = document.createElementNS(svgNs, "svg")\n", | |
" svg.classList.add("expanderSvg")\n", | |
" let path = document.createElementNS(svgNs, "path")\n", | |
" if (isExpanded) {\n", | |
" svg.setAttribute("viewBox", "0 -2 8 8")\n", | |
" path.setAttribute("d", "M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z")\n", | |
" } else {\n", | |
" svg.setAttribute("viewBox", "-2 0 8 8")\n", | |
" path.setAttribute("d", "M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z")\n", | |
" }\n", | |
" path.setAttribute("fill", "currentColor")\n", | |
" svg.appendChild(path)\n", | |
" return svg\n", | |
" }\n", | |
"\n", | |
" this.renderTable = function (id) {\n", | |
"\n", | |
" let table = this.getTableElement(id)\n", | |
"\n", | |
" if (table === null) return\n", | |
"\n", | |
" table.innerHTML = ""\n", | |
"\n", | |
" let df = table.df\n", | |
" let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n", | |
"\n", | |
" // header\n", | |
" let header = document.createElement("thead")\n", | |
" table.appendChild(header)\n", | |
"\n", | |
" let renderData = this.computeRenderData(df)\n", | |
" for (let j = 0; j < renderData.length; j++) {\n", | |
" let rowData = renderData[j]\n", | |
" let tr = document.createElement("tr");\n", | |
" let isLastRow = j === renderData.length - 1\n", | |
" header.appendChild(tr);\n", | |
" for (let i = 0; i < rowData.length; i++) {\n", | |
" let cell = rowData[i]\n", | |
" let th = document.createElement("th");\n", | |
" th.setAttribute("colspan", cell.span)\n", | |
" let colId = cell.id\n", | |
" let col = df.cols[colId];\n", | |
" if (!cell.empty) {\n", | |
" if (col.children.length === 0) {\n", | |
" th.innerHTML = col.name\n", | |
" } else {\n", | |
" let link = document.createElement("a")\n", | |
" link.className = "expander"\n", | |
" let that = this\n", | |
" link.onclick = function () {\n", | |
" col.expanded = !col.expanded\n", | |
" that.renderTable(id)\n", | |
" }\n", | |
" link.appendChild(this.createExpander(col.expanded))\n", | |
" link.innerHTML += col.name\n", | |
" th.appendChild(link)\n", | |
" }\n", | |
" }\n", | |
" let classes = (cell.leftBd ? " leftBorder" : "") + (cell.rightBd ? " rightBorder" : "")\n", | |
" if (col.rightAlign)\n", | |
" classes += " rightAlign"\n", | |
" if (isLastRow)\n", | |
" classes += " bottomBorder"\n", | |
" if (classes.length > 0)\n", | |
" th.setAttribute("class", classes)\n", | |
" tr.appendChild(th)\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" // body\n", | |
" let body = document.createElement("tbody")\n", | |
" table.appendChild(body)\n", | |
"\n", | |
" let columns = renderData.pop()\n", | |
" for (let row = 0; row < df.nrow; row++) {\n", | |
" let tr = document.createElement("tr");\n", | |
" body.appendChild(tr)\n", | |
" for (let i = 0; i < columns.length; i++) {\n", | |
" let cell = columns[i]\n", | |
" let td = document.createElement("td");\n", | |
" let colId = cell.id\n", | |
" let col = df.cols[colId]\n", | |
" let classes = (cell.leftBd ? " leftBorder" : "") + (cell.rightBd ? " rightBorder" : "")\n", | |
" if (col.rightAlign)\n", | |
" classes += " rightAlign"\n", | |
" if (classes.length > 0)\n", | |
" td.setAttribute("class", classes)\n", | |
" tr.appendChild(td)\n", | |
" let value = col.values[row]\n", | |
" if (value.frameId !== undefined) {\n", | |
" let frameId = value.frameId\n", | |
" let expanded = rootDf.expandedFrames.has(frameId)\n", | |
" let link = document.createElement("a")\n", | |
" link.className = "expander"\n", | |
" let that = this\n", | |
" link.onclick = function () {\n", | |
" if (rootDf.expandedFrames.has(frameId))\n", | |
" rootDf.expandedFrames.delete(frameId)\n", | |
" else rootDf.expandedFrames.add(frameId)\n", | |
" that.renderTable(id)\n", | |
" }\n", | |
" link.appendChild(this.createExpander(expanded))\n", | |
" link.innerHTML += value.value\n", | |
" if (expanded) {\n", | |
" td.appendChild(link)\n", | |
" td.appendChild(document.createElement("p"))\n", | |
" const childTable = document.createElement("table")\n", | |
" childTable.className = "dataframe"\n", | |
" childTable.id = "df_" + frameId\n", | |
" let childDf = rootDf.childFrames[frameId]\n", | |
" childTable.df = childDf\n", | |
" td.appendChild(childTable)\n", | |
" this.renderTable(frameId)\n", | |
" if (childDf.nrow !== childDf.totalRows) {\n", | |
" const footer = document.createElement("p")\n", | |
" footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n", | |
" td.appendChild(footer)\n", | |
" }\n", | |
" } else {\n", | |
" td.appendChild(link)\n", | |
" }\n", | |
" } else if (value.style !== undefined) {\n", | |
" td.innerHTML = value.value\n", | |
" td.setAttribute("style", value.style)\n", | |
" } else td.innerHTML = value\n", | |
" this.nodeScriptReplace(td)\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.nodeScriptReplace = function (node) {\n", | |
" if (this.nodeScriptIs(node) === true) {\n", | |
" node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n", | |
" } else {\n", | |
" let i = -1, children = node.childNodes;\n", | |
" while (++i < children.length) {\n", | |
" this.nodeScriptReplace(children[i]);\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" return node;\n", | |
" }\n", | |
"\n", | |
" this.nodeScriptClone = function (node) {\n", | |
" let script = document.createElement("script");\n", | |
" script.text = node.innerHTML;\n", | |
"\n", | |
" let i = -1, attrs = node.attributes, attr;\n", | |
" while (++i < attrs.length) {\n", | |
" script.setAttribute((attr = attrs[i]).name, attr.value);\n", | |
" }\n", | |
" return script;\n", | |
" }\n", | |
"\n", | |
" this.nodeScriptIs = function (node) {\n", | |
" return node.tagName === 'SCRIPT';\n", | |
" }\n", | |
" })()\n", | |
"\n", | |
" window.call_DataFrame = function (f) {\n", | |
" return f();\n", | |
" };\n", | |
"\n", | |
" let funQueue = window["kotlinQueues"] && window["kotlinQueues"]["DataFrame"];\n", | |
" if (funQueue) {\n", | |
" funQueue.forEach(function (f) {\n", | |
" f();\n", | |
" });\n", | |
" funQueue = [];\n", | |
" }\n", | |
"})()\n", | |
"\n", | |
"/*<!--*/\n", | |
"call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: "<span title=\"firstName: String\">firstName</span>", children: [], rightAlign: false, values: ["Evelyn","Daniel","Lily","Henry","Addison"] }, \n", | |
"{ name: "<span title=\"city: String\">city</span>", children: [], rightAlign: false, values: ["Dallas","Los Angeles","Phoenix","Indianapolis","San Francisco"] }, \n", | |
"{ name: "<span title=\"state: String\">state</span>", children: [], rightAlign: false, values: ["Maine","Nevada","Massachusetts","Delaware","Montana"] }, \n", | |
"], id: -285212658, rootId: -285212658, totalRows: 5 } ) });\n", | |
"/*-->*/\n", | |
"\n", | |
"call_DataFrame(function() { DataFrame.renderTable(-285212658) });\n", | |
"\n", | |
"\n", | |
" </script>\n", | |
" </html>\"></iframe>\n", | |
" <script>\n", | |
" function o_resize_iframe_out_8() {\n", | |
" let elem = document.getElementById(\"iframe_out_8\");\n", | |
" resize_iframe_out_8(elem);\n", | |
" setInterval(resize_iframe_out_8, 5000, elem);\n", | |
" }\n", | |
" function resize_iframe_out_8(el) {\n", | |
" let h = el.contentWindow.document.body.scrollHeight;\n", | |
" el.height = h === 0 ? 0 : h + 41;\n", | |
" }\n", | |
" </script> <html>\n", | |
" <head>\n", | |
" <style type=\"text/css\">\n", | |
" :root {\n", | |
" --background: #fff;\n", | |
" --background-odd: #f5f5f5;\n", | |
" --background-hover: #d9edfd;\n", | |
" --header-text-color: #474747;\n", | |
" --text-color: #848484;\n", | |
" --text-color-dark: #000;\n", | |
" --text-color-medium: #737373;\n", | |
" --text-color-pale: #b3b3b3;\n", | |
" --inner-border-color: #aaa;\n", | |
" --bold-border-color: #000;\n", | |
" --link-color: #296eaa;\n", | |
" --link-color-pale: #296eaa;\n", | |
" --link-hover: #1a466c;\n", | |
"}\n", | |
"\n", | |
":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n", | |
" --background: #303030;\n", | |
" --background-odd: #3c3c3c;\n", | |
" --background-hover: #464646;\n", | |
" --header-text-color: #dddddd;\n", | |
" --text-color: #b3b3b3;\n", | |
" --text-color-dark: #dddddd;\n", | |
" --text-color-medium: #b2b2b2;\n", | |
" --text-color-pale: #737373;\n", | |
" --inner-border-color: #707070;\n", | |
" --bold-border-color: #777777;\n", | |
" --link-color: #008dc0;\n", | |
" --link-color-pale: #97e1fb;\n", | |
" --link-hover: #00688e;\n", | |
"}\n", | |
"\n", | |
"p.dataframe_description {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe {\n", | |
" font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n", | |
" font-size: 12px;\n", | |
" background-color: var(--background);\n", | |
" color: var(--text-color-dark);\n", | |
" border: none;\n", | |
" border-collapse: collapse;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th, td {\n", | |
" padding: 6px;\n", | |
" border: 1px solid transparent;\n", | |
" text-align: left;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th {\n", | |
" background-color: var(--background);\n", | |
" color: var(--header-text-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td {\n", | |
" vertical-align: top;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.bottomBorder {\n", | |
" border-bottom-color: var(--bold-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(odd) {\n", | |
" background: var(--background-odd);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(even) {\n", | |
" background: var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:hover {\n", | |
" background: var(--background-hover);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a {\n", | |
" cursor: pointer;\n", | |
" color: var(--link-color);\n", | |
" text-decoration: none;\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover > td a {\n", | |
" color: var(--link-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a:hover {\n", | |
" color: var(--link-hover);\n", | |
" text-decoration: underline;\n", | |
"}\n", | |
"\n", | |
"table.dataframe img {\n", | |
" max-width: fit-content;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.complex {\n", | |
" background-color: var(--background);\n", | |
" border: 1px solid var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .leftBorder {\n", | |
" border-left-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightBorder {\n", | |
" border-right-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightAlign {\n", | |
" text-align: right;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expanderSvg {\n", | |
" width: 8px;\n", | |
" height: 8px;\n", | |
" margin-right: 3px;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expander {\n", | |
" display: flex;\n", | |
" align-items: center;\n", | |
"}\n", | |
"\n", | |
"/* formatting */\n", | |
"\n", | |
"table.dataframe .null {\n", | |
" color: var(--text-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .structural {\n", | |
" color: var(--text-color-medium);\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .dataFrameCaption {\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .numbers {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"\n", | |
" </style>\n", | |
" </head>\n", | |
" <body>\n", | |
" <table class=\"dataframe\" id=\"static_df_-285212657\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">firstName</th><th class=\"bottomBorder\" style=\"text-align:left\">city</th><th class=\"bottomBorder\" style=\"text-align:left\">state</th></tr></thead><tbody><tr><td style=\"vertical-align:top\">Evelyn</td><td style=\"vertical-align:top\">Dallas</td><td style=\"vertical-align:top\">Maine</td></tr><tr><td style=\"vertical-align:top\">Daniel</td><td style=\"vertical-align:top\">Los Angeles</td><td style=\"vertical-align:top\">Nevada</td></tr><tr><td style=\"vertical-align:top\">Lily</td><td style=\"vertical-align:top\">Phoenix</td><td style=\"vertical-align:top\">Massachusetts</td></tr><tr><td style=\"vertical-align:top\">Henry</td><td style=\"vertical-align:top\">Indianapolis</td><td style=\"vertical-align:top\">Delaware</td></tr><tr><td style=\"vertical-align:top\">Addison</td><td style=\"vertical-align:top\">San Francisco</td><td style=\"vertical-align:top\">Montana</td></tr></tbody></table>\n", | |
" </body>\n", | |
" <script>\n", | |
" document.getElementById(\"static_df_-285212657\").style.display = \"none\";\n", | |
" </script>\n", | |
" </html>" | |
], | |
"application/kotlindataframe+json": "{\"$version\":\"2.0.0\",\"metadata\":{\"columns\":[\"firstName\",\"city\",\"state\"],\"nrow\":5,\"ncol\":3},\"kotlin_dataframe\":[{\"firstName\":\"Evelyn\",\"city\":\"Dallas\",\"state\":\"Maine\"},{\"firstName\":\"Daniel\",\"city\":\"Los Angeles\",\"state\":\"Nevada\"},{\"firstName\":\"Lily\",\"city\":\"Phoenix\",\"state\":\"Massachusetts\"},{\"firstName\":\"Henry\",\"city\":\"Indianapolis\",\"state\":\"Delaware\"},{\"firstName\":\"Addison\",\"city\":\"San Francisco\",\"state\":\"Montana\"}]}" | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"execution_count": 8 | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2024-06-26T15:38:57.322694Z", | |
"start_time": "2024-06-26T15:38:57.239465Z" | |
} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"rawUserData.select {\n", | |
" firstName and address.cols(1, 2)\n", | |
"}.tail()" | |
], | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
" <iframe onload=\"o_resize_iframe_out_12()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_12\" frameBorder=\"0\" srcdoc=\" <html>\n", | |
" <head>\n", | |
" <style type="text/css">\n", | |
" :root {\n", | |
" --background: #fff;\n", | |
" --background-odd: #f5f5f5;\n", | |
" --background-hover: #d9edfd;\n", | |
" --header-text-color: #474747;\n", | |
" --text-color: #848484;\n", | |
" --text-color-dark: #000;\n", | |
" --text-color-medium: #737373;\n", | |
" --text-color-pale: #b3b3b3;\n", | |
" --inner-border-color: #aaa;\n", | |
" --bold-border-color: #000;\n", | |
" --link-color: #296eaa;\n", | |
" --link-color-pale: #296eaa;\n", | |
" --link-hover: #1a466c;\n", | |
"}\n", | |
"\n", | |
":root[theme="dark"], :root [data-jp-theme-light="false"], .dataframe_dark{\n", | |
" --background: #303030;\n", | |
" --background-odd: #3c3c3c;\n", | |
" --background-hover: #464646;\n", | |
" --header-text-color: #dddddd;\n", | |
" --text-color: #b3b3b3;\n", | |
" --text-color-dark: #dddddd;\n", | |
" --text-color-medium: #b2b2b2;\n", | |
" --text-color-pale: #737373;\n", | |
" --inner-border-color: #707070;\n", | |
" --bold-border-color: #777777;\n", | |
" --link-color: #008dc0;\n", | |
" --link-color-pale: #97e1fb;\n", | |
" --link-hover: #00688e;\n", | |
"}\n", | |
"\n", | |
"p.dataframe_description {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe {\n", | |
" font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;\n", | |
" font-size: 12px;\n", | |
" background-color: var(--background);\n", | |
" color: var(--text-color-dark);\n", | |
" border: none;\n", | |
" border-collapse: collapse;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th, td {\n", | |
" padding: 6px;\n", | |
" border: 1px solid transparent;\n", | |
" text-align: left;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th {\n", | |
" background-color: var(--background);\n", | |
" color: var(--header-text-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td {\n", | |
" vertical-align: top;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.bottomBorder {\n", | |
" border-bottom-color: var(--bold-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(odd) {\n", | |
" background: var(--background-odd);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(even) {\n", | |
" background: var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:hover {\n", | |
" background: var(--background-hover);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a {\n", | |
" cursor: pointer;\n", | |
" color: var(--link-color);\n", | |
" text-decoration: none;\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover > td a {\n", | |
" color: var(--link-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a:hover {\n", | |
" color: var(--link-hover);\n", | |
" text-decoration: underline;\n", | |
"}\n", | |
"\n", | |
"table.dataframe img {\n", | |
" max-width: fit-content;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.complex {\n", | |
" background-color: var(--background);\n", | |
" border: 1px solid var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .leftBorder {\n", | |
" border-left-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightBorder {\n", | |
" border-right-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightAlign {\n", | |
" text-align: right;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expanderSvg {\n", | |
" width: 8px;\n", | |
" height: 8px;\n", | |
" margin-right: 3px;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expander {\n", | |
" display: flex;\n", | |
" align-items: center;\n", | |
"}\n", | |
"\n", | |
"/* formatting */\n", | |
"\n", | |
"table.dataframe .null {\n", | |
" color: var(--text-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .structural {\n", | |
" color: var(--text-color-medium);\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .dataFrameCaption {\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .numbers {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"\n", | |
":root {\n", | |
" --scroll-bg: #f5f5f5;\n", | |
" --scroll-fg: #b3b3b3;\n", | |
"}\n", | |
":root[theme="dark"], :root [data-jp-theme-light="false"]{\n", | |
" --scroll-bg: #3c3c3c;\n", | |
" --scroll-fg: #97e1fb;\n", | |
"}\n", | |
"body {\n", | |
" scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n", | |
"}\n", | |
"body::-webkit-scrollbar {\n", | |
" width: 10px; /* Mostly for vertical scrollbars */\n", | |
" height: 10px; /* Mostly for horizontal scrollbars */\n", | |
"}\n", | |
"body::-webkit-scrollbar-thumb {\n", | |
" background-color: var(--scroll-fg);\n", | |
"}\n", | |
"body::-webkit-scrollbar-track {\n", | |
" background-color: var(--scroll-bg);\n", | |
"}\n", | |
" </style>\n", | |
" </head>\n", | |
" <body>\n", | |
" <table class="dataframe" id="df_-285212650"></table>\n", | |
"\n", | |
"<p class="dataframe_description">DataFrame: rowsCount = 5, columnsCount = 3</p>\n", | |
"\n", | |
" </body>\n", | |
" <script>\n", | |
" (function () {\n", | |
" window.DataFrame = window.DataFrame || new (function () {\n", | |
" this.addTable = function (df) {\n", | |
" let cols = df.cols;\n", | |
" for (let i = 0; i < cols.length; i++) {\n", | |
" for (let c of cols[i].children) {\n", | |
" cols[c].parent = i;\n", | |
" }\n", | |
" }\n", | |
" df.nrow = 0\n", | |
" for (let i = 0; i < df.cols.length; i++) {\n", | |
" if (df.cols[i].values.length > df.nrow) df.nrow = df.cols[i].values.length\n", | |
" }\n", | |
" if (df.id === df.rootId) {\n", | |
" df.expandedFrames = new Set()\n", | |
" df.childFrames = {}\n", | |
" const table = this.getTableElement(df.id)\n", | |
" table.df = df\n", | |
" for (let i = 0; i < df.cols.length; i++) {\n", | |
" let col = df.cols[i]\n", | |
" if (col.parent === undefined && col.children.length > 0) col.expanded = true\n", | |
" }\n", | |
" } else {\n", | |
" const rootDf = this.getTableData(df.rootId)\n", | |
" rootDf.childFrames[df.id] = df\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.computeRenderData = function (df) {\n", | |
" let result = []\n", | |
" let pos = 0\n", | |
" for (let col = 0; col < df.cols.length; col++) {\n", | |
" if (df.cols[col].parent === undefined)\n", | |
" pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n", | |
" }\n", | |
" for (let i = 0; i < result.length; i++) {\n", | |
" let row = result[i]\n", | |
" for (let j = 0; j < row.length; j++) {\n", | |
" let cell = row[j]\n", | |
" if (j === 0)\n", | |
" cell.leftBd = false\n", | |
" if (j < row.length - 1) {\n", | |
" let nextData = row[j + 1]\n", | |
" if (nextData.leftBd) cell.rightBd = true\n", | |
" else if (cell.rightBd) nextData.leftBd = true\n", | |
" } else cell.rightBd = false\n", | |
" }\n", | |
" }\n", | |
" return result\n", | |
" }\n", | |
"\n", | |
" this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n", | |
" if (result.length === depth) {\n", | |
" const array = [];\n", | |
" if (pos > 0) {\n", | |
" let j = 0\n", | |
" for (let i = 0; j < pos; i++) {\n", | |
" let c = result[depth - 1][i]\n", | |
" j += c.span\n", | |
" let copy = Object.assign({empty: true}, c)\n", | |
" array.push(copy)\n", | |
" }\n", | |
" }\n", | |
" result.push(array)\n", | |
" }\n", | |
" const col = cols[colId];\n", | |
" let size = 0;\n", | |
" if (col.expanded) {\n", | |
" let childPos = pos\n", | |
" for (let i = 0; i < col.children.length; i++) {\n", | |
" let child = col.children[i]\n", | |
" let childLeft = i === 0 && (col.children.length > 1 || leftBorder)\n", | |
" let childRight = i === col.children.length - 1 && (col.children.length > 1 || rightBorder)\n", | |
" let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n", | |
" childPos += childSize\n", | |
" size += childSize\n", | |
" }\n", | |
" } else {\n", | |
" for (let i = depth + 1; i < result.length; i++)\n", | |
" result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n", | |
" size = 1\n", | |
" }\n", | |
" let left = leftBorder\n", | |
" let right = rightBorder\n", | |
" if (size > 1) {\n", | |
" left = true\n", | |
" right = true\n", | |
" }\n", | |
" result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n", | |
" return size\n", | |
" }\n", | |
"\n", | |
" this.getTableElement = function (id) {\n", | |
" return document.getElementById("df_" + id)\n", | |
" }\n", | |
"\n", | |
" this.getTableData = function (id) {\n", | |
" return this.getTableElement(id).df\n", | |
" }\n", | |
"\n", | |
" this.createExpander = function (isExpanded) {\n", | |
" const svgNs = "http://www.w3.org/2000/svg"\n", | |
" let svg = document.createElementNS(svgNs, "svg")\n", | |
" svg.classList.add("expanderSvg")\n", | |
" let path = document.createElementNS(svgNs, "path")\n", | |
" if (isExpanded) {\n", | |
" svg.setAttribute("viewBox", "0 -2 8 8")\n", | |
" path.setAttribute("d", "M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z")\n", | |
" } else {\n", | |
" svg.setAttribute("viewBox", "-2 0 8 8")\n", | |
" path.setAttribute("d", "M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z")\n", | |
" }\n", | |
" path.setAttribute("fill", "currentColor")\n", | |
" svg.appendChild(path)\n", | |
" return svg\n", | |
" }\n", | |
"\n", | |
" this.renderTable = function (id) {\n", | |
"\n", | |
" let table = this.getTableElement(id)\n", | |
"\n", | |
" if (table === null) return\n", | |
"\n", | |
" table.innerHTML = ""\n", | |
"\n", | |
" let df = table.df\n", | |
" let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n", | |
"\n", | |
" // header\n", | |
" let header = document.createElement("thead")\n", | |
" table.appendChild(header)\n", | |
"\n", | |
" let renderData = this.computeRenderData(df)\n", | |
" for (let j = 0; j < renderData.length; j++) {\n", | |
" let rowData = renderData[j]\n", | |
" let tr = document.createElement("tr");\n", | |
" let isLastRow = j === renderData.length - 1\n", | |
" header.appendChild(tr);\n", | |
" for (let i = 0; i < rowData.length; i++) {\n", | |
" let cell = rowData[i]\n", | |
" let th = document.createElement("th");\n", | |
" th.setAttribute("colspan", cell.span)\n", | |
" let colId = cell.id\n", | |
" let col = df.cols[colId];\n", | |
" if (!cell.empty) {\n", | |
" if (col.children.length === 0) {\n", | |
" th.innerHTML = col.name\n", | |
" } else {\n", | |
" let link = document.createElement("a")\n", | |
" link.className = "expander"\n", | |
" let that = this\n", | |
" link.onclick = function () {\n", | |
" col.expanded = !col.expanded\n", | |
" that.renderTable(id)\n", | |
" }\n", | |
" link.appendChild(this.createExpander(col.expanded))\n", | |
" link.innerHTML += col.name\n", | |
" th.appendChild(link)\n", | |
" }\n", | |
" }\n", | |
" let classes = (cell.leftBd ? " leftBorder" : "") + (cell.rightBd ? " rightBorder" : "")\n", | |
" if (col.rightAlign)\n", | |
" classes += " rightAlign"\n", | |
" if (isLastRow)\n", | |
" classes += " bottomBorder"\n", | |
" if (classes.length > 0)\n", | |
" th.setAttribute("class", classes)\n", | |
" tr.appendChild(th)\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" // body\n", | |
" let body = document.createElement("tbody")\n", | |
" table.appendChild(body)\n", | |
"\n", | |
" let columns = renderData.pop()\n", | |
" for (let row = 0; row < df.nrow; row++) {\n", | |
" let tr = document.createElement("tr");\n", | |
" body.appendChild(tr)\n", | |
" for (let i = 0; i < columns.length; i++) {\n", | |
" let cell = columns[i]\n", | |
" let td = document.createElement("td");\n", | |
" let colId = cell.id\n", | |
" let col = df.cols[colId]\n", | |
" let classes = (cell.leftBd ? " leftBorder" : "") + (cell.rightBd ? " rightBorder" : "")\n", | |
" if (col.rightAlign)\n", | |
" classes += " rightAlign"\n", | |
" if (classes.length > 0)\n", | |
" td.setAttribute("class", classes)\n", | |
" tr.appendChild(td)\n", | |
" let value = col.values[row]\n", | |
" if (value.frameId !== undefined) {\n", | |
" let frameId = value.frameId\n", | |
" let expanded = rootDf.expandedFrames.has(frameId)\n", | |
" let link = document.createElement("a")\n", | |
" link.className = "expander"\n", | |
" let that = this\n", | |
" link.onclick = function () {\n", | |
" if (rootDf.expandedFrames.has(frameId))\n", | |
" rootDf.expandedFrames.delete(frameId)\n", | |
" else rootDf.expandedFrames.add(frameId)\n", | |
" that.renderTable(id)\n", | |
" }\n", | |
" link.appendChild(this.createExpander(expanded))\n", | |
" link.innerHTML += value.value\n", | |
" if (expanded) {\n", | |
" td.appendChild(link)\n", | |
" td.appendChild(document.createElement("p"))\n", | |
" const childTable = document.createElement("table")\n", | |
" childTable.className = "dataframe"\n", | |
" childTable.id = "df_" + frameId\n", | |
" let childDf = rootDf.childFrames[frameId]\n", | |
" childTable.df = childDf\n", | |
" td.appendChild(childTable)\n", | |
" this.renderTable(frameId)\n", | |
" if (childDf.nrow !== childDf.totalRows) {\n", | |
" const footer = document.createElement("p")\n", | |
" footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n", | |
" td.appendChild(footer)\n", | |
" }\n", | |
" } else {\n", | |
" td.appendChild(link)\n", | |
" }\n", | |
" } else if (value.style !== undefined) {\n", | |
" td.innerHTML = value.value\n", | |
" td.setAttribute("style", value.style)\n", | |
" } else td.innerHTML = value\n", | |
" this.nodeScriptReplace(td)\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.nodeScriptReplace = function (node) {\n", | |
" if (this.nodeScriptIs(node) === true) {\n", | |
" node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n", | |
" } else {\n", | |
" let i = -1, children = node.childNodes;\n", | |
" while (++i < children.length) {\n", | |
" this.nodeScriptReplace(children[i]);\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" return node;\n", | |
" }\n", | |
"\n", | |
" this.nodeScriptClone = function (node) {\n", | |
" let script = document.createElement("script");\n", | |
" script.text = node.innerHTML;\n", | |
"\n", | |
" let i = -1, attrs = node.attributes, attr;\n", | |
" while (++i < attrs.length) {\n", | |
" script.setAttribute((attr = attrs[i]).name, attr.value);\n", | |
" }\n", | |
" return script;\n", | |
" }\n", | |
"\n", | |
" this.nodeScriptIs = function (node) {\n", | |
" return node.tagName === 'SCRIPT';\n", | |
" }\n", | |
" })()\n", | |
"\n", | |
" window.call_DataFrame = function (f) {\n", | |
" return f();\n", | |
" };\n", | |
"\n", | |
" let funQueue = window["kotlinQueues"] && window["kotlinQueues"]["DataFrame"];\n", | |
" if (funQueue) {\n", | |
" funQueue.forEach(function (f) {\n", | |
" f();\n", | |
" });\n", | |
" funQueue = [];\n", | |
" }\n", | |
"})()\n", | |
"\n", | |
"/*<!--*/\n", | |
"call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: "<span title=\"firstName: String\">firstName</span>", children: [], rightAlign: false, values: ["Evelyn","Daniel","Lily","Henry","Addison"] }, \n", | |
"{ name: "<span title=\"city: String\">city</span>", children: [], rightAlign: false, values: ["Dallas","Los Angeles","Phoenix","Indianapolis","San Francisco"] }, \n", | |
"{ name: "<span title=\"state: String\">state</span>", children: [], rightAlign: false, values: ["Maine","Nevada","Massachusetts","Delaware","Montana"] }, \n", | |
"], id: -285212650, rootId: -285212650, totalRows: 5 } ) });\n", | |
"/*-->*/\n", | |
"\n", | |
"call_DataFrame(function() { DataFrame.renderTable(-285212650) });\n", | |
"\n", | |
"\n", | |
" </script>\n", | |
" </html>\"></iframe>\n", | |
" <script>\n", | |
" function o_resize_iframe_out_12() {\n", | |
" let elem = document.getElementById(\"iframe_out_12\");\n", | |
" resize_iframe_out_12(elem);\n", | |
" setInterval(resize_iframe_out_12, 5000, elem);\n", | |
" }\n", | |
" function resize_iframe_out_12(el) {\n", | |
" let h = el.contentWindow.document.body.scrollHeight;\n", | |
" el.height = h === 0 ? 0 : h + 41;\n", | |
" }\n", | |
" </script> <html>\n", | |
" <head>\n", | |
" <style type=\"text/css\">\n", | |
" :root {\n", | |
" --background: #fff;\n", | |
" --background-odd: #f5f5f5;\n", | |
" --background-hover: #d9edfd;\n", | |
" --header-text-color: #474747;\n", | |
" --text-color: #848484;\n", | |
" --text-color-dark: #000;\n", | |
" --text-color-medium: #737373;\n", | |
" --text-color-pale: #b3b3b3;\n", | |
" --inner-border-color: #aaa;\n", | |
" --bold-border-color: #000;\n", | |
" --link-color: #296eaa;\n", | |
" --link-color-pale: #296eaa;\n", | |
" --link-hover: #1a466c;\n", | |
"}\n", | |
"\n", | |
":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n", | |
" --background: #303030;\n", | |
" --background-odd: #3c3c3c;\n", | |
" --background-hover: #464646;\n", | |
" --header-text-color: #dddddd;\n", | |
" --text-color: #b3b3b3;\n", | |
" --text-color-dark: #dddddd;\n", | |
" --text-color-medium: #b2b2b2;\n", | |
" --text-color-pale: #737373;\n", | |
" --inner-border-color: #707070;\n", | |
" --bold-border-color: #777777;\n", | |
" --link-color: #008dc0;\n", | |
" --link-color-pale: #97e1fb;\n", | |
" --link-hover: #00688e;\n", | |
"}\n", | |
"\n", | |
"p.dataframe_description {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe {\n", | |
" font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n", | |
" font-size: 12px;\n", | |
" background-color: var(--background);\n", | |
" color: var(--text-color-dark);\n", | |
" border: none;\n", | |
" border-collapse: collapse;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th, td {\n", | |
" padding: 6px;\n", | |
" border: 1px solid transparent;\n", | |
" text-align: left;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th {\n", | |
" background-color: var(--background);\n", | |
" color: var(--header-text-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td {\n", | |
" vertical-align: top;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.bottomBorder {\n", | |
" border-bottom-color: var(--bold-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(odd) {\n", | |
" background: var(--background-odd);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(even) {\n", | |
" background: var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:hover {\n", | |
" background: var(--background-hover);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a {\n", | |
" cursor: pointer;\n", | |
" color: var(--link-color);\n", | |
" text-decoration: none;\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover > td a {\n", | |
" color: var(--link-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a:hover {\n", | |
" color: var(--link-hover);\n", | |
" text-decoration: underline;\n", | |
"}\n", | |
"\n", | |
"table.dataframe img {\n", | |
" max-width: fit-content;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.complex {\n", | |
" background-color: var(--background);\n", | |
" border: 1px solid var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .leftBorder {\n", | |
" border-left-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightBorder {\n", | |
" border-right-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightAlign {\n", | |
" text-align: right;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expanderSvg {\n", | |
" width: 8px;\n", | |
" height: 8px;\n", | |
" margin-right: 3px;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expander {\n", | |
" display: flex;\n", | |
" align-items: center;\n", | |
"}\n", | |
"\n", | |
"/* formatting */\n", | |
"\n", | |
"table.dataframe .null {\n", | |
" color: var(--text-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .structural {\n", | |
" color: var(--text-color-medium);\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .dataFrameCaption {\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .numbers {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"\n", | |
" </style>\n", | |
" </head>\n", | |
" <body>\n", | |
" <table class=\"dataframe\" id=\"static_df_-285212649\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">firstName</th><th class=\"bottomBorder\" style=\"text-align:left\">city</th><th class=\"bottomBorder\" style=\"text-align:left\">state</th></tr></thead><tbody><tr><td style=\"vertical-align:top\">Evelyn</td><td style=\"vertical-align:top\">Dallas</td><td style=\"vertical-align:top\">Maine</td></tr><tr><td style=\"vertical-align:top\">Daniel</td><td style=\"vertical-align:top\">Los Angeles</td><td style=\"vertical-align:top\">Nevada</td></tr><tr><td style=\"vertical-align:top\">Lily</td><td style=\"vertical-align:top\">Phoenix</td><td style=\"vertical-align:top\">Massachusetts</td></tr><tr><td style=\"vertical-align:top\">Henry</td><td style=\"vertical-align:top\">Indianapolis</td><td style=\"vertical-align:top\">Delaware</td></tr><tr><td style=\"vertical-align:top\">Addison</td><td style=\"vertical-align:top\">San Francisco</td><td style=\"vertical-align:top\">Montana</td></tr></tbody></table>\n", | |
" </body>\n", | |
" <script>\n", | |
" document.getElementById(\"static_df_-285212649\").style.display = \"none\";\n", | |
" </script>\n", | |
" </html>" | |
], | |
"application/kotlindataframe+json": "{\"$version\":\"2.0.0\",\"metadata\":{\"columns\":[\"firstName\",\"city\",\"state\"],\"nrow\":5,\"ncol\":3},\"kotlin_dataframe\":[{\"firstName\":\"Evelyn\",\"city\":\"Dallas\",\"state\":\"Maine\"},{\"firstName\":\"Daniel\",\"city\":\"Los Angeles\",\"state\":\"Nevada\"},{\"firstName\":\"Lily\",\"city\":\"Phoenix\",\"state\":\"Massachusetts\"},{\"firstName\":\"Henry\",\"city\":\"Indianapolis\",\"state\":\"Delaware\"},{\"firstName\":\"Addison\",\"city\":\"San Francisco\",\"state\":\"Montana\"}]}" | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"execution_count": 10 | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2024-06-26T15:39:45.181946Z", | |
"start_time": "2024-06-26T15:39:45.054379Z" | |
} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"rawUserData.select {\n", | |
" firstName and address.cols(0..2)\n", | |
"}.tail()" | |
], | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
" <iframe onload=\"o_resize_iframe_out_14()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_14\" frameBorder=\"0\" srcdoc=\" <html>\n", | |
" <head>\n", | |
" <style type="text/css">\n", | |
" :root {\n", | |
" --background: #fff;\n", | |
" --background-odd: #f5f5f5;\n", | |
" --background-hover: #d9edfd;\n", | |
" --header-text-color: #474747;\n", | |
" --text-color: #848484;\n", | |
" --text-color-dark: #000;\n", | |
" --text-color-medium: #737373;\n", | |
" --text-color-pale: #b3b3b3;\n", | |
" --inner-border-color: #aaa;\n", | |
" --bold-border-color: #000;\n", | |
" --link-color: #296eaa;\n", | |
" --link-color-pale: #296eaa;\n", | |
" --link-hover: #1a466c;\n", | |
"}\n", | |
"\n", | |
":root[theme="dark"], :root [data-jp-theme-light="false"], .dataframe_dark{\n", | |
" --background: #303030;\n", | |
" --background-odd: #3c3c3c;\n", | |
" --background-hover: #464646;\n", | |
" --header-text-color: #dddddd;\n", | |
" --text-color: #b3b3b3;\n", | |
" --text-color-dark: #dddddd;\n", | |
" --text-color-medium: #b2b2b2;\n", | |
" --text-color-pale: #737373;\n", | |
" --inner-border-color: #707070;\n", | |
" --bold-border-color: #777777;\n", | |
" --link-color: #008dc0;\n", | |
" --link-color-pale: #97e1fb;\n", | |
" --link-hover: #00688e;\n", | |
"}\n", | |
"\n", | |
"p.dataframe_description {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe {\n", | |
" font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;\n", | |
" font-size: 12px;\n", | |
" background-color: var(--background);\n", | |
" color: var(--text-color-dark);\n", | |
" border: none;\n", | |
" border-collapse: collapse;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th, td {\n", | |
" padding: 6px;\n", | |
" border: 1px solid transparent;\n", | |
" text-align: left;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th {\n", | |
" background-color: var(--background);\n", | |
" color: var(--header-text-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td {\n", | |
" vertical-align: top;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.bottomBorder {\n", | |
" border-bottom-color: var(--bold-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(odd) {\n", | |
" background: var(--background-odd);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(even) {\n", | |
" background: var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:hover {\n", | |
" background: var(--background-hover);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a {\n", | |
" cursor: pointer;\n", | |
" color: var(--link-color);\n", | |
" text-decoration: none;\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover > td a {\n", | |
" color: var(--link-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a:hover {\n", | |
" color: var(--link-hover);\n", | |
" text-decoration: underline;\n", | |
"}\n", | |
"\n", | |
"table.dataframe img {\n", | |
" max-width: fit-content;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.complex {\n", | |
" background-color: var(--background);\n", | |
" border: 1px solid var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .leftBorder {\n", | |
" border-left-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightBorder {\n", | |
" border-right-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightAlign {\n", | |
" text-align: right;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expanderSvg {\n", | |
" width: 8px;\n", | |
" height: 8px;\n", | |
" margin-right: 3px;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expander {\n", | |
" display: flex;\n", | |
" align-items: center;\n", | |
"}\n", | |
"\n", | |
"/* formatting */\n", | |
"\n", | |
"table.dataframe .null {\n", | |
" color: var(--text-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .structural {\n", | |
" color: var(--text-color-medium);\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .dataFrameCaption {\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .numbers {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"\n", | |
":root {\n", | |
" --scroll-bg: #f5f5f5;\n", | |
" --scroll-fg: #b3b3b3;\n", | |
"}\n", | |
":root[theme="dark"], :root [data-jp-theme-light="false"]{\n", | |
" --scroll-bg: #3c3c3c;\n", | |
" --scroll-fg: #97e1fb;\n", | |
"}\n", | |
"body {\n", | |
" scrollbar-color: var(--scroll-fg) var(--scroll-bg);\n", | |
"}\n", | |
"body::-webkit-scrollbar {\n", | |
" width: 10px; /* Mostly for vertical scrollbars */\n", | |
" height: 10px; /* Mostly for horizontal scrollbars */\n", | |
"}\n", | |
"body::-webkit-scrollbar-thumb {\n", | |
" background-color: var(--scroll-fg);\n", | |
"}\n", | |
"body::-webkit-scrollbar-track {\n", | |
" background-color: var(--scroll-bg);\n", | |
"}\n", | |
" </style>\n", | |
" </head>\n", | |
" <body>\n", | |
" <table class="dataframe" id="df_-285212646"></table>\n", | |
"\n", | |
"<p class="dataframe_description">DataFrame: rowsCount = 5, columnsCount = 4</p>\n", | |
"\n", | |
" </body>\n", | |
" <script>\n", | |
" (function () {\n", | |
" window.DataFrame = window.DataFrame || new (function () {\n", | |
" this.addTable = function (df) {\n", | |
" let cols = df.cols;\n", | |
" for (let i = 0; i < cols.length; i++) {\n", | |
" for (let c of cols[i].children) {\n", | |
" cols[c].parent = i;\n", | |
" }\n", | |
" }\n", | |
" df.nrow = 0\n", | |
" for (let i = 0; i < df.cols.length; i++) {\n", | |
" if (df.cols[i].values.length > df.nrow) df.nrow = df.cols[i].values.length\n", | |
" }\n", | |
" if (df.id === df.rootId) {\n", | |
" df.expandedFrames = new Set()\n", | |
" df.childFrames = {}\n", | |
" const table = this.getTableElement(df.id)\n", | |
" table.df = df\n", | |
" for (let i = 0; i < df.cols.length; i++) {\n", | |
" let col = df.cols[i]\n", | |
" if (col.parent === undefined && col.children.length > 0) col.expanded = true\n", | |
" }\n", | |
" } else {\n", | |
" const rootDf = this.getTableData(df.rootId)\n", | |
" rootDf.childFrames[df.id] = df\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.computeRenderData = function (df) {\n", | |
" let result = []\n", | |
" let pos = 0\n", | |
" for (let col = 0; col < df.cols.length; col++) {\n", | |
" if (df.cols[col].parent === undefined)\n", | |
" pos += this.computeRenderDataRec(df.cols, col, pos, 0, result, false, false)\n", | |
" }\n", | |
" for (let i = 0; i < result.length; i++) {\n", | |
" let row = result[i]\n", | |
" for (let j = 0; j < row.length; j++) {\n", | |
" let cell = row[j]\n", | |
" if (j === 0)\n", | |
" cell.leftBd = false\n", | |
" if (j < row.length - 1) {\n", | |
" let nextData = row[j + 1]\n", | |
" if (nextData.leftBd) cell.rightBd = true\n", | |
" else if (cell.rightBd) nextData.leftBd = true\n", | |
" } else cell.rightBd = false\n", | |
" }\n", | |
" }\n", | |
" return result\n", | |
" }\n", | |
"\n", | |
" this.computeRenderDataRec = function (cols, colId, pos, depth, result, leftBorder, rightBorder) {\n", | |
" if (result.length === depth) {\n", | |
" const array = [];\n", | |
" if (pos > 0) {\n", | |
" let j = 0\n", | |
" for (let i = 0; j < pos; i++) {\n", | |
" let c = result[depth - 1][i]\n", | |
" j += c.span\n", | |
" let copy = Object.assign({empty: true}, c)\n", | |
" array.push(copy)\n", | |
" }\n", | |
" }\n", | |
" result.push(array)\n", | |
" }\n", | |
" const col = cols[colId];\n", | |
" let size = 0;\n", | |
" if (col.expanded) {\n", | |
" let childPos = pos\n", | |
" for (let i = 0; i < col.children.length; i++) {\n", | |
" let child = col.children[i]\n", | |
" let childLeft = i === 0 && (col.children.length > 1 || leftBorder)\n", | |
" let childRight = i === col.children.length - 1 && (col.children.length > 1 || rightBorder)\n", | |
" let childSize = this.computeRenderDataRec(cols, child, childPos, depth + 1, result, childLeft, childRight)\n", | |
" childPos += childSize\n", | |
" size += childSize\n", | |
" }\n", | |
" } else {\n", | |
" for (let i = depth + 1; i < result.length; i++)\n", | |
" result[i].push({id: colId, span: 1, leftBd: leftBorder, rightBd: rightBorder, empty: true})\n", | |
" size = 1\n", | |
" }\n", | |
" let left = leftBorder\n", | |
" let right = rightBorder\n", | |
" if (size > 1) {\n", | |
" left = true\n", | |
" right = true\n", | |
" }\n", | |
" result[depth].push({id: colId, span: size, leftBd: left, rightBd: right})\n", | |
" return size\n", | |
" }\n", | |
"\n", | |
" this.getTableElement = function (id) {\n", | |
" return document.getElementById("df_" + id)\n", | |
" }\n", | |
"\n", | |
" this.getTableData = function (id) {\n", | |
" return this.getTableElement(id).df\n", | |
" }\n", | |
"\n", | |
" this.createExpander = function (isExpanded) {\n", | |
" const svgNs = "http://www.w3.org/2000/svg"\n", | |
" let svg = document.createElementNS(svgNs, "svg")\n", | |
" svg.classList.add("expanderSvg")\n", | |
" let path = document.createElementNS(svgNs, "path")\n", | |
" if (isExpanded) {\n", | |
" svg.setAttribute("viewBox", "0 -2 8 8")\n", | |
" path.setAttribute("d", "M1 0 l-1 1 4 4 4 -4 -1 -1 -3 3Z")\n", | |
" } else {\n", | |
" svg.setAttribute("viewBox", "-2 0 8 8")\n", | |
" path.setAttribute("d", "M1 0 l-1 1 3 3 -3 3 1 1 4 -4Z")\n", | |
" }\n", | |
" path.setAttribute("fill", "currentColor")\n", | |
" svg.appendChild(path)\n", | |
" return svg\n", | |
" }\n", | |
"\n", | |
" this.renderTable = function (id) {\n", | |
"\n", | |
" let table = this.getTableElement(id)\n", | |
"\n", | |
" if (table === null) return\n", | |
"\n", | |
" table.innerHTML = ""\n", | |
"\n", | |
" let df = table.df\n", | |
" let rootDf = df.rootId === df.id ? df : this.getTableData(df.rootId)\n", | |
"\n", | |
" // header\n", | |
" let header = document.createElement("thead")\n", | |
" table.appendChild(header)\n", | |
"\n", | |
" let renderData = this.computeRenderData(df)\n", | |
" for (let j = 0; j < renderData.length; j++) {\n", | |
" let rowData = renderData[j]\n", | |
" let tr = document.createElement("tr");\n", | |
" let isLastRow = j === renderData.length - 1\n", | |
" header.appendChild(tr);\n", | |
" for (let i = 0; i < rowData.length; i++) {\n", | |
" let cell = rowData[i]\n", | |
" let th = document.createElement("th");\n", | |
" th.setAttribute("colspan", cell.span)\n", | |
" let colId = cell.id\n", | |
" let col = df.cols[colId];\n", | |
" if (!cell.empty) {\n", | |
" if (col.children.length === 0) {\n", | |
" th.innerHTML = col.name\n", | |
" } else {\n", | |
" let link = document.createElement("a")\n", | |
" link.className = "expander"\n", | |
" let that = this\n", | |
" link.onclick = function () {\n", | |
" col.expanded = !col.expanded\n", | |
" that.renderTable(id)\n", | |
" }\n", | |
" link.appendChild(this.createExpander(col.expanded))\n", | |
" link.innerHTML += col.name\n", | |
" th.appendChild(link)\n", | |
" }\n", | |
" }\n", | |
" let classes = (cell.leftBd ? " leftBorder" : "") + (cell.rightBd ? " rightBorder" : "")\n", | |
" if (col.rightAlign)\n", | |
" classes += " rightAlign"\n", | |
" if (isLastRow)\n", | |
" classes += " bottomBorder"\n", | |
" if (classes.length > 0)\n", | |
" th.setAttribute("class", classes)\n", | |
" tr.appendChild(th)\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" // body\n", | |
" let body = document.createElement("tbody")\n", | |
" table.appendChild(body)\n", | |
"\n", | |
" let columns = renderData.pop()\n", | |
" for (let row = 0; row < df.nrow; row++) {\n", | |
" let tr = document.createElement("tr");\n", | |
" body.appendChild(tr)\n", | |
" for (let i = 0; i < columns.length; i++) {\n", | |
" let cell = columns[i]\n", | |
" let td = document.createElement("td");\n", | |
" let colId = cell.id\n", | |
" let col = df.cols[colId]\n", | |
" let classes = (cell.leftBd ? " leftBorder" : "") + (cell.rightBd ? " rightBorder" : "")\n", | |
" if (col.rightAlign)\n", | |
" classes += " rightAlign"\n", | |
" if (classes.length > 0)\n", | |
" td.setAttribute("class", classes)\n", | |
" tr.appendChild(td)\n", | |
" let value = col.values[row]\n", | |
" if (value.frameId !== undefined) {\n", | |
" let frameId = value.frameId\n", | |
" let expanded = rootDf.expandedFrames.has(frameId)\n", | |
" let link = document.createElement("a")\n", | |
" link.className = "expander"\n", | |
" let that = this\n", | |
" link.onclick = function () {\n", | |
" if (rootDf.expandedFrames.has(frameId))\n", | |
" rootDf.expandedFrames.delete(frameId)\n", | |
" else rootDf.expandedFrames.add(frameId)\n", | |
" that.renderTable(id)\n", | |
" }\n", | |
" link.appendChild(this.createExpander(expanded))\n", | |
" link.innerHTML += value.value\n", | |
" if (expanded) {\n", | |
" td.appendChild(link)\n", | |
" td.appendChild(document.createElement("p"))\n", | |
" const childTable = document.createElement("table")\n", | |
" childTable.className = "dataframe"\n", | |
" childTable.id = "df_" + frameId\n", | |
" let childDf = rootDf.childFrames[frameId]\n", | |
" childTable.df = childDf\n", | |
" td.appendChild(childTable)\n", | |
" this.renderTable(frameId)\n", | |
" if (childDf.nrow !== childDf.totalRows) {\n", | |
" const footer = document.createElement("p")\n", | |
" footer.innerText = `... showing only top ${childDf.nrow} of ${childDf.totalRows} rows`\n", | |
" td.appendChild(footer)\n", | |
" }\n", | |
" } else {\n", | |
" td.appendChild(link)\n", | |
" }\n", | |
" } else if (value.style !== undefined) {\n", | |
" td.innerHTML = value.value\n", | |
" td.setAttribute("style", value.style)\n", | |
" } else td.innerHTML = value\n", | |
" this.nodeScriptReplace(td)\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" this.nodeScriptReplace = function (node) {\n", | |
" if (this.nodeScriptIs(node) === true) {\n", | |
" node.parentNode.replaceChild(this.nodeScriptClone(node), node);\n", | |
" } else {\n", | |
" let i = -1, children = node.childNodes;\n", | |
" while (++i < children.length) {\n", | |
" this.nodeScriptReplace(children[i]);\n", | |
" }\n", | |
" }\n", | |
"\n", | |
" return node;\n", | |
" }\n", | |
"\n", | |
" this.nodeScriptClone = function (node) {\n", | |
" let script = document.createElement("script");\n", | |
" script.text = node.innerHTML;\n", | |
"\n", | |
" let i = -1, attrs = node.attributes, attr;\n", | |
" while (++i < attrs.length) {\n", | |
" script.setAttribute((attr = attrs[i]).name, attr.value);\n", | |
" }\n", | |
" return script;\n", | |
" }\n", | |
"\n", | |
" this.nodeScriptIs = function (node) {\n", | |
" return node.tagName === 'SCRIPT';\n", | |
" }\n", | |
" })()\n", | |
"\n", | |
" window.call_DataFrame = function (f) {\n", | |
" return f();\n", | |
" };\n", | |
"\n", | |
" let funQueue = window["kotlinQueues"] && window["kotlinQueues"]["DataFrame"];\n", | |
" if (funQueue) {\n", | |
" funQueue.forEach(function (f) {\n", | |
" f();\n", | |
" });\n", | |
" funQueue = [];\n", | |
" }\n", | |
"})()\n", | |
"\n", | |
"/*<!--*/\n", | |
"call_DataFrame(function() { DataFrame.addTable({ cols: [{ name: "<span title=\"firstName: String\">firstName</span>", children: [], rightAlign: false, values: ["Evelyn","Daniel","Lily","Henry","Addison"] }, \n", | |
"{ name: "<span title=\"address: String\">address</span>", children: [], rightAlign: false, values: ["1065 Lincoln Street","1163 Pine Street","1946 Oak Street","1837 Maple Street","568 Tenth Street"] }, \n", | |
"{ name: "<span title=\"city: String\">city</span>", children: [], rightAlign: false, values: ["Dallas","Los Angeles","Phoenix","Indianapolis","San Francisco"] }, \n", | |
"{ name: "<span title=\"state: String\">state</span>", children: [], rightAlign: false, values: ["Maine","Nevada","Massachusetts","Delaware","Montana"] }, \n", | |
"], id: -285212646, rootId: -285212646, totalRows: 5 } ) });\n", | |
"/*-->*/\n", | |
"\n", | |
"call_DataFrame(function() { DataFrame.renderTable(-285212646) });\n", | |
"\n", | |
"\n", | |
" </script>\n", | |
" </html>\"></iframe>\n", | |
" <script>\n", | |
" function o_resize_iframe_out_14() {\n", | |
" let elem = document.getElementById(\"iframe_out_14\");\n", | |
" resize_iframe_out_14(elem);\n", | |
" setInterval(resize_iframe_out_14, 5000, elem);\n", | |
" }\n", | |
" function resize_iframe_out_14(el) {\n", | |
" let h = el.contentWindow.document.body.scrollHeight;\n", | |
" el.height = h === 0 ? 0 : h + 41;\n", | |
" }\n", | |
" </script> <html>\n", | |
" <head>\n", | |
" <style type=\"text/css\">\n", | |
" :root {\n", | |
" --background: #fff;\n", | |
" --background-odd: #f5f5f5;\n", | |
" --background-hover: #d9edfd;\n", | |
" --header-text-color: #474747;\n", | |
" --text-color: #848484;\n", | |
" --text-color-dark: #000;\n", | |
" --text-color-medium: #737373;\n", | |
" --text-color-pale: #b3b3b3;\n", | |
" --inner-border-color: #aaa;\n", | |
" --bold-border-color: #000;\n", | |
" --link-color: #296eaa;\n", | |
" --link-color-pale: #296eaa;\n", | |
" --link-hover: #1a466c;\n", | |
"}\n", | |
"\n", | |
":root[theme=\"dark\"], :root [data-jp-theme-light=\"false\"], .dataframe_dark{\n", | |
" --background: #303030;\n", | |
" --background-odd: #3c3c3c;\n", | |
" --background-hover: #464646;\n", | |
" --header-text-color: #dddddd;\n", | |
" --text-color: #b3b3b3;\n", | |
" --text-color-dark: #dddddd;\n", | |
" --text-color-medium: #b2b2b2;\n", | |
" --text-color-pale: #737373;\n", | |
" --inner-border-color: #707070;\n", | |
" --bold-border-color: #777777;\n", | |
" --link-color: #008dc0;\n", | |
" --link-color-pale: #97e1fb;\n", | |
" --link-hover: #00688e;\n", | |
"}\n", | |
"\n", | |
"p.dataframe_description {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe {\n", | |
" font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n", | |
" font-size: 12px;\n", | |
" background-color: var(--background);\n", | |
" color: var(--text-color-dark);\n", | |
" border: none;\n", | |
" border-collapse: collapse;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th, td {\n", | |
" padding: 6px;\n", | |
" border: 1px solid transparent;\n", | |
" text-align: left;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th {\n", | |
" background-color: var(--background);\n", | |
" color: var(--header-text-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td {\n", | |
" vertical-align: top;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.bottomBorder {\n", | |
" border-bottom-color: var(--bold-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(odd) {\n", | |
" background: var(--background-odd);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(even) {\n", | |
" background: var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:hover {\n", | |
" background: var(--background-hover);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a {\n", | |
" cursor: pointer;\n", | |
" color: var(--link-color);\n", | |
" text-decoration: none;\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover > td a {\n", | |
" color: var(--link-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a:hover {\n", | |
" color: var(--link-hover);\n", | |
" text-decoration: underline;\n", | |
"}\n", | |
"\n", | |
"table.dataframe img {\n", | |
" max-width: fit-content;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.complex {\n", | |
" background-color: var(--background);\n", | |
" border: 1px solid var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .leftBorder {\n", | |
" border-left-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightBorder {\n", | |
" border-right-color: var(--inner-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .rightAlign {\n", | |
" text-align: right;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expanderSvg {\n", | |
" width: 8px;\n", | |
" height: 8px;\n", | |
" margin-right: 3px;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .expander {\n", | |
" display: flex;\n", | |
" align-items: center;\n", | |
"}\n", | |
"\n", | |
"/* formatting */\n", | |
"\n", | |
"table.dataframe .null {\n", | |
" color: var(--text-color-pale);\n", | |
"}\n", | |
"\n", | |
"table.dataframe .structural {\n", | |
" color: var(--text-color-medium);\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .dataFrameCaption {\n", | |
" font-weight: bold;\n", | |
"}\n", | |
"\n", | |
"table.dataframe .numbers {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tr:hover .formatted .structural, .null {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"\n", | |
" </style>\n", | |
" </head>\n", | |
" <body>\n", | |
" <table class=\"dataframe\" id=\"static_df_-285212645\"><thead><tr><th class=\"bottomBorder\" style=\"text-align:left\">firstName</th><th class=\"bottomBorder\" style=\"text-align:left\">address</th><th class=\"bottomBorder\" style=\"text-align:left\">city</th><th class=\"bottomBorder\" style=\"text-align:left\">state</th></tr></thead><tbody><tr><td style=\"vertical-align:top\">Evelyn</td><td style=\"vertical-align:top\">1065 Lincoln Street</td><td style=\"vertical-align:top\">Dallas</td><td style=\"vertical-align:top\">Maine</td></tr><tr><td style=\"vertical-align:top\">Daniel</td><td style=\"vertical-align:top\">1163 Pine Street</td><td style=\"vertical-align:top\">Los Angeles</td><td style=\"vertical-align:top\">Nevada</td></tr><tr><td style=\"vertical-align:top\">Lily</td><td style=\"vertical-align:top\">1946 Oak Street</td><td style=\"vertical-align:top\">Phoenix</td><td style=\"vertical-align:top\">Massachusetts</td></tr><tr><td style=\"vertical-align:top\">Henry</td><td style=\"vertical-align:top\">1837 Maple Street</td><td style=\"vertical-align:top\">Indianapolis</td><td style=\"vertical-align:top\">Delaware</td></tr><tr><td style=\"vertical-align:top\">Addison</td><td style=\"vertical-align:top\">568 Tenth Street</td><td style=\"vertical-align:top\">San Francisco</td><td style=\"vertical-align:top\">Montana</td></tr></tbody></table>\n", | |
" </body>\n", | |
" <script>\n", | |
" document.getElementById(\"static_df_-285212645\").style.display = \"none\";\n", | |
" </script>\n", | |
" </html>" | |
], | |
"application/kotlindataframe+json": "{\"$version\":\"2.0.0\",\"metadata\":{\"columns\":[\"firstName\",\"address\",\"city\",\"state\"],\"nrow\":5,\"ncol\":4},\"kotlin_dataframe\":[{\"firstName\":\"Evelyn\",\"address\":\"1065 Lincoln Street\",\"city\":\"Dallas\",\"state\":\"Maine\"},{\"firstName\":\"Daniel\",\"address\":\"1163 Pine Street\",\"city\":\"Los Angeles\",\"state\":\"Nevada\"},{\"firstName\":\"Lily\",\"address\":\"1946 Oak Street\",\"city\":\"Phoenix\",\"state\":\"Massachusetts\"},{\"firstName\":\"Henry\",\"address\":\"1837 Maple Street\",\"city\":\"Indianapolis\",\"state\":\"Delaware\"},{\"firstName\":\"Addison\",\"address\":\"568 Tenth Street\",\"city\":\"San Francisco\",\"state\":\"Montana\"}]}" | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"execution_count": 11 | |
}, | |
{ | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2024-06-26T15:40:45.027450Z", | |
"start_time": "2024-06-26T15:40:44.851607Z" | |
} | |
}, | |
"cell_type": "code", | |
"source": [ | |
"rawUserData.select {\n", | |
" cols { it.name.contains(\".+Name\".toRegex()) }\n", | |
"}.tail()" | |
], | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
" <iframe onload=\"o_resize_iframe_out_16()\" style=\"width:100%;\" class=\"result_container\" id=\"iframe_out_16\" frameBorder=\"0\" srcdoc=\" <html>\n", | |
" <head>\n", | |
" <style type="text/css">\n", | |
" :root {\n", | |
" --background: #fff;\n", | |
" --background-odd: #f5f5f5;\n", | |
" --background-hover: #d9edfd;\n", | |
" --header-text-color: #474747;\n", | |
" --text-color: #848484;\n", | |
" --text-color-dark: #000;\n", | |
" --text-color-medium: #737373;\n", | |
" --text-color-pale: #b3b3b3;\n", | |
" --inner-border-color: #aaa;\n", | |
" --bold-border-color: #000;\n", | |
" --link-color: #296eaa;\n", | |
" --link-color-pale: #296eaa;\n", | |
" --link-hover: #1a466c;\n", | |
"}\n", | |
"\n", | |
":root[theme="dark"], :root [data-jp-theme-light="false"], .dataframe_dark{\n", | |
" --background: #303030;\n", | |
" --background-odd: #3c3c3c;\n", | |
" --background-hover: #464646;\n", | |
" --header-text-color: #dddddd;\n", | |
" --text-color: #b3b3b3;\n", | |
" --text-color-dark: #dddddd;\n", | |
" --text-color-medium: #b2b2b2;\n", | |
" --text-color-pale: #737373;\n", | |
" --inner-border-color: #707070;\n", | |
" --bold-border-color: #777777;\n", | |
" --link-color: #008dc0;\n", | |
" --link-color-pale: #97e1fb;\n", | |
" --link-hover: #00688e;\n", | |
"}\n", | |
"\n", | |
"p.dataframe_description {\n", | |
" color: var(--text-color-dark);\n", | |
"}\n", | |
"\n", | |
"table.dataframe {\n", | |
" font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;\n", | |
" font-size: 12px;\n", | |
" background-color: var(--background);\n", | |
" color: var(--text-color-dark);\n", | |
" border: none;\n", | |
" border-collapse: collapse;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th, td {\n", | |
" padding: 6px;\n", | |
" border: 1px solid transparent;\n", | |
" text-align: left;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th {\n", | |
" background-color: var(--background);\n", | |
" color: var(--header-text-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe td {\n", | |
" vertical-align: top;\n", | |
"}\n", | |
"\n", | |
"table.dataframe th.bottomBorder {\n", | |
" border-bottom-color: var(--bold-border-color);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(odd) {\n", | |
" background: var(--background-odd);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:nth-child(even) {\n", | |
" background: var(--background);\n", | |
"}\n", | |
"\n", | |
"table.dataframe tbody > tr:hover {\n", | |
" background: var(--background-hover);\n", | |
"}\n", | |
"\n", | |
"table.dataframe a {\n", | |
" cursor: pointer;\n", | |
" color: var(--link-color);\n", | |
" text-decoration: none;\n", | |
"}\n", | |