guille03 commited on
Commit
52ee224
·
1 Parent(s): f7eed9c
Files changed (2) hide show
  1. analisis.py +72 -1
  2. app.py +19 -0
analisis.py CHANGED
@@ -124,6 +124,15 @@ class AnalizadorDatos:
124
  'graficos': {k: v['path'] for k, v in self.graficos.items()}
125
  }
126
  }
 
 
 
 
 
 
 
 
 
127
 
128
 
129
  def analisis_completo(file_path: str, columnas_analisis: list = None):
@@ -150,6 +159,68 @@ def analisis_completo(file_path: str, columnas_analisis: list = None):
150
 
151
  return analizador.resumen_analisis()
152
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
153
 
154
  if __name__ == "__main__":
155
  # Ejemplo de uso con análisis mejorado de nulos
@@ -164,4 +235,4 @@ if __name__ == "__main__":
164
 
165
  print("\nTop 5 columnas con más nulos:")
166
  for col in resumen['nulos_por_columna'][:5]:
167
- print(f"- {col['nombre_columna']}: {col['porcentaje_nulos']}% nulos")
 
124
  'graficos': {k: v['path'] for k, v in self.graficos.items()}
125
  }
126
  }
127
+
128
+ def procesar_nulos(metodo):
129
+ global analizador_global
130
+ if not analizador_global:
131
+ return "Error: No hay datos cargados", None
132
+
133
+ resultado = analizador_global.procesar_valores_nulos(metodo)
134
+ df_actualizado = analizador_global.df.head()
135
+ return resultado, df_actualizado
136
 
137
 
138
  def analisis_completo(file_path: str, columnas_analisis: list = None):
 
159
 
160
  return analizador.resumen_analisis()
161
 
162
+ def procesar_valores_nulos(self, metodo: str) -> str:
163
+ """Procesa los valores nulos del DataFrame según el método especificado"""
164
+ if self.df is None:
165
+ return "Error: No hay datos cargados"
166
+
167
+ df_original = self.df.copy()
168
+ columnas_numericas = self.df.select_dtypes(include=['number']).columns
169
+ columnas_categoricas = self.df.select_dtypes(include=['object', 'category']).columns
170
+
171
+ try:
172
+ if metodo == "media":
173
+ # Para columnas numéricas: llenar con la media
174
+ for col in columnas_numericas:
175
+ if self.df[col].isnull().any():
176
+ media = self.df[col].mean()
177
+ self.df[col].fillna(media, inplace=True)
178
+
179
+ # Para columnas categóricas: llenar con la moda
180
+ for col in columnas_categoricas:
181
+ if self.df[col].isnull().any():
182
+ moda = self.df[col].mode()
183
+ if not moda.empty:
184
+ self.df[col].fillna(moda[0], inplace=True)
185
+
186
+ elif metodo == "mediana":
187
+ # Para columnas numéricas: llenar con la mediana
188
+ for col in columnas_numericas:
189
+ if self.df[col].isnull().any():
190
+ mediana = self.df[col].median()
191
+ self.df[col].fillna(mediana, inplace=True)
192
+
193
+ # Para columnas categóricas: llenar con la moda
194
+ for col in columnas_categoricas:
195
+ if self.df[col].isnull().any():
196
+ moda = self.df[col].mode()
197
+ if not moda.empty:
198
+ self.df[col].fillna(moda[0], inplace=True)
199
+
200
+ elif metodo == "moda":
201
+ # Para todas las columnas: llenar con la moda
202
+ for col in self.df.columns:
203
+ if self.df[col].isnull().any():
204
+ moda = self.df[col].mode()
205
+ if not moda.empty:
206
+ self.df[col].fillna(moda[0], inplace=True)
207
+
208
+ # Actualizar análisis de nulos
209
+ self.nulos_por_columna = analizar_nulos_por_columna(self.df)
210
+
211
+ nulos_antes = df_original.isnull().sum().sum()
212
+ nulos_despues = self.df.isnull().sum().sum()
213
+
214
+ return (f"Procesamiento completado con método: {metodo}\n"
215
+ f"Valores nulos antes: {nulos_antes}\n"
216
+ f"Valores nulos después: {nulos_despues}\n"
217
+ f"Valores procesados: {nulos_antes - nulos_despues}")
218
+
219
+ except Exception as e:
220
+ # Restaurar DataFrame original en caso de error
221
+ self.df = df_original
222
+ return f"Error al procesar valores nulos: {str(e)}"
223
+
224
 
225
  if __name__ == "__main__":
226
  # Ejemplo de uso con análisis mejorado de nulos
 
235
 
236
  print("\nTop 5 columnas con más nulos:")
237
  for col in resumen['nulos_por_columna'][:5]:
238
+ print(f"- {col['nombre_columna']}: {col['porcentaje_nulos']}% nulos")
app.py CHANGED
@@ -57,6 +57,25 @@ with gr.Blocks(title="Análisis exploratorio avanzado con R y Python") as demo:
57
  outputs=[estado_carga, df_preview, columnas_selector]
58
  )
59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  gr.Markdown("Gráficos generados")
61
  graficos_output = gr.Group()
62
 
 
57
  outputs=[estado_carga, df_preview, columnas_selector]
58
  )
59
 
60
+ gr.Markdown("### Procesamiento de Valores Nulos")
61
+ with gr.Row():
62
+ metodo_nulos = gr.Radio(
63
+ choices=["media", "mediana", "moda"],
64
+ label="Método para llenar valores nulos",
65
+ info="Media/Mediana: para columnas numéricas. Moda: para todas las columnas",
66
+ value="media"
67
+ )
68
+ procesar_nulos_btn = gr.Button("Procesar valores nulos")
69
+
70
+ resultado_nulos = gr.Textbox(label="Resultado del procesamiento", interactive=False)
71
+ df_actualizado = gr.Dataframe(label="Vista previa actualizada")
72
+
73
+ procesar_nulos_btn.click(
74
+ fn=procesar_nulos,
75
+ inputs=[metodo_nulos],
76
+ outputs=[resultado_nulos, df_actualizado]
77
+ )
78
+
79
  gr.Markdown("Gráficos generados")
80
  graficos_output = gr.Group()
81