Source code for pytximport.utils._replace_transcript_ids_with_names
from pathlib import Path
from typing import Optional, Union
import anndata as ad
import pandas as pd
import xarray as xr
from ._remove_transcript_version import remove_transcript_version
[docs]
def replace_transcript_ids_with_names(
transcript_data: Union[ad.AnnData, xr.Dataset],
transcript_name_map: Union[pd.DataFrame, Union[str, Path]],
) -> Union[ad.AnnData, xr.Dataset]:
"""Replace transcript IDs with transcript names.
Args:
transcript_data (Union[ad.AnnData, xr.Dataset]): The transcript-level expression data.
transcript_name_map (Union[pd.DataFrame, Union[str, Path]]): The mapping from transcripts to
names. Contains two columns: `transcript_id` and `transcript_name`.
Returns:
Union[ad.AnnData, xr.Dataset]: The transcript-level expression data with the transcript names.
"""
# Read the transcript to gene mapping
if isinstance(transcript_name_map, str) or isinstance(transcript_name_map, Path):
transcript_name_map = pd.read_table(
transcript_name_map,
header=0,
engine="c",
usecols=["transcript_id", "transcript_name"],
dtype=str,
)
transcript_name_map = transcript_name_map.drop_duplicates()
# Check that transcript_id and transcript_name are present in the mapping
assert "transcript_id" in transcript_name_map.columns, "The mapping does not contain a `transcript_id` column."
assert "transcript_name" in transcript_name_map.columns, "The mapping does not contain a `transcript_name` column."
# Check whether the transcript_data is an AnnData object and convert it to an xr.Dataset
return_as_anndata = False
if isinstance(transcript_data, ad.AnnData):
return_as_anndata = True
transcript_data = xr.Dataset(
data_vars={
"counts": xr.DataArray(transcript_data.X.T, dims=["transcript_id", "file"]),
"length": xr.DataArray(transcript_data.obsm["length"].T, dims=["transcript_id", "file"]),
"abundance": xr.DataArray(transcript_data.obsm["abundance"].T, dims=["transcript_id", "file"]),
},
coords={
"transcript_id": transcript_data.var.index.values,
"file_path": transcript_data.obs.index.values,
},
)
# Remove the transcript version
transcript_data, transcript_name_map, _ = remove_transcript_version( # type: ignore
transcript_data,
transcript_name_map,
)
transcript_name_dict = transcript_name_map.set_index("transcript_id")["transcript_name"].to_dict()
transcript_names = transcript_data["transcript_id"].to_series().map(transcript_name_dict).values
# Replace the transcript_id with the transcript_name
transcript_data.coords["transcript_id"] = transcript_names
if return_as_anndata:
return ad.AnnData(
X=transcript_data["counts"].values.T,
obs=pd.DataFrame(index=transcript_data.coords["file_path"].values),
var=pd.DataFrame(index=transcript_data.coords["transcript_id"].values),
obsm={
"length": transcript_data["length"].values.T,
"abundance": transcript_data["abundance"].values.T,
},
)
return transcript_data