fiddler-client 2.1.0.dev3__tar.gz → 2.1.0.dev5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/PKG-INFO +4 -1
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/PUBLIC.md +3 -0
- fiddler-client-2.1.0.dev5/fiddler/_version.py +1 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/custom_metrics_mixin.py +24 -5
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/explainability_mixin.py +3 -3
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/exceptions.py +1 -1
- fiddler-client-2.1.0.dev5/fiddler/schema/custom_metric.py +18 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler_client.egg-info/PKG-INFO +4 -1
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_custom_metrics.py +84 -9
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_explainability_apis.py +38 -7
- fiddler-client-2.1.0.dev3/fiddler/_version.py +0 -1
- fiddler-client-2.1.0.dev3/fiddler/schema/custom_metric.py +0 -10
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/MANIFEST.in +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/README.md +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/__init__.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/__init__.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/alert_mixin.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/api.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/baseline_mixin.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/dataset_mixin.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/events_mixin.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/generate_schema_mixin.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/helpers.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/job_mixin.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/model_artifact_deploy.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/model_deployment_mixin.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/model_mixin.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/project_mixin.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/webhooks_mixin.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/assets/__init__.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/assets/pg_reserved_words.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/constants.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/core_objects.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/libs/__init__.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/libs/http_client.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/packtools/__init__.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/packtools/gem.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/packtools/keras_ig_helpers.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/packtools/project_attributions_helpers.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/packtools/template_model.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/__init__.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/alert.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/base.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/baseline.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/dataset.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/events.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/job.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/model.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/model_deployment.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/project.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/server_info.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/user.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/webhook.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schemas/__init__.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schemas/custom_features.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schemas/model_schema.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schemas/model_spec.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schemas/model_task_params.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schemas/xai_params.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/__init__.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/decorators.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/formatting.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/general_checks.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/helpers.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/logger.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/pandas_helper.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/response_handler.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/semver_version.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/validations.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/validator.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/validators/__init__.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/validators/dataset_validator.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler_client.egg-info/SOURCES.txt +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler_client.egg-info/dependency_links.txt +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler_client.egg-info/requires.txt +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler_client.egg-info/top_level.txt +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/setup.cfg +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/setup.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/__init__.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/__init__.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/base.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/helper.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_add_model.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_alert.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_baseline.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_check_version_decorator.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_custom_features.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_dataset_api.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_events_api.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_exceptions.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_file_upload.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_generate_schema.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_helpers.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_job.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_model.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_project.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_response_handler.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_upload_dataset.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_validations.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_webhook.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/utils/__init__.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/utils/test_general_checks.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/utils/test_pandas.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/utils/tests_utils.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/test_object_inference.py +0 -0
- {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fiddler-client
|
|
3
|
-
Version: 2.1.0.
|
|
3
|
+
Version: 2.1.0.dev5
|
|
4
4
|
Summary: Python client for Fiddler Service
|
|
5
5
|
Home-page: https://fiddler.ai
|
|
6
6
|
Author: Fiddler Labs
|
|
@@ -31,6 +31,9 @@ Description: Fiddler Client
|
|
|
31
31
|
- #### **New Features**
|
|
32
32
|
- Introduce Model Tasks `NOT_SET` and `LLM`
|
|
33
33
|
- Relax Target / Output specification for model tasks `NOT_SET` and `LLM`
|
|
34
|
+
- Support custom metrics
|
|
35
|
+
- #### **Modifications**
|
|
36
|
+
- `DatasetDataSource` and `EventIdDataSource` will take `dataset_id` instead of `dataset_name`
|
|
34
37
|
|
|
35
38
|
### 2.0.4
|
|
36
39
|
- #### **Modifications**
|
|
@@ -24,6 +24,9 @@ Version History
|
|
|
24
24
|
- #### **New Features**
|
|
25
25
|
- Introduce Model Tasks `NOT_SET` and `LLM`
|
|
26
26
|
- Relax Target / Output specification for model tasks `NOT_SET` and `LLM`
|
|
27
|
+
- Support custom metrics
|
|
28
|
+
- #### **Modifications**
|
|
29
|
+
- `DatasetDataSource` and `EventIdDataSource` will take `dataset_id` instead of `dataset_name`
|
|
27
30
|
|
|
28
31
|
### 2.0.4
|
|
29
32
|
- #### **Modifications**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '2.1.0.dev5'
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from http import HTTPStatus
|
|
2
|
-
from typing import List
|
|
2
|
+
from typing import List, Optional
|
|
3
3
|
|
|
4
4
|
from pydantic import parse_obj_as
|
|
5
5
|
|
|
@@ -22,7 +22,12 @@ class CustomMetricsMixin:
|
|
|
22
22
|
|
|
23
23
|
@handle_api_error_response
|
|
24
24
|
def add_custom_metric(
|
|
25
|
-
self,
|
|
25
|
+
self,
|
|
26
|
+
name: str,
|
|
27
|
+
project_id: str,
|
|
28
|
+
model_id: str,
|
|
29
|
+
definition: str,
|
|
30
|
+
description: Optional[str] = None,
|
|
26
31
|
) -> CustomMetric:
|
|
27
32
|
"""
|
|
28
33
|
Add a new `Custom Metric`.
|
|
@@ -30,7 +35,8 @@ class CustomMetricsMixin:
|
|
|
30
35
|
:params name: name of custom metric
|
|
31
36
|
:params project_id: name of project
|
|
32
37
|
:params model_id: name of model
|
|
33
|
-
:params
|
|
38
|
+
:params definition: The FQL expression describing the metric
|
|
39
|
+
:params description: description of custom metric
|
|
34
40
|
|
|
35
41
|
:returns: Created `CustomMetric` object.
|
|
36
42
|
"""
|
|
@@ -39,7 +45,8 @@ class CustomMetricsMixin:
|
|
|
39
45
|
'project_name': project_id,
|
|
40
46
|
'model_name': model_id,
|
|
41
47
|
'name': name,
|
|
42
|
-
'
|
|
48
|
+
'definition': definition,
|
|
49
|
+
'description': description,
|
|
43
50
|
}
|
|
44
51
|
response = self.client.post(
|
|
45
52
|
url='custom-metrics',
|
|
@@ -51,7 +58,7 @@ class CustomMetricsMixin:
|
|
|
51
58
|
return CustomMetric.parse_obj(attrs)
|
|
52
59
|
|
|
53
60
|
@handle_api_error_response
|
|
54
|
-
def delete_custom_metric(self, metric_id: str
|
|
61
|
+
def delete_custom_metric(self, metric_id: str) -> None:
|
|
55
62
|
"""
|
|
56
63
|
Delete a custom metric
|
|
57
64
|
|
|
@@ -95,3 +102,15 @@ class CustomMetricsMixin:
|
|
|
95
102
|
)
|
|
96
103
|
items = PaginatedResponseHandler(response).get_pagination_items()
|
|
97
104
|
return parse_obj_as(List[CustomMetric], items)
|
|
105
|
+
|
|
106
|
+
@handle_api_error_response
|
|
107
|
+
def get_custom_metric(self, metric_id: str) -> CustomMetric:
|
|
108
|
+
"""
|
|
109
|
+
Get a `CustomMetric` object.
|
|
110
|
+
|
|
111
|
+
:params metric_id: id of the custom metric
|
|
112
|
+
|
|
113
|
+
:returns: a `CustomMetric` object
|
|
114
|
+
"""
|
|
115
|
+
response = self.client.get(url=f'custom-metrics/{metric_id}')
|
|
116
|
+
return CustomMetric.deserialize(APIResponseHandler(response))
|
|
@@ -2,7 +2,7 @@ from collections import namedtuple
|
|
|
2
2
|
from typing import Any, Dict, List, NamedTuple, Optional, Union
|
|
3
3
|
|
|
4
4
|
import pandas as pd
|
|
5
|
-
from pydantic import BaseModel
|
|
5
|
+
from pydantic import BaseModel, Field
|
|
6
6
|
|
|
7
7
|
from fiddler.libs.http_client import RequestClient
|
|
8
8
|
from fiddler.utils.decorators import handle_api_error_response
|
|
@@ -15,7 +15,7 @@ logger = get_logger(__name__)
|
|
|
15
15
|
|
|
16
16
|
class DatasetDataSource(BaseModel):
|
|
17
17
|
source_type = 'DATASET'
|
|
18
|
-
dataset_name: str
|
|
18
|
+
dataset_name: str = Field(alias='dataset_id')
|
|
19
19
|
source: Optional[str]
|
|
20
20
|
num_samples: Optional[int]
|
|
21
21
|
|
|
@@ -34,7 +34,7 @@ class RowDataSource(BaseModel):
|
|
|
34
34
|
class EventIdDataSource(BaseModel):
|
|
35
35
|
source_type = 'EVENT_ID'
|
|
36
36
|
event_id: str
|
|
37
|
-
dataset_name: str
|
|
37
|
+
dataset_name: str = Field(alias='dataset_id')
|
|
38
38
|
|
|
39
39
|
|
|
40
40
|
class ExplainabilityMixin:
|
|
@@ -23,7 +23,7 @@ class AsyncJobFailed(Exception):
|
|
|
23
23
|
class ErrorResponseHandler:
|
|
24
24
|
def __init__(self, http_error: HTTPError) -> None:
|
|
25
25
|
self.http_error = http_error
|
|
26
|
-
self.response = http_error
|
|
26
|
+
self.response = getattr(http_error, 'response')
|
|
27
27
|
self.ErrorResponse = namedtuple( # type: ignore
|
|
28
28
|
'ErrorResponse', ['status_code', 'error_code', 'message', 'errors']
|
|
29
29
|
)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from fiddler.schema.base import BaseDataSchema
|
|
4
|
+
from fiddler.schema.user import UserCompact
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CustomMetric(BaseDataSchema):
|
|
9
|
+
id: str
|
|
10
|
+
name: str
|
|
11
|
+
project_name: str
|
|
12
|
+
organization_name: str
|
|
13
|
+
name: str
|
|
14
|
+
definition: str
|
|
15
|
+
description: Optional[str]
|
|
16
|
+
created_at: Optional[datetime]
|
|
17
|
+
created_by: Optional[UserCompact]
|
|
18
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fiddler-client
|
|
3
|
-
Version: 2.1.0.
|
|
3
|
+
Version: 2.1.0.dev5
|
|
4
4
|
Summary: Python client for Fiddler Service
|
|
5
5
|
Home-page: https://fiddler.ai
|
|
6
6
|
Author: Fiddler Labs
|
|
@@ -31,6 +31,9 @@ Description: Fiddler Client
|
|
|
31
31
|
- #### **New Features**
|
|
32
32
|
- Introduce Model Tasks `NOT_SET` and `LLM`
|
|
33
33
|
- Relax Target / Output specification for model tasks `NOT_SET` and `LLM`
|
|
34
|
+
- Support custom metrics
|
|
35
|
+
- #### **Modifications**
|
|
36
|
+
- `DatasetDataSource` and `EventIdDataSource` will take `dataset_id` instead of `dataset_name`
|
|
34
37
|
|
|
35
38
|
### 2.0.4
|
|
36
39
|
- #### **Modifications**
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_custom_metrics.py
RENAMED
|
@@ -27,17 +27,32 @@ class TestCustomMetric(BaseTestCase):
|
|
|
27
27
|
"project_name": "bank_churn",
|
|
28
28
|
"name": "tp_0.8",
|
|
29
29
|
"model_name": "churn_classifier",
|
|
30
|
-
"
|
|
30
|
+
"definition": "sum(age)",
|
|
31
31
|
"id": "fbba0596-1d49-4159-a5ea-e1c2f57c9c32",
|
|
32
|
-
"organization_name": "test_organization"
|
|
32
|
+
"organization_name": "test_organization",
|
|
33
|
+
"description": "test description",
|
|
34
|
+
"extra_field_from_future": "should_not_break",
|
|
35
|
+
"created_at": "2021-03-03T18:30:00.000Z",
|
|
36
|
+
"created_by": {
|
|
37
|
+
"id": "1",
|
|
38
|
+
"full_name": "test user",
|
|
39
|
+
"email": "testuser@fiddler.ai"
|
|
40
|
+
}
|
|
33
41
|
},
|
|
34
42
|
{
|
|
35
43
|
"project_name": "bank_churn",
|
|
36
44
|
"name": "tp_0.6",
|
|
37
45
|
"model_name": "churn_classifier",
|
|
38
|
-
"
|
|
46
|
+
"definition": "sum(credit_score)",
|
|
39
47
|
"id": "3a352397-a89a-495d-a095-440f1d21a58a",
|
|
40
|
-
"organization_name": "test_organization"
|
|
48
|
+
"organization_name": "test_organization",
|
|
49
|
+
"description": "test description",
|
|
50
|
+
"created_at": "2021-03-03T18:30:00.000Z",
|
|
51
|
+
"created_by": {
|
|
52
|
+
"id": "2",
|
|
53
|
+
"full_name": "test user",
|
|
54
|
+
"email": "testuser@fiddler.ai"
|
|
55
|
+
}
|
|
41
56
|
}
|
|
42
57
|
]
|
|
43
58
|
},
|
|
@@ -65,18 +80,32 @@ class TestCustomMetric(BaseTestCase):
|
|
|
65
80
|
CustomMetric(
|
|
66
81
|
id='fbba0596-1d49-4159-a5ea-e1c2f57c9c32',
|
|
67
82
|
name='tp_0.8',
|
|
68
|
-
|
|
83
|
+
definition='sum(age)',
|
|
69
84
|
organization_name='test_organization',
|
|
70
85
|
project_name='bank_churn',
|
|
71
86
|
model_name='churn_classifier',
|
|
87
|
+
description='test description',
|
|
88
|
+
created_at='2021-03-03T18:30:00.000Z',
|
|
89
|
+
created_by={
|
|
90
|
+
"id": "1",
|
|
91
|
+
"full_name": "test user",
|
|
92
|
+
"email": "testuser@fiddler.ai"
|
|
93
|
+
}
|
|
72
94
|
),
|
|
73
95
|
CustomMetric(
|
|
74
96
|
id='3a352397-a89a-495d-a095-440f1d21a58a',
|
|
75
97
|
name='tp_0.6',
|
|
76
|
-
|
|
98
|
+
definition='sum(credit_score)',
|
|
77
99
|
organization_name='test_organization',
|
|
78
100
|
project_name='bank_churn',
|
|
79
101
|
model_name='churn_classifier',
|
|
102
|
+
description='test description',
|
|
103
|
+
created_at='2021-03-03T18:30:00.000Z',
|
|
104
|
+
created_by={
|
|
105
|
+
"id": "2",
|
|
106
|
+
"full_name": "test user",
|
|
107
|
+
"email": "testuser@fiddler.ai"
|
|
108
|
+
}
|
|
80
109
|
),
|
|
81
110
|
]
|
|
82
111
|
|
|
@@ -95,17 +124,19 @@ class TestCustomMetric(BaseTestCase):
|
|
|
95
124
|
|
|
96
125
|
custom_metric = self.client.add_custom_metric(
|
|
97
126
|
name='my custom',
|
|
98
|
-
|
|
127
|
+
definition='sum(age)',
|
|
99
128
|
project_id='bank_churn',
|
|
100
129
|
model_id='churn_classifier',
|
|
130
|
+
description='test description',
|
|
101
131
|
)
|
|
102
132
|
assert custom_metric == CustomMetric(
|
|
103
133
|
id='fbba0596-1d49-4159-a5ea-e1c2f57c9c32',
|
|
104
134
|
name='my custom',
|
|
105
|
-
|
|
135
|
+
definition='sum(age)',
|
|
106
136
|
organization_name='test_organization',
|
|
107
137
|
project_name='bank_churn',
|
|
108
138
|
model_name='churn_classifier',
|
|
139
|
+
description='test description',
|
|
109
140
|
)
|
|
110
141
|
|
|
111
142
|
def test_add_custom_metric_error(self):
|
|
@@ -131,7 +162,7 @@ class TestCustomMetric(BaseTestCase):
|
|
|
131
162
|
with self.assertRaises(BadRequest) as context:
|
|
132
163
|
self.client.add_custom_metric(
|
|
133
164
|
name='my custom',
|
|
134
|
-
|
|
165
|
+
definition='sum(unknown)',
|
|
135
166
|
project_id='bank_churn',
|
|
136
167
|
model_id='churn_classifier',
|
|
137
168
|
)
|
|
@@ -140,6 +171,50 @@ class TestCustomMetric(BaseTestCase):
|
|
|
140
171
|
"Column unknown not found in model churn_classifier"
|
|
141
172
|
)
|
|
142
173
|
|
|
174
|
+
def test_get_custom_metric(self):
|
|
175
|
+
uuid = 'fbba0596-1d49-4159-a5ea-e1c2f57c9c32'
|
|
176
|
+
response = {
|
|
177
|
+
"data": {
|
|
178
|
+
"project_name": "bank_churn",
|
|
179
|
+
"name": "tp_0.8",
|
|
180
|
+
"model_name": "churn_classifier",
|
|
181
|
+
"definition": "sum(age)",
|
|
182
|
+
"id": "fbba0596-1d49-4159-a5ea-e1c2f57c9c32",
|
|
183
|
+
"organization_name": "test_organization",
|
|
184
|
+
"description": "test description",
|
|
185
|
+
"extra_field_from_future": "should_not_break",
|
|
186
|
+
"created_at": "2021-03-03T18:30:00.000Z",
|
|
187
|
+
"created_by": {
|
|
188
|
+
"id": "1",
|
|
189
|
+
"full_name": "test user",
|
|
190
|
+
"email": "testuser@fiddler.ai"
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
"api_version": "2.0",
|
|
194
|
+
"kind": "NORMAL"
|
|
195
|
+
}
|
|
196
|
+
url = self._get_url(uuid)
|
|
197
|
+
|
|
198
|
+
self.requests_mock.get(url, json=response)
|
|
199
|
+
cm = self.client.get_custom_metric(
|
|
200
|
+
metric_id='fbba0596-1d49-4159-a5ea-e1c2f57c9c32'
|
|
201
|
+
)
|
|
202
|
+
assert cm == CustomMetric(
|
|
203
|
+
id='fbba0596-1d49-4159-a5ea-e1c2f57c9c32',
|
|
204
|
+
name='tp_0.8',
|
|
205
|
+
definition='sum(age)',
|
|
206
|
+
organization_name='test_organization',
|
|
207
|
+
project_name='bank_churn',
|
|
208
|
+
model_name='churn_classifier',
|
|
209
|
+
description='test description',
|
|
210
|
+
created_at='2021-03-03T18:30:00.000Z',
|
|
211
|
+
created_by={
|
|
212
|
+
"id": "1",
|
|
213
|
+
"full_name": "test user",
|
|
214
|
+
"email": "testuser@fiddler.ai"
|
|
215
|
+
}
|
|
216
|
+
)
|
|
217
|
+
|
|
143
218
|
def test_delete_custom_metric(self):
|
|
144
219
|
uuid = 'fbba0596-1d49-4159-a5ea-e1c2f57c9c32'
|
|
145
220
|
url = self._get_url(uuid)
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_explainability_apis.py
RENAMED
|
@@ -2,9 +2,11 @@ import json
|
|
|
2
2
|
import unittest
|
|
3
3
|
|
|
4
4
|
import pandas as pd
|
|
5
|
+
import pytest
|
|
5
6
|
|
|
6
7
|
from fiddler.api.explainability_mixin import (
|
|
7
8
|
DatasetDataSource,
|
|
9
|
+
EventIdDataSource,
|
|
8
10
|
RowDataSource,
|
|
9
11
|
SqlSliceQueryDataSource,
|
|
10
12
|
)
|
|
@@ -19,6 +21,16 @@ class TestExplainabilityApis(BaseTestCase):
|
|
|
19
21
|
self._dataset_name = 'test_dataset'
|
|
20
22
|
self._model_name = 'test_model'
|
|
21
23
|
|
|
24
|
+
def test_pydantic_models(self):
|
|
25
|
+
dataset_source = DatasetDataSource(dataset_id='test_dataset')
|
|
26
|
+
assert dataset_source.dataset_name == 'test_dataset'
|
|
27
|
+
assert dataset_source.source_type == 'DATASET'
|
|
28
|
+
|
|
29
|
+
event_id_ds = EventIdDataSource(event_id='event_id', dataset_id='test_dataset')
|
|
30
|
+
assert event_id_ds.dataset_name == 'test_dataset'
|
|
31
|
+
assert event_id_ds.event_id == 'event_id'
|
|
32
|
+
assert event_id_ds.source_type == 'EVENT_ID'
|
|
33
|
+
|
|
22
34
|
def test_feature_importance_from_dataset(self):
|
|
23
35
|
url = f'{self._url}/feature-importance'
|
|
24
36
|
|
|
@@ -29,7 +41,7 @@ class TestExplainabilityApis(BaseTestCase):
|
|
|
29
41
|
model_id=self._model_name,
|
|
30
42
|
project_id=self._project_name,
|
|
31
43
|
data_source=DatasetDataSource(
|
|
32
|
-
|
|
44
|
+
dataset_id='test_dataset', num_samples=None
|
|
33
45
|
),
|
|
34
46
|
num_refs=None,
|
|
35
47
|
num_iterations=None,
|
|
@@ -95,7 +107,7 @@ class TestExplainabilityApis(BaseTestCase):
|
|
|
95
107
|
model_id=self._model_name,
|
|
96
108
|
project_id=self._project_name,
|
|
97
109
|
data_source=DatasetDataSource(
|
|
98
|
-
|
|
110
|
+
dataset_id='test_dataset',
|
|
99
111
|
num_samples=num_samples,
|
|
100
112
|
),
|
|
101
113
|
num_iterations=num_iterations,
|
|
@@ -130,7 +142,7 @@ class TestExplainabilityApis(BaseTestCase):
|
|
|
130
142
|
model_id=self._model_name,
|
|
131
143
|
project_id=self._project_name,
|
|
132
144
|
data_source=DatasetDataSource(
|
|
133
|
-
|
|
145
|
+
dataset_id='test_dataset',
|
|
134
146
|
num_samples=None,
|
|
135
147
|
),
|
|
136
148
|
output_columns=None,
|
|
@@ -203,7 +215,7 @@ class TestExplainabilityApis(BaseTestCase):
|
|
|
203
215
|
model_id=self._model_name,
|
|
204
216
|
project_id=self._project_name,
|
|
205
217
|
data_source=DatasetDataSource(
|
|
206
|
-
|
|
218
|
+
dataset_id='test_dataset',
|
|
207
219
|
num_samples=num_samples,
|
|
208
220
|
),
|
|
209
221
|
output_columns=output_columns,
|
|
@@ -243,12 +255,12 @@ class TestExplainabilityApis(BaseTestCase):
|
|
|
243
255
|
project_id=self._project_name,
|
|
244
256
|
input_data_source=RowDataSource(row={'col_a': 3, 'col_b': 'x'}),
|
|
245
257
|
ref_data_source=DatasetDataSource(
|
|
246
|
-
|
|
258
|
+
dataset_id=self._dataset_name, source=None, num_samples=10
|
|
247
259
|
),
|
|
248
260
|
explanation_type='FIDDLER_SHAP',
|
|
249
261
|
num_permutations=300,
|
|
250
262
|
ci_level=0.95,
|
|
251
|
-
top_n_class=
|
|
263
|
+
top_n_class=1,
|
|
252
264
|
)
|
|
253
265
|
|
|
254
266
|
request_body = json.loads(self.requests_mock.calls[0].request.body)
|
|
@@ -265,6 +277,7 @@ class TestExplainabilityApis(BaseTestCase):
|
|
|
265
277
|
self.assertEqual(request_body['input_data_source']['source_type'], 'ROW')
|
|
266
278
|
self.assertEqual(request_body['explanation_type'], 'FIDDLER_SHAP')
|
|
267
279
|
self.assertEqual(request_body['num_permutations'], 300)
|
|
280
|
+
self.assertEqual(request_body['top_n_class'], 1)
|
|
268
281
|
|
|
269
282
|
def test_fairness(self):
|
|
270
283
|
url = f'{self._url}/fairness'
|
|
@@ -276,7 +289,7 @@ class TestExplainabilityApis(BaseTestCase):
|
|
|
276
289
|
model_id=self._model_name,
|
|
277
290
|
project_id=self._project_name,
|
|
278
291
|
data_source=DatasetDataSource(
|
|
279
|
-
|
|
292
|
+
dataset_id=self._dataset_name, source=None, num_samples=None
|
|
280
293
|
),
|
|
281
294
|
protected_features=['Gender', 'Race'],
|
|
282
295
|
positive_outcome='Churned',
|
|
@@ -334,6 +347,15 @@ class TestExplainabilityApis(BaseTestCase):
|
|
|
334
347
|
|
|
335
348
|
mock_response = get_base_api_response_body(data=data)
|
|
336
349
|
self.requests_mock.post(url, json=mock_response)
|
|
350
|
+
|
|
351
|
+
with pytest.raises(ValueError):
|
|
352
|
+
self.client.get_predictions(
|
|
353
|
+
project_id=self._project_name,
|
|
354
|
+
model_id=self._model_name,
|
|
355
|
+
input_df={},
|
|
356
|
+
chunk_size=10,
|
|
357
|
+
)
|
|
358
|
+
|
|
337
359
|
df = pd.DataFrame([{'col1': 4, 'col2': 'xyz'}])
|
|
338
360
|
self.client.get_predictions(
|
|
339
361
|
project_id=self._project_name,
|
|
@@ -358,6 +380,15 @@ class TestExplainabilityApis(BaseTestCase):
|
|
|
358
380
|
|
|
359
381
|
slice_query = 'SELECT * FROM table' # nosec
|
|
360
382
|
|
|
383
|
+
with pytest.raises(ValueError):
|
|
384
|
+
self.client.get_mutual_information(
|
|
385
|
+
project_id=self._project_name,
|
|
386
|
+
dataset_id=self._dataset_name,
|
|
387
|
+
query=slice_query,
|
|
388
|
+
column_name=1,
|
|
389
|
+
normalized=True,
|
|
390
|
+
)
|
|
391
|
+
|
|
361
392
|
self.client.get_mutual_information(
|
|
362
393
|
project_id=self._project_name,
|
|
363
394
|
dataset_id=self._dataset_name,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = '2.1.0.dev3'
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/generate_schema_mixin.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/model_artifact_deploy.py
RENAMED
|
File without changes
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/model_deployment_mixin.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/packtools/keras_ig_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schemas/model_task_params.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/validators/dataset_validator.py
RENAMED
|
File without changes
|
|
File without changes
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler_client.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler_client.egg-info/requires.txt
RENAMED
|
File without changes
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler_client.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_custom_features.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_generate_schema.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_response_handler.py
RENAMED
|
File without changes
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_upload_dataset.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/utils/test_general_checks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|