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

Add AnnData as format #2974

Merged
merged 31 commits into from Apr 6, 2023
Merged
Changes from 1 commit
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
3cb9de1
Add AnnData as format
flying-sheep Aug 8, 2022
a36e1c1
Merge branch 'master' into format-anndata
flying-sheep Aug 12, 2022
9cf89fe
Add anndata to extras
flying-sheep Aug 12, 2022
cf6533a
Merge branch 'master' into format-anndata
flying-sheep Aug 16, 2022
5980212
Merge branch 'master' into format-anndata
flying-sheep Aug 18, 2022
e78122b
Add test skeleton
flying-sheep Aug 19, 2022
9f480da
Improve tests a bit
flying-sheep Aug 19, 2022
a1786e9
Simplify test dependencies
flying-sheep Aug 19, 2022
37b6652
Add changelog entry
flying-sheep Aug 19, 2022
ed5ec66
Merge branch 'master' into format-anndata
sir-sigurd Aug 22, 2022
6795474
remove unrelated changes
flying-sheep Sep 9, 2022
299f868
Merge branch 'master' into format-anndata
flying-sheep Sep 9, 2022
bdde81a
Fix linter complaints
flying-sheep Sep 9, 2022
a1c87f0
Support current AnnData versions
flying-sheep Sep 9, 2022
9733c2a
Merge branch 'master' into format-anndata
flying-sheep Sep 9, 2022
cc6f417
Windows support
flying-sheep Sep 9, 2022
1fac547
Simplify FormatHandlers registration
flying-sheep Sep 9, 2022
07421ac
increase coverage
flying-sheep Sep 9, 2022
d9ff0aa
Merge branch 'master' into format-anndata
flying-sheep Sep 12, 2022
9387b92
Merge branch 'master' into format-anndata
sir-sigurd Sep 13, 2022
02e41cb
Use recommended APIs
flying-sheep Sep 15, 2022
96c2a10
Merge branch 'master' into format-anndata
flying-sheep Sep 15, 2022
aa9a8ec
Skip coverage on ImportError fallback code branches
flying-sheep Sep 15, 2022
c22ce4e
last ones
flying-sheep Sep 15, 2022
b8a8ff6
dep phrasing
flying-sheep Feb 9, 2023
ec0e023
Use `tempfile` import
flying-sheep Feb 9, 2023
90b322d
Merge branch 'master' into format-anndata
sir-sigurd Apr 5, 2023
6e65be6
isort
sir-sigurd Apr 5, 2023
5aa44d9
do not use experimental anndata features
sir-sigurd Apr 5, 2023
345cf15
revert unrelated changes
sir-sigurd Apr 6, 2023
ab5c024
cleanup
sir-sigurd Apr 6, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
58 changes: 58 additions & 0 deletions api/python/quilt3/formats.py
Expand Up @@ -318,6 +318,7 @@ def all_supported_formats(cls):

Python Object Type Serialization Formats
<class 'pandas.core.frame.DataFrame'> [ssv, csv, tsv, parquet]
<class 'anndata.AnnData'> [.h5ad]
<class 'numpy.ndarray'> [npy, npz]
<class 'str'> [md, json, rst, txt]
<class 'dict'> [json]
Expand All @@ -342,6 +343,13 @@ def all_supported_formats(cls):
else:
cls.search(pd.DataFrame) # Force FormatHandlers to register pd.DataFrame as a supported object type

try:
import anndata as ad
except ImportError:
pass
else:
cls.search(ad.AnnData) # Force FormatHandlers to register ad.AnnData as a supported object type

type_map = defaultdict(set)
for handler in cls.registered_handlers:
for t in handler.handled_types:
Expand Down Expand Up @@ -1024,6 +1032,56 @@ def deserialize(self, bytes_obj, meta=None, ext=None, **format_opts):
ParquetFormatHandler().register() # latest is preferred


# noinspection PyPackageRequirements
class AnnDataFormatHandler(BaseFormatHandler):
"""Format for AnnData <--> .h5ad

Format Opts:
The following options may be used anywhere format opts are accepted,
or directly in metadata under `{'format': {'opts': {...: ...}}}`.

compression('gzip', 'lzf', None): applies during serialization only.

"""
name = 'h5ad'
handled_extensions = ['h5ad']
opts = ('compression',)
defaults = dict(
compression='lzf',
)

def handles_type(self, typ: type) -> bool:
# don't load module unless we actually have to use it.
if 'annndata' not in sys.modules:
return False
import anndata as ad
self.handled_types.add(ad.AnnData)
return super().handles_type(typ)

def serialize(self, obj, meta=None, ext=None, **format_opts):
import anndata as ad

opts = self.get_opts(meta, format_opts)
opts_with_defaults = copy.deepcopy(self.defaults)
opts_with_defaults.update(opts)
buf = io.BytesIO()
obj.write(buf, **opts_with_defaults)

return buf.getvalue(), self._update_meta(meta, additions=opts_with_defaults)

def deserialize(self, bytes_obj, meta=None, ext=None, **format_opts):
try:
import anndata as ad
except ImportError:
raise QuiltException("Please install anndata")
flying-sheep marked this conversation as resolved.
Show resolved Hide resolved

buf = io.BytesIO(bytes_obj)
return ad.read_h5ad(buf)


AnnDataFormatHandler().register()


class CompressionRegistry:
"""A collection for organizing `CompressionHandler` objects."""
registered_handlers = []
Expand Down