CZ CELLxGENE Census
Visão Geral
O CZ CELLxGENE Census oferece acesso programático a uma coleção abrangente e versionada de dados de genômica de célula única padronizados do CZ CELLxGENE Discover. Este skill permite consultas eficientes e análise de milhões de células em milhares de conjuntos de dados.
O Census inclui:
- 61+ milhões de células de humanos e camundongos
- Metadados padronizados (tipos de célula, tecidos, doenças, doadores)
- Matrizes de expressão gênica bruta
- Embeddings pré-calculados e estatísticas
- Integração com PyTorch, scanpy e outras ferramentas de análise
Quando Usar Este Skill
Este skill deve ser usado quando:
- Consultando dados de expressão de célula única por tipo de célula, tecido ou doença
- Explorando conjuntos de dados e metadados de célula única disponíveis
- Treinando modelos de aprendizado de máquina com dados de célula única
- Realizando análises em larga escala entre conjuntos de dados
- Integrando dados do Census com scanpy ou outros frameworks de análise
- Calculando estatísticas em milhões de células
- Acessando embeddings pré-calculados ou predições de modelos
Instalação e Configuração
Instale a API do Census:
uv pip install cellxgene-census
Para workflows de aprendizado de máquina, instale dependências adicionais:
uv pip install cellxgene-census[experimental]
Padrões de Workflow Principal
1. Abrindo o Census
Sempre use o context manager para garantir limpeza apropriada de recursos:
import cellxgene_census
# Abrir versão estável mais recente
with cellxgene_census.open_soma() as census:
# Trabalhar com dados do census
# Abrir versão específica para reprodutibilidade
with cellxgene_census.open_soma(census_version="2023-07-25") as census:
# Trabalhar com dados do census
Pontos-chave:
- Use context manager (declaração
with) para limpeza automática - Especifique
census_versionpara análises reprodutíveis - Por padrão, abre a release "stable" mais recente
2. Explorando Informações do Census
Antes de consultar dados de expressão, explore conjuntos de dados e metadados disponíveis.
Acesse informações resumidas:
# Obter estatísticas resumidas
summary = census["census_info"]["summary"].read().concat().to_pandas()
print(f"Total de células: {summary['total_cell_count'][0]}")
# Obter todos os conjuntos de dados
datasets = census["census_info"]["datasets"].read().concat().to_pandas()
# Filtrar conjuntos de dados por critérios
covid_datasets = datasets[datasets["disease"].str.contains("COVID", na=False)]
Consulte metadados de célula para entender dados disponíveis:
# Obter tipos de célula únicos em um tecido
cell_metadata = cellxgene_census.get_obs(
census,
"homo_sapiens",
value_filter="tissue_general == 'brain' and is_primary_data == True",
column_names=["cell_type"]
)
unique_cell_types = cell_metadata["cell_type"].unique()
print(f"Encontrados {len(unique_cell_types)} tipos de célula no cérebro")
# Contar células por tecido
tissue_counts = cell_metadata.groupby("tissue_general").size()
Importante: Sempre filtre por is_primary_data == True para evitar contar células duplicadas, a menos que esteja analisando duplicatas especificamente.
3. Consultando Dados de Expressão (Pequena a Média Escala)
Para consultas retornando < 100k células que cabem na memória, use get_anndata():
# Consulta básica com filtros de tipo de célula e tecido
adata = cellxgene_census.get_anndata(
census=census,
organism="Homo sapiens", # ou "Mus musculus"
obs_value_filter="cell_type == 'B cell' and tissue_general == 'lung' and is_primary_data == True",
obs_column_names=["assay", "disease", "sex", "donor_id"],
)
# Consultar genes específicos com múltiplos filtros
adata = cellxgene_census.get_anndata(
census=census,
organism="Homo sapiens",
var_value_filter="feature_name in ['CD4', 'CD8A', 'CD19', 'FOXP3']",
obs_value_filter="cell_type == 'T cell' and disease == 'COVID-19' and is_primary_data == True",
obs_column_names=["cell_type", "tissue_general", "donor_id"],
)
Sintaxe de filtro:
- Use
obs_value_filterpara filtragem de célula - Use
var_value_filterpara filtragem de gene - Combine condições com
and,or - Use
inpara múltiplos valores:tissue in ['lung', 'liver'] - Selecione apenas colunas necessárias com
obs_column_names
Obtendo metadados separadamente:
# Consultar metadados de célula
cell_metadata = cellxgene_census.get_obs(
census, "homo_sapiens",
value_filter="disease == 'COVID-19' and is_primary_data == True",
column_names=["cell_type", "tissue_general", "donor_id"]
)
# Consultar metadados de gene
gene_metadata = cellxgene_census.get_var(
census, "homo_sapiens",
value_filter="feature_name in ['CD4', 'CD8A']",
column_names=["feature_id", "feature_name", "feature_length"]
)
4. Consultas em Larga Escala (Processamento Fora de Núcleo)
Para consultas que excedem a RAM disponível, use axis_query() com processamento iterativo:
import tiledbsoma as soma
# Criar consulta de eixo
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']"
)
)
# Iterar através da matriz de expressão em chunks
iterator = query.X("raw").tables()
for batch in iterator:
# batch é uma pyarrow.Table com colunas:
# - soma_data: valor de expressão
# - soma_dim_0: coordenada de célula (obs)
# - soma_dim_1: coordenada de gene (var)
process_batch(batch)
Calculando estatísticas incrementais:
# Exemplo: Calcular expressão média
n_observations = 0
sum_values = 0.0
iterator = query.X("raw").tables()
for batch in iterator:
values = batch["soma_data"].to_numpy()
n_observations += len(values)
sum_values += values.sum()
mean_expression = sum_values / n_observations
5. Aprendizado de Máquina com PyTorch
Para treinamento de modelos, use a integração experimental com PyTorch:
from cellxgene_census.experimental.ml import experiment_dataloader
with cellxgene_census.open_soma() as census:
# Criar dataloader
dataloader = experiment_dataloader(
census["census_data"]["homo_sapiens"],
measurement_name="RNA",
X_name="raw",
obs_value_filter="tissue_general == 'liver' and is_primary_data == True",
obs_column_names=["cell_type"],
batch_size=128,
shuffle=True,
)
# Loop de treinamento
for epoch in range(num_epochs):
for batch in dataloader:
X = batch["X"] # Tensor de expressão gênica
labels = batch["obs"]["cell_type"] # Labels de tipo de célula
# Forward pass
outputs = model(X)
loss = criterion(outputs, labels)
# Backward pass
optimizer.zero_grad()
loss.backward()
optimizer.step()
Divisão treino/teste:
from cellxgene_census.experimental.ml import ExperimentDataset
# Criar dataset a partir do experimento
dataset = ExperimentDataset(
experiment_axis_query,
layer_name="raw",
obs_column_names=["cell_type"],
batch_size=128,
)
# Dividir em treino e teste
train_dataset, test_dataset = dataset.random_split(
split=[0.8, 0.2],
seed=42
)
6. Integração com Scanpy
Integre perfeitamente dados do Census com workflows scanpy:
import scanpy as sc
# Carregar dados do Census
adata = cellxgene_census.get_anndata(
census=census,
organism="Homo sapiens",
obs_value_filter="cell_type == 'neuron' and tissue_general == 'cortex' and is_primary_data == True",
)
# Workflow scanpy padrão
sc.pp.normalize_total(adata, target_sum=1e4)
sc.pp.log1p(adata)
sc.pp.highly_variable_genes(adata, n_top_genes=2000)
# Redução de dimensionalidade
sc.pp.pca(adata, n_comps=50)
sc.pp.neighbors(adata)
sc.tl.umap(adata)
# Visualização
sc.pl.umap(adata, color=["cell_type", "tissue", "disease"])
7. Integração Multi-Dataset
Consulte e integre múltiplos conjuntos de dados:
# Estratégia 1: Consultar múltiplos tecidos separadamente
tissues = ["lung", "liver", "kidney"]
adatas = []
for tissue in tissues:
adata = cellxgene_census.get_anndata(
census=census,
organism="Homo sapiens",
obs_value_filter=f"tissue_general == '{tissue}' and is_primary_data == True",
)
adata.obs["tissue"] = tissue
adatas.append(adata)
# Concatenar
combined = adatas[0].concatenate(adatas[1:])
# Estratégia 2: Consultar múltiplos conjuntos de dados diretamente
adata = cellxgene_census.get_anndata(
census=census,
organism="Homo sapiens",
obs_value_filter="tissue_general in ['lung', 'liver', 'kidney'] and is_primary_data == True",
)
Conceitos-Chave e Melhores Práticas
Sempre Filtre Dados Primários
A menos que esteja analisando duplicatas, sempre inclua is_primary_data == True em consultas para evitar contar células múltiplas vezes:
obs_value_filter="cell_type == 'B cell' and is_primary_data == True"
Especifique Versão do Census para Reprodutibilidade
Sempre especifique a versão do Census em análises de produção:
census = cellxgene_census.open_soma(census_version="2023-07-25")
Estime Tamanho da Consulta Antes de Carregar
Para consultas grandes, primeiro verifique o número de células para evitar problemas de memória:
# Obter contagem de células
metadata = cellxgene_census.get_obs(
census, "homo_sapiens",
value_filter="tissue_general == 'brain' and is_primary_data == True",
column_names=["soma_joinid"]
)
n_cells = len(metadata)
print(f"Consulta retornará {n_cells:,} células")
# Se muito grande (>100k), use processamento fora de núcleo
Use tissue_general para Agrupamentos Mais Amplos
O campo tissue_general fornece categorias mais amplas que tissue, úteis para análises entre tecidos:
# Agrupamento mais amplo
obs_value_filter="tissue_general == 'immune system'"
# Tecido específico
obs_value_filter="tissue == 'peripheral blood mononuclear cell'"
Selecione Apenas Colunas Necessárias
Minimize transferência de dados especificando apenas colunas de metadados necessárias:
obs_column_names=["cell_type", "tissue_general", "disease"] # Não todas as colunas
Verifique Presença de Dataset para Consultas Gene-Específicas
Ao analisar genes específicos, verifique quais conjuntos de dados os mediram:
presence = cellxgene_census.get_presence_matrix(
census,
"homo_sapiens",
var_value_filter="feature_name in ['CD4', 'CD8A']"
)
Workflow em Duas Etapas: Explorar Depois Consultar
Primeiro explore metadados para entender dados disponíveis, depois consulte expressão:
# Etapa 1: Explorar o que está disponível
metadata = cellxgene_census.get_obs(
census, "homo_sapiens",
value_filter="disease == 'COVID-19' and is_primary_data == True",
column_names=["cell_type", "tissue_general"]
)
print(metadata.value_counts())
# Etapa 2: Consultar com base em achados
adata = cellxgene_census.get_anndata(
census=census,
organism="Homo sapiens",
obs_value_filter="disease == 'COVID-19' and cell_type == 'T cell' and is_primary_data == True",
)
Campos de Metadados Disponíveis
Metadados de Célula (obs)
Campos-chave para filtragem:
cell_type,cell_type_ontology_term_idtissue,tissue_general,tissue_ontology_term_iddisease,disease_ontology_term_idassay,assay_ontology_term_iddonor_id,sex,self_reported_ethnicitydevelopment_stage,development_stage_ontology_term_iddataset_idis_primary_data(Booleano: True = célula única)
Metadados de Gene (var)
feature_id(ID de gene Ensembl, ex.: "ENSG00000161798")feature_name(Símbolo do gene, ex.: "FOXP2")feature_length(Comprimento do gene em pares de bases)
Documentação de Referência
Este skill inclui documentação de referência detalhada:
references/census_schema.md
Documentação abrangente de:
- Estrutura e organização dos dados do Census
- Todos os campos de metadados disponíveis
- Sintaxe e operadores de filtro de valor
- Tipos de objeto SOMA
- Critérios de inclusão de dados
Quando ler: Quando você precisa de informações detalhadas de schema, lista completa de campos de metadados ou sintaxe de filtro complexa.
references/common_patterns.md
Exemplos e padrões para:
- Consultas exploratórias (apenas metadados)
- Consultas pequenas-a-médias (AnnData)
- Consultas grandes (processamento fora de núcleo)
- Integração com PyTorch
- Workflows de integração Scanpy
- Integração multi-dataset
- Melhores práticas e armadilhas comuns
Quando ler: Ao implementar padrões de consulta específicos, procurar exemplos de código ou troubleshooting de problemas comuns.
Casos de Uso Comuns
Caso de Uso 1: Explorar Tipos de Célula em um Tecido
with cellxgene_census.open_soma() as census:
cells = cellxgene_census.get_obs(
census, "homo_sapiens",
value_filter="tissue_general == 'lung' and is_primary_data == True",
column_names=["cell_type"]
)
print(cells["cell_type"].value_counts())
Caso de Uso 2: Consultar Expressão de Gene Marcador
with cellxgene_census.open_soma() as census:
adata = cellxgene_census.get_anndata(
census=census,
organism="Homo sapiens",
var_value_filter="feature_name in ['CD4', 'CD8A', 'CD19']",
obs_value_filter="cell_type in ['T cell', 'B cell'] and is_primary_data == True",
)
Caso de Uso 3: Treinar Classificador de Tipo de Célula
from cellxgene_census.experimental.ml import experiment_dataloader
with cellxgene_census.open_soma() as census:
dataloader = experiment_dataloader(
census["census_data"]["homo_sapiens"],
measurement_name="RNA",
X_name="raw",
obs_value_filter="is_primary_data == True",
obs_column_names=["cell_type"],
batch_size=128,
shuffle=True,
)
# Treinar modelo
for epoch in range(epochs):
for batch in dataloader:
# Lógica de treinamento
pass
Caso de Uso 4: Análise Entre Tecidos
with cellxgene_census.open_soma() as census:
adata = cellxgene_census.get_anndata(
census=census,
organism="Homo sapiens",
obs_value_filter="cell_type == 'macrophage' and tissue_general in ['lung', 'liver', 'brain'] and is_primary_data == True",
)
# Analisar diferenças de macrófago entre tecidos
sc.tl.rank_genes_groups(adata, groupby="tissue_general")
Troubleshooting
Consulta Retorna Muitas Células
- Adicione filtros mais específicos para reduzir escopo
- Use
tissueem vez detissue_generalpara granularidade mais fina - Filtre por
dataset_idespecífico se conhecido - Mude para processamento fora de núcleo para consultas grandes
Erros de Memória
- Reduza escopo de consulta com filtros mais restritivos
- Selecione menos genes com
var_value_filter - Use processamento fora de núcleo com
axis_query() - Processe dados em lotes
Células Duplicadas nos Resultados
- Sempre inclua
is_primary_data == Trueem filtros - Verifique se está consultando intencionalmente entre múltiplos conjuntos de dados
Gene Não Encontrado
- Verifique ortografia do nome do gene (sensível a maiúsculas)
- Tente ID Ensembl com
feature_idem vez defeature_name - Verifique matriz de presença de dataset para ver se gene foi medido
- Alguns genes podem ter sido filtrados durante a construção do Census
Inconsistências de Versão
- Sempre especifique
census_versionexplicitamente - Use mesma versão em todas as análises
- Verifique notas de release para mudanças específicas de versão