Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Adiciona uma versão inicial da carga do sucupira #209

Closed
wants to merge 6 commits into from
Closed

Conversation

gitnnolabs
Copy link
Collaborator

@gitnnolabs gitnnolabs commented Jun 7, 2023

O que esse PR faz?

Esse PR envia uma tarefa para cadastra os dados da CAPES (sucupira).

Essa versão está utilizando um arquivo consolidado que foi produzido a partir dos passos que está no gist: https://gist.github.com/gitnnolabs/59bf1909c778dae14f56617bf6c12796

Essa atividade não está finalizada já que é necessário termos uma task para fazer exatamente o que o gist está fazendo com os arquivo da coletados da CAPES(Sucupira).

Onde a revisão poderia começar?

Por commit.

Como este poderia ser testado manualmente?

Para teste manual estou disponibilizando uma arquivo com 10k de dados do sucupira onde é possível criar um task e verificar o resultado dos dados.

conso.csv.zip

Segue algumas telas de como fazer isso:

Acesse a área para criar tarefas:

Screenshot 2023-06-07 at 15 34 02

Crie uma nova tarefa chamada "Load sucupira data":

Screenshot 2023-06-07 at 15 35 20

Indique o parâmetro file_path com o caminho para o arquivo:

Screenshot 2023-06-07 at 15 35 48

Para executar clique em run, veja na image:

Screenshot 2023-06-07 at 15 37 49

Algum cenário de contexto que queira dar?

O formato do dado no CSV, segue o seguinte formato:

Cabeçalho:

CD_PROGRAMA_IES,NM_PROGRAMA_IES,SG_ENTIDADE_ENSINO,NM_ENTIDADE_ENSINO,AN_BASE,ID_ADD_PRODUCAO_INTELECTUAL,ID_PRODUCAO_INTELECTUAL,NM_PRODUCAO,ID_TIPO_PRODUCAO,NM_TIPO_PRODUCAO,ID_SUBTIPO_PRODUCAO,NM_SUBTIPO_PRODUCAO,ID_FORMULARIO_PRODUCAO,NM_FORMULARIO,ID_AREA_CONCENTRACAO,NM_AREA_CONCENTRACAO,ID_LINHA_PESQUISA,NM_LINHA_PESQUISA,ID_PROJETO,NM_PROJETO,DH_INICIO_AREA_CONC,DH_FIM_AREA_CONC,DH_INICIO_LINHA,DH_FIM_LINHA,IN_GLOSA,IN_PRODUCAO_COM_VINCULO_TCC,ID_ADD_TRABALHO_CONCLUSAO_CT,AN_BASE_PRODUCAO,DS_DIVULGACAO,DS_DOI,DS_FASCICULO,DS_IDIOMA,DS_ISSN,DS_NATUREZA,DS_OBSERVACOES,DS_URL,DS_URL_DOI,ID_VALOR_LISTA,NM_CIDADE,NM_EDITORA,NR_PAGINA_FINAL,NR_PAGINA_INICIAL,NR_SERIE,NR_VOLUME,DICT_AUTORES

Exemplo de uma linha:

