LevinAleksey/Blockchain_Contract_Analytics
0
1import streamlit as st2import pandas as pd3import plotly.express as px4import matplotlib5matplotlib.use('Agg')6import matplotlib.pyplot as plt7import json8import os9 10st.set_page_config(page_title="Crypto Dash", layout="wide")11 12 13def load_data() -> dict:14 app_dir = os.path.dirname(os.path.abspath(__file__))15 data_path = os.path.join(app_dir, "data.json")16 with open(data_path, "r", encoding="utf-8") as f:17 payload = json.load(f)18 return payload[0] if isinstance(payload, list) else payload19 20 21def build_cohorts_df(data: dict) -> pd.DataFrame:22 raw = data.get("users_by_cohorts", [])23 if not raw:24 return pd.DataFrame(columns=["cohort_day", "user_count"])25 df = pd.DataFrame(raw)26 df["cohort_day"] = pd.to_numeric(df["cohort_day"], errors="coerce")27 df["user_count"] = pd.to_numeric(df["user_count"], errors="coerce")28 return df.dropna().sort_values("cohort_day").reset_index(drop=True)29 30 31try:32 data = load_data()33except Exception as e:34 st.error(f"Ошибка загрузки data.json: {e}")35 st.stop()36 37st.title("📊 Blockchain Dashboard")38 39# KPI40c1, c2, c3 = st.columns(3)41c1.metric("Total TX", f"{data['total_tx_amount']:,}")42c2.metric("DAU", f"{data['dau']:,}")43c3.metric("New Wallets", f"{data['new_wallets_amount']:,}")44 45# Chart46st.subheader("User Activity by Cohort Day")47 48df = build_cohorts_df(data)49 50if df.empty:51 st.warning("Нет данных для графика.")52else:53 # 1. Plotly (primary)54 fig = px.area(df, x="cohort_day", y="user_count",55 title="Cohort Activity",56 template="plotly_white")57 fig.update_layout(height=400, margin=dict(l=20, r=20, t=40, b=20))58 st.plotly_chart(fig, use_container_width=True)59 60 # 2. Matplotlib PNG (server-side, always visible)61 mpl_fig, ax = plt.subplots(figsize=(10, 3))62 ax.fill_between(df["cohort_day"], df["user_count"], alpha=0.4)63 ax.plot(df["cohort_day"], df["user_count"], linewidth=2)64 ax.set_xlabel("Cohort Day")65 ax.set_ylabel("Users")66 ax.set_title("Cohort Activity (server-rendered)")67 ax.grid(alpha=0.3)68 st.pyplot(mpl_fig)69 plt.close(mpl_fig)70 71# Raw data72with st.expander("Raw Data"):73 st.write(data)74 