-
Notifications
You must be signed in to change notification settings - Fork 0
/
api_cristin.py
105 lines (89 loc) · 3.4 KB
/
api_cristin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Find project results with the CRISTIN API
# by Koenraad De Smedt
import requests
# a few project codes at some sources, add more if needed
project_dict = {'NFR':{'MediaFutures':'309339', 'CLARINO+':'295700',
'CLARINO':'208375', 'INESS':'195323',
'LIA':'225941'},
'SIGMA2':{'Fillagring':'NS9691K'}}
cristin_fundings_url = 'https://api.cristin.no/v2/fundings'
def find_funding_url (source, project_name):
project_code = project_dict[source][project_name]
response = requests.get(cristin_fundings_url,
params={'funding_source':source,
'project_code':project_code})
if response.status_code == 200:
data = response.json()
# print(data)
if data != []:
return data[0]['url']
else:
print('Not a valid request')
find_funding_url('NFR', 'MediaFutures')
find_funding_url('NFR', 'CLARINO+')
find_funding_url('SIGMA2', 'Fillagring')
# https://api.cristin.no/v2/fundings?funding_source=NFR&project_code=309339
def print_project_results (project_name, source='NFR', year=None):
url = find_funding_url(source, project_name)
if url:
response = requests.get(url+'/results') #, verify=False
if response.status_code == 200:
data = response.json()
#print(data)
count = 0
for result in data:
if not year or result['year_published'] == str(year):
print_project_result(result)
count = count + 1
return count, len(data)
else:
print('Not a valid request')
def print_project_result (result):
for t in result['title']:
print(result['title'][t])
print(f" ({result['year_published']}) -- {result['category']['name']['en']}")
print_contributors(result['contributors']['preview'],
result['contributors']['count'])
# this version prints authors on one line
def print_contributors (contributors, count):
nameslist = [c['first_name'] + ' ' + c['surname'] for c in contributors]
namestring = ' ' + ', '.join(nameslist)
if count > len(contributors):
namestring = namestring + ', et al.'
print(namestring)
# this version prints contributors on separate lines
def print_contributors (contributors, count):
for contributor in contributors:
print(' ', contributor['first_name'], contributor['surname'])
if count > len(contributors):
print(' et al.')
print_project_results('MediaFutures')
print_project_results('CLARINO+')
print_project_results('CLARINO+', year=2023)
print_project_results('Fillagring', 'SIGMA2')
from collections import Counter
import matplotlib.pyplot as plt
def plot_project_results (project_name, source='NFR'):
url = find_funding_url(source, project_name)
if url:
response = requests.get(url+'/results')
if response.status_code == 200:
data = response.json()
#print(data)
years = Counter([result['year_published'] for result in data])
plt.figure(dpi=120)
plt.bar(years.keys(),[years[i] for i in years])
#plt.yscale('log')
plt.title('Project results '+project_name)
plt.ylabel('Number of results')
plt.xlabel('Years')
plt.show()
return years
else:
print('Not a valid request')
# Project results seem to be mostly sorted already
plot_project_results('MediaFutures')
plot_project_results('CLARINO+')
plot_project_results('Fillagring', 'SIGMA2')