Spaces:
Sleeping
Sleeping
Commit 路
6fb53ca
1
Parent(s): a4f27d8
App2
Browse files
.DS_Store
CHANGED
|
Binary files a/.DS_Store and b/.DS_Store differ
|
|
|
app.py
CHANGED
|
@@ -5,6 +5,7 @@ import matplotlib.pyplot as plt
|
|
| 5 |
import seaborn as sns
|
| 6 |
import io
|
| 7 |
import base64
|
|
|
|
| 8 |
from pandas.api.types import is_numeric_dtype
|
| 9 |
|
| 10 |
st.set_page_config(page_title="EDA y Limpieza de Datos", layout="wide")
|
|
@@ -292,13 +293,74 @@ def main():
|
|
| 292 |
st.header("馃搧 Carga tu archivo")
|
| 293 |
uploaded_file = st.file_uploader("Selecciona un archivo CSV o Excel", type=['csv', 'xlsx', 'xls'])
|
| 294 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 295 |
if uploaded_file is not None:
|
| 296 |
try:
|
| 297 |
# Determinar tipo de archivo y leerlo
|
| 298 |
if uploaded_file.name.endswith('.csv'):
|
| 299 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 300 |
else:
|
| 301 |
-
|
|
|
|
|
|
|
| 302 |
|
| 303 |
# Crear pesta帽as para organizar el an谩lisis
|
| 304 |
tab1, tab2, tab3, tab4 = st.tabs(["馃搳 Resumen de datos", "馃搱 Visualizaciones", "馃攧 Correlaciones", "馃Ч Limpieza"])
|
|
|
|
| 5 |
import seaborn as sns
|
| 6 |
import io
|
| 7 |
import base64
|
| 8 |
+
import chardet
|
| 9 |
from pandas.api.types import is_numeric_dtype
|
| 10 |
|
| 11 |
st.set_page_config(page_title="EDA y Limpieza de Datos", layout="wide")
|
|
|
|
| 293 |
st.header("馃搧 Carga tu archivo")
|
| 294 |
uploaded_file = st.file_uploader("Selecciona un archivo CSV o Excel", type=['csv', 'xlsx', 'xls'])
|
| 295 |
|
| 296 |
+
# Opciones avanzadas de importaci贸n
|
| 297 |
+
with st.expander("Opciones avanzadas de importaci贸n"):
|
| 298 |
+
custom_encoding = st.text_input("Especificar codificaci贸n personalizada (opcional)", placeholder="Ejemplo: latin1, utf-8-sig, cp1252")
|
| 299 |
+
csv_separator = st.text_input("Separador CSV personalizado (opcional)", placeholder="Por defecto: ," )
|
| 300 |
+
skip_rows = st.number_input("Saltar filas iniciales", min_value=0, value=0)
|
| 301 |
+
detect_encoding = st.checkbox("Detectar autom谩ticamente la codificaci贸n (puede ser lento para archivos grandes)")
|
| 302 |
+
decimal_separator = st.radio("Separador decimal", options=[".", ","], index=0)
|
| 303 |
+
|
| 304 |
if uploaded_file is not None:
|
| 305 |
try:
|
| 306 |
# Determinar tipo de archivo y leerlo
|
| 307 |
if uploaded_file.name.endswith('.csv'):
|
| 308 |
+
try:
|
| 309 |
+
# Preparar opciones para read_csv
|
| 310 |
+
csv_options = {
|
| 311 |
+
'skiprows': skip_rows,
|
| 312 |
+
'decimal': decimal_separator
|
| 313 |
+
}
|
| 314 |
+
|
| 315 |
+
# Agregar separador personalizado si se proporciona
|
| 316 |
+
if csv_separator:
|
| 317 |
+
csv_options['sep'] = csv_separator
|
| 318 |
+
|
| 319 |
+
# Detectar codificaci贸n si est谩 marcada la opci贸n
|
| 320 |
+
if detect_encoding:
|
| 321 |
+
uploaded_file.seek(0)
|
| 322 |
+
result = chardet.detect(uploaded_file.read())
|
| 323 |
+
detected_encoding = result['encoding']
|
| 324 |
+
confidence = result['confidence']
|
| 325 |
+
uploaded_file.seek(0)
|
| 326 |
+
|
| 327 |
+
st.info(f"Codificaci贸n detectada: {detected_encoding} (confianza: {confidence:.2f})")
|
| 328 |
+
csv_options['encoding'] = detected_encoding
|
| 329 |
+
|
| 330 |
+
# Usar codificaci贸n personalizada si se proporciona
|
| 331 |
+
elif custom_encoding:
|
| 332 |
+
csv_options['encoding'] = custom_encoding
|
| 333 |
+
else:
|
| 334 |
+
# Intentar con diferentes codificaciones
|
| 335 |
+
encodings = ['utf-8', 'latin1', 'ISO-8859-1', 'cp1252']
|
| 336 |
+
|
| 337 |
+
for encoding in encodings:
|
| 338 |
+
try:
|
| 339 |
+
# Reiniciar la posici贸n del archivo para cada intento
|
| 340 |
+
uploaded_file.seek(0)
|
| 341 |
+
df = pd.read_csv(uploaded_file, encoding=encoding, **csv_options)
|
| 342 |
+
st.success(f"Archivo le铆do correctamente usando codificaci贸n: {encoding}")
|
| 343 |
+
break
|
| 344 |
+
except UnicodeDecodeError:
|
| 345 |
+
continue
|
| 346 |
+
else: # Este bloque se ejecuta si el bucle termina sin un break
|
| 347 |
+
raise Exception("No se pudo decodificar el archivo con ninguna de las codificaciones intentadas.")
|
| 348 |
+
|
| 349 |
+
# Si llegamos aqu铆 con una codificaci贸n personalizada o detectada
|
| 350 |
+
if custom_encoding or detect_encoding:
|
| 351 |
+
uploaded_file.seek(0)
|
| 352 |
+
df = pd.read_csv(uploaded_file, **csv_options)
|
| 353 |
+
|
| 354 |
+
except Exception as e:
|
| 355 |
+
# Si todas las opciones fallan, intentar con reemplazo de caracteres
|
| 356 |
+
uploaded_file.seek(0)
|
| 357 |
+
# Agregamos low_memory=False para evitar problemas con archivos grandes
|
| 358 |
+
df = pd.read_csv(uploaded_file, encoding_errors='replace', low_memory=False, **csv_options)
|
| 359 |
+
st.warning(f"Se us贸 reemplazo de caracteres desconocidos. Algunos caracteres pueden no verse correctamente.")
|
| 360 |
else:
|
| 361 |
+
# Opciones para archivos Excel
|
| 362 |
+
excel_options = {'skiprows': skip_rows}
|
| 363 |
+
df = pd.read_excel(uploaded_file, **excel_options)
|
| 364 |
|
| 365 |
# Crear pesta帽as para organizar el an谩lisis
|
| 366 |
tab1, tab2, tab3, tab4 = st.tabs(["馃搳 Resumen de datos", "馃搱 Visualizaciones", "馃攧 Correlaciones", "馃Ч Limpieza"])
|