void_gryph / modules /data_analysis.py
Gryphus314's picture
feat: prototipo funcional multi-módulo con arquitectura optimizada
f6174cf
import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
def render():
st.header("Análisis de Datos")
st.markdown("Sube tus archivos CSV o Excel para realizar un análisis exploratorio rápido.")
uploaded_file = st.file_uploader("Elige un archivo", type=["csv", "xlsx"])
if uploaded_file is not None:
try:
if uploaded_file.name.endswith('.csv'):
df = pd.read_csv(uploaded_file)
else:
df = pd.read_excel(uploaded_file)
st.subheader("Vista Previa de los Datos")
st.dataframe(df.head())
st.subheader("Estadísticas Descriptivas")
st.write(df.describe())
st.subheader("Información de Columnas")
st.write(df.dtypes)
st.subheader("Visualización")
numeric_cols = df.select_dtypes(include=['number']).columns.tolist()
if numeric_cols:
col_x = st.selectbox("Selecciona eje X", numeric_cols)
col_y = st.selectbox("Selecciona eje Y", numeric_cols)
chart_type = st.radio("Tipo de gráfico", ["Dispersión (Scatter)", "Líneas", "Histograma"])
fig, ax = plt.subplots()
if chart_type == "Dispersión (Scatter)":
sns.scatterplot(data=df, x=col_x, y=col_y, ax=ax)
elif chart_type == "Líneas":
sns.lineplot(data=df, x=col_x, y=col_y, ax=ax)
else:
sns.histplot(df[col_x], kde=True, ax=ax)
st.pyplot(fig)
plt.close(fig)
else:
st.warning("No se encontraron columnas numéricas para graficar.")
except Exception as e:
st.error(f"Error al procesar el archivo: {e}")