Files
ArchiveCostWebapp/analytics/app.py
T

83 lines
2.7 KiB
Python

import streamlit as st
import pandas as pd
import plotly.express as px
# Umrechnungsfaktor von Terabytes nach Bytes
TB2B = 1024**4
# Seitenkonfiguration (gibt uns ein schönes breites Layout)
st.set_page_config(layout="wide")
# 1. Daten laden (Pfad aus deinem Docker-Setup)
FILE_PATH = "/data/json_cache.json"
@st.cache_data
def load_data():
# Falls die Datei existiert, laden, sonst leeres Dataframe für den Test
try:
return pd.read_json(FILE_PATH)
except Exception:
# Dummy-Daten, falls Node-RED noch nichts abgelegt hat
return pd.DataFrame([
{"ownerGroup": "a-123", "department": "4000", "size": 500000},
{"ownerGroup": "p9999", "department": "6000", "size": 1200000}
])
df = load_data()
# 2. NAVIGATION LINKS (Sidebar)
st.sidebar.title("Navigation")
st.sidebar.markdown("Wählen Sie eine Ansicht:")
# Ein Radio-Button verhält sich wie eine klickbare Liste
auswahl = st.sidebar.radio(
label="Ansichten",
options=["Übersicht & Metriken", "Bereichs-Analyse", "Nicht zuweisbare Daten", "Rohdaten"],
label_visibility="collapsed" # Versteckt das Label für eine sauberere Optik
)
# 3. ANZEIGE RECHTS (Hauptbildschirm)
# Hier steuern wir den Inhalt basierend auf der Auswahl links
if auswahl == "Übersicht & Metriken":
st.title("Übersicht")
# Beispiel für schnelle Metriken rechts
col1, col2 = st.columns(2)
col1.metric("Anzahl Archivgruppen", len(df))
col2.metric("Gesamtvolumen (TB)", f'{df["size"].sum()/TB2B:.2f}' if "size" in df else "0.00")
# Hier könnte eine Grafik hin
if "department" in df:
fig = px.pie(df, names="department", title="Verteilung nach Departments")
st.plotly_chart(fig, use_container_width=True)
elif auswahl == "Bereichs-Analyse":
st.title("Bereichs-Analyse")
st.write("Filtern Sie die Daten gezielt nach einzelnen Abteilungen.")
# Ein zusätzlicher Filter, der nur in dieser Ansicht erscheint
if "department" in df:
depts = sorted(df["department"].unique().tolist())
gewaehltes_dept = st.selectbox("Wählen Sie ein Department:", depts)
filtered_df = df[df["department"] == gewaehltes_dept]
st.metric(f"Gruppen in Department {gewaehltes_dept}", len(filtered_df))
st.dataframe(filtered_df, use_container_width=True)
elif auswahl == "Nicht zuweisbare Daten":
st.title("Nicht zuweisbare Daten")
# Die Tabelle, die du schon gebaut hast
st.dataframe(df, use_container_width=True)
elif auswahl == "Rohdaten":
st.title("Rohdaten")
st.write("Durchsuchen und filtern Sie die vollständige Liste der Gruppen.")
# Die Tabelle, die du schon gebaut hast
st.dataframe(df, use_container_width=True)