{
"cells": [
{
"cell_type": "markdown",
"id": "negative-stranger",
"metadata": {},
"source": [
"# Use hormone2cell to predict hormone producing/receiving cell types."
]
},
{
"cell_type": "markdown",
"id": "north-account",
"metadata": {},
"source": [
"This notebook showcases how to predict hormone producing cell types using hormone2cell."
]
},
{
"cell_type": "markdown",
"id": "collectible-crest",
"metadata": {},
"source": [
"**Steps**:\n",
"- 0. **Download and process the dataset**\n",
" \n",
"\n",
"- 1. **Calculate average expression per cell type per tissue**\n",
" - Calculate the average gene expression for each cell type within each tissue.\n",
"- 2. **Predict hormone producing strength**\n",
" - 2.1 Identify hormone-producing cell types using data-derived thresholds.\n",
" - 2.2 Identify hormone-producing cell types using precomputed thresholds from the Hormone Cell Atlas.\n",
" - Notes:\n",
" - The precomputed thresholds are derived from the pan-tissue Hormone Cell Atlas, while the data-derived thresholds are calculated directly from the user-provided dataset. Depending on your analytical goals, you may choose either 2.1 (data-derived) or 2.2 (precomputed).\n",
" - Without adjustment: Predictions of hormone-producing cell types and their strengths are made directly using the default function `hormone_strength`, without applying any adjustment to gene expression thresholds.\n",
" - With adjustment: Predictions of hormone-producing cell types and their strengths are performed using the `hormone_strength` function with `adjustment = True`. Here, adjustment refers to modifying thresholds for hormone-related genes based on the overall specificity score and the degree of tissue coverage.\n",
" - When both single-cell and single-nucleus data are available, predictions should be performed separately for each dataset, because expression levels can differ substantially due to gene length (Lake et al., 2017: https://www.nature.com/articles/s41598-017-04426-w\n",
"). The results can then be integrated by taking the maximum strength observed across the two assays. \n",
"- 3. **Predict hormone receiving strength**\n",
" - 3.1 Identify hormone-receiving cell types using data-derived thresholds.\n",
" - 3.2 Identify hormone-receiving cell types using precomputed thresholds from the Hormone Cell Atlas.\n",
" - Notes:\n",
" - It is recommended not to adjust the thresholds for hormone-receiving-related genes, since hormone sensitization is generally broader than hormone production.\n",
" \n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "starting-hollywood",
"metadata": {},
"outputs": [],
"source": [
"import scanpy as sc\n",
"import pandas as pd\n",
"import numpy as np\n",
"import os\n",
"import time\n",
"from collections import Counter\n",
"import hormone2cell\n",
"\n",
"import matplotlib.pyplot as plt\n",
"from matplotlib_venn import venn2"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "proper-firmware",
"metadata": {},
"outputs": [],
"source": [
"sc.settings.verbosity = 3 # verbosity: errors (0), warnings (1), info (2), hints (3)\n",
"sc.set_figure_params(dpi=80, facecolor=\"white\")\n",
"#sc.logging.print_header()"
]
},
{
"cell_type": "markdown",
"id": "destroyed-confusion",
"metadata": {},
"source": [
"## 0. Download and process the dataset"
]
},
{
"cell_type": "markdown",
"id": "existing-issue",
"metadata": {},
"source": [
"We used the pancreas as the query dataset, which includes both single-cell and single-nucleus data. The dataset was downloaded from the CellxGene website (https://datasets.cellxgene.cziscience.com/d7191e85-30c6-41ba-a439-e1d1fe5a3227.h5ad). For demonstration purposes, we sampled 200 cells per cell type per suspension type.\n",
"\n",
"If you would like to reproduce the hormone-producing and hormone-receiving results from our manuscript, please download the per-tissue h5ad files from https://hormonecellatlas.org.uk/downloads/\n",
" and run the analysis using the precomputed thresholds provided by the Hormone Cell Atlas."
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "august-equality",
"metadata": {},
"outputs": [],
"source": [
"# adata=sc.read('data/pancreas_downsample200CT.h5ad')\n",
"adata=hormone2cell.data.load_pancreas_data()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "appropriate-dispute",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(3274, 33053)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"adata.shape"
]
},
{
"cell_type": "markdown",
"id": "derived-infrared",
"metadata": {},
"source": [
"Raw count data with the full gene set are required for hormone2cell."
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "postal-appointment",
"metadata": {},
"outputs": [],
"source": [
"adata=adata.raw.to_adata()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "duplicate-ballet",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.float32(450742.0)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"adata.X.data.max()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "yellow-snowboard",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "constitutional-audio",
"metadata": {},
"source": [
"Check and modify the obs to meet the requirements of hormone2cell. The `.obs` must contain columns for the tissue, cell type and suspension type (i.e. cell or nucleus) for downstream analysis."
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "joint-curtis",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"suspension_type\n",
"nucleus 1674\n",
"cell 1600\n",
"Name: count, dtype: int64"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"adata.obs['suspension_type'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "selected-there",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"cell_type\n",
"endothelial cell 400\n",
"pancreatic A cell 400\n",
"pancreatic D cell 400\n",
"pancreatic ductal cell 400\n",
"pancreatic acinar cell 400\n",
"pancreatic stellate cell 400\n",
"type B pancreatic cell 400\n",
"pancreatic PP cell 274\n",
"macrophage 200\n",
"Name: count, dtype: int64"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"adata.obs['cell_type'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "portable-headset",
"metadata": {},
"outputs": [],
"source": [
"adata.obs['Tissue']='Pancreas'"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "monetary-story",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "spanish-muslim",
"metadata": {},
"source": [
"Ensure that `.var_names` are gene symbols, this particular object comes with them set to ENSG IDs."
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "featured-pennsylvania",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" exist_in_Tritschler2022 \n",
" exist_in_Fasolino2022 \n",
" exist_in_Muraro2016 \n",
" exist_in_Tosti2021 \n",
" feature_reference \n",
" feature_biotype \n",
" feature_length \n",
" feature_type \n",
" gene_id \n",
" \n",
" \n",
" feature_name \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" A1BG \n",
" True \n",
" True \n",
" True \n",
" True \n",
" NCBITaxon:9606 \n",
" gene \n",
" 2134 \n",
" protein_coding \n",
" ENSG00000121410 \n",
" \n",
" \n",
" A1BG-AS1 \n",
" True \n",
" True \n",
" True \n",
" True \n",
" NCBITaxon:9606 \n",
" gene \n",
" 1667 \n",
" lncRNA \n",
" ENSG00000268895 \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" exist_in_Tritschler2022 exist_in_Fasolino2022 \\\n",
"feature_name \n",
"A1BG True True \n",
"A1BG-AS1 True True \n",
"\n",
" exist_in_Muraro2016 exist_in_Tosti2021 feature_reference \\\n",
"feature_name \n",
"A1BG True True NCBITaxon:9606 \n",
"A1BG-AS1 True True NCBITaxon:9606 \n",
"\n",
" feature_biotype feature_length feature_type gene_id \n",
"feature_name \n",
"A1BG gene 2134 protein_coding ENSG00000121410 \n",
"A1BG-AS1 gene 1667 lncRNA ENSG00000268895 "
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"adata.var['gene_id']=adata.var.index\n",
"adata.var['feature_name']=adata.var['feature_name'].astype('str')\n",
"adata.var = adata.var.set_index('feature_name')\n",
"adata.var_names_make_unique()\n",
"adata.var.head(2)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "excellent-basics",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"id": "aerial-stretch",
"metadata": {},
"source": [
"## 1. Calculate average expression per cell type per tissue\n",
"\n",
"Along with the actual average expression, which is computed after internally running `sc.pp.normalize_total()` with a target sum of 10,000 and log1p-transformed prior to being returned, the resulting data frame carries additional information on the gene's presence in any given tissue/celltype/suspension combination which is used in downstream analysis."
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "dying-commodity",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"363 hormone-related genes are found.\n",
"normalizing counts per cell\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/rfs/project/rfs-iCNyzSAaucw/lf529/miniforge3/envs/hormone2cell_env2/lib/python3.10/site-packages/scanpy/preprocessing/_normalization.py:269: UserWarning: Received a view of an AnnData. Making a copy.\n",
" view_to_actual(adata)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" finished (0:00:02)\n",
"Computing average gene expression per cell type in the cell dataset.\n",
"filtered out 130 genes that are detected in less than 3 cells\n",
"Tissues in input: ['Pancreas'] — average calculation done.\n",
"Computing average gene expression per cell type in the nucleus dataset.\n",
"filtered out 125 genes that are detected in less than 3 cells\n",
"Tissues in input: ['Pancreas'] — average calculation done.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/rfs/project/rfs-iCNyzSAaucw/lf529/miniforge3/envs/hormone2cell_env2/lib/python3.10/site-packages/legacy_api_wrap/__init__.py:88: UserWarning: Some cells have zero counts\n",
" return fn(*args_all, **kw)\n"
]
}
],
"source": [
"ave_all=hormone2cell.compute_aveExp_by_category(adata,sc_sn_col='suspension_type',\n",
" celltype_col= \"cell_type\",\n",
" tissue_col='Tissue')"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "equipped-default",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Tissue \n",
" cell_type \n",
" Cluster \n",
" Celltype_tissue \n",
" Gene \n",
" ExpressedCellNumber \n",
" TotalCellNumber \n",
" Percentage \n",
" logExpression \n",
" suspension_type \n",
" \n",
" \n",
" \n",
" \n",
" 1 \n",
" Pancreas \n",
" pancreatic A cell \n",
" 2 \n",
" Pancreas____pancreatic A cell \n",
" IGF2 \n",
" 13 \n",
" 200 \n",
" 6.5 \n",
" 0.732021 \n",
" cell \n",
" \n",
" \n",
" 2 \n",
" Pancreas \n",
" pancreatic D cell \n",
" 3 \n",
" Pancreas____pancreatic D cell \n",
" IGF2 \n",
" 24 \n",
" 200 \n",
" 12.0 \n",
" 0.668118 \n",
" cell \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Tissue cell_type Cluster Celltype_tissue Gene \\\n",
"1 Pancreas pancreatic A cell 2 Pancreas____pancreatic A cell IGF2 \n",
"2 Pancreas pancreatic D cell 3 Pancreas____pancreatic D cell IGF2 \n",
"\n",
" ExpressedCellNumber TotalCellNumber Percentage logExpression \\\n",
"1 13 200 6.5 0.732021 \n",
"2 24 200 12.0 0.668118 \n",
"\n",
" suspension_type \n",
"1 cell \n",
"2 cell "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ave_all.head(2)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "architectural-purse",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2822, 10)"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ave_all.shape"
]
},
{
"cell_type": "markdown",
"id": "blessed-partition",
"metadata": {},
"source": [
"## 2. Predict hormone producing strength"
]
},