Skip to content

Commit 97cd382

Browse files
committed
Merge branch 'develop' of https://github.com/openml/openml-python into fix962
# Conflicts: # tests/test_evaluations/test_evaluation_functions.py
2 parents e0a93f9 + ae49090 commit 97cd382

8 files changed

Lines changed: 73 additions & 2 deletions

File tree

doc/api.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ Modules
7272
get_dataset
7373
get_datasets
7474
list_datasets
75+
list_qualities
7576
status_update
7677

7778
:mod:`openml.evaluations`: Evaluation Functions
@@ -83,6 +84,7 @@ Modules
8384
:template: function.rst
8485

8586
list_evaluations
87+
list_evaluation_measures
8688

8789
:mod:`openml.flows`: Flow Functions
8890
-----------------------------------

doc/progress.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66
Changelog
77
=========
88

9+
0.10.0
10+
~~~~~~
11+
12+
* ADD #687: Adds a function to retrieve the list of evaluation measures available.
13+
* ADD #695: A function to retrieve all the data quality measures available.
14+
915
0.9.0
1016
~~~~~
1117
* ADD #560: OpenML-Python can now handle regression tasks as well.

openml/datasets/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
get_datasets,
77
list_datasets,
88
status_update,
9+
list_qualities
910
)
1011
from .dataset import OpenMLDataset
1112
from .data_feature import OpenMLDataFeature
@@ -20,4 +21,5 @@
2021
'OpenMLDataset',
2122
'OpenMLDataFeature',
2223
'status_update',
24+
'list_qualities'
2325
]

openml/datasets/functions.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,30 @@ def _get_cache_directory(dataset: OpenMLDataset) -> str:
165165
return _create_cache_directory_for_id(DATASETS_CACHE_DIR_NAME, dataset.dataset_id)
166166

167167

168+
def list_qualities() -> List[str]:
169+
""" Return list of data qualities available.
170+
171+
The function performs an API call to retrieve the entire list of
172+
data qualities that are computed on the datasets uploaded.
173+
174+
Returns
175+
-------
176+
list
177+
"""
178+
api_call = "data/qualities/list"
179+
xml_string = openml._api_calls._perform_api_call(api_call, 'get')
180+
qualities = xmltodict.parse(xml_string, force_list=('oml:quality'))
181+
# Minimalistic check if the XML is useful
182+
if 'oml:data_qualities_list' not in qualities:
183+
raise ValueError('Error in return XML, does not contain '
184+
'"oml:data_qualities_list"')
185+
if not isinstance(qualities['oml:data_qualities_list']['oml:quality'], list):
186+
raise TypeError('Error in return XML, does not contain '
187+
'"oml:quality" as a list')
188+
qualities = qualities['oml:data_qualities_list']['oml:quality']
189+
return qualities
190+
191+
168192
def list_datasets(
169193
offset: Optional[int] = None,
170194
size: Optional[int] = None,

openml/evaluations/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
from .evaluation import OpenMLEvaluation
2-
from .functions import list_evaluations
2+
from .functions import list_evaluations, list_evaluation_measures
33

4-
__all__ = ['OpenMLEvaluation', 'list_evaluations']
4+
__all__ = ['OpenMLEvaluation', 'list_evaluations', 'list_evaluation_measures']

openml/evaluations/functions.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,3 +212,29 @@ def __list_evaluations(api_call, output_format='object'):
212212
evals = pd.DataFrame.from_dict(evals, orient='index')
213213

214214
return evals
215+
216+
217+
def list_evaluation_measures() -> List[str]:
218+
""" Return list of evaluation measures available.
219+
220+
The function performs an API call to retrieve the entire list of
221+
evaluation measures that are available.
222+
223+
Returns
224+
-------
225+
list
226+
227+
"""
228+
api_call = "evaluationmeasure/list"
229+
xml_string = openml._api_calls._perform_api_call(api_call, 'get')
230+
qualities = xmltodict.parse(xml_string, force_list=('oml:measures'))
231+
# Minimalistic check if the XML is useful
232+
if 'oml:evaluation_measures' not in qualities:
233+
raise ValueError('Error in return XML, does not contain '
234+
'"oml:evaluation_measures"')
235+
if not isinstance(qualities['oml:evaluation_measures']['oml:measures'][0]['oml:measure'],
236+
list):
237+
raise TypeError('Error in return XML, does not contain '
238+
'"oml:measure" as a list')
239+
qualities = qualities['oml:evaluation_measures']['oml:measures'][0]['oml:measure']
240+
return qualities

tests/test_datasets/test_dataset_functions.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,3 +1190,8 @@ def test_create_dataset_attributes_auto_without_df(self):
11901190
original_data_url=original_data_url,
11911191
paper_url=paper_url
11921192
)
1193+
1194+
def test_list_qualities(self):
1195+
qualities = openml.datasets.list_qualities()
1196+
self.assertEqual(isinstance(qualities, list), True)
1197+
self.assertEqual(all([isinstance(q, str) for q in qualities]), True)

tests/test_evaluations/test_evaluation_functions.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ def test_evaluation_list_per_fold(self):
117117
self.assertIsNotNone(evaluations[run_id].value)
118118
self.assertIsNone(evaluations[run_id].values)
119119

120+
120121
def test_evaluation_list_sort(self):
121122
openml.config.server = self.test_server
122123
size = 10
@@ -141,3 +142,8 @@ def test_evaluation_list_sort(self):
141142
# Compare manual sorting against sorted output
142143
test_output = sorted(unsorted_output, reverse=True)
143144
self.assertTrue(test_output[:size] == sorted_output)
145+
146+
def test_list_evaluation_measures(self):
147+
measures = openml.evaluations.list_evaluation_measures()
148+
self.assertEqual(isinstance(measures, list), True)
149+
self.assertEqual(all([isinstance(s, str) for s in measures]), True)

0 commit comments

Comments
 (0)