LevinAleksey commited on
Commit
77e581b
·
verified ·
1 Parent(s): c9aecbc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +28 -122
app.py CHANGED
@@ -4,125 +4,31 @@ import plotly.express as px
4
  import json
5
  import os
6
 
7
- # 1. Настройки страницы для Hugging Face
8
- st.set_page_config(
9
- page_title="Blockchain Analytics Dashboard",
10
- layout="wide",
11
- initial_sidebar_state="collapsed"
12
- )
13
-
14
- # Стилизация (Тёмная тема и отступы)
15
- st.markdown("""
16
- <style>
17
- .main { background-color: #0e1117; }
18
- [data-testid="stMetricValue"] { font-size: 1.8rem; color: #00CC96; }
19
- </style>
20
- """, unsafe_allow_html=True)
21
-
22
- # 2. Функция загрузки данных (учитываем, что JSON — это список)
23
- def load_blockchain_data():
24
- if not os.path.exists('data.json'):
25
- st.error("❌ Файл 'data.json' не найден в корневой директории!")
26
- return None
27
-
28
- try:
29
- with open('data.json', 'r') as f:
30
- raw_json = json.load(f)
31
- # Твой JSON обернут в список [ {...} ], извлекаем первый элемент
32
- return raw_json[0] if isinstance(raw_json, list) else raw_json
33
- except Exception as e:
34
- st.error(f"❌ Ошибка чтения JSON: {e}")
35
- return None
36
-
37
- data = load_blockchain_data()
38
-
39
- if data:
40
- st.title("📊 Аналитика Смарт-Контракта")
41
- st.caption(f"ID отчета: {data.get('report_id')} | Контракт: {data.get('contract_address')}")
42
-
43
- # --- БЛОК 1: KPI МЕТРИКИ ---
44
- st.divider()
45
- kpi1, kpi2, kpi3, kpi4 = st.columns(4)
46
-
47
- with kpi1:
48
- st.metric("Total Transactions", f"{data.get('total_tx_amount', 0):,}",
49
- f"{data.get('percentage_of_tx_prev_day', 0):.2f}%")
50
- with kpi2:
51
- st.metric("DAU", f"{data.get('dau', 0):,}",
52
- f"{data.get('dau_comparison_prev_day', 0):.2f}%")
53
- with kpi3:
54
- st.metric("New Wallets", f"{data.get('new_wallets_amount', 0):,}")
55
- with kpi4:
56
- fail_count = data.get('failed_tx', 0)
57
- total = data.get('total_tx_amount', 1)
58
- success_rate = ((total - fail_count) / total) * 100
59
- st.metric("Success Rate", f"{success_rate:.1f}%", f"-{fail_count} errors", delta_color="inverse")
60
-
61
- st.divider()
62
-
63
- # --- БЛОК 2: ГРАФИКИ (Когорты и Методы) ---
64
- col_left, col_right = st.columns([2, 1])
65
-
66
- with col_left:
67
- st.subheader("📈 Активность по дням жизни (Cohorts)")
68
- df_cohorts = pd.DataFrame(data.get('users_by_cohorts', []))
69
- if not df_cohorts.empty:
70
- fig_cohorts = px.area(
71
- df_cohorts,
72
- x='cohort_day',
73
- y='user_count',
74
- labels={'cohort_day': 'День жизни', 'user_count': 'Юзеров'},
75
- color_discrete_sequence=['#00CC96'],
76
- template="plotly_dark"
77
- )
78
- fig_cohorts.update_traces(fillcolor='rgba(0, 204, 150, 0.2)')
79
- st.plotly_chart(fig_cohorts, use_container_width=True)
80
-
81
- with col_right:
82
- st.subheader("🧩 Методы")
83
- df_methods = pd.DataFrame(data.get('method_amount', []))
84
- if not df_methods.empty:
85
- # Упрощаем имя метода для легенды
86
- df_methods['display_name'] = df_methods['method_name'].apply(lambda x: x.split('(')[0])
87
- fig_pie = px.pie(
88
- df_methods,
89
- values='tx_count',
90
- names='display_name',
91
- hole=0.4,
92
- template="plotly_dark",
93
- color_discrete_sequence=px.colors.qualitative.Pastel
94
- )
95
- st.plotly_chart(fig_pie, use_container_width=True)
96
-
97
- # --- БЛОК 3: ТРАНЗАКЦИИ ПО ДАТАМ ---
98
- st.subheader("📅 Динамика транзакций по календарю")
99
-
100
- daily_stats = []
101
- tx_by_day = data.get('txs_per_day_by_cohorts', {})
102
-
103
- for date_str, cohort_data in tx_by_day.items():
104
- daily_stats.append({
105
- "Дата": date_str,
106
- "Транзакции": sum(cohort_data.values())
107
- })
108
-
109
- if daily_stats:
110
- df_daily = pd.DataFrame(daily_stats).sort_values('Дата')
111
- fig_bar = px.bar(
112
- df_daily,
113
- x='Дата',
114
- y='Транзакции',
115
- text_auto='.2s',
116
- template="plotly_dark",
117
- color_discrete_sequence=['#636EFA']
118
- )
119
- st.plotly_chart(fig_bar, use_container_width=True)
120
-
121
- # Техническая инфа в подвале
122
- with st.expander("Просмотреть технические детали JSON"):
123
- st.json(data)
124
-
125
- else:
126
- st.warning("⚠️ Данные не загружены. Проверьте структуру data.json.")
127
-
128
- # Конец файла
 
4
  import json
5
  import os
6
 
7
+ st.set_page_config(page_title="Crypto Dash", layout="wide")
8
+
9
+ # Проверка файла
10
+ if not os.path.exists('data.json'):
11
+ st.error("Файл data.json не найден в корне!")
12
+ st.stop()
13
+
14
+ with open('data.json', 'r') as f:
15
+ # Твой файл — это список [ {...} ], берем первый элемент
16
+ data = json.load(f)[0]
17
+
18
+ st.title("📊 Blockchain Dashboard")
19
+
20
+ # KPI блоки
21
+ c1, c2, c3 = st.columns(3)
22
+ c1.metric("Total TX", f"{data['total_tx_amount']:,}")
23
+ c2.metric("DAU", f"{data['dau']:,}")
24
+ c3.metric("New Wallets", f"{data['new_wallets_amount']:,}")
25
+
26
+ # График когорт
27
+ st.subheader("User Activity by Cohort Day")
28
+ df_cohorts = pd.DataFrame(data['users_by_cohorts'])
29
+ fig = px.area(df_cohorts, x='cohort_day', y='user_count', template="plotly_dark")
30
+ st.plotly_chart(fig, use_container_width=True)
31
+
32
+ # Проверка данных внизу
33
+ with st.expander("Raw Data"):
34
+ st.write(data)