
{
"cell_type": "markdown",
"id": "experienced-species",
"metadata": {},
"source": [
"Load the definitions of hormone production, as specified in the hormone–receptor reference database of the Hormone Cell Atlas project.\n",
"\n",
"In this dataframe, `hormogene_include` columns represent genes involved in the induction of hormone production, while `hormogene_exclude` columns represent genes involved in its repression. The columns represent an `AND` relationship, i.e. all of the genes in a row need to fulfil subsequent filtering conditions for the hormone to qualify as produced or repressed in a cell type. `OR` relationships, indicative of multiple independent production pathways, are represented by multiple entries for the hormone in the data frame.\n",
"\n",
"\n",
"Genes excluded from strength calculations but required to meet expression thresholds are hard-coded in utils.py (see Methods in Fei & Huang-Doran (in press)) and may you need to adjust these definitions for your own study."
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "equal-mozambique",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" hormone_short \n",
" hormone_display \n",
" hormone_figures \n",
" Tier \n",
" hpc_include1 \n",
" hpc_include2 \n",
" hpc_include3 \n",
" hpc_include4 \n",
" hpc_include5 \n",
" hpc_include6 \n",
" hpc_include7 \n",
" hpc_include8 \n",
" hpc_exclude1 \n",
" hpc_exclude2 \n",
" receptor_known \n",
" hormone_type_broad \n",
" hormone_type_fine \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" acth \n",
" ACTH \n",
" ACTH \n",
" 1 \n",
" POMC \n",
" PCSK1 \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" PCSK2 \n",
" NaN \n",
" yes \n",
" peptide_protein \n",
" peptide \n",
" \n",
" \n",
" 1 \n",
" activin_a \n",
" Activin A \n",
" Activin A \n",
" 2 \n",
" INHBA \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" NaN \n",
" yes \n",
" peptide_protein \n",
" protein_multimer \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" hormone_short hormone_display hormone_figures Tier hpc_include1 \\\n",
"0 acth ACTH ACTH 1 POMC \n",
"1 activin_a Activin A Activin A 2 INHBA \n",
"\n",
" hpc_include2 hpc_include3 hpc_include4 hpc_include5 hpc_include6 \\\n",
"0 PCSK1 NaN NaN NaN NaN \n",
"1 NaN NaN NaN NaN NaN \n",
"\n",
" hpc_include7 hpc_include8 hpc_exclude1 hpc_exclude2 receptor_known \\\n",
"0 NaN NaN PCSK2 NaN yes \n",
"1 NaN NaN NaN NaN yes \n",
"\n",
" hormone_type_broad hormone_type_fine \n",
"0 peptide_protein peptide \n",
"1 peptide_protein protein_multimer "
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hormone_definition=hormone2cell.data.load_hormone_producing_file()\n",
"hormone_definition.head(2)"
]
},
{
"cell_type": "markdown",
"id": "coral-above",
"metadata": {},
"source": [
"### 2.1 Identify hormone-producing cell types using data-derived thresholds.\n",
"\n",
"At this point, we're ready to perform data-driven hormone2cell inference. The function will:\n",
"- Filter the average expression data frame, removing entries with fewer than 10 cells in a category, fewer than 3 cells expressing the gene, or where the log expression is too low (`thresh_expr_low`) or has too low a percentage of expressing cells (`thresh_pct`).\n",
"- For each gene, identify its highest observed expression in a cell type across the whole data.\n",
"- For genes inducing hormone production (`include_cols` from the loaded hormone definition data frame), require at least `thresh_included_initial` of the max expression to be kept in the expression matrix. For values below that threshold, the expression will be set to 0.\n",
"- For genes repressing hormone production (`exclude_cols`), require at least `thresh_excluded_initial` of the max expression to be kept in the expression matrix. For values below that threshold, the expression will be set to 0.\n",
"- For a hormone to be deemed present in a cell type, any of its independent induction mechanisms (individual lines in the reference data frame, OR logic) must be fulfilled. An induction mechanism is deemed fulfilled if all of its induction genes have nonzero expression after the filtering (AND logic). Any induction gene having zero expression, or all repression genes having nonzero expression, has the induction mechanism set to not fulfilled.\n",
"- Hormone activity is screened for specificity. If hormone production is present in at least `coverage_threshold` of the cell types of a tissue, or a Tau specificty score below `specificity_threshold` (with the input computed as the mean expression of a hormone's AND genes, summed up across its OR induction mechanisms, for instances of hormone production being considered active in a cell type; 0 otherwise), the hormone is deemed to be non-specific. Causes of this may include ambient RNA contamination.\n",
"- For non-specific hormones, the expression filtering thresholds are adjusted to `thresh_included_adjusted` and `thresh_excluded_adjusted` and the analysis is repeated."
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "db5cf1ea-06d2-438b-b0af-59f96efa893e",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Tissue \n",
" cell_type \n",
" Cluster \n",
" Celltype_tissue \n",
" Gene \n",
" ExpressedCellNumber \n",
" TotalCellNumber \n",
" Percentage \n",
" logExpression \n",
" suspension_type \n",
" \n",
" \n",
" \n",
" \n",
" 1 \n",
" Pancreas \n",
" pancreatic A cell \n",
" 2 \n",
" Pancreas____pancreatic A cell \n",
" IGF2 \n",
" 13 \n",
" 200 \n",
" 6.5 \n",
" 0.732021 \n",
" cell \n",
" \n",
" \n",
" 2 \n",
" Pancreas \n",
" pancreatic D cell \n",
" 3 \n",
" Pancreas____pancreatic D cell \n",
" IGF2 \n",
" 24 \n",
" 200 \n",
" 12.0 \n",
" 0.668118 \n",
" cell \n",
" \n",
" \n",
" 3 \n",
" Pancreas \n",
" pancreatic PP cell \n",
" 4 \n",
" Pancreas____pancreatic PP cell \n",
" IGF2 \n",
" 4 \n",
" 200 \n",
" 2.0 \n",
" 0.246472 \n",
" cell \n",
" \n",
" \n",
" 5 \n",
" Pancreas \n",
" pancreatic ductal cell \n",
" 6 \n",
" Pancreas____pancreatic ductal cell \n",
" IGF2 \n",
" 2 \n",
" 200 \n",
" 1.0 \n",
" 0.092293 \n",
" cell \n",
" \n",
" \n",
" 7 \n",
" Pancreas \n",
" type B pancreatic cell \n",
" 8 \n",
" Pancreas____type B pancreatic cell \n",
" IGF2 \n",
" 114 \n",
" 200 \n",
" 57.0 \n",
" 1.943938 \n",
" cell \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Tissue cell_type Cluster \\\n",
"1 Pancreas pancreatic A cell 2 \n",
"2 Pancreas pancreatic D cell 3 \n",
"3 Pancreas pancreatic PP cell 4 \n",
"5 Pancreas pancreatic ductal cell 6 \n",
"7 Pancreas type B pancreatic cell 8 \n",
"\n",
" Celltype_tissue Gene ExpressedCellNumber \\\n",
"1 Pancreas____pancreatic A cell IGF2 13 \n",
"2 Pancreas____pancreatic D cell IGF2 24 \n",
"3 Pancreas____pancreatic PP cell IGF2 4 \n",
"5 Pancreas____pancreatic ductal cell IGF2 2 \n",
"7 Pancreas____type B pancreatic cell IGF2 114 \n",
"\n",
" TotalCellNumber Percentage logExpression suspension_type \n",
"1 200 6.5 0.732021 cell \n",
"2 200 12.0 0.668118 cell \n",
"3 200 2.0 0.246472 cell \n",
"5 200 1.0 0.092293 cell \n",
"7 200 57.0 1.943938 cell "
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ave_all.head()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "wrapped-kennedy",
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"I. Compute initial strengths\n",
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from current data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from current data\n",
" 4) Apply hormone rules to compute the final table\n",
"II. Identify hormones to adjust and recompute only the adjusted hormones\n",
" 1). Identify hormones to adjust based on the specificity\n",
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from current data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from current data\n",
" 4) Apply hormone rules to compute the final table\n",
" 2). Identify hormones to adjust based on the tissue coverage\n",
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from current data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from current data\n",
" 4) Apply hormone rules to compute the final table\n",
"III. Merge: replace original rows with adjusted hormone rows\n",
"(512, 4)\n",
" Hormones that have been adjusted includes: dict_keys(['activin_a', 'activins_all', 'adm', 'adm_all', 'angiotensinogen', 'chemerin', 'endothelin_3', 'endothelins_all', 'gdf15', 'glp1', 'glp2', 'npy', 'pacap', 'pomc', 'pp', 'pro_amylin_iapp', 'pro_ghrelin', 'pro_glucagon', 'pro_insulin', 'pro_npy', 'pro_somatostatin', 'rbp4', 'salusin', 'somatostatin', 'visfatin'])\n",
"------hormone_long_adj_coverage-------\n",
" Hormone Celltype_tissue Strength Tissue\n",
"0 activin_a Pancreas____endothelial cell 0.000000 Pancreas\n",
"1 activins_all Pancreas____endothelial cell 3.586259 Pancreas\n",
"------pairs-------\n",
" Hormone Tissue\n",
"0 activin_a Pancreas\n",
"1 activins_all Pancreas\n",
"(512, 4)\n",
"Before removing duplicates: (230, 7)\n",
"After removing duplicates: (173, 7)\n",
"Finally hormone2cell finds: 173 hormone-celltype pairs.\n",
"CPU times: user 370 ms, sys: 3.61 ms, total: 374 ms\n",
"Wall time: 383 ms\n"
]
},
{
"data": {
"text/plain": [
"(173, 8)"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"mask=ave_all['suspension_type']=='cell'\n",
"ave_all_cell=ave_all.loc[mask]\n",
"dt_cell=hormone2cell.hormone_strength(\n",
" ave_all = ave_all_cell,\n",
" geneset_definition = hormone_definition,\n",
" celltype_column = \"Celltype_tissue\", # must be unique\n",
" tissue_col = \"Tissue\",\n",
" adjustment = True,\n",
" assay = \"cell\",\n",
" include_cols = ['hpc_include1', 'hpc_include2', 'hpc_include3',\n",
" 'hpc_include4', 'hpc_include5', 'hpc_include6', 'hpc_include7',\n",
" 'hpc_include8'],\n",
" exclude_cols =['hpc_exclude1', 'hpc_exclude2'],\n",
" # initial thresholds\n",
" thresh_expr_low = 0.01,\n",
" thresh_pct = 5,\n",
" # specificity / coverage thresholds\n",
" specificity_threshold = 0.8,\n",
" coverage_threshold = 0.5,\n",
" # filtering thresholds (first pass)\n",
" thresh_included_initial = 0.1,\n",
" thresh_excluded_initial = 0.15,\n",
" # filtering thresholds (adjusted pass)\n",
" thresh_included_adjusted = 0.5,\n",
" thresh_excluded_adjusted = 0.15,\n",
" max_expression_file='max_expression_cell.csv'\n",
")\n",
"dt_cell.shape"
]
},
{
"cell_type": "markdown",
"id": "2b38e210-b2bf-4c4b-a53b-73cdc585a01b",
"metadata": {},
"source": [
"The resulted `dt_cell` contains the hormones expressed in each cell type and their expression strengths, along with the corresponding annotations."
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "ed247272-ab8b-4502-b223-edc73d01bf81",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Hormone \n",
" Celltype_tissue \n",
" Strength \n",
" Tissue \n",
" hormone_display \n",
" hormone_short \n",
" Tier \n",
" assay \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" glp1 \n",
" Pancreas____pancreatic stellate cell \n",
" 7.070757 \n",
" Pancreas \n",
" Glucagon-like peptide 1 \n",
" glp1 \n",
" 2 \n",
" cell \n",
" \n",
" \n",
" 1 \n",
" glp1 \n",
" Pancreas____type B pancreatic cell \n",
" 5.734788 \n",
" Pancreas \n",
" Glucagon-like peptide 1 \n",
" glp1 \n",
" 2 \n",
" cell \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Hormone Celltype_tissue Strength Tissue \\\n",
"0 glp1 Pancreas____pancreatic stellate cell 7.070757 Pancreas \n",
"1 glp1 Pancreas____type B pancreatic cell 5.734788 Pancreas \n",
"\n",
" hormone_display hormone_short Tier assay \n",
"0 Glucagon-like peptide 1 glp1 2 cell \n",
"1 Glucagon-like peptide 1 glp1 2 cell "
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dt_cell.head(2)"
]
},