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.
Files changed (106) hide show
  1. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/PKG-INFO +4 -1
  2. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/PUBLIC.md +3 -0
  3. fiddler-client-2.1.0.dev5/fiddler/_version.py +1 -0
  4. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/custom_metrics_mixin.py +24 -5
  5. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/explainability_mixin.py +3 -3
  6. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/exceptions.py +1 -1
  7. fiddler-client-2.1.0.dev5/fiddler/schema/custom_metric.py +18 -0
  8. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler_client.egg-info/PKG-INFO +4 -1
  9. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_custom_metrics.py +84 -9
  10. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_explainability_apis.py +38 -7
  11. fiddler-client-2.1.0.dev3/fiddler/_version.py +0 -1
  12. fiddler-client-2.1.0.dev3/fiddler/schema/custom_metric.py +0 -10
  13. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/MANIFEST.in +0 -0
  14. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/README.md +0 -0
  15. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/__init__.py +0 -0
  16. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/__init__.py +0 -0
  17. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/alert_mixin.py +0 -0
  18. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/api.py +0 -0
  19. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/baseline_mixin.py +0 -0
  20. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/dataset_mixin.py +0 -0
  21. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/events_mixin.py +0 -0
  22. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/generate_schema_mixin.py +0 -0
  23. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/helpers.py +0 -0
  24. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/job_mixin.py +0 -0
  25. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/model_artifact_deploy.py +0 -0
  26. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/model_deployment_mixin.py +0 -0
  27. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/model_mixin.py +0 -0
  28. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/project_mixin.py +0 -0
  29. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/api/webhooks_mixin.py +0 -0
  30. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/assets/__init__.py +0 -0
  31. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/assets/pg_reserved_words.py +0 -0
  32. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/constants.py +0 -0
  33. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/core_objects.py +0 -0
  34. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/libs/__init__.py +0 -0
  35. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/libs/http_client.py +0 -0
  36. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/packtools/__init__.py +0 -0
  37. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/packtools/gem.py +0 -0
  38. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/packtools/keras_ig_helpers.py +0 -0
  39. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/packtools/project_attributions_helpers.py +0 -0
  40. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/packtools/template_model.py +0 -0
  41. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/__init__.py +0 -0
  42. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/alert.py +0 -0
  43. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/base.py +0 -0
  44. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/baseline.py +0 -0
  45. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/dataset.py +0 -0
  46. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/events.py +0 -0
  47. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/job.py +0 -0
  48. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/model.py +0 -0
  49. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/model_deployment.py +0 -0
  50. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/project.py +0 -0
  51. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/server_info.py +0 -0
  52. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/user.py +0 -0
  53. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schema/webhook.py +0 -0
  54. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schemas/__init__.py +0 -0
  55. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schemas/custom_features.py +0 -0
  56. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schemas/model_schema.py +0 -0
  57. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schemas/model_spec.py +0 -0
  58. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schemas/model_task_params.py +0 -0
  59. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/schemas/xai_params.py +0 -0
  60. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/__init__.py +0 -0
  61. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/decorators.py +0 -0
  62. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/formatting.py +0 -0
  63. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/general_checks.py +0 -0
  64. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/helpers.py +0 -0
  65. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/logger.py +0 -0
  66. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/pandas_helper.py +0 -0
  67. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/response_handler.py +0 -0
  68. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/semver_version.py +0 -0
  69. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/validations.py +0 -0
  70. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/utils/validator.py +0 -0
  71. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/validators/__init__.py +0 -0
  72. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler/validators/dataset_validator.py +0 -0
  73. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler_client.egg-info/SOURCES.txt +0 -0
  74. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler_client.egg-info/dependency_links.txt +0 -0
  75. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler_client.egg-info/requires.txt +0 -0
  76. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/fiddler_client.egg-info/top_level.txt +0 -0
  77. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/setup.cfg +0 -0
  78. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/setup.py +0 -0
  79. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/__init__.py +0 -0
  80. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/__init__.py +0 -0
  81. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/base.py +0 -0
  82. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/helper.py +0 -0
  83. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_add_model.py +0 -0
  84. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_alert.py +0 -0
  85. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_baseline.py +0 -0
  86. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_check_version_decorator.py +0 -0
  87. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_custom_features.py +0 -0
  88. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_dataset_api.py +0 -0
  89. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_events_api.py +0 -0
  90. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_exceptions.py +0 -0
  91. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_file_upload.py +0 -0
  92. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_generate_schema.py +0 -0
  93. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_helpers.py +0 -0
  94. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_job.py +0 -0
  95. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_model.py +0 -0
  96. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_project.py +0 -0
  97. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_response_handler.py +0 -0
  98. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_upload_dataset.py +0 -0
  99. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_validations.py +0 -0
  100. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/test_webhook.py +0 -0
  101. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/utils/__init__.py +0 -0
  102. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/utils/test_general_checks.py +0 -0
  103. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/utils/test_pandas.py +0 -0
  104. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/fiddler/utils/tests_utils.py +0 -0
  105. {fiddler-client-2.1.0.dev3 → fiddler-client-2.1.0.dev5}/tests/test_object_inference.py +0 -0
  106. {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.dev3
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, name: str, project_id: str, model_id: str, fql: str
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 fql: The FQL expression describing the metric
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
- 'fql': fql,
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 = None) -> None:
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.response
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.dev3
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**
@@ -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
- "fql": "sum(age)",
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
- "fql": "sum(credit_score)",
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
- fql='sum(age)',
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
- fql='sum(credit_score)',
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
- fql='sum(age)',
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
- fql='sum(age)',
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
- fql='sum(unknown)',
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)
@@ -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
- dataset_name='test_dataset', num_samples=None
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
- dataset_name='test_dataset',
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
- dataset_name='test_dataset',
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
- dataset_name='test_dataset',
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
- dataset_name=self._dataset_name, source=None, num_samples=10
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=None,
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
- dataset_name=self._dataset_name, source=None, num_samples=None
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'
@@ -1,10 +0,0 @@
1
- from fiddler.schema.base import BaseDataSchema
2
-
3
-
4
- class CustomMetric(BaseDataSchema):
5
- id: str
6
- name: str
7
- project_name: str
8
- organization_name: str
9
- name: str
10
- fql: str