Tracy André commited on
Commit
f4360dd
·
1 Parent(s): 2eaa9ec
DEPLOY_HF.md DELETED
@@ -1,201 +0,0 @@
1
- # 🚀 Guide de Déploiement sur Hugging Face Spaces
2
-
3
- ## 📋 Prérequis
4
-
5
- 1. **Compte Hugging Face** : Créez un compte sur [huggingface.co](https://huggingface.co)
6
- 2. **Token d'accès** : Générez un token sur [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens)
7
- 3. **Dataset HackathonCRA/2024** : Assurez-vous d'avoir accès au dataset
8
-
9
- ## 🔧 Étapes de Déploiement
10
-
11
- ### 1. Créer un nouveau Space
12
-
13
- 1. Allez sur [huggingface.co/new-space](https://huggingface.co/new-space)
14
- 2. Remplissez les informations :
15
- - **Space name** : `analyse-adventices-cra` (ou votre nom préféré)
16
- - **License** : MIT
17
- - **SDK** : Gradio
18
- - **Hardware** : CPU basic (gratuit)
19
-
20
- ### 2. Configurer les fichiers
21
-
22
- Votre projet contient maintenant tous les fichiers nécessaires :
23
-
24
- ```
25
- 📁 Votre projet/
26
- ├── 📄 app.py # Application Gradio modifiée pour HF
27
- ├── 📄 requirements.txt # Dépendances avec datasets et huggingface_hub
28
- ├── 📄 README.md # Métadonnées HF (déjà configuré)
29
- ├── 📄 Dockerfile # Configuration Docker (optionnel)
30
- └── 📄 sample_data.csv # Données de fallback
31
- ```
32
-
33
- ### 3. Uploader les fichiers
34
-
35
- **Option A : Interface Web**
36
- 1. Cliquez sur "Files and versions" dans votre Space
37
- 2. Uploadez tous les fichiers un par un
38
-
39
- **Option B : Git (Recommandé)**
40
- ```bash
41
- # Cloner votre space
42
- git clone https://huggingface.co/spaces/VOTRE_USERNAME/VOTRE_SPACE_NAME
43
-
44
- # Copier vos fichiers
45
- cp app.py requirements.txt README.md sample_data.csv VOTRE_SPACE_NAME/
46
-
47
- # Pousser les changements
48
- cd VOTRE_SPACE_NAME
49
- git add .
50
- git commit -m "Ajout de l'application d'analyse des adventices"
51
- git push
52
- ```
53
-
54
- ### 4. Configurer les variables d'environnement
55
-
56
- 1. Dans votre Space, allez dans **Settings**
57
- 2. Ajoutez la variable d'environnement :
58
- - **Name** : `HF_TOKEN`
59
- - **Value** : Votre token Hugging Face
60
- - ✅ Cochez "Secret" pour la sécurité
61
-
62
- ### 5. Vérifier le dataset
63
-
64
- Assurez-vous que :
65
- - Le dataset `HackathonCRA/2024` existe
66
- - Vous avez les permissions pour y accéder
67
- - Le token a les bonnes permissions
68
-
69
- ## 🏗️ Structure du Code Modifié
70
-
71
- ### Chargement des données
72
- ```python
73
- # Configuration HF intégrée
74
- hf_token = os.environ.get("HF_TOKEN")
75
- dataset_id = "HackathonCRA/2024"
76
-
77
- # Méthode de fallback robuste
78
- def load_data(self):
79
- try:
80
- # 1. Essayer depuis Hugging Face
81
- dataset = load_dataset(dataset_id, use_auth_token=hf_token)
82
- self.df = dataset['train'].to_pandas()
83
- except:
84
- # 2. Fallback vers fichiers locaux
85
- # 3. Génération de données d'exemple si nécessaire
86
- ```
87
-
88
- ### Configuration Gradio
89
- ```python
90
- # Optimisé pour HF Spaces
91
- demo.launch(
92
- server_name="0.0.0.0",
93
- server_port=7860,
94
- share=False
95
- )
96
- ```
97
-
98
- ## 🔍 Debugging
99
-
100
- ### Problèmes courants
101
-
102
- 1. **Dataset non trouvé**
103
- - Vérifiez que `HackathonCRA/2024` existe
104
- - Confirmez les permissions d'accès
105
- - L'app utilisera des données d'exemple en fallback
106
-
107
- 2. **Token invalide**
108
- - Régénérez votre token HF
109
- - Vérifiez qu'il est bien configuré comme secret
110
-
111
- 3. **Erreurs de dépendances**
112
- - Les dépendances sont dans `requirements.txt`
113
- - HF Spaces installe automatiquement
114
-
115
- ### Logs utiles
116
- ```python
117
- # Ces messages apparaîtront dans les logs HF
118
- print(f"🤗 Tentative de chargement depuis Hugging Face: {dataset_id}")
119
- print(f"✅ Données chargées depuis Hugging Face")
120
- print(f"⚠️ Erreur lors du chargement depuis Hugging Face")
121
- ```
122
-
123
- ## 🎯 Fonctionnalités
124
-
125
- Votre app fonctionnera avec :
126
- - ✅ **Chargement automatique** depuis le dataset HF
127
- - ✅ **Fallback robuste** vers données locales/exemple
128
- - ✅ **Interface Gradio complète** avec tous les onglets
129
- - ✅ **Visualisations interactives** Plotly
130
- - ✅ **Analyse des risques** par parcelle
131
- - ✅ **Recommandations** pour cultures sensibles
132
-
133
- ## 🚀 Résultat Final
134
-
135
- Une fois déployé, votre Space sera accessible à l'adresse :
136
- `https://huggingface.co/spaces/VOTRE_USERNAME/VOTRE_SPACE_NAME`
137
-
138
- L'application se lancera automatiquement et tentera de charger les données depuis `HackathonCRA/2024` !
139
-
140
- ---
141
-
142
- **Bon déploiement ! 🌾✨**
143
-
144
- Voici comment lancer votre application en local pour tester avant le déploiement :
145
-
146
- ## 🔧 Lancement en Local
147
-
148
- ### 1. **Installation des dépendances**
149
- ```bash
150
- # Dans votre dossier de projet
151
- cd /Users/tracyandre/code/hackathon/data
152
-
153
- # Installer les dépendances
154
- pip install -r requirements.txt
155
- ```
156
-
157
- ### 2. **Configuration des variables d'environnement (optionnel)**
158
- ```bash
159
- # Créer un fichier .env (optionnel, pour tester avec le vrai dataset HF)
160
- echo "HF_TOKEN=votre_token_hugging_face" > .env
161
-
162
- # Ou exporter directement dans le terminal
163
- export HF_TOKEN=votre_token_hugging_face
164
- ```
165
-
166
- ### 3. **Lancer l'application**
167
- ```bash
168
- <code_block_to_apply_changes_from>
169
- ```
170
-
171
- ### 4. **Accéder à l'interface**
172
- Ouvrez votre navigateur et allez à : **http://localhost:7860**
173
-
174
- ## 🎯 Comportement en Local
175
-
176
- Votre app va essayer de charger les données dans cet ordre :
177
- 1. **Dataset HF** `HackathonCRA/2024` (si `HF_TOKEN` configuré)
178
- 2. **Fichiers locaux** (sample_data.csv, etc.)
179
- 3. **Données d'exemple** générées automatiquement
180
-
181
- ## 🔍 Messages de Debug
182
- Vous verrez dans la console :
183
- ```
184
- 🤗 Tentative de chargement depuis Hugging Face: HackathonCRA/2024
185
- ✅ Données chargées depuis Hugging Face: HackathonCRA/2024
186
- # OU
187
- ⚠️ Erreur lors du chargement depuis Hugging Face: [erreur]
188
- 🔄 Basculement vers les fichiers locaux...
189
- ✅ Données chargées depuis: sample_data.csv
190
- # OU
191
- ⚠️ Aucun fichier de données trouvé, génération de données d'exemple
192
- ```
193
-
194
- ## 🚀 Test Rapide (sans token HF)
195
- Si vous voulez juste tester l'interface rapidement :
196
- ```bash
197
- # L'app fonctionnera avec les données d'exemple générées
198
- python app.py
199
- ```
200
-
201
- L'application sera accessible sur **http://localhost:7860** avec toutes les fonctionnalités ! 🌾✨
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
FINAL_SOLUTION_SUMMARY.md DELETED
@@ -1,94 +0,0 @@
1
- # 🎯 Solution Finale Complète
2
-
3
- ## 🔧 Architecture de Chargement Robuste
4
-
5
- ### 3 Niveaux de Fallback Intelligents
6
-
7
- ```
8
- 1️⃣ Configuration CSV Sécurisée
9
- ├── Force tout en string (dtype=str)
10
- ├── Encodage UTF-8 explicite
11
- ├── Pas de conversion NaN automatique
12
- └── Filtre uniquement les CSV
13
-
14
- 2️⃣ Chargement Standard HF
15
- ├── Méthode load_dataset() classique
16
- ├── Avec et sans token
17
- └── Laisse HF gérer les types
18
-
19
- 3️⃣ Chargement CSV Manuel
20
- ├── API HfApi pour lister les fichiers
21
- ├── URLs directes avec encodage URL
22
- ├── Pandas avec encodage UTF-8/Latin-1
23
- └── Concaténation manuelle
24
- ```
25
-
26
- ## 📊 Gestion des Problèmes Spécifiques
27
-
28
- ### ✅ Erreur PyArrow `'Coué - ' as double`
29
- - **Solution** : `dtype=str` force tout en string
30
- - **Fallback** : Chargement manuel avec pandas
31
-
32
- ### ✅ Erreur d'encodage `'\xe9'`
33
- - **Solution** : `encoding='utf-8'` explicite
34
- - **Fallback** : Tentative avec `latin-1`
35
-
36
- ### ✅ Noms de fichiers accentués
37
- - **Solution** : `urllib.parse.quote()` pour encoding URL
38
- - **Fallback** : API HfApi pour noms exacts
39
-
40
- ## 🎯 Flux d'Exécution
41
-
42
- ```python
43
- 🤗 Chargement du dataset Hugging Face: HackathonCRA/2024
44
- 🔧 Tentative avec configuration CSV sécurisée...
45
- 🔑 Chargement sécurisé avec token réussi
46
- 📊 Splits disponibles: ['train']
47
- 🎯 Utilisation du split: 'train'
48
- ✅ Dataset chargé: XXXX lignes, XX colonnes
49
- 🗂️ Après filtrage CSV: YYYY lignes restantes
50
- 📅 Années disponibles: [2020, 2021, 2022, 2023, 2024, 2025]
51
- ✅ Données filtrées (2020+): ZZZZ lignes
52
- ```
53
-
54
- ## 🔍 Validation et Debug
55
-
56
- ### Messages de Diagnostic
57
- - ✅ **Type de chargement** utilisé (sécurisé/standard/manuel)
58
- - ✅ **Nombre de fichiers** CSV détectés
59
- - ✅ **Encodage** utilisé pour chaque fichier
60
- - ✅ **Années** disponibles après filtrage
61
- - ✅ **Colonnes** détectées pour validation
62
-
63
- ### Gestion d'Erreurs
64
- - ✅ **Erreurs détaillées** avec solutions
65
- - ✅ **Fallback automatique** entre méthodes
66
- - ✅ **Validation des données** après chargement
67
- - ✅ **Messages utilisateur** clairs
68
-
69
- ## 🚀 Robustesse pour HuggingFace Spaces
70
-
71
- ### Avantages de la Solution
72
- 1. **Triple sécurité** : 3 méthodes de chargement
73
- 2. **Gestion complète** des encodages problématiques
74
- 3. **Adaptation automatique** aux structures de dataset
75
- 4. **Messages informatifs** pour debugging
76
- 5. **Validation des données** à chaque étape
77
-
78
- ### Garanties
79
- - ✅ **Fonctionne même avec données "sales"**
80
- - ✅ **Gère les accents et caractères spéciaux**
81
- - ✅ **Adaptatif** aux changements de structure HF
82
- - ✅ **Debug facile** avec logs détaillés
83
- - ✅ **Prêt pour production** sur HF Spaces
84
-
85
- ## 🎉 Application Finale
86
-
87
- Votre application est maintenant **ultra-robuste** et peut gérer :
88
- - 📊 **Tous types de datasets** CSV sur HuggingFace
89
- - 🌍 **Caractères internationaux** et accents
90
- - 🔧 **Erreurs de parsing** automatiques
91
- - 📁 **Structures de fichiers** variables
92
- - 🎯 **Déploiement fiable** sur HF Spaces
93
-
94
- **L'application est prête pour le déploiement production !** 🚀✨
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
FINAL_SUMMARY.md DELETED
@@ -1,82 +0,0 @@
1
- # ✅ Configuration Finale - Application HuggingFace Spaces
2
-
3
- ## 🎯 Problème Résolu : Pas de Split "train"
4
-
5
- ### 📊 Structure du Dataset HackathonCRA/2024
6
- - **13 fichiers CSV** : 2014, 2015, 2016, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025
7
- - **2 fichiers XLSX** : 2017.xlsx, 2021.xlsx
8
- - **Pas de split "train"** par défaut
9
-
10
- ### 🔧 Solution Implémentée
11
-
12
- **Code modifié pour :**
13
- 1. ✅ **Détection automatique des splits** disponibles
14
- 2. ✅ **Utilisation du premier split** si pas de "train"
15
- 3. ✅ **Filtrage automatique des XLSX** (garde uniquement les CSV)
16
- 4. ✅ **Filtrage temporel** pour données récentes (2020+)
17
-
18
- ### 📝 Nouveau Comportement
19
-
20
- ```python
21
- # Détection intelligente des splits
22
- available_splits = list(dataset.keys())
23
- if 'train' in available_splits:
24
- split_to_use = 'train'
25
- else:
26
- split_to_use = available_splits[0] # Premier disponible
27
-
28
- # Filtrage XLSX
29
- csv_mask = df['file'].str.endswith('.csv', na=False)
30
- df_clean = df[csv_mask] # Exclut 2017.xlsx et 2021.xlsx
31
-
32
- # Filtrage temporel
33
- recent_data = df_clean[df_clean['millesime'] >= 2020]
34
- ```
35
-
36
- ## 🚀 Messages de Debug Améliorés
37
-
38
- L'application affichera maintenant :
39
- ```
40
- 🤗 Chargement du dataset Hugging Face: HackathonCRA/2024
41
- 📊 Splits disponibles: ['default'] # ou autre
42
- 🎯 Utilisation du split: 'default'
43
- ✅ Dataset chargé: XXXX lignes, XX colonnes
44
- 📁 Types de fichiers détectés: ['file1.csv', 'file2.xlsx', ...]
45
- 📊 Avant filtrage CSV: XXXX lignes
46
- 🗂️ Après filtrage CSV: YYYY lignes restantes
47
- 📅 Années disponibles: [2014, 2015, ..., 2025]
48
- ✅ Données filtrées (2020+): ZZZZ lignes
49
- ```
50
-
51
- ## 📊 Données Finales Utilisées
52
-
53
- **Fichiers CSV inclus (2020+) :**
54
- - ✅ 2020.csv
55
- - ✅ 2021.csv (CSV, pas XLSX)
56
- - ✅ 2022.csv
57
- - ✅ 2023.csv
58
- - ✅ 2024.csv
59
- - ✅ 2025.csv
60
-
61
- **Fichiers exclus :**
62
- - ❌ 2014-2019 (trop anciens)
63
- - ❌ 2017.xlsx, 2021.xlsx (format XLSX)
64
-
65
- ## 🎉 Application Prête !
66
-
67
- ### ✅ Fonctionnalités Garanties
68
- - 🔄 **Adaptation automatique** aux splits disponibles
69
- - 🗂️ **Filtrage intelligent** CSV vs XLSX
70
- - 📅 **Données récentes** pour analyse pertinente
71
- - 🎯 **Analyse des risques** adventices
72
- - 📊 **Visualisations** interactives
73
-
74
- ### 🚀 Déploiement HF Spaces
75
- Votre application est maintenant **robuste** et **adaptative** pour HuggingFace Spaces !
76
-
77
- **Uploadez simplement :**
78
- - `app.py` (modifié)
79
- - `requirements.txt`
80
- - `README.md`
81
-
82
- L'app détectera automatiquement la structure du dataset et fonctionnera ! 🎯✨
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
HF_FINAL_SETUP.md DELETED
@@ -1,87 +0,0 @@
1
- # ✅ Configuration Finale pour HuggingFace Spaces
2
-
3
- ## 🎯 Modifications Effectuées
4
-
5
- ### 1. **Chargement EXCLUSIF du dataset HF**
6
- - ✅ Suppression de tous les fallbacks locaux
7
- - ✅ Méthode `create_sample_data()` désactivée
8
- - ✅ Chargement uniquement depuis `HackathonCRA/2024`
9
-
10
- ### 2. **Filtrage des Fichiers XLS**
11
- - ✅ Détection automatique des fichiers XLS dans le dataset
12
- - ✅ Filtrage pour ne garder que les fichiers CSV
13
- - ✅ Messages de debug pour comprendre le contenu
14
-
15
- ### 3. **Gestion Robuste des Erreurs**
16
- - ✅ Messages d'erreur clairs
17
- - ✅ Instructions de dépannage intégrées
18
- - ✅ Validation des données après chargement
19
-
20
- ## 📊 Dataset HuggingFace: HackathonCRA/2024
21
-
22
- **Contenu détecté** :
23
- - 📄 **11 fichiers CSV** (2014-2025)
24
- - 📄 **2 fichiers XLS** (ignorés automatiquement)
25
- - 🎯 **Filtrage automatique** pour années récentes (2020+)
26
-
27
- ## 🚀 Déploiement sur HF Spaces
28
-
29
- ### Fichiers à uploader :
30
- ```
31
- 📁 Votre Space/
32
- ├── app.py ✅ Configuré pour HF uniquement
33
- ├── requirements.txt ✅ Dépendances HF incluses
34
- ├── README.md ✅ Métadonnées correctes
35
- └── sample_data.csv ✅ Non utilisé mais présent
36
- ```
37
-
38
- ### Variables d'environnement :
39
- - **HF_TOKEN** : Votre token HuggingFace (optionnel si dataset public)
40
-
41
- ## 🔍 Comportement de l'App
42
-
43
- 1. **Chargement** : Connexion automatique à `HackathonCRA/2024`
44
- 2. **Filtrage XLS** : Exclusion automatique des fichiers .xls
45
- 3. **Filtrage temporel** : Données 2020+ par défaut
46
- 4. **Analyse** : Calcul des risques adventices
47
- 5. **Visualisations** : Graphiques interactifs Plotly
48
-
49
- ## 📝 Messages de Debug
50
-
51
- L'application affichera :
52
- ```
53
- 🤗 Chargement du dataset Hugging Face: HackathonCRA/2024
54
- 🔑 Authentification avec token réussie
55
- 📊 Splits disponibles: ['train']
56
- ✅ Dataset chargé: XXXX lignes, XX colonnes
57
- 🏷️ Colonnes: ['numparcell', 'nomparc', ...]
58
- 📁 Types de fichiers détectés: ['file1.csv', 'file2.xls', ...]
59
- 🗂️ Filtré pour CSV uniquement: YYYY lignes restantes
60
- 📅 Années disponibles: [2014, 2015, ..., 2025]
61
- ✅ Données filtrées (2020+): ZZZZ lignes
62
- ```
63
-
64
- ## ❌ Gestion d'Erreurs
65
-
66
- En cas de problème :
67
- ```
68
- ❌ ERREUR lors du chargement du dataset HuggingFace:
69
- [Description de l'erreur]
70
- 💡 Solutions:
71
- 1. Vérifiez l'URL: https://huggingface.co/datasets/HackathonCRA/2024
72
- 2. Configurez votre token: export HF_TOKEN='votre_token'
73
- 3. Vérifiez vos permissions d'accès
74
- ```
75
-
76
- ## 🎉 Résultat Final
77
-
78
- Votre application :
79
- - ✅ **Ne fonctionne QU'AVEC le dataset HF**
80
- - ✅ **Ignore automatiquement les fichiers XLS**
81
- - ✅ **Filtre pour les données récentes**
82
- - ✅ **Prête pour le déploiement HF Spaces**
83
- - ✅ **Messages d'erreur utiles**
84
-
85
- ---
86
-
87
- **L'application est maintenant 100% configurée pour HuggingFace Spaces ! 🚀**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
PARSING_ERROR_FIX.md DELETED
@@ -1,110 +0,0 @@
1
- # 🔧 Correction de l'Erreur de Parsing PyArrow
2
-
3
- ## 🚨 Problème Identifié
4
-
5
- **Erreur** : `Failed to parse string: 'Coué - ' as a scalar of type double`
6
-
7
- **Cause** : HuggingFace Datasets essaie de deviner automatiquement les types de colonnes et interprète mal certaines données textuelles comme des nombres.
8
-
9
- ## ✅ Solution Implémentée
10
-
11
- ### 1. **Chargement Robust avec Fallback**
12
-
13
- L'application essaie maintenant **3 méthodes** dans l'ordre :
14
-
15
- 1. **Chargement HF normal** (rapide)
16
- 2. **Chargement HF avec types flexibles** (si erreur)
17
- 3. **Chargement CSV direct** (fallback ultime)
18
-
19
- ### 2. **Chargement CSV Direct**
20
-
21
- En cas d'échec du parsing automatique :
22
- ```python
23
- # Chargement direct des fichiers CSV depuis HF
24
- csv_files = [
25
- "Interventions-...-2020.csv",
26
- "Interventions-...-2021.csv",
27
- # ... etc
28
- ]
29
-
30
- for csv_file in csv_files:
31
- file_url = f"https://huggingface.co/datasets/{dataset_id}/resolve/main/{csv_file}"
32
- df = pd.read_csv(file_url, dtype=str, na_filter=False) # Tout en string
33
- ```
34
-
35
- ### 3. **Gestion des Types**
36
-
37
- - **Tout forcé en string** initialement
38
- - **Conversion sélective** des colonnes numériques après chargement
39
- - **Nettoyage des données** problématiques
40
-
41
- ## 🎯 Fonctionnalités de la Solution
42
-
43
- ### ✅ Messages de Debug Améliorés
44
- ```
45
- 🤗 Chargement du dataset Hugging Face: HackathonCRA/2024
46
- ⚠️ Erreur de parsing automatique: Failed to parse string...
47
- 🔄 Tentative avec types de données flexibles...
48
- 📊 Chargement alternatif: fichiers CSV individuels...
49
- ⚙️ Chargement: Interventions-...-2020.csv
50
- ⚙️ Chargement: Interventions-...-2021.csv
51
- ✅ Chargement alternatif réussi: XXXX lignes
52
- ```
53
-
54
- ### ✅ Filtrage Intelligent
55
- - **Exclusion automatique** des fichiers XLSX
56
- - **Gestion flexible** des colonnes 'file' ou 'source_file'
57
- - **Conversion robuste** de la colonne 'millesime'
58
-
59
- ### ✅ Gestion d'Erreurs
60
- - **3 niveaux de fallback**
61
- - **Messages détaillés** pour debugging
62
- - **Préservation des données** même en cas de problème
63
-
64
- ## 🚀 Résultat sur HuggingFace Spaces
65
-
66
- ### Comportement Attendu
67
-
68
- 1. **Tentative normale** → Échoue avec erreur parsing
69
- 2. **Chargement alternatif** → Réussit avec CSV direct
70
- 3. **Données propres** → 6 fichiers CSV (2020-2025)
71
- 4. **Application fonctionnelle** → Analyse des adventices
72
-
73
- ### Logs de Succès
74
- ```
75
- 📊 Chargement alternatif: fichiers CSV individuels...
76
- ⚙️ Chargement: Interventions-...-2020.csv
77
- ⚙️ Chargement: Interventions-...-2021.csv
78
- ⚙️ Chargement: Interventions-...-2022.csv
79
- ⚙️ Chargement: Interventions-...-2023.csv
80
- ⚙️ Chargement: Interventions-...-2024.csv
81
- ⚙️ Chargement: Interventions-...-2025.csv
82
- ✅ Chargement alternatif réussi: XXXX lignes
83
- 📊 Splits disponibles: ['train']
84
- 🎯 Utilisation du split: 'train'
85
- ✅ Dataset chargé: XXXX lignes, XX colonnes
86
- ```
87
-
88
- ## 🔧 Modifications du Code
89
-
90
- ### Imports Ajoutés
91
- ```python
92
- import pandas as pd
93
- from datasets import DatasetDict, Dataset
94
- ```
95
-
96
- ### Logique de Chargement
97
- 1. **Try/catch** sur `load_dataset()`
98
- 2. **Chargement CSV direct** avec `pd.read_csv(dtype=str)`
99
- 3. **Conversion** en `Dataset` HuggingFace
100
- 4. **Filtrage et nettoyage** des données
101
-
102
- ## 🎉 Application Robuste
103
-
104
- Votre application peut maintenant :
105
- - ✅ **Gérer les erreurs de parsing** PyArrow
106
- - ✅ **Charger les données CSV** directement depuis HF
107
- - ✅ **Fonctionner même avec données "sales"**
108
- - ✅ **Être déployée sur HF Spaces** sans problème
109
-
110
- **La solution est robuste et prête pour la production !** 🚀✨
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ULTIMATE_FIX.md DELETED
@@ -1,87 +0,0 @@
1
- # 🔧 Solution Ultime pour les Erreurs de Parsing
2
-
3
- ## 🚨 Problèmes Identifiés
4
-
5
- 1. **Erreur PyArrow** : `Failed to parse string: 'Coué - ' as a scalar of type double`
6
- 2. **Erreur d'encodage** : `'ascii' codec can't encode character '\xe9'`
7
- 3. **Noms de fichiers** : Accents dans "Expérimentale" et "Kerguéhennec"
8
-
9
- ## ✅ Solution Finale : Force String Loading
10
-
11
- ### Nouvelle Approche
12
-
13
- Au lieu de lutter avec le parsing automatique, forçons **tout en string** dès le chargement du dataset avec une configuration personnalisée.
14
-
15
- ### Code de Solution
16
-
17
- ```python
18
- # Configuration CSV avec tous les types en string
19
- csv_config = {
20
- "sep": ",",
21
- "encoding": "utf-8",
22
- "dtype": str, # Force tout en string
23
- "na_filter": False, # Pas de conversion NaN
24
- "keep_default_na": False, # Pas de valeurs NA par défaut
25
- }
26
-
27
- # Chargement avec configuration personnalisée
28
- try:
29
- dataset = load_dataset(
30
- dataset_id,
31
- token=hf_token,
32
- **csv_config # Force le parsing en string
33
- )
34
- except Exception:
35
- # Fallback vers chargement manuel
36
- # ... reste du code de fallback
37
- ```
38
-
39
- ### Avantages
40
-
41
- 1. **✅ Évite le parsing automatique** problématique
42
- 2. **✅ Gère les accents** correctement
43
- 3. **✅ Pas de conflit de types** (tout en string)
44
- 4. **✅ Conversion manuelle** après chargement si nécessaire
45
-
46
- ## 🎯 Mise à Jour Recommandée
47
-
48
- ### Priorité 1 : Simple et Robuste
49
-
50
- Plutôt que les multiple fallbacks complexes, utilisez :
51
-
52
- ```python
53
- def load_data(self):
54
- try:
55
- # Force tout en string dès le chargement
56
- dataset = load_dataset(
57
- dataset_id,
58
- token=hf_token,
59
- data_files="*.csv", # Seulement les CSV
60
- sep=",",
61
- encoding="utf-8",
62
- dtype=str,
63
- na_filter=False
64
- )
65
-
66
- df = dataset['train'].to_pandas()
67
-
68
- # Conversion manuelle des colonnes numériques
69
- if 'millesime' in df.columns:
70
- df['millesime'] = pd.to_numeric(df['millesime'], errors='coerce')
71
-
72
- # ... reste de l'analyse
73
-
74
- except Exception as e:
75
- print(f"Erreur: {e}")
76
- raise Exception("Dataset requis mais non accessible")
77
- ```
78
-
79
- ## 🚀 Résultat Attendu
80
-
81
- Cette approche devrait **éliminer complètement** :
82
- - ✅ Les erreurs de parsing PyArrow
83
- - ✅ Les problèmes d'encodage
84
- - ✅ Les conflits de types automatiques
85
- - ✅ La complexité des multiples fallbacks
86
-
87
- **Application simple, robuste et fonctionnelle !** 🎯✨
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app.py CHANGED
@@ -28,226 +28,24 @@ class AgricultureAnalyzer:
28
  def __init__(self):
29
  self.df = None
30
  self.risk_analysis = None
31
-
32
- def load_data(self, file_path=None):
33
- """Charge les données agricoles UNIQUEMENT depuis Hugging Face"""
34
-
35
- try:
36
- print(f"🤗 Chargement du dataset Hugging Face: {dataset_id}")
37
-
38
- # Chargement du dataset avec configuration CSV robuste
39
  try:
40
- print(f"🔧 Tentative avec configuration CSV sécurisée...")
41
-
42
- # Configuration pour forcer le chargement en string
43
- if hf_token:
44
- dataset = load_dataset(
45
- dataset_id,
46
- token=hf_token,
47
- data_files="*.csv", # Seulement les CSV
48
- sep=",",
49
- encoding="utf-8",
50
- dtype=str, # Force tout en string
51
- na_filter=False, # Pas de conversion NaN automatique
52
- keep_default_na=False # Pas de valeurs NA par défaut
53
- )
54
- print(f"🔑 Chargement sécurisé avec token réussi")
55
- else:
56
- dataset = load_dataset(
57
- dataset_id,
58
- data_files="*.csv",
59
- sep=",",
60
- encoding="utf-8",
61
- dtype=str,
62
- na_filter=False,
63
- keep_default_na=False
64
- )
65
- print(f"🔑 Chargement sécurisé sans token réussi")
66
- except Exception as parse_error:
67
- print(f"⚠️ Erreur avec configuration sécurisée: {str(parse_error)[:100]}...")
68
- print(f"🔄 Tentative de chargement standard...")
69
-
70
- # Fallback: chargement standard
71
- try:
72
- if hf_token:
73
- dataset = load_dataset(dataset_id, token=hf_token)
74
- print(f"🔑 Chargement standard avec token réussi")
75
- else:
76
- dataset = load_dataset(dataset_id)
77
- print(f"🔑 Chargement standard sans token réussi")
78
-
79
- except Exception as standard_error:
80
- print(f"⚠️ Erreur de chargement standard: {str(standard_error)[:100]}...")
81
- print(f"🔄 Tentative avec chargement CSV manuel...")
82
 
83
- # Forcer tous les types en string pour éviter les erreurs de parsing
84
- # Chargement avec configuration CSV personnalisée
85
- from datasets import DatasetDict
86
- import pandas as pd
87
-
88
- # Alternative: utiliser l'API HuggingFace pour lister les fichiers CSV
89
- try:
90
- api = HfApi(token=hf_token)
91
- all_files = api.list_repo_files(dataset_id, repo_type="dataset")
92
-
93
- # Filtrer pour ne garder que les CSV récents
94
- csv_files = [f for f in all_files if f.endswith('.csv') and any(year in f for year in ['2020', '2021', '2022', '2023', '2024', '2025'])]
95
- csv_files.sort() # Trier par ordre alphabétique
96
-
97
- print(f"📁 Fichiers CSV détectés: {len(csv_files)}")
98
- for f in csv_files:
99
- print(f" - {f}")
100
-
101
- except Exception as api_error:
102
- print(f"⚠️ Erreur API HF: {api_error}")
103
- # Fallback avec noms corrects
104
- csv_files = [
105
- "Interventions-(sortie-excel)-Station_Expérimentale_de_Kerguéhennec-2020.csv",
106
- "Interventions-(sortie-excel)-Station_Expérimentale_de_Kerguéhennec-2021.csv",
107
- "Interventions-(sortie-excel)-Station_Expérimentale_de_Kerguéhennec-2022.csv",
108
- "Interventions-(sortie-excel)-Station_Expérimentale_de_Kerguéhennec-2023.csv",
109
- "Interventions-(sortie-excel)-Station_Expérimentale_de_Kerguéhennec-2024.csv",
110
- "Interventions-(sortie-excel)-Station_Expérimentale_de_Kerguéhennec-2025.csv"
111
- ]
112
-
113
- print(f"📊 Chargement alternatif: fichiers CSV individuels...")
114
-
115
- # Charger chaque fichier avec pandas et concaténer
116
- all_dataframes = []
117
-
118
- for csv_file in csv_files:
119
- try:
120
- # URL directe vers le fichier avec encodage URL correct
121
- encoded_filename = urllib.parse.quote(csv_file, safe='-()_.')
122
- file_url = f"https://huggingface.co/datasets/{dataset_id}/resolve/main/{encoded_filename}"
123
- print(f" ⚙️ Chargement: {csv_file}")
124
-
125
- # Charger avec pandas en forçant tout en string et encodage UTF-8
126
- df_temp = pd.read_csv(file_url, dtype=str, na_filter=False, encoding='utf-8')
127
- df_temp['source_file'] = csv_file # Ajouter la source
128
- all_dataframes.append(df_temp)
129
- print(f" ✅ Succès: {len(df_temp)} lignes")
130
-
131
- except Exception as file_error:
132
- print(f" ⚠️ Erreur pour {csv_file}: {str(file_error)[:100]}...")
133
-
134
- # Essayer avec un autre encodage
135
- try:
136
- print(f" 🔄 Tentative avec encodage latin-1...")
137
- df_temp = pd.read_csv(file_url, dtype=str, na_filter=False, encoding='latin-1')
138
- df_temp['source_file'] = csv_file
139
- all_dataframes.append(df_temp)
140
- print(f" ✅ Succès avec latin-1: {len(df_temp)} lignes")
141
- except Exception as second_error:
142
- print(f" ❌ Échec définitif: {str(second_error)[:50]}...")
143
- continue
144
-
145
- if all_dataframes:
146
- # Concaténer tous les DataFrames
147
- df_combined = pd.concat(all_dataframes, ignore_index=True)
148
- print(f"✅ Chargement alternatif réussi: {len(df_combined)} lignes")
149
-
150
- # Convertir en format Dataset
151
- from datasets import Dataset
152
- dataset = DatasetDict({
153
- 'train': Dataset.from_pandas(df_combined)
154
- })
155
- else:
156
- raise Exception("Aucun fichier CSV n'a pu être chargé")
157
-
158
- except Exception as csv_error:
159
- print(f"❌ Échec du chargement CSV manuel: {str(csv_error)[:100]}...")
160
- raise standard_error # Relancer l'erreur précédente
161
-
162
- available_splits = list(dataset.keys())
163
- print(f"📊 Splits disponibles: {available_splits}")
164
-
165
- # Déterminer quel split utiliser
166
- split_to_use = None
167
- if 'train' in available_splits:
168
- split_to_use = 'train'
169
- elif len(available_splits) > 0:
170
- split_to_use = available_splits[0] # Prendre le premier split disponible
171
- else:
172
- raise Exception("Aucun split trouvé dans le dataset")
173
-
174
- print(f"🎯 Utilisation du split: '{split_to_use}'")
175
-
176
- # Convertir en DataFrame pandas
177
- df_raw = dataset[split_to_use].to_pandas()
178
- print(f"✅ Dataset chargé: {len(df_raw)} lignes, {len(df_raw.columns)} colonnes")
179
-
180
- # Afficher quelques colonnes pour debug
181
- print(f"🏷️ Colonnes: {list(df_raw.columns)[:10]}{'...' if len(df_raw.columns) > 10 else ''}")
182
-
183
- # Filtrer pour exclure les fichiers XLSX
184
- # Vérifier les colonnes 'file' ou 'source_file'
185
- file_column = None
186
- if 'file' in df_raw.columns:
187
- file_column = 'file'
188
- elif 'source_file' in df_raw.columns:
189
- file_column = 'source_file'
190
-
191
- if file_column:
192
- print(f"📁 Types de fichiers détectés: {df_raw[file_column].unique()[:5]}")
193
- # Ne garder que les fichiers CSV (exclure XLSX)
194
- csv_mask = df_raw[file_column].str.endswith('.csv', na=False)
195
- csv_data = df_raw[csv_mask]
196
-
197
- print(f"📊 Avant filtrage CSV: {len(df_raw)} lignes")
198
- if len(csv_data) > 0:
199
- df_raw = csv_data
200
- print(f"🗂️ Après filtrage CSV: {len(df_raw)} lignes restantes")
201
- else:
202
- print(f"⚠️ Aucun fichier CSV trouvé dans la colonne '{file_column}', conservation de toutes les données")
203
- else:
204
- print(f"⚠️ Pas de colonne de fichier détectée, on garde toutes les données")
205
-
206
- # Filtrer par année si disponible
207
- if 'millesime' in df_raw.columns:
208
- # Convertir la colonne millesime en numérique si elle est en string
209
- try:
210
- df_raw['millesime'] = pd.to_numeric(df_raw['millesime'], errors='coerce')
211
- # Supprimer les lignes avec millesime invalide
212
- df_raw = df_raw.dropna(subset=['millesime'])
213
- df_raw['millesime'] = df_raw['millesime'].astype(int)
214
- except Exception as e:
215
- print(f"⚠️ Problème conversion millesime: {e}")
216
-
217
- years = sorted(df_raw['millesime'].unique())
218
- print(f"📅 Années disponibles: {years}")
219
-
220
- # Prendre les données récentes (2020+)
221
- recent_data = df_raw[df_raw['millesime'] >= 2020]
222
- if len(recent_data) > 0:
223
- self.df = recent_data
224
- print(f"✅ Données filtrées (2020+): {len(self.df)} lignes")
225
- else:
226
- self.df = df_raw
227
- print(f"✅ Toutes les données utilisées: {len(self.df)} lignes")
228
- else:
229
- self.df = df_raw
230
- print(f"✅ Données chargées: {len(self.df)} lignes (pas de colonne millesime)")
231
-
232
- if len(self.df) == 0:
233
- raise Exception("Aucune donnée disponible après filtrage")
234
-
235
- return self.analyze_data()
236
 
237
- except Exception as e:
238
- print(f"❌ ERREUR lors du chargement du dataset HuggingFace:")
239
- print(f" {str(e)[:200]}...")
240
- print(f"💡 Solutions:")
241
- print(f" 1. Vérifiez l'URL: https://huggingface.co/datasets/{dataset_id}")
242
- print(f" 2. Configurez votre token: export HF_TOKEN='votre_token'")
243
- print(f" 3. Vérifiez vos permissions d'accès")
244
- print(f" 4. Problème de parsing: données avec types incohérents")
245
- raise Exception(f"Dataset HuggingFace requis: {dataset_id} - Erreur: {str(e)[:100]}...")
246
 
 
 
247
 
248
- def create_sample_data(self):
249
- """Méthode désactivée - utilisation exclusive du dataset HF"""
250
- raise Exception("Cette application nécessite le dataset HuggingFace HackathonCRA/2024")
251
 
252
  def analyze_data(self):
253
  """Analyse des données et calcul des risques"""
 
28
  def __init__(self):
29
  self.df = None
30
  self.risk_analysis = None
31
+
32
+ def load_data(self):
33
+ """Charge les données du dataset Hugging Face"""
 
 
 
 
 
34
  try:
35
+ self.df = load_dataset(
36
+ dataset_id,
37
+ split="train",
38
+ token=hf_token # ou use_auth_token=hf_token selon la version
39
+ ).to_pandas()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
 
41
+ # Nettoyage éventuel (ex: suppression NA)
42
+ self.df = self.df.dropna(subset=["numparcell", "surfparc", "millesime"])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
 
44
+ return f"✅ Données chargées avec succès : {len(self.df)} enregistrements"
 
 
 
 
 
 
 
 
45
 
46
+ except Exception as e:
47
+ return f"❌ Erreur lors du chargement du dataset : {str(e)}"
48
 
 
 
 
49
 
50
  def analyze_data(self):
51
  """Analyse des données et calcul des risques"""
check_dataset_splits.py DELETED
@@ -1,75 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Vérifier les splits disponibles dans le dataset HF
4
- """
5
-
6
- import os
7
-
8
- def check_dataset_structure():
9
- print("🔍 Vérification de la structure du dataset HackathonCRA/2024")
10
-
11
- try:
12
- from huggingface_hub import HfApi
13
-
14
- dataset_id = "HackathonCRA/2024"
15
- hf_token = os.environ.get("HF_TOKEN")
16
-
17
- api = HfApi(token=hf_token)
18
-
19
- # Informations du dataset
20
- dataset_info = api.dataset_info(dataset_id)
21
- print(f"📝 Dataset: {dataset_id}")
22
- print(f"🔑 Token configuré: {'✅' if hf_token else '❌'}")
23
-
24
- # Lister les fichiers
25
- files = api.list_repo_files(dataset_id, repo_type="dataset")
26
- print(f"📄 Fichiers dans le repo: {len(files)}")
27
-
28
- for f in files:
29
- print(f" - {f}")
30
-
31
- # Essayer de charger avec datasets (sans pandas)
32
- print("\n🧪 Test de chargement avec datasets...")
33
-
34
- try:
35
- # Import minimal
36
- from datasets import load_dataset_builder
37
-
38
- builder = load_dataset_builder(dataset_id, token=hf_token)
39
- print(f"✅ Builder créé avec succès")
40
- print(f"📊 Config: {builder.config}")
41
-
42
- # Essayer de voir les splits
43
- if hasattr(builder.info, 'splits') and builder.info.splits:
44
- print(f"📦 Splits détectés: {list(builder.info.splits.keys())}")
45
- else:
46
- print("⚠️ Pas de splits détectés dans builder.info")
47
-
48
- except Exception as e:
49
- print(f"❌ Erreur avec datasets builder: {e}")
50
-
51
- # Test direct sans spécifier de split
52
- try:
53
- print("\n🔄 Test de chargement direct...")
54
- from datasets import load_dataset
55
- dataset = load_dataset(dataset_id, token=hf_token)
56
- print(f"✅ Dataset chargé!")
57
- print(f"📦 Splits disponibles: {list(dataset.keys())}")
58
-
59
- return list(dataset.keys())
60
-
61
- except Exception as e:
62
- print(f"❌ Erreur de chargement: {e}")
63
- return None
64
-
65
- except Exception as e:
66
- print(f"❌ Erreur générale: {e}")
67
- return None
68
-
69
- if __name__ == "__main__":
70
- splits = check_dataset_structure()
71
- if splits:
72
- print(f"\n🎯 Splits trouvés: {splits}")
73
- print(f"💡 Utilisez '{splits[0]}' au lieu de 'train' dans votre code")
74
- else:
75
- print("\n❌ Impossible de déterminer les splits")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fix_env.sh DELETED
@@ -1,23 +0,0 @@
1
- #!/bin/bash
2
- # Script pour corriger l'environnement local
3
-
4
- echo "🔧 Correction de l'environnement pour Mac ARM64"
5
-
6
- # Créer un nouvel environnement conda propre
7
- echo "📦 Création d'un environnement conda propre..."
8
- conda create -n hackathon-clean python=3.10 -y
9
- source $(conda info --base)/etc/profile.d/conda.sh
10
- conda activate hackathon-clean
11
-
12
- # Installation des packages dans le bon ordre
13
- echo "📥 Installation des dépendances..."
14
- pip install --no-cache-dir numpy==1.24.3
15
- pip install --no-cache-dir pandas
16
- pip install --no-cache-dir matplotlib seaborn plotly
17
- pip install --no-cache-dir datasets huggingface_hub
18
- pip install --no-cache-dir gradio==4.31.0
19
-
20
- echo "✅ Environnement configuré !"
21
- echo "🚀 Pour utiliser cet environnement:"
22
- echo " conda activate hackathon-clean"
23
- echo " python app.py"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
test_app_hf.py DELETED
@@ -1,48 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Test de l'application avec le dataset HuggingFace uniquement
4
- """
5
-
6
- import os
7
- import sys
8
-
9
- # Configuration
10
- os.environ["GRADIO_ANALYTICS_ENABLED"] = "False"
11
-
12
- try:
13
- # Import de la classe directement
14
- from app import AgricultureAnalyzer
15
-
16
- print("🧪 Test de chargement avec dataset HuggingFace uniquement")
17
- print("=" * 60)
18
-
19
- # Créer l'analyseur
20
- analyzer = AgricultureAnalyzer()
21
-
22
- # Tenter de charger les données
23
- print("🚀 Démarrage du chargement...")
24
- result = analyzer.load_data()
25
-
26
- if analyzer.df is not None:
27
- print("\n✅ SUCCÈS ! Données chargées depuis HuggingFace")
28
- print(f"📊 Forme des données: {analyzer.df.shape}")
29
- print(f"🏷️ Colonnes: {list(analyzer.df.columns)}")
30
-
31
- # Quelques statistiques
32
- if 'millesime' in analyzer.df.columns:
33
- print(f"📅 Années: {sorted(analyzer.df['millesime'].unique())}")
34
-
35
- if 'familleprod' in analyzer.df.columns:
36
- print(f"🧪 Types de produits: {analyzer.df['familleprod'].value_counts().head().to_dict()}")
37
-
38
- print("\n🎯 Application prête pour HuggingFace Spaces !")
39
-
40
- else:
41
- print("\n❌ Échec du chargement")
42
-
43
- except Exception as e:
44
- print(f"\n❌ Erreur pendant le test: {e}")
45
- print("\n💡 Cela indique que:")
46
- print(" - Le dataset HF n'est pas accessible localement")
47
- print(" - Mais l'application fonctionnera sur HF Spaces avec le bon token")
48
- print(" - Le code est configuré pour HF uniquement ✅")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
test_hf_connection.py DELETED
@@ -1,64 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Script de test pour vérifier la connexion au dataset HuggingFace
4
- """
5
-
6
- import os
7
- from datasets import load_dataset
8
-
9
- # Configuration
10
- dataset_id = "HackathonCRA/2024"
11
- hf_token = os.environ.get("HF_TOKEN")
12
-
13
- print("🧪 Test de connexion au dataset HuggingFace")
14
- print(f"📦 Dataset: {dataset_id}")
15
- print(f"🔑 Token configuré: {'✅ Oui' if hf_token else '❌ Non'}")
16
- print()
17
-
18
- try:
19
- # Test 1: Chargement du dataset
20
- print("🔄 Chargement du dataset...")
21
- if hf_token:
22
- dataset = load_dataset(dataset_id, token=hf_token)
23
- print("✅ Chargement avec token réussi")
24
- else:
25
- print("⚠️ Tentative sans token...")
26
- dataset = load_dataset(dataset_id)
27
- print("✅ Chargement sans token réussi")
28
-
29
- # Test 2: Exploration de la structure
30
- print(f"📊 Splits disponibles: {list(dataset.keys())}")
31
-
32
- if 'train' in dataset:
33
- train_data = dataset['train']
34
- print(f"📈 Nombre d'enregistrements dans 'train': {len(train_data)}")
35
-
36
- # Conversion en DataFrame pour inspection
37
- df = train_data.to_pandas()
38
- print(f"📝 Colonnes disponibles ({len(df.columns)}): {list(df.columns)}")
39
- print(f"📏 Forme des données: {df.shape}")
40
-
41
- # Vérifier les colonnes importantes
42
- important_cols = ['millesime', 'familleprod', 'produit', 'quantitetot', 'numparcell']
43
- available_important = [col for col in important_cols if col in df.columns]
44
- print(f"🎯 Colonnes importantes trouvées: {available_important}")
45
-
46
- # Statistiques rapides
47
- if 'millesime' in df.columns:
48
- print(f"📅 Années disponibles: {sorted(df['millesime'].unique())}")
49
-
50
- if 'familleprod' in df.columns:
51
- print(f"🧪 Types de produits: {df['familleprod'].value_counts().head()}")
52
-
53
- print("✅ Test de connexion réussi !")
54
-
55
- else:
56
- print("⚠️ Pas de split 'train' trouvé")
57
-
58
- except Exception as e:
59
- print(f"❌ Erreur lors du test: {e}")
60
- print()
61
- print("💡 Solutions possibles:")
62
- print("1. Vérifiez que le dataset existe: https://huggingface.co/datasets/HackathonCRA/2024")
63
- print("2. Configurez votre token HF: export HF_TOKEN='votre_token'")
64
- print("3. Vérifiez vos permissions d'accès au dataset")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
test_hf_simple.py DELETED
@@ -1,54 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Test simplifié de connexion HuggingFace sans numpy
4
- """
5
-
6
- import os
7
-
8
- def test_hf_connection():
9
- print("🧪 Test de connexion simple au dataset HuggingFace")
10
-
11
- dataset_id = "HackathonCRA/2024"
12
- hf_token = os.environ.get("HF_TOKEN")
13
-
14
- print(f"📦 Dataset: {dataset_id}")
15
- print(f"🔑 Token configuré: {'✅ Oui' if hf_token else '❌ Non'}")
16
-
17
- try:
18
- # Import ici pour éviter les conflits
19
- from huggingface_hub import HfApi
20
-
21
- api = HfApi(token=hf_token)
22
-
23
- # Test d'accès au dataset
24
- print("🔄 Test d'accès au dataset...")
25
- dataset_info = api.dataset_info(dataset_id)
26
-
27
- print(f"✅ Dataset accessible !")
28
- print(f"📝 Description: {dataset_info.description or 'Pas de description'}")
29
- print(f"🏷️ Tags: {dataset_info.tags}")
30
- print(f"📊 Dernière modification: {dataset_info.last_modified}")
31
-
32
- # Lister les fichiers
33
- files = api.list_repo_files(dataset_id, repo_type="dataset")
34
- csv_files = [f for f in files if f.endswith('.csv')]
35
-
36
- print(f"📄 Fichiers CSV trouvés ({len(csv_files)}):")
37
- for f in csv_files[:5]: # Afficher les 5 premiers
38
- print(f" - {f}")
39
- if len(csv_files) > 5:
40
- print(f" ... et {len(csv_files) - 5} autres")
41
-
42
- return True
43
-
44
- except Exception as e:
45
- print(f"❌ Erreur: {e}")
46
- print()
47
- print("💡 Solutions possibles:")
48
- print("1. Vérifiez que le dataset existe: https://huggingface.co/datasets/HackathonCRA/2024")
49
- print("2. Configurez votre token: export HF_TOKEN='votre_token'")
50
- print("3. Vérifiez vos permissions d'accès")
51
- return False
52
-
53
- if __name__ == "__main__":
54
- test_hf_connection()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
test_parsing_fix.py DELETED
@@ -1,65 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Test de la correction du problème de parsing
4
- """
5
-
6
- import pandas as pd
7
-
8
- def test_direct_csv_loading():
9
- """Test du chargement direct des CSV depuis HuggingFace"""
10
-
11
- dataset_id = "HackathonCRA/2024"
12
-
13
- csv_files = [
14
- "Interventions-(sortie-excel)-Station_Expérimentale_de_Kerguéhennec-2020.csv",
15
- "Interventions-(sortie-excel)-Station_Expérimentale_de_Kerguéhennec-2021.csv",
16
- "Interventions-(sortie-excel)-Station_Expérimentale_de_Kerguéhennec-2022.csv",
17
- "Interventions-(sortie-excel)-Station_Expérimentale_de_Kerguéhennec-2023.csv",
18
- "Interventions-(sortie-excel)-Station_Expérimentale_de_Kerguéhennec-2024.csv",
19
- "Interventions-(sortie-excel)-Station_Expérimentale_de_Kerguéhennec-2025.csv"
20
- ]
21
-
22
- print("🧪 Test du chargement CSV direct depuis HuggingFace")
23
- print("=" * 60)
24
-
25
- all_dataframes = []
26
-
27
- for csv_file in csv_files:
28
- try:
29
- # URL directe vers le fichier
30
- file_url = f"https://huggingface.co/datasets/{dataset_id}/resolve/main/{csv_file}"
31
- print(f"📥 Test: {csv_file}")
32
-
33
- # Charger avec pandas en forçant tout en string
34
- df_temp = pd.read_csv(file_url, dtype=str, na_filter=False, nrows=5) # Juste 5 lignes pour test
35
- print(f" ✅ Succès: {df_temp.shape[0]} lignes, {df_temp.shape[1]} colonnes")
36
- print(f" 📊 Colonnes: {list(df_temp.columns)[:5]}...")
37
-
38
- df_temp['source_file'] = csv_file
39
- all_dataframes.append(df_temp)
40
-
41
- except Exception as e:
42
- print(f" ❌ Erreur: {str(e)[:100]}...")
43
- continue
44
-
45
- if all_dataframes:
46
- # Concaténer
47
- df_combined = pd.concat(all_dataframes, ignore_index=True)
48
- print(f"\n🎯 RÉSULTAT:")
49
- print(f" ✅ {len(csv_files)} fichiers testés")
50
- print(f" ✅ {len(all_dataframes)} fichiers chargés avec succès")
51
- print(f" ✅ {df_combined.shape[0]} lignes totales")
52
- print(f" ✅ {df_combined.shape[1]} colonnes")
53
-
54
- # Vérifier millesime
55
- if 'millesime' in df_combined.columns:
56
- print(f" 📅 Années détectées: {sorted(df_combined['millesime'].unique())}")
57
-
58
- print(f"\n💡 La solution de chargement direct fonctionne !")
59
- return True
60
- else:
61
- print(f"\n❌ Aucun fichier n'a pu être chargé")
62
- return False
63
-
64
- if __name__ == "__main__":
65
- test_direct_csv_loading()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
validate_app_structure.py DELETED
@@ -1,101 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Validation de la structure finale de l'application
4
- """
5
-
6
- import os
7
-
8
- def validate_app_structure():
9
- """Valide que tous les fichiers nécessaires sont présents"""
10
-
11
- print("🔍 Validation de la structure de l'application")
12
- print("=" * 50)
13
-
14
- required_files = {
15
- 'app.py': 'Application Gradio principale',
16
- 'requirements.txt': 'Dépendances Python',
17
- 'README.md': 'Métadonnées HuggingFace Spaces',
18
- 'sample_data.csv': 'Données de fallback (non utilisées)'
19
- }
20
-
21
- optional_files = {
22
- 'DEPLOY_HF.md': 'Guide de déploiement',
23
- 'PARSING_ERROR_FIX.md': 'Documentation de la correction',
24
- 'FINAL_SUMMARY.md': 'Résumé des modifications'
25
- }
26
-
27
- print("📁 Fichiers requis:")
28
- all_present = True
29
-
30
- for filename, description in required_files.items():
31
- if os.path.exists(filename):
32
- size = os.path.getsize(filename)
33
- print(f" ✅ {filename:<20} ({size:,} bytes) - {description}")
34
- else:
35
- print(f" ❌ {filename:<20} MANQUANT - {description}")
36
- all_present = False
37
-
38
- print("\n📁 Fichiers optionnels:")
39
- for filename, description in optional_files.items():
40
- if os.path.exists(filename):
41
- size = os.path.getsize(filename)
42
- print(f" ✅ {filename:<25} ({size:,} bytes) - {description}")
43
- else:
44
- print(f" ⚪ {filename:<25} Absent - {description}")
45
-
46
- print("\n🔧 Validation du contenu:")
47
-
48
- # Vérifier app.py
49
- if os.path.exists('app.py'):
50
- with open('app.py', 'r', encoding='utf-8') as f:
51
- content = f.read()
52
-
53
- checks = [
54
- ('HackathonCRA/2024', 'Dataset ID configuré'),
55
- ('load_dataset', 'Import datasets présent'),
56
- ('dtype=str', 'Chargement CSV robuste'),
57
- ('csv_files =', 'Fallback CSV direct'),
58
- ('pandas', 'Import pandas'),
59
- ('AgricultureAnalyzer', 'Classe principale')
60
- ]
61
-
62
- for check, description in checks:
63
- if check in content:
64
- print(f" ✅ {description}")
65
- else:
66
- print(f" ⚠️ {description} - Non trouvé: '{check}'")
67
-
68
- # Vérifier requirements.txt
69
- if os.path.exists('requirements.txt'):
70
- with open('requirements.txt', 'r') as f:
71
- requirements = f.read()
72
-
73
- deps = [
74
- 'gradio',
75
- 'datasets',
76
- 'huggingface_hub',
77
- 'pandas',
78
- 'numpy',
79
- 'plotly'
80
- ]
81
-
82
- print(f"\n📦 Dépendances:")
83
- for dep in deps:
84
- if dep in requirements:
85
- print(f" ✅ {dep}")
86
- else:
87
- print(f" ❌ {dep} manquant")
88
-
89
- print(f"\n🎯 RÉSULTAT:")
90
- if all_present:
91
- print(" ✅ Tous les fichiers requis sont présents")
92
- print(" ✅ Application prête pour HuggingFace Spaces")
93
- print(" 🚀 Vous pouvez déployer maintenant !")
94
- else:
95
- print(" ❌ Des fichiers requis sont manquants")
96
- print(" 🔧 Corrigez avant le déploiement")
97
-
98
- return all_present
99
-
100
- if __name__ == "__main__":
101
- validate_app_structure()