26001012170P6,INOVAÇÃO E TECNOLOGIA INTEGRADAS À MEDICINA VETERINÁRIA PARA O DESENVOLVIMENTO REGIONAL,UFAL,UNIVERSIDADE FEDERAL DE ALAGOAS,2017,21958210,5214630,CHEMICAL AND MICROBIOLOGICAL CHARACTERIZATION OF TINCTURES AND MICROCAPSULES LOADED WITH BRAZILIAN RED PROPOLIS EXTRACT,2,BIBLIOGRÁFICA,25,ARTIGO EM PERIÓDICO,1,BIBLIOGRAFICA - ARTIGO EM PERIÓDICO,85577.0,INOVAÇÃO E TECNOLOGIA INTEGRADAS À MEDICINA VETERINÁRIA PARA O DESENVOLVIMENTO REGIONAL,110181.0,INOVAÇÃO E DESENVOLVIMENTO DE TECNOLOGIAS EM SANIDADE ANIMAL E SAÚDE PÚBLICA.,,,14MAR2016:00:00:00.000000,,06JUN2016:00:00:00.000000,,0,NÃO,,2017,MEIO DIGITAL,10.1016/J.JPHA.2017.03.004,-,INGLES,(2095-1779) JOURNAL OF PHARMACEUTICAL ANALYSIS,TRABALHO COMPLETO,-,-,,93634,-,-,287,280,-,7,"[{""NM_AUTOR"":""PIERRE BARNABE ESCODRO"",""NM_PROGRAMA_IES"":""INOVA\u00c7\u00c3O E TECNOLOGIA INTEGRADAS \u00c0 MEDICINA VETERIN\u00c1RIA PARA O DESENVOLVIMENTO REGIONAL"",""SG_ENTIDADE_ENSINO"":""UFAL"",""NM_ENTIDADE_ENSINO"":""UNIVERSIDADE FEDERAL DE ALAGOAS"",""NM_ABNT_AUTOR"":""ESCODRO, P. B""}]"
26001012170P6,INOVAÇÃO E TECNOLOGIA INTEGRADAS À MEDICINA VETERINÁRIA PARA O DESENVOLVIMENTO REGIONAL,UFAL,UNIVERSIDADE FEDERAL DE ALAGOAS,2017,21958212,5003821,COLETA DE CÉLULAS PROGENITORAS PERIFÉRICAS POR AFÉRESE AUTOMATIZADA EM EQUINO: RELATO DE PROCEDIMENTO,2,BIBLIOGRÁFICA,25,ARTIGO EM PERIÓDICO,1,BIBLIOGRAFICA - ARTIGO EM PERIÓDICO,85577.0,INOVAÇÃO E TECNOLOGIA INTEGRADAS À MEDICINA VETERINÁRIA PARA O DESENVOLVIMENTO REGIONAL,110181.0,INOVAÇÃO E DESENVOLVIMENTO DE TECNOLOGIAS EM SANIDADE ANIMAL E SAÚDE PÚBLICA.,,,14MAR2016:00:00:00.000000,,06JUN2016:00:00:00.000000,,0,NÃO,,2017,IMPRESSO,,-,PORTUGUES,(0102-0935) ARQUIVO BRASILEIRO DE MEDICINA VETERINÁRIA E ZOOTECNIA,TRABALHO COMPLETO,-,HTTP://WWW.SCIELO.BR/SCIELO.PHP?SCRIPT=SCI_ARTTEXT&PID=S0102-09352017000100259&LNG=PT&TLNG=PT,,4193,-,-,263,259,1,69,"[{""NM_AUTOR"":""PIERRE BARNABE ESCODRO"",""NM_PROGRAMA_IES"":""INOVA\u00c7\u00c3O E TECNOLOGIA INTEGRADAS \u00c0 MEDICINA VETERIN\u00c1RIA PARA O DESENVOLVIMENTO REGIONAL"",""SG_ENTIDADE_ENSINO"":""UFAL"",""NM_ENTIDADE_ENSINO"":""UNIVERSIDADE FEDERAL DE ALAGOAS"",""NM_ABNT_AUTOR"":""ESCODRO, P. B""},{""NM_AUTOR"":""MARCIA KIKUYO NOTOMI"",""NM_PROGRAMA_IES"":""INOVA\u00c7\u00c3O E TECNOLOGIA INTEGRADAS \u00c0 MEDICINA VETERIN\u00c1RIA PARA O DESENVOLVIMENTO REGIONAL"",""SG_ENTIDADE_ENSINO"":""UFAL"",""NM_ENTIDADE_ENSINO"":""UNIVERSIDADE FEDERAL DE ALAGOAS"",""NM_ABNT_AUTOR"":""NOTOMI, M. K.""}]"

Também havia erros nas definições de tamanho de alguns campos no modelo de ErrorLog e foi necessário alterar o tamanho de alguns campos.

Screenshots

Tela de saída do processamento de alguns registros:

Screenshot 2023-06-07 at 15 42 33

É possível olhar para os dados selecionando sucupira na lista de artigos:

Screenshot 2023-06-07 at 15 47 20

Processando 10k, foi possível notar que não temos logs de erros e todos os registros foram inseridos.

Veja:

Screenshot 2023-06-07 at 15 51 54

Screenshot 2023-06-07 at 15 52 50

Quais são tickets relevantes?

#199

Referências

Referencia para geração do arquivo consolidado com todos os dados necessários: https://gist.github.com/ednilson/283bd68abcfca9dc4f43bac433ddc8d5

