Add utility scripts and documentation
- Add TIPOS_ATUACAO_ELASTICSEARCH.md: mapping of ES activity types - Add TOP_10_RANKING_CAPES.md: sample ranking output documentation - Add backend/scripts/: utility scripts for analysis and debugging - analise_detalhada.py: detailed consultant analysis - auditar_ranking.py: ranking audit tool - bootstrap_ranking.sh: bootstrap script - buscar_consultores_especificos.py: search specific consultants - popular_componente_b.py: populate component B - top10_ranking.py: generate top 10 ranking - Add scripts/reload_atuacapes.sh: reload ES index script
This commit is contained in:
170
backend/scripts/analise_detalhada.py
Normal file
170
backend/scripts/analise_detalhada.py
Normal file
@@ -0,0 +1,170 @@
|
||||
#!/usr/bin/env python3
|
||||
import sys
|
||||
import os
|
||||
import asyncio
|
||||
import json
|
||||
from datetime import datetime
|
||||
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
|
||||
|
||||
from infrastructure.elasticsearch.client import ElasticsearchClient
|
||||
|
||||
ES_URL = "http://elastic-atuacapes.hom.capes.gov.br:9200"
|
||||
ES_INDEX = "atuacapes"
|
||||
ES_USER = "admin-atuacapes"
|
||||
ES_PASSWORD = "O}!S0bj%FhJ:"
|
||||
|
||||
IDS = [12932, 6273]
|
||||
|
||||
|
||||
async def buscar_por_id(es_client, id_pessoa):
|
||||
response = await es_client.client.post(
|
||||
f"{es_client.url}/{es_client.index}/_search",
|
||||
json={
|
||||
"size": 1,
|
||||
"query": {"term": {"id": id_pessoa}},
|
||||
"_source": ["id", "dadosPessoais", "atuacoes"]
|
||||
}
|
||||
)
|
||||
response.raise_for_status()
|
||||
result = response.json()
|
||||
hits = result.get("hits", {}).get("hits", [])
|
||||
return hits[0]["_source"] if hits else None
|
||||
|
||||
|
||||
async def main():
|
||||
print("Conectando ao Elasticsearch...")
|
||||
es_client = ElasticsearchClient(ES_URL, ES_INDEX, ES_USER, ES_PASSWORD)
|
||||
await es_client.connect()
|
||||
|
||||
try:
|
||||
for id_pessoa in IDS:
|
||||
print(f"\n{'='*120}")
|
||||
print(f"ANÁLISE DETALHADA - ID: {id_pessoa}")
|
||||
print(f"{'='*120}")
|
||||
|
||||
doc = await buscar_por_id(es_client, id_pessoa)
|
||||
if not doc:
|
||||
print(f" Não encontrado")
|
||||
continue
|
||||
|
||||
dados_pessoais = doc.get("dadosPessoais", {})
|
||||
nome = dados_pessoais.get("nome", "N/A")
|
||||
atuacoes = doc.get("atuacoes", [])
|
||||
|
||||
print(f"\nNOME: {nome}")
|
||||
print(f"ID: {id_pessoa}")
|
||||
print(f"CPF: {dados_pessoais.get('cpf', 'N/A')}")
|
||||
print(f"\nTOTAL DE ATUAÇÕES: {len(atuacoes)}")
|
||||
|
||||
por_tipo = {}
|
||||
for a in atuacoes:
|
||||
tipo = a.get("tipo", "Desconhecido")
|
||||
por_tipo[tipo] = por_tipo.get(tipo, 0) + 1
|
||||
|
||||
print(f"\nDISTRIBUIÇÃO POR TIPO:")
|
||||
for tipo, count in sorted(por_tipo.items()):
|
||||
print(f" {tipo}: {count}")
|
||||
|
||||
print(f"\n{'='*120}")
|
||||
print("EVENTOS DETALHADOS")
|
||||
print(f"{'='*120}")
|
||||
|
||||
eventos = [a for a in atuacoes if a.get("tipo") == "Evento"]
|
||||
print(f"\nTOTAL DE EVENTOS: {len(eventos)}")
|
||||
|
||||
if eventos:
|
||||
por_descricao = {}
|
||||
for e in eventos:
|
||||
desc = e.get("descricao", "Sem descrição")
|
||||
por_descricao[desc] = por_descricao.get(desc, 0) + 1
|
||||
|
||||
print(f"\nEVENTOS POR DESCRIÇÃO:")
|
||||
for desc, count in sorted(por_descricao.items(), key=lambda x: x[1], reverse=True):
|
||||
print(f" {desc}: {count}")
|
||||
|
||||
print(f"\nPRIMEIROS 10 EVENTOS:")
|
||||
for idx, e in enumerate(eventos[:10], 1):
|
||||
print(f"\n Evento {idx}:")
|
||||
print(f" Descrição: {e.get('descricao', 'N/A')}")
|
||||
print(f" Início: {e.get('inicio', 'N/A')}")
|
||||
print(f" Fim: {e.get('fim', 'N/A')}")
|
||||
print(f" Nome: {e.get('nome', 'N/A')}")
|
||||
if e.get("dadosEvento"):
|
||||
print(f" Dados Evento: {json.dumps(e['dadosEvento'], indent=8, ensure_ascii=False)[:200]}")
|
||||
|
||||
print(f"\n{'='*120}")
|
||||
print("COORDENAÇÕES CAPES")
|
||||
print(f"{'='*120}")
|
||||
|
||||
coordenacoes = [a for a in atuacoes if a.get("tipo") in [
|
||||
"Coordenação de Área de Avaliação",
|
||||
"Histórico de Coordenação de Área de Avaliação"
|
||||
]]
|
||||
|
||||
for idx, coord in enumerate(coordenacoes, 1):
|
||||
print(f"\nCoordenação {idx}:")
|
||||
print(f" Tipo: {coord.get('tipo')}")
|
||||
print(f" Nome: {coord.get('nome', 'N/A')}")
|
||||
print(f" Descrição: {coord.get('descricao', 'N/A')}")
|
||||
print(f" Início: {coord.get('inicio', 'N/A')}")
|
||||
print(f" Fim: {coord.get('fim', 'N/A')}")
|
||||
|
||||
dados = coord.get("dadosCoordenacaoArea") or coord.get("dadosHistoricoCoordenacaoArea")
|
||||
if dados:
|
||||
print(f" Dados detalhados:")
|
||||
print(f" Tipo função: {dados.get('tipo', 'N/A')}")
|
||||
area = dados.get("areaAvaliacao", {})
|
||||
if isinstance(area, dict):
|
||||
print(f" Área: {area.get('nome', 'N/A')} (ID: {area.get('id', 'N/A')})")
|
||||
else:
|
||||
print(f" Área: {area}")
|
||||
colegios = dados.get("colegio", [])
|
||||
if colegios:
|
||||
print(f" Colégios: {[c.get('nome') for c in colegios if isinstance(c, dict)]}")
|
||||
|
||||
print(f"\n{'='*120}")
|
||||
print("CONSULTORIAS")
|
||||
print(f"{'='*120}")
|
||||
|
||||
consultorias = [a for a in atuacoes if a.get("tipo") in ["Consultor", "Histórico de Consultoria"]]
|
||||
for idx, cons in enumerate(consultorias, 1):
|
||||
print(f"\nConsultoria {idx}:")
|
||||
print(f" Tipo: {cons.get('tipo')}")
|
||||
print(f" Início: {cons.get('inicio', 'N/A')}")
|
||||
print(f" Fim: {cons.get('fim', 'N/A')}")
|
||||
dados = cons.get("dadosConsultoria", {})
|
||||
if dados:
|
||||
print(f" Situação: {dados.get('situacaoConsultoria', 'N/A')}")
|
||||
print(f" Início situação: {dados.get('inicioSituacao', 'N/A')}")
|
||||
print(f" Inativação: {dados.get('inativacaoSituacao', 'N/A')}")
|
||||
|
||||
print(f"\n{'='*120}")
|
||||
print("PREMIAÇÕES")
|
||||
print(f"{'='*120}")
|
||||
|
||||
premiacoes = [a for a in atuacoes if "Prêmio" in a.get("tipo", "")]
|
||||
print(f"\nTOTAL DE PREMIAÇÕES: {len(premiacoes)}")
|
||||
|
||||
por_tipo_prem = {}
|
||||
for p in premiacoes:
|
||||
tipo = p.get("tipo", "Desconhecido")
|
||||
por_tipo_prem[tipo] = por_tipo_prem.get(tipo, 0) + 1
|
||||
|
||||
print(f"\nPREMIAÇÕES POR TIPO:")
|
||||
for tipo, count in sorted(por_tipo_prem.items()):
|
||||
print(f" {tipo}: {count}")
|
||||
|
||||
for tipo_prem in ["Premiação Prêmio", "Avaliação Prêmio", "Inscrição Prêmio"]:
|
||||
prems = [p for p in premiacoes if p.get("tipo") == tipo_prem]
|
||||
if prems:
|
||||
print(f"\n{tipo_prem} ({len(prems)}):")
|
||||
for idx, p in enumerate(prems[:5], 1):
|
||||
print(f" {idx}. {p.get('descricao', 'N/A')} ({p.get('inicio', 'N/A')})")
|
||||
|
||||
finally:
|
||||
await es_client.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
||||
Reference in New Issue
Block a user