fiddler-client 2.1.0.dev4__py3-none-any.whl → 2.1.0.dev5__py3-none-any.whl
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/_version.py +1 -1
- fiddler/api/explainability_mixin.py +3 -3
- fiddler/exceptions.py +1 -1
- {fiddler_client-2.1.0.dev4.dist-info → fiddler_client-2.1.0.dev5.dist-info}/METADATA +3 -1
- {fiddler_client-2.1.0.dev4.dist-info → fiddler_client-2.1.0.dev5.dist-info}/RECORD +9 -9
- tests/fiddler/test_explainability_apis.py +38 -7
- {fiddler_client-2.1.0.dev4.dist-info → fiddler_client-2.1.0.dev5.dist-info}/LICENSE.txt +0 -0
- {fiddler_client-2.1.0.dev4.dist-info → fiddler_client-2.1.0.dev5.dist-info}/WHEEL +0 -0
- {fiddler_client-2.1.0.dev4.dist-info → fiddler_client-2.1.0.dev5.dist-info}/top_level.txt +0 -0
fiddler/_version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = '2.1.0.
|
|
1
|
+
__version__ = '2.1.0.dev5'
|
|
@@ -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:
|
fiddler/exceptions.py
CHANGED
|
@@ -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
|
)
|
|
@@ -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
|
|
@@ -49,6 +49,8 @@ Version History
|
|
|
49
49
|
- Introduce Model Tasks `NOT_SET` and `LLM`
|
|
50
50
|
- Relax Target / Output specification for model tasks `NOT_SET` and `LLM`
|
|
51
51
|
- Support custom metrics
|
|
52
|
+
- #### **Modifications**
|
|
53
|
+
- `DatasetDataSource` and `EventIdDataSource` will take `dataset_id` instead of `dataset_name`
|
|
52
54
|
|
|
53
55
|
### 2.0.4
|
|
54
56
|
- #### **Modifications**
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
fiddler/__init__.py,sha256=N0S2NzC1P0Dl7SE9IRRzJpSDvyyqT9Pmlk2SaW24NGc,2018
|
|
2
|
-
fiddler/_version.py,sha256=
|
|
2
|
+
fiddler/_version.py,sha256=KQAc7KU-mJvztNT933s927lrNsCxny7RGtGEb4R-foc,27
|
|
3
3
|
fiddler/constants.py,sha256=kXJX771B9UoQKh-umPnPfDXGeCRdC8TmTAi40hSK0Cs,1886
|
|
4
4
|
fiddler/core_objects.py,sha256=Qe8wxak6tfn9rpIb7jdN5tXYpUJs_sJHPMGf9cDg6MU,114079
|
|
5
|
-
fiddler/exceptions.py,sha256=
|
|
5
|
+
fiddler/exceptions.py,sha256=L4AQd6PAgHI0c8Jx5_x7ZZcb7tlBK5pCkEoXJAxL-xU,2569
|
|
6
6
|
fiddler/api/__init__.py,sha256=Na9WlUxg8FmKHBzzVJ-CzlYNm7-LClVH5f313SqJx4A,108
|
|
7
7
|
fiddler/api/alert_mixin.py,sha256=lBc08-wcvF3bO_XdcVSXqmgR9i54UtKwUCn56brokCw,17873
|
|
8
8
|
fiddler/api/api.py,sha256=pR5eE7Vq5OWGom8MZmZkkU2bmVOznJ45jiB4pwnXd6g,3506
|
|
@@ -10,7 +10,7 @@ fiddler/api/baseline_mixin.py,sha256=2DKur2oIrn0TNTQPbpwSMyC1WOzhScHXWwX8QK8ubig
|
|
|
10
10
|
fiddler/api/custom_metrics_mixin.py,sha256=7fpZx_4jSzhELbU1TYyvgDqP8NUMg62NWqlgRwKjkDQ,3459
|
|
11
11
|
fiddler/api/dataset_mixin.py,sha256=cN5GfOTX5uOKzmvxHj-uLuv049EI_BQqhJ6uw1VX-7o,15319
|
|
12
12
|
fiddler/api/events_mixin.py,sha256=RiKwS-EDE0SJKS-rgYd13Bav1wStyM0r29FA0WHi48I,22009
|
|
13
|
-
fiddler/api/explainability_mixin.py,sha256=
|
|
13
|
+
fiddler/api/explainability_mixin.py,sha256=cyf8Jv37v-BS2T6s5PfnrxR1eoXBKDj_YEx2TlJWB3g,15468
|
|
14
14
|
fiddler/api/generate_schema_mixin.py,sha256=90tv_Ca1DqBKZvT9HZcAiLWWAIUK2KgZIQLrx_4RDaE,9840
|
|
15
15
|
fiddler/api/helpers.py,sha256=VV__rmT6gIDFBgobeTW42mUj4ZSICm1V7saWWFIYeAs,4752
|
|
16
16
|
fiddler/api/job_mixin.py,sha256=xOJnABpX-UFqCmjArpsQey60L-vM4Mxe7BZ5OXfGFYs,4506
|
|
@@ -76,7 +76,7 @@ tests/fiddler/test_custom_metrics.py,sha256=txNS-RTltdAublF0xWhkS_YOgdu-C6AxRKub
|
|
|
76
76
|
tests/fiddler/test_dataset_api.py,sha256=XrSsyhJubBUKEjl6qHSDBE9_-VnHOCgiL0Mq12IZav0,6306
|
|
77
77
|
tests/fiddler/test_events_api.py,sha256=l41OGatQzNCc95qvLXOpcQ0r7IPRw-N1Uw_bEkRZhf0,11770
|
|
78
78
|
tests/fiddler/test_exceptions.py,sha256=3dUe85gqf8MVxEM_9D1wrNRU8jvmu1-ja36jaDKgOQk,2801
|
|
79
|
-
tests/fiddler/test_explainability_apis.py,sha256=
|
|
79
|
+
tests/fiddler/test_explainability_apis.py,sha256=3n4Em8V4bT8R4pXQoCcUJy8DjovoqkAEisuBPV-_Cgg,16148
|
|
80
80
|
tests/fiddler/test_file_upload.py,sha256=TBy0gLfu2sfbqcvx_rrgNF0I4keqkBTReG2EkVIei_Y,7611
|
|
81
81
|
tests/fiddler/test_generate_schema.py,sha256=aXSqB905JO2D1pzbA_39Hp126WQ6wfLtmrTw6kyBRgI,3256
|
|
82
82
|
tests/fiddler/test_helpers.py,sha256=moCqxTvwWBNr2l73ZZKgmCSklX6_2bidVI6-gdQspfU,820
|
|
@@ -91,8 +91,8 @@ tests/fiddler/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
|
|
|
91
91
|
tests/fiddler/utils/test_general_checks.py,sha256=kxG8n4UdBWXBGchA0SvV7o4t28a7YAc8viorEBpzzcE,1451
|
|
92
92
|
tests/fiddler/utils/test_pandas.py,sha256=ihNRe9mCteqeV70o-zWEf62fJHL3qE8nDIijYlUEHv4,8825
|
|
93
93
|
tests/fiddler/utils/tests_utils.py,sha256=kPmMoOlaSIWw6Gk7QnAnn8QJvEyqtd2Rz32kS6RGEc8,1800
|
|
94
|
-
fiddler_client-2.1.0.
|
|
95
|
-
fiddler_client-2.1.0.
|
|
96
|
-
fiddler_client-2.1.0.
|
|
97
|
-
fiddler_client-2.1.0.
|
|
98
|
-
fiddler_client-2.1.0.
|
|
94
|
+
fiddler_client-2.1.0.dev5.dist-info/LICENSE.txt,sha256=w8-LUAb_VLBWSsCNmih0pAqLIicJfGu8OJXpDjkIg_o,559
|
|
95
|
+
fiddler_client-2.1.0.dev5.dist-info/METADATA,sha256=zy-FDLMThSf4nOsdYV6lcDz2jBA6N867oxRI8kD7Jd0,18998
|
|
96
|
+
fiddler_client-2.1.0.dev5.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
|
|
97
|
+
fiddler_client-2.1.0.dev5.dist-info/top_level.txt,sha256=GdJimrE4Q9O20-dA6QljDHm5KBrlz25oQTdbMHu41So,14
|
|
98
|
+
fiddler_client-2.1.0.dev5.dist-info/RECORD,,
|
|
@@ -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,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|