
{
"cell_type": "markdown",
"id": "unlikely-authority",
"metadata": {},
"source": [
"We can perform the analysis on nuclear rather than cellular data as well."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "substantial-discussion",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"I. Compute initial strengths\n",
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from current data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from current data\n",
" 4) Apply hormone rules to compute the final table\n",
"II. Identify hormones to adjust and recompute only the adjusted hormones\n",
" 1). Identify hormones to adjust based on the specificity\n",
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from current data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from current data\n",
" 4) Apply hormone rules to compute the final table\n",
" 2). Identify hormones to adjust based on the tissue coverage\n",
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from current data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from current data\n",
" 4) Apply hormone rules to compute the final table\n",
"III. Merge: replace original rows with adjusted hormone rows\n",
"(324, 4)\n",
" Hormones that have been adjusted includes: dict_keys(['chemerin', 'visfatin'])\n",
"------hormone_long_adj_coverage-------\n",
" Hormone Celltype_tissue Strength Tissue\n",
"0 chemerin Pancreas____endothelial cell 4.995571 Pancreas\n",
"1 visfatin Pancreas____endothelial cell 5.121772 Pancreas\n",
"------pairs-------\n",
" Hormone Tissue\n",
"0 chemerin Pancreas\n",
"1 visfatin Pancreas\n",
"(320, 4)\n",
"Before removing duplicates: (94, 7)\n",
"After removing duplicates: (76, 7)\n",
"Finally hormone2cell finds: 76 hormone-celltype pairs.\n"
]
}
],
"source": [
"mask=ave_all['suspension_type']=='nucleus'\n",
"ave_all_nucleus=ave_all.loc[mask]\n",
"dt_nucleus=hormone2cell.hormone_strength(\n",
" ave_all = ave_all_nucleus,\n",
" geneset_definition = hormone_definition,\n",
" celltype_column = \"Celltype_tissue\", # must be unique\n",
" tissue_col = \"Tissue\",\n",
" adjustment = True,\n",
" assay = \"nucleus\",\n",
" include_cols = ['hpc_include1', 'hpc_include2', 'hpc_include3',\n",
" 'hpc_include4', 'hpc_include5', 'hpc_include6', 'hpc_include7',\n",
" 'hpc_include8'],\n",
" exclude_cols =['hpc_exclude1', 'hpc_exclude2'],\n",
" # initial thresholds\n",
" thresh_expr_low = 0.01,\n",
" thresh_pct = 5,\n",
" # specificity / coverage thresholds\n",
" specificity_threshold = 0.8,\n",
" coverage_threshold = 0.5,\n",
" # filtering thresholds (first pass)\n",
" thresh_included_initial = 0.1,\n",
" thresh_excluded_initial = 0.15,\n",
" # filtering thresholds (adjusted pass)\n",
" thresh_included_adjusted = 0.5,\n",
" thresh_excluded_adjusted = 0.15,\n",
" max_expression_file='max_expression_nucleus.csv'\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "d4882e30-c806-43db-9c96-b8f83362dc7f",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Hormone \n",
" Celltype_tissue \n",
" Strength \n",
" Tissue \n",
" hormone_display \n",
" hormone_short \n",
" Tier \n",
" assay \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" crh \n",
" Pancreas____pancreatic D cell \n",
" 2.320317 \n",
" Pancreas \n",
" CRH \n",
" crh \n",
" 1 \n",
" nucleus \n",
" \n",
" \n",
" 2 \n",
" somatostatin \n",
" Pancreas____pancreatic D cell \n",
" 8.120015 \n",
" Pancreas \n",
" Somatostatin \n",
" somatostatin \n",
" 2 \n",
" nucleus \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Hormone Celltype_tissue Strength Tissue \\\n",
"0 crh Pancreas____pancreatic D cell 2.320317 Pancreas \n",
"2 somatostatin Pancreas____pancreatic D cell 8.120015 Pancreas \n",
"\n",
" hormone_display hormone_short Tier assay \n",
"0 CRH crh 1 nucleus \n",
"2 Somatostatin somatostatin 2 nucleus "
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dt_nucleus.head(2)"
]
},
{
"cell_type": "markdown",
"id": "infrared-genome",
"metadata": {},
"source": [
"#### 2.1.1 Combine results from single cell and single nucleus data."
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "modular-winner",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Hormone \n",
" Celltype_tissue \n",
" Strength \n",
" Tissue \n",
" hormone_display \n",
" hormone_short \n",
" Tier \n",
" assay \n",
" Hormone_CT \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" glp1 \n",
" Pancreas____pancreatic stellate cell \n",
" 7.070757 \n",
" Pancreas \n",
" Glucagon-like peptide 1 \n",
" glp1 \n",
" 2 \n",
" cell_only \n",
" glp1___Pancreas____pancreatic stellate cell \n",
" \n",
" \n",
" 1 \n",
" glp1 \n",
" Pancreas____pancreatic PP cell \n",
" 4.827841 \n",
" Pancreas \n",
" Glucagon-like peptide 1 \n",
" glp1 \n",
" 2 \n",
" cell_only \n",
" glp1___Pancreas____pancreatic PP cell \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Hormone Celltype_tissue Strength Tissue \\\n",
"0 glp1 Pancreas____pancreatic stellate cell 7.070757 Pancreas \n",
"1 glp1 Pancreas____pancreatic PP cell 4.827841 Pancreas \n",
"\n",
" hormone_display hormone_short Tier assay \\\n",
"0 Glucagon-like peptide 1 glp1 2 cell_only \n",
"1 Glucagon-like peptide 1 glp1 2 cell_only \n",
"\n",
" Hormone_CT \n",
"0 glp1___Pancreas____pancreatic stellate cell \n",
"1 glp1___Pancreas____pancreatic PP cell "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"(188, 9)"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hpc_datadriven=hormone2cell.combine_assay(cell=dt_cell, nucleus=dt_nucleus,celltype_column='Celltype_tissue')\n",
"display(hpc_datadriven.head(2))\n",
"hpc_datadriven.shape"
]
},
{
"cell_type": "markdown",
"id": "macro-drink",
"metadata": {},
"source": [
"### 2.2 Identify hormone-producing cell types using precomputed thresholds from the Hormone Cell Atlas.\n",
"A key strength of the accompanying manuscript is its analysis of a large integrated dataset spanning 47 tissues and 14 million cells. The large scale integration allowed for defining maximum values in a manner more representative of what is likely to be occurring at the level of the entire body, which should lead to more informed thresholding."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "velvet-congo",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"I. Compute initial strengths\n",
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from precomputed data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from precomputed data\n",
" 4) Apply hormone rules to compute the final table\n",
"II. Identify hormones to adjust and recompute only the adjusted hormones\n",
" 1). Identify hormones to adjust based on the specificity\n",
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from precomputed data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from precomputed data\n",
" 4) Apply hormone rules to compute the final table\n",
" 2). Identify hormones to adjust based on the tissue coverage\n",
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from precomputed data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from precomputed data\n",
" 4) Apply hormone rules to compute the final table\n",
"III. Merge: replace original rows with adjusted hormone rows\n",
"(512, 4)\n",
" Hormones that have been adjusted includes: dict_keys(['activin_a', 'activins_all', 'adm', 'adm_all', 'angiotensinogen', 'chemerin', 'endothelin_3', 'endothelins_all', 'follistatin_like_1', 'gdf15', 'glp1', 'glp2', 'npy', 'pacap', 'pomc', 'pp', 'pro_amylin_iapp', 'pro_ghrelin', 'pro_glucagon', 'pro_insulin', 'pro_npy', 'pro_somatostatin', 'rbp4', 'salusin', 'somatostatin', 'visfatin'])\n",
"------hormone_long_adj_coverage-------\n",
" Hormone Celltype_tissue Strength Tissue\n",
"0 activin_a Pancreas____endothelial cell 1.969141 Pancreas\n",
"1 activins_all Pancreas____endothelial cell 5.555400 Pancreas\n",
"------pairs-------\n",
" Hormone Tissue\n",
"0 activin_a Pancreas\n",
"1 activins_all Pancreas\n",
"(512, 4)\n",
"Before removing duplicates: (257, 7)\n",
"After removing duplicates: (194, 7)\n",
"Finally hormone2cell finds: 194 hormone-celltype pairs.\n",
"CPU times: user 377 ms, sys: 2.01 ms, total: 379 ms\n",
"Wall time: 424 ms\n"
]
},
{
"data": {
"text/plain": [
"(194, 8)"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"mask=ave_all['suspension_type']=='cell'\n",
"ave_all_cell=ave_all.loc[mask]\n",
"dt_cell=hormone2cell.hormone_strength(\n",
" ave_all = ave_all_cell,\n",
" geneset_definition = hormone_definition,\n",
" celltype_column = \"Celltype_tissue\", # must be unique\n",
" tissue_col = \"Tissue\",\n",
" adjustment = True,\n",
" assay = \"cell\",\n",
" include_cols = ['hpc_include1', 'hpc_include2', 'hpc_include3',\n",
" 'hpc_include4', 'hpc_include5', 'hpc_include6', 'hpc_include7',\n",
" 'hpc_include8'],\n",
" exclude_cols =['hpc_exclude1', 'hpc_exclude2'],\n",
" # initial thresholds\n",
" thresh_expr_low = 0.01,\n",
" thresh_pct = 5,\n",
" # specificity / coverage thresholds\n",
" specificity_threshold = 0.8,\n",
" coverage_threshold = 0.5,\n",
" # filtering thresholds (first pass)\n",
" thresh_included_initial = 0.1,\n",
" thresh_excluded_initial = 0.15,\n",
" # filtering thresholds (adjusted pass)\n",
" thresh_included_adjusted = 0.5,\n",
" thresh_excluded_adjusted = 0.15,\n",
" use_precomputed='cell',\n",
" max_expression_file='max_expression_cell_pre.csv'\n",
")\n",
"dt_cell.shape"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "supported-circuit",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"I. Compute initial strengths\n",
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from precomputed data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from precomputed data\n",
" 4) Apply hormone rules to compute the final table\n",
"II. Identify hormones to adjust and recompute only the adjusted hormones\n",
" 1). Identify hormones to adjust based on the specificity\n",
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from precomputed data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from precomputed data\n",
" 4) Apply hormone rules to compute the final table\n",
" 2). Identify hormones to adjust based on the tissue coverage\n",
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from precomputed data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from precomputed data\n",
" 4) Apply hormone rules to compute the final table\n",
"III. Merge: replace original rows with adjusted hormone rows\n",
"(324, 4)\n",
" Hormones that have been adjusted includes: dict_keys(['chemerin', 'visfatin'])\n",
"------hormone_long_adj_coverage-------\n",
" Hormone Celltype_tissue Strength Tissue\n",
"0 chemerin Pancreas____endothelial cell 4.995571 Pancreas\n",
"1 visfatin Pancreas____endothelial cell 5.121772 Pancreas\n",
"------pairs-------\n",
" Hormone Tissue\n",
"0 chemerin Pancreas\n",
"1 visfatin Pancreas\n",
"(320, 4)\n",
"Before removing duplicates: (94, 7)\n",
"After removing duplicates: (76, 7)\n",
"Finally hormone2cell finds: 76 hormone-celltype pairs.\n"
]
},
{
"data": {
"text/plain": [
"(76, 8)"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mask=ave_all['suspension_type']=='nucleus'\n",
"ave_all_nucleus=ave_all.loc[mask]\n",
"dt_nucleus=hormone2cell.hormone_strength(\n",
" ave_all = ave_all_nucleus,\n",
" geneset_definition = hormone_definition,\n",
" celltype_column = \"Celltype_tissue\", # must be unique\n",
" tissue_col = \"Tissue\",\n",
" adjustment = True,\n",
" assay = \"nucleus\",\n",
" include_cols = ['hpc_include1', 'hpc_include2', 'hpc_include3',\n",
" 'hpc_include4', 'hpc_include5', 'hpc_include6', 'hpc_include7',\n",
" 'hpc_include8'],\n",
" exclude_cols =['hpc_exclude1', 'hpc_exclude2'],\n",
" # initial thresholds\n",
" thresh_expr_low = 0.01,\n",
" thresh_pct = 5,\n",
" # specificity / coverage thresholds\n",
" specificity_threshold = 0.8,\n",
" coverage_threshold = 0.5,\n",
" # filtering thresholds (first pass)\n",
" thresh_included_initial = 0.1,\n",
" thresh_excluded_initial = 0.15,\n",
" # filtering thresholds (adjusted pass)\n",
" thresh_included_adjusted = 0.5,\n",
" thresh_excluded_adjusted = 0.15,\n",
" use_precomputed='nucleus',\n",
" max_expression_file='max_expression_nucleus_pre.csv'\n",
")\n",
"dt_nucleus.shape"
]
},