Skip to main content

Business Intelligence as Configuration

Project description

StreamLana

'Business Intelligence as Configuration' 🚀

Motivation

Think of Streamlit in Grafana style...

Build your BI dashboards with ease, using simple configuration files.

Streamlana Flow

Live App & Examples:

Its deployed live at https://streamlana.streamlit.app/

For the live app - refer to 'demo' branch of this repo. (refer 'streamlana_demo.py')

Lets do Hello World app

  1. Install streamlana
pip install streamlana
mkdir page_configs
touch hello_world_app.yaml
touch hello_world_app.py
touch page_configs/stats.json
touch page_configs/about.json
  1. Define your pages in hello_world_app.yaml
#hello_world_app.yaml
side_bar:
  - heading: "Hello StreamLana"
    pages:
      - name: "Stats page"
        enabled: True
        config_file_path: "page_configs/stats.json"
      - name: "About page"
        config_file_path:  "page_configs/about.json"
        enabled: True
  1. Lets define page1 layout - number of rows, the widgets in each row, Query powering the widget, widget settings.

Lets do 1 row with 2 widgets in it -> page_configs/stats.json

{
    "page_title": "Hello StreamLana",
    "page_rows": [
        {
            "widgets_width_spec": [
                0.4,0.6
            ],
            "widgets_border": true,
            "with_expander": {
                "label": "2 widgets in 1st row, 40/60% width",
                "expanded": true
            },
            "widgets_gap": "small",
            "widgets_vertical_alignment": "top",
            "widgets": [
              {
                    "type": "dataframe",
                    "query": "SELECT avg_spend,order_date FROM (SELECT order_date, RANDOM() * 1000 AS avg_spend FROM generate_series(CURRENT_DATE - INTERVAL 30 DAY, CURRENT_DATE, INTERVAL 1 DAY) AS t(order_date)) as sub",
                    "config": {
                        "column_order": [
                            "avg_spend",
                            "order_date"
                        ]
                    }
                },
                {
                    "type": "line_chart",
                    "query": "SELECT avg_spend,order_date FROM (SELECT order_date, RANDOM() * 1000 AS avg_spend FROM generate_series(CURRENT_DATE - INTERVAL 30 DAY, CURRENT_DATE, INTERVAL 1 DAY) AS t(order_date)) as sub",
                    "config": {
                        "x": "order_date",
                        "y": ["avg_spend"],
                        "title": "avgSpend Over Time"
                    }
                }
            ]
        }
    ]
}
  1. Lets define page2 layout - number or rows, the widgets in each row, query powering the widget, widget settings.

Lets keep this simple 1 widget and 1 row -> page_configs/about.json

{
    "page_title": "About StreamLana",
    "page_rows": [
        {
            "widgets_width_spec": [1],
            "widgets": [{"type": "title", "config": {"body": "Business Intelligence as Configuration"}}]
        }
    ]
}
  1. Few lines of code for the main app -> hello_world_app.py
# hello_world_app.py
import logging
import duckdb
from streamlana import side_bar_util
from streamlana.side_bar_util import load_side_bar_config_yaml, render_side_bar_pages

# ✅ First thing to do, set page layout of streamlit
side_bar_util.set_page_layout(layout="wide")

# logging level
logging.basicConfig(level=logging.INFO)

# ✅ Load side bar configuration from YAML file
side_bar_config = load_side_bar_config_yaml("hello_world_app.yaml")

# ✅ Create DuckDB connection (do your setup with it)
con = duckdb.connect()

# ✅ Render side bar pages based on the configuration
try:
    render_side_bar_pages(side_bar_config, con)
finally:
    # ✅ Close the DuckDB connection
    con.close()
    logging.info("DuckDB connection closed.")
  1. Run the app
streamlit run hello_world_app.py

Widget Library

Currently, we support the following widgets:

  • st.dataframe
  • st.line_chart
  • st.area_chart
  • st.bar_chart
  • st.pie_chart
  • st.json
  • st.title
  • st.metric
  • st.text
  • st.markdown
  • st.image
  • st.map
  • st.empty
  • st.selectbox
  • st.header

Adding new widgets is easy, just add a new widget type in the chart_helpers.py.

ex: implement 'render_<chart_name>(data:pd.DataFrame, config_dict: dict)'

data comes from the duckdb sql query u configure.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

streamlana-0.1.3.tar.gz (43.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

streamlana-0.1.3-py3-none-any.whl (42.6 kB view details)

Uploaded Python 3

File details

Details for the file streamlana-0.1.3.tar.gz.

File metadata

  • Download URL: streamlana-0.1.3.tar.gz
  • Upload date:
  • Size: 43.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.6.1 CPython/3.11.13 Darwin/24.5.0

File hashes

Hashes for streamlana-0.1.3.tar.gz
Algorithm Hash digest
SHA256 d0d75260bcecc41435dee5f94dbc374adc172f700b15c74ebc9376127ce5e272
MD5 8bebea16e7861559bd326f6d25e70a97
BLAKE2b-256 ae442de5e0de2a670f022cc1202d286822786cd1bc51a3219225665a41a96188

See more details on using hashes here.

File details

Details for the file streamlana-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: streamlana-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 42.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.6.1 CPython/3.11.13 Darwin/24.5.0

File hashes

Hashes for streamlana-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 ffdd691035bbe4508be9ac2a441602df9151e1d6e72cb4ad6b24430744ba817c
MD5 57ecc28056fa3b2de4258046eccf7223
BLAKE2b-256 28f45deb5e0d19e3b7358aa7e8ba300e480afa693af67ddd2bac38fde9d22e83

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page