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.
Files changed (100) hide show
  1. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/PKG-INFO +1 -1
  2. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/setup.py +1 -1
  3. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/kernel.py +86 -0
  4. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/MagicCommandHandler.py +9 -1
  5. jupyter_duckdb-1.2.101/src/duckdb_kernel/visualization/Plotly.py +154 -0
  6. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/visualization/__init__.py +1 -0
  7. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/jupyter_duckdb.egg-info/PKG-INFO +1 -1
  8. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/jupyter_duckdb.egg-info/SOURCES.txt +1 -0
  9. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/README.md +0 -0
  10. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/setup.cfg +0 -0
  11. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/__init__.py +0 -0
  12. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/__main__.py +0 -0
  13. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/Column.py +0 -0
  14. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/Connection.py +0 -0
  15. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/Constraint.py +0 -0
  16. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/DatabaseError.py +0 -0
  17. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/ForeignKey.py +0 -0
  18. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/Table.py +0 -0
  19. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/__init__.py +0 -0
  20. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/error/EmptyResultError.py +0 -0
  21. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/error/__init__.py +0 -0
  22. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/implementation/duckdb/Connection.py +0 -0
  23. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/implementation/duckdb/__init__.py +0 -0
  24. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/implementation/postgres/Connection.py +0 -0
  25. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/implementation/postgres/__init__.py +0 -0
  26. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/implementation/postgres/util.py +0 -0
  27. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/implementation/sqlite/Connection.py +0 -0
  28. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/db/implementation/sqlite/__init__.py +0 -0
  29. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/kernel.json +0 -0
  30. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/MagicCommand.py +0 -0
  31. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/MagicCommandCallback.py +0 -0
  32. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/MagicCommandException.py +0 -0
  33. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/StringWrapper.py +0 -0
  34. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/magics/__init__.py +0 -0
  35. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/DCParser.py +0 -0
  36. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/LogicParser.py +0 -0
  37. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/ParserError.py +0 -0
  38. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/RAParser.py +0 -0
  39. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/__init__.py +0 -0
  40. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/DCOperand.py +0 -0
  41. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/LogicElement.py +0 -0
  42. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/LogicOperand.py +0 -0
  43. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/LogicOperator.py +0 -0
  44. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/RABinaryOperator.py +0 -0
  45. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/RAElement.py +0 -0
  46. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/RAOperand.py +0 -0
  47. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/RAOperator.py +0 -0
  48. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/RAUnaryOperator.py +0 -0
  49. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/__init__.py +0 -0
  50. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Add.py +0 -0
  51. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/And.py +0 -0
  52. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/ArrowLeft.py +0 -0
  53. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/ConditionalSet.py +0 -0
  54. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Cross.py +0 -0
  55. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Difference.py +0 -0
  56. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Divide.py +0 -0
  57. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Division.py +0 -0
  58. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Equal.py +0 -0
  59. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/FullOuterJoin.py +0 -0
  60. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/GreaterThan.py +0 -0
  61. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/GreaterThanEqual.py +0 -0
  62. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Intersection.py +0 -0
  63. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Join.py +0 -0
  64. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/LeftOuterJoin.py +0 -0
  65. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/LessThan.py +0 -0
  66. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/LessThanEqual.py +0 -0
  67. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Minus.py +0 -0
  68. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Multiply.py +0 -0
  69. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Or.py +0 -0
  70. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/RightOuterJoin.py +0 -0
  71. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Unequal.py +0 -0
  72. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/Union.py +0 -0
  73. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/binary/__init__.py +0 -0
  74. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/unary/Not.py +0 -0
  75. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/unary/Projection.py +0 -0
  76. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/unary/Rename.py +0 -0
  77. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/unary/Selection.py +0 -0
  78. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/elements/unary/__init__.py +0 -0
  79. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/tokenizer/Token.py +0 -0
  80. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/tokenizer/Tokenizer.py +0 -0
  81. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/tokenizer/__init__.py +0 -0
  82. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/util/RenamableColumn.py +0 -0
  83. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/util/RenamableColumnList.py +0 -0
  84. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/parser/util/__init__.py +0 -0
  85. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/tests/__init__.py +0 -0
  86. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/tests/test_dc.py +0 -0
  87. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/tests/test_ra.py +0 -0
  88. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/tests/test_result_comparison.py +0 -0
  89. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/tests/test_sql.py +0 -0
  90. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/util/ResultSetComparator.py +0 -0
  91. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/util/SQL.py +0 -0
  92. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/util/TestError.py +0 -0
  93. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/util/__init__.py +0 -0
  94. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/util/formatting.py +0 -0
  95. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/visualization/Drawer.py +0 -0
  96. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/visualization/RATreeDrawer.py +0 -0
  97. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/duckdb_kernel/visualization/SchemaDrawer.py +0 -0
  98. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/jupyter_duckdb.egg-info/dependency_links.txt +0 -0
  99. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/jupyter_duckdb.egg-info/requires.txt +0 -0
  100. {jupyter_duckdb-1.2.100 → jupyter_duckdb-1.2.101}/src/jupyter_duckdb.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: jupyter-duckdb
3
- Version: 1.2.100
3
+ Version: 1.2.101
4
4
  Summary: a basic wrapper kernel for DuckDB
5
5
  Home-page: https://github.com/erictroebs/jupyter-duckdb
6
6
  Author: Eric Tröbs
@@ -1,7 +1,7 @@
1
1
  import os
2
2
 
3
3
  # configuration
4
- PACKAGE_VERSION = '1.2.100'
4
+ PACKAGE_VERSION = '1.2.101'
5
5
  DUCKDB_VERSION = '1.2.1'
6
6
 
7
7
  DEPENDENCIES = [
@@ -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,
@@ -1,5 +1,5 @@
1
1
  import re
2
- from typing import Dict, Tuple, List, Optional
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
+ ]
@@ -1,2 +1,3 @@
1
+ from .Plotly import *
1
2
  from .RATreeDrawer import RATreeDrawer
2
3
  from .SchemaDrawer import SchemaDrawer
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: jupyter-duckdb
3
- Version: 1.2.100
3
+ Version: 1.2.101
4
4
  Summary: a basic wrapper kernel for DuckDB
5
5
  Home-page: https://github.com/erictroebs/jupyter-duckdb
6
6
  Author: Eric Tröbs
@@ -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