
{
"cell_type": "markdown",
"id": "challenging-hayes",
"metadata": {},
"source": [
"#### 2.2.1 Combine results from single cell and single nucleus data."
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "collaborative-lawrence",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Hormone \n",
" Celltype_tissue \n",
" Strength \n",
" Tissue \n",
" hormone_display \n",
" hormone_short \n",
" Tier \n",
" assay \n",
" Hormone_CT \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" glp1 \n",
" Pancreas____pancreatic stellate cell \n",
" 7.070757 \n",
" Pancreas \n",
" Glucagon-like peptide 1 \n",
" glp1 \n",
" 2 \n",
" cell_only \n",
" glp1___Pancreas____pancreatic stellate cell \n",
" \n",
" \n",
" 1 \n",
" glp1 \n",
" Pancreas____pancreatic PP cell \n",
" 4.827841 \n",
" Pancreas \n",
" Glucagon-like peptide 1 \n",
" glp1 \n",
" 2 \n",
" cell_only \n",
" glp1___Pancreas____pancreatic PP cell \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Hormone Celltype_tissue Strength Tissue \\\n",
"0 glp1 Pancreas____pancreatic stellate cell 7.070757 Pancreas \n",
"1 glp1 Pancreas____pancreatic PP cell 4.827841 Pancreas \n",
"\n",
" hormone_display hormone_short Tier assay \\\n",
"0 Glucagon-like peptide 1 glp1 2 cell_only \n",
"1 Glucagon-like peptide 1 glp1 2 cell_only \n",
"\n",
" Hormone_CT \n",
"0 glp1___Pancreas____pancreatic stellate cell \n",
"1 glp1___Pancreas____pancreatic PP cell "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"(208, 9)"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hpc_precomputed=hormone2cell.combine_assay(cell=dt_cell, nucleus=dt_nucleus,celltype_column='Celltype_tissue')\n",
"display(hpc_datadriven.head(2))\n",
"hpc_precomputed.shape"
]
},
{
"cell_type": "markdown",
"id": "enhanced-incidence",
"metadata": {},
"source": [
"Visulization of the hormone producing cell types from two methods."
]
},