Medical-research-skills cellxgene-census
Programmatically query the CZ CELLxGENE Census (61M+ cells) when you need cross-tissue, disease, or cell-type expression data for population-scale queries and reference atlas comparisons.
install
source · Clone the upstream repo
git clone https://github.com/aipoch/medical-research-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/aipoch/medical-research-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/scientific-skills/Evidence Insight/cellxgene-census" ~/.claude/skills/aipoch-medical-research-skills-cellxgene-census && rm -rf "$T"
manifest:
scientific-skills/Evidence Insight/cellxgene-census/SKILL.mdsource content
When to Use
- Cross-tissue or cross-disease expression comparisons (e.g., macrophages across lung/liver/brain; COVID-19 vs control).
- Reference atlas lookups to contextualize findings from your own single-cell dataset (marker validation, expected expression patterns).
- Population-scale metadata exploration (what tissues/cell types/datasets exist; cell counts by cohort attributes).
- Large-scale expression statistics where results exceed RAM and require out-of-core iteration.
- Model training on curated atlas data (e.g., cell-type classifiers) using the experimental PyTorch integration.
Key Features
- Programmatic access to versioned CZ CELLxGENE Census data (human and mouse).
- Query cell (obs) metadata and gene (var) metadata with expressive filter syntax.
- Retrieve expression as AnnData for small/medium queries via
.get_anndata() - Perform out-of-core expression access via SOMA
and chunked iteration.axis_query() - Optional experimental ML utilities (PyTorch dataloaders/datasets).
- Works well with scanpy workflows after loading AnnData.
Dependencies
(latest)cellxgene-census
(latest; required fortiledbsoma
workflows)axis_query()
(latest; used for chunked table batches)pyarrow
(latest; foranndata
results)get_anndata()
(latest; optional, for downstream analysis)scanpy
(latest; optional, for experimental ML integration)torch
Install:
uv pip install cellxgene-census
Optional (experimental ML helpers):
uv pip install cellxgene-census[experimental]
Example Usage
The following script is a complete, runnable example that:
- opens a pinned Census version,
- explores metadata,
- loads a small AnnData slice, and
- runs an out-of-core query to compute a simple statistic.
import numpy as np import cellxgene_census import tiledbsoma as soma def main(): # Pin a version for reproducibility (replace with a valid release if needed) census_version = "2023-07-25" with cellxgene_census.open_soma(census_version=census_version) as census: # 1) Explore summary info summary = census["census_info"]["summary"].read().concat().to_pandas() total_cells = int(summary["total_cell_count"].iloc[0]) print(f"Census version: {census_version}") print(f"Total cells: {total_cells:,}") # 2) Explore obs metadata (always filter primary data unless you want duplicates) obs = cellxgene_census.get_obs( census, "homo_sapiens", value_filter="tissue_general == 'brain' and is_primary_data == True", column_names=["cell_type", "tissue_general", "disease", "donor_id"], ) print(f"Brain (primary) cells returned (metadata only): {len(obs):,}") print("Top cell types:") print(obs["cell_type"].value_counts().head(10)) # 3) Small/medium query -> AnnData in memory adata = cellxgene_census.get_anndata( census=census, organism="Homo sapiens", obs_value_filter=( "cell_type == 'T cell' and disease == 'COVID-19' and is_primary_data == True" ), var_value_filter="feature_name in ['CD4', 'CD8A', 'FOXP3']", obs_column_names=["cell_type", "tissue_general", "disease", "donor_id", "sex"], ) print(adata) print("AnnData X shape:", adata.X.shape) # 4) Large-scale pattern -> out-of-core iteration with axis_query() # Example: compute mean of non-zero expression values for a few genes in brain. query = census["census_data"]["homo_sapiens"].axis_query( measurement_name="RNA", obs_query=soma.AxisQuery( value_filter="tissue_general == 'brain' and is_primary_data == True" ), var_query=soma.AxisQuery( value_filter="feature_name in ['FOXP2', 'TBR1', 'SATB2']" ), ) n = 0 s = 0.0 for batch in query.X("raw").tables(): # batch is a pyarrow.Table with at least: soma_data, soma_dim_0, soma_dim_1 values = batch["soma_data"].to_numpy(zero_copy_only=False) n += values.size s += float(values.sum()) mean_expr = s / n if n else np.nan print(f"Out-of-core mean expression (over returned entries): {mean_expr:.6g}") if __name__ == "__main__": main()
Implementation Details
-
Opening the Census
- Use a context manager to ensure resources are released:
with cellxgene_census.open_soma(...) as census: ...
- For reproducibility, set
; otherwise the latest stable release is used.census_version="YYYY-MM-DD"
- Use a context manager to ensure resources are released:
-
Data model (high level)
- Census data is stored in SOMA collections.
provides summary tables (e.g., datasets, counts).census["census_info"]
provides the experiment for an organism (e.g.,census["census_data"][organism]
).homo_sapiens
-
Filtering semantics
filters cells (obs);obs_value_filter
filters genes (var).var_value_filter- Combine predicates with
/and
; useor
for multi-value membership.in [...] - Best practice: include
to avoid double-counting cells that appear in multiple source datasets.is_primary_data == True
-
Choosing an access pattern
- Use
when the result is expected to fit in memory (commonly < ~100k cells, depending on gene count and sparsity).get_anndata() - Use
+axis_query()
for out-of-core iteration and incremental statistics.query.X("raw").tables()
- Use
-
Expression layers / matrices
- Examples commonly use
to access raw expression.X("raw") - Chunk iteration yields Arrow tables with:
: expression valuessoma_data
: obs (cell) coordinatessoma_dim_0
: var (gene) coordinatessoma_dim_1
- Examples commonly use
-
Optional ML integration
- The
utilities provide PyTorch-friendly datasets/dataloaders for training workflows, typically driven by the same obs/var filtering concepts used elsewhere.cellxgene_census.experimental.ml
- The