Spaces:
Running
Running
Update pages/Statistics.py
Browse files- pages/Statistics.py +101 -24
pages/Statistics.py
CHANGED
@@ -1,26 +1,103 @@
|
|
1 |
-
# pages/Statistics.py
|
2 |
-
|
3 |
import streamlit as st
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
|
5 |
-
#
|
6 |
-
|
7 |
-
|
8 |
-
'header': "📈 Statystyki",
|
9 |
-
'content': """Tutaj znajdują się statystyki dotyczące analizowanych wiadomości SMS."""
|
10 |
-
},
|
11 |
-
'German': {
|
12 |
-
'header': "📈 Statistiken",
|
13 |
-
'content': """Hier befinden sich Statistiken zu den analysierten SMS-Nachrichten."""
|
14 |
-
},
|
15 |
-
'English': {
|
16 |
-
'header': "📈 Statistics",
|
17 |
-
'content': """Here are the statistics of the analyzed SMS messages."""
|
18 |
-
}
|
19 |
-
}
|
20 |
-
|
21 |
-
def main(language):
|
22 |
-
st.header(page_translations[language]['header'])
|
23 |
-
st.write(page_translations[language]['content'])
|
24 |
-
# Tutaj dodaj resztę funkcjonalności statystyk
|
25 |
-
|
26 |
-
# Do not include "if __name__ == '__main__':" block in pages
|
|
|
|
|
|
|
1 |
import streamlit as st
|
2 |
+
import pandas as pd
|
3 |
+
import plotly.express as px
|
4 |
+
import json
|
5 |
+
from utils.functions import get_stats, get_history, is_fake_number
|
6 |
+
from datetime import datetime
|
7 |
+
|
8 |
+
# Ustawienie strony
|
9 |
+
st.set_page_config(
|
10 |
+
page_title="📊 Statystyki Scam Detector",
|
11 |
+
layout="wide",
|
12 |
+
)
|
13 |
+
|
14 |
+
# Funkcja do załadowania statystyk
|
15 |
+
def load_stats():
|
16 |
+
stats = get_stats()
|
17 |
+
return stats
|
18 |
+
|
19 |
+
# Funkcja do załadowania historii
|
20 |
+
def load_history():
|
21 |
+
history = get_history()
|
22 |
+
return pd.DataFrame(history)
|
23 |
+
|
24 |
+
# 1. Statystyki ogólne
|
25 |
+
st.markdown("## 📊 Ogólne Statystyki")
|
26 |
+
|
27 |
+
# Ładowanie danych
|
28 |
+
stats = load_stats()
|
29 |
+
history_df = load_history()
|
30 |
+
|
31 |
+
# Kluczowe metryki
|
32 |
+
total_analyses = stats["total_analyses"]
|
33 |
+
total_frauds_detected = stats["total_frauds_detected"]
|
34 |
+
|
35 |
+
# Wyświetlenie metryk w poziomych kolumnach
|
36 |
+
col1, col2, col3 = st.columns(3)
|
37 |
+
col1.metric(label="Liczba przeanalizowanych wiadomości", value=total_analyses)
|
38 |
+
col2.metric(label="Wykryte oszustwa", value=total_frauds_detected)
|
39 |
+
col3.metric(label="Procent oszustw", value=f"{(total_frauds_detected/total_analyses)*100:.2f}%")
|
40 |
+
|
41 |
+
# 2. Dynamika analiz w czasie
|
42 |
+
st.markdown("### 📈 Dynamika analiz w czasie")
|
43 |
+
history_df['timestamp'] = pd.to_datetime(history_df['timestamp'])
|
44 |
+
history_df['date'] = history_df['timestamp'].dt.date
|
45 |
+
|
46 |
+
# Grupowanie po dacie
|
47 |
+
analyses_per_day = history_df.groupby('date').size().reset_index(name='count')
|
48 |
+
|
49 |
+
# Wykres dynamiki analiz
|
50 |
+
fig_analyses = px.line(analyses_per_day, x='date', y='count', title='Liczba analiz dziennie', labels={'count':'Liczba analiz', 'date':'Data'})
|
51 |
+
st.plotly_chart(fig_analyses, use_container_width=True)
|
52 |
+
|
53 |
+
# 3. Wykryte oszustwa na przestrzeni czasu
|
54 |
+
st.markdown("### 🚨 Wykryte oszustwa na przestrzeni czasu")
|
55 |
+
history_df['fraud_detected'] = history_df['risk_assessment'].apply(lambda x: 'Tak' if 'wysokie ryzyko' in x else 'Nie')
|
56 |
+
frauds_per_day = history_df[history_df['fraud_detected'] == 'Tak'].groupby('date').size().reset_index(name='count')
|
57 |
+
|
58 |
+
# Wykres wykrytych oszustw
|
59 |
+
fig_frauds = px.bar(frauds_per_day, x='date', y='count', title='Liczba wykrytych oszustw dziennie', labels={'count':'Liczba oszustw', 'date':'Data'})
|
60 |
+
st.plotly_chart(fig_frauds, use_container_width=True)
|
61 |
+
|
62 |
+
# 4. Najczęściej zgłaszane numery
|
63 |
+
st.markdown("### 📞 Najczęściej zgłaszane numery jako oszustwa")
|
64 |
+
# Grupa zgłoszonych numerów
|
65 |
+
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)
|
66 |
+
|
67 |
+
# Tabela zgłoszonych numerów
|
68 |
+
st.table(fake_numbers_df)
|
69 |
+
|
70 |
+
# 5. Kraje i operatorzy telefonii komórkowej związani z oszustwami
|
71 |
+
st.markdown("### 🌍 Kraje i operatorzy telefonii komórkowej związani z oszustwami")
|
72 |
+
if not history_df.empty:
|
73 |
+
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)))
|
74 |
+
country_stats = history_df[history_df['country'].notna()].groupby('country').size().reset_index(name='count').sort_values(by='count', ascending=False)
|
75 |
+
|
76 |
+
# Wykres mapy krajów
|
77 |
+
fig_map = px.choropleth(country_stats, locations='country', locationmode='country names', color='count', title='Liczba zgłoszonych oszustw według kraju')
|
78 |
+
st.plotly_chart(fig_map, use_container_width=True)
|
79 |
+
|
80 |
+
# 6. Średni czas analizy wiadomości
|
81 |
+
st.markdown("### ⏱ Średni czas analizy wiadomości")
|
82 |
+
history_df['analysis_time'] = (history_df['timestamp'].max() - history_df['timestamp'].min()).seconds
|
83 |
+
average_analysis_time = history_df['analysis_time'].mean()
|
84 |
+
|
85 |
+
# Wyświetlenie średniego czasu analizy
|
86 |
+
st.metric(label="Średni czas analizy", value=f"{average_analysis_time:.2f} sekund")
|
87 |
+
|
88 |
+
# 7. Statystyki użytkowników
|
89 |
+
st.markdown("### 👥 Statystyki użytkowników")
|
90 |
+
# Placeholder dla użytkowników, np. statystyk związanych z kontami (jeśli aplikacja ma użytkowników zarejestrowanych)
|
91 |
+
st.metric(label="Liczba użytkowników", value="500") # Zastąp dynamiczną wartością, jeśli dostępna
|
92 |
+
|
93 |
+
# 8. Zgłoszenia numerów jako oszustwa
|
94 |
+
st.markdown("### 🚩 Zgłoszenia numerów jako oszustwa")
|
95 |
+
reports_per_day = history_df[history_df['fraud_detected'] == 'Tak'].groupby('date').size().reset_index(name='count')
|
96 |
+
|
97 |
+
# Wykres zgłoszeń numerów
|
98 |
+
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'})
|
99 |
+
st.plotly_chart(fig_reports, use_container_width=True)
|
100 |
|
101 |
+
# 9. Historia analiz
|
102 |
+
st.markdown("### 🕑 Historia analizowanych wiadomości")
|
103 |
+
st.dataframe(history_df[['timestamp', 'phone_number', 'analysis', 'risk_assessment', 'recommendations']].head(10))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|