CoolFace
Apppublic

LevinAleksey/Blockchain_Contract_Analytics

sourceHugging Faceupdated 6mo agoView on Hugging Face
0likes
app.py74 linesDownload Raw Back to root
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