scrna4/6 Jupyter Notebook lamindata

Analyze a collection in memory#

Here, we’ll analyze the growing collection by loading it into memory. This is only possible if it’s not too large. If your data is large, you’ll likely want to iterate over the collection to train a model, the topic of the next page (scrna5/6).

import lamindb as ln
import bionty as bt
💡 connected lamindb: testuser1/test-scrna
ln.settings.transform.stem_uid = "mfWKm8OtAzp8"
ln.settings.transform.version = "1"
ln.track()
💡 notebook imports: bionty==0.42.9 lamindb==0.71.0 scanpy==1.10.1
💡 saved: Transform(uid='mfWKm8OtAzp85zKv', name='Analyze a collection in memory', key='scrna4', version='1', type='notebook', updated_at=2024-05-01 18:52:16 UTC, created_by_id=1)
💡 saved: Run(uid='rXWU1VIogkDg4mzaItxF', transform_id=4, created_by_id=1)
ln.Collection.df()
uid name description version hash reference reference_type transform_id run_id artifact_id visibility created_at updated_at created_by_id
id
2 Z2NfJBgXfWpwl3rG9Kb1 My versioned scRNA-seq collection None 2 HNR3VFV60_yqRnUka11E None None 2 2 None 1 2024-05-01 18:52:04.731935+00:00 2024-05-01 18:52:04.731962+00:00 1
1 Z2NfJBgXfWpwl3rGaRCM My versioned scRNA-seq collection None 1 exJtsBYH53iiebYH-Qx0 None None 1 1 None 1 2024-05-01 18:51:37.784482+00:00 2024-05-01 18:51:37.784509+00:00 1
collection = ln.Collection.filter(
    name="My versioned scRNA-seq collection", version="2"
).one()
collection.artifacts.df()
uid storage_id key suffix accessor description version size hash hash_type n_objects n_observations transform_id run_id visibility key_is_virtual created_at updated_at created_by_id
id
2 2zYWzCjkNwbeOcCleuyR 1 None .h5ad AnnData 10x reference adata None 857752 0Fozmib89XWbFoD6hSq5yA md5 None 70 2 2 1 True 2024-05-01 18:52:01.592980+00:00 2024-05-01 18:52:02.208385+00:00 1
1 V9W98oInfXKLfLbFMu3X 1 None .h5ad AnnData Human immune cells from Conde22 None 57612943 9sXda5E7BYiVoDOQkTC0KB sha1-fl None 1648 1 1 1 True 2024-05-01 18:51:32.352027+00:00 2024-05-01 18:51:35.891084+00:00 1

If the collection isn’t too large, we can now load it into memory.

Under-the-hood, the AnnData objects are concatenated during loading.

The amount of time this takes depends on a variety of factors.

If it occurs often, one might consider storing a concatenated version of the collection, rather than the individual pieces.

adata = collection.load()

The default is an outer join during concatenation as in pandas:

adata
AnnData object with n_obs × n_vars = 1718 × 36508
    obs: 'cell_type', 'n_genes', 'percent_mito', 'louvain', 'donor', 'tissue', 'assay', 'artifact_uid'
    obsm: 'X_pca', 'X_umap'

The AnnData has the reference to the individual artifacts in the .obs annotations:

adata.obs.artifact_uid.cat.categories
Index(['2zYWzCjkNwbeOcCleuyR', 'V9W98oInfXKLfLbFMu3X'], dtype='object')

We can easily obtain ensemble IDs for gene symbols using the look up object:

genes = bt.Gene.lookup(field="symbol")
genes.itm2b.ensembl_gene_id
'ENSG00000136156'

Let us create a plot:

import scanpy as sc

sc.pp.pca(adata, n_comps=2)
sc.pl.pca(
    adata,
    color=genes.itm2b.ensembl_gene_id,
    title=(
        f"{genes.itm2b.symbol} / {genes.itm2b.ensembl_gene_id} /"
        f" {genes.itm2b.description}"
    ),
    save="_itm2b",
)
WARNING: saving figure to file figures/pca_itm2b.pdf
_images/3c89d6239672517ed819fce503c0a10ec9fc295ca1da01766ae1dbb7f007b08d.png

We could save a plot as a pdf and then see it in the flow diagram:

artifact = ln.Artifact("./figures/pca_itm2b.pdf", description="My result on ITM2B")
artifact.save()
artifact.view_lineage()
Hide code cell output
_images/58437495eb06d1471ad35d48cb41cc91d108803d91de6f7828bcd3d8f6736df4.svg

But given the image is part of the notebook, we can also rely on the report that we create when saving the notebook via the command line via:

lamin save <notebook_path>

To see the current notebook, visit: lamin.ai/laminlabs/lamindata/transform/mfWKm8OtAzp8z8