
{
"cell_type": "code",
"execution_count": 30,
"id": "international-accident",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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oAAAAABgCoICAAAAgCkICgAAAACmICgAAAAAmIKgAAAAAGAKggIAAACAKQgKAAAAAKYgKAAAAACYgqAAYFpf/epXZRjGxJ/5sm3btonHuPfee+ftcQAAQH4ICgAAAACm8NpdANzlq1/9qn7/939/xs+bpqlAIKDa2lq1tLRo5cqV2rBhg66//nrdcsstqq2tXcBqZ/fpT39aQ0NDksZf9d62bZut9QAAACwkggIWVDabVSwWUywW07lz57Rnzx798Ic/lCQFAgFt375df/EXf6GtW7faXOl4UDh58uTE+wQFAABQSQgKmFetra2qqamZ9LGxsTENDQ0pHo9P+ngikdB3v/tdffe739XrXvc6ffGLX1RTU9NClgsbPPLII3aXAAAApkFQwLz6xCc+MWOD6sjIiJ555hk9/vjj+upXv6rDhw9PfO7+++/X008/rccee0wdHR0LVC0AAADOo5kZtqmpqdG2bdv0gQ98QAcPHtT9998/aQTh5MmTesUrXqGRkREbqwQAAKhMjCigLBiGode+9rXasmWLtm3bpqNHj0qSdu3apfe///364he/OOc1EomEdu/erQMHDqinp0exWEx1dXVatGiRrrvuOi1ZsmS+/xnT6uzs1O7du3X8+HENDw/L6/WqsbFRl1xyiV7ykpfI7/cveE0jIyN66KGHdPLkSaVSKS1ZskRXXXWV1q1bV/LH2r17t/bs2aOuri5ZlqVrr71WL33pS0v+OKV2/PhxPf300zp37pzGxsbU0tKi9evX6/rrr5fH4ynJYzz11FPav3+/zp49q+rqaq1Zs0bbtm1TMBgsyfUBACiKBZTQv/3bv1mSJv7827/9W97X2LVrlxUKhSau4fP5rJMnT057bE9Pj/XZz37WuuWWW6xgMDjpsS/+s3nzZuv+++/Pq/5c/kz3b3z44YetP/qjP7JWrFgx67nhcNh6z3veY3V1deX9dSrEyMiI9d73vnfS1/fCP1u3brV27tw57ddiJg8//PCk444fP25ZlmXdd9991mWXXTblMX7nd35n0vk333zzxOfuueeeKdf/kz/5k4nP19bWWrFYLK9/87ve9a6J85ubm61kMjnjsZlMxvrKV75iXXLJJTN+z5qamqwPfehDOdUx09fwP//zP61169ZNe/3q6mrrox/9qJVOp/P6dwIAUGpMPULZ2bhxo975zndOvJ9KpfSpT31q2mM///nP673vfa8efvjhKc3RF3vuuef0ute9Tu9617uUTqdLWvPFbrnlFn3xi1/UiRMnZj0uGo3qc5/7nDZv3qwnn3xyXms6e/asrr76an32s59VLBab9pjHHntMW7du1X333VfUY/3pn/6p3vjGN2rv3r1FXUeS3va2t028HYlE9IMf/CDncxOJhL7zne9MvP+mN71JPp9v2mPPnTun66+/Xu94xzt04MCBGa/Z39+vv//7v9fVV1+trq6unGs5773vfa/e/OY369ChQ9N+fnR0VH/3d3+n3/u935NlWXlfHwCAUmHqEcrS+973Pn32s5+deP/nP//5nOd0dHRo69atuvLKK9XU1CSv16vu7m79+te/1oMPPqhsNitJ+vKXv6zW1lZ99KMfnXKN2tparV69WtJ4j8T5QNHQ0KDGxsZpH3e2vR+8Xq+2bNmia6+9VsuXL1ddXZ3Gxsa0b98+/eAHP1BnZ6ek8ZvU7du364UXXtDixYvn/LfmKxqN6o477ph0c9rU1KQ3vvGNuuKKK5ROp/X888/rO9/5jiKRiN7xjnfoT//0Twt6rE9/+tP6l3/5F0nSmjVr9JrXvEarVq1SNpvVoUOHFI1G87reddddp7Vr1040u3/jG9/QG97whpzO/eEPfzixF4Y0OXRc6OzZs7rxxht17NixiY8tXrxYr3rVq3TZZZepqqpKp06d0ve//309//zzkqR9+/bp5ptv1jPPPJPz/h8f+9jH9LnPfU6StGnTJm3fvl3Lly9XIpHQjh07dN999ymVSkmSvv3tb2vbtm364z/+45yuDQBAydk9pAF3KcXUo/PWrl076Vo9PT1TjvnQhz5kveY1r7F+9atfWdlsdsZr7d27d9I0GNM0rYMHD876+MuXL584/u///u/zqn3x4sXW//k//2fams9LpVLWRz7yEcswjInHectb3pLX4+Tq/e9//6Sv5V133WX19/dPOa6zs9O67rrrJr5GmmbazMUunnp0/k+u02fmmnpkWZb14Q9/eOIYr9c769f1Qq961asmzlu/fv20x2QyGeu2226bOM4wDOuDH/zgjFOLvvCFL1gej2fi+He84x0zPv7FzwfTNK1gMGh985vfnPb4Z555xmpoaJg4fvHixUxBAgDYhqCAkiplUHj7298+6Vo//elPpxyTz3z1rq4uq6mpaeJ673vf+2Y9vpigkE9dH/jAByYex+/3W+fOncvrsebS1dVleb3eicfYuHGjFY1GZzy+v7/fWrZs2ZQb/5lMFxT+7u/+Luf6cgkKx48fnxSoPvOZz8x53b6+Psvn802c85GPfGTa4772ta9Nqv1Tn/rUnNf+9Kc/PSlYHD58eNrjput5matP5ktf+tKk4x988ME56wEAYD7Qo4CytWLFiknv9/X1TTkmn9VhFi9erPe+970T7z/wwAMF1zaXfOr6wAc+oKqqKklSMpnUL3/5y5LW8rWvfW1ST8Y//dM/KRQKzXh8Y2PjtNOycrVo0SJ98IMfLPj86axYsUI33njjxPvf+MY35jznW9/61sQ0HsMw9Na3vnXa4/7pn/5p4u2tW7fqfe9735zX/rM/+zNdeumlkiTLsnJalUuS7rzzTr32ta+d9Zi3vvWtCofDE+/Pd+8KAAAzISigbDU0NEx6f2BgoOhr3nbbbRNvHzp0SJFIpOhrFquqqkrXXXfdxPtPP/10Sa//ox/9aOLtlStX6vbbb5/znDe84Q2qr68v6PHe9KY3KRAIFHTubN7+9rdPvP3000/P2Ax83je/+c2Jt2+66SYtX758yjF79uzRCy+8MPH+X/7lX+ZUi2EYuueeeybef/DBB3M67/d///fnPCYcDuvKK6+ceH///v05XRsAnOree++VYRgyDEPbtm2zuxxcgKCAslVdXT3p/VLc1C9atGjibcuyClq1Zj5cWNeZM2dKdt1MJqPnnntu4v077rgjp/P8fn/Bv6xvuOGGgs6by+tf//pJIzWzjSocOXJEO3bsmHj/wpBxoV//+tcTb3s8Hr3sZS/LuZ4tW7ZMvL13716NjY3Nec6FgXA27e3tE29f2IwNAMBCYtUjlK2Ld2Suq6ub8dhEIqEf//jH+slPfqIXXnhBJ0+e1MjIyIzLgJ43PDxcklpncvjwYd13333asWOH9u3bp8HBQY2MjCiTySxITadPn560ytBll12W87mXX365vve97+X9mOdXjSq1uro6vepVr9K3v/1tSeMjBh/+8IdlGMaUYy8MEcFgUK973eumveauXbsm3l62bNnEFLBctLW1TbydyWR09uxZrVmzZtZzLgyEs7kwJOcSQOz01a9+dc6RkmAwqLq6Oi1btkxXX321XvnKV+quu+6SafJaFcrf0NCQPv3pT0+8f++9906ZGmuH733vexOrsK1YsUL33nuvrfXAnQgKKFsXv5I60/Kk3/72t/UXf/EXBY0OzLX3QqF6enr0vve9T//5n/+Z97kz1TTXTagkLVmyRI888sjE+4ODg5M+39ramnMdLS0tOR97oVyXCi3E2972tomgcOLECf3mN7/RTTfdNOW4C6cdvepVr5oxZPb390+8ffz48WlDR64u/lpPp5Adly0X7KUQj8cVj8d17tw5Pf300/riF7+oNWvW6F//9V+ZZoCyNzQ0pA996EMT72/btq1sgsLXvvY1SdLNN99MUMC8ICigbF24pr0kNTc3TznmU5/61Izzymtra1VdXa1gMDhxA5hOp3Xy5MmJY+bjJuzcuXN66UtfOu0ceq/Xq6amJgUCgUkbf/X09EyMoMxU09GjR+d87Is3krv41ejZmpgvls+r6xfyeufv18pdd92llpYW9fb2ShofObg4KDz22GOTfnZmmnYklXZaT777Q7hVa2urampqJn0sFoupp6dn0s/nkSNHdNttt+k//uM/9MY3vnGhywQA5ICggLL1xBNPTLxtGIauvvrqSZ/fs2eP/uqv/mri/erqar3nPe/R9u3btWnTpmlvdI8fP65Vq1bNX9GS/vzP/3xSSNi6dav++I//WDfeeKOWLl067XSLe+65R1//+tdLXsvFX4O5pmJdqBynvHi9Xr35zW/WZz7zGUnSd77zHX32s5+d1Dx94bSjlpaWWfsOLlxdKBAIaMmSJQXXVshogRt94hOfmPaVzVgspoceekgf/OAHJ6ZLZLNZvf3tb9c111wzb1PWAACFIyigLB09enTSK+iXXXaZmpqaJh3zuc99buIVynA4rMcee0wbN26c9brz3Rh69uzZiakx0vir2V/96lfnnNKSS12FjH5cvHJUT09Pzueef9W+3Lz97W+fCApDQ0P60Y9+NLHkaDKZ1He+852JY9/85jfPOsJx4SjVypUrWWFoHoVCIW3fvl133HGH7rrrrokpcslkUv/4j/+or371q7bWBwCYiqCAsnRh45ikaV8Vfuihhybeftvb3jZnSJDGRxTm0y9/+cuJG3rDMPTxj388p3nv81XX0qVLFQ6HJ6bF7N27N+dz9+zZMy81Fevqq6/Whg0btG/fPknjIwjng8KPf/zjScvozjbtSJIuueSSibe7urpkWVZRfQqYWyAQ0Je//GWtX79+oqn/Rz/6kbLZbE7NzaOjo3r00UfV2dmpvr4+NTc3641vfOOsix2cPXtWjz/+uLq7uxWJRNTU1KRVq1bppptuKnop376+Pj322GPq7u5Wf3+//H6/2tradNlll+nKK6+Ux+PJ63qnT5/W448/rnPnzikajaqlpUWrV6/W1q1bJ01XLMbx48f11FNPqbOzU5lMRqtXr9btt98+69ewr69Pv/rVr3T8+HFlMhm1t7fr1ltvVUdHR9H1jI6O6pFHHtGpU6c0MjKixYsXa8uWLVq/fn3R1y4nlmXpwIED2rdvnzo7OzU6OqpwOKzm5mZdddVV2rBhg62/fwYGBvSb3/xGXV1dGhwcVH19vZYtW6Zt27YVPBVVkjo7O/Xoo4/qzJkzCgaDWrJkiW666aZppxOjDNm21RtcqRQ7M+/atcsKhUKTdis+ffr0lOPC4fDEMf/yL/+S07X/5E/+ZFJ9Dz/88IzHrlmzZuK4D37wgzld/5Of/OTEOa2trTmd093dPWnX4Ztvvjmn83K1devWiWuvXLkyp3MSiYRVX19f0M7Mx48fz6u+XHZmvtj/+l//a+Icn89n9fX1WZZlWa95zWsmPn7ppZfOeZ2nn356Uu07d+7Mq/a5XPx8yNU999wzbz8PpVboc/6aa66ZdN6xY8cmPjfdz0Rvb691zz33THren//z3HPPTfsY3/ve96xrrrlm0vPrwj/V1dXWn//5n1uDg4N5/7t/8IMfWNddd92M15Zk1dXVWW9729us559/fs7r/ehHP7KuuuqqGa9VW1tr/dmf/ZnV39+fU33TfU/27t1r3XrrrdPWHAqFrL//+7+3MpnMpOt0d3dbb33rWyft7n7+j2EY1tve9jZrYGBgznqm+5keHR21/viP/9iqqqqa9t983XXX5fScPH78eM6/1y801/Pzwppz/XPx7794PG7dd9991ute9zqrsbFx1nPb29ut//2//7cVi8Vy/rfm8meu36u/+tWvrG3btlkej2fa84PBoPX2t7/dOnPmTE5f1/OOHTtmvfzlL5/2583v91tvetObrJ6enilf63L/nVdpWJsOZaWzs1O/+7u/O2ku/Tvf+c5p545bF0zFSSQSc157cHBw0mo4c7lwicpclyy9sKZkMpnTOZ/73OfmdWWbV77ylRNvHz9+PKedn++///6yXr//LW95y8Srz6lUSvfdd58GBgb04x//eOKYt73tbXNe56qrrtLatWsn3v/nf/7n0heLaV3ckzDbVLddu3Zp48aN+trXvpZT0/jo6Ki2b9+uV7/61dq5c+eMz6/R0VH98z//sy677LKJEaq5RCIRvfzlL9erXvUq7dixY9bn7vDwsL7xjW/o3/7t32Y8Jp1O65577tH27dv17LPPzvq4n/nMZ7R+/fqCNmX8wQ9+oJe85CWTRj0vFIvF9KEPfUhvectbJj6/Z88ebdq0Sd/85jenLJQgjf+++8Y3vqE777xzynLWc+nq6tK1116rL3zhCzP2Q+3YsUPXXXfdxMo+TvTEE0/ojW98o+6///45Nw3t6urS//gf/0Pbtm3TuXPn5r22dDqtd77znbr55pv1yCOPzLhsdzwe19e//nVdeumlevTRR3O69q9+9Stt3LhRDzzwwLQ/b8lkUt/61re0efPmvEa6sfCYeoSyYFmW/uu//kvvfve7Jy1ZuXnzZn3iE5+Y9pxly5bp4MGDksanLrzvfe+b9frvfve789q0bcWKFRNNl7lOw1m2bNnE20NDQ/rNb36jG2+8ccbjn3nmGX3yk5/MuaZC3HPPPfrgBz+oVColaXz34R07dszYfDs4OKgPfOAD81pTsZYuXapt27ZNhJ5vfOMbMk1zIpwZhqG3vvWtc17HNE39zd/8jf7gD/5A0viyqnfffbfe9KY35VVPPB6nmTlPF994zjRFZ3BwUK95zWt09uxZ+f1+3X333dq6dasaGxvV29urn//855OmLI2NjemWW27Rzp07Jz7W0NCgV77yldq8ebNqa2t17tw5PfDAAxMb7nV1denmm2/WM888M+k5fLFIJKIbb7xRu3fvnviYz+fTrbfeqptuukltbW1KpVI6c+aMnnrqKT3yyCMTz7uZvPWtb9V999038b7f79erXvUq3XDDDaqpqdGxY8f0ne98R0eOHJE0PgXo1ltv1aOPPqrNmzfPeu3z9u7dqy984QuKRqPq6OjQ61//el1yySWyLEs7d+7UN7/5zYkXW771rW/ptttum9jroru7W1VVVXrNa16jl7zkJaqqqtLhw4f19a9/XWfPnpUk7dy5U//zf/5PfepTn8qpnmw2q7e85S0T4eyWW27Ry172MjU3N+vs2bP6/ve/P/H9S6fT+oM/+AO1tLTo7rvvzun6pdLW1qbVq1dPWS2vvb19xhXkZpseVlNToxtvvFFXX321Fi1apKqqKg0MDOiZZ57R97///YnA9OSTT+oNb3iDHn744SnT8Xw+30TIvnC1vGAwOOM0sAv3fDkvk8no1a9+9aQXV8LhsLZv365rr71WjY2N6u/v1y9/+Uv99Kc/lWVZikQiuuuuu/TrX/96yuIiF9qzZ49e+cpXanR0dOJj69at0+tf/3qtWLFCkUhEDz/8sB544AGdOXNGr3/963X55ZfPeD3YzJZxDLhWPtMQRkZGrEceecT62Mc+Zq1du3bK0OTKlSutrq6uGc9/73vfO+n4T3ziE9MeNzg4aL35zW+2JFmmaeY8RP3xj3984jjTNK1vfetbVjabnfXf393dPWmIft26ddbJkyenPfYnP/mJ1dDQMKWu+Rh2ff/73z/p33333XdPO13gzJkz1g033DDt12omdkw9sqypP2urV6+eePuWW27J+TrpdNq6/fbbJ871eDzWBz/4QSsSicx6XiQSsf7zP//Tuvnmm62Pf/zjOdWYKycNwxc69ejyyy+fdN6pU6cmPnfhz8T5Pxs2bLAOHDgw53XvvffeSef94R/+oTU0NDTtsf/93/89aSrTbbfdNuu1X/e610269s0332wdPnx4xuP7+/utT37yk9bHPvaxaT9/8ddu/fr11t69e6ccl0qlrL/927+ddOxll11mxePxGR/7wmPPT/1497vfbUWj0SnH7tq1a9JUwxUrVkxM49u6davV2dk55ZzBwUFr06ZNE+dcOAVwOhf+TJ//3RIOh60f/OAH0x7/pS99adLvoI6Ojhmfk/M19ajY61vW+O/Hq666yrrvvvtmnVI0MDBgvfa1r530OP/6r/8667WL+T3xD//wD5Me63d+53es7u7uaY/9zW9+Y7W0tEx6Ls70s5fJZKwtW7ZMuvbf/u3fWul0esqxjz/+uNXa2rog/weicAQFlNTFv3hbW1ut1atXT/qzePHiST0I0/15/etfP+dc3GPHjlmBQGDSeVdffbX1j//4j/9fe3ceE8X5xgH8yy0iuxURBLFgPZAFLxQPUBGsghYVD4wRLShSxWBt08PYVP15pLYasVKvCgqt6WFQUalG8aIqVNTi0VKsSj0QrIqRQwOKOL8/CJOdPWcBD+z3k2zckfd99x1md5ln5n2fV9i6dauQmJgoxMTEiCfjAITly5fL/sIvKirSal+pVAre3t5C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bW0tvLy84OPjg7S0NKP7TC+BQERE1EApKSkCAPGRkpLS6DYDAwPF9qKiokyu//jxYyEmJkbSL7mPOXPmGGy7rKxMGDZsmEltzps3T297NTU1wrRp02S35ejoKOTm5hr9HTTkmDTk97548WKxjru7u95yUVFRYrnAwEChpKREUKlURvfXwsJCSE1NldWXy5cvC66urkbbVCgUwsGDB7Xeu8bMnDnTaNvXrl2T1MnPzxfatGkj69i+8847QnV1teDu7i7+3+LFiw32KS8vT2jbtq3BdvUdy2fPngmff/65YG5ubvLnZNSoUQb7dezYMcHOzs5oO25ubkJ+fr7W+4NeHbzXQ0RErxVra2skJyeLQxuMXXlv06YNIiIisGPHDqxZs8ZgWaVSiUOHDmH79u3o1auXwbIODg6IiYlBbGys3jKWlpb4/vvvkZGRgd69e+stp1AoMHfuXFy6dAn9+vUz+LrNgYuLC06fPo24uDi9q/L2798fubm5iIqKktVmly5dkJOTg/DwcJ0/Nzc3x6hRo3Du3DnJsCC5kpKSkJmZiXfffRcqlUpcD8MQlUqF33//HaNHj9Y71MnDwwOJiYnIyMgw+S5R7969kZ+fjxUrViAoKAjt2rWT3E0wxMzMDMuWLUN+fj4iIyONLmZnb2+P0aNHIzU1VbwToc/QoUNx8eJFjBw5Uud+W1tbY/LkycjLy4NKpZLVX3o5zAShidcHJyIieoVUVVUhJycHN27cQGlpKWpra2Fvbw83Nzd4eXmha9euDV60q7i4GDk5Obhz5w7Kyspga2sLFxcXqFQq9OjRw+Sx1zdv3kROTg7+/fdfVFVVwdHREZ07d8agQYO00nQ2J9HR0WJmp8DAQElazsrKSmRlZeHmzZuorKyEi4sLBgwYoHPNBLmKi4uRlZWFkpISmJubw83NDQEBAXBzc2vsrjRYUVERTpw4IWbMateuHTw9PeHn59fg919TqqmpQW5uLq5evYrS0lI8fvwY9vb2cHFxgZeXF7p16yZJfypXUVERjh8/juLiYrRo0QIdOnTA4MGD9a5MTa8WBgpERET0XBkKFIjo1cWhR0REREREpIWBAhERERERaWGgQEREREREWhgoEBERERGRFgYKRERERESkhYECERERERFpYXpUIiIiIiLSwjsKRERERESkhYECERERERFpYaBARERERERaGCgQEREREZEWBgpERERERKSFgQIREREREWlhoEBERERERFoYKBARERERkRYGCkREREREpIWBAhERERERaWGgQEREREREWhgoEBERERGRFgYKRERERESkhYECERERERFpYaBARERERERa/g9AjK345XmBAgAAAABJRU5ErkJggg==",
"text/plain": [
""
]
},
"metadata": {
"image/png": {
"height": 386,
"width": 389
}
},
"output_type": "display_data"
}
],
"source": [
"# import matplotlib.pyplot as plt\n",
"# from matplotlib_venn import venn2\n",
"\n",
"set1 = set(hpc_datadriven['Hormone_CT'])\n",
"set2 = set(hpc_precomputed['Hormone_CT'])\n",
"\n",
"plt.figure(figsize=(6,6))\n",
"venn2([set1, set2], set_labels=(\"Data-driven\", \"Precomputated\"))\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "dimensional-membrane",
"metadata": {},
"outputs": [],
"source": [
"## save the files if needed\n",
"# hpc_datadriven.to_csv('hpc_datadriven.csv')\n",
"# hpc_precomputed.to_csv('hpc_precomputed.csv')"
]
},