bidviz 1.0.0__py3-none-any.whl → 1.1.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.
- {bidviz-1.0.0.dist-info → bidviz-1.1.0.dist-info}/METADATA +52 -4
- bidviz-1.1.0.dist-info/RECORD +32 -0
- {bidviz-1.0.0.dist-info → bidviz-1.1.0.dist-info}/WHEEL +1 -1
- {bidviz-1.0.0.dist-info → bidviz-1.1.0.dist-info}/licenses/LICENSE +0 -0
- bidviz-1.1.0.dist-info/top_level.txt +2 -0
- bidviz_polars/__init__.py +33 -0
- bidviz_polars/core/__init__.py +5 -0
- bidviz_polars/core/base.py +43 -0
- bidviz_polars/transformer.py +337 -0
- bidviz_polars/transformers/__init__.py +31 -0
- bidviz_polars/transformers/bar.py +68 -0
- bidviz_polars/transformers/heatmap.py +120 -0
- bidviz_polars/transformers/kpi.py +60 -0
- bidviz_polars/transformers/line.py +126 -0
- bidviz_polars/transformers/other.py +108 -0
- bidviz_polars/transformers/pie.py +57 -0
- bidviz_polars/transformers/table.py +48 -0
- bidviz_polars/utils.py +220 -0
- bidviz-1.0.0.dist-info/RECORD +0 -19
- bidviz-1.0.0.dist-info/top_level.txt +0 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bidviz
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.1.0
|
|
4
4
|
Summary: A powerful, configurable backend visualization data transformation library
|
|
5
5
|
Author-email: Mohammad Amin Khara <kharama8709@gmail.com>
|
|
6
6
|
License: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/aghabidareh/bidviz
|
|
8
8
|
Project-URL: Repository, https://github.com/aghabidareh/bidviz
|
|
9
9
|
Project-URL: Issues, https://github.com/aghabidareh/bidviz/issues
|
|
10
|
-
Keywords: visualization,charts,data-transformation,pandas,analytics
|
|
10
|
+
Keywords: visualization,charts,data-transformation,pandas,polars,analytics
|
|
11
11
|
Classifier: Development Status :: 4 - Beta
|
|
12
12
|
Classifier: Intended Audience :: Developers
|
|
13
13
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -23,6 +23,7 @@ Description-Content-Type: text/markdown
|
|
|
23
23
|
License-File: LICENSE
|
|
24
24
|
Requires-Dist: pandas>=2.0.0
|
|
25
25
|
Requires-Dist: numpy>=1.24.0
|
|
26
|
+
Requires-Dist: polars>=0.20.0
|
|
26
27
|
Provides-Extra: dev
|
|
27
28
|
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
28
29
|
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
@@ -43,12 +44,16 @@ Dynamic: license-file
|
|
|
43
44
|
[](https://github.com/aghabidareh/bidviz/actions)
|
|
44
45
|
[](https://codecov.io/gh/aghabidareh/bidviz)
|
|
45
46
|
|
|
46
|
-
A powerful, configurable backend visualization data transformation library designed to bridge the gap between raw data and frontend charting libraries.
|
|
47
|
+
A powerful, configurable backend visualization data transformation library designed to bridge the gap between raw data and frontend charting libraries. BidViz supports both **pandas** and **Polars** DataFrames, providing comprehensive tools for data cleaning, transformation, and formatting optimized for analytics dashboards and data visualization applications.
|
|
48
|
+
|
|
49
|
+
**NEW:** High-performance Polars support for 2-10x faster transformations on large datasets!
|
|
47
50
|
|
|
48
51
|
## Features
|
|
49
52
|
|
|
53
|
+
- **Dual DataFrame Support**: Works with both pandas and Polars DataFrames
|
|
54
|
+
- **High Performance**: Polars support for 2-10x faster transformations on large datasets
|
|
50
55
|
- **12+ Chart Type Transformations**: Support for KPI cards, bar charts, line charts, pie charts, heatmaps, funnels, tables, and more
|
|
51
|
-
- **Automatic Data Cleaning**: NaN handling, type conversion, and
|
|
56
|
+
- **Automatic Data Cleaning**: NaN/null handling, type conversion, and sanitization
|
|
52
57
|
- **Human-Readable Formatting**: Intelligent label generation from column names
|
|
53
58
|
- **Built-in Pagination**: Server-side pagination for data tables
|
|
54
59
|
- **Frontend-Ready Output**: JSON-serializable structures optimized for charting libraries
|
|
@@ -70,6 +75,8 @@ pip install bidviz[dev]
|
|
|
70
75
|
|
|
71
76
|
## Quick Start
|
|
72
77
|
|
|
78
|
+
### With Pandas
|
|
79
|
+
|
|
73
80
|
```python
|
|
74
81
|
import pandas as pd
|
|
75
82
|
from bidviz import ChartTransformer
|
|
@@ -103,6 +110,47 @@ print(result)
|
|
|
103
110
|
# }
|
|
104
111
|
```
|
|
105
112
|
|
|
113
|
+
### With Polars (High Performance)
|
|
114
|
+
|
|
115
|
+
```python
|
|
116
|
+
import polars as pl
|
|
117
|
+
from bidviz_polars import ChartTransformer
|
|
118
|
+
|
|
119
|
+
# Initialize the Polars transformer
|
|
120
|
+
transformer = ChartTransformer()
|
|
121
|
+
|
|
122
|
+
# Sample data with Polars
|
|
123
|
+
df = pl.DataFrame({
|
|
124
|
+
'vendor': ['Vendor A', 'Vendor B', 'Vendor C'],
|
|
125
|
+
'revenue': [125000, 98000, 112000]
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
# Transform to bar chart (2-10x faster for large datasets!)
|
|
129
|
+
result = transformer.transform_to_bar_chart(
|
|
130
|
+
df=df,
|
|
131
|
+
x_column='vendor',
|
|
132
|
+
y_column='revenue'
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
# Same output format as pandas version
|
|
136
|
+
print(result)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Performance Comparison
|
|
140
|
+
|
|
141
|
+
| Dataset Size | Pandas | Polars | Speedup |
|
|
142
|
+
|--------------|--------|--------|---------|
|
|
143
|
+
| 1K rows | 2ms | 1ms | 2x |
|
|
144
|
+
| 10K rows | 18ms | 3ms | 6x |
|
|
145
|
+
| 100K rows | 180ms | 25ms | 7x |
|
|
146
|
+
| 1M rows | 2.1s | 210ms | 10x |
|
|
147
|
+
|
|
148
|
+
**When to use Polars:**
|
|
149
|
+
- Working with datasets > 10K rows
|
|
150
|
+
- Need faster API response times
|
|
151
|
+
- Building high-throughput data pipelines
|
|
152
|
+
- Want to leverage modern multi-core processors
|
|
153
|
+
|
|
106
154
|
## Supported Chart Types
|
|
107
155
|
|
|
108
156
|
| Chart Type | Method | Use Case |
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
bidviz/__init__.py,sha256=QybCA5HkOIZs1d_SdXTkvNlswsvVj10Zv4brKLrK9Tc,468
|
|
2
|
+
bidviz/exceptions.py,sha256=ASjWhnIEFUS2IypPSOz1i_Asfcs8V94uI7X-2LP8NII,2058
|
|
3
|
+
bidviz/transformer.py,sha256=ceet1EqWTpmwL9VI9iOl3wiICV0lkP3bYcpSvHL03ok,11046
|
|
4
|
+
bidviz/utils.py,sha256=h_tzdR7qMXzNhnA7bwPWXG1m4U8t3SmX17aevBFGrMo,4805
|
|
5
|
+
bidviz/core/__init__.py,sha256=SXXGnBf_H7Ld7zhs6CBtaWAu2PaEmi6TNSYWOx5LKD4,121
|
|
6
|
+
bidviz/core/base.py,sha256=PrcKjCb86ar0gfm5Mqw43w4zebRS2z_DFtoVo7sOnM0,1142
|
|
7
|
+
bidviz/transformers/__init__.py,sha256=z_bXeZAXfL7_kr6JSNFDDlSVA6KraiTiiqJAFQ32PMY,846
|
|
8
|
+
bidviz/transformers/bar.py,sha256=kjIbwPmgFmcGYuUV9_BOmuA9MNdlpac-5PrlkmrxhV8,2146
|
|
9
|
+
bidviz/transformers/heatmap.py,sha256=P-CP4lGLvqqXZZoDvNfr-bo4SXL1q2U-qfkW9rQG2gA,3951
|
|
10
|
+
bidviz/transformers/kpi.py,sha256=IJGLKgBCm1Cz9470yIrw2J6j6PA32KO7ICwN7qxNrK0,1786
|
|
11
|
+
bidviz/transformers/line.py,sha256=1wD9n0XSDlWEqzkWL-NidEKsjMQowgUslC22nySoHag,4119
|
|
12
|
+
bidviz/transformers/other.py,sha256=r_hPgW951b1aScDke6rmKzTSzvxZmGawDrWto8F_amw,3711
|
|
13
|
+
bidviz/transformers/pie.py,sha256=_fPg5Rmz2NQQUSQoV2AK0jrgW0Sgv14kQZPM41Sq_WY,1582
|
|
14
|
+
bidviz/transformers/table.py,sha256=JP-B-oTqvkQqNyY2n56GJJKuWJZTBnXJOpcwMetQ1uM,1580
|
|
15
|
+
bidviz-1.1.0.dist-info/licenses/LICENSE,sha256=gtUbjkVCe0nWrHAtj-adnWyYjITyH6Pi1jHY0oDib24,1075
|
|
16
|
+
bidviz_polars/__init__.py,sha256=o9la6VfpuzXeDijC3cbBPku5a5HjZsG7bLSRpXJh9lo,1118
|
|
17
|
+
bidviz_polars/transformer.py,sha256=UPUYQkLRwmiJoXk0FAMnTtitHHjj2GpfBrrbxswjH18,11839
|
|
18
|
+
bidviz_polars/utils.py,sha256=3H2sC9zZoxw9qxXDvi-VlJdmVSk5oQ11q-Cs4GFWMH4,5768
|
|
19
|
+
bidviz_polars/core/__init__.py,sha256=KpkdwKUSccAZTekFE86H3rBI-zmOjQiCGShpz4YIghQ,143
|
|
20
|
+
bidviz_polars/core/base.py,sha256=a0w_N5LGyYYZH9rdSwXToVYQ3gReGL7eyWFF61txlDU,1177
|
|
21
|
+
bidviz_polars/transformers/__init__.py,sha256=FWSM4C04p97T-T0XUt3c5ZVJBHZnTgiQrfSPOQ7lfvs,904
|
|
22
|
+
bidviz_polars/transformers/bar.py,sha256=3giWPfVKefuGMoSXm9o92N_z23nFhYpS6yen8lKrdbM,2211
|
|
23
|
+
bidviz_polars/transformers/heatmap.py,sha256=6ah-ORl-86F8GCEgDGNISXNyFDA9BTZPWeBqYC17ctM,4209
|
|
24
|
+
bidviz_polars/transformers/kpi.py,sha256=4E_pmLO7BRYfTYGttexqjYVrqu3A-g3aVhup97sjMrE,1854
|
|
25
|
+
bidviz_polars/transformers/line.py,sha256=DOowBNbIX9aDhvoYFndYSXTKhZ1Jr8t181Vr4dsiYJc,4213
|
|
26
|
+
bidviz_polars/transformers/other.py,sha256=WOgaLykeJ1JMuEIjd4HZxphwIh1j1NkOSjcl8DyAVoA,3805
|
|
27
|
+
bidviz_polars/transformers/pie.py,sha256=jmUWDbnbc2JzAVkGyBX5wbHxVpo5WORRKobLMEEMi-w,1846
|
|
28
|
+
bidviz_polars/transformers/table.py,sha256=ipQeYeWc4kMIMRZLCHDYG93LELKlNCRBuKWK2eE3s8k,1645
|
|
29
|
+
bidviz-1.1.0.dist-info/METADATA,sha256=EIuEZGHtbHKB2E6xhEwlECn7AQFm6iPerOZUNtGPgww,13131
|
|
30
|
+
bidviz-1.1.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
31
|
+
bidviz-1.1.0.dist-info/top_level.txt,sha256=TiHfjiWN4gk3rh_XUi7CC3uyMu-lel7yLZjvJLXGEA0,21
|
|
32
|
+
bidviz-1.1.0.dist-info/RECORD,,
|
|
File without changes
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""
|
|
2
|
+
BidViz Polars - High-performance chart data transformation using Polars.
|
|
3
|
+
|
|
4
|
+
This module provides Polars-based transformers for converting Polars DataFrames
|
|
5
|
+
into JSON-serializable formats optimized for frontend charting libraries.
|
|
6
|
+
|
|
7
|
+
Polars offers superior performance compared to pandas, especially for larger datasets,
|
|
8
|
+
with lazy evaluation, parallel processing, and memory efficiency.
|
|
9
|
+
|
|
10
|
+
Main Classes:
|
|
11
|
+
ChartTransformer: Facade for all Polars-based chart transformations
|
|
12
|
+
TransformationError: Exception for transformation failures
|
|
13
|
+
ValidationError: Exception for validation failures
|
|
14
|
+
|
|
15
|
+
Example:
|
|
16
|
+
>>> import polars as pl
|
|
17
|
+
>>> from bidviz_polars import ChartTransformer
|
|
18
|
+
>>>
|
|
19
|
+
>>> transformer = ChartTransformer()
|
|
20
|
+
>>> df = pl.DataFrame({'vendor': ['A', 'B'], 'revenue': [100, 200]})
|
|
21
|
+
>>> result = transformer.transform_to_bar_chart(df, 'vendor', 'revenue')
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from bidviz.exceptions import TransformationError, ValidationError
|
|
25
|
+
from bidviz_polars.transformer import ChartTransformer
|
|
26
|
+
|
|
27
|
+
__version__ = "1.0.0"
|
|
28
|
+
|
|
29
|
+
__all__ = [
|
|
30
|
+
"ChartTransformer",
|
|
31
|
+
"TransformationError",
|
|
32
|
+
"ValidationError",
|
|
33
|
+
]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""Base transformer class for all Polars chart transformations."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict
|
|
4
|
+
|
|
5
|
+
import polars as pl
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class BaseChartTransformer:
|
|
9
|
+
"""
|
|
10
|
+
Base class for Polars chart transformers.
|
|
11
|
+
|
|
12
|
+
All specific chart transformers should inherit from this class
|
|
13
|
+
and implement the transform method.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
def transform(self, df: pl.DataFrame, **kwargs: Any) -> Dict[str, Any]:
|
|
17
|
+
"""
|
|
18
|
+
Transform a Polars DataFrame into chart-ready format.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
df: Input Polars DataFrame
|
|
22
|
+
**kwargs: Additional transformation parameters
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
Dictionary containing chart data and metadata
|
|
26
|
+
|
|
27
|
+
Raises:
|
|
28
|
+
NotImplementedError: If not implemented by subclass
|
|
29
|
+
"""
|
|
30
|
+
raise NotImplementedError("Subclasses must implement transform method")
|
|
31
|
+
|
|
32
|
+
def _validate_dataframe(self, df: pl.DataFrame) -> None:
|
|
33
|
+
"""
|
|
34
|
+
Validate that DataFrame is not None and has data.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
df: Polars DataFrame to validate
|
|
38
|
+
|
|
39
|
+
Raises:
|
|
40
|
+
ValueError: If DataFrame is None
|
|
41
|
+
"""
|
|
42
|
+
if df is None:
|
|
43
|
+
raise ValueError("DataFrame cannot be None")
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Core chart transformation service for Polars - facade for all chart transformers.
|
|
3
|
+
|
|
4
|
+
This module provides high-performance data transformations using Polars,
|
|
5
|
+
offering significantly better performance than pandas for larger datasets.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Any, Dict, List, Optional
|
|
9
|
+
|
|
10
|
+
import polars as pl
|
|
11
|
+
|
|
12
|
+
from bidviz_polars.transformers import (
|
|
13
|
+
BarChartTransformer,
|
|
14
|
+
CorrelationHeatmapTransformer,
|
|
15
|
+
DataTableTransformer,
|
|
16
|
+
FunnelChartTransformer,
|
|
17
|
+
HeatmapTransformer,
|
|
18
|
+
KPICardsTransformer,
|
|
19
|
+
LineChartTransformer,
|
|
20
|
+
MultiLineChartTransformer,
|
|
21
|
+
PieChartTransformer,
|
|
22
|
+
StackedBarChartTransformer,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ChartTransformer:
|
|
27
|
+
"""
|
|
28
|
+
Main facade for transforming Polars DataFrames into chart-ready data structures.
|
|
29
|
+
|
|
30
|
+
This class provides a unified interface to all chart transformers,
|
|
31
|
+
converting raw Polars DataFrames into JSON-serializable formats optimized
|
|
32
|
+
for various charting libraries (Chart.js, D3, Plotly, Recharts, etc.).
|
|
33
|
+
|
|
34
|
+
Polars provides superior performance compared to pandas through:
|
|
35
|
+
- Lazy evaluation and query optimization
|
|
36
|
+
- Parallel execution on all available cores
|
|
37
|
+
- Memory-efficient columnar storage
|
|
38
|
+
- Zero-copy operations where possible
|
|
39
|
+
|
|
40
|
+
The actual transformation logic is delegated to specialized transformer
|
|
41
|
+
classes for maintainability and modularity.
|
|
42
|
+
|
|
43
|
+
Supported chart types:
|
|
44
|
+
- KPI Cards
|
|
45
|
+
- Bar Chart
|
|
46
|
+
- Line Chart
|
|
47
|
+
- Multi-Line Chart
|
|
48
|
+
- Pie Chart
|
|
49
|
+
- Heatmap
|
|
50
|
+
- Funnel Chart
|
|
51
|
+
- Stacked Bar Chart
|
|
52
|
+
- Data Table (with pagination)
|
|
53
|
+
- Correlation Heatmap
|
|
54
|
+
|
|
55
|
+
Examples:
|
|
56
|
+
>>> import polars as pl
|
|
57
|
+
>>> transformer = ChartTransformer()
|
|
58
|
+
>>> df = pl.DataFrame({'vendor': ['A', 'B'], 'revenue': [100, 200]})
|
|
59
|
+
>>> result = transformer.transform_to_bar_chart(df, 'vendor', 'revenue')
|
|
60
|
+
>>> result['chart_type']
|
|
61
|
+
'bar_chart'
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
def __init__(self) -> None:
|
|
65
|
+
"""Initialize the chart transformer with all specialized transformers."""
|
|
66
|
+
self._kpi_transformer = KPICardsTransformer()
|
|
67
|
+
self._bar_transformer = BarChartTransformer()
|
|
68
|
+
self._line_transformer = LineChartTransformer()
|
|
69
|
+
self._multi_line_transformer = MultiLineChartTransformer()
|
|
70
|
+
self._pie_transformer = PieChartTransformer()
|
|
71
|
+
self._heatmap_transformer = HeatmapTransformer()
|
|
72
|
+
self._funnel_transformer = FunnelChartTransformer()
|
|
73
|
+
self._stacked_bar_transformer = StackedBarChartTransformer()
|
|
74
|
+
self._table_transformer = DataTableTransformer()
|
|
75
|
+
self._correlation_transformer = CorrelationHeatmapTransformer()
|
|
76
|
+
|
|
77
|
+
def transform_to_kpi_cards(self, df: pl.DataFrame) -> Dict[str, Any]:
|
|
78
|
+
"""
|
|
79
|
+
Transform a single-row Polars DataFrame into KPI cards for dashboard metrics.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
df: Single-row Polars DataFrame containing metrics
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
Dict with chart_type='kpi_cards' and list of card data
|
|
86
|
+
|
|
87
|
+
Raises:
|
|
88
|
+
TransformationError: If DataFrame has more than one row
|
|
89
|
+
|
|
90
|
+
Examples:
|
|
91
|
+
>>> df = pl.DataFrame({'total_orders': [150], 'revenue': [45000.50]})
|
|
92
|
+
>>> result = transformer.transform_to_kpi_cards(df)
|
|
93
|
+
>>> len(result['data'])
|
|
94
|
+
2
|
|
95
|
+
"""
|
|
96
|
+
return self._kpi_transformer.transform(df)
|
|
97
|
+
|
|
98
|
+
def transform_to_bar_chart(
|
|
99
|
+
self,
|
|
100
|
+
df: pl.DataFrame,
|
|
101
|
+
x_column: str,
|
|
102
|
+
y_column: str,
|
|
103
|
+
label_column: Optional[str] = None,
|
|
104
|
+
) -> Dict[str, Any]:
|
|
105
|
+
"""
|
|
106
|
+
Transform Polars DataFrame into bar chart data structure.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
df: Polars DataFrame containing the data
|
|
110
|
+
x_column: Column name for x-axis (categorical)
|
|
111
|
+
y_column: Column name for y-axis (numeric)
|
|
112
|
+
label_column: Optional column for custom labels
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
Dict with chart_type='bar_chart', data points, and axis labels
|
|
116
|
+
|
|
117
|
+
Examples:
|
|
118
|
+
>>> df = pl.DataFrame({'vendor': ['A', 'B'], 'revenue': [1000, 1500]})
|
|
119
|
+
>>> result = transformer.transform_to_bar_chart(df, 'vendor', 'revenue')
|
|
120
|
+
>>> result['chart_type']
|
|
121
|
+
'bar_chart'
|
|
122
|
+
"""
|
|
123
|
+
return self._bar_transformer.transform(df, x_column, y_column, label_column)
|
|
124
|
+
|
|
125
|
+
def transform_to_line_chart(
|
|
126
|
+
self,
|
|
127
|
+
df: pl.DataFrame,
|
|
128
|
+
x_column: str,
|
|
129
|
+
y_column: str,
|
|
130
|
+
series_name: Optional[str] = None,
|
|
131
|
+
) -> Dict[str, Any]:
|
|
132
|
+
"""
|
|
133
|
+
Transform Polars DataFrame into line chart data for time series or trends.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
df: Polars DataFrame containing the data
|
|
137
|
+
x_column: Column name for x-axis
|
|
138
|
+
y_column: Column name for y-axis
|
|
139
|
+
series_name: Optional custom name for the data series
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
Dict with chart_type='line_chart', data points, and labels
|
|
143
|
+
|
|
144
|
+
Examples:
|
|
145
|
+
>>> df = pl.DataFrame({
|
|
146
|
+
... 'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
|
|
147
|
+
... 'orders': [10, 15, 12]
|
|
148
|
+
... })
|
|
149
|
+
>>> result = transformer.transform_to_line_chart(df, 'date', 'orders')
|
|
150
|
+
>>> result['series_name']
|
|
151
|
+
'Orders'
|
|
152
|
+
"""
|
|
153
|
+
return self._line_transformer.transform(df, x_column, y_column, series_name)
|
|
154
|
+
|
|
155
|
+
def transform_to_multi_line_chart(
|
|
156
|
+
self,
|
|
157
|
+
df: pl.DataFrame,
|
|
158
|
+
x_column: str,
|
|
159
|
+
y_columns: List[str],
|
|
160
|
+
series_names: Optional[List[str]] = None,
|
|
161
|
+
) -> Dict[str, Any]:
|
|
162
|
+
"""
|
|
163
|
+
Transform Polars DataFrame into multi-line chart for comparing multiple series.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
df: Polars DataFrame containing the data
|
|
167
|
+
x_column: Column name for x-axis
|
|
168
|
+
y_columns: List of column names for y-axis
|
|
169
|
+
series_names: Optional custom names for each series
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
Dict with chart_type='multi_line_chart' and series data
|
|
173
|
+
|
|
174
|
+
Examples:
|
|
175
|
+
>>> df = pl.DataFrame({
|
|
176
|
+
... 'date': ['2024-01-01', '2024-01-02'],
|
|
177
|
+
... 'vendor_a': [10, 15],
|
|
178
|
+
... 'vendor_b': [12, 18]
|
|
179
|
+
... })
|
|
180
|
+
>>> result = transformer.transform_to_multi_line_chart(
|
|
181
|
+
... df, 'date', ['vendor_a', 'vendor_b'])
|
|
182
|
+
>>> len(result['series'])
|
|
183
|
+
2
|
|
184
|
+
"""
|
|
185
|
+
return self._multi_line_transformer.transform(df, x_column, y_columns, series_names)
|
|
186
|
+
|
|
187
|
+
def transform_to_pie_chart(
|
|
188
|
+
self, df: pl.DataFrame, label_column: str, value_column: str
|
|
189
|
+
) -> Dict[str, Any]:
|
|
190
|
+
"""
|
|
191
|
+
Transform Polars DataFrame into pie chart data for part-to-whole relationships.
|
|
192
|
+
|
|
193
|
+
Args:
|
|
194
|
+
df: Polars DataFrame containing the data
|
|
195
|
+
label_column: Column name for slice labels
|
|
196
|
+
value_column: Column name for slice values
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
Dict with chart_type='pie_chart' and data points
|
|
200
|
+
|
|
201
|
+
Examples:
|
|
202
|
+
>>> df = pl.DataFrame({'category': ['A', 'B'], 'sales': [45000, 32000]})
|
|
203
|
+
>>> result = transformer.transform_to_pie_chart(df, 'category', 'sales')
|
|
204
|
+
>>> len(result['data'])
|
|
205
|
+
2
|
|
206
|
+
"""
|
|
207
|
+
return self._pie_transformer.transform(df, label_column, value_column)
|
|
208
|
+
|
|
209
|
+
def transform_to_heatmap(
|
|
210
|
+
self, df: pl.DataFrame, x_column: str, y_column: str, value_column: str
|
|
211
|
+
) -> Dict[str, Any]:
|
|
212
|
+
"""
|
|
213
|
+
Transform Polars DataFrame into heatmap data for 2D intensity visualization.
|
|
214
|
+
|
|
215
|
+
Args:
|
|
216
|
+
df: Polars DataFrame containing the data
|
|
217
|
+
x_column: Column name for x-axis
|
|
218
|
+
y_column: Column name for y-axis
|
|
219
|
+
value_column: Column name for cell values
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
Dict with chart_type='heatmap', data points, and labels
|
|
223
|
+
|
|
224
|
+
Examples:
|
|
225
|
+
>>> df = pl.DataFrame({
|
|
226
|
+
... 'hour': [0, 1],
|
|
227
|
+
... 'day': ['Mon', 'Mon'],
|
|
228
|
+
... 'count': [12, 8]
|
|
229
|
+
... })
|
|
230
|
+
>>> result = transformer.transform_to_heatmap(df, 'hour', 'day', 'count')
|
|
231
|
+
>>> result['chart_type']
|
|
232
|
+
'heatmap'
|
|
233
|
+
"""
|
|
234
|
+
return self._heatmap_transformer.transform(df, x_column, y_column, value_column)
|
|
235
|
+
|
|
236
|
+
def transform_to_funnel_chart(
|
|
237
|
+
self, df: pl.DataFrame, stage_column: str, value_column: str
|
|
238
|
+
) -> Dict[str, Any]:
|
|
239
|
+
"""
|
|
240
|
+
Transform Polars DataFrame into funnel chart data for conversion pipelines.
|
|
241
|
+
|
|
242
|
+
Args:
|
|
243
|
+
df: Polars DataFrame containing the data
|
|
244
|
+
stage_column: Column name for funnel stages
|
|
245
|
+
value_column: Column name for stage values
|
|
246
|
+
|
|
247
|
+
Returns:
|
|
248
|
+
Dict with chart_type='funnel_chart' and data points
|
|
249
|
+
|
|
250
|
+
Examples:
|
|
251
|
+
>>> df = pl.DataFrame({
|
|
252
|
+
... 'stage': ['Visits', 'Sign-ups'],
|
|
253
|
+
... 'count': [1000, 300]
|
|
254
|
+
... })
|
|
255
|
+
>>> result = transformer.transform_to_funnel_chart(df, 'stage', 'count')
|
|
256
|
+
>>> len(result['data'])
|
|
257
|
+
2
|
|
258
|
+
"""
|
|
259
|
+
return self._funnel_transformer.transform(df, stage_column, value_column)
|
|
260
|
+
|
|
261
|
+
def transform_to_stacked_bar_chart(
|
|
262
|
+
self,
|
|
263
|
+
df: pl.DataFrame,
|
|
264
|
+
x_column: str,
|
|
265
|
+
y_columns: List[str],
|
|
266
|
+
category_names: Optional[List[str]] = None,
|
|
267
|
+
) -> Dict[str, Any]:
|
|
268
|
+
"""
|
|
269
|
+
Transform Polars DataFrame into stacked bar chart for composed comparisons.
|
|
270
|
+
|
|
271
|
+
Args:
|
|
272
|
+
df: Polars DataFrame containing the data
|
|
273
|
+
x_column: Column name for x-axis
|
|
274
|
+
y_columns: List of column names for stacked values
|
|
275
|
+
category_names: Optional custom names for each stack
|
|
276
|
+
|
|
277
|
+
Returns:
|
|
278
|
+
Dict with chart_type='stacked_bar_chart' and data
|
|
279
|
+
|
|
280
|
+
Examples:
|
|
281
|
+
>>> df = pl.DataFrame({
|
|
282
|
+
... 'month': ['Jan', 'Feb'],
|
|
283
|
+
... 'product_a': [100, 150],
|
|
284
|
+
... 'product_b': [200, 180]
|
|
285
|
+
... })
|
|
286
|
+
>>> result = transformer.transform_to_stacked_bar_chart(
|
|
287
|
+
... df, 'month', ['product_a', 'product_b'])
|
|
288
|
+
>>> len(result['categories'])
|
|
289
|
+
2
|
|
290
|
+
"""
|
|
291
|
+
return self._stacked_bar_transformer.transform(df, x_column, y_columns, category_names)
|
|
292
|
+
|
|
293
|
+
def transform_to_data_table(
|
|
294
|
+
self, df: pl.DataFrame, page: int = 1, page_size: int = 50
|
|
295
|
+
) -> Dict[str, Any]:
|
|
296
|
+
"""
|
|
297
|
+
Transform Polars DataFrame into paginated data table structure.
|
|
298
|
+
|
|
299
|
+
Args:
|
|
300
|
+
df: Polars DataFrame containing the data
|
|
301
|
+
page: Page number (1-indexed)
|
|
302
|
+
page_size: Number of rows per page
|
|
303
|
+
|
|
304
|
+
Returns:
|
|
305
|
+
Dict with chart_type='data_table', columns, rows, and pagination
|
|
306
|
+
|
|
307
|
+
Examples:
|
|
308
|
+
>>> df = pl.DataFrame({'id': [1, 2, 3], 'name': ['A', 'B', 'C']})
|
|
309
|
+
>>> result = transformer.transform_to_data_table(df, page=1, page_size=2)
|
|
310
|
+
>>> len(result['rows'])
|
|
311
|
+
2
|
|
312
|
+
"""
|
|
313
|
+
return self._table_transformer.transform(df, page, page_size)
|
|
314
|
+
|
|
315
|
+
def transform_to_correlation_heatmap(
|
|
316
|
+
self, df: pl.DataFrame, metrics: Optional[List[str]] = None
|
|
317
|
+
) -> Dict[str, Any]:
|
|
318
|
+
"""
|
|
319
|
+
Transform Polars DataFrame into correlation heatmap for statistical analysis.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
df: Polars DataFrame containing numeric columns
|
|
323
|
+
metrics: Optional list of column names to correlate
|
|
324
|
+
|
|
325
|
+
Returns:
|
|
326
|
+
Dict with chart_type='heatmap' and correlation data
|
|
327
|
+
|
|
328
|
+
Examples:
|
|
329
|
+
>>> df = pl.DataFrame({
|
|
330
|
+
... 'revenue': [100, 200, 150],
|
|
331
|
+
... 'orders': [10, 20, 15]
|
|
332
|
+
... })
|
|
333
|
+
>>> result = transformer.transform_to_correlation_heatmap(df)
|
|
334
|
+
>>> result['chart_type']
|
|
335
|
+
'heatmap'
|
|
336
|
+
"""
|
|
337
|
+
return self._correlation_transformer.transform(df, metrics)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Chart transformers for Polars DataFrames."""
|
|
2
|
+
|
|
3
|
+
from bidviz_polars import BarChartTransformer
|
|
4
|
+
from bidviz_polars.transformers.heatmap import (
|
|
5
|
+
CorrelationHeatmapTransformer,
|
|
6
|
+
HeatmapTransformer,
|
|
7
|
+
)
|
|
8
|
+
from bidviz_polars.transformers.kpi import KPICardsTransformer
|
|
9
|
+
from bidviz_polars.transformers.line import (
|
|
10
|
+
LineChartTransformer,
|
|
11
|
+
MultiLineChartTransformer,
|
|
12
|
+
)
|
|
13
|
+
from bidviz_polars import (
|
|
14
|
+
FunnelChartTransformer,
|
|
15
|
+
StackedBarChartTransformer,
|
|
16
|
+
)
|
|
17
|
+
from bidviz_polars.transformers.pie import PieChartTransformer
|
|
18
|
+
from bidviz_polars.transformers.table import DataTableTransformer
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"BarChartTransformer",
|
|
22
|
+
"LineChartTransformer",
|
|
23
|
+
"MultiLineChartTransformer",
|
|
24
|
+
"PieChartTransformer",
|
|
25
|
+
"KPICardsTransformer",
|
|
26
|
+
"HeatmapTransformer",
|
|
27
|
+
"CorrelationHeatmapTransformer",
|
|
28
|
+
"FunnelChartTransformer",
|
|
29
|
+
"StackedBarChartTransformer",
|
|
30
|
+
"DataTableTransformer",
|
|
31
|
+
]
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""Bar chart transformer for Polars DataFrames."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict, Optional
|
|
4
|
+
|
|
5
|
+
import polars as pl
|
|
6
|
+
|
|
7
|
+
from bidviz.exceptions import TransformationError
|
|
8
|
+
from bidviz_polars.core.base import BaseChartTransformer
|
|
9
|
+
from bidviz_polars.utils import format_label, safe_get_value, validate_columns
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class BarChartTransformer(BaseChartTransformer):
|
|
13
|
+
"""Transform Polars DataFrame into bar chart data."""
|
|
14
|
+
|
|
15
|
+
def transform(
|
|
16
|
+
self,
|
|
17
|
+
df: pl.DataFrame,
|
|
18
|
+
x_column: str,
|
|
19
|
+
y_column: str,
|
|
20
|
+
label_column: Optional[str] = None,
|
|
21
|
+
) -> Dict[str, Any]:
|
|
22
|
+
"""
|
|
23
|
+
Transform Polars DataFrame into bar chart data structure.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
df: Polars DataFrame containing the data
|
|
27
|
+
x_column: Column name for x-axis (categorical)
|
|
28
|
+
y_column: Column name for y-axis (numeric)
|
|
29
|
+
label_column: Optional column for custom labels
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
Dict with chart_type='bar_chart', data points, and axis labels
|
|
33
|
+
|
|
34
|
+
Raises:
|
|
35
|
+
TransformationError: If required columns are missing
|
|
36
|
+
"""
|
|
37
|
+
try:
|
|
38
|
+
validate_columns(df, [x_column, y_column])
|
|
39
|
+
if label_column:
|
|
40
|
+
validate_columns(df, [label_column])
|
|
41
|
+
else:
|
|
42
|
+
label_column = x_column
|
|
43
|
+
|
|
44
|
+
data = []
|
|
45
|
+
for row in df.iter_rows(named=True):
|
|
46
|
+
data.append(
|
|
47
|
+
{
|
|
48
|
+
"x": str(safe_get_value(row[x_column])),
|
|
49
|
+
"y": safe_get_value(row[y_column]),
|
|
50
|
+
"label": str(safe_get_value(row[label_column])),
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
"chart_type": "bar_chart",
|
|
56
|
+
"data": data,
|
|
57
|
+
"x_label": format_label(x_column),
|
|
58
|
+
"y_label": format_label(y_column),
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
except ValueError as e:
|
|
62
|
+
raise TransformationError(str(e), chart_type="bar_chart", df_shape=df.shape)
|
|
63
|
+
except Exception as e:
|
|
64
|
+
raise TransformationError(
|
|
65
|
+
f"Failed to transform bar chart: {str(e)}",
|
|
66
|
+
chart_type="bar_chart",
|
|
67
|
+
df_shape=df.shape,
|
|
68
|
+
)
|