edb-noumea 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ Metadata-Version: 2.4
2
+ Name: edb-noumea
3
+ Version: 0.1.0
4
+ Summary: Un scraper pour la qualité des eaux de baignade à Nouméa.
5
+ Requires-Dist: requests
6
+ Requires-Dist: beautifulsoup4
7
+ Requires-Dist: pandas
8
+ Requires-Dist: lxml
9
+ Requires-Dist: tabula-py
10
+ Requires-Dist: matplotlib
@@ -0,0 +1,184 @@
1
+ <<<<<<< HEAD
2
+ # edb-noumea
3
+ SDK Python pour connaître la Qualité des Eaux de Baignade à Nouméa
4
+ =======
5
+ # Qualité des Eaux de Baignade à Nouméa
6
+
7
+ Ce projet Python fournit un outil simple pour scraper les données sur la qualité des eaux de baignade à Nouméa depuis le site officiel de la ville (`noumea.nc`). Il extrait les informations et les présente sous forme de tableau dans le terminal.
8
+
9
+ Il se base sur les données de https://www.noumea.nc/noumea-pratique/salubrite-publique/qualite-eaux-baignade
10
+
11
+ ## Prérequis
12
+
13
+ Avant de commencer, assurez-vous d'avoir installé `uv`, le gestionnaire de paquets et d'environnements virtuels Python.
14
+
15
+ - [Instructions d'installation de uv](https://github.com/astral-sh/uv)
16
+
17
+ ## Installation
18
+
19
+ Suivez ces étapes pour configurer l'environnement et installer les dépendances.
20
+
21
+ 1. **Accédez au répertoire du projet :**
22
+ ```bash
23
+ cd edb-noumea
24
+ ```
25
+
26
+ 2. **Créez un environnement virtuel avec `uv` :**
27
+ ```bash
28
+ uv venv
29
+ ```
30
+
31
+ 3. **Activez l'environnement virtuel :**
32
+ ```bash
33
+ source .venv/bin/activate
34
+ ```
35
+ *(Sur Windows, utilisez `.venv\Scripts\activate`)*
36
+
37
+ 4. **Installez les dépendances du projet :**
38
+ ```bash
39
+ uv pip install -e .
40
+ ```
41
+ *(L'option `-e .` installe le projet en mode "éditable", ce qui vous permet de modifier le code sans avoir à le réinstaller.)*
42
+
43
+ ## Utilisation
44
+
45
+ Ce package peut être utilisé de deux manières : soit pour obtenir un résumé de l'état des plages, soit pour obtenir les résultats détaillés des derniers prélèvements.
46
+
47
+ ### Obtenir le résumé de l'état sanitaire
48
+
49
+ Pour obtenir le tableau de résumé simple depuis la page web principale, exécutez :
50
+ ```bash
51
+ python -m edb_noumea.main
52
+ ```
53
+
54
+ ### Obtenir les résultats détaillés (depuis PDF)
55
+
56
+ Pour obtenir le tableau détaillé des derniers relevés (extrait automatiquement du dernier fichier PDF disponible), exécutez :
57
+ ```bash
58
+ python -m edb_noumea.details
59
+ ```
60
+
61
+
62
+ ## Générer des graphiques PNG des analyses détaillées
63
+
64
+ Vous pouvez générer automatiquement deux graphiques au format PNG (niveaux d'E. coli et d'Entérocoques par point de prélèvement) à partir des derniers résultats d'analyses, grâce au script fourni.
65
+
66
+ ### Étapes
67
+
68
+ 1. Assurez-vous que l'environnement virtuel est activé et que les dépendances sont installées.
69
+ 2. Exécutez le script suivant depuis le répertoire du projet :
70
+
71
+ ```bash
72
+ source .venv/bin/activate
73
+ /home/adriens/Github/edb-noumea/noumea_water_quality/.venv/bin/python generer_graphique_analyses.py
74
+ ```
75
+
76
+ Deux fichiers PNG seront générés dans le dossier courant :
77
+
78
+ - `ecoli_levels.png` : graphique des niveaux d'E. coli par point de prélèvement
79
+ - `entero_levels.png` : graphique des niveaux d'Entérocoques par point de prélèvement
80
+
81
+ Vous pouvez ouvrir ces fichiers pour visualiser les résultats détaillés des analyses.
82
+
83
+ ---
84
+ ## Utilisation en tant que Bibliothèque
85
+
86
+ Vous pouvez également importer les fonctions dans vos propres scripts Python pour une intégration plus poussée.
87
+
88
+ ### Obtenir le résumé
89
+
90
+ ```python
91
+ # exemple_resume.py
92
+ from edb_noumea.main import get_water_quality
93
+
94
+ df_resume = get_water_quality()
95
+
96
+ if df_resume is not None:
97
+ print("Résumé de l'état des plages :")
98
+ print(df_resume.to_string())
99
+ ```
100
+
101
+ ### Obtenir les résultats détaillés
102
+
103
+ ```python
104
+ # exemple_details.py
105
+ from edb_noumea.details import get_detailed_results
106
+
107
+ df_details = get_detailed_results()
108
+
109
+ if df_details is not None:
110
+ print("Détails des derniers relevés :")
111
+ print(df_details.to_string())
112
+ ```
113
+
114
+ ### Exemple de Visualisation
115
+
116
+ Voici un exemple montrant comment récupérer les données détaillées et créer un graphique simple avec `matplotlib` pour visualiser les niveaux d'E. coli par point de prélèvement.
117
+
118
+ ```python
119
+ # exemple_visualisation.py
120
+ import pandas as pd
121
+ import matplotlib.pyplot as plt
122
+ from edb_noumea.details import get_detailed_results
123
+
124
+ # Obtenir les données détaillées
125
+ df = get_detailed_results()
126
+
127
+ if df is not None and not df.empty:
128
+ print("Création du graphique...")
129
+
130
+ # S'assurer que les données sont triées pour une meilleure lisibilité
131
+ df_sorted = df.sort_values(by='e_coli_npp_100ml', ascending=False)
132
+
133
+ # Créer le graphique à barres horizontales
134
+ plt.figure(figsize=(12, 8))
135
+ plt.barh(df_sorted['point_de_prelevement'], df_sorted['e_coli_npp_100ml'], color='skyblue')
136
+
137
+ # Ajouter les titres et les étiquettes
138
+ plt.xlabel('E. coli (NPP/100ml)')
139
+ plt.ylabel('Point de prélèvement')
140
+ plt.title("Niveaux d'E. coli par Point de Prélèvement")
141
+ plt.gca().invert_yaxis() # Afficher le plus élevé en haut
142
+ plt.tight_layout() # Ajuster le layout pour que tout soit visible
143
+
144
+ # Sauvegarder le graphique dans un fichier
145
+ plt.savefig('ecoli_levels.png')
146
+ print("Graphique sauvegardé sous 'ecoli_levels.png'")
147
+
148
+ # Afficher le graphique
149
+ plt.show()
150
+ else:
151
+ print("Aucune donnée à afficher.")
152
+
153
+ ```
154
+
155
+ *Assurez-vous que votre script est exécuté dans le même environnement virtuel où le package `edb-noumea` a été installé.*
156
+
157
+ ## Sortie Attendue
158
+
159
+ ### Résumé de l'état sanitaire (`main`)
160
+ ```
161
+ 📊 État sanitaire des eaux de baignade à Nouméa 📊
162
+ Plage État sanitaire
163
+ 0 Plage de la baie des Citrons Baignade autorisée
164
+ 1 Plage de la promenade Pierre-Vernier Baignade autorisée
165
+ ...
166
+ ```
167
+
168
+ ### Détails des relevés (`details`)
169
+ ```
170
+ 📋 Voici les détails des derniers relevés :
171
+ Site Point de prélèvement Date Heure E. coli (NPP/100ml) Entérocoques (NPP/100ml)
172
+ 0 PLAGE DE LA BAIE DES CITRONS P18049, Face The Beach House 04/09/2025 07:29 10 20
173
+ 1 PLAGE DE LA BAIE DES CITRONS P18050, Face allée centrale Mirage plaza 04/09/2025 07:33 62 75
174
+ ...
175
+ ```
176
+
177
+ ## Dépendances
178
+
179
+ - `requests`: Pour effectuer les requêtes HTTP.
180
+ - `beautifulsoup4`: Pour l'analyse du code HTML.
181
+ - `pandas`: Pour la création et la manipulation des DataFrames.
182
+ - `lxml`: Utilisé comme parseur par BeautifulSoup pour de meilleures performances.
183
+ - `tabula-py`: Pour l'extraction de tableaux depuis des fichiers PDF. **Note :** `tabula-py` requiert que [Java](https://www.java.com/) soit installé sur votre système.
184
+ >>>>>>> cfd27fd (Initial commit du projet edb-noumea)
@@ -0,0 +1 @@
1
+ # This file makes the 'scraper' directory a Python package.
@@ -0,0 +1,86 @@
1
+ import pandas as pd
2
+ import tabula
3
+ import requests
4
+ import io
5
+
6
+ # URL du fichier PDF contenant les résultats détaillés
7
+ PDF_URL = "https://www.noumea.nc/sites/default/files/noumea-pratique-salubrite-publique-resultats/2025/250905-resultats-surveillance-ebm.pdf"
8
+
9
+ def get_detailed_results():
10
+ """
11
+ Télécharge le PDF des résultats détaillés, en extrait le premier tableau
12
+ et le retourne sous forme de DataFrame pandas.
13
+ """
14
+ print(f"📥 Téléchargement du PDF depuis {PDF_URL}...")
15
+ try:
16
+ # Effectuer la requête HTTP pour obtenir le contenu du PDF
17
+ headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
18
+ response = requests.get(PDF_URL, headers=headers)
19
+ response.raise_for_status()
20
+ print("✅ Téléchargement terminé.")
21
+ except requests.exceptions.RequestException as e:
22
+ print(f"❌ Erreur lors du téléchargement du fichier PDF : {e}")
23
+ return None
24
+
25
+ # Utiliser un buffer en mémoire pour éviter de sauvegarder le fichier sur le disque
26
+ pdf_file = io.BytesIO(response.content)
27
+
28
+ try:
29
+ print("🔍 Extraction des tableaux du PDF...")
30
+ # Extraire tous les tableaux de la première page du PDF
31
+ # L'option pages='1' est importante pour ne pas scanner tout le document
32
+ tables = tabula.read_pdf(pdf_file, pages='1', stream=True)
33
+ except Exception as e:
34
+ print(f"❌ Une erreur est survenue lors de l'extraction des données du PDF.")
35
+ print("ℹ️ Cela peut être dû à l'absence de Java sur votre système, qui est requis par la bibliothèque 'tabula-py'.")
36
+ print(f" Erreur originale : {e}")
37
+ return None
38
+
39
+
40
+ if not tables:
41
+ print("❌ Aucun tableau n'a été trouvé dans le PDF.")
42
+ return None
43
+
44
+ print(f"✅ {len(tables)} tableau(x) trouvé(s). Affichage du premier.")
45
+
46
+ # Le premier tableau est notre cible
47
+ df = tables[0]
48
+
49
+ # --- Nettoyage du DataFrame ---
50
+
51
+ # 1. Définir les noms de colonnes attendus en snake_case.
52
+ columns_to_keep = {
53
+ df.columns[0]: "site",
54
+ df.columns[1]: "point_de_prelevement",
55
+ df.columns[2]: "date",
56
+ df.columns[4]: "heure",
57
+ df.columns[6]: "e_coli_npp_100ml",
58
+ df.columns[9]: "enterocoques_npp_100ml"
59
+ }
60
+
61
+ # 2. Sélectionner uniquement ces colonnes et en faire une copie
62
+ cleaned_df = df[columns_to_keep.keys()].copy()
63
+
64
+ # 3. Renommer les colonnes
65
+ cleaned_df.rename(columns=columns_to_keep, inplace=True)
66
+
67
+ # 4. Remplacer les valeurs non numériques et convertir en type numérique
68
+ cleaned_df.replace({'<10': 0}, inplace=True)
69
+
70
+ # Convertir les colonnes en numérique, les erreurs deviendront NaN (non-numérique)
71
+ cleaned_df['e_coli_npp_100ml'] = pd.to_numeric(cleaned_df['e_coli_npp_100ml'], errors='coerce')
72
+ cleaned_df['enterocoques_npp_100ml'] = pd.to_numeric(cleaned_df['enterocoques_npp_100ml'], errors='coerce')
73
+
74
+ # Remplir les éventuelles valeurs NaN qui auraient pu être créées
75
+ cleaned_df.fillna(0, inplace=True)
76
+
77
+ return cleaned_df
78
+
79
+ if __name__ == "__main__":
80
+ # Obtenir le DataFrame des résultats détaillés
81
+ detailed_df = get_detailed_results()
82
+
83
+ # Afficher le DataFrame s'il a été créé avec succès
84
+ if detailed_df is not None:
85
+ print("\n📋 Voici les détails des derniers relevés :")
86
+ print(detailed_df.to_string())
@@ -0,0 +1,54 @@
1
+ import requests
2
+ import pandas as pd
3
+
4
+ # URL de la page à scraper
5
+ URL = "https://www.noumea.nc/noumea-pratique/salubrite-publique/qualite-eaux-baignade"
6
+
7
+ def get_water_quality():
8
+ """
9
+ Récupère les données sur la qualité de l'eau de baignade depuis le site de la ville de Nouméa
10
+ et les retourne dans un DataFrame pandas en lisant directement les tables HTML.
11
+ """
12
+ try:
13
+ # Effectuer la requête HTTP pour obtenir le contenu de la page
14
+ # Ajouter un header User-Agent pour simuler un navigateur
15
+ headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
16
+ response = requests.get(URL, headers=headers)
17
+ # Lancer une exception si la requête a échoué
18
+ response.raise_for_status()
19
+ except requests.exceptions.RequestException as e:
20
+ print(f"Erreur lors de la requête HTTP : {e}")
21
+ return None
22
+
23
+ try:
24
+ # pandas.read_html retourne une liste de tous les DataFrames trouvés dans le HTML
25
+ tables = pd.read_html(response.content, flavor='lxml')
26
+ except ValueError:
27
+ print("Aucune table n'a été trouvée sur la page.")
28
+ return None
29
+
30
+ if not tables:
31
+ print("Aucune table n'a été trouvée sur la page.")
32
+ return None
33
+
34
+ # En supposant que le tableau que nous voulons est le premier trouvé
35
+ df = tables[0]
36
+
37
+ # Renommer les colonnes pour qu'elles soient plus claires
38
+ # Nous nous attendons à deux colonnes : Plage et État
39
+ if df.shape[1] == 2:
40
+ df.columns = ["plage", "etat_sanitaire"]
41
+ else:
42
+ print(f"La table trouvée n'a pas le format attendu (2 colonnes). Colonnes trouvées : {df.shape[1]}")
43
+ return None
44
+
45
+ return df
46
+
47
+ if __name__ == "__main__":
48
+ # Appeler la fonction pour obtenir le DataFrame
49
+ water_quality_df = get_water_quality()
50
+
51
+ # Afficher le DataFrame s'il a été créé avec succès
52
+ if water_quality_df is not None:
53
+ print("📊 État sanitaire des eaux de baignade à Nouméa 📊")
54
+ print(water_quality_df.to_string())
@@ -0,0 +1,10 @@
1
+ Metadata-Version: 2.4
2
+ Name: edb-noumea
3
+ Version: 0.1.0
4
+ Summary: Un scraper pour la qualité des eaux de baignade à Nouméa.
5
+ Requires-Dist: requests
6
+ Requires-Dist: beautifulsoup4
7
+ Requires-Dist: pandas
8
+ Requires-Dist: lxml
9
+ Requires-Dist: tabula-py
10
+ Requires-Dist: matplotlib
@@ -0,0 +1,10 @@
1
+ README.md
2
+ pyproject.toml
3
+ edb_noumea/__init__.py
4
+ edb_noumea/details.py
5
+ edb_noumea/main.py
6
+ edb_noumea.egg-info/PKG-INFO
7
+ edb_noumea.egg-info/SOURCES.txt
8
+ edb_noumea.egg-info/dependency_links.txt
9
+ edb_noumea.egg-info/requires.txt
10
+ edb_noumea.egg-info/top_level.txt
@@ -0,0 +1,6 @@
1
+ requests
2
+ beautifulsoup4
3
+ pandas
4
+ lxml
5
+ tabula-py
6
+ matplotlib
@@ -0,0 +1,2 @@
1
+ dist
2
+ edb_noumea
@@ -0,0 +1,15 @@
1
+ [project]
2
+ name = "edb-noumea"
3
+ version = "0.1.0"
4
+ description = "Un scraper pour la qualité des eaux de baignade à Nouméa."
5
+ dependencies = [
6
+ "requests",
7
+ "beautifulsoup4",
8
+ "pandas",
9
+ "lxml",
10
+ "tabula-py",
11
+ "matplotlib",
12
+ ]
13
+
14
+ [tool.setuptools.packages.find]
15
+ where = ["."]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+