jupyter-duckdb 1.2.100__tar.gz → 1.2.101__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/PKG-INFO +1 -1
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/setup.py +1 -1
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/kernel.py +86 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/MagicCommandHandler.py +9 -1
- jupyter_duckdb-1.2.101/src/duckdb_kernel/visualization/Plotly.py +154 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/visualization/__init__.py +1 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/jupyter_duckdb.egg-info/PKG-INFO +1 -1
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/jupyter_duckdb.egg-info/SOURCES.txt +1 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/README.md +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/setup.cfg +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/__main__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/Column.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/Connection.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/Constraint.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/DatabaseError.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/ForeignKey.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/Table.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/error/EmptyResultError.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/error/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/implementation/duckdb/Connection.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/implementation/duckdb/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/implementation/postgres/Connection.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/implementation/postgres/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/implementation/postgres/util.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/implementation/sqlite/Connection.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/implementation/sqlite/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/kernel.json +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/MagicCommand.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/MagicCommandCallback.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/MagicCommandException.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/StringWrapper.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/DCParser.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/LogicParser.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/ParserError.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/RAParser.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/DCOperand.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/LogicElement.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/LogicOperand.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/LogicOperator.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/RABinaryOperator.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/RAElement.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/RAOperand.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/RAOperator.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/RAUnaryOperator.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Add.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/And.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/ArrowLeft.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/ConditionalSet.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Cross.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Difference.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Divide.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Division.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Equal.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/FullOuterJoin.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/GreaterThan.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/GreaterThanEqual.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Intersection.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Join.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/LeftOuterJoin.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/LessThan.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/LessThanEqual.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Minus.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Multiply.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Or.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/RightOuterJoin.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Unequal.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Union.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/unary/Not.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/unary/Projection.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/unary/Rename.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/unary/Selection.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/unary/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/tokenizer/Token.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/tokenizer/Tokenizer.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/tokenizer/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/util/RenamableColumn.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/util/RenamableColumnList.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/util/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/tests/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/tests/test_dc.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/tests/test_ra.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/tests/test_result_comparison.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/tests/test_sql.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/util/ResultSetComparator.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/util/SQL.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/util/TestError.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/util/__init__.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/util/formatting.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/visualization/Drawer.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/visualization/RATreeDrawer.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/visualization/SchemaDrawer.py +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/jupyter_duckdb.egg-info/dependency_links.txt +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/jupyter_duckdb.egg-info/requires.txt +0 -0
- {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/jupyter_duckdb.egg-info/top_level.txt +0 -0
|
@@ -54,6 +54,8 @@ class DuckDBKernel(Kernel):
|
|
|
54
54
|
MagicCommand('all_dc').arg('value', '1').on(self._all_dc_magic),
|
|
55
55
|
MagicCommand('auto_parser').disable('sql', 'ra', 'dc').code(True).on(self._auto_parser_magic),
|
|
56
56
|
MagicCommand('guess_parser').arg('value', '1').on(self._guess_parser_magic),
|
|
57
|
+
MagicCommand('plotly').arg('type').arg('mapping').opt('title').result(True).on(self._plotly_magic),
|
|
58
|
+
MagicCommand('plotly_raw').opt('title').result(True).on(self._plotly_raw_magic)
|
|
57
59
|
)
|
|
58
60
|
|
|
59
61
|
# create placeholders for database and tests
|
|
@@ -577,6 +579,90 @@ class DuckDBKernel(Kernel):
|
|
|
577
579
|
if e.depth > 0:
|
|
578
580
|
raise e
|
|
579
581
|
|
|
582
|
+
def _plotly_magic(self, silent: bool, cols: List, rows: List[Tuple], type: str, mapping: str, title: str = None):
|
|
583
|
+
# split mapping and handle asterisks
|
|
584
|
+
mapping = [m.strip() for m in mapping.split(',')]
|
|
585
|
+
|
|
586
|
+
for i in range(len(mapping)):
|
|
587
|
+
if mapping[i] == '*':
|
|
588
|
+
mapping = mapping[:i] + cols + mapping[i+1:]
|
|
589
|
+
|
|
590
|
+
# convert all column names to lower case
|
|
591
|
+
lower_cols = [c.lower() for c in cols]
|
|
592
|
+
lower_mapping = [m.lower() for m in mapping]
|
|
593
|
+
|
|
594
|
+
# map desired columns to indices
|
|
595
|
+
mapped_indices = {}
|
|
596
|
+
for ok, lk in zip(mapping, lower_mapping):
|
|
597
|
+
for i in range(len(lower_cols)):
|
|
598
|
+
if lk == lower_cols[i]:
|
|
599
|
+
mapped_indices[ok] = i
|
|
600
|
+
break
|
|
601
|
+
else:
|
|
602
|
+
raise ValueError(f'unknown column {ok}')
|
|
603
|
+
|
|
604
|
+
# map desired columns to value lists
|
|
605
|
+
mapped_values = {
|
|
606
|
+
m: [r[i] for r in rows]
|
|
607
|
+
for m, i in mapped_indices.items()
|
|
608
|
+
}
|
|
609
|
+
mapped_keys = iter(mapped_values.keys())
|
|
610
|
+
|
|
611
|
+
# get required chart type
|
|
612
|
+
match type.lower():
|
|
613
|
+
case 'scatter':
|
|
614
|
+
if len(lower_mapping) < 2: raise ValueError('scatter requires at least x and y values')
|
|
615
|
+
html = draw_scatter_chart(title,
|
|
616
|
+
mapped_values[next(mapped_keys)],
|
|
617
|
+
**{k: mapped_values[k] for k in mapped_keys})
|
|
618
|
+
case 'line':
|
|
619
|
+
if len(lower_mapping) < 2: raise ValueError('lines requires at least x and y values')
|
|
620
|
+
html = draw_line_chart(title,
|
|
621
|
+
mapped_values[next(mapped_keys)],
|
|
622
|
+
**{k: mapped_values[k] for k in mapped_keys})
|
|
623
|
+
|
|
624
|
+
case 'bar':
|
|
625
|
+
if len(lower_mapping) < 2: raise ValueError('bar requires at least x and y values')
|
|
626
|
+
html = draw_bar_chart(title,
|
|
627
|
+
mapped_values[next(mapped_keys)],
|
|
628
|
+
**{k: mapped_values[k] for k in mapped_keys})
|
|
629
|
+
|
|
630
|
+
case 'pie':
|
|
631
|
+
if len(lower_mapping) != 2: raise ValueError('pie requires labels and values')
|
|
632
|
+
html = draw_pie_chart(title,
|
|
633
|
+
mapped_values[next(mapped_keys)],
|
|
634
|
+
mapped_values[next(mapped_keys)])
|
|
635
|
+
|
|
636
|
+
case 'bubble':
|
|
637
|
+
if len(lower_mapping) != 4: raise ValueError('bubble requires x, y, size and color')
|
|
638
|
+
html = draw_bubble_chart(title,
|
|
639
|
+
mapped_values[next(mapped_keys)],
|
|
640
|
+
mapped_values[next(mapped_keys)],
|
|
641
|
+
mapped_values[next(mapped_keys)],
|
|
642
|
+
mapped_values[next(mapped_keys)])
|
|
643
|
+
|
|
644
|
+
case 'heatmap':
|
|
645
|
+
if len(lower_mapping) != 3: raise ValueError('heatmap requires x, y and z values')
|
|
646
|
+
html = draw_heatmap_chart(title,
|
|
647
|
+
mapped_values[next(mapped_keys)],
|
|
648
|
+
mapped_values[next(mapped_keys)],
|
|
649
|
+
mapped_values[next(mapped_keys)])
|
|
650
|
+
|
|
651
|
+
case _:
|
|
652
|
+
raise ValueError(f'unknown type: {type}')
|
|
653
|
+
|
|
654
|
+
# finally print the code
|
|
655
|
+
self.print_data(html, mime='text/html')
|
|
656
|
+
|
|
657
|
+
def _plotly_raw_magic(self, silent: bool, cols: List, rows: List[Tuple], title: str = None):
|
|
658
|
+
if len(cols) != 1 and len(rows) != 1:
|
|
659
|
+
raise ValueError(f'expected exactly one column and one row')
|
|
660
|
+
|
|
661
|
+
self.print_data(
|
|
662
|
+
draw_chart(title, rows[0][0]),
|
|
663
|
+
mime='text/html'
|
|
664
|
+
)
|
|
665
|
+
|
|
580
666
|
# jupyter related functions
|
|
581
667
|
def do_execute(self, code: str, silent: bool,
|
|
582
668
|
store_history: bool = True, user_expressions: dict = None, allow_stdin: bool = False,
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/MagicCommandHandler.py
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import re
|
|
2
|
-
from typing import Dict, Tuple, List
|
|
2
|
+
from typing import Dict, Tuple, List
|
|
3
3
|
|
|
4
4
|
from . import MagicCommand, MagicCommandException, MagicCommandCallback
|
|
5
5
|
from .StringWrapper import StringWrapper
|
|
@@ -62,6 +62,11 @@ class MagicCommandHandler:
|
|
|
62
62
|
args = [group if group is not None else default
|
|
63
63
|
for group, (_, default, _) in zip(match.groups(), magic.args)]
|
|
64
64
|
|
|
65
|
+
args = [arg[1:-1]
|
|
66
|
+
if arg is not None and (arg[0] == '"' and arg[-1] == '"' or arg[0] == "'" and arg[-1] == "'")
|
|
67
|
+
else arg
|
|
68
|
+
for arg in args]
|
|
69
|
+
|
|
65
70
|
if any(arg is None for arg in args):
|
|
66
71
|
raise MagicCommandException(f'could not parse parameters for command "{command}"')
|
|
67
72
|
|
|
@@ -87,6 +92,9 @@ class MagicCommandHandler:
|
|
|
87
92
|
value = match.group(i + 2)
|
|
88
93
|
i += 3
|
|
89
94
|
|
|
95
|
+
if value is not None and (value[0] == '"' and value[-1] == '"' or value[0] == "'" and value[-1] == "'"):
|
|
96
|
+
value = value[1:-1]
|
|
97
|
+
|
|
90
98
|
if name is not None:
|
|
91
99
|
optionals[name.lower()] = value
|
|
92
100
|
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
from decimal import Decimal
|
|
2
|
+
|
|
3
|
+
PLOTLY_VERSION = '3.0.1'
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
from uuid import uuid4
|
|
7
|
+
from typing import Dict, List, Optional
|
|
8
|
+
|
|
9
|
+
__PLOTLY_INITIALIZED = False
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def __init() -> str:
|
|
13
|
+
global __PLOTLY_INITIALIZED
|
|
14
|
+
|
|
15
|
+
if not __PLOTLY_INITIALIZED:
|
|
16
|
+
__PLOTLY_INITIALIZED = True
|
|
17
|
+
return f'<script src="https://cdn.plot.ly/plotly-{PLOTLY_VERSION}.min.js"></script>'
|
|
18
|
+
else:
|
|
19
|
+
return ''
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def __div_id() -> str:
|
|
23
|
+
return f'div-{str(uuid4())}'
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def __layout(title: Optional[str]):
|
|
27
|
+
layout = {
|
|
28
|
+
'dragmode': False,
|
|
29
|
+
'xaxis': {
|
|
30
|
+
'rangeselector': {
|
|
31
|
+
'visible': False
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if title is not None:
|
|
37
|
+
layout['title'] = {
|
|
38
|
+
'text': title,
|
|
39
|
+
'font': {
|
|
40
|
+
'family': 'sans-serif',
|
|
41
|
+
'size': 32,
|
|
42
|
+
'color': 'rgb(0, 0, 0)'
|
|
43
|
+
},
|
|
44
|
+
'xanchor': 'center'
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return layout
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def __config():
|
|
51
|
+
return {
|
|
52
|
+
'displayModeBar': False,
|
|
53
|
+
'scrollZoom': False
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def __fix_decimal(x: List):
|
|
58
|
+
return [float(x) if isinstance(x, Decimal) else x
|
|
59
|
+
for x in x]
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def draw_chart(title: Optional[str], traces: List[Dict] | Dict) -> str:
|
|
63
|
+
init = __init()
|
|
64
|
+
div_id = __div_id()
|
|
65
|
+
layout = __layout(title)
|
|
66
|
+
config = __config()
|
|
67
|
+
|
|
68
|
+
if not isinstance(traces, str):
|
|
69
|
+
traces = json.dumps(traces)
|
|
70
|
+
|
|
71
|
+
return f'''
|
|
72
|
+
{init}
|
|
73
|
+
<div id="{div_id}"></div>
|
|
74
|
+
<script type="text/javascript">
|
|
75
|
+
Plotly.newPlot('{div_id}', {traces}, {json.dumps(layout)}, {json.dumps(config)});
|
|
76
|
+
</script>
|
|
77
|
+
'''
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def draw_scatter_chart(title: Optional[str], x, **ys) -> str:
|
|
81
|
+
return draw_chart(title, [
|
|
82
|
+
{
|
|
83
|
+
'x': __fix_decimal(x),
|
|
84
|
+
'y': __fix_decimal(y),
|
|
85
|
+
'mode': 'markers',
|
|
86
|
+
'type': 'scatter',
|
|
87
|
+
'name': name
|
|
88
|
+
}
|
|
89
|
+
for name, y in ys.items()
|
|
90
|
+
])
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def draw_line_chart(title: Optional[str], x, **ys) -> str:
|
|
94
|
+
return draw_chart(title, [
|
|
95
|
+
{
|
|
96
|
+
'x': __fix_decimal(x),
|
|
97
|
+
'y': __fix_decimal(y),
|
|
98
|
+
'mode': 'lines+markers',
|
|
99
|
+
'name': name
|
|
100
|
+
}
|
|
101
|
+
for name, y in ys.items()
|
|
102
|
+
])
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def draw_bar_chart(title: Optional[str], x, **ys) -> str:
|
|
106
|
+
return draw_chart(title, [
|
|
107
|
+
{
|
|
108
|
+
'x': __fix_decimal(x),
|
|
109
|
+
'y': __fix_decimal(y),
|
|
110
|
+
'type': 'bar',
|
|
111
|
+
'name': name
|
|
112
|
+
}
|
|
113
|
+
for name, y in ys.items()
|
|
114
|
+
])
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def draw_pie_chart(title: Optional[str], x, y) -> str:
|
|
118
|
+
return draw_chart(title, [{
|
|
119
|
+
'values': __fix_decimal(y),
|
|
120
|
+
'labels': __fix_decimal(x),
|
|
121
|
+
'type': 'pie'
|
|
122
|
+
}])
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def draw_bubble_chart(title: Optional[str], x, y, s, c) -> str:
|
|
126
|
+
return draw_chart(title, [{
|
|
127
|
+
'x': __fix_decimal(x),
|
|
128
|
+
'y': __fix_decimal(y),
|
|
129
|
+
'mode': 'markers',
|
|
130
|
+
'marker': {
|
|
131
|
+
'size': __fix_decimal(s),
|
|
132
|
+
'color': __fix_decimal(c)
|
|
133
|
+
}
|
|
134
|
+
}])
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def draw_heatmap_chart(title: Optional[str], x, y, z) -> str:
|
|
138
|
+
return draw_chart(title, [{
|
|
139
|
+
'x': __fix_decimal(x[0]),
|
|
140
|
+
'y': __fix_decimal(y[0]),
|
|
141
|
+
'z': [__fix_decimal(v) for v in z[0]],
|
|
142
|
+
'type': 'heatmap'
|
|
143
|
+
}])
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
__all__ = [
|
|
147
|
+
'draw_chart',
|
|
148
|
+
'draw_scatter_chart',
|
|
149
|
+
'draw_line_chart',
|
|
150
|
+
'draw_bar_chart',
|
|
151
|
+
'draw_pie_chart',
|
|
152
|
+
'draw_bubble_chart',
|
|
153
|
+
'draw_heatmap_chart',
|
|
154
|
+
]
|
|
@@ -87,6 +87,7 @@ src/duckdb_kernel/util/TestError.py
|
|
|
87
87
|
src/duckdb_kernel/util/__init__.py
|
|
88
88
|
src/duckdb_kernel/util/formatting.py
|
|
89
89
|
src/duckdb_kernel/visualization/Drawer.py
|
|
90
|
+
src/duckdb_kernel/visualization/Plotly.py
|
|
90
91
|
src/duckdb_kernel/visualization/RATreeDrawer.py
|
|
91
92
|
src/duckdb_kernel/visualization/SchemaDrawer.py
|
|
92
93
|
src/duckdb_kernel/visualization/__init__.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/error/EmptyResultError.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/MagicCommandCallback.py
RENAMED
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/MagicCommandException.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/DCOperand.py
RENAMED
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/LogicElement.py
RENAMED
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/LogicOperand.py
RENAMED
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/LogicOperator.py
RENAMED
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/RAElement.py
RENAMED
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/RAOperand.py
RENAMED
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/RAOperator.py
RENAMED
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/__init__.py
RENAMED
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Add.py
RENAMED
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/And.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Cross.py
RENAMED
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Divide.py
RENAMED
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Equal.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Join.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Minus.py
RENAMED
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Or.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Union.py
RENAMED
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/unary/Not.py
RENAMED
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/unary/Rename.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/tokenizer/Token.py
RENAMED
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/tokenizer/Tokenizer.py
RENAMED
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/tokenizer/__init__.py
RENAMED
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/util/RenamableColumn.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/tests/test_result_comparison.py
RENAMED
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/util/ResultSetComparator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/visualization/RATreeDrawer.py
RENAMED
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/visualization/SchemaDrawer.py
RENAMED
|
File without changes
|
{jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/jupyter_duckdb.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|