Skip to content
Snippets Groups Projects
Commit 8bec794b authored by Maxence Larrieu's avatar Maxence Larrieu
Browse files

improve datacite.py

parent a74ec07a
No related branches found
No related tags found
No related merge requests found
This diff is collapsed.
# récupérer les DOIs de l'UGA depuis Datacite # récupérer les DOIs de l'UGA depuis Datacite
## 2023-12-01, Elias Chetouane ## 2023-12-01, Elias Chetouane, Maxence Larrieu
""" """
## todo
- v2 : périmètre UGA : ajouter les ROR des unités, des établissements/laboratoires associés (eg Grenoble INP, sciencepo grenoble)
## Documentation ## Documentation
* Doc générale API Datacite : https://support.datacite.org/docs/api * Doc générale API : https://support.datacite.org/docs/api
* Recherche d'un DOI : https://support.datacite.org/docs/api-sampling * Recherche d'un DOI : https://support.datacite.org/docs/api-sampling
* Pagination : https://support.datacite.org/docs/pagination * Pagination : https://support.datacite.org/docs/pagination
> "DataCite added support for affiliation identifiers in Metadata Schema 4.3, released August 2019"
https://support.datacite.org/docs/can-i-see-more-detailed-affiliation-information-in-the-rest-api
## memo sur les requêtes * pour descendre au niveau des auteurs
client_id=inist.OSUG datasets de l'OSUG https://doi.osug.fr/ le filtre `?person-id=orcid-nb`
client_id=JBRU.AAU le laboratoire AAU (architecture)
client_id=inist.persyval données issues du Labex Persyval-lab (PIA)
""" """
import requests query_mode = [
'creators.affiliation.affiliationIdentifier:"https://ror.org/02rx3b187"',
urls = [ 'contributors.affiliation.affiliationIdentifier:"https://ror.org/02rx3b187"',
'https://api.datacite.org/dois?affiliation=true&query=creators.affiliation.affiliationIdentifier:"https://ror.org/02rx3b187"&page[size]=100', "publisher:(grenoble AND alpes)", # /!\ apporte du text
'https://api.datacite.org/dois?affiliation=true&query=contributors.affiliation.affiliationIdentifier:"https://ror.org/02rx3b187"&page[size]=100', "client_id:inist.osug", # OSUG https://doi.osug.fr/
"https://api.datacite.org/dois?client_id=inist.OSUG&page[size]=100", "client_id:jbru.aau", # le laboratoire AAU (architecture) /!\ apporte du text
"https://api.datacite.org/dois?client_id=JBRU.AAU&page[size]=100", "client_id:inist.persyval" # Labex Persyval-lab (PIA)
"https://api.datacite.org/dois?client_id=inist.persyval&page[size]=100"
# possibilité d'ajouter d'autres requêtes # possibilité d'ajouter d'autres requêtes
] ]
# on définit une fonction pour la lancer la requete avec chaque url pour les différentes affiliations et clients def get_results(query_from_list):
def get_results(url): """
req = requests.get(url) lance les requêtes dans l'API
"""
query_root = "https://api.datacite.org/dois?query="
# les type de datasets à exclure (à voir si on retire text)
# nb : en 2023-12-15 ça retire seulement 15 DOIs
query_filter_type = " AND resource_type_id:(-book -bookChapter -conferencePaper -conferenceProceeding -dissertation -event -journal -journalArticle -peerReview -preprint -report -service)"
query_page = "&page[size]=100"
req = requests.get(query_root + query_from_list + query_filter_type + query_page)
results = [req.json()] results = [req.json()]
# print total dataset per query
print(f"\n\t{req.url}\n\t{results[0]['meta']['total']}")
# obtenir les résultats de chaque page dans la liste results # obtenir les résultats de chaque page dans la liste results
nb_pages = results[0]["meta"]["totalPages"] nb_pages = results[0]["meta"]["totalPages"]
page = 1 page = 1
...@@ -42,8 +53,12 @@ def get_results(url): ...@@ -42,8 +53,12 @@ def get_results(url):
page += 1 page += 1
return results return results
# on crée une fonction pour ajouter les DOIs dans une liste, sans ajouter les résultats qui ne sont pas des DOIs
def get_dois(results): def get_dois(results):
"""
Ajouter les datasets avec DOI dans une liste et identifier ceux sans DOI
"""
dois = [] dois = []
not_dois = [] not_dois = []
...@@ -52,31 +67,39 @@ def get_dois(results): ...@@ -52,31 +67,39 @@ def get_dois(results):
num_dois = res["data"] num_dois = res["data"]
for item in num_dois : for item in num_dois :
doi = item["id"] item_id = item["id"]
# si le dataset a autre chose qu'un DOI
if item.get("type") != "dois": if item.get("type") != "dois":
print("Le résultat " + str(item) + " est de type " + item.get("type") + " : " + doi) not_dois.append(item_id)
not_dois.append(doi)
else: else:
dois.append(doi) dois.append(item_id)
return dois, not_dois return dois, not_dois
# récupérer les dois
dois = []
not_dois = []
for url in urls: # _____0____ récupérer les dois
doi, not_doi = get_dois(get_results(url)) import requests
dois, not_dois = [], []
for query in query_mode:
doi, not_doi = get_dois(get_results(query))
dois += doi dois += doi
not_dois += not_doi not_dois += not_doi
# supprimer les doublons if not_doi :
unique_dois = list(set(dois)) print("Des données avec un autre identifiant que le DOI ont été trouvées")
[print(f"\t\t{item_id}") for item_id in not_doi]
print(f"Nombre de dois différents trouvés\t{len(unique_dois)}")
# _____n____ remove duplicates in DOI list
unique_dois = list(set(dois))
print(f"Nb unique DOI\t{len(unique_dois)}")
# exporter la liste de DOI au format txt # _____z____ exporter liste DOI format txt
with open("datacite-dois.txt", 'w') as f : with open("datacite-dois.txt", 'w') as f :
[f.write(f"{line}\n") for line in unique_dois] [f.write(f"{line}\n") for line in unique_dois]
2-produce-graph/hist--datasets-by-year.png

