base.py
1 import abc 2 from typing import List 3 from typing import Optional 4 from typing import Union 5 6 import pandas as pd 7 8 from evidently.legacy.pipeline.column_mapping import ColumnMapping 9 from evidently.legacy.report import Report 10 from evidently.legacy.suite.base_suite import ReportBase 11 from evidently.legacy.test_suite import TestSuite 12 from evidently.legacy.ui.base import Project 13 from evidently.legacy.ui.base import Snapshot 14 from evidently.legacy.ui.base import SnapshotV2 15 from evidently.legacy.ui.datasets import DatasetSourceType 16 from evidently.legacy.ui.datasets import get_dataset_name_output_current 17 from evidently.legacy.ui.datasets import get_dataset_name_output_reference 18 from evidently.legacy.ui.type_aliases import STR_UUID 19 from evidently.legacy.ui.type_aliases import DatasetID 20 from evidently.legacy.ui.type_aliases import OrgID 21 from evidently.legacy.ui.type_aliases import TeamID 22 23 24 class WorkspaceBase(abc.ABC): 25 @abc.abstractmethod 26 def create_project( 27 self, 28 name: str, 29 description: Optional[str] = None, 30 team_id: Optional[TeamID] = None, 31 org_id: Optional[OrgID] = None, 32 ) -> Project: 33 raise NotImplementedError 34 35 @abc.abstractmethod 36 def add_project( 37 self, project: Project, team_id: Optional[TeamID] = None, org_id: Optional[OrgID] = None 38 ) -> Project: 39 raise NotImplementedError 40 41 @abc.abstractmethod 42 def get_project(self, project_id: STR_UUID) -> Optional[Project]: 43 raise NotImplementedError 44 45 @abc.abstractmethod 46 def delete_project(self, project_id: STR_UUID): 47 raise NotImplementedError 48 49 @abc.abstractmethod 50 def list_projects(self, team_id: Optional[TeamID] = None, org_id: Optional[OrgID] = None) -> List[Project]: 51 raise NotImplementedError 52 53 def _upload_snapshot_datasets(self, project_id, snapshot, current, reference, column_mapping, run_from): 54 if current is not None: 55 dataset_name_current = get_dataset_name_output_current(snapshot.is_report, snapshot.id, run_from) 56 snapshot.links.datasets.output.current = self.add_dataset( 57 current, 58 dataset_name_current, 59 project_id, 60 column_mapping=column_mapping, 61 dataset_source=DatasetSourceType.snapshot_builder, 62 ) 63 if reference is not None: 64 dataset_name_reference = get_dataset_name_output_reference(snapshot.is_report, snapshot.id, run_from) 65 snapshot.links.datasets.output.reference = self.add_dataset( 66 reference, 67 dataset_name_reference, 68 project_id, 69 column_mapping=column_mapping, 70 dataset_source=DatasetSourceType.snapshot_builder, 71 ) 72 73 def _add_report_base(self, project_id: STR_UUID, report: ReportBase, include_data: bool = False): 74 snapshot = report.to_snapshot() 75 if include_data: 76 run_from = "ws" 77 current, reference = report.datasets() 78 column_mapping = report.get_column_mapping() 79 self._upload_snapshot_datasets(project_id, snapshot, current, reference, column_mapping, run_from) 80 self.add_snapshot(project_id, snapshot) 81 82 def add_report(self, project_id: STR_UUID, report: Report, include_data: bool = False): 83 self._add_report_base(project_id, report, include_data) 84 85 def add_test_suite(self, project_id: STR_UUID, test_suite: TestSuite, include_data: bool = False): 86 self._add_report_base(project_id, test_suite, include_data) 87 88 @abc.abstractmethod 89 def add_snapshot(self, project_id: STR_UUID, snapshot: Snapshot): 90 raise NotImplementedError 91 92 def add_run(self, project_id: STR_UUID, run: SnapshotV2, include_data: bool = False): 93 from evidently.core.report import _default_input_data_generator 94 from evidently.ui.backport import snapshot_v2_to_v1 95 96 snapshot = snapshot_v2_to_v1(run) 97 if include_data: 98 run_from = "ws" 99 input_data = _default_input_data_generator( 100 run.context, 101 "default", # TODO: parametrize task name 102 ) 103 reference, current = input_data.get_datasets() 104 column_mapping = input_data.column_mapping 105 self._upload_snapshot_datasets(project_id, snapshot, current, reference, column_mapping, run_from) 106 107 self.add_snapshot(project_id, snapshot) 108 109 @abc.abstractmethod 110 def delete_snapshot(self, project_id: STR_UUID, snapshot_id: STR_UUID): 111 raise NotImplementedError 112 113 @abc.abstractmethod 114 def search_project( 115 self, project_name: str, team_id: Optional[TeamID] = None, org_id: Optional[OrgID] = None 116 ) -> List[Project]: 117 raise NotImplementedError 118 119 @abc.abstractmethod 120 def add_dataset( 121 self, 122 data_or_path: Union[str, pd.DataFrame], 123 name: str, 124 project_id: STR_UUID, 125 description: Optional[str] = None, 126 column_mapping: Optional[ColumnMapping] = None, 127 dataset_source: DatasetSourceType = DatasetSourceType.file, 128 ) -> DatasetID: 129 raise NotImplementedError