Tracy André commited on
Commit
1000669
·
1 Parent(s): 4adb707
Files changed (1) hide show
  1. app.py +105 -39
app.py CHANGED
@@ -32,66 +32,132 @@ class AgricultureAnalyzer:
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
- print(f"📊 Données brutes chargées: {len(self.df)} lignes")
42
  print(f"📊 Colonnes disponibles: {list(self.df.columns)}")
43
 
44
- # Nettoyage éventuel (ex: suppression NA)
45
- self.df = self.df.dropna(subset=["numparcell", "surfparc", "millesime"])
 
 
 
 
 
 
 
 
 
 
46
 
 
47
  print(f"📊 Après nettoyage: {len(self.df)} lignes")
48
- if len(self.df) > 0:
49
- print(f"📊 Herbicides présents: {(self.df['familleprod'] == 'Herbicides').sum()} interventions")
50
- print(f"📊 Cultures: {self.df['libelleusag'].nunique()} types différents")
51
 
52
- return f"✅ Données chargées avec succès : {len(self.df)} enregistrements"
53
-
 
 
 
 
 
 
 
 
 
54
  except Exception as e:
55
- print(f"❌ Erreur détaillée: {str(e)}")
 
 
56
  return f"❌ Erreur lors du chargement du dataset : {str(e)}"
57
 
58
 
59
  def analyze_data(self):
60
  """Analyse des données et calcul des risques"""
61
- if self.df is None:
 
62
  return "Erreur: Aucune donnée chargée"
63
 
64
- # Analyse générale
65
- general_stats = {
66
- 'total_parcelles': self.df['numparcell'].nunique(),
67
- 'total_interventions': len(self.df),
68
- 'surface_totale': self.df['surfparc'].sum(),
69
- 'surface_moyenne': self.df['surfparc'].mean(),
70
- 'periode': f"{self.df['millesime'].min()} - {self.df['millesime'].max()}"
71
- }
72
-
73
- # Analyse des herbicides
74
- herbicides_df = self.df[self.df['familleprod'] == 'Herbicides'].copy()
75
- herbicide_stats = {
76
- 'nb_interventions_herbicides': len(herbicides_df),
77
- 'pourcentage_herbicides': (len(herbicides_df) / len(self.df)) * 100,
78
- 'parcelles_traitees': herbicides_df['numparcell'].nunique()
79
- }
80
-
81
- # Calcul de l'analyse des risques
82
- self.calculate_risk_analysis()
83
-
84
- return general_stats, herbicide_stats
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
 
86
  def calculate_risk_analysis(self):
87
  """Calcule l'analyse des risques par parcelle"""
88
- # Groupement des données par parcelle
89
- risk_analysis = self.df.groupby(['numparcell', 'nomparc', 'libelleusag', 'surfparc']).agg({
90
- 'familleprod': lambda x: (x == 'Herbicides').sum(), # Nb traitements herbicides
91
- 'libevenem': lambda x: len(x.unique()), # Diversité des événements
92
- 'produit': lambda x: len(x.unique()), # Diversité des produits
93
- 'quantitetot': 'sum' # Quantité totale
94
- }).round(2)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
 
96
  # Quantités d'herbicides spécifiques