24.1 KiB | W: | H:

2-produce-graph/hist--datasets-by-year.png

25.6 KiB | W: | H:

2-produce-graph/hist--datasets-by-year.png
2-produce-graph/hist--datasets-by-year.png
2-produce-graph/hist--datasets-by-year.png
2-produce-graph/hist--datasets-by-year.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -31,7 +31,7 @@ ax.spines['top'].set_visible(False) ...@@ -31,7 +31,7 @@ ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False) ax.spines['right'].set_visible(False)
ax.set_ylabel("number of datasets", labelpad = 10) ax.set_ylabel("number of datasets", labelpad = 10)
plt.title(f"Number of datasets by year", fontsize = 22, x = 0.5, y = 1.03, alpha = 0.6) plt.title(f"Number of datasets with a DataCite DOI by year", fontsize = 18, x = 0.5, y = 1.05, alpha = 0.6)
plt.suptitle(f"n = {len(df)}", fontsize = 12, x = 0.5, y = 0.9, alpha = 0.6) plt.suptitle(f"n = {len(df)}", fontsize = 12, x = 0.5, y = 0.9, alpha = 0.6)
plt.savefig("hist--datasets-by-year.png") plt.savefig("hist--datasets-by-year.png")
......
2-produce-graph/pie--datacite-client.png

36.1 KiB | W: | H:

2-produce-graph/pie--datacite-client.png

36.2 KiB | W: | H:

2-produce-graph/pie--datacite-client.png
2-produce-graph/pie--datacite-client.png
2-produce-graph/pie--datacite-client.png
2-produce-graph/pie--datacite-client.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -18,7 +18,7 @@ _in process_ ...@@ -18,7 +18,7 @@ _in process_
| |Dataset numbers| UGA perimeter | | |Dataset numbers| UGA perimeter |
|-----------|---------------|---------------| |-----------|---------------|---------------|
|RDG |51 |contact, auteurs, producteur et contributeurs avec "UGA" OR "Grenoble" | |RDG |51 |contact, auteurs, producteur et contributeurs avec "UGA" OR "Grenoble" |
|DataCite |294| creator et contributor avec ROR + clients | |DataCite |730| creator et contributor avec ROR + clients |
|Zenodo |1027|creator et contributor avec "grenoble" | |Zenodo |1027|creator et contributor avec "grenoble" |
|Nakala |26 |UGA user identifiers | |Nakala |26 |UGA user identifiers |
|BSO via HAL|32 |NA | |BSO via HAL|32 |NA |
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment