rafaldembski commited on
Commit
3655f6c
·
verified ·
1 Parent(s): c3c70ea

Update pages/Statistics.py

Browse files
Files changed (1) hide show
  1. pages/Statistics.py +71 -81
pages/Statistics.py CHANGED
@@ -1,96 +1,86 @@
1
  import streamlit as st
2
  import pandas as pd
3
  import plotly.express as px
4
- from utils.functions import get_stats, get_history, is_fake_number
5
  from datetime import datetime
6
 
7
- # Funkcja do załadowania statystyk
8
- def load_stats():
9
- stats = get_stats()
10
- return stats
11
-
12
- # Funkcja do załadowania historii
13
- def load_history():
14
- history = get_history()
15
- return pd.DataFrame(history)
16
-
17
- # 1. Statystyki ogólne
18
- st.markdown("## 📊 Ogólne Statystyki")
19
-
20
- # Ładowanie danych
21
- stats = load_stats()
22
- history_df = load_history()
 
 
 
 
 
 
 
 
 
 
23
 
24
  # Kluczowe metryki
25
  total_analyses = stats["total_analyses"]
26
  total_frauds_detected = stats["total_frauds_detected"]
27
 
28
  # Wyświetlenie metryk w poziomych kolumnach
 
 
 
29
  col1, col2, col3 = st.columns(3)
30
  col1.metric(label="Liczba przeanalizowanych wiadomości", value=total_analyses)
31
  col2.metric(label="Wykryte oszustwa", value=total_frauds_detected)
32
- col3.metric(label="Procent oszustw", value=f"{(total_frauds_detected/total_analyses)*100:.2f}%")
33
-
34
- # 2. Dynamika analiz w czasie
35
- st.markdown("### 📈 Dynamika analiz w czasie")
36
- history_df['timestamp'] = pd.to_datetime(history_df['timestamp'])
37
- history_df['date'] = history_df['timestamp'].dt.date
38
-
39
- # Grupowanie po dacie
40
- analyses_per_day = history_df.groupby('date').size().reset_index(name='count')
41
-
42
- # Wykres dynamiki analiz
43
- fig_analyses = px.line(analyses_per_day, x='date', y='count', title='Liczba analiz dziennie', labels={'count':'Liczba analiz', 'date':'Data'})
44
- st.plotly_chart(fig_analyses, use_container_width=True)
45
-
46
- # 3. Wykryte oszustwa na przestrzeni czasu
47
- st.markdown("### 🚨 Wykryte oszustwa na przestrzeni czasu")
48
- history_df['fraud_detected'] = history_df['risk_assessment'].apply(lambda x: 'Tak' if 'wysokie ryzyko' in x else 'Nie')
49
- frauds_per_day = history_df[history_df['fraud_detected'] == 'Tak'].groupby('date').size().reset_index(name='count')
50
-
51
- # Wykres wykrytych oszustw
52
- fig_frauds = px.bar(frauds_per_day, x='date', y='count', title='Liczba wykrytych oszustw dziennie', labels={'count':'Liczba oszustw', 'date':'Data'})
53
- st.plotly_chart(fig_frauds, use_container_width=True)
54
-
55
- # 4. Najczęściej zgłaszane numery
56
- st.markdown("### 📞 Najczęściej zgłaszane numery jako oszustwa")
57
- # Grupa zgłoszonych numerów
58
- fake_numbers_df = history_df[history_df['fraud_detected'] == 'Tak'].groupby('phone_number').size().reset_index(name='count').sort_values(by='count', ascending=False).head(10)
59
-
60
- # Tabela zgłoszonych numerów
61
- st.table(fake_numbers_df)
62
-
63
- # 5. Kraje i operatorzy telefonii komórkowej związani z oszustwami
64
- st.markdown("### 🌍 Kraje i operatorzy telefonii komórkowej związani z oszustwami")
65
- if not history_df.empty:
66
- history_df['country'], history_df['operator'] = zip(*history_df['phone_number'].apply(lambda x: get_phone_info(x) if is_fake_number(x) else (None, None)))
67
- country_stats = history_df[history_df['country'].notna()].groupby('country').size().reset_index(name='count').sort_values(by='count', ascending=False)
68
-
69
- # Wykres mapy krajów
70
- fig_map = px.choropleth(country_stats, locations='country', locationmode='country names', color='count', title='Liczba zgłoszonych oszustw według kraju')
71
- st.plotly_chart(fig_map, use_container_width=True)
72
-
73
- # 6. Średni czas analizy wiadomości
74
- st.markdown("### ⏱ Średni czas analizy wiadomości")
75
- history_df['analysis_time'] = (history_df['timestamp'].max() - history_df['timestamp'].min()).seconds
76
- average_analysis_time = history_df['analysis_time'].mean()
77
-
78
- # Wyświetlenie średniego czasu analizy
79
- st.metric(label="Średni czas analizy", value=f"{average_analysis_time:.2f} sekund")
80
-
81
- # 7. Statystyki użytkowników
82
- st.markdown("### 👥 Statystyki użytkowników")
83
- # Placeholder dla użytkowników, np. statystyk związanych z kontami (jeśli aplikacja ma użytkowników zarejestrowanych)
84
- st.metric(label="Liczba użytkowników", value="500") # Zastąp dynamiczną wartością, jeśli dostępna
85
-
86
- # 8. Zgłoszenia numerów jako oszustwa
87
- st.markdown("### 🚩 Zgłoszenia numerów jako oszustwa")
88
- reports_per_day = history_df[history_df['fraud_detected'] == 'Tak'].groupby('date').size().reset_index(name='count')
89
-
90
- # Wykres zgłoszeń numerów
91
- fig_reports = px.bar(reports_per_day, x='date', y='count', title='Liczba zgłoszeń numerów jako oszustwa dziennie', labels={'count':'Liczba zgłoszeń', 'date':'Data'})
92
- st.plotly_chart(fig_reports, use_container_width=True)
93
 
