Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support ByLabelValue in field iterators. #1450

Merged
merged 2 commits into from
Jan 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 26 additions & 3 deletions src/evidently/future/backport.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
from evidently.renderers.base_renderer import MetricRenderer
from evidently.renderers.base_renderer import default_renderer
from evidently.suite.base_suite import ContextPayload
from evidently.suite.base_suite import RunMetadata
from evidently.suite.base_suite import Snapshot as SnapshotV1
from evidently.tests.base_test import Test as TestV1
from evidently.tests.base_test import TestParameters
Expand All @@ -48,6 +49,7 @@
from evidently.ui.type_aliases import ProjectID
from evidently.utils.data_preprocessing import ColumnDefinition
from evidently.utils.data_preprocessing import DataDefinition as DataDefinitionV1
from evidently.utils.data_preprocessing import FeatureDefinition
from evidently.utils.data_preprocessing import PredictionColumns

if TYPE_CHECKING:
Expand Down Expand Up @@ -126,9 +128,9 @@ def metric_v2_to_v1(metric: MetricV2) -> MetricV1:
def data_definition_v2_to_v1(dd: DataDefinition, reference_present: bool) -> DataDefinitionV1:
"""For now, only columns field is used"""
columns: Dict[str, ColumnDefinition] = {
**{col: ColumnDefinition(col, ColumnType.Numerical) for col in dd.get_numerical_columns()},
**{col: ColumnDefinition(col, ColumnType.Text) for col in dd.get_text_columns()},
**{col: ColumnDefinition(col, ColumnType.Categorical) for col in dd.get_categorical_columns()},
**{col: ColumnDefinition(col, ColumnType.Numerical) for col in (dd.numerical_columns or [])},
**{col: ColumnDefinition(col, ColumnType.Text) for col in (dd.text_columns or [])},
**{col: ColumnDefinition(col, ColumnType.Categorical) for col in (dd.categorical_columns or [])},
}
target: Optional[ColumnDefinition] = None
prediction_columns: Optional[PredictionColumns] = None
Expand Down Expand Up @@ -183,6 +185,26 @@ def snapshot_v2_to_v1(snapshot: SnapshotV2) -> SnapshotV1:
)
)

descriptors = {
x: FeatureDefinition(
feature_name=x,
display_name=x,
feature_type=ColumnType.Categorical,
feature_class="",
)
for x in context.data_definition.categorical_descriptors
}
descriptors.update(
{
x: FeatureDefinition(
feature_name=x,
display_name=x,
feature_type=ColumnType.Numerical,
feature_class="",
)
for x in context.data_definition.numerical_descriptors
}
)
snapshot = SnapshotV1(
id=new_id(),
name="",
Expand All @@ -195,6 +217,7 @@ def snapshot_v2_to_v1(snapshot: SnapshotV2) -> SnapshotV1:
tests=tests,
test_results=test_results,
data_definition=data_definition_v2_to_v1(context.data_definition, context._input_data[1] is not None),
run_metadata=RunMetadata(descriptors=descriptors),
),
metrics_ids=list(range(len(metrics))),
test_ids=[],
Expand Down
12 changes: 12 additions & 0 deletions src/evidently/ui/storage/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,15 @@ def iterate_obj_fields(
if es is not None:
yield from es
return

from evidently.future.backport import ByLabelValueV1

if isinstance(obj, ByLabelValueV1):
yield from (
[(".".join(paths + ["values"]), obj.values)]
+ [(".".join(paths + ["values", str(key)]), str(val)) for key, val in obj.values.items()]
)
return
if isinstance(obj, list):
return
if isinstance(obj, dict):
Expand All @@ -40,6 +49,9 @@ def iterate_obj_fields(

def iterate_obj_float_fields(obj: Any, paths: List[str]) -> Iterator[Tuple[str, str]]:
for path, value in iterate_obj_fields(obj, paths):
if isinstance(value, dict):
yield path, json.dumps(value, cls=NumpyEncoder)
continue
if isinstance(value, BaseResult) and value.__config__.extract_as_obj:
yield path, json.dumps(value.dict(), cls=NumpyEncoder)
continue
Expand Down
Loading