Spaces:
Running
Running
Update pages/Statistics.py
Browse files- 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 |
-
|
5 |
from datetime import datetime
|
6 |
|
7 |
-
#
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
#
|
21 |
-
|
22 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
#
|
95 |
-
|
96 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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)
|