fiddler-client 3.3.1__tar.gz → 3.4.0__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 (116) hide show
  1. {fiddler_client-3.3.1/fiddler_client.egg-info → fiddler_client-3.4.0}/PKG-INFO +1 -1
  2. fiddler_client-3.4.0/fiddler/VERSION +1 -0
  3. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/alert_rule.py +1 -1
  4. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/xai.py +0 -38
  5. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_alert_rule.py +109 -9
  6. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_xai.py +0 -122
  7. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/constants.py +2 -0
  8. {fiddler_client-3.3.1 → fiddler_client-3.4.0/fiddler_client.egg-info}/PKG-INFO +1 -1
  9. fiddler_client-3.3.1/fiddler/VERSION +0 -1
  10. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/LICENSE.txt +0 -0
  11. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/MANIFEST.in +0 -0
  12. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/PUBLIC.md +0 -0
  13. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/README.md +0 -0
  14. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/__init__.py +0 -0
  15. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/configs.py +0 -0
  16. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/connection.py +0 -0
  17. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/constants/__init__.py +0 -0
  18. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/constants/alert_rule.py +0 -0
  19. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/constants/baseline.py +0 -0
  20. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/constants/common.py +0 -0
  21. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/constants/dataset.py +0 -0
  22. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/constants/events.py +0 -0
  23. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/constants/job.py +0 -0
  24. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/constants/model.py +0 -0
  25. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/constants/model_deployment.py +0 -0
  26. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/constants/xai.py +0 -0
  27. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/decorators.py +0 -0
  28. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/__init__.py +0 -0
  29. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/alert_record.py +0 -0
  30. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/base.py +0 -0
  31. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/baseline.py +0 -0
  32. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/custom_expression.py +0 -0
  33. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/dataset.py +0 -0
  34. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/events.py +0 -0
  35. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/file.py +0 -0
  36. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/job.py +0 -0
  37. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/model.py +0 -0
  38. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/model_artifact.py +0 -0
  39. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/model_deployment.py +0 -0
  40. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/organization.py +0 -0
  41. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/project.py +0 -0
  42. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/surrogate.py +0 -0
  43. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/user.py +0 -0
  44. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/entities/webhook.py +0 -0
  45. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/exceptions.py +0 -0
  46. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/libs/__init__.py +0 -0
  47. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/libs/http_client.py +0 -0
  48. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/libs/json_encoder.py +0 -0
  49. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/libs/semver.py +0 -0
  50. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/packtools/__init__.py +0 -0
  51. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/packtools/gem.py +0 -0
  52. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/packtools/keras_ig_helpers.py +0 -0
  53. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/packtools/project_attributions_helpers.py +0 -0
  54. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/packtools/template_model.py +0 -0
  55. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/__init__.py +0 -0
  56. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/alert_record.py +0 -0
  57. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/alert_rule.py +0 -0
  58. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/base.py +0 -0
  59. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/baseline.py +0 -0
  60. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/custom_expression.py +0 -0
  61. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/custom_features.py +0 -0
  62. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/dataset.py +0 -0
  63. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/events.py +0 -0
  64. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/file.py +0 -0
  65. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/filter_query.py +0 -0
  66. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/job.py +0 -0
  67. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/model.py +0 -0
  68. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/model_deployment.py +0 -0
  69. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/model_schema.py +0 -0
  70. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/model_spec.py +0 -0
  71. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/model_task_params.py +0 -0
  72. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/organization.py +0 -0
  73. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/project.py +0 -0
  74. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/response.py +0 -0
  75. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/server_info.py +0 -0
  76. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/user.py +0 -0
  77. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/webhook.py +0 -0
  78. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/xai.py +0 -0
  79. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/schemas/xai_params.py +0 -0
  80. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/__init__.py +0 -0
  81. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/__init__.py +0 -0
  82. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_alert_record.py +0 -0
  83. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_baseline.py +0 -0
  84. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_custom_metric.py +0 -0
  85. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_dataset.py +0 -0
  86. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_events.py +0 -0
  87. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_files.py +0 -0
  88. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_generate_model.py +0 -0
  89. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_job.py +0 -0
  90. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_mixin.py +0 -0
  91. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_model.py +0 -0
  92. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_model_artifact.py +0 -0
  93. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_model_deployment.py +0 -0
  94. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_model_surrogate.py +0 -0
  95. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_project.py +0 -0
  96. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_segment.py +0 -0
  97. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/apis/test_webhook.py +0 -0
  98. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/conftest.py +0 -0
  99. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/test_connection.py +0 -0
  100. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/test_json_encoder.py +0 -0
  101. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/test_logger.py +0 -0
  102. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/test_utils.py +0 -0
  103. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/tests/utils.py +0 -0
  104. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/utils/__init__.py +0 -0
  105. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/utils/helpers.py +0 -0
  106. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/utils/logger.py +0 -0
  107. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/utils/model_generator.py +0 -0
  108. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/utils/validations.py +0 -0
  109. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/utils/version.py +0 -0
  110. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler/version.py +0 -0
  111. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler_client.egg-info/SOURCES.txt +0 -0
  112. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler_client.egg-info/dependency_links.txt +0 -0
  113. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler_client.egg-info/requires.txt +0 -0
  114. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/fiddler_client.egg-info/top_level.txt +0 -0
  115. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/setup.cfg +0 -0
  116. {fiddler_client-3.3.1 → fiddler_client-3.4.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fiddler-client
3
- Version: 3.3.1
3
+ Version: 3.4.0
4
4
  Summary: Python client for Fiddler Platform
5
5
  Home-page: https://fiddler.ai
6
6
  Author: Fiddler Labs
@@ -0,0 +1 @@
1
+ 3.4.0
@@ -286,7 +286,7 @@ class AlertRule(
286
286
  pagerduty_services=pagerduty_services,
287
287
  pagerduty_severity=pagerduty_severity,
288
288
  webhooks=webhooks,
289
- ).dict()
289
+ ).dict(exclude_none=True)
290
290
  except ValidationError as e:
