From a3736cc950c9b0089670e59e6ae9f85d8d9c7592 Mon Sep 17 00:00:00 2001 From: Christopher Rhodes <christopher.rhodes@embl.de> Date: Thu, 6 Feb 2025 09:49:05 +0100 Subject: [PATCH] read CSVs via a utility method --- model_server/base/api.py | 1 - model_server/base/roiset.py | 6 ++++-- tests/base/test_roiset.py | 6 +++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/model_server/base/api.py b/model_server/base/api.py index 9c69038c..3549633d 100644 --- a/model_server/base/api.py +++ b/model_server/base/api.py @@ -262,5 +262,4 @@ def list_tasks() -> Dict[str, TaskInfo]: @app.get('/phenobase/bounding_box') def get_phenobase_bounding_boxes() -> list: - # TODO: exception when casting this as list return session.phenobase.list_bounding_boxes() \ No newline at end of file diff --git a/model_server/base/roiset.py b/model_server/base/roiset.py index 696922b9..244acc65 100644 --- a/model_server/base/roiset.py +++ b/model_server/base/roiset.py @@ -489,6 +489,9 @@ def insert_level(df: pd.DataFrame, name: str): ], ) +def read_roiset_df(csv_path: Path) -> pd.DataFrame: + return pd.read_csv(csv_path, header=[0, 1], index_col=0) + class RoiSet(object): @@ -1287,7 +1290,6 @@ class RoiSet(object): def acc_obj_ids(self): return make_object_ids_from_df(self._df, self.acc_raw.shape_dict) - # TODO: move to dedicated CSV reader in tests and scripts @classmethod def deserialize(cls, acc_raw: GenericImageDataAccessor, where: Path, prefix='roiset') -> Self: @@ -1299,7 +1301,7 @@ class RoiSet(object): :param prefix: starting prefix of patch mask filenames :return: RoiSet object """ - df = pd.read_csv(where / 'dataframe' / (prefix + '.csv'), header=[0, 1], index_col=0) + df = read_roiset_df(where / 'dataframe' / (prefix + '.csv')) df.index.name = 'label' pa_masks = where / 'tight_patch_masks' is_3d = is_df_3d(df) diff --git a/tests/base/test_roiset.py b/tests/base/test_roiset.py index 07acffa5..fc017505 100644 --- a/tests/base/test_roiset.py +++ b/tests/base/test_roiset.py @@ -7,7 +7,7 @@ from pathlib import Path import pandas as pd from model_server.base.process import smooth -from model_server.base.roiset import filter_df_overlap_bbox, filter_df_overlap_seg, IntensityThresholdInstanceMaskSegmentationModel, RoiSet, RoiSetExportParams, RoiSetMetaParams +from model_server.base.roiset import filter_df_overlap_bbox, filter_df_overlap_seg, IntensityThresholdInstanceMaskSegmentationModel, read_roiset_df, RoiSet, RoiSetExportParams, RoiSetMetaParams from model_server.base.accessors import generate_file_accessor, InMemoryDataAccessor, PatchStack, write_accessor_data_to_file import model_server.conf.testing as conf from model_server.conf.testing import DummyInstanceMaskSegmentationModel @@ -661,7 +661,7 @@ class TestRoiSetMultichannelProducts(BaseTestRoiSetMonoProducts, unittest.TestCa self.assertTrue((where / v).exists()) # test on paths in CSV - test_df = pd.read_csv(where / res['dataframe'], header=[0, 1], index_col=0) + test_df = read_roiset_df(where / res['dataframe']) for c in ['tight_patch_masks_path', 'patches_2d_path', 'patches_2d_annotated_path']: self.assertTrue(c in test_df.patches.columns) for f in test_df.patches[c]: @@ -818,7 +818,7 @@ class TestRoiSetSerialization(unittest.TestCase): ref_roiset.serialize(where_ser, prefix='ref') where_df = where_ser / 'dataframe' / 'ref.csv' self.assertTrue(where_df.exists()) - df_test = pd.read_csv(where_df, header=[0, 1], index_col=0) + df_test = read_roiset_df(where_df) # check that patches are correct size where_patch_masks = where_ser / 'tight_patch_masks' -- GitLab