diff --git a/OTAnalytics/domain/track_dataset.py b/OTAnalytics/domain/track_dataset.py index 0f8199c04..3c2a3825f 100644 --- a/OTAnalytics/domain/track_dataset.py +++ b/OTAnalytics/domain/track_dataset.py @@ -326,11 +326,11 @@ def add_all(self, tracks: Iterable[Track]) -> "TrackGeometryDataset": raise NotImplementedError @abstractmethod - def remove(self, ids: Iterable[TrackId]) -> "TrackGeometryDataset": + def remove(self, ids: Sequence[str]) -> "TrackGeometryDataset": """Remove track geometries with given ids from dataset. Args: - ids (Iterable[TrackId]): the track geometries to remove. + ids (Sequence[str]): the track geometries to remove. Returns: TrackGeometryDataset: the dataset with tracks removed. diff --git a/OTAnalytics/plugin_datastore/python_track_store.py b/OTAnalytics/plugin_datastore/python_track_store.py index 13ffce32f..088eb2e4f 100644 --- a/OTAnalytics/plugin_datastore/python_track_store.py +++ b/OTAnalytics/plugin_datastore/python_track_store.py @@ -349,8 +349,9 @@ def empty(self) -> bool: def __init__( self, values: Optional[dict[TrackId, Track]] = None, - geometry_datasets: dict[RelativeOffsetCoordinate, TrackGeometryDataset] - | None = None, + geometry_datasets: ( + dict[RelativeOffsetCoordinate, TrackGeometryDataset] | None + ) = None, calculator: TrackClassificationCalculator = ByMaxConfidence(), track_geometry_factory: TRACK_GEOMETRY_FACTORY = ( PygeosTrackGeometryDataset.from_track_dataset @@ -449,7 +450,7 @@ def _remove_from_geometry_datasets( ) -> dict[RelativeOffsetCoordinate, TrackGeometryDataset]: updated = {} for offset, geometry_dataset in self._geometry_datasets.items(): - updated[offset] = geometry_dataset.remove(track_ids) + updated[offset] = geometry_dataset.remove([_id.id for _id in track_ids]) return updated def clear(self) -> "PythonTrackDataset": diff --git a/OTAnalytics/plugin_datastore/track_geometry_store/pygeos_store.py b/OTAnalytics/plugin_datastore/track_geometry_store/pygeos_store.py index 50ceaddbf..b9b13286b 100644 --- a/OTAnalytics/plugin_datastore/track_geometry_store/pygeos_store.py +++ b/OTAnalytics/plugin_datastore/track_geometry_store/pygeos_store.py @@ -1,7 +1,7 @@ from bisect import bisect from collections import defaultdict from itertools import chain -from typing import Any, Iterable, Literal +from typing import Any, Iterable, Literal, Sequence from pandas import DataFrame, concat from pygeos import ( @@ -28,11 +28,7 @@ TrackDataset, TrackGeometryDataset, ) -from OTAnalytics.plugin_datastore.track_store import ( - LEVEL_CLASSIFICATION, - LEVEL_TRACK_ID, - PandasTrackDataset, -) +from OTAnalytics.plugin_datastore.track_store import LEVEL_TRACK_ID, PandasTrackDataset TRACK_ID = "track_id" GEOMETRY = "geom" @@ -188,9 +184,7 @@ def __create_entries_from_dataframe( track_size_mask = track_dataset._dataset.groupby( level=LEVEL_TRACK_ID ).transform("size") - filtered_tracks = track_dataset._dataset[track_size_mask > 1].reset_index( - level=LEVEL_CLASSIFICATION, drop=True - ) + filtered_tracks = track_dataset._dataset[track_size_mask > 1] if offset == BASE_GEOMETRY: new_x = filtered_tracks[track.X] @@ -232,10 +226,8 @@ def add_all(self, tracks: Iterable[Track]) -> TrackGeometryDataset: return PygeosTrackGeometryDataset(self._offset, new_dataset) - def remove(self, ids: Iterable[TrackId]) -> TrackGeometryDataset: - updated = self._dataset.drop( - index=[track_id.id for track_id in ids], errors="ignore" - ) + def remove(self, ids: Sequence[str]) -> TrackGeometryDataset: + updated = self._dataset.drop(index=ids, errors="ignore") return PygeosTrackGeometryDataset(self._offset, updated) def get_for(self, track_ids: Iterable[str]) -> "TrackGeometryDataset": @@ -315,9 +307,9 @@ def _next_event( def contained_by_sections( self, sections: list[Section] ) -> dict[TrackId, list[tuple[SectionId, list[bool]]]]: - contains_result: dict[ - TrackId, list[tuple[SectionId, list[bool]]] - ] = defaultdict(list) + contains_result: dict[TrackId, list[tuple[SectionId, list[bool]]]] = ( + defaultdict(list) + ) for _section in sections: section_geom = area_section_to_pygeos(_section) diff --git a/OTAnalytics/plugin_datastore/track_store.py b/OTAnalytics/plugin_datastore/track_store.py index 9511fb6ab..10977af75 100644 --- a/OTAnalytics/plugin_datastore/track_store.py +++ b/OTAnalytics/plugin_datastore/track_store.py @@ -41,7 +41,7 @@ class PandasDetection(Detection): def __init__(self, track_id: str, data: Series): self._track_id = track_id - self._occurrence: Any = data.name[1] # data.name is tuple + self._occurrence: Any = data.name # data.name is tuple self._data = data @property @@ -118,7 +118,7 @@ def id(self) -> TrackId: @property def classification(self) -> str: - return self._data.index.get_level_values(LEVEL_CLASSIFICATION).values[0] + return self._data[track.TRACK_CLASSIFICATION].iloc[0] @property def detections(self) -> list[Detection]: @@ -178,7 +178,6 @@ def calculate(self, detections: DataFrame) -> DataFrame: DEFAULT_CLASSIFICATOR = PandasByMaxConfidence() INDEX_NAMES = [track.TRACK_ID, track.OCCURRENCE] -LEVEL_CLASSIFICATION = track.TRACK_CLASSIFICATION LEVEL_TRACK_ID = track.TRACK_ID LEVEL_OCCURRENCE = track.OCCURRENCE CUT_INDICES = "CUT_INDICES" @@ -238,7 +237,7 @@ def last_occurrence(self) -> datetime | None: def classifications(self) -> frozenset[str]: if not len(self): return frozenset() - return frozenset(self._dataset.index.unique(LEVEL_CLASSIFICATION)) + return frozenset(self._dataset[track.TRACK_CLASSIFICATION].unique()) @property def empty(self) -> bool: @@ -248,8 +247,9 @@ def __init__( self, track_geometry_factory: TRACK_GEOMETRY_FACTORY, dataset: DataFrame | None = None, - geometry_datasets: dict[RelativeOffsetCoordinate, TrackGeometryDataset] - | None = None, + geometry_datasets: ( + dict[RelativeOffsetCoordinate, TrackGeometryDataset] | None + ) = None, calculator: PandasTrackClassificationCalculator = DEFAULT_CLASSIFICATOR, ): if dataset is not None: @@ -292,21 +292,17 @@ def from_list( def from_dataframe( tracks: DataFrame, track_geometry_factory: TRACK_GEOMETRY_FACTORY, - geometry_dataset: dict[RelativeOffsetCoordinate, TrackGeometryDataset] - | None = None, + geometry_dataset: ( + dict[RelativeOffsetCoordinate, TrackGeometryDataset] | None + ) = None, calculator: PandasTrackClassificationCalculator = DEFAULT_CLASSIFICATOR, ) -> "PandasTrackDataset": if tracks.empty: return PandasTrackDataset(track_geometry_factory) - classified_tracks = _assign_track_classification(tracks, calculator) - newly_indexed_tracks = classified_tracks.set_index( - track.TRACK_CLASSIFICATION, append=True - ).reorder_levels([LEVEL_CLASSIFICATION, LEVEL_TRACK_ID, LEVEL_OCCURRENCE]) - return PandasTrackDataset( track_geometry_factory, - newly_indexed_tracks, + classified_tracks, geometry_datasets=geometry_dataset, ) @@ -314,15 +310,11 @@ def add_all(self, other: Iterable[Track]) -> "PandasTrackDataset": new_tracks = self.__get_tracks(other) if new_tracks.empty: return self - if LEVEL_CLASSIFICATION in new_tracks.index.names: - new_tracks = new_tracks.reset_index(level=LEVEL_CLASSIFICATION, drop=True) if self._dataset.empty: return PandasTrackDataset.from_dataframe( new_tracks, self.track_geometry_factory, calculator=self.calculator ) - updated_dataset = pandas.concat( - [self._dataset.reset_index(LEVEL_CLASSIFICATION, drop=True), new_tracks] - ).sort_index() + updated_dataset = pandas.concat([self._dataset, new_tracks]).sort_index() new_track_ids = new_tracks.index.unique(LEVEL_TRACK_ID) new_dataset = updated_dataset.loc[new_track_ids] updated_geometry_dataset = self._add_to_geometry_dataset( @@ -362,26 +354,24 @@ def clear(self) -> "PandasTrackDataset": return PandasTrackDataset(self.track_geometry_factory) def remove(self, track_id: TrackId) -> "PandasTrackDataset": - remaining_tracks = self._dataset.drop( - track_id.id, level=LEVEL_TRACK_ID, errors="ignore" - ) - updated_geometry_datasets = self._remove_from_geometry_dataset({track_id}) + remaining_tracks = self._dataset.drop(track_id.id, errors="ignore") + updated_geometry_datasets = self._remove_from_geometry_dataset([track_id.id]) return PandasTrackDataset.from_dataframe( remaining_tracks, self.track_geometry_factory, updated_geometry_datasets ) def remove_multiple(self, track_ids: set[TrackId]) -> "PandasTrackDataset": track_ids_primitive = [track_id.id for track_id in track_ids] - remaining_tracks = self._dataset.drop( - track_ids_primitive, level=LEVEL_TRACK_ID, errors="ignore" + remaining_tracks = self._dataset.drop(track_ids_primitive, errors="ignore") + updated_geometry_datasets = self._remove_from_geometry_dataset( + track_ids_primitive ) - updated_geometry_datasets = self._remove_from_geometry_dataset(track_ids) return PandasTrackDataset.from_dataframe( remaining_tracks, self.track_geometry_factory, updated_geometry_datasets ) def _remove_from_geometry_dataset( - self, track_ids: Iterable[TrackId] + self, track_ids: Sequence[str] ) -> dict[RelativeOffsetCoordinate, TrackGeometryDataset]: updated_dataset = {} for offset, geometry_dataset in self._geometry_datasets.items(): @@ -399,7 +389,7 @@ def as_list(self) -> list[Track]: return [self.__create_track_flyweight(current) for current in track_ids] def __create_track_flyweight(self, track_id: str) -> Track: - track_frame = self._dataset.loc[:, track_id, :] + track_frame = self._dataset.loc[track_id, :] return PandasTrack(track_id, track_frame) def as_dataframe(self) -> DataFrame: @@ -411,7 +401,7 @@ def split(self, batches: int) -> Sequence["PandasTrackDataset"]: new_batches = [] for batch_ids in batched(self.get_track_ids_as_string(), batch_size): - batch_dataset = self._dataset.loc[:, list(batch_ids), :] + batch_dataset = self._dataset.loc[list(batch_ids), :] batch_geometries = self._get_geometries_for(batch_ids) new_batches.append( PandasTrackDataset.from_dataframe( @@ -446,7 +436,7 @@ def filter_by_min_detection_length(self, length: int) -> "PandasTrackDataset": filtered_ids = detection_counts_per_track[ detection_counts_per_track >= length ].index - filtered_dataset = self._dataset.loc[:, filtered_ids, :] + filtered_dataset = self._dataset.loc[filtered_ids] return PandasTrackDataset( self.track_geometry_factory, filtered_dataset, calculator=self.calculator ) @@ -505,9 +495,7 @@ def get_first_segments(self) -> TrackSegmentDataset: return PandasTrackSegmentDataset(first_segments) def __create_segments(self) -> DataFrame: - data: DataFrame = self._dataset.reset_index( - level=[LEVEL_CLASSIFICATION, LEVEL_OCCURRENCE] - ) + data: DataFrame = self._dataset.reset_index(level=[LEVEL_OCCURRENCE]) first_detections = data.groupby(level=LEVEL_TRACK_ID, group_keys=True) data[START_X] = first_detections[track.X].shift(1) data[START_Y] = first_detections[track.Y].shift(1) @@ -571,9 +559,9 @@ def cut_with_section( for track_id, intersection_points in intersection_points.items() } tracks_to_cut = list(cut_indices.keys()) - cut_tracks_df = self._dataset.loc[:, tracks_to_cut, :].copy() + cut_tracks_df = self._dataset.loc[tracks_to_cut].copy() index_as_df = cut_tracks_df.index.to_frame( - name=[LEVEL_CLASSIFICATION, LEVEL_TRACK_ID, LEVEL_OCCURRENCE] + name=[track.TRACK_ID, track.OCCURRENCE] ) index_as_df["cumcount"] = index_as_df.groupby(level=LEVEL_TRACK_ID).transform( "cumcount" @@ -582,7 +570,7 @@ def cut_with_section( lambda row: self._create_cut_track_id(row, cut_indices), axis=1 ) cut_tracks_df.index = MultiIndex.from_frame( - index_as_df[[LEVEL_CLASSIFICATION, LEVEL_TRACK_ID, LEVEL_OCCURRENCE]] + index_as_df[[track.TRACK_ID, track.OCCURRENCE]] ) return PandasTrackDataset(self.track_geometry_factory, cut_tracks_df), set( intersection_points.keys() @@ -662,11 +650,12 @@ def _get_dataset_with_classes(self, classes: list[str]) -> PandasTrackDataset: if self._other.empty: return self._other dataset = self._other.as_dataframe() - filtered_df = dataset.loc[classes] + mask = dataset[track.TRACK_CLASSIFICATION].isin(classes) + filtered_df = dataset[mask] tracks_to_keep = filtered_df.index.get_level_values(LEVEL_TRACK_ID).unique() tracks_to_remove = tracks_to_keep.symmetric_difference( self._other.get_track_ids_as_string() - ).map(lambda _id: TrackId(_id)) + ) updated_geometry_datasets = self._other._remove_from_geometry_dataset( tracks_to_remove ) @@ -721,8 +710,8 @@ def _assign_track_classification( def _drop_track_classification(data: DataFrame) -> DataFrame: - if LEVEL_CLASSIFICATION in data.index.names: - return data.reset_index(level=LEVEL_CLASSIFICATION, drop=True) + if track.TRACK_CLASSIFICATION in data.columns: + return data.drop(columns=[track.TRACK_CLASSIFICATION]) return data diff --git a/OTAnalytics/plugin_filter/dataframe_filter.py b/OTAnalytics/plugin_filter/dataframe_filter.py index 320f195e4..e20567c7d 100644 --- a/OTAnalytics/plugin_filter/dataframe_filter.py +++ b/OTAnalytics/plugin_filter/dataframe_filter.py @@ -66,10 +66,6 @@ def apply(self, iterable: Iterable[DataFrame]) -> Iterable[DataFrame]: return iterable -INDEX_LEVEL_CLASSIFICATION = 0 -INDEX_LEVEL_OCCURRENCE = 2 - - class DataFrameStartsAtOrAfterDate(DataFramePredicate): """Checks if the DataFrame rows start at or after date. @@ -93,7 +89,7 @@ def test(self, to_test: DataFrame) -> DataFrame: "must be index of DataFrame for filtering to work." ) return to_test[ - to_test.index.get_level_values(INDEX_LEVEL_OCCURRENCE) >= self._start_date + to_test.index.get_level_values(track.OCCURRENCE) >= self._start_date ] @@ -120,7 +116,7 @@ def test(self, to_test: DataFrame) -> DataFrame: "must be index of DataFrame for filtering to work." ) return to_test[ - to_test.index.get_level_values(INDEX_LEVEL_OCCURRENCE) <= self._end_date + to_test.index.get_level_values(track.OCCURRENCE) <= self._end_date ] @@ -141,11 +137,7 @@ def __init__( self._classifications = classifications def test(self, to_test: DataFrame) -> DataFrame: - return to_test.loc[ - to_test.index.get_level_values(INDEX_LEVEL_CLASSIFICATION).intersection( - self._classifications, sort=True - ) - ] + return to_test.loc[to_test[self._column_name].isin(self._classifications)] class DataFrameFilterBuilder(FilterBuilder[DataFrame, DataFrame]): diff --git a/OTAnalytics/plugin_prototypes/track_visualization/track_viz.py b/OTAnalytics/plugin_prototypes/track_visualization/track_viz.py index 8bf45268e..18c44d55b 100644 --- a/OTAnalytics/plugin_prototypes/track_visualization/track_viz.py +++ b/OTAnalytics/plugin_prototypes/track_visualization/track_viz.py @@ -292,21 +292,15 @@ def get_data(self) -> DataFrame: if data.empty: return data - if not list(data.index.names) == [ - track.TRACK_CLASSIFICATION, - track.TRACK_ID, - track.OCCURRENCE, - ]: + if not list(data.index.names) == [track.TRACK_ID, track.OCCURRENCE]: raise ValueError( - f"{track.TRACK_CLASSIFICATION},{track.TRACK_ID}, {track.OCCURRENCE} " + f"{track.TRACK_ID}, {track.OCCURRENCE} " "must be index of DataFrame for filtering to work." ) ids = [track_id.id for track_id in self._filter.get_ids()] - intersection_of_ids = ( - data.index.get_level_values(track.TRACK_ID).unique().intersection(ids) - ) - return data.loc[:, intersection_of_ids, :] + intersection_of_ids = data.index.unique(level=track.TRACK_ID).intersection(ids) + return data.loc[intersection_of_ids] class FilterByClassification(PandasDataFrameProvider): @@ -422,9 +416,9 @@ def _convert_tracks(self, tracks: Iterable[Track]) -> DataFrame: ): for detection in current_track.detections: detection_dict = detection.to_dict() - detection_dict[ - track.TRACK_CLASSIFICATION - ] = current_track.classification + detection_dict[track.TRACK_CLASSIFICATION] = ( + current_track.classification + ) prepared.append(detection_dict) if not prepared: @@ -621,7 +615,7 @@ def _plot_dataframe(self, track_df: DataFrame, axes: Axes) -> None: x="x", y="y", hue=track.TRACK_CLASSIFICATION, - data=track_df.reset_index(), + data=track_df, units=track.TRACK_ID, linewidth=0.6, estimator=None, @@ -668,11 +662,10 @@ def _plot_dataframe(self, track_df: DataFrame, axes: Axes) -> None: track_df (DataFrame): tracks to plot start and end points of axes (Axes): axes to plot on """ - df_index_reset = track_df.reset_index() - track_df_start = df_index_reset.groupby(track.TRACK_ID).first().reset_index() + track_df_start = track_df.groupby(track.TRACK_ID).first().reset_index() track_df_start["type"] = "start" - track_df_end = df_index_reset.groupby(track.TRACK_ID).last().reset_index() + track_df_end = track_df.groupby(track.TRACK_ID).last().reset_index() track_df_end["type"] = "end" track_df_start_end = pandas.concat([track_df_start, track_df_end]).sort_values( diff --git a/OTAnalytics/plugin_ui/visualization/visualization.py b/OTAnalytics/plugin_ui/visualization/visualization.py index 8012d5454..2f17fcf1f 100644 --- a/OTAnalytics/plugin_ui/visualization/visualization.py +++ b/OTAnalytics/plugin_ui/visualization/visualization.py @@ -383,6 +383,8 @@ def _create_highlight_tracks_not_assigned_to_flows_plotter( invalidate = cached_plotter.invalidate_cache self._event_repository.register_observer(invalidate) flow_state.selected_flows.register(invalidate) + self._track_view_state.filter_element.register(invalidate) + self._track_view_state.track_offset.register(invalidate) return cached_plotter def _get_event_data_provider_class_filter(self) -> PandasDataFrameProvider: diff --git a/tests/OTAnalytics/plugin_datastore/test_python_track_storage.py b/tests/OTAnalytics/plugin_datastore/test_python_track_storage.py index ba74b7062..c8bd6c881 100644 --- a/tests/OTAnalytics/plugin_datastore/test_python_track_storage.py +++ b/tests/OTAnalytics/plugin_datastore/test_python_track_storage.py @@ -416,7 +416,7 @@ def test_remove(self, car_track: Track, pedestrian_track: Track) -> None: assert result._geometry_datasets == { RelativeOffsetCoordinate(0, 0): updated_geometry_dataset } - geometry_dataset.remove.assert_called_once_with({pedestrian_track.id}) + geometry_dataset.remove.assert_called_once_with([pedestrian_track.id.id]) def test_remove_multiple(self, car_track: Track, pedestrian_track: Track) -> None: geometry_dataset, updated_geometry_dataset = create_mock_geometry_dataset() @@ -433,9 +433,10 @@ def test_remove_multiple(self, car_track: Track, pedestrian_track: Track) -> Non assert result._geometry_datasets == { RelativeOffsetCoordinate(0, 0): updated_geometry_dataset } - geometry_dataset.remove.assert_called_once_with( - {car_track.id, pedestrian_track.id} - ) + assert set(geometry_dataset.remove.call_args_list[0][0][0]) == { + car_track.id.id, + pedestrian_track.id.id, + } @pytest.mark.parametrize( "num_tracks,batches,expected_batches", [(10, 1, 1), (10, 4, 4), (3, 4, 3)] diff --git a/tests/OTAnalytics/plugin_datastore/test_track_store.py b/tests/OTAnalytics/plugin_datastore/test_track_store.py index 44d288ad5..68c87f35d 100644 --- a/tests/OTAnalytics/plugin_datastore/test_track_store.py +++ b/tests/OTAnalytics/plugin_datastore/test_track_store.py @@ -48,7 +48,6 @@ def test_convert_frame_number_to_python_data_type(self) -> None: detection_values = python_detection.to_dict() detection_values[track.FRAME] = numpy.int64(new_frame_number) data = Series(detection_values) - data.name = (data[track.CLASSIFICATION], data[track.OCCURRENCE]) detection = PandasDetection(track_id=track_id, data=data) assert type(detection.frame) is int @@ -60,7 +59,7 @@ def test_properties(self) -> None: python_detection = builder.build_detections()[0] data = Series( python_detection.to_dict(), - name=("car", python_detection.occurrence), + name=python_detection.occurrence, ) pandas_detection = PandasDetection(python_detection.track_id.id, data) @@ -77,12 +76,8 @@ def test_properties(self) -> None: builder.append_detection() python_track = builder.build_track() detections = [detection.to_dict() for detection in python_track.detections] - data = DataFrame(detections) + data = DataFrame(detections).set_index([track.OCCURRENCE]).sort_index() data[track.TRACK_CLASSIFICATION] = data[track.CLASSIFICATION] - data = data.set_index( - [track.TRACK_CLASSIFICATION, track.OCCURRENCE] - ).sort_index() - data = data.drop([track.TRACK_ID], axis=1) pandas_track = PandasTrack(python_track.id.id, data) @@ -326,7 +321,7 @@ def test_remove(self, track_geometry_factory: TRACK_GEOMETRY_FACTORY) -> None: ).as_list(), ): assert_equal_track_properties(actual, expected) - geometry_dataset.remove.assert_called_once_with({first_track.id}) + geometry_dataset.remove.assert_called_once_with([first_track.id.id]) assert removed_track_set._geometry_datasets == { RelativeOffsetCoordinate(0, 0): updated_geometry_dataset, } @@ -354,7 +349,10 @@ def test_remove_multiple( dataset.remove_multiple(track_ids_to_remove), ) assert_equal_track_properties(list(removed_track_set)[0], third_track) - geometry_dataset.remove.assert_called_once_with(track_ids_to_remove) + assert set(geometry_dataset.remove.call_args_list[0][0][0]) == { + first_track.id.id, + second_track.id.id, + } assert removed_track_set._geometry_datasets == { RelativeOffsetCoordinate(0, 0): updated_geometry_dataset, } diff --git a/tests/OTAnalytics/plugin_datastore/track_geometry_store/test_pygeos_store.py b/tests/OTAnalytics/plugin_datastore/track_geometry_store/test_pygeos_store.py index 4be211df5..22f9fa559 100644 --- a/tests/OTAnalytics/plugin_datastore/track_geometry_store/test_pygeos_store.py +++ b/tests/OTAnalytics/plugin_datastore/track_geometry_store/test_pygeos_store.py @@ -500,7 +500,7 @@ def test_remove_from_filled_dataset( geometry_dataset = PygeosTrackGeometryDataset.from_track_dataset( track_dataset, offset ) - result = geometry_dataset.remove([first_track.id]) + result = geometry_dataset.remove([first_track.id.id]) expected = create_geometry_dataset_from([second_track], offset) assert_track_geometry_dataset_equals(result, expected) @@ -509,7 +509,7 @@ def test_remove_from_empty_dataset( self, first_track: Track, offset: RelativeOffsetCoordinate ) -> None: geometry_dataset = PygeosTrackGeometryDataset(offset) - result = geometry_dataset.remove([first_track.id]) + result = geometry_dataset.remove([first_track.id.id]) assert_track_geometry_dataset_equals(result, PygeosTrackGeometryDataset(offset)) @pytest.mark.parametrize("offset", [BASE_GEOMETRY, DEFAULT_TRACK_OFFSET]) @@ -520,7 +520,7 @@ def test_remove_missing( geometry_dataset = PygeosTrackGeometryDataset.from_track_dataset( track_dataset, offset ) - result = geometry_dataset.remove([second_track.id]) + result = geometry_dataset.remove([second_track.id.id]) expected = create_geometry_dataset_from([first_track], offset) assert_track_geometry_dataset_equals(result, expected) diff --git a/tests/OTAnalytics/plugin_filter/test_dataframe_filter.py b/tests/OTAnalytics/plugin_filter/test_dataframe_filter.py index 401ad8b69..d332b8ac8 100644 --- a/tests/OTAnalytics/plugin_filter/test_dataframe_filter.py +++ b/tests/OTAnalytics/plugin_filter/test_dataframe_filter.py @@ -33,12 +33,8 @@ def convert_tracks_to_dataframe(tracks: Iterable[Track]) -> DataFrame: for current_track in tracks: detections.extend(current_track.detections) prepared = [detection.to_dict() for detection in detections] - converted = DataFrame(prepared) - converted[track.TRACK_CLASSIFICATION] = converted[track.CLASSIFICATION] - converted = converted.set_index( - [track.TRACK_CLASSIFICATION, track.TRACK_ID, track.OCCURRENCE] - ) - return converted.sort_index() + converted = DataFrame(prepared).set_index([track.TRACK_ID, track.OCCURRENCE]) + return converted.sort_values([track.TRACK_ID, track.FRAME]) @pytest.fixture diff --git a/tests/OTAnalytics/plugin_prototypes/track_visualization/test_track_viz.py b/tests/OTAnalytics/plugin_prototypes/track_visualization/test_track_viz.py index 17a37a8f2..434a4d21c 100644 --- a/tests/OTAnalytics/plugin_prototypes/track_visualization/test_track_viz.py +++ b/tests/OTAnalytics/plugin_prototypes/track_visualization/test_track_viz.py @@ -426,13 +426,10 @@ def filter_input(self) -> DataFrame: d = { track.TRACK_ID: ["1", "2"], track.OCCURRENCE: [first_occurrence, second_occurrence], - track.TRACK_CLASSIFICATION: "Car", "data": [Mock(), Mock()], } df = DataFrame(data=d) - return df.set_index( - [track.TRACK_CLASSIFICATION, track.TRACK_ID, track.OCCURRENCE] - ) + return df.set_index([track.TRACK_ID, track.OCCURRENCE]) @pytest.fixture def filter_result(self) -> Mock: diff --git a/tests/benchmark_otanalytics.py b/tests/benchmark_otanalytics.py index 8b2d4665b..0e254f30b 100644 --- a/tests/benchmark_otanalytics.py +++ b/tests/benchmark_otanalytics.py @@ -390,7 +390,7 @@ def use_case_provider_empty_filtered( class TestBenchmarkTrackParser: ROUNDS = 1 - ITERATIONS = 5 + ITERATIONS = 1 WARMUP_ROUNDS = 0 def test_load_15min( @@ -410,7 +410,7 @@ def test_load_15min( class TestBenchmarkTracksIntersectingSections: ROUNDS = 1 - ITERATIONS = 5 + ITERATIONS = 1 WARMUP_ROUNDS = 0 def test_15min( @@ -442,7 +442,7 @@ def test_15min_filtered( class TestBenchmarkCreateEvents: ROUNDS = 1 - ITERATIONS = 5 + ITERATIONS = 1 WARMUP_ROUNDS = 0 def test_15min( @@ -472,7 +472,7 @@ def test_15min_filtered( class TestBenchmarkExportCounting: ROUNDS = 1 - ITERATIONS = 5 + ITERATIONS = 1 WARMUP_ROUNDS = 0 def test_15min( @@ -514,7 +514,7 @@ def test_15min_filtered( class TestBenchmarkCuttingSection: ROUNDS = 1 - ITERATIONS = 5 + ITERATIONS = 1 WARMUP_ROUNDS = 0 def test_15min(