94
- # 9. Historia analiz
95
- st.markdown("### 🕑 Historia analizowanych wiadomości")
96
- st.dataframe(history_df[['timestamp', 'phone_number', 'analysis', 'risk_assessment', 'recommendations']].head(10))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
2
  import pandas as pd
3
  import plotly.express as px
4
+ import json
5
  from datetime import datetime
6
 
7
+ # Ustawienie konfiguracji strony (należy upewnić się, że nie zostanie to wywołane więcej niż raz)
8
+ st.set_page_config(page_title="📊 Statystyki", page_icon="📈", layout="wide")
9
+
10
+ # Funkcja do pobierania statystyk
11
+ def get_stats():
12
+ stats_file = 'stats.json'
13
+ try:
14
+ with open(stats_file, 'r') as f:
15
+ stats = json.load(f)
16
+ return stats
17
+ except (json.JSONDecodeError, FileNotFoundError):
18
+ return {"total_analyses": 0, "total_frauds_detected": 0}
19
+
20
+ # Funkcja do pobierania historii analiz
21
+ def get_history():
22
+ history_file = 'history.json'
23
+ try:
24
+ with open(history_file, 'r') as f:
25
+ history = json.load(f)
26
+ return history
27
+ except (json.JSONDecodeError, FileNotFoundError):
28
+ return []
29
+
30
+ # Pobieranie danych z plików
31
+ stats = get_stats()
32
+ history = get_history()
33
 
34
  # Kluczowe metryki
35
  total_analyses = stats["total_analyses"]
36
  total_frauds_detected = stats["total_frauds_detected"]
37
 
38
  # Wyświetlenie metryk w poziomych kolumnach
39
+ st.title("📊 Statystyki Aplikacji")
40
+ st.markdown("Poniżej znajdują się statystyki analizy wiadomości w aplikacji.")
41
+
42
  col1, col2, col3 = st.columns(3)
43
  col1.metric(label="Liczba przeanalizowanych wiadomości", value=total_analyses)
44
  col2.metric(label="Wykryte oszustwa", value=total_frauds_detected)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
 
46
+ # Obsługa przypadku, gdy total_analyses jest równe 0
47
+ if total_analyses > 0:
48
+ fraud_percentage = (total_frauds_detected / total_analyses) * 100
49
+ else:
50
+ fraud_percentage = 0 # Ustawienie 0% w przypadku braku analiz
51
+
52
+ col3.metric(label="Procent oszustw", value=f"{fraud_percentage:.2f}%")
53
+
54
+ # Wyświetlenie historii analiz w tabeli
55
+ if history:
56
+ st.markdown("### Historia analizowanych wiadomości")
57
+ df_history = pd.DataFrame(history)
58
+
59
+ # Formatowanie daty
60
+ df_history['timestamp'] = pd.to_datetime(df_history['timestamp'])
61
+
62
+ # Wyświetlenie tabeli historii
63
+ st.dataframe(df_history[['timestamp', 'phone_number', 'risk_assessment']], height=300)
64
+
65
+ # Wizualizacja liczby analiz w czasie
66
+ st.markdown("### Liczba analizowanych wiadomości w czasie")
67
+ df_history['date'] = df_history['timestamp'].dt.date
68
+ analyses_over_time = df_history.groupby('date').size().reset_index(name='counts')
69
+ fig_analyses_over_time = px.line(analyses_over_time, x='date', y='counts', title='Liczba analizowanych wiadomości w czasie')
70
+ st.plotly_chart(fig_analyses_over_time)
71
+
72
+ # Wizualizacja oszustw w czasie
73
+ st.markdown("### Liczba wykrytych oszustw w czasie")
74
+ df_history['fraud_detected'] = df_history['risk_assessment'].apply(lambda x: 'Wykryte oszustwo' if '10/10' in x else 'Brak oszustwa')
75
+ frauds_over_time = df_history.groupby(['date', 'fraud_detected']).size().reset_index(name='counts')
76
+ fig_frauds_over_time = px.bar(frauds_over_time, x='date', y='counts', color='fraud_detected', title='Wykryte oszustwa w czasie')
77
+ st.plotly_chart(fig_frauds_over_time)
78
+ else:
79
+ st.info("Brak dostępnych danych do wyświetlenia.")
80
+
81
+ # Wizualizacje ryzyka oszustwa (jeśli są dostępne dane)
82
+ if history:
83
+ st.markdown("### Rozkład ocen ryzyka oszustwa")
84
+ df_history['risk_score'] = df_history['risk_assessment'].apply(lambda x: int(x.split('/')[0]) if '/' in x else 0)
85
+ fig_risk_distribution = px.histogram(df_history, x='risk_score', nbins=10, title='Rozkład ocen ryzyka oszustwa (1-10)')
86
+ st.plotly_chart(fig_risk_distribution)