From ff5bcf3850a860155a062519b2dbbcc7c4726167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Pe=CC=81net?= Date: Tue, 17 Aug 2021 16:04:28 +0200 Subject: [PATCH 1/9] Refactoring the MES public API. Removing file manipulation functions. Replacing create_model_evaluation by build. Removing DSSModelEvaluationSettings. Adding DSSModelEvaluationFullInfo, which provide accessors to the main components of a ME (metrics, evaluated model info, etc.) --- dataikuapi/dss/modelevaluationstore.py | 171 ++++++++++++------------- 1 file changed, 80 insertions(+), 91 deletions(-) diff --git a/dataikuapi/dss/modelevaluationstore.py b/dataikuapi/dss/modelevaluationstore.py index f1f71910..55aca741 100644 --- a/dataikuapi/dss/modelevaluationstore.py +++ b/dataikuapi/dss/modelevaluationstore.py @@ -110,12 +110,13 @@ def delete(self): ######################################################## - # Runs + # Model evaluations ######################################################## def list_model_evaluations(self, as_type=None): """ - List the model evaluations in this model evaluation store. + List the model evaluations in this model evaluation store. The list is sorted + by ME creation date. :returns: The list of the model evaluations :rtype: list @@ -128,7 +129,7 @@ def list_model_evaluations(self, as_type=None): def get_model_evaluation(self, run_id): """ - Get a handle to interact with a specific model evaluations + Get a handle to interact with a specific model evaluation :param string run_id: the id of the desired model evaluation @@ -136,6 +137,18 @@ def get_model_evaluation(self, run_id): """ return DSSModelEvaluation(self, run_id) + def get_latest_model_evaluation(self): + """ + Get a handle to interact with the latest model evaluation computed + + + :returns: A :class:`dataikuapi.dss.modelevaluationstore.DSSModelEvaluation` model evaluation handle + """ + + latest_run_id = self.client._perform_text( + "GET", "/projects/%s/modelevaluationstores/%s/latestRunId" % (self.project_key, self.mes_id)) + return DSSModelEvaluation(self, latest_run_id) + def delete_model_evaluations(self, evaluations): """ Remove model evaluations from this store @@ -148,30 +161,31 @@ def delete_model_evaluations(self, evaluations): obj.append(evaluation['run_id']) else: obj.append(evaluation) - self.model_evaluation_store.client._perform_json( + self.client._perform_json( "DELETE", "/projects/%s/modelevaluationstores/%s/runs/" % (self.project_key, self.mes_id, self.run_id), body=obj) - def create_model_evaluation(self, labels=None, prediction_type=None, model_type=None, model_params=None, data_type=None, data_params=None, metric_params=None, active_classifier_threshold=None): + def build(self, job_type="NON_RECURSIVE_FORCED_BUILD", wait=True, no_fail=False): """ - Create a new model evaluation in the model evaluation store, and return a handle to interact with it. - - :returns: A :class:`dataikuapi.dss.modelevaluationstore.DSSModelEvaluation` model evaluation handle + Starts a new job to build this Model Evaluation Store and wait for it to complete. + Raises if the job failed. + + .. code-block:: python + + job = mes.build() + print("Job %s done" % job.id) + + :param job_type: The job type. One of RECURSIVE_BUILD, NON_RECURSIVE_FORCED_BUILD or RECURSIVE_FORCED_BUILD + :param no_fail: if True, does not raise if the job failed. + :return: the :class:`dataikuapi.dss.job.DSSJob` job handle corresponding to the built job + :rtype: :class:`dataikuapi.dss.job.DSSJob` """ - obj = { - "labels": labels, - "modelType": model_type, - "modelParams": model_params if model_params is not None else {}, - "dataType": data_type, - "dataParams": data_params if data_params is not None else {}, - "predictionType": prediction_type, - "activeClassifierThreshold": active_classifier_threshold, - "metricParams": metric_params if metric_params is not None else {} - } - res = self.client._perform_json("POST", "/projects/%s/modelevaluationstores/%s/runs/" % (self.project_key, self.mes_id), - body = obj) - run_id = res['id'] - return DSSModelEvaluation(self, run_id) + jd = self.project.new_job(job_type) + jd.with_output(self.mes_id, object_type="MODEL_EVALUATION_STORE") + if wait: + return jd.start_and_wait() + else: + return jd.start() ######################################################## @@ -240,6 +254,7 @@ def save(self): "PUT", "/projects/%s/modelevaluationstores/%s" % (self.model_evaluation_store.project_key, self.model_evaluation_store.mes_id), body=self.settings) + class DSSModelEvaluation: """ A handle on a model evaluation @@ -259,16 +274,9 @@ def get_full_info(self): """ Retrieve the model evaluation with its performance data """ - return self.client._perform_json( - "GET", "/projects/%s/modelevaluationstores/%s/runs/%s" % (self.project_key, self.mes_id, self.run_id)) - - def get_settings(self): - """ - Set the definition of this model evaluation - """ data = self.client._perform_json( - "GET", "/projects/%s/modelevaluationstores/%s/runs/%s/settings" % (self.project_key, self.mes_id, self.run_id)) - return DSSModelEvaluationSettings(self, data) + "GET", "/projects/%s/modelevaluationstores/%s/runs/%s" % (self.project_key, self.mes_id, self.run_id)) + return DSSModelEvaluationFullInfo(self, data) def delete(self): """ @@ -278,80 +286,61 @@ def delete(self): self.client._perform_json( "DELETE", "/projects/%s/modelevaluationstores/%s/runs/" % (self.project_key, self.mes_id), body=obj) - ######################################################## - # Model evaluation contents - ######################################################## - - def list_contents(self): - """ - Get the list of files in the model evaluation - - Returns: - the list of files, as a JSON object - """ - return self.client._perform_json( - "GET", "/projects/%s/modelevaluationstores/%s/runs/%s/contents" % (self.project_key, self.mes_id, self.run_id)) - - def get_file(self, path): - """ - Get a file from the model evaluation - - Returns: - the file's content, as a stream - """ - return self.client._perform_raw( - "GET", "/projects/%s/modelevaluationstores/%s/runs/%s/contents/%s" % (self.project_key, self.mes_id, self.run_id, utils.quote(path))) - - def delete_file(self, path): - """ - Delete a file from the model evaluation - """ - return self.client._perform_empty( - "DELETE", "/projects/%s/modelevaluationstores/%s/runs/%s/contents/%s" % (self.project_key, self.mes_id, self.run_id, utils.quote(path))) - - def put_file(self, path, f): - """ - Upload the file to the model evaluation - - Args: - f: the file contents, as a stream - path: the path of the file - """ - return self.client._perform_json_upload( - "POST", "/projects/%s/modelevaluationstores/%s/runs/%s/contents/%s" % (self.project_key, self.mes_id, self.run_id, utils.quote(path)), - "", f) - def get_metrics(self): """ - Get the metrics for this model evaluation + Get the metrics for this model evaluation. Metrics must be understood here as Metrics in DSS Metrics & Checks :return: the metrics, as a JSON object """ return self.client._perform_json( "GET", "/projects/%s/modelevaluationstores/%s/runs/%s/metrics" % (self.project_key, self.mes_id, self.run_id)) -class DSSModelEvaluationSettings: - """ - A handle on the settings of a model evaluation - Do not create this class directly, instead use :meth:`dataikuapi.dss.DSSModelEvaluation.get_settings` +class DSSModelEvaluationFullInfo: """ + A handle on the full information on a model evaluation. - def __init__(self, model_evaluation, settings): + Includes information such as the full id of the evaluated model, the evaluation params, + the performance and drift metrics, if any, etc. + + Do not create this class directly, instead use :meth:`dataikuapi.dss.DSSModelEvaluation.get_full_info` + """ + def __init__(self, model_evaluation, full_info): self.model_evaluation = model_evaluation - self.settings = settings - # unpack some fields - self.client = model_evaluation.client - self.run_id = model_evaluation.run_id - self.project_key = model_evaluation.project_key - self.mes_id = model_evaluation.mes_id + self.full_info = full_info def get_raw(self): - return self.settings + return self.full_info - def save(self): - return self.client._perform_json( - "PUT", "/projects/%s/modelevaluationstores/%s/runs/%s/settings" % (self.project_key, self.mes_id, self.run_id), - body=self.settings) + def get_metrics(self): + """ + Get the metrics evaluated, if any. + + :return: a dict containing the performance and data drift metric, if any + """ + return self.full_info["metrics"] + + def get_labels(self): + """ + Get the labels of the Model Evaluation + :return: a dict containing the labels + """ + return self.full_info["evaluation"]["labels"] + def get_evaluated_model_info(self): + """ + Get info on the evaluated model. Most noticeably, the fullId entry + of the dict if the full model id of the evaluated model + + :return: a dict + """ + return self.full_info["evaluation"]["metricParams"] + + def get_creation_date(self): + """ + Return the date and time of the creation of the Model Evaluation + + :return: the date and time, as an epoch + """ + return self.full_info["evaluation"]["created"] \ No newline at end of file From e9b7b9f6cb028cd1a0361be6495610c8c73e45fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Pe=CC=81net?= Date: Fri, 3 Sep 2021 17:22:20 +0200 Subject: [PATCH 2/9] Taking in account review remarks. --- dataikuapi/dss/modelevaluationstore.py | 18 ++++++++++-------- dataikuapi/dss/project.py | 4 +++- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/dataikuapi/dss/modelevaluationstore.py b/dataikuapi/dss/modelevaluationstore.py index 55aca741..6281b00c 100644 --- a/dataikuapi/dss/modelevaluationstore.py +++ b/dataikuapi/dss/modelevaluationstore.py @@ -113,11 +113,13 @@ def delete(self): # Model evaluations ######################################################## - def list_model_evaluations(self, as_type=None): + def list_model_evaluations(self, as_type="objects"): """ List the model evaluations in this model evaluation store. The list is sorted by ME creation date. + :param string as_type: if set to "objects" or "object", the method will return a list of :class:`dataikuapi.dss.modelevaluationstore.DSSModelEvaluation` + else a list of dict :returns: The list of the model evaluations :rtype: list """ @@ -164,7 +166,6 @@ def delete_model_evaluations(self, evaluations): self.client._perform_json( "DELETE", "/projects/%s/modelevaluationstores/%s/runs/" % (self.project_key, self.mes_id, self.run_id), body=obj) - def build(self, job_type="NON_RECURSIVE_FORCED_BUILD", wait=True, no_fail=False): """ Starts a new job to build this Model Evaluation Store and wait for it to complete. @@ -176,16 +177,17 @@ def build(self, job_type="NON_RECURSIVE_FORCED_BUILD", wait=True, no_fail=False) print("Job %s done" % job.id) :param job_type: The job type. One of RECURSIVE_BUILD, NON_RECURSIVE_FORCED_BUILD or RECURSIVE_FORCED_BUILD - :param no_fail: if True, does not raise if the job failed. + :param wait: wait for the build to finish before returning + :param no_fail: if True, does not raise if the job failed. Valid only when wait is True :return: the :class:`dataikuapi.dss.job.DSSJob` job handle corresponding to the built job :rtype: :class:`dataikuapi.dss.job.DSSJob` """ jd = self.project.new_job(job_type) jd.with_output(self.mes_id, object_type="MODEL_EVALUATION_STORE") if wait: - return jd.start_and_wait() + return jd.start_and_wait(no_fail) else: - return jd.start() + return jd.start(allowFail=not no_fail) ######################################################## @@ -328,10 +330,10 @@ def get_labels(self): """ return self.full_info["evaluation"]["labels"] - def get_evaluated_model_info(self): + def get_evaluation_parameters(self): """ - Get info on the evaluated model. Most noticeably, the fullId entry - of the dict if the full model id of the evaluated model + Get info on the evaluation parameters, most noticeably the evaluation metric (evaluationMetric field + of the returned dict) :return: a dict """ diff --git a/dataikuapi/dss/project.py b/dataikuapi/dss/project.py index 904a52f3..2d223834 100644 --- a/dataikuapi/dss/project.py +++ b/dataikuapi/dss/project.py @@ -754,10 +754,12 @@ def create_managed_folder(self, name, folder_type=None, connection_name="filesys # Model evaluation stores ######################################################## - def list_model_evaluation_stores(self, as_type=None): + def list_model_evaluation_stores(self, as_type="objects"): """ List the model evaluation stores in this project. + :param string as_type: if set to "objects" or "object", the method returns a list of :class:`dataikuapi.dss.modelevaluationstore.DSSModelEvaluationStore` + else a list of dict. :returns: The list of the model evaluation stores :rtype: list """ From 265c1254f188be66340306d2c2b962225512b539 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Pe=CC=81net?= Date: Fri, 3 Sep 2021 17:52:47 +0200 Subject: [PATCH 3/9] Removing as_type parameter, always returning list of instances of class. --- dataikuapi/dss/modelevaluationstore.py | 15 +++++---------- dataikuapi/dss/project.py | 11 +++-------- 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/dataikuapi/dss/modelevaluationstore.py b/dataikuapi/dss/modelevaluationstore.py index 6281b00c..50063041 100644 --- a/dataikuapi/dss/modelevaluationstore.py +++ b/dataikuapi/dss/modelevaluationstore.py @@ -21,7 +21,7 @@ def __init__(self, client, project_key, mes_id): self.project = client.get_project(project_key) self.project_key = project_key self.mes_id = mes_id - + @property def id(self): return self.mes_id @@ -36,7 +36,7 @@ def get_settings(self): "GET", "/projects/%s/modelevaluationstores/%s" % (self.project_key, self.mes_id)) return DSSModelEvaluationStoreSettings(self, data) - + ######################################################## # Misc ######################################################## @@ -113,21 +113,16 @@ def delete(self): # Model evaluations ######################################################## - def list_model_evaluations(self, as_type="objects"): + def list_model_evaluations(self): """ List the model evaluations in this model evaluation store. The list is sorted by ME creation date. - :param string as_type: if set to "objects" or "object", the method will return a list of :class:`dataikuapi.dss.modelevaluationstore.DSSModelEvaluation` - else a list of dict :returns: The list of the model evaluations - :rtype: list + :rtype: list of :class:`dataikuapi.dss.modelevaluationstore.DSSModelEvaluation` """ items = self.client._perform_json("GET", "/projects/%s/modelevaluationstores/%s/runs/" % (self.project_key, self.mes_id)) - if as_type in ["objects", "object"]: - return [DSSModelEvaluation(self, item["ref"]["runId"]) for item in items] - else: - return items + return [DSSModelEvaluation(self, item["ref"]["runId"]) for item in items] def get_model_evaluation(self, run_id): """ diff --git a/dataikuapi/dss/project.py b/dataikuapi/dss/project.py index 2d223834..0b32b1fb 100644 --- a/dataikuapi/dss/project.py +++ b/dataikuapi/dss/project.py @@ -754,20 +754,15 @@ def create_managed_folder(self, name, folder_type=None, connection_name="filesys # Model evaluation stores ######################################################## - def list_model_evaluation_stores(self, as_type="objects"): + def list_model_evaluation_stores(self): """ List the model evaluation stores in this project. - :param string as_type: if set to "objects" or "object", the method returns a list of :class:`dataikuapi.dss.modelevaluationstore.DSSModelEvaluationStore` - else a list of dict. :returns: The list of the model evaluation stores - :rtype: list + :rtype: list of :class:`dataikuapi.dss.modelevaluationstore.DSSModelEvaluationStore` """ items = self.client._perform_json("GET", "/projects/%s/modelevaluationstores/" % self.project_key) - if as_type == "objects" or as_type == "object": - return [DSSModelEvaluationStore(self.client, self.project_key, item["id"]) for item in items] - else: - return items + return [DSSModelEvaluationStore(self.client, self.project_key, item["id"]) for item in items] def get_model_evaluation_store(self, mes_id): """ From 205c40c90c1abc6f7495aa1414a19f4023724742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Pe=CC=81net?= Date: Mon, 6 Sep 2021 16:56:07 +0200 Subject: [PATCH 4/9] Adding creation date to DSSModelEvaluation (makes sort quicker and easier in tests). --- dataikuapi/dss/modelevaluationstore.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/dataikuapi/dss/modelevaluationstore.py b/dataikuapi/dss/modelevaluationstore.py index 50063041..041f6cc4 100644 --- a/dataikuapi/dss/modelevaluationstore.py +++ b/dataikuapi/dss/modelevaluationstore.py @@ -122,7 +122,7 @@ def list_model_evaluations(self): :rtype: list of :class:`dataikuapi.dss.modelevaluationstore.DSSModelEvaluation` """ items = self.client._perform_json("GET", "/projects/%s/modelevaluationstores/%s/runs/" % (self.project_key, self.mes_id)) - return [DSSModelEvaluation(self, item["ref"]["runId"]) for item in items] + return [DSSModelEvaluation(self, item["ref"]["runId"], item["created"]) for item in items] def get_model_evaluation(self, run_id): """ @@ -259,13 +259,14 @@ class DSSModelEvaluation: Do not create this class directly, instead use :meth:`dataikuapi.dss.DSSModelEvaluationStore.get_model_evaluation` """ - def __init__(self, model_evaluation_store, run_id): + def __init__(self, model_evaluation_store, run_id, creation_date): self.model_evaluation_store = model_evaluation_store self.client = model_evaluation_store.client # unpack some fields self.run_id = run_id self.project_key = model_evaluation_store.project_key self.mes_id = model_evaluation_store.mes_id + self.creation_date = creation_date def get_full_info(self): """ @@ -292,6 +293,14 @@ def get_metrics(self): return self.client._perform_json( "GET", "/projects/%s/modelevaluationstores/%s/runs/%s/metrics" % (self.project_key, self.mes_id, self.run_id)) + def get_creation_date(self): + """ + Get the creation date, as an epoch + + :return: the creation date, as an epoch + """ + return self.creation_date + class DSSModelEvaluationFullInfo: """ From e18ac1c0779d8bb9b1bc565d78cd405443d47204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Pe=CC=81net?= Date: Tue, 7 Sep 2021 11:24:48 +0200 Subject: [PATCH 5/9] Adding a `get_sample_df` method to the public API, to retrieve the evaluation sample as a panda DF, without giving open access to any file of the evaluation. --- dataikuapi/dss/modelevaluationstore.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/dataikuapi/dss/modelevaluationstore.py b/dataikuapi/dss/modelevaluationstore.py index 041f6cc4..afc97a45 100644 --- a/dataikuapi/dss/modelevaluationstore.py +++ b/dataikuapi/dss/modelevaluationstore.py @@ -1,4 +1,5 @@ import json +import pandas as pd from dataikuapi.dss.metrics import ComputedMetrics from .discussion import DSSObjectDiscussions @@ -301,6 +302,26 @@ def get_creation_date(self): """ return self.creation_date + def get_sample_df(self): + """ + Get the sample of the evaluation dataset on which the evaluation was performed + + :return: + the sample content, as a :class:`pandas.DataFrame` + """ + buf = BytesIO() + with self.client._perform_raw( + "GET", + "/projects/%s/modelevaluationstores/%s/runs/%s/sample" % (self.project_key, self.mes_id, self.run_id) + ).raw as f: + buf.write(f.read()) + schema_txt = self.client._perform_raw( + "GET", + "/projects/%s/modelevaluationstores/%s/runs/%s/schema" % (self.project_key, self.mes_id, self.run_id) + ).text + schema = json.loads(schema_txt) + return pd.read_csv(BytesIO(buf.getvalue()), compression='gzip', sep='\t', header=None, names=[c["name"] for c in schema["columns"]]) + class DSSModelEvaluationFullInfo: """ From 5964bc630a3094b33f113512371cd427a77e28d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Pe=CC=81net?= Date: Tue, 7 Sep 2021 11:25:22 +0200 Subject: [PATCH 6/9] Adding get_raw method to ComputedMetrics, for consistency sake. --- dataikuapi/dss/metrics.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dataikuapi/dss/metrics.py b/dataikuapi/dss/metrics.py index 1c1c3617..bda5d93d 100644 --- a/dataikuapi/dss/metrics.py +++ b/dataikuapi/dss/metrics.py @@ -4,6 +4,9 @@ class ComputedMetrics(object): def __init__(self, raw): self.raw = raw + def get_raw(self): + return self.raw + def get_metric_by_id(self, id): all_ids = [] for metric in self.raw["metrics"]: From e0fbfea547ef892e99d2191d368f64a064461a88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Pe=CC=81net?= Date: Tue, 7 Sep 2021 13:28:33 +0200 Subject: [PATCH 7/9] Putting back required import. --- dataikuapi/dss/modelevaluationstore.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dataikuapi/dss/modelevaluationstore.py b/dataikuapi/dss/modelevaluationstore.py index afc97a45..7bee0c97 100644 --- a/dataikuapi/dss/modelevaluationstore.py +++ b/dataikuapi/dss/modelevaluationstore.py @@ -1,4 +1,6 @@ import json +from io import BytesIO + import pandas as pd from dataikuapi.dss.metrics import ComputedMetrics @@ -11,6 +13,7 @@ except NameError: basestring = str + class DSSModelEvaluationStore(object): """ A handle to interact with a model evaluation store on the DSS instance. @@ -200,7 +203,6 @@ def get_last_metric_values(self): return ComputedMetrics(self.client._perform_json( "GET", "/projects/%s/modelevaluationstores/%s/metrics/last" % (self.project_key, self.mes_id))) - def get_metric_history(self, metric): """ Get the history of the values of the metric on this model evaluation store @@ -232,7 +234,6 @@ def compute_metrics(self, metric_ids=None, probes=None): "POST" , "%s/computeMetrics" % url) - class DSSModelEvaluationStoreSettings: """ A handle on the settings of a model evaluation store From d2266eec3b2e2a56881d4cda75e84839165c6e36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Pe=CC=81net?= Date: Tue, 7 Sep 2021 13:46:40 +0200 Subject: [PATCH 8/9] Handling empty store case. --- dataikuapi/dss/modelevaluationstore.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dataikuapi/dss/modelevaluationstore.py b/dataikuapi/dss/modelevaluationstore.py index 7bee0c97..5dc3dbeb 100644 --- a/dataikuapi/dss/modelevaluationstore.py +++ b/dataikuapi/dss/modelevaluationstore.py @@ -144,10 +144,13 @@ def get_latest_model_evaluation(self): :returns: A :class:`dataikuapi.dss.modelevaluationstore.DSSModelEvaluation` model evaluation handle + if the store is not empty, else None """ latest_run_id = self.client._perform_text( "GET", "/projects/%s/modelevaluationstores/%s/latestRunId" % (self.project_key, self.mes_id)) + if not latest_run_id: + return None return DSSModelEvaluation(self, latest_run_id) def delete_model_evaluations(self, evaluations): From ef71367587bd87ad69969ba7e2477fdded5186ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Pe=CC=81net?= Date: Tue, 7 Sep 2021 16:24:41 +0200 Subject: [PATCH 9/9] Remove creation date from DSSModelEvaluation --- dataikuapi/dss/modelevaluationstore.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/dataikuapi/dss/modelevaluationstore.py b/dataikuapi/dss/modelevaluationstore.py index 5dc3dbeb..21566397 100644 --- a/dataikuapi/dss/modelevaluationstore.py +++ b/dataikuapi/dss/modelevaluationstore.py @@ -126,7 +126,7 @@ def list_model_evaluations(self): :rtype: list of :class:`dataikuapi.dss.modelevaluationstore.DSSModelEvaluation` """ items = self.client._perform_json("GET", "/projects/%s/modelevaluationstores/%s/runs/" % (self.project_key, self.mes_id)) - return [DSSModelEvaluation(self, item["ref"]["runId"], item["created"]) for item in items] + return [DSSModelEvaluation(self, item["ref"]["runId"]) for item in items] def get_model_evaluation(self, run_id): """ @@ -264,14 +264,13 @@ class DSSModelEvaluation: Do not create this class directly, instead use :meth:`dataikuapi.dss.DSSModelEvaluationStore.get_model_evaluation` """ - def __init__(self, model_evaluation_store, run_id, creation_date): + def __init__(self, model_evaluation_store, run_id): self.model_evaluation_store = model_evaluation_store self.client = model_evaluation_store.client # unpack some fields self.run_id = run_id self.project_key = model_evaluation_store.project_key self.mes_id = model_evaluation_store.mes_id - self.creation_date = creation_date def get_full_info(self): """ @@ -298,14 +297,6 @@ def get_metrics(self): return self.client._perform_json( "GET", "/projects/%s/modelevaluationstores/%s/runs/%s/metrics" % (self.project_key, self.mes_id, self.run_id)) - def get_creation_date(self): - """ - Get the creation date, as an epoch - - :return: the creation date, as an epoch - """ - return self.creation_date - def get_sample_df(self): """ Get the sample of the evaluation dataset on which the evaluation was performed