pointblank 0.16.0__py3-none-any.whl → 0.18.0__py3-none-any.whl

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.
pointblank/__init__.py CHANGED
@@ -20,6 +20,7 @@ from pointblank.column import (
20
20
  first_n,
21
21
  last_n,
22
22
  matches,
23
+ ref,
23
24
  starts_with,
24
25
  )
25
26
  from pointblank.datascan import DataScan, col_summary_tbl
@@ -59,6 +60,7 @@ __all__ = [
59
60
  "DataScan",
60
61
  "DraftValidation",
61
62
  "col",
63
+ "ref",
62
64
  "expr_col",
63
65
  "col_summary_tbl",
64
66
  "starts_with",
pointblank/_agg.py ADDED
@@ -0,0 +1,120 @@
1
+ from __future__ import annotations
2
+
3
+ import itertools
4
+ from collections.abc import Callable
5
+ from typing import Any
6
+
7
+ import narwhals as nw
8
+
9
+ # TODO: Should take any frame type
10
+ Aggregator = Callable[[nw.DataFrame], float | int]
11
+ Comparator = Callable[[Any, Any, Any], bool]
12
+
13
+ AGGREGATOR_REGISTRY: dict[str, Aggregator] = {}
14
+
15
+ COMPARATOR_REGISTRY: dict[str, Comparator] = {}
16
+
17
+
18
+ def register(fn):
19
+ """Register an aggregator or comparator function."""
20
+ name: str = fn.__name__
21
+ if name.startswith("comp_"):
22
+ COMPARATOR_REGISTRY[name.removeprefix("comp_")] = fn
23
+ elif name.startswith("agg_"):
24
+ AGGREGATOR_REGISTRY[name.removeprefix("agg_")] = fn
25
+ else:
26
+ raise NotImplementedError # pragma: no cover
27
+ return fn
28
+
29
+
30
+ ## Aggregator Functions
31
+ @register
32
+ def agg_sum(column: nw.DataFrame) -> float:
33
+ return column.select(nw.all().sum()).item()
34
+
35
+
36
+ @register
37
+ def agg_avg(column: nw.DataFrame) -> float:
38
+ return column.select(nw.all().mean()).item()
39
+
40
+
41
+ @register
42
+ def agg_sd(column: nw.DataFrame) -> float:
43
+ return column.select(nw.all().std()).item()
44
+
45
+
46
+ ## Comparator functions:
47
+ @register
48
+ def comp_eq(real: float, lower: float, upper: float) -> bool:
49
+ if lower == upper:
50
+ return bool(real == lower)
51
+ return _generic_between(real, lower, upper)
52
+
53
+
54
+ @register
55
+ def comp_gt(real: float, lower: float, upper: float) -> bool:
56
+ return bool(real > lower)
57
+
58
+
59
+ @register
60
+ def comp_ge(real: Any, lower: float, upper: float) -> bool:
61
+ return bool(real >= lower)
62
+
63
+
64
+ @register
65
+ def comp_lt(real: float, lower: float, upper: float) -> bool:
66
+ return bool(real < upper)
67
+
68
+
69
+ @register
70
+ def comp_le(real: float, lower: float, upper: float) -> bool:
71
+ return bool(real <= upper)
72
+
73
+
74
+ def _generic_between(real: Any, lower: Any, upper: Any) -> bool:
75
+ """Call if comparator needs to check between two values."""
76
+ return bool(lower <= real <= upper)
77
+
78
+
79
+ def resolve_agg_registries(name: str) -> tuple[Aggregator, Comparator]:
80
+ """Resolve the assertion name to a valid aggregator
81
+
82
+ Args:
83
+ name (str): The name of the assertion.
84
+
85
+ Returns:
86
+ tuple[Aggregator, Comparator]: The aggregator and comparator functions.
87
+ """
88
+ name = name.removeprefix("col_")
89
+ agg_name, comp_name = name.split("_")[-2:]
90
+
91
+ aggregator = AGGREGATOR_REGISTRY.get(agg_name)
92
+ comparator = COMPARATOR_REGISTRY.get(comp_name)
93
+
94
+ if aggregator is None: # pragma: no cover
95
+ raise ValueError(f"Aggregator '{agg_name}' not found in registry.")
96
+
97
+ if comparator is None: # pragma: no cover
98
+ raise ValueError(f"Comparator '{comp_name}' not found in registry.")
99
+
100
+ return aggregator, comparator
101
+
102
+
103
+ def is_valid_agg(name: str) -> bool:
104
+ try:
105
+ resolve_agg_registries(name)
106
+ return True
107
+ except ValueError:
108
+ return False
109
+
110
+
111
+ def load_validation_method_grid() -> tuple[str, ...]:
112
+ """Generate all possible validation methods."""
113
+ methods = []
114
+ for agg_name, comp_name in itertools.product(
115
+ AGGREGATOR_REGISTRY.keys(), COMPARATOR_REGISTRY.keys()
116
+ ):
117
+ method = f"col_{agg_name}_{comp_name}"
118
+ methods.append(method)
119
+
120
+ return tuple(methods)
pointblank/_constants.py CHANGED
@@ -23,7 +23,8 @@ COMPATIBLE_DTYPES = {
23
23
  "not_null": ["str", "numeric", "bool", "datetime", "duration"],
24
24
  }
25
25
 
26
- ASSERTION_TYPE_METHOD_MAP = {
26
+ ASSERTION_TYPE_METHOD_MAP: dict[str, str] = {
27
+ "col_pct_null": "pct_null",
27
28
  "col_vals_gt": "gt",
28
29
  "col_vals_lt": "lt",
29
30
  "col_vals_eq": "eq",
@@ -51,6 +52,7 @@ ASSERTION_TYPE_METHOD_MAP = {
51
52
  "tbl_match": "tbl_match",
52
53
  "conjointly": "conjointly",
53
54
  "specially": "specially",
55
+ "col_sum_eq": "sum_eq",
54
56
  }
55
57
 
56
58
  COMPARISON_OPERATORS = {
@@ -219,7 +221,49 @@ LOG_LEVELS_MAP = {"warning": 30, "error": 40, "critical": 50}
219
221
  CHECK_MARK_SPAN = "<span style='color: #4CA64C;'>&check;</span>"
220
222
  CROSS_MARK_SPAN = "<span style='color: #CF142B;'>&cross;</span>"
221
223
 
222
- SVG_ICONS_FOR_ASSERTION_TYPES = {
224
+ SVG_ICONS_FOR_ASSERTION_TYPES: dict[str, str] = {
225
+ ## EQ Icons
226
+ "col_vals_eq": """<?xml version="1.0" encoding="UTF-8"?>
227
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
228
+ <title>col_vals_eq</title>
229
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
230
+ <g id="col_vals_eq" transform="translate(0.000000, 0.275862)">
231
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
232
+ <path d="M52.712234,11 L14.712234,11 C13.05989,11 11.712234,12.347656 11.712234,14 L11.712234,52 C11.712234,53.652344 13.05989,55 14.712234,55 L52.712234,55 C54.364578,55 55.712234,53.652344 55.712234,52 L55.712234,14 C55.712234,12.347656 54.364578,11 52.712234,11 Z M46.712234,38 L20.712234,38 L20.712234,36 L46.712234,36 L46.712234,38 Z M46.712234,30 L20.712234,30 L20.712234,28 L46.712234,28 L46.712234,30 Z" id="equals" fill="#000000" fill-rule="nonzero"></path>
233
+ </g>
234
+ </g>
235
+ </svg>""",
236
+ "col_sum_eq": """<?xml version="1.0" encoding="UTF-8"?>
237
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
238
+ <title>col_vals_gt</title>
239
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
240
+ <g id="col_vals_gt" transform="translate(0.000000, 0.724138)">
241
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
242
+ <path d="M49.7099609,12 L17.7099609,12 C14.9499609,12 12.7099609,14.24 12.7099609,17 L12.7099609,49 C12.7099609,51.76 14.9499609,54 17.7099609,54 L49.7099609,54 C52.4699609,54 54.7099609,51.76 54.7099609,49 L54.7099609,17 C54.7099609,14.24 52.4699609,12 49.7099609,12 Z M27.2799609,44.82 L26.1399609,43.18 L40.9499609,33 L26.1399609,22.82 L27.2799609,21.18 L44.4799609,33 L27.2799609,44.82 Z" id="greater_than" fill="#000000" fill-rule="nonzero"></path>
243
+ </g>
244
+ </g>
245
+ </svg>""",
246
+ "col_sd_eq": """<?xml version="1.0" encoding="UTF-8"?>
247
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
248
+ <title>col_vals_gt</title>
249
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
250
+ <g id="col_vals_gt" transform="translate(0.000000, 0.724138)">
251
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
252
+ <path d="M49.7099609,12 L17.7099609,12 C14.9499609,12 12.7099609,14.24 12.7099609,17 L12.7099609,49 C12.7099609,51.76 14.9499609,54 17.7099609,54 L49.7099609,54 C52.4699609,54 54.7099609,51.76 54.7099609,49 L54.7099609,17 C54.7099609,14.24 52.4699609,12 49.7099609,12 Z M27.2799609,44.82 L26.1399609,43.18 L40.9499609,33 L26.1399609,22.82 L27.2799609,21.18 L44.4799609,33 L27.2799609,44.82 Z" id="greater_than" fill="#000000" fill-rule="nonzero"></path>
253
+ </g>
254
+ </g>
255
+ </svg>""",
256
+ "col_avg_eq": """<?xml version="1.0" encoding="UTF-8"?>
257
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
258
+ <title>col_vals_gt</title>
259
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
260
+ <g id="col_vals_gt" transform="translate(0.000000, 0.724138)">
261
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
262
+ <path d="M49.7099609,12 L17.7099609,12 C14.9499609,12 12.7099609,14.24 12.7099609,17 L12.7099609,49 C12.7099609,51.76 14.9499609,54 17.7099609,54 L49.7099609,54 C52.4699609,54 54.7099609,51.76 54.7099609,49 L54.7099609,17 C54.7099609,14.24 52.4699609,12 49.7099609,12 Z M27.2799609,44.82 L26.1399609,43.18 L40.9499609,33 L26.1399609,22.82 L27.2799609,21.18 L44.4799609,33 L27.2799609,44.82 Z" id="greater_than" fill="#000000" fill-rule="nonzero"></path>
263
+ </g>
264
+ </g>
265
+ </svg>""",
266
+ ## GT Icons
223
267
  "col_vals_gt": """<?xml version="1.0" encoding="UTF-8"?>
224
268
  <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
225
269
  <title>col_vals_gt</title>
@@ -230,6 +274,37 @@ SVG_ICONS_FOR_ASSERTION_TYPES = {
230
274
  </g>
231
275
  </g>
232
276
  </svg>""",
277
+ "col_sum_gt": """<?xml version="1.0" encoding="UTF-8"?>
278
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
279
+ <title>col_vals_gt</title>
280
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
281
+ <g id="col_vals_gt" transform="translate(0.000000, 0.724138)">
282
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
283
+ <path d="M49.7099609,12 L17.7099609,12 C14.9499609,12 12.7099609,14.24 12.7099609,17 L12.7099609,49 C12.7099609,51.76 14.9499609,54 17.7099609,54 L49.7099609,54 C52.4699609,54 54.7099609,51.76 54.7099609,49 L54.7099609,17 C54.7099609,14.24 52.4699609,12 49.7099609,12 Z M27.2799609,44.82 L26.1399609,43.18 L40.9499609,33 L26.1399609,22.82 L27.2799609,21.18 L44.4799609,33 L27.2799609,44.82 Z" id="greater_than" fill="#000000" fill-rule="nonzero"></path>
284
+ </g>
285
+ </g>
286
+ </svg>""",
287
+ "col_sd_gt": """<?xml version="1.0" encoding="UTF-8"?>
288
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
289
+ <title>col_vals_gt</title>
290
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
291
+ <g id="col_vals_gt" transform="translate(0.000000, 0.724138)">
292
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
293
+ <path d="M49.7099609,12 L17.7099609,12 C14.9499609,12 12.7099609,14.24 12.7099609,17 L12.7099609,49 C12.7099609,51.76 14.9499609,54 17.7099609,54 L49.7099609,54 C52.4699609,54 54.7099609,51.76 54.7099609,49 L54.7099609,17 C54.7099609,14.24 52.4699609,12 49.7099609,12 Z M27.2799609,44.82 L26.1399609,43.18 L40.9499609,33 L26.1399609,22.82 L27.2799609,21.18 L44.4799609,33 L27.2799609,44.82 Z" id="greater_than" fill="#000000" fill-rule="nonzero"></path>
294
+ </g>
295
+ </g>
296
+ </svg>""",
297
+ "col_avg_gt": """<?xml version="1.0" encoding="UTF-8"?>
298
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
299
+ <title>col_vals_gt</title>
300
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
301
+ <g id="col_vals_gt" transform="translate(0.000000, 0.724138)">
302
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
303
+ <path d="M49.7099609,12 L17.7099609,12 C14.9499609,12 12.7099609,14.24 12.7099609,17 L12.7099609,49 C12.7099609,51.76 14.9499609,54 17.7099609,54 L49.7099609,54 C52.4699609,54 54.7099609,51.76 54.7099609,49 L54.7099609,17 C54.7099609,14.24 52.4699609,12 49.7099609,12 Z M27.2799609,44.82 L26.1399609,43.18 L40.9499609,33 L26.1399609,22.82 L27.2799609,21.18 L44.4799609,33 L27.2799609,44.82 Z" id="greater_than" fill="#000000" fill-rule="nonzero"></path>
304
+ </g>
305
+ </g>
306
+ </svg>""",
307
+ ## LT Icons
233
308
  "col_vals_lt": """<?xml version="1.0" encoding="UTF-8"?>
234
309
  <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
235
310
  <title>col_vals_lt</title>
@@ -240,16 +315,37 @@ SVG_ICONS_FOR_ASSERTION_TYPES = {
240
315
  </g>
241
316
  </g>
242
317
  </svg>""",
243
- "col_vals_eq": """<?xml version="1.0" encoding="UTF-8"?>
318
+ "col_sum_lt": """<?xml version="1.0" encoding="UTF-8"?>
244
319
  <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
245
- <title>col_vals_eq</title>
320
+ <title>col_vals_lt</title>
246
321
  <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
247
- <g id="col_vals_eq" transform="translate(0.000000, 0.275862)">
322
+ <g id="col_vals_lt" transform="translate(0.000000, 0.310345)">
248
323
  <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
249
- <path d="M52.712234,11 L14.712234,11 C13.05989,11 11.712234,12.347656 11.712234,14 L11.712234,52 C11.712234,53.652344 13.05989,55 14.712234,55 L52.712234,55 C54.364578,55 55.712234,53.652344 55.712234,52 L55.712234,14 C55.712234,12.347656 54.364578,11 52.712234,11 Z M46.712234,38 L20.712234,38 L20.712234,36 L46.712234,36 L46.712234,38 Z M46.712234,30 L20.712234,30 L20.712234,28 L46.712234,28 L46.712234,30 Z" id="equals" fill="#000000" fill-rule="nonzero"></path>
324
+ <path d="M52.712234,11 L14.712234,11 C13.05989,11 11.712234,12.347656 11.712234,14 L11.712234,52 C11.712234,53.652344 13.05989,55 14.712234,55 L52.712234,55 C54.364578,55 55.712234,53.652344 55.712234,52 L55.712234,14 C55.712234,12.347656 54.364578,11 52.712234,11 Z M40.419265,46.292969 L39.005203,47.707031 L24.298172,33 L39.005203,18.292969 L40.419265,19.707031 L27.126297,33 L40.419265,46.292969 Z" id="less_than" fill="#000000" fill-rule="nonzero"></path>
325
+ </g>
326
+ </g>
327
+ </svg>""",
328
+ "col_sd_lt": """<?xml version="1.0" encoding="UTF-8"?>
329
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
330
+ <title>col_vals_lt</title>
331
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
332
+ <g id="col_vals_lt" transform="translate(0.000000, 0.310345)">
333
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
334
+ <path d="M52.712234,11 L14.712234,11 C13.05989,11 11.712234,12.347656 11.712234,14 L11.712234,52 C11.712234,53.652344 13.05989,55 14.712234,55 L52.712234,55 C54.364578,55 55.712234,53.652344 55.712234,52 L55.712234,14 C55.712234,12.347656 54.364578,11 52.712234,11 Z M40.419265,46.292969 L39.005203,47.707031 L24.298172,33 L39.005203,18.292969 L40.419265,19.707031 L27.126297,33 L40.419265,46.292969 Z" id="less_than" fill="#000000" fill-rule="nonzero"></path>
335
+ </g>
336
+ </g>
337
+ </svg>""",
338
+ "col_avg_lt": """<?xml version="1.0" encoding="UTF-8"?>
339
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
340
+ <title>col_vals_lt</title>
341
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
342
+ <g id="col_vals_lt" transform="translate(0.000000, 0.310345)">
343
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
344
+ <path d="M52.712234,11 L14.712234,11 C13.05989,11 11.712234,12.347656 11.712234,14 L11.712234,52 C11.712234,53.652344 13.05989,55 14.712234,55 L52.712234,55 C54.364578,55 55.712234,53.652344 55.712234,52 L55.712234,14 C55.712234,12.347656 54.364578,11 52.712234,11 Z M40.419265,46.292969 L39.005203,47.707031 L24.298172,33 L39.005203,18.292969 L40.419265,19.707031 L27.126297,33 L40.419265,46.292969 Z" id="less_than" fill="#000000" fill-rule="nonzero"></path>
250
345
  </g>
251
346
  </g>
252
347
  </svg>""",
348
+ ## NE Icons
253
349
  "col_vals_ne": """<?xml version="1.0" encoding="UTF-8"?>
254
350
  <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
255
351
  <title>col_vals_ne</title>
@@ -260,6 +356,37 @@ SVG_ICONS_FOR_ASSERTION_TYPES = {
260
356
  </g>
261
357
  </g>
262
358
  </svg>""",
359
+ "col_sum_ne": """<?xml version="1.0" encoding="UTF-8"?>
360
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
361
+ <title>col_vals_ne</title>
362
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
363
+ <g id="col_vals_ne" transform="translate(0.000000, 0.758621)">
364
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
365
+ <path d="M53.712234,12 L13.712234,12 C13.161453,12 12.712234,12.449219 12.712234,13 L12.712234,53 C12.712234,53.550781 13.161453,54 13.712234,54 L53.712234,54 C54.263015,54 54.712234,53.550781 54.712234,53 L54.712234,13 C54.712234,12.449219 54.263015,12 53.712234,12 Z M46.712234,30 L32.989578,30 L36.805984,36 L46.712234,36 L46.712234,38 L38.079422,38 L43.169265,46 L40.798172,46 L35.708328,38 L20.712234,38 L20.712234,36 L34.43489,36 L30.618484,30 L20.712234,30 L20.712234,28 L29.345047,28 L24.251297,20 L26.62239,20 L31.71614,28 L46.712234,28 L46.712234,30 Z" id="not_equal" fill="#000000" fill-rule="nonzero"></path>
366
+ </g>
367
+ </g>
368
+ </svg>""",
369
+ "col_sd_ne": """<?xml version="1.0" encoding="UTF-8"?>
370
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
371
+ <title>col_vals_ne</title>
372
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
373
+ <g id="col_vals_ne" transform="translate(0.000000, 0.758621)">
374
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
375
+ <path d="M53.712234,12 L13.712234,12 C13.161453,12 12.712234,12.449219 12.712234,13 L12.712234,53 C12.712234,53.550781 13.161453,54 13.712234,54 L53.712234,54 C54.263015,54 54.712234,53.550781 54.712234,53 L54.712234,13 C54.712234,12.449219 54.263015,12 53.712234,12 Z M46.712234,30 L32.989578,30 L36.805984,36 L46.712234,36 L46.712234,38 L38.079422,38 L43.169265,46 L40.798172,46 L35.708328,38 L20.712234,38 L20.712234,36 L34.43489,36 L30.618484,30 L20.712234,30 L20.712234,28 L29.345047,28 L24.251297,20 L26.62239,20 L31.71614,28 L46.712234,28 L46.712234,30 Z" id="not_equal" fill="#000000" fill-rule="nonzero"></path>
376
+ </g>
377
+ </g>
378
+ </svg>""",
379
+ "col_avg_ne": """<?xml version="1.0" encoding="UTF-8"?>
380
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
381
+ <title>col_vals_ne</title>
382
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
383
+ <g id="col_vals_ne" transform="translate(0.000000, 0.758621)">
384
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
385
+ <path d="M53.712234,12 L13.712234,12 C13.161453,12 12.712234,12.449219 12.712234,13 L12.712234,53 C12.712234,53.550781 13.161453,54 13.712234,54 L53.712234,54 C54.263015,54 54.712234,53.550781 54.712234,53 L54.712234,13 C54.712234,12.449219 54.263015,12 53.712234,12 Z M46.712234,30 L32.989578,30 L36.805984,36 L46.712234,36 L46.712234,38 L38.079422,38 L43.169265,46 L40.798172,46 L35.708328,38 L20.712234,38 L20.712234,36 L34.43489,36 L30.618484,30 L20.712234,30 L20.712234,28 L29.345047,28 L24.251297,20 L26.62239,20 L31.71614,28 L46.712234,28 L46.712234,30 Z" id="not_equal" fill="#000000" fill-rule="nonzero"></path>
386
+ </g>
387
+ </g>
388
+ </svg>""",
389
+ ## GE Icons
263
390
  "col_vals_ge": """<?xml version="1.0" encoding="UTF-8"?>
264
391
  <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
265
392
  <title>col_vals_ge</title>
@@ -270,6 +397,37 @@ SVG_ICONS_FOR_ASSERTION_TYPES = {
270
397
  </g>
271
398
  </g>
272
399
  </svg>""",
400
+ "col_sum_ge": """<?xml version="1.0" encoding="UTF-8"?>
401
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
402
+ <title>col_vals_ge</title>
403
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
404
+ <g id="col_vals_ge" transform="translate(0.000000, 0.241379)">
405
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
406
+ <path d="M49.712234,12 L17.712234,12 C14.952234,12 12.712234,14.24 12.712234,17 L12.712234,49 C12.712234,51.76 14.952234,54 17.712234,54 L49.712234,54 C52.472234,54 54.712234,51.76 54.712234,49 L54.712234,17 C54.712234,14.24 52.472234,12 49.712234,12 Z M44.712234,47 L22.712234,47 L22.712234,45 L44.712234,45 L44.712234,47 Z M24.182234,40.88 L23.242234,39.12 L40.562234,30 L23.242234,20.88 L24.182234,19.12 L44.862234,30 L24.182234,40.88 Z" id="greater_than_equal" fill="#000000" fill-rule="nonzero"></path>
407
+ </g>
408
+ </g>
409
+ </svg>""",
410
+ "col_sd_ge": """<?xml version="1.0" encoding="UTF-8"?>
411
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
412
+ <title>col_vals_ge</title>
413
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
414
+ <g id="col_vals_ge" transform="translate(0.000000, 0.241379)">
415
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
416
+ <path d="M49.712234,12 L17.712234,12 C14.952234,12 12.712234,14.24 12.712234,17 L12.712234,49 C12.712234,51.76 14.952234,54 17.712234,54 L49.712234,54 C52.472234,54 54.712234,51.76 54.712234,49 L54.712234,17 C54.712234,14.24 52.472234,12 49.712234,12 Z M44.712234,47 L22.712234,47 L22.712234,45 L44.712234,45 L44.712234,47 Z M24.182234,40.88 L23.242234,39.12 L40.562234,30 L23.242234,20.88 L24.182234,19.12 L44.862234,30 L24.182234,40.88 Z" id="greater_than_equal" fill="#000000" fill-rule="nonzero"></path>
417
+ </g>
418
+ </g>
419
+ </svg>""",
420
+ "col_avg_ge": """<?xml version="1.0" encoding="UTF-8"?>
421
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
422
+ <title>col_vals_ge</title>
423
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
424
+ <g id="col_vals_ge" transform="translate(0.000000, 0.241379)">
425
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
426
+ <path d="M49.712234,12 L17.712234,12 C14.952234,12 12.712234,14.24 12.712234,17 L12.712234,49 C12.712234,51.76 14.952234,54 17.712234,54 L49.712234,54 C52.472234,54 54.712234,51.76 54.712234,49 L54.712234,17 C54.712234,14.24 52.472234,12 49.712234,12 Z M44.712234,47 L22.712234,47 L22.712234,45 L44.712234,45 L44.712234,47 Z M24.182234,40.88 L23.242234,39.12 L40.562234,30 L23.242234,20.88 L24.182234,19.12 L44.862234,30 L24.182234,40.88 Z" id="greater_than_equal" fill="#000000" fill-rule="nonzero"></path>
427
+ </g>
428
+ </g>
429
+ </svg>""",
430
+ ## LE Icons
273
431
  "col_vals_le": """<?xml version="1.0" encoding="UTF-8"?>
274
432
  <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
275
433
  <title>col_vals_le</title>
@@ -279,6 +437,36 @@ SVG_ICONS_FOR_ASSERTION_TYPES = {
279
437
  <path d="M53.712234,12 L13.712234,12 C13.157547,12 12.712234,12.449219 12.712234,13 L12.712234,53 C12.712234,53.550781 13.157547,54 13.712234,54 L53.712234,54 C54.266922,54 54.712234,53.550781 54.712234,53 L54.712234,13 C54.712234,12.449219 54.266922,12 53.712234,12 Z M42.227859,19.125 L43.196609,20.875 L26.770828,30 L43.196609,39.125 L42.227859,40.875 L22.65364,30 L42.227859,19.125 Z M44.712234,47 L22.712234,47 L22.712234,45 L44.712234,45 L44.712234,47 Z" id="less_than_equal" fill="#000000" fill-rule="nonzero"></path>
280
438
  </g>
281
439
  </g>
440
+ </svg>""",
441
+ "col_sum_le": """<?xml version="1.0" encoding="UTF-8"?>
442
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
443
+ <title>col_vals_le</title>
444
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
445
+ <g id="col_vals_le" transform="translate(0.000000, 0.793103)">
446
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
447
+ <path d="M53.712234,12 L13.712234,12 C13.157547,12 12.712234,12.449219 12.712234,13 L12.712234,53 C12.712234,53.550781 13.157547,54 13.712234,54 L53.712234,54 C54.266922,54 54.712234,53.550781 54.712234,53 L54.712234,13 C54.712234,12.449219 54.266922,12 53.712234,12 Z M42.227859,19.125 L43.196609,20.875 L26.770828,30 L43.196609,39.125 L42.227859,40.875 L22.65364,30 L42.227859,19.125 Z M44.712234,47 L22.712234,47 L22.712234,45 L44.712234,45 L44.712234,47 Z" id="less_than_equal" fill="#000000" fill-rule="nonzero"></path>
448
+ </g>
449
+ </g>
450
+ </svg>""",
451
+ "col_sd_le": """<?xml version="1.0" encoding="UTF-8"?>
452
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
453
+ <title>col_vals_le</title>
454
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
455
+ <g id="col_vals_le" transform="translate(0.000000, 0.793103)">
456
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
457
+ <path d="M53.712234,12 L13.712234,12 C13.157547,12 12.712234,12.449219 12.712234,13 L12.712234,53 C12.712234,53.550781 13.157547,54 13.712234,54 L53.712234,54 C54.266922,54 54.712234,53.550781 54.712234,53 L54.712234,13 C54.712234,12.449219 54.266922,12 53.712234,12 Z M42.227859,19.125 L43.196609,20.875 L26.770828,30 L43.196609,39.125 L42.227859,40.875 L22.65364,30 L42.227859,19.125 Z M44.712234,47 L22.712234,47 L22.712234,45 L44.712234,45 L44.712234,47 Z" id="less_than_equal" fill="#000000" fill-rule="nonzero"></path>
458
+ </g>
459
+ </g>
460
+ </svg>""",
461
+ "col_avg_le": """<?xml version="1.0" encoding="UTF-8"?>
462
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
463
+ <title>col_vals_le</title>
464
+ <g id="All-Icons" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
465
+ <g id="col_vals_le" transform="translate(0.000000, 0.793103)">
466
+ <path d="M56.712234,1 C59.1975153,1 61.4475153,2.00735931 63.076195,3.63603897 C64.7048747,5.26471863 65.712234,7.51471863 65.712234,10 L65.712234,10 L65.712234,65 L10.712234,65 C8.22695259,65 5.97695259,63.9926407 4.34827294,62.363961 C2.71959328,60.7352814 1.71223397,58.4852814 1.71223397,56 L1.71223397,56 L1.71223397,10 C1.71223397,7.51471863 2.71959328,5.26471863 4.34827294,3.63603897 C5.97695259,2.00735931 8.22695259,1 10.712234,1 L10.712234,1 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
467
+ <path d="M53.712234,12 L13.712234,12 C13.157547,12 12.712234,12.449219 12.712234,13 L12.712234,53 C12.712234,53.550781 13.157547,54 13.712234,54 L53.712234,54 C54.266922,54 54.712234,53.550781 54.712234,53 L54.712234,13 C54.712234,12.449219 54.266922,12 53.712234,12 Z M42.227859,19.125 L43.196609,20.875 L26.770828,30 L43.196609,39.125 L42.227859,40.875 L22.65364,30 L42.227859,19.125 Z M44.712234,47 L22.712234,47 L22.712234,45 L44.712234,45 L44.712234,47 Z" id="less_than_equal" fill="#000000" fill-rule="nonzero"></path>
468
+ </g>
469
+ </g>
282
470
  </svg>""",
283
471
  "col_vals_between": """<?xml version="1.0" encoding="UTF-8"?>
284
472
  <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
@@ -359,6 +547,19 @@ SVG_ICONS_FOR_ASSERTION_TYPES = {
359
547
  <path d="M40.6120891,47.0378516 C37.4692395,47.0378516 35.0126155,45.9348776 33.712234,44.0140735 C32.4118524,45.9348776 29.9552284,47.0378516 26.8123796,47.0378516 C22.6574258,47.0378516 16.0646491,43.4437854 16.0646491,33.802163 C16.0646491,29.3401315 17.4715675,18.9621484 30.5035822,18.9621484 C30.9453983,18.9621484 31.3057451,19.3224952 31.3057451,19.7643113 L31.3057451,21.3686372 C31.3057451,21.8104533 30.9453983,22.1708002 30.5035822,22.1708002 C26.6400397,22.1708002 22.4819527,25.8118683 22.4819527,33.802163 C22.4819527,37.5090333 23.7635331,43.0270369 27.2949304,43.0270369 C29.7954231,43.0270369 31.2242758,40.4231405 32.0985075,38.2861287 C30.5067154,35.6101628 29.7014192,33.1034036 29.7014192,30.8347865 C29.7014192,25.6238614 31.8603654,23.7751261 33.712234,23.7751261 C35.5641025,23.7751261 37.7230487,25.6238614 37.7230487,30.8347865 C37.7230487,33.1347385 36.9396869,35.5788287 35.3290937,38.2861287 C36.6294752,41.4321115 38.2432017,43.0270369 40.1295376,43.0270369 C43.6609348,43.0270369 44.9425153,37.5090333 44.9425153,33.802163 C44.9425153,25.8118683 40.7844282,22.1708002 36.9208858,22.1708002 C36.4759364,22.1708002 36.1187228,21.8104533 36.1187228,21.3686372 L36.1187228,19.7643113 C36.1187228,19.3224952 36.4759364,18.9621484 36.9208858,18.9621484 C49.9529005,18.9621484 51.3598189,29.3401315 51.3598189,33.802163 C51.3598189,43.4437854 44.7670421,47.0378516 40.6120891,47.0378516 Z" id="omega" fill="#000000" fill-rule="nonzero"></path>
360
548
  </g>
361
549
  </g>
550
+ </svg>""",
551
+ "col_pct_null": """<?xml version="1.0" encoding="UTF-8"?>
552
+ <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="background: #FFFFFF;">
553
+ <title>pct_null</title>
554
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
555
+ <g id="col_vals_null" transform="translate(1.000000, 1.581717)" fill-rule="nonzero">
556
+ <path d="M55,0 C57.4852813,0 59.7352813,1.00735931 61.363961,2.63603897 C62.9926407,4.26471863 64,6.51471863 64,9 L64,9 L64,64 L9,64 C6.51471862,64 4.26471862,62.9926407 2.63603897,61.363961 C1.00735931,59.7352814 0,57.4852814 0,55 L0,55 L0,9 C0,6.51471863 1.00735931,4.26471863 2.63603897,2.63603897 C4.26471862,1.00735931 6.51471862,0 9,0 L9,0 L55,0 Z" id="rectangle" stroke="#000000" stroke-width="2" fill="#FFFFFF"></path>
557
+ <path d="M45.4146228,41.5 C43.2877254,41.5 41.6252254,40.7535715 40.745203,39.4536832 C39.8651805,40.7535715 38.2026805,41.5 36.0757835,41.5 C33.2639529,41.5 28.8023458,39.0677454 28.8023458,32.5428572 C28.8023458,29.5232143 29.7544662,22.5 38.5737744,22.5 C38.8727698,22.5 39.1166315,22.7438617 39.1166315,23.0428571 L39.1166315,24.1285714 C39.1166315,24.4275668 38.8727698,24.6714286 38.5737744,24.6714286 C35.9591539,24.6714286 33.1452029,27.1354913 33.1452029,32.5428572 C33.1452029,35.051451 34.0125019,38.7857143 36.4023458,38.7857143 C38.0945336,38.7857143 39.0614978,37.023549 39.6531269,35.5773439 C38.5758948,33.7664061 38.0309172,32.0699775 38.0309172,30.5347097 C38.0309172,27.0082592 39.4919662,25.7571429 40.745203,25.7571429 C41.9984397,25.7571429 43.4594886,27.0082592 43.4594886,30.5347097 C43.4594886,32.0911832 42.929355,33.745201 41.8393994,35.5773439 C42.7194218,37.7063617 43.8114979,38.7857143 45.0880601,38.7857143 C47.477904,38.7857143 48.345203,35.051451 48.345203,32.5428572 C48.345203,27.1354913 45.5312519,24.6714286 42.9166315,24.6714286 C42.6155157,24.6714286 42.3737744,24.4275668 42.3737744,24.1285714 L42.3737744,23.0428571 C42.3737744,22.7438617 42.6155157,22.5 42.9166315,22.5 C51.7359397,22.5 52.6880601,29.5232143 52.6880601,32.5428572 C52.6880601,39.0677454 48.2264529,41.5 45.4146228,41.5 Z" id="omega" fill="#000000"></path>
558
+ <g id="percent" transform="translate(11.268508, 23.854373)" fill="#000000">
559
+ <path d="M1.89920553,17.2037988 C1.78720553,17.1237988 1.664,17.0296274 1.584,16.8936274 C1.504,16.7576274 1.464,16.6096274 1.464,16.4496274 C1.464,16.2416274 1.536,16.0336274 1.68,15.8256274 L12.24,0.489627434 C12.432,0.185627434 12.5942662,0 12.9462662,0 C13.1542662,0 13.472,0.089627434 13.68,0.201627434 C14.048,0.425627434 14.232,0.681627434 14.232,0.969627434 C14.232,1.14562743 14.16,1.34562743 14.016,1.56962743 L3.432,16.9776274 C3.176,17.2816274 2.88,17.4336274 2.544,17.4336274 C2.336,17.4336274 2.13920553,17.3477988 1.89920553,17.2037988 Z M3.864,7.47362743 C3.176,7.47362743 2.536,7.30562743 1.944,6.96962743 C1.352,6.63362743 0.88,6.18162743 0.528,5.61362743 C0.176,5.04562743 0,4.42562743 0,3.75362743 C0,3.08162743 0.172,2.46162743 0.516,1.89362743 C0.86,1.32562743 1.328,0.877627434 1.92,0.549627434 C2.512,0.221627434 3.16,0.057627434 3.864,0.057627434 C4.568,0.057627434 5.216,0.221627434 5.808,0.549627434 C6.4,0.877627434 6.864,1.32562743 7.2,1.89362743 C7.536,2.46162743 7.704,3.08162743 7.704,3.75362743 C7.704,4.42562743 7.532,5.04562743 7.188,5.61362743 C6.844,6.18162743 6.38,6.63362743 5.796,6.96962743 C5.212,7.30562743 4.568,7.47362743 3.864,7.47362743 Z M3.864,5.69762743 C4.408,5.69762743 4.852,5.51362743 5.196,5.14562743 C5.54,4.77762743 5.712,4.31362743 5.712,3.75362743 C5.712,3.17762743 5.54,2.70562743 5.196,2.33762743 C4.852,1.96962743 4.408,1.78562743 3.864,1.78562743 C3.304,1.78562743 2.848,1.96962743 2.496,2.33762743 C2.144,2.70562743 1.968,3.17762743 1.968,3.75362743 C1.968,4.31362743 2.144,4.77762743 2.496,5.14562743 C2.848,5.51362743 3.304,5.69762743 3.864,5.69762743 Z M11.952,17.3856274 C11.248,17.3856274 10.6,17.2176274 10.008,16.8816274 C9.416,16.5456274 8.948,16.0936274 8.604,15.5256274 C8.26,14.9576274 8.088,14.3376274 8.088,13.6656274 C8.088,12.9936274 8.26,12.3736274 8.604,11.8056274 C8.948,11.2376274 9.416,10.7896274 10.008,10.4616274 C10.6,10.1336274 11.248,9.96962743 11.952,9.96962743 C12.656,9.96962743 13.3,10.1336274 13.884,10.4616274 C14.468,10.7896274 14.928,11.2376274 15.264,11.8056274 C15.6,12.3736274 15.768,12.9936274 15.768,13.6656274 C15.768,14.3376274 15.596,14.9576274 15.252,15.5256274 C14.908,16.0936274 14.444,16.5456274 13.86,16.8816274 C13.276,17.2176274 12.64,17.3856274 11.952,17.3856274 Z M11.952,15.6096274 C12.48,15.6096274 12.92,15.4296274 13.272,15.0696274 C13.624,14.7096274 13.8,14.2416274 13.8,13.6656274 C13.8,13.1056274 13.624,12.6416274 13.272,12.2736274 C12.92,11.9056274 12.48,11.7216274 11.952,11.7216274 C11.392,11.7216274 10.932,11.9056274 10.572,12.2736274 C10.212,12.6416274 10.032,13.1056274 10.032,13.6656274 C10.032,14.2416274 10.212,14.7096274 10.572,15.0696274 C10.932,15.4296274 11.392,15.6096274 11.952,15.6096274 Z"></path>
560
+ </g>
561
+ </g>
562
+ </g>
362
563
  </svg>""",
363
564
  "col_vals_not_null": """<?xml version="1.0" encoding="UTF-8"?>
364
565
  <svg width="67px" height="67px" viewBox="0 0 67 67" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">