1. Conceito

Vamos criar um dashboard interativo em Python, utilizando o Streamlit, para visualizar e filtrar os dados de uma tabela fato de Data Warehouse OLAP armazenada no ClickHouse. O Streamlit é uma biblioteca Python excelente para criar aplicações web de dados de forma rápida, simples e sem necessidade de front-end tradicional.

2. O que você precisa instalar

Em seu ambiente Python, rode:

pip install streamlit clickhouse-connect pandas

3. Estrutura do Código

Crie um arquivo chamado dashboard.py com o seguinte código básico (com explicações em comentários):

import streamlit as st
import pandas as pd
import clickhouse_connect

*# --- Conexão com o ClickHouse ---*
client = clickhouse_connect.get_client(
    host='localhost',  *# ou '127.0.0.1'*
    port=8123
)

*# --- Query base da tabela fato com joins ---*
QUERY_BASE = """
SELECT
    f.id_visita,
    u.nome AS usuario,
    u.cidade,
    p.descricao AS pagina,
    t.data,
    t.dia_semana,
    f.duracao
FROM
    fato_visita AS f
JOIN dim_usuario AS u ON f.id_usuario = u.id_usuario
JOIN dim_pagina AS p ON f.id_pagina = p.id_pagina
JOIN dim_tempo AS t ON f.id_tempo = t.id_tempo
"""

*# --- Consulta e carrega os dados em DataFrame ---*
def load_data():
    result = client.query(QUERY_BASE)
    df = pd.DataFrame(result.result_rows, columns=result.column_names)
    return df

*# --- Main App Streamlit ---*
st.title('Dashboard de Visitas - ClickHouse OLAP Star Schema')

*# Carregar os dados da query*
df = load_data()

*# --- Filtros Dinâmicos ---*
st.sidebar.header("Filtros")
cidades = st.sidebar.multiselect(
    "Cidade", options=sorted(df['cidade'].unique()), default=sorted(df['cidade'].unique()))
paginas = st.sidebar.multiselect(
    "Página", options=sorted(df['pagina'].unique()), default=sorted(df['pagina'].unique()))
datas = st.sidebar.date_input(
    "Data", value=None, min_value=df['data'].min(), max_value=df['data'].max())

*# Aplicar filtros*
df_filtrado = df[
    df['cidade'].isin(cidades)
    & df['pagina'].isin(paginas)
]

if datas is not None and len(datas) == 2:
    df_filtrado = df_filtrado[
        (pd.to_datetime(df_filtrado['data']) >= pd.to_datetime(datas[0]))
        & (pd.to_datetime(df_filtrado['data']) <= pd.to_datetime(datas[1]))
    ]

*# Exibir os dados filtrados*
st.dataframe(df_filtrado)

*# --- Estatísticas básicas ---*
st.markdown("### Estatísticas Resumidas")
st.write(f"Total de visitas selecionadas: {len(df_filtrado)}")
st.write(f"Duração média das visitas: {df_filtrado['duracao'].mean():.1f} segundos")

4. Como Rodar o Dashboard

No terminal, execute:

streamlit run dashboard.py

Acesse o endereço mostrado no terminal pelo navegador (por padrão, http://localhost:8501).

5. O que você pode fazer no Dashboard