DISC.ai / app.py
DHEIVER's picture
Update app.py
b667701 verified
import gradio as gr
import plotly.graph_objects as go
from sentence_transformers import SentenceTransformer
import numpy as np
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
def get_semantic_similarity(text1, text2):
"""Calcula similaridade semântica entre dois textos"""
embedding1 = model.encode(text1)
embedding2 = model.encode(text2)
return np.dot(embedding1, embedding2) / (np.linalg.norm(embedding1) * np.linalg.norm(embedding2))
def analyze_profile_behaviors(profile, value):
"""Analisa comportamentos profissionais específicos"""
behaviors = {
'D': """No ambiente profissional, você demonstra uma forte orientação para resultados e ação.
Suas características principais incluem:
• Abordagem direta e decisiva na resolução de problemas
• Forte capacidade de iniciativa e autodireção
• Preferência por desafios e situações competitivas
• Habilidade natural para liderar e influenciar
• Foco constante em eficiência e produtividade
• Capacidade de tomar decisões rápidas sob pressão""",
'I': """No ambiente profissional, você demonstra forte orientação para pessoas e relacionamentos.
Suas características principais incluem:
• Excelente habilidade de comunicação e persuasão
• Capacidade natural de motivar e inspirar outros
• Criatividade e entusiasmo em novas iniciativas
• Facilidade para networking e construção de relações
• Adaptabilidade em ambientes sociais diversos
• Energia positiva e otimismo contagiante""",
'S': """No ambiente profissional, você demonstra forte orientação para estabilidade e cooperação.
Suas características principais incluem:
• Excelente capacidade de trabalho em equipe
• Consistência e confiabilidade nas entregas
• Paciência e diplomacia no trato com pessoas
• Lealdade e comprometimento com a equipe
• Habilidade para manter a calma sob pressão
• Foco em criar ambientes harmoniosos""",
'C': """No ambiente profissional, você demonstra forte orientação para qualidade e precisão.
Suas características principais incluem:
• Excepcional atenção aos detalhes e precisão
• Pensamento analítico e sistemático
• Excelente capacidade de planejamento
• Foco em qualidade e excelência
• Habilidade para análise crítica
• Disciplina e organização exemplares"""
}
return behaviors.get(profile)
def analyze_leadership_style(primary, secondary):
"""Analisa estilo de liderança baseado na combinação de perfis"""
styles = {
'D': {
'D': "Liderança diretiva e orientada a resultados, com forte capacidade de decisão e foco em eficiência",
'I': "Liderança carismática e orientada a resultados, combinando assertividade com habilidades interpessoais",
'S': "Liderança estável e decisiva, equilibrando resultados com harmonia da equipe",
'C': "Liderança estratégica e analítica, com foco em resultados precisos e bem planejados"
},
'I': {
'D': "Liderança inspiradora e dinâmica, motivando através do entusiasmo e orientação para ação",
'I': "Liderança altamente carismática e social, com foco em motivação e engajamento",
'S': "Liderança colaborativa e motivacional, criando ambientes positivos e estáveis",
'C': "Liderança comunicativa e estruturada, combinando entusiasmo com organização"
},
'S': {
'D': "Liderança consistente e equilibrada, mantendo estabilidade com momentos de assertividade",
'I': "Liderança apoiadora e participativa, focando em harmonia e colaboração",
'S': "Liderança extremamente estável e confiável, com forte foco em cooperação",
'C': "Liderança metódica e paciente, combinando consistência com atenção aos detalhes"
},
'C': {
'D': "Liderança analítica e decisiva, baseada em dados e orientada a resultados",
'I': "Liderança sistemática e comunicativa, equilibrando precisão com relacionamentos",
'S': "Liderança detalhista e cooperativa, focando em qualidade e estabilidade",
'C': "Liderança altamente analítica e estruturada, com foco em excelência e precisão"
}
}
return styles.get(primary, {}).get(secondary, "Estilo de liderança equilibrado e adaptativo")
def analyze_decision_making(primary, secondary):
"""Analisa processo de tomada de decisão"""
decision_styles = {
'D': "Processo decisório rápido e direto, focado em resultados imediatos e eficiência",
'I': "Decisões baseadas em intuição e impacto nas pessoas, com consideração pelo entusiasmo geral",
'S': "Processo decisório cuidadoso e considerado, buscando estabilidade e consenso",
'C': "Tomada de decisão analítica e detalhada, baseada em dados e análise minuciosa"
}
return decision_styles.get(primary, "Processo decisório equilibrado")
def generate_profile_analysis(perfil_data):
"""Gera análise completa do perfil"""
perfis_ordenados = sorted(perfil_data.items(), key=lambda x: x[1], reverse=True)
perfil_principal = perfis_ordenados[0]
perfil_secundario = perfis_ordenados[1]
# Análise comportamental detalhada usando embeddings
context = f"Perfil {perfil_principal[0]} com {perfil_principal[1]:.1f}% e {perfil_secundario[0]} com {perfil_secundario[1]:.1f}%"
comportamentos = analyze_profile_behaviors(perfil_principal[0], perfil_principal[1])
lideranca = analyze_leadership_style(perfil_principal[0], perfil_secundario[0])
# Gera embeddings para personalização
profile_context = model.encode(context)
behavior_context = model.encode(comportamentos if comportamentos else "")
leadership_context = model.encode(lideranca if lideranca else "")
return f"""# Análise Detalhada do Perfil DISC
## Perfil Predominante ({perfil_principal[0]}: {perfil_principal[1]:.1f}%)
{comportamentos}
## Estilo de Liderança
{lideranca}
## Processo Decisório
{analyze_decision_making(perfil_principal[0], perfil_secundario[0])}
## Combinação de Perfis
A combinação de {perfil_principal[0]} ({perfil_principal[1]:.1f}%) com {perfil_secundario[0]} ({perfil_secundario[1]:.1f}%) sugere:
• Capacidade de equilibrar {get_profile_strength(perfil_principal[0])} com {get_profile_strength(perfil_secundario[0])}
• Versatilidade em diferentes contextos profissionais
• Potencial para adaptação em situações diversas
## Recomendações para Desenvolvimento
{generate_development_recommendations(perfil_principal[0], perfil_principal[1])}
## Contribuições para Equipe
{generate_team_contributions(perfil_principal[0], perfil_secundario[0])}
## Ambiente de Trabalho Ideal
{generate_ideal_environment(perfil_principal[0])}
"""
def get_profile_strength(profile):
"""Retorna força principal de cada perfil"""
strengths = {
'D': "direcionamento e resultados",
'I': "comunicação e influência",
'S': "estabilidade e cooperação",
'C': "análise e precisão"
}
return strengths.get(profile, "adaptabilidade")
def generate_development_recommendations(profile, value):
"""Gera recomendações de desenvolvimento personalizadas"""
recommendations = {
'D': f"""Considerando seu perfil D ({value:.1f}%), foque em:
• Desenvolvimento de escuta ativa e empatia
• Prática de paciência em processos longos
• Inclusão de mais perspectivas nas decisões
• Equilíbrio entre velocidade e qualidade""",
'I': f"""Considerando seu perfil I ({value:.1f}%), foque em:
• Desenvolvimento de habilidades analíticas
• Atenção aos detalhes e documentação
• Gestão eficiente do tempo
• Equilíbrio entre socialização e entregas""",
'S': f"""Considerando seu perfil S ({value:.1f}%), foque em:
• Desenvolvimento de assertividade
• Adaptação mais rápida a mudanças
• Expressão mais frequente de opiniões
• Tomada de decisão mais ágil""",
'C': f"""Considerando seu perfil C ({value:.1f}%), foque em:
• Desenvolvimento de flexibilidade
• Agilidade na tomada de decisão
• Habilidades de comunicação interpessoal
• Equilíbrio entre perfeição e praticidade"""
}
return recommendations.get(profile)
def generate_team_contributions(primary, secondary):
"""Analisa contribuições para equipe"""
contributions = {
'D': {
'D': "Forte liderança e foco em resultados rápidos",
'I': "Liderança carismática com orientação para resultados",
'S': "Direcionamento com consideração pela estabilidade",
'C': "Liderança analítica focada em resultados precisos"
},
'I': {
'D': "Motivação da equipe com foco em ação",
'I': "Alto engajamento e energia positiva",
'S': "Comunicação efetiva com estabilidade",
'C': "Entusiasmo balanceado com precisão"
},
'S': {
'D': "Estabilidade com capacidade de ação",
'I': "Suporte consistente com comunicação efetiva",
'S': "Alta confiabilidade e cooperação",
'C': "Consistência com atenção aos detalhes"
},
'C': {
'D': "Análise precisa orientada a resultados",
'I': "Qualidade com boa comunicação",
'S': "Precisão com estabilidade",
'C': "Excelência técnica e organização"
}
}
return contributions.get(primary, {}).get(secondary, "Contribuições equilibradas para a equipe")
def generate_ideal_environment(profile):
"""Gera descrição do ambiente ideal de trabalho"""
environments = {
'D': """Ambiente ideal para sua produtividade:
• Dinâmico e desafiador
• Autonomia nas decisões
• Oportunidades de liderança
• Foco em resultados rápidos""",
'I': """Ambiente ideal para sua produtividade:
• Colaborativo e interativo
• Oportunidades de networking
• Reconhecimento frequente
• Projetos variados""",
'S': """Ambiente ideal para sua produtividade:
• Estável e previsível
• Trabalho em equipe
• Processos bem definidos
• Mudanças graduais""",
'C': """Ambiente ideal para sua produtividade:
• Estruturado e organizado
• Foco em qualidade
• Tempo para análise
• Clareza nas expectativas"""
}
return environments.get(profile)
DISC_QUESTIONS = [
{"pergunta": "Em situações de trabalho em equipe, você geralmente:",
"opcoes": [("D", "Assume a liderança e toma decisões rápidas"),
("I", "Motiva o grupo e mantém o ambiente animado"),
("S", "Apoia os colegas e mantém a harmonia"),
("C", "Analisa detalhadamente antes de agir")]},
{"pergunta": "Quando enfrenta um desafio no trabalho, você:",
"opcoes": [("D", "Enfrenta diretamente e busca soluções imediatas"),
("I", "Discute com outros e busca diferentes perspectivas"),
("S", "Mantém a calma e segue um processo estabelecido"),
("C", "Pesquisa todas as informações disponíveis primeiro")]},
{"pergunta": "Em reuniões profissionais, você costuma:",
"opcoes": [("D", "Ir direto ao ponto e focar em resultados"),
("I", "Participar ativamente e compartilhar ideias"),
("S", "Ouvir atentamente e contribuir quando solicitado"),
("C", "Tomar notas e questionar os detalhes")]},
{"pergunta": "Ao lidar com mudanças no ambiente de trabalho, você:",
"opcoes": [("D", "Abraça a mudança e lidera a implementação"),
("I", "Entusiasma os outros sobre as novas possibilidades"),
("S", "Adapta-se gradualmente seguindo o processo"),
("C", "Analisa os impactos antes de aceitar")]},
{"pergunta": "Sob pressão no trabalho, você tende a:",
"opcoes": [("D", "Tornar-se mais direto e focado em resultados"),
("I", "Buscar apoio e interação com a equipe"),
("S", "Manter a calma e seguir metodicamente"),
("C", "Concentrar-se em detalhes e procedimentos")]}
]
def create_disc_plot(percentuais):
"""Cria o gráfico de visualização do perfil DISC"""
cores = {'D': '#FF4B4B', 'I': '#FFD700', 'S': '#4CAF50', 'C': '#2196F3'}
fig = go.Figure(data=[go.Bar(x=list(percentuais.keys()),
y=list(percentuais.values()),
marker_color=[cores[k] for k in percentuais.keys()],
text=[f'{v:.1f}%' for v in percentuais.values()],
textposition='auto')])
fig.update_layout(
title={
'text': 'Perfil DISC',
'y':0.95,
'x':0.5,
'xanchor': 'center',
'yanchor': 'top',
'font': {'size': 24, 'color': '#333333'}
},
yaxis_range=[0, 100],
template='plotly_white',
height=400,
margin=dict(l=40, r=40, t=60, b=40),
paper_bgcolor='rgba(0,0,0,0)',
plot_bgcolor='rgba(0,0,0,0)',
yaxis_title="Percentual (%)",
xaxis_title="Dimensões DISC"
)
return fig
def calcular_perfil(respostas):
"""Calcula os percentuais do perfil DISC"""
contagem = {k: sum(1 for r in respostas if r and r.startswith(k)) for k in 'DISC'}
total = sum(contagem.values())
return {k: (v/total)*100 if total > 0 else 0 for k, v in contagem.items()}
def process_results(*answers):
"""Processa as respostas e gera resultados"""
if any(a is None for a in answers):
gr.Warning("Por favor, responda todas as questões antes de prosseguir.")
return None, None
respostas_processadas = [a.split(' - ')[0] if a else None for a in answers]
perfil = calcular_perfil(respostas_processadas)
plot = create_disc_plot(perfil)
report = generate_profile_analysis(perfil)
return plot, report
def create_interface():
"""Cria a interface do usuário"""
with gr.Blocks(theme=gr.themes.Soft(
primary_hue="blue",
secondary_hue="purple",
neutral_hue="slate",
font=["Inter", "ui-sans-serif", "system-ui"]
)) as iface:
gr.Markdown(
"""
# 🎯 Análise de Perfil DISC
### Descubra suas características comportamentais dominantes
Uma análise personalizada do seu perfil comportamental DISC:
- **D (Dominância)**: Foco em resultados e assertividade
- **I (Influência)**: Foco em relacionamentos e comunicação
- **S (Estabilidade)**: Foco em cooperação e consistência
- **C (Conformidade)**: Foco em qualidade e precisão
---
""")
with gr.Row():
with gr.Column(scale=2):
radios = []
for i, q in enumerate(DISC_QUESTIONS):
radio = gr.Radio(
choices=[f"{p} - {d}" for p, d in q['opcoes']],
label=f"{i+1}. {q['pergunta']}",
container=True,
scale=2
)
gr.Markdown("---")
radios.append(radio)
with gr.Row():
analyze_btn = gr.Button("📊 Analisar Perfil", size="lg", variant="primary")
reset_btn = gr.Button("🔄 Novo Teste", size="lg", variant="secondary")
with gr.Row():
plot = gr.Plot(label="Gráfico de Perfil DISC")
with gr.Row():
output = gr.Markdown()
analyze_btn.click(
fn=process_results,
inputs=radios,
outputs=[plot, output],
api_name="analyze"
)
reset_btn.click(
fn=lambda: [None]*(len(radios)+2),
outputs=radios+[plot, output],
api_name="reset"
)
gr.Markdown("""
---
### 📝 Informações Importantes
• O teste DISC é uma ferramenta de autoconhecimento e desenvolvimento profissional
• Os resultados refletem tendências comportamentais naturais
• Use as informações para desenvolvimento pessoal e melhor comunicação em equipe
© 2024 DISC Analysis Tool
""")
return iface
if __name__ == "__main__":
iface = create_interface()
iface.launch(
share=True,
server_name="0.0.0.0",
server_port=7860
)