To build our reference, we would like to start with labels that originate from published cell type references.
One of the approaches for this cell type labeling is CellTypist, a model-based approach to cell type labeling.
CellTypist is described on their website, and in this publication:
Domínguez Conde, C. et al. Cross-tissue immune cell analysis reveals tissue-specific features in humans. Science 376, eabl5197 (2022)
Here, we'll load in our cells in batches, and assign cell types based on 3 available CellTypist models (descriptions are from celltypist.org):
anndata
: Data structures for scRNA-seq
celltypist
: Model-based cell type annotation
concurrent.futures
: parallelization methods
datetime
: date and time functions
h5py
: HDF5 file I/O
hisepy
: The HISE SDK for Python
numpy
: Mathematical data structures and computation
os
: operating system calls
pandas
: DataFrame data structures
re
: Regular expressions
scanpy
: scRNA-seq analysis
scipy.sparse
: Spare matrix data structures
shutil
: Shell utilities
import anndata
import celltypist
from celltypist import models
import concurrent.futures
from datetime import date
import h5py
import hisepy
import numpy as np
import os
import pandas as pd
import re
import scanpy as sc
import scipy.sparse as scs
import shutil
models.download_models(
force_update = True,
model = ['Immune_All_High.pkl',
'Immune_All_Low.pkl',
'Healthy_COVID19_PBMC.pkl']
)
📜 Retrieving model list from server https://celltypist.cog.sanger.ac.uk/models/models.json 📚 Total models in list: 44 📂 Storing models in /root/.celltypist/data/models 💾 Total models to download: 3 💾 Downloading model [1/3]: Immune_All_Low.pkl 💾 Downloading model [2/3]: Immune_All_High.pkl 💾 Downloading model [3/3]: Healthy_COVID19_PBMC.pkl
sample_meta_file_uuid = '2da66a1a-17cc-498b-9129-6858cf639caf'
file_query = hisepy.reader.read_files(
[sample_meta_file_uuid]
)
meta_data = file_query['values']
These functions will retrieve data for a batch of samples, assemble a joint AnnData object, perform normalization and log transformation, then generate predictions for each of the 3 models retrieved, above.
# define a function to read count data
def read_mat(h5_con):
mat = scs.csc_matrix(
(h5_con['matrix']['data'][:], # Count values
h5_con['matrix']['indices'][:], # Row indices
h5_con['matrix']['indptr'][:]), # Pointers for column positions
shape = tuple(h5_con['matrix']['shape'][:]) # Matrix dimensions
)
return mat
# define a function to read obeservation metadata (i.e. cell metadata)
def read_obs(h5con):
bc = h5con['matrix']['barcodes'][:]
bc = [x.decode('UTF-8') for x in bc]
# Initialized the DataFrame with cell barcodes
obs_df = pd.DataFrame({ 'barcodes' : bc })
# Get the list of available metadata columns
obs_columns = h5con['matrix']['observations'].keys()
# For each column
for col in obs_columns:
# Read the values
values = h5con['matrix']['observations'][col][:]
# Check for byte storage
if(isinstance(values[0], (bytes, bytearray))):
# Decode byte strings
values = [x.decode('UTF-8') for x in values]
# Add column to the DataFrame
obs_df[col] = values
obs_df = obs_df.set_index('barcodes', drop = False)
return obs_df
# define a function to construct anndata object from a h5 file
def read_h5_anndata(h5_con):
#h5_con = h5py.File(h5_file, mode = 'r')
# extract the expression matrix
mat = read_mat(h5_con)
# extract gene names
genes = h5_con['matrix']['features']['name'][:]
genes = [x.decode('UTF-8') for x in genes]
# extract metadata
obs_df = read_obs(h5_con)
# construct anndata
adata = anndata.AnnData(mat.T,
obs = obs_df)
# make sure the gene names aligned
adata.var_names = genes
adata.var_names_make_unique()
return adata
def get_adata(uuid):
# Load the file using HISE
res = hisepy.reader.read_files([uuid])
# If there's an error, read_files returns a list instead of a dictionary.
# We should raise and exception with the message when this happens.
if(isinstance(res, list)):
error_message = res[0]['message']
raise Exception(error_message)
# Read the file to adata
h5_con = res['values'][0]
adata = read_h5_anndata(h5_con)
# Close the file now that we're done with it
h5_con.close()
return(adata)
def run_prediction(adata, model, model_name, out_dir = "output"):
# Perform prediction
predictions = celltypist.annotate(
adata,
model = model,
majority_voting = True)
# Make output directory
model_dir = "{d}/{m}".format(d = out_dir, m = model_name)
if not os.path.isdir(model_dir):
os.makedirs(model_dir)
# Write output per sample
samples = adata.obs['pbmc_sample_id'].unique()
for sample_id in samples:
barcodes = adata.obs[adata.obs['pbmc_sample_id'] == sample_id].index.tolist()
sample_results = predictions.predicted_labels.loc[barcodes,:]
out_file = "{d}/{s}_{m}.csv".format(d = model_dir, s = sample_id, m = model_name)
sample_results.to_csv(out_file)
def process_data(meta_data_sub):
out_dir = "output"
# Load cells from HISE .h5 files
results = []
for file_uuid in meta_data_sub:
result = get_adata(file_uuid)
results.append(result)
adata = anndata.concat(results)
del results
# Normalize data
sc.pp.normalize_total(adata, target_sum=1e4)
sc.pp.log1p(adata)
adata.obs.index = adata.obs['barcodes']
# Predict cell types
run_prediction(adata, "Immune_All_Low.pkl", "Low", out_dir)
run_prediction(adata, "Immune_All_High.pkl", "High", out_dir)
run_prediction(adata, "Healthy_COVID19_PBMC.pkl", "Covid_Healthy", out_dir)
del adata
Here, we'll generate the batches, then use concurrent.futures
to apply the function above to our batches in parallel.
out_dir = 'output'
if not os.path.isdir(out_dir):
os.makedirs(out_dir)
meta_data_subsets = []
for i in range(0, len(meta_data), 10):
subset_uuids = meta_data["file.id"][i:i + 10]
meta_data_subsets.append(subset_uuids)
# Process each subset in parallel
pool_executor = concurrent.futures.ProcessPoolExecutor(max_workers = 11)
with pool_executor as executor:
futures = []
for meta_data_sub in meta_data_subsets:
futures.append(executor.submit(process_data, meta_data_sub))
# Check for errors when parallel processes return results
for future in concurrent.futures.as_completed(futures):
try:
future.result()
except Exception as e:
print(f'Error: {e}')
🔬 Input data has 156449 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 5967 features used for prediction ⚖️ Scaling input data 🔬 Input data has 179276 cells and 33538 genes 🔗 Matching reference genes in the model 🔬 Input data has 193957 cells and 33538 genes 🔗 Matching reference genes in the model 🔬 Input data has 207788 cells and 33538 genes 🔗 Matching reference genes in the model 🔬 Input data has 199483 cells and 33538 genes 🔗 Matching reference genes in the model 🔬 Input data has 173666 cells and 33538 genes 🔗 Matching reference genes in the model 🔬 Input data has 187700 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 5967 features used for prediction ⚖️ Scaling input data 🔬 Input data has 200104 cells and 33538 genes 🔗 Matching reference genes in the model 🔬 Input data has 198214 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 5967 features used for prediction ⚖️ Scaling input data 🧬 5967 features used for prediction ⚖️ Scaling input data 🔬 Input data has 187235 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 5967 features used for prediction ⚖️ Scaling input data 🔬 Input data has 209206 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 5967 features used for prediction ⚖️ Scaling input data 🧬 5967 features used for prediction ⚖️ Scaling input data 🧬 5967 features used for prediction ⚖️ Scaling input data 🧬 5967 features used for prediction ⚖️ Scaling input data 🧬 5967 features used for prediction ⚖️ Scaling input data 🧬 5967 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels ✅ Prediction done! 👀 Can not detect a neighborhood graph, will construct one before the over-clustering 🖋️ Predicting labels 🖋️ Predicting labels ✅ Prediction done! 👀 Can not detect a neighborhood graph, will construct one before the over-clustering 🖋️ Predicting labels 🖋️ Predicting labels 🖋️ Predicting labels ✅ Prediction done! 👀 Can not detect a neighborhood graph, will construct one before the over-clustering ✅ Prediction done! 👀 Can not detect a neighborhood graph, will construct one before the over-clustering 🖋️ Predicting labels ✅ Prediction done! 👀 Can not detect a neighborhood graph, will construct one before the over-clustering 🖋️ Predicting labels 🖋️ Predicting labels ✅ Prediction done! 👀 Can not detect a neighborhood graph, will construct one before the over-clustering 🖋️ Predicting labels ✅ Prediction done! 👀 Can not detect a neighborhood graph, will construct one before the over-clustering ✅ Prediction done! 👀 Can not detect a neighborhood graph, will construct one before the over-clustering ✅ Prediction done! 👀 Can not detect a neighborhood graph, will construct one before the over-clustering ✅ Prediction done! 👀 Can not detect a neighborhood graph, will construct one before the over-clustering 🖋️ Predicting labels ✅ Prediction done! 👀 Can not detect a neighborhood graph, will construct one before the over-clustering ⛓️ Over-clustering input data with resolution set to 25 ⛓️ Over-clustering input data with resolution set to 25 ⛓️ Over-clustering input data with resolution set to 25 ⛓️ Over-clustering input data with resolution set to 25 ⛓️ Over-clustering input data with resolution set to 25 ⛓️ Over-clustering input data with resolution set to 25 ⛓️ Over-clustering input data with resolution set to 25 ⛓️ Over-clustering input data with resolution set to 25 ⛓️ Over-clustering input data with resolution set to 30 ⛓️ Over-clustering input data with resolution set to 30 ⛓️ Over-clustering input data with resolution set to 30 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 156449 cells and 33538 genes 🔗 Matching reference genes in the model 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 187235 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 5967 features used for prediction ⚖️ Scaling input data 🧬 5967 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 187700 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 5967 features used for prediction ⚖️ Scaling input data 🗳️ Majority voting the predictions ✅ Majority voting done! 🖋️ Predicting labels 🔬 Input data has 198214 cells and 33538 genes 🔗 Matching reference genes in the model ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🧬 5967 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 200104 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 5967 features used for prediction ⚖️ Scaling input data 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 209206 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 5967 features used for prediction ⚖️ Scaling input data 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 179276 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 5967 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 30 🖋️ Predicting labels 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 30 ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 173666 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 5967 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 187235 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 3443 features used for prediction ⚖️ Scaling input data 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 156449 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 3443 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🗳️ Majority voting the predictions ✅ Majority voting done! 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 207788 cells and 33538 genes 🔗 Matching reference genes in the model 🔬 Input data has 199483 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 5967 features used for prediction ⚖️ Scaling input data 🧬 5967 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 30 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 193957 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 5967 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 187700 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 3443 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 198214 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 3443 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🗳️ Majority voting the predictions ✅ Majority voting done! 🗳️ Majority voting the predictions ✅ Majority voting done! 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 200104 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 3443 features used for prediction ⚖️ Scaling input data 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 209206 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 3443 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 30 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 30 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 179276 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 3443 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🗳️ Majority voting the predictions ✅ Majority voting done! 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 173666 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 3443 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🗳️ Majority voting the predictions ✅ Majority voting done! 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 207788 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 3443 features used for prediction ⚖️ Scaling input data 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 199483 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 3443 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 30 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🗳️ Majority voting the predictions ✅ Majority voting done! 🗳️ Majority voting the predictions ✅ Majority voting done! 🗳️ Majority voting the predictions ✅ Majority voting done! 🔬 Input data has 193957 cells and 33538 genes 🔗 Matching reference genes in the model 🧬 3443 features used for prediction ⚖️ Scaling input data 🖋️ Predicting labels ✅ Prediction done! 👀 Detected a neighborhood graph in the input object, will run over-clustering on the basis of it ⛓️ Over-clustering input data with resolution set to 25 🗳️ Majority voting the predictions ✅ Majority voting done! 🗳️ Majority voting the predictions ✅ Majority voting done! 🗳️ Majority voting the predictions ✅ Majority voting done! 🗳️ Majority voting the predictions ✅ Majority voting done! 🗳️ Majority voting the predictions ✅ Majority voting done!
For each model, we'll assemble the results as a .csv file that we can utilize later for subclustering and analysis of major cell classes.
models = ['High', 'Low', 'Covid_Healthy']
out_files = []
for model in models:
model_path = 'output/{m}'.format(m = model)
model_files = os.listdir(model_path)
model_list = []
for model_file in model_files:
df = pd.read_csv('output/{m}/{f}'.format(m = model, f = model_file))
model_list.append(df)
model_df = pd.concat(model_list)
out_file = 'output/ref_celltypist_labels_{m}_{d}.csv'.format(m = model, d = date.today())
out_files.append(out_file)
model_df.to_csv(out_file)
Finally, we'll use hisepy.upload.upload_files()
to send a copy of our output to HISE to use for downstream analysis steps.
help(hisepy.upload.upload_files)
Help on function upload_files in module hisepy.upload: upload_files(files: list, study_space_id: str = None, project: str = None, title: str = None, input_file_ids=None, input_sample_ids=None, file_types=None, store=None, destination=None, do_prompt: bool = True) Uploads files to a specified study. Parameters: files (list): absolute filepath of file to be uploaded study_space_id (str): ID that pertains to a study in the collaboration space (optional) project (str): project short name (required if study space is not specified) title (str): 10+ character title for upload result input_file_ids (list): fileIds from HISE that were utilized to generate a user's result input_sample_ids (list): sampleIds from HISE that were utilized to generate a user's result file_types (str): filetype of uploaded files store (str): Which store ('project' or 'permanent') to use for the files (default in 'project') destination (str): Destination folder for the files do_prompt (bool): whether or not to prompt for user's input, asking to proceed. Returns: dictionary with keys ["trace_id", "files"] Example: hp.upload_files(files=['/home/jupyter/upload_file.csv'], study_space_id='f2f03ecb-5a1d-4995-8db9-56bd18a36aba', title='a upload title', input_file_ids=['9f6d7ab5-1c7b-4709-9455-3d8ffffbb6c8'])
study_space_uuid = '64097865-486d-43b3-8f94-74994e0a72e0'
title = 'Ref. CellTypist Predictions {d}'.format(d = date.today())
in_files = [sample_meta_file_uuid] + meta_data['file.id'].to_list()
in_files[0:5]
['2da66a1a-17cc-498b-9129-6858cf639caf', 'fec489f9-9a74-4635-aa91-d2bf09d1faec', '7c0c7979-eebd-4aba-b5b2-6e76b4643623', '40efd03a-cb2f-4677-af42-a056cbfe5a17', '68fbcd34-1d63-461d-8195-df5b8dc61b31']
out_files
['output/ref_celltypist_labels_High_2024-02-18.csv', 'output/ref_celltypist_labels_Low_2024-02-18.csv', 'output/ref_celltypist_labels_Covid_Healthy_2024-02-18.csv']
hisepy.upload.upload_files(
files = out_files,
study_space_id = study_space_uuid,
title = title,
input_file_ids = in_files
)
you are trying to upload file_ids... ['output/ref_celltypist_labels_High_2024-02-18.csv', 'output/ref_celltypist_labels_Low_2024-02-18.csv', 'output/ref_celltypist_labels_Covid_Healthy_2024-02-18.csv']. Do you truly want to proceed?
{'trace_id': '60c20ada-f8aa-4c7f-ae24-8973a487a491', 'files': ['output/ref_celltypist_labels_High_2024-02-18.csv', 'output/ref_celltypist_labels_Low_2024-02-18.csv', 'output/ref_celltypist_labels_Covid_Healthy_2024-02-18.csv']}
import session_info
session_info.show()
----- anndata 0.10.3 celltypist 1.6.1 h5py 3.10.0 hisepy 0.3.0 numpy 1.24.0 pandas 2.1.4 scanpy 1.9.6 scipy 1.11.4 session_info 1.0.0 -----
PIL 10.0.1 anyio NA arrow 1.3.0 asttokens NA attr 23.2.0 attrs 23.2.0 babel 2.14.0 beatrix_jupyterlab NA brotli NA cachetools 5.3.1 certifi 2023.11.17 cffi 1.16.0 charset_normalizer 3.3.2 cloudpickle 2.2.1 colorama 0.4.6 comm 0.1.4 cryptography 41.0.7 cycler 0.10.0 cython_runtime NA dateutil 2.8.2 db_dtypes 1.1.1 debugpy 1.8.0 decorator 5.1.1 defusedxml 0.7.1 deprecated 1.2.14 exceptiongroup 1.2.0 executing 2.0.1 fastjsonschema NA fqdn NA google NA greenlet 2.0.2 grpc 1.58.0 grpc_status NA idna 3.6 igraph 0.10.8 importlib_metadata NA ipykernel 6.28.0 ipython_genutils 0.2.0 ipywidgets 8.1.1 isoduration NA jedi 0.19.1 jinja2 3.1.2 joblib 1.3.2 json5 NA jsonpointer 2.4 jsonschema 4.20.0 jsonschema_specifications NA jupyter_events 0.9.0 jupyter_server 2.12.1 jupyterlab_server 2.25.2 jwt 2.8.0 kiwisolver 1.4.5 leidenalg 0.10.1 llvmlite 0.41.0 lz4 4.3.2 markupsafe 2.1.3 matplotlib 3.8.0 matplotlib_inline 0.1.6 mpl_toolkits NA mpmath 1.3.0 natsort 8.4.0 nbformat 5.9.2 numba 0.58.0 opentelemetry NA overrides NA packaging 23.2 parso 0.8.3 pexpect 4.8.0 pickleshare 0.7.5 pkg_resources NA platformdirs 4.1.0 plotly 5.18.0 prettytable 3.9.0 prometheus_client NA prompt_toolkit 3.0.42 proto NA psutil NA ptyprocess 0.7.0 pure_eval 0.2.2 pyarrow 13.0.0 pydev_ipython NA pydevconsole NA pydevd 2.9.5 pydevd_file_utils NA pydevd_plugins NA pydevd_tracing NA pygments 2.17.2 pynvml NA pyparsing 3.1.1 pyreadr 0.5.0 pythonjsonlogger NA pytz 2023.3.post1 referencing NA requests 2.31.0 rfc3339_validator 0.1.4 rfc3986_validator 0.1.1 rpds NA send2trash NA shapely 1.8.5.post1 six 1.16.0 sklearn 1.3.2 sniffio 1.3.0 socks 1.7.1 sql NA sqlalchemy 2.0.21 sqlparse 0.4.4 stack_data 0.6.2 sympy 1.12 termcolor NA texttable 1.7.0 threadpoolctl 3.2.0 torch 2.1.2+cu121 torchgen NA tornado 6.3.3 tqdm 4.66.1 traitlets 5.9.0 typing_extensions NA uri_template NA urllib3 1.26.18 wcwidth 0.2.12 webcolors 1.13 websocket 1.7.0 wrapt 1.15.0 xarray 2023.12.0 yaml 6.0.1 zipp NA zmq 25.1.2 zoneinfo NA zstandard 0.22.0
----- IPython 8.19.0 jupyter_client 8.6.0 jupyter_core 5.6.1 jupyterlab 4.0.10 notebook 6.5.4 ----- Python 3.10.13 | packaged by conda-forge | (main, Dec 23 2023, 15:36:39) [GCC 12.3.0] Linux-5.15.0-1051-gcp-x86_64-with-glibc2.31 ----- Session information updated at 2024-02-18 03:29