Spaces:
Sleeping
Sleeping
Tracy André
commited on
Commit
·
f4360dd
1
Parent(s):
2eaa9ec
updated
Browse files- DEPLOY_HF.md +0 -201
- FINAL_SOLUTION_SUMMARY.md +0 -94
- FINAL_SUMMARY.md +0 -82
- HF_FINAL_SETUP.md +0 -87
- PARSING_ERROR_FIX.md +0 -110
- ULTIMATE_FIX.md +0 -87
- app.py +13 -215
- check_dataset_splits.py +0 -75
- fix_env.sh +0 -23
- test_app_hf.py +0 -48
- test_hf_connection.py +0 -64
- test_hf_simple.py +0 -54
- test_parsing_fix.py +0 -65
- validate_app_structure.py +0 -101
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 |
-
|
| 33 |
-
|
| 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 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 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 |
-
|
| 84 |
-
|
| 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 |
-
|
| 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()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|