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