97
  herbicide_quantities = self.df[self.df['familleprod'] == 'Herbicides'].groupby(
 
32
  def load_data(self):
33
  """Charge les données du dataset Hugging Face"""
34
  try:
35
+ print("🔄 Chargement des données depuis Hugging Face...")
36
+ print(f"📋 Dataset ID: {dataset_id}")
37
+ print(f"📋 Token disponible: {'Oui' if hf_token else 'Non'}")
38
+
39
  self.df = load_dataset(
40
  dataset_id,
41
  split="train",
42
+ token=hf_token
43
  ).to_pandas()
44
 
45
+ print(f"📊 Données chargées: {len(self.df)} lignes")
46
  print(f"📊 Colonnes disponibles: {list(self.df.columns)}")
47
 
48
+ # Nettoyage et validation
49
+ required_columns = ["numparcell", "surfparc", "millesime"]
50
+ missing_cols = [col for col in required_columns if col not in self.df.columns]
51
+
52
+ if missing_cols:
53
+ print(f"❌ Colonnes manquantes: {missing_cols}")
54
+ self.df = None
55
+ return f"❌ Colonnes manquantes: {missing_cols}"
56
+
57
+ # Nettoyage
58
+ initial_len = len(self.df)
59
+ self.df = self.df.dropna(subset=required_columns)
60
 
61
+ print(f"📊 Avant nettoyage: {initial_len} lignes")
62
  print(f"📊 Après nettoyage: {len(self.df)} lignes")
 
 
 
63
 
64
+ if len(self.df) > 0:
65
+ herbicides_count = (self.df['familleprod'] == 'Herbicides').sum() if 'familleprod' in self.df.columns else 0
66
+ cultures_count = self.df['libelleusag'].nunique() if 'libelleusag' in self.df.columns else 0
67
+ print(f"📊 Herbicides présents: {herbicides_count} interventions")
68
+ print(f"📊 Cultures: {cultures_count} types différents")
69
+
70
+ return f"✅ Données chargées avec succès : {len(self.df)} enregistrements"
71
+ else:
72
+ self.df = None
73
+ return "❌ Aucune donnée valide après nettoyage"
74
+
75
  except Exception as e:
76
+ print(f"❌ Erreur lors du chargement depuis Hugging Face: {str(e)}")
77
+ print(f"❌ Type d'erreur: {type(e).__name__}")
78
+ self.df = None
79
  return f"❌ Erreur lors du chargement du dataset : {str(e)}"
80
 
81
 
82
  def analyze_data(self):
83
  """Analyse des données et calcul des risques"""
84
+ if self.df is None or len(self.df) == 0:
85
+ print("❌ Pas de données à analyser")
86
  return "Erreur: Aucune donnée chargée"
87
 
88
+ try:
89
+ print(f"🔄 Début de l'analyse sur {len(self.df)} enregistrements...")
90
+
91
+ # Analyse générale
92
+ general_stats = {
93
+ 'total_parcelles': self.df['numparcell'].nunique(),
94
+ 'total_interventions': len(self.df),
95
+ 'surface_totale': self.df['surfparc'].sum(),
96
+ 'surface_moyenne': self.df['surfparc'].mean(),
97
+ 'periode': f"{self.df['millesime'].min()} - {self.df['millesime'].max()}"
98
+ }
99
+
100
+ # Analyse des herbicides
101
+ if 'familleprod' in self.df.columns:
102
+ herbicides_df = self.df[self.df['familleprod'] == 'Herbicides'].copy()
103
+ herbicide_stats = {
104
+ 'nb_interventions_herbicides': len(herbicides_df),
105
+ 'pourcentage_herbicides': (len(herbicides_df) / len(self.df)) * 100,
106
+ 'parcelles_traitees': herbicides_df['numparcell'].nunique()
107
+ }
108
+ else:
109
+ herbicide_stats = {
110
+ 'nb_interventions_herbicides': 0,
111
+ 'pourcentage_herbicides': 0,
112
+ 'parcelles_traitees': 0
113
+ }
114
+
115
+ # Calcul de l'analyse des risques
116
+ self.calculate_risk_analysis()
117
+
118
+ print("✅ Analyse terminée avec succès")
119
+ return general_stats, herbicide_stats
120
+
121
+ except Exception as e:
122
+ print(f"❌ Erreur lors de l'analyse: {str(e)}")
123
+ return None, None
124
 
125
  def calculate_risk_analysis(self):
126
  """Calcule l'analyse des risques par parcelle"""
127
+ try:
128
+ print("🔄 Calcul de l'analyse des risques...")
129
+
130
+ # Vérifier les colonnes nécessaires
131
+ required_group_cols = ['numparcell', 'surfparc']
132
+ optional_group_cols = ['nomparc', 'libelleusag']
133
+
134
+ # Construire la liste des colonnes de groupement disponibles
135
+ group_cols = [col for col in required_group_cols if col in self.df.columns]
136
+ group_cols.extend([col for col in optional_group_cols if col in self.df.columns])
137
+
138
+ if len(group_cols) < 2:
139
+ print(f"❌ Colonnes insuffisantes pour le groupement: {group_cols}")
140
+ self.risk_analysis = pd.DataFrame()
141
+ return
142
+
143
+ # Construire l'agrégation selon les colonnes disponibles
144
+ agg_dict = {}
145
+ if 'familleprod' in self.df.columns:
146
+ agg_dict['familleprod'] = lambda x: (x == 'Herbicides').sum()
147
+ if 'libevenem' in self.df.columns:
148
+ agg_dict['libevenem'] = lambda x: len(x.unique())
149
+ if 'produit' in self.df.columns:
150
+ agg_dict['produit'] = lambda x: len(x.unique())
151
+ if 'quantitetot' in self.df.columns:
152
+ agg_dict['quantitetot'] = 'sum'
153
+
154
+ if not agg_dict:
155
+ print("❌ Aucune colonne disponible pour l'agrégation")
156
+ self.risk_analysis = pd.DataFrame()
157
+ return
158
+
159
+ # Groupement des données par parcelle
160
+ risk_analysis = self.df.groupby(group_cols).agg(agg_dict).round(2)
161
 
162
  # Quantités d'herbicides spécifiques
163
  herbicide_quantities = self.df[self.df['familleprod'] == 'Herbicides'].groupby(