import streamlit as st import pandas as pd import numpy as np import plotly.express as px import plotly.graph_objects as go import io # Configuración de la aplicación st.set_page_config(page_title="Solo una cosa!... ¿Cómo priorizar ante tanto ruido?", layout="wide") # Display the image above the title st.image('OneThing.jpg', use_column_width=True) # Crear pestañas tabs = st.tabs(["Resumen del Libro", "Aplicación", "Acerca de mí"]) # Función para generar contenido HTML def export_as_html(): buffer = io.StringIO() # Crear una pestaña HTML interactiva (por ejemplo, la pestaña de "Aplicación") with st.container(): st.markdown("

Pestaña de Aplicación Exportada

", unsafe_allow_html=True) st.write("Aquí se exporta el contenido interactivo de la aplicación.") # Generar gráficos en HTML fig = px.scatter(x=[1, 2, 3], y=[1, 3, 2]) fig.write_html(buffer) # Guardar gráfico en HTML en el buffer return buffer.getvalue() # Pestaña 1: Resumen del libro with tabs[0]: st.header("Resumen del libro: 'Lo Único' de Gary Keller y Jay Papasan") resumen = """ ## "Lo Único" se centra en la premisa de que el éxito se logra al enfocar nuestros esfuerzos en una sola cosa a la vez. A través de este enfoque, podemos maximizar nuestros resultados y disminuir la sensación de agobio. ### **Conceptos Clave del Libro** 1. **La Falacia de la Igualdad:** - No todas las cosas son igual de importantes; debemos identificar y priorizar lo que realmente importa. 2. **El Mito de la Multitarea:** - La multitarea no existe como tal; dividir nuestra atención disminuye la eficiencia. 3. **Disciplina vs. Hábito:** - El éxito se basa más en la formación de hábitos que en la autodisciplina férrea. 4. **La Importancia de Pensar en Grande:** - Establecer metas ambiciosas nos impulsa a superarnos. 5. **El Valor del Propósito:** - Un propósito claro nos ayuda a tomar decisiones rápidas y efectivas. ### **Conclusión** El enfoque en "Lo Único" ofrece una guía práctica para identificar prioridades y maximizar la efectividad en todas las áreas de la vida. """ st.markdown(resumen) # Pestaña 2: Aplicación with tabs[1]: st.header("Identificar Lo Único") # Descripción de cómo construir lo único st.markdown(""" ### ¿Qué es "Lo Único"? **"Lo Único"** es la tarea o acción más importante que puedes hacer en un área específica de tu vida o trabajo, de tal manera que, al lograrla, todo lo demás se vuelve más fácil o incluso innecesario. El enfoque es identificar la acción que tiene el mayor impacto y concentrar tus esfuerzos en ella para maximizar los resultados y reducir la dispersión de tareas no esenciales. Para identificar **"Lo Único"** en un área de tu vida, pregúntate: > _"¿Qué es lo único que puedo hacer ahora [en relación con un área específica de mi vida o trabajo], gracias a lo cual todo lo demás me resulte más fácil o innecesario?"_ ### Pasos para construir "Lo Único": 1. **Evalúa tus metas a largo plazo**: Considera hacia dónde quieres dirigirte, tanto personal como profesionalmente. 2. **Divide tus objetivos en áreas clave**: Por ejemplo, salud, carrera, relaciones, finanzas, etc. 3. **Prioriza en función del impacto**: ¿Qué actividad, si se realiza, tiene el mayor impacto en esa área? Esa será "Lo Único". 4. **Céntrate en un solo paso a la vez**: La clave es elegir una acción concreta que puedas ejecutar, que hará que el resto de las tareas sean más fáciles o innecesarias. """) # Separador y llamada de atención para el input st.markdown("---") # Línea separadora para dar mayor contraste st.markdown(""" ### Ahora es tu turno: **Escribe a continuación tu propia descripción de _"Lo Único"_ que deseas lograr.** _(Este será el primer paso clave hacia tu meta más importante)_: """) # Campo de texto más grande para definir "Lo Único" lo_unico = st.text_area("Describe 'Lo Único' que quieres lograr", value="Desarrollar un sistema de gestión que centralice todas las operaciones y sus resultados para reducir los tiempos de toma de decisiones", height=150) # Para resaltar visualmente el campo de entrada st.markdown("", unsafe_allow_html=True) # Añadir un botón que resalte la acción a tomar if st.button("Confirmar mi 'Lo Único'"): st.success(f"Has definido tu 'Lo Único' como: {lo_unico}") # Sidebar para mostrar DataFrames st.sidebar.header("Paso 1: Ingresa las actividades que realizas actualmente (Califica tus actividades de 0 a 5)") st.sidebar.markdown("##### *Realiza un listado de las actividades típicas en tu semana y analiza su nivel de importancia y urgencia para lograr lo único!*") data = { "Actividad": [ "Desarrollar sistema de gestión centralizado", # Actividad clave para lograr "lo único" "Definir la estrategia de operaciones", # Fundamental para la centralización de operaciones "Monitorear resultados y KPI críticos", # Actividad clave para reducir tiempos de decisión "Automatizar reportes de resultados", # Directamente relacionado con la centralización y reducción de tiempo "Optimización del flujo de información", # Alineado con la eficiencia operativa "Capacitar equipo en nuevas herramientas", # Importante para la implementación del sistema "Revisar el proceso de toma de decisiones", # Relevante para el objetivo, pero no tan urgente "Planificación estratégica de nuevos proyectos", # Puede apoyar a "lo único" en el futuro "Optimización del proceso de ventas", # Contribuye indirectamente al propósito general "Responder emails administrativos", # Consumidor de tiempo, pero delegable "Reuniones internas no estructuradas", # Requieren atención, pero pueden ser delegadas "Revisar métricas operativas no críticas", # Poco impacto en "lo único", urgentes pero delegables "Revisar y archivar documentos antiguos", # Poco impacto, eliminable "Configurar reuniones recurrentes", # Delegable "Comprar suministros generales", # No relacionado con "lo único" "Actualizar la base de datos no prioritaria", # Delegable si no es crítica "Limpieza y mantenimiento de oficina" # Eliminable ], "Importancia": [5, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 1, 2, 2, 1, 1], # Ajustado con base en "lo único" "Urgencia": [4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1], # Basado en la urgencia operativa "Tiempo invertido (horas/semana)": [12, 10, 8, 6, 5, 5, 4, 4, 3, 3, 3, 2, 1, 2, 2, 1, 1] # Horas ajustadas } # El total de horas suma aproximadamente 50-55 horas por semana, incluyendo interrupciones. df = pd.DataFrame(data) editable_df = st.sidebar.data_editor(df, key="editable_df") # Sección 1: Actividades actuales y matriz de Eisenhower st.header("¿En qué inviertes tu tiempo y donde te debes enfocar?") # Matriz de Eisenhower st.subheader("Matriz de Eisenhower y Pareto") # Clasificación en la matriz de Eisenhower conditions = [ (editable_df['Importancia'] >= 2.5) & (editable_df['Urgencia'] >= 2.5), (editable_df['Importancia'] >= 2.5) & (editable_df['Urgencia'] < 2.5), (editable_df['Importancia'] < 2.5) & (editable_df['Urgencia'] >= 2.5), (editable_df['Importancia'] < 2.5) & (editable_df['Urgencia'] < 2.5), ] choices = ['Hacer ahora', 'Planificar', 'Delegar', 'Eliminar'] editable_df['Eisenhower'] = np.select(conditions, choices, default='No clasificado') # Mostrar la Matriz de Eisenhower en un gráfico de burbujas col1, col2 = st.columns(2) # Definir los colores para los diferentes criterios de Eisenhower color_mapping = { 'Hacer ahora': 'red', 'Planificar': 'blue', 'Delegar': 'green', 'Eliminar': 'gray' } with col1: fig_eisenhower = px.scatter( editable_df, x='Urgencia', y='Importancia', size='Tiempo invertido (horas/semana)', # El tamaño de la burbuja se basa en el tiempo invertido color='Eisenhower', color_discrete_map=color_mapping, # Mapa de colores basado en 'Eisenhower' hover_name='Actividad', labels={'Importancia': 'Importancia', 'Urgencia': 'Urgencia'}, title="Matriz de Eisenhower (escala 0 a 5)" ) # Fijar los rangos de los ejes x y y de 0 a 5 fig_eisenhower.update_xaxes(range=[0, 5.5]) fig_eisenhower.update_yaxes(range=[0, 5.5]) # Agregar líneas vertical y horizontal en 2.5 fig_eisenhower.add_shape(type="line", x0=2.5, x1=2.5, y0=0, y1=5, line=dict(color="Black", width=2, dash="dash")) fig_eisenhower.add_shape(type="line", x0=0, x1=5, y0=2.5, y1=2.5, line=dict(color="Black", width=2, dash="dash")) fig_eisenhower.update_layout( template="plotly_white") st.plotly_chart(fig_eisenhower, use_container_width=True) # Pareto basado en el tiempo invertido editable_df['Ponderación'] = editable_df['Tiempo invertido (horas/semana)'] # Usar tiempo invertido para el Pareto pareto_df = editable_df.sort_values(by='Ponderación', ascending=False) # Gráfico de Pareto # Calcular frecuencias relativas y acumuladas pareto_df['Frecuencia Relativa'] = pareto_df['Ponderación'] / pareto_df['Ponderación'].sum() pareto_df['Frecuencia Acumulada'] = pareto_df['Frecuencia Relativa'].cumsum() # Asignar colores basados en la columna Eisenhower pareto_df['Color'] = pareto_df['Eisenhower'].map(color_mapping) with col2: fig_pareto = go.Figure() # Gráfico de barras para frecuencias relativas, coloreando según el criterio de Eisenhower fig_pareto.add_trace(go.Bar( x=pareto_df['Actividad'], y=pareto_df['Frecuencia Relativa'], name='Frecuencia Relativa', marker_color=pareto_df['Color'] # Colorear barras según la clasificación Eisenhower )) # Gráfico de línea para frecuencias acumuladas fig_pareto.add_trace(go.Scatter( x=pareto_df['Actividad'], y=pareto_df['Frecuencia Acumulada'], name='Frecuencia Acumulada', marker_color='red', yaxis='y2', mode='lines+markers' )) # Agregar una línea horizontal en el 80% fig_pareto.add_trace(go.Scatter( x=[pareto_df['Actividad'].iloc[0], pareto_df['Actividad'].iloc[-1]], y=[0.8, 0.8], mode='lines', name='Límite del 80%', line=dict(color='orange', width=2, dash='dash') )) # Ajustar el diseño del gráfico de Pareto para mejor legibilidad fig_pareto.update_layout( title='Pareto de Actividades por Tiempo Invertido', yaxis=dict(title='Frecuencia Relativa', range=[0, 1]), # Eje y de 0 a 1 yaxis2=dict(title='Frecuencia Acumulada', overlaying='y', side='right', range=[0, 1]), # Eje y secundario de 0 a 1 legend=dict(x=0.1, y=0.9), xaxis=dict( tickangle=-45, # Rotar las etiquetas del eje x title_text='Actividades', tickfont=dict(size=10) # Reducir el tamaño de la fuente para que las etiquetas sean legibles ), template="plotly_white", margin=dict(b=150), # Agregar margen inferior para evitar que las etiquetas se corten width=1000 # Ajustar el ancho del gráfico para mejorar la visualización ) st.plotly_chart(fig_pareto, use_container_width=True) # Sección 2: Matriz de habilidades y análisis de brechas st.header("¿Qué habilidades debes desarrollar para enfocarte en lo único?") # Sidebar para ajustar el journey de prioridades st.sidebar.header("Paso 2: Ingresa los datos de tus habilidades para lograr lo Único!") st.sidebar.markdown("##### *Realiza una autovaloración de las habilidades que consideras que debes desarrollar, el nivel que consideras que tienes actualmente y cual debes alcanzar*") skills_data = { 'Habilidad': [ 'Comunicación', # Importante para transmitir información y colaborar con el equipo. 'Gestión de Proyectos', # Necesaria para planificar, ejecutar y supervisar proyectos eficientemente. 'Análisis de Datos', # Habilidad para interpretar datos y tomar decisiones informadas. 'Programación Básica', # Conocimiento de herramientas tecnológicas para implementar soluciones. 'Liderazgo', # Clave para guiar y motivar a los miembros del equipo. 'Pensamiento Crítico', # Habilidad para resolver problemas y tomar decisiones efectivas. 'Gestión del Cambio', # Capacidad para implementar cambios organizativos sin interrupciones. 'Gestión del Tiempo', # Importante para priorizar tareas y cumplir plazos. 'Conocimientos en Tecnología', # Familiaridad con herramientas y sistemas de gestión que pueden facilitar procesos. 'Capacitación y Desarrollo', # Habilidad para entrenar y desarrollar al equipo en nuevas herramientas o procesos. 'Planificación Estratégica' # Capacidad para alinear las operaciones con los objetivos organizacionales. ], 'Habilidad Actual': [3, 4, 2, 3, 3, 4, 2, 3, 3, 2, 3], # Evaluación de habilidades actuales 'Habilidad Requerida': [5, 5, 4, 4, 4, 5, 4, 5, 4, 3, 4] # Habilidades necesarias para lograr el propósito } # Asegúrate de que todas las listas tengan la misma longitud skills_df = pd.DataFrame(skills_data) skills_df = st.sidebar.data_editor(skills_df, key="skills_df") # Crear columnas para el heatmap y el gráfico de radar col3, col4 = st.columns(2) # Mostrar matriz de habilidades como heatmap usando Plotly with col3: st.markdown("### ¿Dónde estás vs. dónde debes estar?") # Creación del heatmap con escala de color 'Greens' heatmap_fig = go.Figure(data=go.Heatmap( z=skills_df[['Habilidad Actual', 'Habilidad Requerida']].values, # Los valores de habilidad actual y requerida x=['Habilidad Actual', 'Habilidad Requerida'], # Ejes x y=skills_df['Habilidad'], # Ejes y colorscale='Greens', # Escala de colores que va de verde oscuro (bajo) a verde brillante (alto) colorbar=dict(title='Nivel de Habilidad') )) heatmap_fig.update_layout( title='Heatmap de Habilidades', template="plotly_white", yaxis=dict(title='Habilidad') ) st.plotly_chart(heatmap_fig, use_container_width=True) # Gráfico de radar para el análisis de brechas with col4: st.markdown("### ¿Cuál habilidad debes desarrollar más?") fig_radar = go.Figure() # Trazos de habilidades requeridas (verde brillante para niveles altos) fig_radar.add_trace(go.Scatterpolar( r=skills_df['Habilidad Requerida'], theta=skills_df['Habilidad'], fill='toself', name='Habilidad Requerida', line=dict(color='rgba(0, 100, 0, 0.7)'), # Verde oscuros fillcolor='rgba(0, 100, 0, 0.2)' # Verde oscuro para el área )) # Trazos de habilidades actuales (verde oscuro para niveles bajos) fig_radar.add_trace(go.Scatterpolar( r=skills_df['Habilidad Actual'], theta=skills_df['Habilidad'], fill='toself', name='Habilidad Actual', line=dict(color='rgba(0, 235, 0, 0.7)'), # Verde brillante fillcolor='rgba(0, 235, 0, 0.7)' # Verde claro para el área )) fig_radar.update_layout( polar=dict( radialaxis=dict( visible=True, range=[0, 5] # Rango de habilidades )), showlegend=True, template="plotly_white", title="Análisis de Brechas en Habilidades" ) st.plotly_chart(fig_radar, use_container_width=True) # Sección 3: Journey Map (Funnel o Bowtie) st.header("Traza tu hoja de ruta: Escribe tus actividades prioritarias y los resultados que esperas!") # Sidebar para ajustar el journey de prioridades st.sidebar.header("Paso 3: Ingresa los datos de tu hoja de ruta y resultados esperados, y enfocate en ellos!") st.sidebar.markdown("##### *En este punto ya sabes en que inviertes el tiempo y que decisiones debes tomar, además sabes las habilidades que debes desarrollar. Ingresa las actividades prioritarias para alcanzar lo único!, ingresa los resultados actuales y esperados al desarrollar lo único y concentrate en ellos!*") # Datos de actividades prioritarias con KPI medibles y tiempos journey_data = { 'Prioridad': [ 'Definir la estrategia del sistema de gestión', 'Análisis de requerimientos', 'Implementación del sistema de gestión', 'Optimización de procesos existentes', 'Reuniones con clientes clave', 'Capacitación del equipo sobre el nuevo sistema', 'Revisión de KPIs establecidos' ], 'Resultado': [ 'Número de no conformidades', # KPI para medir la efectividad de la estrategia 'Número de requerimientos definidos', # KPI para medir el alcance del análisis 'Satisfacción del usuario (%)', # KPI de satisfacción tras la implementación 'Eficiencia del proceso (horas)', # KPI para evaluar la eficiencia del proceso 'Número de decisiones informadas', # KPI para medir la efectividad de las reuniones 'Número de capacitaciones completadas', # KPI para medir el alcance de la capacitación 'Costo de implementación (USD)' # KPI relacionado con el costo ], 'Inicio': [ '2024-10-01', '2024-10-03', '2024-10-10', '2024-10-15', '2024-10-20', '2024-10-25', '2024-10-30' ], 'Fin': [ '2024-10-02', '2024-10-04', '2024-10-14', '2024-10-25', '2024-10-22', '2024-10-30', '2024-11-05' ], 'KPI Actual': [15, 8, 70, 30, 5, 1, 2000], # Valores actuales de KPIs 'KPI Esperado': [5, 10, 90, 10, 20, 3, 800], # Valores esperados de KPIs 'Mejor': ['<', '>', '>', '<', '>', '>', '<'] # Indica si el KPI debe mejorar o disminuir } # Crear DataFrame journey_df = pd.DataFrame(journey_data) journey_df = st.sidebar.data_editor(journey_df, key="journey_df") # Calcular el tiempo basado en las fechas (en horas) journey_df['Inicio'] = pd.to_datetime(journey_df['Inicio']) journey_df['Fin'] = pd.to_datetime(journey_df['Fin']) journey_df['Tiempo (horas)'] = (journey_df['Fin'] - journey_df['Inicio']).dt.days * 8 # Suponiendo 8 horas por día # Calcular el porcentaje de mejora considerando la dirección def calculate_percentage_improvement(current, expected, direction): if current == 0 and expected > 0: return 100 # Mejora completa al ir de 0 a un valor positivo elif current > 0 and expected == 0: return -100 # Disminución completa elif current == 0 and expected == 0: return 0 # Sin cambio else: if direction == '>': return ((expected - current) / current) * 100 # Mejora esperada elif direction == '<': return ((current - expected) / current) * 100 # Disminución esperada # Aplicar la función para calcular el porcentaje de mejora journey_df['Porcentaje Mejora'] = journey_df.apply( lambda row: calculate_percentage_improvement( row['KPI Actual'], row['KPI Esperado'], row['Mejor'] ), axis=1 ) # Normalizar los valores para el funnel max_tiempo = journey_df['Tiempo (horas)'].max() max_porcentaje_mejora = journey_df['Porcentaje Mejora'].max() journey_df['Tiempo Normalizado'] = journey_df['Tiempo (horas)'] / max_tiempo * 100 # Normalización al rango 0-100 journey_df['Porcentaje Mejora Normalizado'] = journey_df['Porcentaje Mejora'] / max_porcentaje_mejora * 100 # Normalización al rango 0-100 # Obtener el número de prioridades para ajustar el eje 'y' dinámicamente num_prioridades = len(journey_df['Prioridad']) # Colores para el Funnel color_actividades = 'rgba(0, 100, 255, 0.8)' # Color azul para actividades priorizadas color_resultados = 'rgba(255, 165, 0, 0.8)' # Color naranja para resultados esperados # Gráfico tipo funnel (bowtie) para mostrar el journey map fig_journey = go.Figure() # Funnel de actividades priorizadas (vertical) fig_journey.add_trace(go.Funnel( y=journey_df['Tiempo Normalizado'], x=journey_df['Prioridad'], # Mostrar el tiempo normalizado de cada actividad textinfo="value+label", name="Actividades Prioritarias", marker=dict(color=color_actividades), # Aplicar color uniforme para las actividades orientation="v" # Mantener orientación vertical )) # Funnel de resultados esperados (vertical) fig_journey.add_trace(go.Funnel( y=journey_df['Porcentaje Mejora Normalizado'], # Usar el porcentaje de mejora como resultado x=journey_df['Resultado'], # Mostrar el KPI como resultado textinfo="value+label", name="Resultados Esperados", marker=dict(color=color_resultados), # Aplicar color uniforme para los resultados orientation="v" # Mantener orientación vertical )) # Actualizar la visualización del gráfico fig_journey.update_layout( template="plotly_white", title="Journey Map: Actividades Prioritarias y Resultados Esperados", funnelmode="stack" ) st.plotly_chart(fig_journey, use_container_width=True) # --------------------------- Gantt Chart ----------------------------------- # Crear DataFrame para las actividades priorizadas y fechas eventos = journey_df[['Prioridad', 'Inicio', 'Fin']].copy() eventos.columns = ['Evento', 'Fecha de Inicio', 'Fecha de Fin'] # Renombrar columnas # Crear el gráfico de Gantt con una paleta de colores predefinida fig_gantt = px.timeline( eventos, x_start="Fecha de Inicio", x_end="Fecha de Fin", y="Evento", color='Evento', # Colores automáticos basados en la actividad title='Gráfico de Gantt de Actividades Prioritarias', color_discrete_sequence=px.colors.qualitative.Pastel # Usar una paleta clara para asegurar legibilidad ) # Ajustar las configuraciones del gráfico de Gantt fig_gantt.update_layout( template="plotly_white" # Usar un tema claro para evitar colores oscuros en la descarga ) # Mostrar el gráfico en Streamlit st.plotly_chart(fig_gantt, use_container_width=True) # --------------------------- Download Chart ----------------------------------- def export_figures_to_html(figures, title="Exported Figures"): html = f"{title}" for fig in figures: html += fig.to_html(full_html=False, include_plotlyjs='cdn') html += "" return html # Recopilar todas las figuras que deseas exportar figuras_a_exportar = [fig_eisenhower, fig_pareto, heatmap_fig, fig_radar,fig_journey, fig_gantt] # Crear el HTML para descargar html_export = export_figures_to_html(figuras_a_exportar, title="Exportación de Gráficos de la Aplicación") st.markdown("### Descarga tus gráficos ") # Añadir un botón de descarga al final de la pestaña st.download_button( label="Descargar Gráficos en HTML", data=html_export, file_name="aplicacion_graficos.html", mime="text/html" ) # Pestaña 3: Acerca de mí with tabs[2]: st.header("Acerca de mí") acerca_de_mi = """ ¡Hola! Soy Migue, desarrollo herramientas para facilitar la visualización y organización de ideas mediante visualizaciones interactivas. Esta aplicación está diseñada para ayudarte a estructurar tus pensamientos de manera eficiente y creativa, utilizando tecnologías de desarrollo de aplicaciones en Python. **Características de la Aplicación:** - **Interfaz Intuitiva:** Agrega tus ideas principales y datos en la barra lateral - **Visualización Interactiva:** Explora tus visualizaciones de manera dinámica y visualmente atractiva. **Contacto:** - **Correo Electrónico:** [mail](mailto:josemiguelaguilart.com) - **LinkedIn:** [LinkedIn](https://www.linkedin.com/in/josemaguilar/) """ st.markdown(acerca_de_mi)