DISC.ai / app.py
DHEIVER's picture
Update app.py
e21ed46 verified
raw
history blame
15.2 kB
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 generate_profile_analysis(perfil_data):
"""
Gera análise detalhada baseada nos percentuais DISC usando embeddings
"""
# Base de conhecimento para análise DISC
disc_knowledge = {
'D': {
'alto': {
'caracteristicas': [
"Forte capacidade de liderança e decisão",
"Orientação para resultados e ação rápida",
"Assertividade e competitividade elevadas"
],
'desenvolvimento': [
"Desenvolver mais paciência e empatia",
"Praticar escuta ativa",
"Considerar impactos nas pessoas"
],
'carreiras': [
"Gestão executiva",
"Empreendedorismo",
"Gestão de projetos"
]
},
'baixo': {
'caracteristicas': [
"Abordagem colaborativa e consensual",
"Foco em harmonia e cooperação",
"Decisões cuidadosas e ponderadas"
],
'desenvolvimento': [
"Desenvolver mais assertividade",
"Praticar tomada de decisão",
"Expressar opiniões com mais frequência"
],
'carreiras': [
"Análise e planejamento",
"Suporte e consultoria",
"Desenvolvimento especializado"
]
}
},
'I': {
'alto': {
'caracteristicas': [
"Excelente comunicação e sociabilidade",
"Entusiasmo e otimismo naturais",
"Capacidade de influenciar e motivar"
],
'desenvolvimento': [
"Focar mais em detalhes e organização",
"Gerenciar melhor o tempo",
"Equilibrar socialização e entregas"
],
'carreiras': [
"Vendas e marketing",
"Relações públicas",
"Treinamento e desenvolvimento"
]
},
'baixo': {
'caracteristicas': [
"Comunicação objetiva e focada",
"Preferência por dados e fatos",
"Abordagem analítica"
],
'desenvolvimento': [
"Desenvolver networking",
"Praticar comunicação expressiva",
"Participar mais em grupos"
],
'carreiras': [
"Pesquisa e análise",
"Desenvolvimento técnico",
"Gestão de processos"
]
}
},
'S': {
'alto': {
'caracteristicas': [
"Alta consistência e confiabilidade",
"Excelente trabalho em equipe",
"Paciência e estabilidade"
],
'desenvolvimento': [
"Lidar melhor com mudanças",
"Desenvolver mais flexibilidade",
"Expressar mais opiniões"
],
'carreiras': [
"Recursos humanos",
"Suporte ao cliente",
"Gestão operacional"
]
},
'baixo': {
'caracteristicas': [
"Adaptabilidade a mudanças",
"Flexibilidade com rotinas",
"Multitarefa eficiente"
],
'desenvolvimento': [
"Desenvolver mais consistência",
"Manter compromissos de longo prazo",
"Fortalecer relacionamentos"
],
'carreiras': [
"Gestão de mudanças",
"Inovação e desenvolvimento",
"Consultoria"
]
}
},
'C': {
'alto': {
'caracteristicas': [
"Alta precisão e atenção aos detalhes",
"Excelente capacidade analítica",
"Foco em qualidade e processos"
],
'desenvolvimento': [
"Desenvolver flexibilidade",
"Aceitar mais riscos",
"Tomar decisões mais rápidas"
],
'carreiras': [
"Análise de dados",
"Controle de qualidade",
"Planejamento estratégico"
]
},
'baixo': {
'caracteristicas': [
"Flexibilidade com regras",
"Foco em resultados práticos",
"Adaptabilidade a mudanças"
],
'desenvolvimento': [
"Melhorar organização",
"Aumentar atenção aos detalhes",
"Desenvolver análise crítica"
],
'carreiras': [
"Gestão criativa",
"Desenvolvimento de produtos",
"Vendas consultivas"
]
}
}
}
# Determina o perfil dominante e análise correspondente
perfil_ordenado = sorted(perfil_data.items(), key=lambda x: x[1], reverse=True)
perfil_principal = perfil_ordenado[0][0]
nivel = 'alto' if perfil_ordenado[0][1] >= 50 else 'baixo'
# Gera embeddings para características do perfil
profile_data = disc_knowledge[perfil_principal][nivel]
# Constrói análise personalizada
analise = f"""# Análise Detalhada do Perfil DISC
## Características Principais
{chr(10).join([f"• {c}" for c in profile_data['caracteristicas']])}
## Áreas para Desenvolvimento
{chr(10).join([f"• {d}" for d in profile_data['desenvolvimento']])}
## Carreiras e Funções Recomendadas
{chr(10).join([f"• {c}" for c in profile_data['carreiras']])}
## Análise de Combinação
Seu perfil {perfil_principal} {nivel} ({perfil_ordenado[0][1]:.1f}%) combinado com {perfil_ordenado[1][0]} secundário ({perfil_ordenado[1][1]:.1f}%) sugere:
{'Forte capacidade de liderança com foco em pessoas' if perfil_ordenado[1][0] == 'I' else 'Capacidade analítica com orientação para resultados' if perfil_ordenado[1][0] == 'C' else 'Estabilidade com foco em entregas' if perfil_ordenado[1][0] == 'S' else 'Dinamismo com assertividade'}
## Contribuições para Equipe
{generate_team_contribution(perfil_principal, nivel)}
## Estilo de Comunicação
{generate_communication_style(perfil_principal, nivel)}
"""
return analise
def generate_team_contribution(perfil, nivel):
contribuicoes = {
'D': {
'alto': "Traz direção clara e foco em resultados para a equipe",
'baixo': "Contribui com abordagem colaborativa e ponderada"
},
'I': {
'alto': "Promove entusiasmo e mantém a equipe motivada",
'baixo': "Traz objetividade e foco para as discussões"
},
'S': {
'alto': "Proporciona estabilidade e suporte consistente",
'baixo': "Adiciona dinamismo e adaptabilidade ao grupo"
},
'C': {
'alto': "Garante qualidade e precisão nas entregas",
'baixo': "Traz praticidade e flexibilidade aos processos"
}
}
return contribuicoes[perfil][nivel]
def generate_communication_style(perfil, nivel):
estilos = {
'D': {
'alto': "Comunicação direta e focada em resultados",
'baixo': "Comunicação colaborativa e consensual"
},
'I': {
'alto': "Comunicação expressiva e entusiasta",
'baixo': "Comunicação objetiva e baseada em fatos"
},
'S': {
'alto': "Comunicação paciente e atenciosa",
'baixo': "Comunicação adaptável e flexível"
},
'C': {
'alto': "Comunicação precisa e detalhada",
'baixo': "Comunicação prática e objetiva"
}
}
return estilos[perfil][nivel]
def gerar_relatorio(percentuais):
"""
Função principal para gerar o relatório completo
"""
analise_detalhada = generate_profile_analysis(percentuais)
return f"""# Análise de Perfil DISC
## Distribuição DISC
{', '.join([f'{k}: {v:.1f}%' for k, v in percentuais.items()])}
{analise_detalhada}
## Observações Finais
• Este perfil reflete suas tendências comportamentais naturais
• Use estas informações como base para desenvolvimento profissional
• O perfil DISC é uma ferramenta de autoconhecimento
"""
def calcular_perfil(respostas):
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 create_disc_plot(percentuais):
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
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 process_results(*answers):
if any(a is None for a in answers):
gr.Warning("Por favor, responda todas as questões antes de prosseguir.")
return None, None
perfil = calcular_perfil(answers)
plot = create_disc_plot(perfil)
report = gerar_relatorio(perfil)
return plot, report
def create_interface():
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
)