
{
"cell_type": "markdown",
"id": "wired-boutique",
"metadata": {},
"source": [
"## 3. Predict hormone receiving strength"
]
},
{
"cell_type": "markdown",
"id": "designed-blame",
"metadata": {},
"source": [
"Load the hormone receiving definitions from the hormone-receptor reference database. The file is formatted similarly to the earlier one, the pertinent columns being `receptorgene` this time.\n",
"\n",
"Genes excluded from strength calculations but required to meet expression thresholds are hard-coded in utils.py (see Methods in Fei & Huang-Doran (in press)) and may you need to adjust these definitions for your own study."
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "convenient-matthew",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" hormone_short \n",
" hormone_display \n",
" hormone_figures \n",
" Tier \n",
" receptorgene1 \n",
" receptorgene2 \n",
" gene1_name \n",
" gene2_name \n",
" receptor_type_broad \n",
" receptor_type_fine \n",
" receptor_status \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" asprosin \n",
" Asprosin \n",
" Asprosin \n",
" 3 \n",
" OR4M1 \n",
" NaN \n",
" olfactory receptor family 4 subfamily M member 1 \n",
" NaN \n",
" gpcr \n",
" NaN \n",
" established \n",
" \n",
" \n",
" 1 \n",
" asprosin \n",
" Asprosin \n",
" Asprosin \n",
" 3 \n",
" PTPRD \n",
" NaN \n",
" protein tyrosine phosphatase receptor delta \n",
" NaN \n",
" enzyme_linked \n",
" NaN \n",
" established \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" hormone_short hormone_display hormone_figures Tier receptorgene1 \\\n",
"0 asprosin Asprosin Asprosin 3 OR4M1 \n",
"1 asprosin Asprosin Asprosin 3 PTPRD \n",
"\n",
" receptorgene2 gene1_name gene2_name \\\n",
"0 NaN olfactory receptor family 4 subfamily M member 1 NaN \n",
"1 NaN protein tyrosine phosphatase receptor delta NaN \n",
"\n",
" receptor_type_broad receptor_type_fine receptor_status \n",
"0 gpcr NaN established \n",
"1 enzyme_linked NaN established "
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"receptor_definition=hormone2cell.data.load_hormone_receptor_file()\n",
"receptor_definition.head(2)"
]
},
{
"cell_type": "markdown",
"id": "distributed-greene",
"metadata": {},
"source": [
"### 3.1 Identify hormone-receiving cell types using data-derived thresholds."
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "waiting-generation",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from current data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from current data\n",
" 4) Apply hormone rules to compute the final table\n",
" Hormone Celltype_tissue Strength Tissue\n",
"612 resistin Pancreas____pancreatic stellate cell 14.868078 Pancreas\n",
"52 igf2 Pancreas____endothelial cell 12.381264 Pancreas\n",
"Before removing duplicates: (837, 7)\n",
"After removing duplicates: (311, 7)\n",
"Finally hormone2cell finds: 311 hormone-celltype pairs.\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Hormone \n",
" Celltype_tissue \n",
" Strength \n",
" Tissue \n",
" hormone_display \n",
" hormone_short \n",
" Tier \n",
" assay \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" gastrin \n",
" Pancreas____pancreatic D cell \n",
" 0.422587 \n",
" Pancreas \n",
" Gastrin \n",
" gastrin \n",
" 2 \n",
" cell \n",
" \n",
" \n",
" 1 \n",
" gastrin \n",
" Pancreas____pancreatic PP cell \n",
" 0.303184 \n",
" Pancreas \n",
" Gastrin \n",
" gastrin \n",
" 2 \n",
" cell \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Hormone Celltype_tissue Strength Tissue \\\n",
"0 gastrin Pancreas____pancreatic D cell 0.422587 Pancreas \n",
"1 gastrin Pancreas____pancreatic PP cell 0.303184 Pancreas \n",
"\n",
" hormone_display hormone_short Tier assay \n",
"0 Gastrin gastrin 2 cell \n",
"1 Gastrin gastrin 2 cell "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 389 ms, sys: 3.74 ms, total: 392 ms\n",
"Wall time: 414 ms\n"
]
},
{
"data": {
"text/plain": [
"(311, 8)"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"mask=ave_all['suspension_type']=='cell'\n",
"ave_all_cell=ave_all.loc[mask]\n",
"dt_cell=hormone2cell.hormone_strength(\n",
" ave_all = ave_all_cell,\n",
" geneset_definition = receptor_definition,\n",
" celltype_column = \"Celltype_tissue\",\n",
" tissue_col = \"Tissue\",\n",
" adjustment = False,\n",
" assay = \"cell\",\n",
" include_cols = ['receptorgene1', 'receptorgene2'],\n",
" exclude_cols =[],\n",
" # initial thresholds\n",
" thresh_expr_low = 0.01,\n",
" thresh_pct = 5,\n",
" # filtering thresholds (first pass)\n",
" thresh_included_initial = 0.1,\n",
" thresh_excluded_initial = 0.15,\n",
" max_expression_file='max_expression_cell_receptor.csv'\n",
")\n",
"display(dt_cell.head(2))\n",
"dt_cell.shape"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "harmful-words",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from current data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from current data\n",
" 4) Apply hormone rules to compute the final table\n",
" Hormone Celltype_tissue Strength Tissue\n",
"481 igf2 Pancreas____pancreatic acinar cell 18.891066 Pancreas\n",
"568 igf2 Pancreas____pancreatic ductal cell 16.461430 Pancreas\n",
"Before removing duplicates: (744, 7)\n",
"After removing duplicates: (291, 7)\n",
"Finally hormone2cell finds: 291 hormone-celltype pairs.\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Hormone \n",
" Celltype_tissue \n",
" Strength \n",
" Tissue \n",
" hormone_display \n",
" hormone_short \n",
" Tier \n",
" assay \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" gastrin \n",
" Pancreas____pancreatic D cell \n",
" 0.422587 \n",
" Pancreas \n",
" Gastrin \n",
" gastrin \n",
" 2 \n",
" cell \n",
" \n",
" \n",
" 1 \n",
" gastrin \n",
" Pancreas____pancreatic PP cell \n",
" 0.303184 \n",
" Pancreas \n",
" Gastrin \n",
" gastrin \n",
" 2 \n",
" cell \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Hormone Celltype_tissue Strength Tissue \\\n",
"0 gastrin Pancreas____pancreatic D cell 0.422587 Pancreas \n",
"1 gastrin Pancreas____pancreatic PP cell 0.303184 Pancreas \n",
"\n",
" hormone_display hormone_short Tier assay \n",
"0 Gastrin gastrin 2 cell \n",
"1 Gastrin gastrin 2 cell "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"(291, 8)"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mask=ave_all['suspension_type']=='nucleus'\n",
"ave_all_nucleus=ave_all.loc[mask]\n",
"dt_nucleus=hormone2cell.hormone_strength(\n",
" ave_all = ave_all_nucleus,\n",
" geneset_definition = receptor_definition,\n",
" celltype_column = \"Celltype_tissue\",\n",
" tissue_col = \"Tissue\",\n",
" adjustment = False,\n",
" assay = \"cell\",\n",
" include_cols = ['receptorgene1', 'receptorgene2'],\n",
" exclude_cols =[],\n",
" # initial thresholds\n",
" thresh_expr_low = 0.01,\n",
" thresh_pct = 5,\n",
" # filtering thresholds (first pass)\n",
" thresh_included_initial = 0.1,\n",
" thresh_excluded_initial = 0.15,\n",
" max_expression_file='max_expression_nucleus_receptor.csv'\n",
")\n",
"display(dt_cell.head(2))\n",
"dt_nucleus.shape"
]
},
{
"cell_type": "markdown",
"id": "alike-corrections",
"metadata": {},
"source": [
"#### 3.2.1 Combine results from single cell and single nucleus data."
]
},
{
"cell_type": "code",
"execution_count": 35,
"id": "advanced-example",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(424, 9)"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hrc_datadriven=hormone2cell.combine_assay(cell=dt_cell, nucleus=dt_nucleus,celltype_column='Celltype_tissue')\n",
"hrc_datadriven.shape"
]
},
{
"cell_type": "markdown",
"id": "upset-interim",
"metadata": {},
"source": [
"### 3.2 Identify hormone-receiving cell types using precomputed thresholds from the Hormone Cell Atlas."
]
},
{
"cell_type": "code",
"execution_count": 36,
"id": "antique-sentence",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from precomputed data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from precomputed data\n",
" 4) Apply hormone rules to compute the final table\n",
" Hormone Celltype_tissue Strength Tissue\n",
"612 resistin Pancreas____pancreatic stellate cell 14.868078 Pancreas\n",
"52 igf2 Pancreas____endothelial cell 12.381264 Pancreas\n",
"Before removing duplicates: (848, 7)\n",
"After removing duplicates: (311, 7)\n",
"Finally hormone2cell finds: 311 hormone-celltype pairs.\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Hormone \n",
" Celltype_tissue \n",
" Strength \n",
" Tissue \n",
" hormone_display \n",
" hormone_short \n",
" Tier \n",
" assay \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" gastrin \n",
" Pancreas____pancreatic D cell \n",
" 0.422587 \n",
" Pancreas \n",
" Gastrin \n",
" gastrin \n",
" 2 \n",
" cell \n",
" \n",
" \n",
" 1 \n",
" gastrin \n",
" Pancreas____pancreatic PP cell \n",
" 0.303184 \n",
" Pancreas \n",
" Gastrin \n",
" gastrin \n",
" 2 \n",
" cell \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Hormone Celltype_tissue Strength Tissue \\\n",
"0 gastrin Pancreas____pancreatic D cell 0.422587 Pancreas \n",
"1 gastrin Pancreas____pancreatic PP cell 0.303184 Pancreas \n",
"\n",
" hormone_display hormone_short Tier assay \n",
"0 Gastrin gastrin 2 cell \n",
"1 Gastrin gastrin 2 cell "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 390 ms, sys: 2.1 ms, total: 392 ms\n",
"Wall time: 394 ms\n"
]
},
{
"data": {
"text/plain": [
"(311, 8)"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"mask=ave_all['suspension_type']=='cell'\n",
"ave_all_cell=ave_all.loc[mask]\n",
"dt_cell=hormone2cell.hormone_strength(\n",
" ave_all = ave_all_cell,\n",
" geneset_definition = receptor_definition,\n",
" celltype_column = \"Celltype_tissue\",\n",
" tissue_col = \"Tissue\",\n",
" adjustment = False,\n",
" assay = \"cell\",\n",
" include_cols = ['receptorgene1', 'receptorgene2'],\n",
" exclude_cols =[],\n",
" # initial thresholds\n",
" thresh_expr_low = 0.01,\n",
" thresh_pct = 5,\n",
" # filtering thresholds (first pass)\n",
" thresh_included_initial = 0.1,\n",
" thresh_excluded_initial = 0.15,\n",
" use_precomputed='cell',\n",
" max_expression_file='max_expression_cell_receptor2.csv'\n",
")\n",
"display(dt_cell.head(2))\n",
"dt_cell.shape"
]
},