291
291
  logger.exception('Invalid input: The format of input is not correct')
292
292
  raise e
@@ -89,44 +89,6 @@ class XaiMixin:
89
89
 
90
90
  return namedtuple('Explain', response.json()['data'])(**response.json()['data'])
91
91
 
92
- @handle_api_error
93
- def get_fairness(
94
- self,
95
- data_source: DatasetDataSource | SqlSliceQueryDataSource,
96
- protected_features: list[str],
97
- positive_outcome: str | int | float | bool,
98
- score_threshold: float | None = None,
99
- ) -> tuple:
100
- """
101
- Get fairness analysis on a dataset or a slice.
102
-
103
- :param data_source: DataSource for the input dataset to compute
104
- fairness on (DatasetDataSource or SqlSliceQueryDataSource)
105
- :param protected_features: list of protected attribute names to compute
106
- Fairness analysis on
107
- :param positive_outcome: name of the positive outcome to compute
108
- Fairness analysis on
109
- :param score_threshold: Binary threshold value (between 0 and 1). Default to 0.5
110
-
111
- :return: A named tuple with the fairness results.
112
- """
113
- self._check_id_attributes()
114
-
115
- payload: dict[str, Any] = {
116
- 'model_id': self.id,
117
- 'data_source': data_source.dict(exclude_none=True),
118
- 'protected_features': protected_features,
119
- 'positive_outcome': positive_outcome,
120
- }
121
- if score_threshold:
122
- payload['score_threshold'] = score_threshold
123
-
124
- response = self._client().post(url='/v3/analytics/fairness', data=payload)
125
-
126
- return namedtuple('Fairness', response.json()['data'])(
127
- **response.json()['data']
128
- )
129
-
130
92
  @handle_api_error