@gitnnolabs gitnnolabs added the task label Jun 7, 2023
@gitnnolabs gitnnolabs self-assigned this Jun 7, 2023
Load the article from sucupira to ScholarlyArticles.
"""

if file_path:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gitnnolabs testar se é arquivo

# makes a treatment to obtain the institution
institution_acron = institution_acron.split("/")[0]
institution_acron = institution_acron.split(" / ")[0]
institution_acron = institution_acron.split("-")[0]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gitnnolabs e se o hífen é parte do nome? Talvez neste momento não seja ideal tomar nenhuma decisão de padronização de nome.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ai nesse caso se não for encontrado a instituição na nossa base de dados não cadastramos a instituição?

Fiz esse tratamento para que a instituição seja encontrada na nossa base de dados.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alterei para não fazer essa tratamento, iremos encontrar menos instituições mas fica mais consistente.

Comment on lines 275 to 276
if models.Institution.objects.filter(acronym=institution_acron).exists():
return models.Institution.objects.filter(acronym=institution_acron)[0]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gitnnolabs isso sempre trará o "primeiro" registro independentemente se é o mais completo ou o ideal.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Qual seria sua sugestão nesse caso?

)

try:
journal = journals[0]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isso sempre trará o "primeiro" registro independentemente se é o mais completo ou o ideal.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Qual seria sua sugestão nesse caso?

Comment on lines 320 to 321
"license": get_license("https://opendefinition.org/licenses/cc-by/"),
"use_license": "CC-BY",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isso não pode estar fixo

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Concordo temos a opção de remover ou manter esse, procurei nos dados e não tem esse dado.

Olhando na página que baixamos os dados está com essa licença, mas suspeito que não seja a licença da produção cientifica, mas a licença de obter os dados:

Veja:

Screenshot 2023-06-07 at 17 41 26
Screenshot 2023-06-07 at 17 41 38

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Por hora removi a licença!


split_ds_issn = row["DS_ISSN"].split(" ")

issn = re.search("[\S]{4}\-[\S]{4}", split_ds_issn[0]).group()
Copy link
Member

@robertatakenaka robertatakenaka Jun 7, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gitnnolabs o que esta regular expression faz? ISSN são números e X @ednilson vc conhece alguma reg expr para ISSN?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@robertatakenaka o S é para dígitos e caracteres!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Segue os testes:

import re
issns = ['(0261-2X94) CROP PROTECTION', '(2095-1779) JOURNAL OF PHARMACEUTICAL ANALYSIS', '(0102-0935) ARQUIVO BRASILEIRO DE MEDICINA VET...', '(0102-0935) ARQUIVO BRASILEIRO DE MEDICINA VET...',]

for issn in issns:
    print(re.search("[\S]{4}\-[\S]{4}", issn).group())

Resultado:

0261-2X94
2095-1779
0102-0935
0102-0935

Comment on lines 330 to 332
article, created = models.ScholarlyArticles.objects.get_or_create(
**article_dict
)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isso não garante o update que comentei

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tem que buscar por doi se houver
aí usar outras estratégias para recuperar e atualizar ou criar

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Em caso dos dados do sucupira conter o DOI estou atualizando o registro e alterando o valor de source para sucupira, assim o dado passa a ter sua origem alterada.

Comment on lines 347 to 350
try:
contributor, created = models.Contributors.objects.get_or_create(**filter_dict)
except models.Contributors.MultipleObjectsReturned:
contributor = models.Contributors.objects.filter(**filter_dict)[0]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gitnnolabs fazer uso de Contributors.get_or_create. Colocar toda a lógica no corpo de Contributors..get_or_create

Comment on lines 352 to 355
institution = get_institution(row["SG_ENTIDADE_ENSINO"])
program, created = models.Programs.objects.get_or_create(
**{"name": row["NM_PROGRAMA_IES"], "institution": institution}
)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Criar models.Programs.get_or_create

@@ -568,3 +572,38 @@ def __unicode__(self):

def __str__(self):
return self.name or self.url


class Programs(models.Model):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gitnnolabs Usar o singular

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pensei em usar singular e na verdade sempre uso, mas temos diversas classes e inclusive aplicações no plural, ai decidir por manter esse padrão!

Vou alterar!

@@ -12,6 +12,7 @@

class ScholarlyArticles(models.Model):
doi = models.CharField(_("DOI"), max_length=100, null=True, blank=True)
id_int_production = models.CharField(_("Id Intellectual Production"), max_length=100, null=True, blank=True)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adicionar os campos (novos modelos):

  • linha de pesquisa: m2m 'ID_LINHA_PESQUISA', 'NM_LINHA_PESQUISA',
  • projeto m2m : 'ID_PROJETO', 'NM_PROJETO'

@@ -135,6 +135,8 @@ class Meta:
def data(self):
d = {
"article__doi": self.doi,
"article__id_int_production": self.id_int_production,
"article__id_int_production": self.id_int_production,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

duplicado ou faltando algo

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicado!

Comment on lines +282 to +292
journals = models.Journals.objects.filter(
Q(journal_issn_l=journal_issn) | Q(journal_issns=journal_issn)
)

try:
journal = journals[0]
except IndexError:
journal = models.Journals()
journal.journal_issns = journal_issn
journal.journal_name = journal_name
journal.save()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gitnnolabs isso deveria ter testes automatizados

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Digo para as recuperações de registros. Certamente vai ter bugs aí. O filter pode retornar mais de um. Só que no final está retornando o primeiro... Não me parece correto

Comment on lines 330 to 332
article, created = models.ScholarlyArticles.objects.get_or_create(
**article_dict
)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

se houver a mesma publicação ingressada pelo unpaywall haverá erro na geração dos indicadores que contará 2 publicações no lugar de uma

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Não sei entendi

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isso não irá acontecer já que estou assegurando que não irá duplicar registro, veja o comentário: #209 (comment)

@gitnnolabs
Copy link
Collaborator Author

Esse PR será fechado já que o modelo e o forma de acomodar os dados mudaram.

@gitnnolabs gitnnolabs closed this Jul 25, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants