Skip to main content

Memory-efficient streaming analysis of large-scale CRISPR and Perturb-seq screens on disk-backed AnnData files

Project description

crispyx

License: MIT Python 3.10+ PyPI PyPI Downloads Tests

Motivation

Genome-wide CRISPR screens routinely produce datasets with hundreds of thousands of cells and tens of thousands of genes. Standard single-cell analysis toolkits (Scanpy, Pertpy) load the entire count matrix into memory, which can require 30–100+ GB of RAM and makes many screens impractical to analyse on commodity hardware or shared HPC nodes with per-job memory limits.

crispyx solves this by streaming data directly from on-disk AnnData (.h5ad) files. Quality control, normalisation, pseudo-bulk aggregation, and differential expression all operate without materialising the full matrix in memory, so even the largest screens can be processed with modest resources.

Features

  • Streaming QC & preprocessing – Filter cells, perturbations, and genes; normalise and log-transform; CSC-aware streaming with format_mismatch_policy; all without loading the full matrix into memory
  • Pseudo-bulk aggregation – Average log expression and pseudo-bulk count matrices for effect size estimation, with optional batch correction (batch_column) that combines within-batch effects using a disk-backed, bounded-memory accumulator
  • Differential expression – t-test, Wilcoxon rank-sum (including batch-stratified / van Elteren test via batch_column), and negative binomial GLM with apeGLM LFC shrinkage; multi-core support and adaptive memory management; per-condition low-expression filtering to exclude genes that are near-zero in both groups
  • Dimension reduction – Memory-efficient PCA and KNN graph construction on backed data
  • Scanpy-compatible API & plotting – Familiar cx.pp, cx.pb, cx.tl, and cx.pl namespaces; Scanpy-style rank genes plots, volcano, MA, PCA, UMAP, QC summaries, and overlap heatmaps
  • Data preparation utilities – Edit backed metadata without loading X; standardise gene names; normalise perturbation labels; auto-detect metadata columns
  • HPC-ready – Resume/checkpoint for long-running jobs; configurable memory_limit_gb; Docker and Singularity support

Quick Start

import crispyx as cx

# Open dataset without loading into memory
adata = cx.read_h5ad_ondisk("data/demo_benchmark.h5ad")

# Quality control with adaptive thresholds
adata = cx.pp.qc_summary(
    adata,
    perturbation_column="perturbation",
    min_genes=5,
    min_cells_per_perturbation=5,
)

# Differential expression
adata = cx.tl.rank_genes_groups(
    adata,
    perturbation_column="perturbation",
    method="wilcoxon",  # or "t-test", "nb_glm"
)

# Access results
print(adata.uns["rank_genes_groups"])
de_results = adata.uns["rank_genes_groups"].load()

For the full workflow (normalisation, PCA, pseudo-bulk, NB-GLM, LFC shrinkage, plotting, data preparation utilities), see the Usage Guide and the tutorial notebook.

Performance

Benchmarked across 12 CRISPR screen datasets (21k–1.97M cells), crispyx consistently outperforms Scanpy, Pertpy/PyDESeq2, and edgeR in both speed and memory:

Metric crispyx vs Scanpy crispyx vs Pertpy/PyDESeq2
t-test 2–11× faster
Wilcoxon 2–43× faster
NB-GLM 2× faster, completes where Pertpy OOMs
Peak memory 2–6× lower Runs within 64 GB where Pertpy exceeds 120 GB
Accuracy Pearson r > 0.999 vs Scanpy Pearson r > 0.97 vs PyDESeq2

crispyx succeeds on all 12 datasets, while Scanpy times out or OOMs on the largest screens and Pertpy/edgeR fail on most genome-wide datasets.

Benchmark results: crispyx vs reference methods

See benchmarking/ for full results and reproduction scripts.

Installation

pip install crispyx

For development (editable install with all extras):

git clone https://github.com/jaydu1/crispyx.git
cd crispyx
pip install -e ".[test,benchmark,docs]"

crispyx supports Python 3.10–3.12 and is compatible with recent releases of the scientific stack, including anndata >= 0.13 and pandas >= 3.0 (where string metadata is stored on disk using the nullable-string encoding).

Benchmarking

cd benchmarking
./run_benchmark.sh config/Adamson.yaml       # single dataset
./run_benchmark.sh config/*.yaml             # all datasets

See benchmarking/README.md for configuration options and output structure.

Testing

pytest

Documentation

sphinx-build docs docs/_build

Acknowledgements

crispyx builds on the foundational work of Scanpy (Wolf et al., 2018), Pertpy, PyDESeq2 (Muzellec et al., 2023), and AnnData (Virshup et al., 2024). We gratefully acknowledge these projects for establishing the single-cell analysis ecosystem in Python; crispyx extends their APIs and algorithmic designs to enable memory-efficient, streaming computation for large-scale CRISPR screen datasets.

Contributing

Suggestions, bug reports, and contributions are welcome! Please open an issue or submit a pull request.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

crispyx-0.0.8.tar.gz (274.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

crispyx-0.0.8-py3-none-any.whl (215.0 kB view details)

Uploaded Python 3

File details

Details for the file crispyx-0.0.8.tar.gz.

File metadata

  • Download URL: crispyx-0.0.8.tar.gz
  • Upload date:
  • Size: 274.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for crispyx-0.0.8.tar.gz
Algorithm Hash digest
SHA256 e2009b6c760bb9098052f5b69902a40634559e2983299f0413f2d72a3a86c009
MD5 9debec28e995b53f7d577d2f1fb507b9
BLAKE2b-256 0643d62aa7e9c63bbd0cd8ff7e9a31411e602bf044f726a4b847e9faa30dd0eb

See more details on using hashes here.

Provenance

The following attestation bundles were made for crispyx-0.0.8.tar.gz:

Publisher: publish.yml on jaydu1/crispyx

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file crispyx-0.0.8-py3-none-any.whl.

File metadata

  • Download URL: crispyx-0.0.8-py3-none-any.whl
  • Upload date:
  • Size: 215.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for crispyx-0.0.8-py3-none-any.whl
Algorithm Hash digest
SHA256 381ecf0261589fb9d9835340d9423dc5a923ecd5d455d88ae449698084a2135e
MD5 42b3f559574d4aefaeb806aee50f354a
BLAKE2b-256 3f4b0193d3f47483fbc5ec7dafa8d86d7b7e6f96e4b3cd9855348b1d97635502

See more details on using hashes here.

Provenance

The following attestation bundles were made for crispyx-0.0.8-py3-none-any.whl:

Publisher: publish.yml on jaydu1/crispyx

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page