131
93
  def get_slice(
132
94
  self,
@@ -1,5 +1,7 @@
1
1
  import json
2
2
  import logging
3
+ import uuid
4
+ from copy import deepcopy
3
5
  from http import HTTPStatus
4
6
  from uuid import UUID
5
7
 
@@ -24,6 +26,8 @@ from fiddler.tests.constants import (
24
26
  PROJECT_ID,
25
27
  PROJECT_NAME,
26
28
  TEST_EMAILS,
29
+ TEST_PAGERDUTY_SERVICES,
30
+ TEST_PAGERDUTY_SEVERITY,
27
31
  TEST_WEBHOOKS,
28
32
  URL,
29
33
  )
@@ -77,8 +81,8 @@ API_RESPONSE_200 = {
77
81
 
78
82
  ALERT_NOTIFICATION_API_RESPONSE_200 = {
79
83
  'data': {
80
- 'emails': TEST_EMAILS,
81
- 'webhooks': TEST_WEBHOOKS,
84
+ 'emails': [],
85
+ 'webhooks': [],
82
86
  'pagerduty_services': [],
83
87
  'pagerduty_severity': '',
84
88
  },
@@ -332,30 +336,126 @@ def test_disable_notifications(caplog) -> None:
332
336
 
333
337
 
334
338
  @responses.activate
335
- def test_set_notifications() -> None:
339
+ def test_set_notifications_email() -> None:
336
340
  responses.get(
337
341
  url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
338
342
  json=API_RESPONSE_200,
339
343
  )
340
344
 
341
345
  alert_rule = AlertRule.get(id_=ALERT_RULE_ID)
346
+ notification_resp = deepcopy(ALERT_NOTIFICATION_API_RESPONSE_200)
347
+ notification_resp['data']['emails'] = TEST_EMAILS
342
348
  resp = responses.patch(
343
349
  url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}/notification',
344
- json=ALERT_NOTIFICATION_API_RESPONSE_200,
350
+ json=notification_resp,
345
351
  )
346
352
  notifications = alert_rule.set_notification_config(
347
353
  emails=TEST_EMAILS,
348
- webhooks=TEST_WEBHOOKS,
349
354
  )
350
355
  assert json.loads(resp.calls[0].request.body) == {
351
356
  'emails': TEST_EMAILS,
357
+ }
358
+ assert notifications == notification_resp['data']
359
+
360
+ # Removing the emails from the notification config
361
+ notification_resp['data']['emails'] = []
362
+ resp = responses.patch(
363
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}/notification',
364
+ json=notification_resp,
365
+ )
366
+ notifications = alert_rule.set_notification_config(
367
+ emails=[],
368
+ )
369
+ assert json.loads(resp.calls[0].request.body) == {
370
+ 'emails': [],
371
+ }
372
+ assert notifications == notification_resp['data']
373
+
374
+
375
+ @responses.activate
376
+ def test_set_notifications_pagerduty() -> None:
377
+ responses.get(
378
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
379
+ json=API_RESPONSE_200,
380
+ )
381
+
382
+ alert_rule = AlertRule.get(id_=ALERT_RULE_ID)
383
+ notification_resp = deepcopy(ALERT_NOTIFICATION_API_RESPONSE_200)
384
+ notification_resp['data']['pagerduty_services'] = TEST_PAGERDUTY_SERVICES
385
+ notification_resp['data']['pagerduty_severity'] = TEST_PAGERDUTY_SEVERITY
386
+ resp = responses.patch(
387
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}/notification',
388
+ json=notification_resp,
389
+ )
390
+ notifications = alert_rule.set_notification_config(
391
+ pagerduty_services=TEST_PAGERDUTY_SERVICES,
392
+ pagerduty_severity=TEST_PAGERDUTY_SEVERITY,
393
+ )
394
+
395
+ assert json.loads(resp.calls[0].request.body) == {
396
+ 'pagerduty_services': TEST_PAGERDUTY_SERVICES,
397
+ 'pagerduty_severity': TEST_PAGERDUTY_SEVERITY,
398
+ }
399
+ assert notifications == notification_resp['data']
400
+
401
+ # Removing the webhooks from the notification config
402
+ notification_resp['data']['pagerduty_services'] = []
403
+ notification_resp['data']['pagerduty_severity'] = ''
404
+ resp = responses.patch(
405
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}/notification',
406
+ json=notification_resp,
407
+ )
408
+ notifications = alert_rule.set_notification_config(
409
+ pagerduty_services=[],
410
+ pagerduty_severity='',
411
+ )
412
+ assert json.loads(resp.calls[0].request.body) == {
413
+ 'pagerduty_services': [],
414
+ 'pagerduty_severity': '',
415
+ }
416
+ assert notifications == notification_resp['data']
417
+
418
+
419
+ @responses.activate
420
+ def test_set_notifications_webhooks() -> None:
421
+ responses.get(
422
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}',
423
+ json=API_RESPONSE_200,
424
+ )
425
+
426
+ alert_rule = AlertRule.get(id_=ALERT_RULE_ID)
427
+ notification_resp = deepcopy(ALERT_NOTIFICATION_API_RESPONSE_200)
428
+ notification_resp['data']['webhooks'] = TEST_WEBHOOKS
429
+ resp = responses.patch(
430
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}/notification',
431
+ json=notification_resp,
432
+ )
433
+ notifications = alert_rule.set_notification_config(
434
+ webhooks=TEST_WEBHOOKS,
435
+ )
436
+
437
+ notification_resp['data']['webhooks'] = [
438
+ uuid.UUID(webhook_uuid)
439
+ for webhook_uuid in notification_resp['data']['webhooks']
440
+ ]
441
+ assert json.loads(resp.calls[0].request.body) == {
352
442
  'webhooks': TEST_WEBHOOKS,
353
- 'pagerduty_services': None,
354
- 'pagerduty_severity': None,
355
443
  }
