network-analysis-ai / flows /network_interface.py
odelgi0810
comparativa
4cfb5ea
Raw
History Blame Contribute Delete
9.47 kB
import gradio as gr
import pandas as pd
import tempfile
import uuid
import os
from analysis.network_analysis import analizar_excel_redes_y_generar_pdf, comparar_informes_docx
from utils.selector_panel import render_selector_panel
def interfaz_redes(session_id_state):
"""
Crea la interfaz de análisis de redes sociales utilizando Gradio.
Esta interfaz permite al usuario:
- Seleccionar el método de carga de datos (archivo local o base de datos).
- Subir un archivo Excel o CSV con comentarios de redes sociales.
- Elegir entre distintos tipos de informe de análisis.
- Ingresar parámetros como nombre del cliente o competidor si el informe lo requiere.
- Ejecutar el análisis con IA (GPT) y descargar los informes generados (.docx).
También incluye:
- Indicadores de progreso del análisis.
- Mensajes informativos o de error.
"""
# Generar un identificador de sesión único para evitar conflictos entre usuarios
# session_id = str(uuid.uuid4())[:8]
# session_id_state = gr.State(session_id)
with gr.Row():
gr.Markdown("## 📝 Análisis de Contenido en Redes Sociales con Inteligencia Artificial")
# Selector de método de carga: archivo o base de datos
metodo_input = gr.Radio(
["Subir archivo", "Descargar desde base de datos"],
label="Selecciona el método de ingreso de datos",
value="Subir archivo"
)
# Panel de carga de archivo Excel o Csv (activo por defecto)
with gr.Group(visible=True) as panel_excel:
with gr.Row():
boton_excel = gr.Button("📥 Descargar Archivo de Ejemplo")
archivo_descarga = gr.File(label="Archivo de ejemplo", interactive=False, visible=False)
archivo_input = gr.File(label="Sube el archivo Excel (.xlsx) o Csv (.csv)")
def generar_excel_ejemplo():
ruta_archivo = "data/Excel_para_analisis_redes.csv"
if not os.path.exists(ruta_archivo):
return gr.update(visible=False)
return gr.update(value=ruta_archivo, visible=True)
boton_excel.click(fn=generar_excel_ejemplo, inputs=[], outputs=[archivo_descarga],show_progress=True)
# Panel de carga de datos desde base de datos (oculto inicialmente)
with gr.Group(visible=False) as panel_base:
with gr.Tab("Selector de Eventos"):
selector_outputs = render_selector_panel(session_id_state) # Tab de gradio para consulta a base de datos
# Dropdown con tipos de informe posibles
informe = gr.Dropdown(
[
"¿De qué se habla HOY en las redes?",
"¿Cuál fue HOY mi desempeño en las Redes?",
"¿Cómo Me fue HOY en las Redes en Comparación a Mis Competidores?",
"¿Cuáles son las FORTALEZAS y DEBILIDADES de mi estrategia digital?",
"¿Cuáles son las FORTALEZAS y DEBILIDADES de la estrategia digital de Mi Competidor?"
],
label="Selecciona el informe",
value="¿Cuál fue HOY mi desempeño en las Redes?" # Tipo de informe seleccionado por defecto
)
# 🔽 CAMPOS CONDICIONALES: ingreso del cliente (oculto por defecto)
nombre_cliente = gr.Textbox(label="Nombre del cliente", visible=True)
nombre_competidor = gr.Textbox(label="Nombre del competidor", visible=False)
def mostrar_ocultar_cliente(informe_sel):
if informe_sel == "¿Cuál fue HOY mi desempeño en las Redes?":
return gr.update(visible=True), gr.update(visible=False)
elif informe_sel == "¿De qué se habla HOY en las redes?":
return gr.update(visible=False), gr.update(visible=False)
elif informe_sel == "¿Cómo Me fue HOY en las Redes en Comparación a Mis Competidores?":
return gr.update(visible=True), gr.update(visible=True)
elif informe_sel == "¿Cuáles son las FORTALEZAS y DEBILIDADES de mi estrategia digital?":
return gr.update(visible=True), gr.update(visible=False)
elif informe_sel == "¿Cuáles son las FORTALEZAS y DEBILIDADES de la estrategia digital de Mi Competidor?":
return gr.update(visible=True), gr.update(visible=True)
else:
return gr.update(visible=False), gr.update(visible=False)
informe.change(
fn=mostrar_ocultar_cliente,
inputs=[informe],
outputs=[nombre_cliente, nombre_competidor]
)
# Elementos de ejecución y salida
boton = gr.Button("Generar Análisis", interactive=True)
salida_pdf = gr.File(label="📄 Informes por Red Social y Resumen Global (formato Word .docx)")
mensaje_error = gr.Textbox(label="📢 Estado del Análisis (mensajes y advertencias)", interactive=False, visible=True)
progreso_texto = gr.Textbox(label="📊 Detalle del Proceso de Generación de Resúmenes", lines=25, interactive=False)
# # Título de comparativa separado para evitar que Gradio lo renderice debajo
# gr.Markdown("## 📊 Comparativa de Informes de Redes Sociales")
# ⏳ Procesamiento: Función que ejecuta el análisis de los comentarios en redes con los inputs actuales
def wrapper_func(metodo, archivo_excel, informe, nombre_cliente, nombre_competidor, session_id):
salida, mensaje, progreso = None, "", ""
# Determinar si se usará un archivo subido por el usuario o descargado de la base de datos
if metodo == "Subir archivo":
archivo = archivo_excel
else:
temp_path = os.path.join(tempfile.gettempdir(), f"df_events_{session_id}.pkl")
archivo = temp_path if os.path.exists(temp_path) else None
if not archivo:
yield gr.update(interactive=True), None, "❌ No se encontró el archivo para procesar.", ""
return
yield gr.update(interactive=False), None, "⏳ Procesando archivo... por favor espera.", ""
for salida_, mensaje_, progreso_ in analizar_excel_redes_y_generar_pdf(archivo, informe, nombre_cliente, nombre_competidor):
salida, mensaje, progreso = salida_, mensaje_, progreso_
yield gr.update(interactive=False), salida, mensaje, progreso
yield gr.update(interactive=True), salida, mensaje, progreso
# Vincula el botón con la función anterior
boton.click(
fn=wrapper_func,
inputs=[metodo_input, archivo_input, informe, nombre_cliente, nombre_competidor, session_id_state],
outputs=[boton, salida_pdf, mensaje_error, progreso_texto]
)
with gr.Group(visible=False) as bloque_comparativa:
gr.Markdown("## 📊 Comparativa de Informes de Redes Sociales")
cliente_comparativa = gr.Textbox(label="Nombre del Cliente para la Comparativa", visible=True)
comparativa_docs = gr.File(label="Sube hasta 3 informes (.docx) para comparar", file_types=[".docx"], file_count="multiple")
boton_comparar = gr.Button("📈 Comparar Informes", interactive=True)
salida_comparativa = gr.File(label="📄 Informe Comparativo (formato Word .docx)")
mensaje_comparativa = gr.Textbox(label="📢 Estado del Análisis Comparativo", interactive=False, visible=True)
progreso_comparativa = gr.Textbox(label="📊 Detalle del Proceso Comparativo", lines=15, interactive=False)
# Función que alterna visibilidad entre carga por archivo o por base de datos
def alternar_paneles(metodo):
if metodo == "Subir archivo":
return gr.update(visible=True), gr.update(visible=False), gr.update(visible=False)
else:
return gr.update(visible=False), gr.update(visible=True), gr.update(visible=True)
metodo_input.change(fn=alternar_paneles, inputs=[metodo_input], outputs=[panel_excel, panel_base, bloque_comparativa])
def comparar_informes_archivos(archivos, cliente_c, session_id):
if archivos is None or len(archivos) < 2:
yield gr.update(interactive=True), None, "❌ Por favor sube al menos 2 documentos para comparar.", ""
return
if len(archivos) > 3:
yield gr.update(interactive=True), None, "❌ El límite es de 3 documentos.", ""
return
yield gr.update(interactive=False), None, "⏳ Comparando informes... por favor espera.", ""
# 👉 Lógica de comparación
for salida_, mensaje_, progreso_ in comparar_informes_docx(archivos, cliente_c, session_id):
yield gr.update(interactive=False), salida_, mensaje_, progreso_
yield gr.update(interactive=True), salida_, mensaje_, progreso_
boton_comparar.click(
fn=comparar_informes_archivos,
inputs=[comparativa_docs, cliente_comparativa, session_id_state],
outputs=[boton_comparar, salida_comparativa, mensaje_comparativa, progreso_comparativa]
)
bloque_analisis = gr.Column([
metodo_input, panel_excel, panel_base, informe, nombre_cliente, nombre_competidor,
boton, salida_pdf, mensaje_error, progreso_texto
])
# componentes_ui = gr.Column([
# bloque_analisis,
# bloque_comparativa
# ])
componentes_ui = gr.Column([
metodo_input,
panel_excel,
panel_base,
bloque_analisis,
bloque_comparativa
])
return session_id_state, componentes_ui