
{
"cell_type": "code",
"execution_count": 37,
"id": "genetic-cooking",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 1) Filter the input expression table\n",
" 2) Build gene–celltype matrix for included genes (lower threshold)\n",
" Use Max_logExp from precomputed data\n",
" 3) Build gene–celltype matrix for excluded genes (higher threshold)\n",
" Use Max_logExp from precomputed data\n",
" 4) Apply hormone rules to compute the final table\n",
" Hormone Celltype_tissue Strength Tissue\n",
"481 igf2 Pancreas____pancreatic acinar cell 18.891066 Pancreas\n",
"568 igf2 Pancreas____pancreatic ductal cell 16.461430 Pancreas\n",
"Before removing duplicates: (744, 7)\n",
"After removing duplicates: (291, 7)\n",
"Finally hormone2cell finds: 291 hormone-celltype pairs.\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" \n",
" Hormone \n",
" Celltype_tissue \n",
" Strength \n",
" Tissue \n",
" hormone_display \n",
" hormone_short \n",
" Tier \n",
" assay \n",
" \n",
" \n",
" \n",
" \n",
" 0 \n",
" gastrin \n",
" Pancreas____pancreatic acinar cell \n",
" 5.188416 \n",
" Pancreas \n",
" Gastrin \n",
" gastrin \n",
" 2 \n",
" nucleus \n",
" \n",
" \n",
" 1 \n",
" insulin \n",
" Pancreas____pancreatic acinar cell \n",
" 7.339443 \n",
" Pancreas \n",
" Insulin \n",
" insulin \n",
" 1 \n",
" nucleus \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Hormone Celltype_tissue Strength Tissue \\\n",
"0 gastrin Pancreas____pancreatic acinar cell 5.188416 Pancreas \n",
"1 insulin Pancreas____pancreatic acinar cell 7.339443 Pancreas \n",
"\n",
" hormone_display hormone_short Tier assay \n",
"0 Gastrin gastrin 2 nucleus \n",
"1 Insulin insulin 1 nucleus "
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"(291, 8)"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mask=ave_all['suspension_type']=='nucleus'\n",
"ave_all_nucleus=ave_all.loc[mask]\n",
"dt_nucleus=hormone2cell.hormone_strength(\n",
" ave_all = ave_all_nucleus,\n",
" geneset_definition = receptor_definition,\n",
" celltype_column = \"Celltype_tissue\",\n",
" tissue_col = \"Tissue\",\n",
" adjustment = False,\n",
" assay = \"nucleus\",\n",
" include_cols = ['receptorgene1', 'receptorgene2'],\n",
" exclude_cols =[],\n",
" # initial thresholds\n",
" thresh_expr_low = 0.01,\n",
" thresh_pct = 5,\n",
" # filtering thresholds (first pass)\n",
" thresh_included_initial = 0.1,\n",
" thresh_excluded_initial = 0.15,\n",
" use_precomputed='nucleus',\n",
" max_expression_file='max_expression_nucleus_receptor2.csv'\n",
")\n",
"display(dt_nucleus.head(2))\n",
"dt_nucleus.shape"
]
},
{
"cell_type": "markdown",
"id": "lasting-butterfly",
"metadata": {},
"source": [
"#### 3.2.1 Combine results from single cell and single nucleus data."
]
},
{
"cell_type": "code",
"execution_count": 38,
"id": "portuguese-frost",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(427, 9)"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"hrc_precomputed=hormone2cell.combine_assay(cell=dt_cell, nucleus=dt_nucleus,celltype_column='Celltype_tissue')\n",
"hrc_precomputed.shape"
]
},
{
"cell_type": "markdown",
"id": "fifteen-separation",
"metadata": {},
"source": [
"Visulization of the hormone producing cell types from two methods."
]
},