356
- assert notifications == NotificationConfig(
357
- **ALERT_NOTIFICATION_API_RESPONSE_200['data']
444
+ assert notifications == notification_resp['data']
445
+
446
+ # Removing the webhooks from the notification config
447
+ notification_resp['data']['webhooks'] = []
448
+ resp = responses.patch(
449
+ url=f'{URL}/v3/alert-rules/{ALERT_RULE_ID}/notification',
450
+ json=notification_resp,
358
451
  )
452
+ notifications = alert_rule.set_notification_config(
453
+ webhooks=[],
454
+ )
455
+ assert json.loads(resp.calls[0].request.body) == {
456
+ 'webhooks': [],
457
+ }
458
+ assert notifications == notification_resp['data']
359
459
 
360
460
 
361
461
  @responses.activate
@@ -219,104 +219,6 @@ EXPLAIN_RESPONSE_200 = {
219
219
  'kind': 'NORMAL',
220
220
  }
221
221
 
222
- FAIRNESS_RESPONSE_200 = {
223
- 'data': {
224
- 'protected_attributes': ['Gender'],
225
- 'label_distribution': {
226
- 'columns': ['Gender', 'data_label', 'count'],
227
- 'labels': [
228
- ['Female', 'Churned', 79],
229
- ['Female', 'Not Churned', 377],
230
- ['Male', 'Churned', 39],
231
- ['Male', 'Not Churned', 505],
232
- ],
233
- },
234
- 'model_outcomes': {
235
- 'columns': ['Gender', 'model_outcome', 'count'],
236
- 'outcomes': [
237
- ['Female', 'Churned', 51],
238
- ['Female', 'Not Churned', 405],
239
- ['Male', 'Churned', 28],
240
- ['Male', 'Not Churned', 516],
241
- ],
242
- },
243
- 'technical_metrics': {
244
- 'columns': [
245
- 'Gender',
246
- 'true_positive_rate',
247
- 'false_positive_rate',
248
- 'true_negative_rate',
249
- 'false_negative_rate',
250
- 'false_omission_rate',
251
- 'false_discovery_rate',
252
- ],
253
- 'values': [
254
- [
255
- 'Female',
256
- 0.569620253164557,
257
- 0.015915119363395226,
258
- 0.9840848806366048,
259
- 0.43037974683544306,
260
- 0.08395061728395062,
261
- 0.11764705882352941,
262
- ],
263
- [
264
- 'Male',
265
- 0.5897435897435898,
266
- 0.009900990099009901,
267
- 0.9900990099009901,
268
- 0.41025641025641024,
269
- 0.031007751937984496,
270
- 0.17857142857142858,
271
- ],
272
- ],
273
- },
274
- 'fairness_metrics': {
275
- 'demographic_parity': {
276
- 'index': ['dp'],
277
- 'columns': ['Female', 'Male'],
278
- 'data': [[0.1118421052631579, 0.051470588235294115]],
279
- 'ratio': 0.4602076124567474,
280
- },
281
- 'equal_opportunity': {
282
- 'index': ['tpr'],
283
- 'columns': ['Female', 'Male'],
284
- 'data': [[0.569620253164557, 0.5897435897435898]],
285
- 'ratio': 0.9658778205833792,
286
- },
287
- 'group_benefit_equality': {
288
- 'index': ['group_benefit'],
289
- 'columns': ['Female', 'Male'],
290
- 'data': [[0.6455696202531646, 0.717948717948718]],
291
- 'ratio': 0.8991862567811935,
292
- },
293
- 'disparate_impact': {
294
- 'pairs': [
295
- {
296
- 'reference': ['Female'],
297
- 'groups': [['Male']],
298
- 'values': [0.4602076124567474],
299
- },
300
- {
301
- 'reference': ['Male'],
302
- 'groups': [['Female']],
303
- 'values': [0.4602076124567474],
304
- },
305
- ],
306
- 'absolute_min': {
307
- 'groups': [['Female'], ['Male']],
308
- 'value': 0.4602076124567474,
309
- },
310
- },
311
- },
312
- 'model_task': 'BINARY_CLASSIFICATION',
313
- 'total_samples': 1000,
314
- 'valid_samples': 1000,
315
- },
316
- 'api_version': '3.0',
317
- 'kind': 'NORMAL',
318
- }
319
-
320
222
  FETCH_SLICE_RESPONSE_200 = {
321
223
  'data': {
322
224
  'metadata': {
@@ -653,30 +555,6 @@ def test_explain() -> None:
653
555
  )
654
556
 
655
557
 
656
- @responses.activate
657
- def test_fairness() -> None:
658
- responses.get(
659
- url=f'{URL}/v3/models/{MODEL_ID}',
660
- json=MODEL_API_RESPONSE_200,
661
- )
662
- model = Model.get(id_=MODEL_ID)
663
-
664
- responses.post(
665
- url=f'{URL}/v3/analytics/fairness',
666
- json=FAIRNESS_RESPONSE_200,
667
- )
668
- fairness = model.get_fairness(
669
- data_source=DatasetDataSource(
670
- env_type='PRODUCTION',
671
- ),
672
- protected_features=['Gender'],
673
- positive_outcome='Churned',
674
- )
675
- assert fairness == namedtuple('Fairness', FAIRNESS_RESPONSE_200['data'])(
676
- **FAIRNESS_RESPONSE_200['data']
677
- )
678
-
679
-
680
558
  @responses.activate
681
559
  def test_get_slice() -> None:
682
560
  responses.get(
@@ -21,6 +21,8 @@ DATASET_NAME = 'dataset3'
21
21
  BASELINE_ID = 'af05646f-0cef-4638-84c9-0d195df2575d'
22
22
  ALERT_RULE_ID = 'ed8f18e6-c319-4374-8884-71126a6bab85'
23
23
  TEST_EMAILS = ['test@fiddler.ai', 'admin@fiddler.ai']
24
+ TEST_PAGERDUTY_SERVICES = ['service1', 'service2']
25
+ TEST_PAGERDUTY_SEVERITY = 'critical'
24
26
  TEST_WEBHOOKS = [
25
27
  'e20bf4cc-d2cf-4540-baef-d96913b14f1b',
26
28
  '6e796fda-0111-4a72-82cd-f0f219e903e1',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fiddler-client
3
- Version: 3.3.1
3
+ Version: 3.4.0
4
4
  Summary: Python client for Fiddler Platform
5
5
  Home-page: https://fiddler.ai
6
6
  Author: Fiddler Labs
@@ -1 +0,0 @@
1
- 3.3.1
File without changes
File without changes
File without changes
File without changes