DISC.ai / app.py
DHEIVER's picture
Update app.py
5bfab3a verified
raw
history blame
18.2 kB
import gradio as gr
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# Initialize model
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
# Enhanced knowledge base with more detailed descriptions and combinations
DISC_PROFILES = {
'D': {
'nome': 'Dominância',
'caracteristicas': {
'alto': [
"Focado em resultados e ação imediata",
"Direto e assertivo na comunicação",
"Competitivo e determinado",
"Assume naturalmente posições de liderança",
"Orientado para desafios e conquistas"
],
'baixo': [
"Mais colaborativo e menos confrontador",
"Prefere ambientes harmoniosos",
"Tende a evitar conflitos",
"Mais cauteloso na tomada de decisões",
"Busca consenso em vez de imposição"
]
},
'ambiente_ideal': {
'alto': [
"Ambientes competitivos",
"Situações que exigem decisões rápidas",
"Projetos desafiadores",
"Autonomia na execução",
"Oportunidades de liderança"
],
'baixo': [
"Ambientes colaborativos",
"Trabalho em equipe",
"Projetos estruturados",
"Suporte de liderança",
"Foco em cooperação"
]
},
'recomendacoes': {
'alto': [
"Desenvolver mais empatia e paciência",
"Praticar escuta ativa",
"Considerar diferentes perspectivas",
"Equilibrar assertividade com diplomacia",
"Fortalecer habilidades de trabalho em equipe"
],
'baixo': [
"Desenvolver mais assertividade",
"Praticar tomada de decisão",
"Expressar opiniões com mais confiança",
"Assumir mais riscos calculados",
"Fortalecer liderança situacional"
]
}
},
'I': {
'nome': 'Influência',
'caracteristicas': {
'alto': [
"Comunicativo e expressivo",
"Entusiasta e otimista",
"Sociável e carismático",
"Persuasivo e inspirador",
"Criativo e inovador"
],
'baixo': [
"Mais reservado e analítico",
"Prefere comunicação objetiva",
"Foco em fatos e dados",
"Mais formal nas relações",
"Prioriza resultados sobre relacionamentos"
]
},
'ambiente_ideal': {
'alto': [
"Ambientes sociais e dinâmicos",
"Oportunidades de networking",
"Trabalho com pessoas",
"Reconhecimento público",
"Liberdade criativa"
],
'baixo': [
"Ambientes mais formais",
"Trabalho individual",
"Projetos técnicos",
"Foco em processos",
"Estrutura definida"
]
},
'recomendacoes': {
'alto': [
"Desenvolver foco e organização",
"Melhorar gestão do tempo",
"Praticar conclusão de tarefas",
"Equilibrar socialização e produtividade",
"Fortalecer análise de dados"
],
'baixo': [
"Desenvolver habilidades de networking",
"Praticar comunicação expressiva",
"Participar mais em grupos",
"Explorar criatividade",
"Fortalecer relações interpessoais"
]
}
},
'S': {
'nome': 'Estabilidade',
'caracteristicas': {
'alto': [
"Paciente e consistente",
"Colaborativo e prestativo",
"Leal e confiável",
"Bom ouvinte",
"Focado em harmonia"
],
'baixo': [
"Mais flexível e adaptável",
"Aberto a mudanças rápidas",
"Multitarefa eficiente",
"Dinâmico e versátil",
"Aprecia variedade"
]
},
'ambiente_ideal': {
'alto': [
"Ambientes estáveis e previsíveis",
"Trabalho em equipe",
"Rotinas estabelecidas",
"Mudanças graduais",
"Relacionamentos duradouros"
],
'baixo': [
"Ambientes dinâmicos",
"Mudanças frequentes",
"Projetos variados",
"Novos desafios",
"Flexibilidade de rotina"
]
},
'recomendacoes': {
'alto': [
"Desenvolver adaptabilidade",
"Praticar iniciativa",
"Expressar opiniões",
"Lidar melhor com mudanças",
"Fortalecer tomada de decisão"
],
'baixo': [
"Desenvolver mais paciência",
"Praticar consistência",
"Fortalecer relacionamentos",
"Melhorar escuta ativa",
"Criar rotinas efetivas"
]
}
},
'C': {
'nome': 'Conformidade',
'caracteristicas': {
'alto': [
"Analítico e preciso",
"Organizado e sistemático",
"Focado em qualidade",
"Atento aos detalhes",
"Orientado por dados"
],
'baixo': [
"Mais flexível com regras",
"Foco em resultados rápidos",
"Prático e objetivo",
"Adaptável a mudanças",
"Tolerante a ambiguidades"
]
},
'ambiente_ideal': {
'alto': [
"Ambientes estruturados",
"Processos claros",
"Foco em qualidade",
"Análise detalhada",
"Padrões definidos"
],
'baixo': [
"Ambientes flexíveis",
"Liberdade de processo",
"Foco em resultados",
"Decisões rápidas",
"Adaptabilidade"
]
},
'recomendacoes': {
'alto': [
"Desenvolver flexibilidade",
"Praticar decisões rápidas",
"Lidar melhor com ambiguidade",
"Equilibrar análise e ação",
"Fortalecer relacionamentos"
],
'baixo': [
"Desenvolver atenção aos detalhes",
"Melhorar organização",
"Criar sistemas e processos",
"Fortalecer análise crítica",
"Praticar planejamento"
]
}
}
}
def get_intensity_level(percentual):
"""Determina o nível de intensidade baseado no percentual."""
if percentual >= 75:
return "muito alto"
elif percentual >= 60:
return "alto"
elif percentual >= 40:
return "moderado"
elif percentual >= 25:
return "baixo"
else:
return "muito baixo"
def get_profile_description(perfil, percentual):
"""Gera descrição personalizada baseada no perfil e sua intensidade."""
nivel = "alto" if percentual >= 50 else "baixo"
caracteristicas = DISC_PROFILES[perfil]['caracteristicas'][nivel]
ambiente = DISC_PROFILES[perfil]['ambiente_ideal'][nivel]
recomendacoes = DISC_PROFILES[perfil]['recomendacoes'][nivel]
intensidade = get_intensity_level(percentual)
return {
'nome': DISC_PROFILES[perfil]['nome'],
'intensidade': intensidade,
'caracteristicas': caracteristicas,
'ambiente': ambiente,
'recomendacoes': recomendacoes
}
def gerar_relatorio_personalizado(percentuais):
"""Gera relatório detalhado e personalizado baseado nos percentuais DISC."""
perfis_ordenados = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True))
perfis_desc = {k: get_profile_description(k, v) for k, v in perfis_ordenados.items()}
# Perfil dominante e secundário
perfil_dominante = list(perfis_ordenados.keys())[0]
perfil_secundario = list(perfis_ordenados.keys())[1]
# Gerar relatório
relatorio = f"""ANÁLISE DE PERFIL COMPORTAMENTAL DISC
VISÃO GERAL
Seu perfil apresenta uma combinação única de características, com {perfis_desc[perfil_dominante]['nome']} ({perfil_dominante}) como traço dominante em nível {perfis_desc[perfil_dominante]['intensidade']} ({perfis_ordenados[perfil_dominante]:.1f}%), seguido por {perfis_desc[perfil_secundario]['nome']} ({perfil_secundario}) em nível {perfis_desc[perfil_secundario]['intensidade']} ({perfis_ordenados[perfil_secundario]:.1f}%).
CARACTERÍSTICAS PRINCIPAIS
Seu estilo comportamental é marcado por:
{' e '.join(perfis_desc[perfil_dominante]['caracteristicas'][:3])}
• Com influência secundária de: {' e '.join(perfis_desc[perfil_secundario]['caracteristicas'][:2])}
AMBIENTE IDEAL DE TRABALHO
Você tende a prosperar em ambientes que oferecem:
{' e '.join(perfis_desc[perfil_dominante]['ambiente'][:3])}
• Complementados por: {' e '.join(perfis_desc[perfil_secundario]['ambiente'][:2])}
RECOMENDAÇÕES PARA DESENVOLVIMENTO
Para maximizar seu potencial, considere:
{' e '.join(perfis_desc[perfil_dominante]['recomendacoes'][:3])}
• Adicionalmente: {' e '.join(perfis_desc[perfil_secundario]['recomendacoes'][:2])}
DISTRIBUIÇÃO COMPLETA DO PERFIL DISC:
{', '.join([f'{k} ({DISC_PROFILES[k]["nome"]}): {v:.1f}%' for k, v in perfis_ordenados.items()])}
OBSERVAÇÃO: Este perfil representa suas tendências comportamentais naturais. Lembre-se que comportamentos podem ser adaptados conforme o contexto e as necessidades específicas de cada situação."""
return relatorio
# Atualizar a função de processamento do questionário
def processar_questionario(*args):
"""Processa as respostas do questionário e gera o relatório personalizado."""
respostas = list(args)
percentuais = calcular_perfil(respostas)
return gerar_relatorio_personalizado(percentuais)
# Manter o resto do código original (interface Gradio) como está...
import gradio as gr
from sentence_transformers import SentenceTransformer
import numpy as np
# Manter a base DISC_PROFILES do código anterior...
# Temas e estilos personalizados
CUSTOM_CSS = """
.container {
max-width: 800px;
margin: auto;
}
.question-card {
padding: 20px;
margin: 15px 0;
border-radius: 10px;
background-color: #f8f9fa;
}
.result-card {
padding: 25px;
margin-top: 20px;
border-radius: 10px;
background-color: #ffffff;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
"""
THEME = gr.themes.Soft(
primary_hue="blue",
secondary_hue="gray",
neutral_hue="slate",
font=["Source Sans Pro", "ui-sans-serif", "system-ui"]
).set(
button_primary_background_fill="*primary_500",
button_primary_background_fill_hover="*primary_600",
button_secondary_background_fill="*neutral_100",
block_label_text_size="lg",
block_title_text_size="xl",
)
# Componente de progresso
def update_progress(progress, total_questions=5):
"""Atualiza a barra de progresso."""
answered = sum(1 for p in progress if p is not None)
return f"{answered}/{total_questions} questões respondidas", answered / total_questions
def create_interface():
"""Cria interface moderna do Gradio."""
with gr.Blocks(theme=THEME, css=CUSTOM_CSS) as iface:
# Cabeçalho
with gr.Row():
with gr.Column():
gr.Markdown("""
# 🎯 Análise de Perfil Comportamental DISC
Descubra seu perfil comportamental respondendo às questões abaixo.
Escolha as opções que melhor representam seu comportamento natural.
""")
# Container principal
with gr.Column(elem_classes="container"):
# Barra de progresso
with gr.Row():
progress_text = gr.Markdown("0/5 questões respondidas")
progress_bar = gr.Progress()
# Questões
radio_components = []
for i, questao in enumerate(DISC_QUESTIONS, 1):
with gr.Box(elem_classes="question-card"):
gr.Markdown(f"### Questão {i}: {questao['pergunta']}")
radio = gr.Radio(
choices=[f"{perfil} - {desc}" for perfil, desc in questao['opcoes']],
label="Selecione a opção mais adequada",
scale=0,
interactive=True
)
radio_components.append(radio)
# Botão de análise
with gr.Row():
analyze_btn = gr.Button(
"Analisar Perfil",
variant="primary",
scale=0,
min_width=200
)
# Área de resultados
with gr.Box(visible=False, elem_classes="result-card") as result_box:
gr.Markdown("### 📊 Resultado da Análise")
with gr.Row():
# Gráfico de distribuição
plot = gr.Plot(label="Distribuição DISC")
# Métricas principais
with gr.Column():
perfil_dominante = gr.Textbox(
label="Perfil Dominante",
show_label=True,
interactive=False
)
perfil_secundario = gr.Textbox(
label="Perfil Secundário",
show_label=True,
interactive=False
)
# Relatório detalhado
with gr.Accordion("📝 Relatório Detalhado", open=True):
output = gr.Markdown()
# Botões de ação
with gr.Row():
reset_btn = gr.Button("🔄 Reiniciar", variant="secondary")
download_btn = gr.Button("⬇️ Download PDF", variant="secondary")
# Lógica de atualização da interface
def update_display(*answers):
if all(a is not None for a in answers):
return {
result_box: gr.update(visible=True),
analyze_btn: gr.update(interactive=False)
}
return {
result_box: gr.update(visible=False),
analyze_btn: gr.update(interactive=True)
}
# Funções de processamento
def process_and_visualize(*answers):
"""Processa respostas e gera visualizações."""
percentuais = calcular_perfil(answers)
# Criar gráfico
fig = create_disc_plot(percentuais)
# Gerar relatório
report = gerar_relatorio_personalizado(percentuais)
# Identificar perfis principais
sorted_profiles = dict(sorted(percentuais.items(), key=lambda x: x[1], reverse=True))
main_profile = list(sorted_profiles.keys())[0]
secondary_profile = list(sorted_profiles.keys())[1]
return {
plot: fig,
perfil_dominante: f"{main_profile} ({sorted_profiles[main_profile]:.1f}%)",
perfil_secundario: f"{secondary_profile} ({sorted_profiles[secondary_profile]:.1f}%)",
output: report
}
def reset_interface():
"""Reinicia a interface."""
return [None] * len(radio_components) + [
gr.update(visible=False),
gr.update(interactive=True),
None, None, None, None,
"0/5 questões respondidas"
]
# Event listeners
for radio in radio_components:
radio.change(
lambda *args: update_progress(args),
inputs=radio_components,
outputs=[progress_text, progress_bar]
)
radio.change(
update_display,
inputs=radio_components,
outputs=[result_box, analyze_btn]
)
analyze_btn.click(
process_and_visualize,
inputs=radio_components,
outputs=[plot, perfil_dominante, perfil_secundario, output]
)
reset_btn.click(
reset_interface,
outputs=radio_components + [
result_box,
analyze_btn,
plot,
perfil_dominante,
perfil_secundario,
output,
progress_text
]
)
# Download handler (exemplo simples)
download_btn.click(
lambda x: f"disc_report_{x}.pdf",
inputs=[perfil_dominante],
outputs=gr.File()
)
return iface
# Criar e lançar a interface
if __name__ == "__main__":
iface = create_interface()
iface.launch(share=True)