Update app.py
Browse files
app.py
CHANGED
|
@@ -10,7 +10,9 @@ from utils import (
|
|
| 10 |
mois_numero_vers_nom,
|
| 11 |
mois_nom_vers_numero,
|
| 12 |
obtenir_derniers_rapports,
|
| 13 |
-
est_rapport_deja_traite
|
|
|
|
|
|
|
| 14 |
)
|
| 15 |
|
| 16 |
# Configuration de la page
|
|
@@ -137,6 +139,35 @@ def main():
|
|
| 137 |
st.error(f"Erreur lors du traitement: {str(e)}")
|
| 138 |
else:
|
| 139 |
st.error("Veuillez entrer une URL valide.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 140 |
|
| 141 |
# Option pour télécharger la base de données
|
| 142 |
st.subheader("Télécharger la base de données")
|
|
@@ -293,16 +324,49 @@ def main():
|
|
| 293 |
|
| 294 |
if date_column is not None:
|
| 295 |
try:
|
| 296 |
-
# Essayer
|
| 297 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 298 |
|
| 299 |
if not filtered_df["DateFormat"].isna().all():
|
| 300 |
-
|
| 301 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 302 |
|
| 303 |
fig = px.line(monthly_counts, x="Date", y="Nombre de cas",
|
| 304 |
-
|
| 305 |
-
|
| 306 |
fig.update_traces(line=dict(color="#4b6043", width=3), marker=dict(size=8))
|
| 307 |
fig.update_layout(
|
| 308 |
xaxis_title="Date",
|
|
@@ -314,6 +378,7 @@ def main():
|
|
| 314 |
st.warning("Les dates ne sont pas dans un format valide pour la visualisation temporelle")
|
| 315 |
except Exception as e:
|
| 316 |
st.warning(f"Impossible de créer le graphique temporel: {str(e)}")
|
|
|
|
| 317 |
else:
|
| 318 |
st.warning("Colonne Date non disponible dans votre base de données")
|
| 319 |
|
|
|
|
| 10 |
mois_numero_vers_nom,
|
| 11 |
mois_nom_vers_numero,
|
| 12 |
obtenir_derniers_rapports,
|
| 13 |
+
est_rapport_deja_traite,
|
| 14 |
+
telecharger_et_extraire_pdf,
|
| 15 |
+
parser_cas_fraude
|
| 16 |
)
|
| 17 |
|
| 18 |
# Configuration de la page
|
|
|
|
| 139 |
st.error(f"Erreur lors du traitement: {str(e)}")
|
| 140 |
else:
|
| 141 |
st.error("Veuillez entrer une URL valide.")
|
| 142 |
+
|
| 143 |
+
# Section pour tester une URL spécifique
|
| 144 |
+
st.subheader("Tester une URL spécifique")
|
| 145 |
+
test_url = st.text_input("URL à tester (laissez vide pour utiliser l'URL par défaut)", "")
|
| 146 |
+
if st.button("Tester l'extraction"):
|
| 147 |
+
with st.spinner("Test en cours..."):
|
| 148 |
+
try:
|
| 149 |
+
if not test_url:
|
| 150 |
+
test_url = "https://knowledge4policy.ec.europa.eu/sites/default/files/202502_0.pdf" # URL par défaut
|
| 151 |
+
st.info(f"Utilisation de l'URL par défaut : {test_url}")
|
| 152 |
+
|
| 153 |
+
texte_pdf = telecharger_et_extraire_pdf(test_url)
|
| 154 |
+
st.success(f"PDF téléchargé avec succès. Longueur du texte : {len(texte_pdf)} caractères")
|
| 155 |
+
|
| 156 |
+
# Tester l'extraction des cas
|
| 157 |
+
with st.expander("Aperçu du texte extrait"):
|
| 158 |
+
st.text(texte_pdf[:1000] + "...")
|
| 159 |
+
|
| 160 |
+
# Tester le parsing des cas
|
| 161 |
+
mois_test = "February"
|
| 162 |
+
annee_test = 2025
|
| 163 |
+
df_test = parser_cas_fraude(texte_pdf, mois_test, annee_test)
|
| 164 |
+
|
| 165 |
+
st.success(f"{len(df_test)} cas de fraude extraits")
|
| 166 |
+
|
| 167 |
+
with st.expander("Aperçu des cas extraits"):
|
| 168 |
+
st.dataframe(df_test.head(10))
|
| 169 |
+
except Exception as e:
|
| 170 |
+
st.error(f"Erreur lors du test : {str(e)}")
|
| 171 |
|
| 172 |
# Option pour télécharger la base de données
|
| 173 |
st.subheader("Télécharger la base de données")
|
|
|
|
| 324 |
|
| 325 |
if date_column is not None:
|
| 326 |
try:
|
| 327 |
+
# Essayer différents formats de date
|
| 328 |
+
try:
|
| 329 |
+
# Format JJ/MM/AAAA
|
| 330 |
+
filtered_df["DateFormat"] = pd.to_datetime(filtered_df[date_column], format="%d/%m/%Y", errors="coerce")
|
| 331 |
+
except:
|
| 332 |
+
# Autre tentative si le premier format échoue
|
| 333 |
+
try:
|
| 334 |
+
filtered_df["DateFormat"] = pd.to_datetime(filtered_df[date_column], dayfirst=True, errors="coerce")
|
| 335 |
+
except:
|
| 336 |
+
# Dernière tentative
|
| 337 |
+
filtered_df["DateFormat"] = pd.to_datetime(filtered_df[date_column], errors="coerce")
|
| 338 |
+
|
| 339 |
+
# Si trop de dates sont NaT, essayer de créer des dates à partir des colonnes Mois et Année
|
| 340 |
+
if filtered_df["DateFormat"].isna().mean() > 0.5 and "Mois" in filtered_df.columns and "Année" in filtered_df.columns:
|
| 341 |
+
# Créer dates à partir de Mois et Année
|
| 342 |
+
def create_date(row):
|
| 343 |
+
try:
|
| 344 |
+
if isinstance(row["Mois"], str):
|
| 345 |
+
mois_num = mois_nom_vers_numero(row["Mois"])
|
| 346 |
+
else:
|
| 347 |
+
mois_num = str(row["Mois"]).zfill(2)
|
| 348 |
+
|
| 349 |
+
return pd.to_datetime(f"{row['Année']}-{mois_num}-01")
|
| 350 |
+
except:
|
| 351 |
+
return pd.NaT
|
| 352 |
+
|
| 353 |
+
filtered_df["DateFormat"] = filtered_df.apply(create_date, axis=1)
|
| 354 |
|
| 355 |
if not filtered_df["DateFormat"].isna().all():
|
| 356 |
+
# Grouper par mois
|
| 357 |
+
filtered_df["YearMonth"] = filtered_df["DateFormat"].dt.to_period("M")
|
| 358 |
+
monthly_counts = filtered_df.groupby("YearMonth").size().reset_index()
|
| 359 |
+
monthly_counts.columns = ["YearMonth", "Nombre de cas"]
|
| 360 |
+
|
| 361 |
+
# Convertir YearMonth back to datetime for plotting
|
| 362 |
+
monthly_counts["Date"] = monthly_counts["YearMonth"].dt.to_timestamp()
|
| 363 |
+
|
| 364 |
+
# Trier par date
|
| 365 |
+
monthly_counts = monthly_counts.sort_values("Date")
|
| 366 |
|
| 367 |
fig = px.line(monthly_counts, x="Date", y="Nombre de cas",
|
| 368 |
+
title="Évolution mensuelle des cas de fraude",
|
| 369 |
+
markers=True, line_shape="spline")
|
| 370 |
fig.update_traces(line=dict(color="#4b6043", width=3), marker=dict(size=8))
|
| 371 |
fig.update_layout(
|
| 372 |
xaxis_title="Date",
|
|
|
|
| 378 |
st.warning("Les dates ne sont pas dans un format valide pour la visualisation temporelle")
|
| 379 |
except Exception as e:
|
| 380 |
st.warning(f"Impossible de créer le graphique temporel: {str(e)}")
|
| 381 |
+
st.code(str(e)) # Afficher l'erreur détaillée pour le débogage
|
| 382 |
else:
|
| 383 |
st.warning("Colonne Date non disponible dans votre base de données")
|
| 384 |
|