From d7483407ae49cd23696f9d0687dd9ccf05222fa7 Mon Sep 17 00:00:00 2001 From: zilto Date: Tue, 14 Jan 2025 15:57:06 -0500 Subject: [PATCH] added pygwalker explorer --- dlt/helpers/streamlit_app/blocks/explorer.py | 43 ++++++++++++++++++++ dlt/helpers/streamlit_app/blocks/menu.py | 1 + dlt/helpers/streamlit_app/pages/explorer.py | 17 ++++++++ 3 files changed, 61 insertions(+) create mode 100644 dlt/helpers/streamlit_app/blocks/explorer.py create mode 100644 dlt/helpers/streamlit_app/pages/explorer.py diff --git a/dlt/helpers/streamlit_app/blocks/explorer.py b/dlt/helpers/streamlit_app/blocks/explorer.py new file mode 100644 index 0000000000..1fb56ddb0a --- /dev/null +++ b/dlt/helpers/streamlit_app/blocks/explorer.py @@ -0,0 +1,43 @@ +import dlt +import pygwalker +import streamlit as st +from pygwalker.api.streamlit import StreamlitRenderer + +st.set_page_config(layout="wide") + + + + + +@st.cache_resource +def pygwalker_renderer(pipeline_name: str, table_name: str) -> StreamlitRenderer: + pipeline = dlt.attach(pipeline_name) + dataset = pipeline.dataset() + df = dataset[table_name].df() + return StreamlitRenderer( + df, + kernel_computation=True, # use duckdb under the hood + default_tab="vis" + ) + + +def select_table_name(pipeline: dlt.Pipeline) -> str: + current_schema = pipeline.default_schema + if schema_name := st.session_state.get("schema_name"): + current_schema = pipeline.schemas[schema_name] + + selected_table = st.selectbox( + label="Active table", + options=current_schema.data_tables(), + format_func=lambda t: t["name"] + ) + return selected_table["name"] + + +def show_explorer(pipeline: dlt.Pipeline) -> None: + selected_table_name = select_table_name(pipeline) + renderer = pygwalker_renderer( + pipeline_name=pipeline.pipeline_name, + table_name=selected_table_name, + ) + renderer.explorer() diff --git a/dlt/helpers/streamlit_app/blocks/menu.py b/dlt/helpers/streamlit_app/blocks/menu.py index b6d0b5f7aa..44684fa0eb 100644 --- a/dlt/helpers/streamlit_app/blocks/menu.py +++ b/dlt/helpers/streamlit_app/blocks/menu.py @@ -10,5 +10,6 @@ def menu(pipeline: dlt.Pipeline) -> None: mode_selector() logo() st.page_link(f"{HERE}/pages/dashboard.py", label="Explore data", icon="🕹ī¸") + st.page_link(f"{HERE}/pages/explorer.py", label="Visualize data", icon="📊") st.page_link(f"{HERE}/pages/load_info.py", label="Load info", icon="💾") pipeline_summary(pipeline) diff --git a/dlt/helpers/streamlit_app/pages/explorer.py b/dlt/helpers/streamlit_app/pages/explorer.py new file mode 100644 index 0000000000..aed3819bd5 --- /dev/null +++ b/dlt/helpers/streamlit_app/pages/explorer.py @@ -0,0 +1,17 @@ +import dlt +import streamlit as st + +from dlt.helpers.streamlit_app.blocks.explorer import show_explorer +from dlt.helpers.streamlit_app.blocks.menu import menu +from dlt.helpers.streamlit_app.utils import render_with_pipeline + + +def show(pipeline: dlt.Pipeline) -> None: + with st.sidebar: + menu(pipeline) + + show_explorer(pipeline) + + +if __name__ == "__main__": + render_with_pipeline(show) \ No newline at end of file