# Luxin
[](https://badge.fury.io/py/luxin)
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
Interactive HTML tables with drill-down capabilities for exploring aggregated data in Jupyter notebooks and Streamlit apps.
## Demo
<!-- Uncomment when demo.gif is created

-->
**Click on aggregated rows to instantly see the underlying detail data in an interactive side panel.**
Try it yourself: [](https://mybinder.org/v2/gh/eddiethedean/luxin/master?filepath=examples/01_getting_started.ipynb)
## Overview
Luxin allows you to create interactive tables that let you click on aggregated rows to see the underlying detail data. Like the magical substance from the Lightbringer series that can be shaped and manipulated, Luxin helps you shape and explore your data at different levels of granularity.
## Features
- 🔍 **Drill-down exploration**: Click on aggregated rows to see source data
- 📊 **Automatic tracking**: TrackedDataFrame automatically tracks source rows during aggregations
- 🎯 **Manual API**: Link aggregated and detail data manually for any workflow
- 📓 **Jupyter support**: Works seamlessly in Jupyter notebooks
- 🚀 **Streamlit support**: Build interactive Streamlit apps
- 🎨 **Modern UI**: Clean, responsive interface with side panel display
## Installation
```bash
pip install luxin
```
For Streamlit support:
```bash
pip install luxin[streamlit]
```
For Polars support:
```bash
pip install luxin[polars]
```
## Quick Start
### Automatic Tracking
```python
from luxin import TrackedDataFrame
import pandas as pd
# Create a TrackedDataFrame
df = TrackedDataFrame({
'category': ['A', 'A', 'B', 'B', 'C'],
'sales': [100, 150, 200, 250, 300],
'profit': [10, 15, 20, 25, 30]
})
# Aggregate data - tracking is automatic
agg = df.groupby(['category']).agg({'sales': 'sum', 'profit': 'sum'})
# Display with drill-down capability
agg.show_drill_table()
```
### Manual API
```python
from luxin import create_drill_table
import pandas as pd
# Your existing workflow
df = pd.DataFrame({
'category': ['A', 'A', 'B', 'B', 'C'],
'sales': [100, 150, 200, 250, 300],
'profit': [10, 15, 20, 25, 30]
})
agg_df = df.groupby(['category']).sum()
# Create interactive drill-down table
create_drill_table(agg_df, df, groupby_cols=['category'])
```
## How It Works
When you aggregate data, Luxin tracks which source rows contribute to each aggregated row. When you click on a row in the displayed table, a side panel slides in showing all the detail rows that were aggregated to create that summary.
## Use Cases
- Exploring sales data by region, then drilling into individual transactions
- Analyzing error logs by error type, then viewing specific error instances
- Reviewing survey responses by category, then reading individual responses
- Investigating performance metrics by service, then examining individual requests
## Examples
Check out the interactive example notebooks:
- [Getting Started](examples/01_getting_started.ipynb) - Basic usage and introduction
- [Sales Analysis](examples/02_sales_analysis.ipynb) - Real-world sales data exploration
- [Multi-Column Grouping](examples/03_multi_column_groupby.ipynb) - Advanced grouping techniques
You can also run these examples interactively in your browser:
[](https://mybinder.org/v2/gh/eddiethedean/luxin/master?filepath=examples)
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## License
MIT License - see LICENSE file for details.
Raw data
{
"_id": null,
"home_page": null,
"name": "luxin",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "dataframe, visualization, jupyter, streamlit, interactive, drill-down",
"author": null,
"author_email": "Odos Matthews <odosmatthews@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/09/7b/3cc3cfd73605c311af43c707d4fea0f580a1d75e99ef862be92d208fd574/luxin-0.1.0.tar.gz",
"platform": null,
"description": "# Luxin\n\n[](https://badge.fury.io/py/luxin)\n[](https://www.python.org/downloads/)\n[](https://opensource.org/licenses/MIT)\n\nInteractive HTML tables with drill-down capabilities for exploring aggregated data in Jupyter notebooks and Streamlit apps.\n\n## Demo\n\n<!-- Uncomment when demo.gif is created\n\n-->\n\n**Click on aggregated rows to instantly see the underlying detail data in an interactive side panel.**\n\nTry it yourself: [](https://mybinder.org/v2/gh/eddiethedean/luxin/master?filepath=examples/01_getting_started.ipynb)\n\n## Overview\n\nLuxin allows you to create interactive tables that let you click on aggregated rows to see the underlying detail data. Like the magical substance from the Lightbringer series that can be shaped and manipulated, Luxin helps you shape and explore your data at different levels of granularity.\n\n## Features\n\n- \ud83d\udd0d **Drill-down exploration**: Click on aggregated rows to see source data\n- \ud83d\udcca **Automatic tracking**: TrackedDataFrame automatically tracks source rows during aggregations\n- \ud83c\udfaf **Manual API**: Link aggregated and detail data manually for any workflow\n- \ud83d\udcd3 **Jupyter support**: Works seamlessly in Jupyter notebooks\n- \ud83d\ude80 **Streamlit support**: Build interactive Streamlit apps\n- \ud83c\udfa8 **Modern UI**: Clean, responsive interface with side panel display\n\n## Installation\n\n```bash\npip install luxin\n```\n\nFor Streamlit support:\n```bash\npip install luxin[streamlit]\n```\n\nFor Polars support:\n```bash\npip install luxin[polars]\n```\n\n## Quick Start\n\n### Automatic Tracking\n\n```python\nfrom luxin import TrackedDataFrame\nimport pandas as pd\n\n# Create a TrackedDataFrame\ndf = TrackedDataFrame({\n 'category': ['A', 'A', 'B', 'B', 'C'],\n 'sales': [100, 150, 200, 250, 300],\n 'profit': [10, 15, 20, 25, 30]\n})\n\n# Aggregate data - tracking is automatic\nagg = df.groupby(['category']).agg({'sales': 'sum', 'profit': 'sum'})\n\n# Display with drill-down capability\nagg.show_drill_table()\n```\n\n### Manual API\n\n```python\nfrom luxin import create_drill_table\nimport pandas as pd\n\n# Your existing workflow\ndf = pd.DataFrame({\n 'category': ['A', 'A', 'B', 'B', 'C'],\n 'sales': [100, 150, 200, 250, 300],\n 'profit': [10, 15, 20, 25, 30]\n})\n\nagg_df = df.groupby(['category']).sum()\n\n# Create interactive drill-down table\ncreate_drill_table(agg_df, df, groupby_cols=['category'])\n```\n\n## How It Works\n\nWhen you aggregate data, Luxin tracks which source rows contribute to each aggregated row. When you click on a row in the displayed table, a side panel slides in showing all the detail rows that were aggregated to create that summary.\n\n## Use Cases\n\n- Exploring sales data by region, then drilling into individual transactions\n- Analyzing error logs by error type, then viewing specific error instances\n- Reviewing survey responses by category, then reading individual responses\n- Investigating performance metrics by service, then examining individual requests\n\n## Examples\n\nCheck out the interactive example notebooks:\n\n- [Getting Started](examples/01_getting_started.ipynb) - Basic usage and introduction\n- [Sales Analysis](examples/02_sales_analysis.ipynb) - Real-world sales data exploration\n- [Multi-Column Grouping](examples/03_multi_column_groupby.ipynb) - Advanced grouping techniques\n\nYou can also run these examples interactively in your browser:\n\n[](https://mybinder.org/v2/gh/eddiethedean/luxin/master?filepath=examples)\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## License\n\nMIT License - see LICENSE file for details.\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Interactive HTML tables with drill-down capabilities for exploring aggregated data",
"version": "0.1.0",
"project_urls": {
"Bug Tracker": "https://github.com/eddiethedean/luxin/issues",
"Homepage": "https://github.com/eddiethedean/luxin",
"Repository": "https://github.com/eddiethedean/luxin"
},
"split_keywords": [
"dataframe",
" visualization",
" jupyter",
" streamlit",
" interactive",
" drill-down"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "d538eb3ce9fa37c0a58b76cf2e1a27ee1b8a0d1ada9b5388adf9ebe5e78c2162",
"md5": "e8cc76c8107696bc53d690bbc25f1246",
"sha256": "086610f8c33646af31e86ee57d98b9db2c5204f1a5e5f0e790a5b344e34e3e0e"
},
"downloads": -1,
"filename": "luxin-0.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "e8cc76c8107696bc53d690bbc25f1246",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 12801,
"upload_time": "2025-10-09T21:48:28",
"upload_time_iso_8601": "2025-10-09T21:48:28.827428Z",
"url": "https://files.pythonhosted.org/packages/d5/38/eb3ce9fa37c0a58b76cf2e1a27ee1b8a0d1ada9b5388adf9ebe5e78c2162/luxin-0.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "097b3cc3cfd73605c311af43c707d4fea0f580a1d75e99ef862be92d208fd574",
"md5": "df38ea69688c1528194770ff82b6ff6a",
"sha256": "03d28cf047f581619a5c641510f28f55ad6fba452cb5285bd1bd65318e6602a1"
},
"downloads": -1,
"filename": "luxin-0.1.0.tar.gz",
"has_sig": false,
"md5_digest": "df38ea69688c1528194770ff82b6ff6a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 13483,
"upload_time": "2025-10-09T21:48:29",
"upload_time_iso_8601": "2025-10-09T21:48:29.816036Z",
"url": "https://files.pythonhosted.org/packages/09/7b/3cc3cfd73605c311af43c707d4fea0f580a1d75e99ef862be92d208fd574/luxin-0.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-09 21:48:29",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "eddiethedean",
"github_project": "luxin",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "luxin"
}