
{
"cell_type": "code",
"execution_count": 39,
"id": "olympic-fairy",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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sA8AAAAUKcI+AAAAUKQI+wAAAECRIuwDAAAARYqwDwAAABQpwj4AAABQpAj7AAAAQJEi7AMAAABFirAPAAAAFCnCPgAAAFCkCPsAAABAkSLsAwAAAEWKsA8AAAAUKcI+AAAAUKQI+wAm1fe+9z0ZhpF6myrbtm1L3cc73vGOKbsfAAAKGWEfAAAAE/KOd7wjNQCzbds2u8tBGqfdBQDSwGjwX/3VX434edM05fF4VF5errq6Oi1evFjnn3++LrvsMl111VUqLy+fxmpH95WvfEXd3d2SBkafedADAAB2IeyjICSTSYVCIYVCIbW0tGj37t367W9/K0nyeDy64YYb9IEPfECbN2+2udKBsH/8+PHUMWEf+S7bk21J8nq9qqio0IIFC7Rhwwa99rWv1fXXXy/T5AVi5L/u7m595StfSR2/4x3v0KJFi2yr56xf/epX2rlzpyRp0aJFtCRiShD2kZfq6+tVVlaW8bH+/n51d3crHA5nfDwSiejnP/+5fv7zn+vNb36zvvnNb6qmpmY6y4UNHn74YbtLmFHC4bDC4bBaWlq0fft2ffOb39SyZcv0rW99iye0yHvd3d36xCc+kTretm1b3oT973//+5KkrVu3EvYxJQj7yEuf//znR3zQ6+vr0/PPP68nn3xS3/ve93Tw4MHU5372s59p+/bteuKJJzR37txpqhYoLsM92Q6FQmptbVU8Hk997NChQ7rmmmv04x//WG9961unu0wAQA54/RUFp6ysTNu2bdPtt9+ul19+WT/72c8yRvKPHz+u17zmNerr67OxSqBwff7zn9ehQ4cy3k6fPq3e3l799re/1dq1a1PnJpNJvf3tb9fhw4ftKxgAMCJG9lHQDMPQm970Jm3cuFHbtm1LBY5du3bpQx/6kL75zW9mvUYkEtFLL72k/fv3q7W1VaFQSBUVFZo9e7Y2bdqkefPmTfWXMaxTp07ppZde0tGjR9XT0yOn06nq6mqtXLlSl1xyidxu97TX1NfXpwceeEDHjx9XLBbTvHnztH79ei1fvnzS7+ull17S7t271djYKMuydOmll+rKK6+c9PuZbEePHtX27dvV0tKi/v5+1dXVacWKFbrsssvkcDgm5T6effZZ7du3T01NTSotLdWyZcu0bds2eb3eSbn+SHw+n2644QZde+21uv7661OtVNFoVJ/61Kf0ve99b0rvHwAwdoR9FIV58+bpF7/4hTZt2qRQKCRJ+s53vqPbb79dCxYsOOf8trY23XXXXfrFL36hp5566px5AOnWrVunf/7nf9ab3vSmEc8ZaYLjJz7xiYw+0XTf/e53z2lVevjhh3XXXXfpnnvu0bFjx0a8P7/fr3e+8526/fbbNWfOnBHPmyyBQEC333677rjjjtT3N93mzZv11a9+VRs2bMj5mg8//LCuuuqq1PHRo0e1aNEi/fSnP9UnP/lJ7dmzJ+P817/+9Rlhf9u2bXrkkUckSbfccss5QfPv/u7v9N///d+SpPLycrW0tIwpDL/3ve/Vt771LUlSbW2tGhsb5XK5hj03mUzq+9//vr7whS9o//79w55TU1Oj97///frwhz+ctY6hv0+WZUmSfvKTn+hjH/uYDhw4cM5tSktL9ZGPfET/9E//NGlPKkbi8Xh0xx13aMWKFUokEpKk3/3ud0omkzlN2A0EAnr00Ud16tQptbe3q7a2Vm9961tVUVEx4m2ampr05JNPqrm5Wb29vaqpqdGSJUu0ZcsWeTyeCX097e3teuKJJ9Tc3KyOjg653W7NmjVLF1xwgdasWTPm7+fJkyf15JNPqqWlRcFgUHV1dVq6dKk2b9484u/QWB09elTPPvusTp06pUQioaVLl+oVr3jFqN/D9vZ2PfLIIzp69KgSiYQaGhp09dVXT0rLYyAQ0MMPP6wTJ06or69Pc+bM0caNG7VixYoJXzufWJal/fv3a+/evTp16pQCgYD8fr9qa2u1fv16nX/++VO6v0g2nZ2devzxx9XY2Kiuri5VVlZqwYIF2rZtm0pKSsZ93VOnTunRRx/V6dOn5fV6NW/ePG3ZskW1tbWTWD2mjAXkge9+97uWpNTbd7/73XFd5//7//6/jOvcdtttw573sY99LOO8XN7e/e53W7FYLKf6c3kb7msc6zVmzZplPf300+P6XuWqsbHRWr58edZaPB6P9ZOf/OSc78VIHnrooYzzjh49av3t3/7tiNd//etfn3H7rVu3pj53yy23nHP9p556KuP2d911V85fczgctiorK1O3vfXWW0c8t7m52br00ktz/pmdf/751unTp0e9/+G+h7feemtO13/LW95iJZPJnL/W4e4v17+/iy++OON2R44cSX1uuJ9PW1ubdcstt1h+v/+cul944YVh7+NXv/qVdfHFF1uGYQz79ZaWllp///d/b3V1dY3pa7Ysy/rNb35jbdq0acRrS7IqKiqsm2++2dq5c2fW6/3ud7+z1q9fP+K1ysvLrfe///1WR0dHTvUN9zPZs2ePdfXVVw9bs8/nsz72sY9ZiUQi4zrNzc3W2972NsvpdJ5zG8MwrJtvvtnq7OzMWs8tt9ySut3WrVsty7KsQCBgve9977NKSkqG/Zo3bdpkPffcc1mvffTo0YzbPfTQQzl9j7I93qTXnOvb0aNHM64RDoetu+66y3rzm99sVVdXj3rbhoYG64tf/KIVCoVy/lpzeRvuMS7dI488Ym3bts1yOBzD3t7r9Vpvf/vbsz72DHXkyBHrVa961bC/b2632/rzP/9zq7W19Zzv9dnfD+QHRvZRVG677Tb953/+Z+r4vvvuy3qbuXPnavPmzVqzZo1qamrkdDrV3Nysxx57TPfff7+SyaQk6Y477lB9fb3+7d/+7ZxrlJeXa+nSpZIG5gycncRYVVWl6urqYe93tL0BnE6nNm7cqEsvvVQLFy5URUWF+vv7tXfvXv3mN7/RqVOnJEktLS264YYb9OKLL07JCH8wGNS1116bMZJcU1Ojt771rbrooosUj8e1c+dO3X333ert7dU73/lO/d3f/d247usrX/lKaiR+2bJlesMb3qAlS5YomUzqwIEDCgaDY7repk2bdN5556UmcN955516y1vektNtf/vb36b2SpCkm2++edjzmpqadMUVV+jIkSOpj82ZM0eve93rdMEFF6ikpEQnTpzQr3/969Tyenv37tXWrVv1/PPP57w/xGc+8xl9/etflyStXbtWN9xwgxYuXKhIJKKnn35ad911l2KxmCTppz/9qbZt26b3ve99OV17IpYuXarnnnsuddzW1qbFixcPe+6uXbv0qle9Sk1NTTldOxAI6M///M/1+9//Put5X/3qV3X33Xfr/vvv1/nnn5/12r29vXrrW9+qe+65J+u5PT09uvPOO1VdXZ2xdGO6eDyud73rXfrBD36Q9X6/9rWv6cc//rH+8Ic/6JJLLsl6/+l+85vf6C/+4i9G/FsIhUL6xCc+oZdfflk//vGPZRiGdu/erWuvvVbNzc3D3sayLN15553at2+fHnzwwXMmZo+msbFR1157rfbu3TviOU8//bQ2bdqkO+64Q7fcckvO184nTz31VM4T0BsbG/XBD35Qd999t379619r1qxZU1pbPB7X3/zN3+jb3/72qOeFw2H94Ac/0K9+9Sv99re/zakl8pFHHtENN9ygQCAw7Oej0ah+8pOf6LHHHtO99947rvoxPQj7KCpLlizJCHh79+5VW1ub6urqMs4zTVNveMMbdNttt2nLli0jvuy6d+9eveUtb0m1lHzuc5/TLbfcck6P+hvf+Ea98Y1vlDSwVvLZdfbf//736+Mf/3jO9c+ZM0cf+tCH9La3ve2cms/66le/qs9//vP613/9V1mWpfb2dn3oQx/SD3/4w5zvJ1cf//jHM9pprr/+ev3oRz865wnMJz7xCb35zW/W008/rS996Uvjuq+vfvWrkqR/+7d/m7RWlJtvvlkf/ehHJUn33HPPsL8Lw7nzzjtT769YsUKXXnrpOeckk0ndfPPNqaBvGIb+5V/+Rbfffvs5bTof//jH9c1vflO33nqrEomEDh06pA984ANZ/4M+61//9V/l9Xp1xx136Kabbsr43N/93d/pAx/4gF7xileoq6tLkvSpT31K733ve6e8nSd9ZR5JI95fV1eX3vCGN6ipqUlut1uvfvWrtXnzZlVXV6utrU333XdfRvtPf3+/rrrqqownElVVVXrta1+rdevWpdqy/vjHP+qxxx6TNBCyzj6JGq5176ze3l5dccUVeumll1Ifc7lcuvrqq7VlyxbNmjVLsVhMp0+f1rPPPquHH3449URqJG9729t01113pY7dbrde97rX6fLLL1dZWZmOHDmiu+++W4cOHZI00E5z9dVX69FHH9W6detGvfZZe/bs0Te+8Q0Fg0HNnTtXN954o1auXCnLsvTcc8/phz/8oSKRiKSBdq9rrrkmtRdCc3OzSkpK9IY3vEGXXHKJSkpKdPDgQf3gBz9IPfl67rnn9NGPflT/8R//kVM9yWRSN910UyroX3XVVbruuutUW1urpqYm/frXv079/M4+Gaqrq9OrX/3qnK4/WWbNmqWlS5cqHo9n7H/S0NAgn8837G1Ga7UqKyvTFVdcoQ0bNmj27NkqKSlRZ2ennn/+ef36179Wf3+/JOmZZ57RW97yFj300EPntLa5XK7U4FBra2tqMQmv1ztiS9VwTxoSiYT+7M/+LOMJsd/v1w033KBLL71U1dXV6ujo0IMPPqh77rlHlmWpt7dX119/vR577LFR2y53796t1772tRlBf/ny5brxxhu1aNEi9fb26qGHHtIf//hHnT59WjfeeKMuvPDCEa8Hm9n7wgIwYLLaeCzLst7+9rdnXOuee+4555zRXmIdqrGx0aqpqUldb6TWoLMWLlyYOvdjH/vYmGofS1233357xsupLS0tY7qvbBobGzNe9l+9erUVDAZHPL+jo8NasGDBOS/1jmRoG48k65//+Z9zri9bG49lDbxcnv7y89e+9rWs121vb7dcLlfqNp/+9KeHPe/73/9+Ru3/8R//kfXaX/nKVzLaJw4ePDjsecO1hf3sZz8b9dr/8z//k3H+/fffn7Weke4v17+/Cy+8MON2J06cSH0u/edz9u3888+39u/fn/W673jHOzJu9973vtfq7u4e9txf/vKXGW1B11xzzajXfvOb35xx7a1bt474c7Csgd/rL3zhC9ZnPvOZYT8/9Hu3YsUKa8+ePeecF4vFrI985CMZ515wwQVWOBwe8b7Tzz37e/zXf/3Xw/4d7tq1K6P1bNGiRdYb3vAGS5K1efNm69SpU+fcpqury1q7dm3qNi6Xy2pvbx+xnvQ2DdM0LUmW3++3fvOb3wx7/v/8z/+kzpNkzZ071+rt7R323Klq45no9S1r4LFq/fr11l133TXqY3RnZ6f1pje9KeN+vvWtb4167Ym0vnz84x/PuK/Xv/71VnNz87DnPv7441ZdXV3G3+JIv3uJRMLauHFjxrU/8pGPWPF4/Jxzn3zySau+vj7jd2I8XwumFmEfeWEyw/5HP/rRjGv98Ic/nHB96Q+qK1asGPXciYT9sQgEAhl9sv/3f/83qdf/7Gc/O+bweOedd4477M+ePXvU4DNULmHfsixry5YtqfMuueSSrNf9+te/nhGwjh07Nux5q1evTp23efPmnGpOJpPWqlWrUrf7x3/8x2HPG/r38MpXvjLrtfv7+zNC70hPUnK5v1z+/nbs2JFxm4aGhozPDw37NTU1VlNTU9brPvzwwxm3+/u///ust/nlL3+ZcZs//elPw573hz/8IeO8q6++eky/c0NFo1Fr1qxZqetVV1dbx48fH/U273vf+zJq+K//+q8Rzx36t/TmN7951Gt/+ctfPuc2S5cutfr6+ka8zXPPPZdx/v/+7/+OeO5w/e/ZnoT++7//e8b5n/rUp4Y9L5/D/lgGYWKxmHXllVem7mft2rWjnj/esH/48OGM/vw3vOENWefqbN++PWMA54477hj2vLvvvjvje/Xud7971Os+/fTT58wVIOznF9bZR9GpqqrKOO7s7JzwNa+55prU+wcOHFBvb++ErzlRJSUl2rRpU+p4+/btk3r93/3ud6n3Fy9erFe84hVZb/OWt7xFlZWV47q/P//zP5/wqirDefvb3556f/v27cOuZJMuvR1qy5YtWrhw4Tnn7N69Wy+++GLq+B/+4R9yqsUwjIy+5fvvvz+n2w230tNQfr9fa9asSR3v27cvp2uPR0dHxzn916OtViUNtCLNnj0767XT28AWL16sf//3f896mz/7sz/T9ddfnzr+xje+Mex56dcqKSnR97///Qn9zv3iF79QS0tL6vijH/3oqC1E0sAeBvX19anj//qv/8rpvlwuV6rVbSQ33XTTOS2Jn//851VaWjribTZs2JAxz+GZZ57JqR5Juvbaa7P+3G+77baMFXm+/e1vp1aXKhRjWcXL6XTqk5/8ZOp4586dI86XmIivfOUrqZWwysvLdccdd2RdBejiiy/Wu9/97tTxSH8nd9xxR+r98vJyff7znx/1uhs3bmTn3zxH2EfRGfof22QE8/SQYlmWGhsbJ3zNyZBe1+nTpyftuolEQi+88ELq+Nprr83pdm63W9u2bRvXfV5++eXjul02N954Y8Z/1un9+EMdOnRITz/9dOo4/YlCurN94tJAn/p1112Xcz0bN25Mvb9nz55Uj+9o0p/UjaahoSH1fvoE48kQDod14MABffWrX9WaNWsyet7Ly8t1++23j3hbh8Oht73tbVnvo6enJ6P/+NZbb815qcr0sPHAAw+cEyjb29v10EMPpY5vuummCe+hkf6E2Ov15vSkrKysLGPC9969e3X06NGst7vmmmsyfr7Dqa+vz/iaysvL9frXvz7rtdevX596f6SlY4fznve8J+s5TqdT73znO1PHx44dy3iiXIw2b96c8SRysgdiJOn//u//Uu/fcsstIy4EMVT638mOHTvOGQwLhUJ64IEHUsdvfOMbc7r2e9/73pzuH/Yg7KPoDN05d7R1pyORiH7xi1/o3e9+ty699FLNmjVLfr9fhmFkvJ133nkZt+vp6ZmS2s86ePCgPv3pT+uGG27QkiVLVFVVJafTeU5dP/rRj6akppMnT2as+HHBBRfkfNvxTtI6O2FtslVUVOh1r3td6viHP/zh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rrvuUmdnZ8ba7ulPCEayfv36jJVism12hNxs27YtY4R3Mp84XnHFFRnX/sUvfjHha6bvf/Dkk0+es+zvSNLX5x96nUKS6yDAvffem3F8ySWXnHNORUVFxs8n1+Uq0/fFGM3Q/RrGMxCT6+BQLo+Vw9WVa03r16/PaK2ZzL+TtWvXZrQw3nfffTnd7tlnny3IidczBWEfBc2yLP385z/X2rVrM3r1161bN+Kuf+k7XA79T3e46//1X//1mEZpFi1alHo/15H39Jq6u7uzLl/2/PPP6wtf+ELONY3HLbfckvEf0T/8wz+MuqpEV1fXqBsr5YP58+dnbPp155136qc//WnqCZZhGDlt/mSapv7f//t/qeMf/vCH+slPfjLmeqZqCddCVVdXp6uvvjp1PJlPomprazOu/eMf/3jC65+nPyEOh8P6/ve/n/U2gUAg45WkCy+8MOMxo5B861vfynpOIpHQd7/73dTxokWLdNFFF51zntvtzpijkcveAydPnsw5WA+dJzCegZhcBockpeYGjbWuXGtyOBwZe4D893//9zkrqo2Xz+fL2C39F7/4RU4hPn3XXeQfwj4KTiAQ0COPPKLPfvazWrFihd785jdnvNy/ePFi/f73vx9xElj6JiEPPPDAiKG5u7tbN910k+6+++5hV8IZSfoo3cMPP6y77ror6wj8VVddlTGa8q53vWvEyV1//OMfde211yoajY6prrGaPXt2RhvUrl279KY3vWnYB/7GxkbdcMMNOn78+JTWNBnSR+6ffvppffGLX0wdb9u2TfPnz8/pOrfcckvqP0XLsvS2t71NH/3oR7OO7vb19eknP/mJtm3bxisCw0h/wvjYY4+N60ntSE+iPvjBD6beDwQCuuWWW3IOcMP5sz/7s4x+5k984hNZWyo+8pGPZLSevO997xv3/dvtvvvu069+9atRz/na176WsSvvu971rhH789MfO3/+85+PGjIty9Lf/u3f5hxyKyoqVFlZmToez0DMo48+mvXv++tf//qY1ppPf6J38ODBnH8f/+mf/kkOh0PSwHLT73//+3O+z7NG+jt597vfnXq/t7dXH/nIR0a9zvbt2/Wd73xnzPePaWQBeeC73/2uJSn1Vl9fby1dujTjbc6cOZbP58s4b+jbjTfeaHV0dIx6X0eOHLE8Hk/G7TZs2GB96lOfsr7zne9YX/va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",
"text/plain": [
""
]
},
"metadata": {
"image/png": {
"height": 387,
"width": 381
}
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"from matplotlib_venn import venn2, venn3\n",
"\n",
"set1 = set(hrc_datadriven['Hormone_CT'])\n",
"set2 = set(hrc_precomputed['Hormone_CT'])\n",
"\n",
"plt.figure(figsize=(6,6))\n",
"venn2([set1, set2], set_labels=(\"Data-driven\", \"Precomputated\"))\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 40,
"id": "funky-trouble",
"metadata": {},
"outputs": [],
"source": [
"# hrc_datadriven.to_csv('hrc_datadriven.csv')\n",
"# hrc_precomputed.to_csv('hrc_precomputed.csv')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "hormone2cell_env2",
"language": "python",
"name": "hormone2cell_env2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.19"
}
},
"nbformat": 4,
"nbformat_minor": 5
}