Skip to content

Commit e512740

Browse files
committed
refactor: include more robust error handling for dataframes when collecting gene data
Signed-off-by: Josh Loecker <joshloecker@icloud.com>
1 parent b917ac1 commit e512740

1 file changed

Lines changed: 45 additions & 13 deletions

File tree

main/como/utils.py

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ async def _format_determination(
135135

136136

137137
async def get_missing_gene_data(values: list[str] | pd.DataFrame, taxon_id: int | str | Taxon) -> pd.DataFrame:
138-
if isinstance(values, list):
138+
if isinstance(values, list) and not isinstance(values, pd.DataFrame): # second isinstance required for static type check to be happy
139139
gene_type = await determine_gene_type(values)
140140
if all(v == "gene_symbol" for v in gene_type.values()):
141141
return await gene_symbol_to_ensembl_and_gene_id(values, taxon=taxon_id)
@@ -144,19 +144,51 @@ async def get_missing_gene_data(values: list[str] | pd.DataFrame, taxon_id: int
144144
elif all(v == "entrez_gene_id" for v in gene_type.values()):
145145
return await gene_id_to_ensembl_and_gene_symbol(ids=values, taxon=taxon_id)
146146
else:
147-
logger.critical("Gene data must be of the same type (i.e., all Ensembl, Entrez, or Gene Symbols)")
148-
raise ValueError("Gene data must be of the same type (i.e., all Ensembl, Entrez, or Gene Symbols)")
149-
else:
150-
values: pd.DataFrame # Re-define type to assist in type hinting
151-
if "gene_symbol" in values:
152-
return await get_missing_gene_data(values["gene_symbol"].tolist(), taxon_id=taxon_id)
153-
elif "entrez_gene_id" in values:
154-
return await get_missing_gene_data(values["entrez_gene_id"].tolist(), taxon_id=taxon_id)
155-
elif "ensembl_gene_id" in values:
156-
return await get_missing_gene_data(values["ensembl_gene_id"].tolist(), taxon_id=taxon_id)
147+
_log_and_raise_error(
148+
message="Gene data must be of the same type (i.e., all Ensembl, Entrez, or Gene Symbols)",
149+
error=ValueError,
150+
level=LogLevel.CRITICAL,
151+
)
152+
elif isinstance(values, pd.DataFrame):
153+
# raise error if duplicate column names exist
154+
if any(values.columns.duplicated(keep=False)):
155+
duplicate_cols = values.columns[values.columns.duplicated(keep=False)].unique().tolist()
156+
_log_and_raise_error(
157+
message=f"Duplicate column names exist! This will result in an error processing data. Duplicates: {','.join(duplicate_cols)}",
158+
error=ValueError,
159+
level=LogLevel.CRITICAL,
160+
)
161+
if "gene_symbol" in itertools.chain(values.columns, [values.index.name]):
162+
return await get_missing_gene_data(
163+
values["gene_symbol"].tolist() if "gene_symbol" in values.columns else values.index.tolist(),
164+
taxon_id=taxon_id,
165+
)
166+
elif "entrez_gene_id" in itertools.chain(values.columns, [values.index.name]):
167+
return await get_missing_gene_data(
168+
values["entrez_gene_id"].tolist() if "entrez_gene_id" in values.columns else values.index.tolist(),
169+
taxon_id=taxon_id,
170+
)
171+
elif "ensembl_gene_id" in itertools.chain(values.columns, [values.index.name]):
172+
return await get_missing_gene_data(
173+
values["ensembl_gene_id"].tolist() if "ensembl_gene_id" in values.columns else values.index.tolist(),
174+
taxon_id=taxon_id,
175+
)
157176
else:
158-
logger.critical("Unable to find 'gene_symbol', 'entrez_gene_id', or 'ensembl_gene_id' in the input matrix.")
159-
raise ValueError("Unable to find 'gene_symbol', 'entrez_gene_id', or 'ensembl_gene_id' in the input matrix.")
177+
_log_and_raise_error(
178+
message="Unable to find 'gene_symbol', 'entrez_gene_id', or 'ensembl_gene_id' in the input matrix.",
179+
error=ValueError,
180+
level=LogLevel.CRITICAL,
181+
)
182+
else:
183+
_log_and_raise_error(
184+
message=f"Values must be a list of strings or a pandas DataFrame, got: {type(values)}",
185+
error=TypeError,
186+
level=LogLevel.CRITICAL,
187+
)
188+
189+
190+
@overload
191+
async def _read_file(path: None, h5ad_as_df: Literal[True] | Literal[False], **kwargs) -> None: ...
160192

161193

162194
@overload

0 commit comments

Comments
 (0)