diff --git a/.gitattributes b/.gitattributes
index c7d9f3332a950355d5a77d85000f05e6f45435ea..674c654a8495256720a116701fc99c9e108740d7 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -32,3 +32,25 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text
*tfevents* filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/4_markers_tresholds.ipynb filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S1_bs.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S2_bs.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S3_bs.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_bs/TMA_bs.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_data/DD3S1.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_data/DD3S2.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_data/DD3S3.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_data/TMA.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_mt/all_Samples_Set_A.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_mt/DD3S1_mt.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_mt/DD3S2_mt.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_mt/DD3S3_mt.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_mt/TMA_mt.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S1_qc_eda.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S2_qc_eda.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S3_qc_eda.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_qc_eda/TMA_qc_eda.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S1_zscore.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S2_zscore.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S3_zscore.csv filter=lfs diff=lfs merge=lfs -text
+wetransfer_data-zip_2024-05-17_1431/test_zscore/TMA_zscore.csv filter=lfs diff=lfs merge=lfs -text
diff --git a/wetransfer_data-zip_2024-05-17_1431/1_qc_eda-Copy1.ipynb b/wetransfer_data-zip_2024-05-17_1431/1_qc_eda-Copy1.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..47cae6ffb458ab01ef00fe2eaf868bf933026ace
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/1_qc_eda-Copy1.ipynb
@@ -0,0 +1,4904 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "5fad9226-7ffa-41fc-a6d8-55dcdd1c9eb5",
+ "metadata": {},
+ "source": [
+ "# CyCIF PYTHON PIPELINE"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "8337a11b-813a-4abd-8a5e-45a1dcde430f",
+ "metadata": {},
+ "source": [
+ "This sequence of Jupiter Notebooks is designed to run the CyCIF analysis after the ASHLAR registratiom step.\n",
+ "When a '*' is on a part name (see the table of content to your left), it means the user have an input to give.\n",
+ "The pipeline is composed of 5 Notebooks (see README file)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "87b047ee-225e-415d-a0ae-17f30c0d5f35",
+ "metadata": {},
+ "source": [
+ "# I. QC/EDA NOTEBOOK"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "fbb817d5-aee1-447a-a8dd-786bbd3cc381",
+ "metadata": {},
+ "source": [
+ "10/01/24\n",
+ "Modifications by ZoƩ Gerber\n",
+ "from an original code from Marilyne Labrie"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "a48dc9ff-3dd1-4f86-bbb5-68bc6254b787",
+ "metadata": {},
+ "source": [
+ "I.1. PACKAGES IMPORT\n",
+ "I.2. DIRECTORIES\n",
+ "I.3. FILES\n",
+ " I.3.1. DATA\n",
+ " I.3.2. NOT_INTENSITIES\n",
+ "I.4. QC CHECKS\n",
+ "I.5. COLUMNS OF INTERESTS\n",
+ "I.6. EXPOSURE TIME\n",
+ "I.7. COLORS WORKFLOW\n",
+ " I.7.1. CHANNELS COLORS\n",
+ " I.7.2. ROUNDS COLORS\n",
+ " I.7.3. SAMPLES COLORS\n",
+ " I.7.4. CLUSTERS COLORS\n",
+ "I.8. SAVE"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "46755cfd-7896-4ca0-ba50-6792612e7650",
+ "metadata": {},
+ "source": [
+ "## I.1. PACKAGES IMPORT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "d52f4de4-6db2-4590-9574-326ccf5bc97e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import warnings\n",
+ "import os\n",
+ "import plotly as plt\n",
+ "import seaborn as sb\n",
+ "\n",
+ "from my_modules import *"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "da8aaae9",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Requirement already satisfied: panel in /opt/anaconda3/lib/python3.11/site-packages (1.3.8)\n",
+ "Requirement already satisfied: watchfiles in /opt/anaconda3/lib/python3.11/site-packages (0.21.0)\n",
+ "Requirement already satisfied: bokeh<3.4.0,>=3.2.0 in /opt/anaconda3/lib/python3.11/site-packages (from panel) (3.3.4)\n",
+ "Requirement already satisfied: param<3.0,>=2.0.0 in /opt/anaconda3/lib/python3.11/site-packages (from panel) (2.0.2)\n",
+ "Requirement already satisfied: pyviz-comms>=2.0.0 in /opt/anaconda3/lib/python3.11/site-packages (from panel) (2.3.0)\n",
+ "Requirement already satisfied: xyzservices>=2021.09.1 in /opt/anaconda3/lib/python3.11/site-packages (from panel) (2022.9.0)\n",
+ "Requirement already satisfied: markdown in /opt/anaconda3/lib/python3.11/site-packages (from panel) (3.4.1)\n",
+ "Requirement already satisfied: markdown-it-py in /opt/anaconda3/lib/python3.11/site-packages (from panel) (2.2.0)\n",
+ "Requirement already satisfied: linkify-it-py in /opt/anaconda3/lib/python3.11/site-packages (from panel) (2.0.0)\n",
+ "Requirement already satisfied: mdit-py-plugins in /opt/anaconda3/lib/python3.11/site-packages (from panel) (0.3.0)\n",
+ "Requirement already satisfied: requests in /opt/anaconda3/lib/python3.11/site-packages (from panel) (2.31.0)\n",
+ "Requirement already satisfied: tqdm>=4.48.0 in /opt/anaconda3/lib/python3.11/site-packages (from panel) (4.65.0)\n",
+ "Requirement already satisfied: bleach in /opt/anaconda3/lib/python3.11/site-packages (from panel) (4.1.0)\n",
+ "Requirement already satisfied: typing-extensions in /opt/anaconda3/lib/python3.11/site-packages (from panel) (4.9.0)\n",
+ "Requirement already satisfied: pandas>=1.2 in /opt/anaconda3/lib/python3.11/site-packages (from panel) (2.1.4)\n",
+ "Requirement already satisfied: anyio>=3.0.0 in /opt/anaconda3/lib/python3.11/site-packages (from watchfiles) (4.2.0)\n",
+ "Requirement already satisfied: idna>=2.8 in /opt/anaconda3/lib/python3.11/site-packages (from anyio>=3.0.0->watchfiles) (3.4)\n",
+ "Requirement already satisfied: sniffio>=1.1 in /opt/anaconda3/lib/python3.11/site-packages (from anyio>=3.0.0->watchfiles) (1.3.0)\n",
+ "Requirement already satisfied: Jinja2>=2.9 in /opt/anaconda3/lib/python3.11/site-packages (from bokeh<3.4.0,>=3.2.0->panel) (3.1.3)\n",
+ "Requirement already satisfied: contourpy>=1 in /opt/anaconda3/lib/python3.11/site-packages (from bokeh<3.4.0,>=3.2.0->panel) (1.2.0)\n",
+ "Requirement already satisfied: numpy>=1.16 in /opt/anaconda3/lib/python3.11/site-packages (from bokeh<3.4.0,>=3.2.0->panel) (1.26.4)\n",
+ "Requirement already satisfied: packaging>=16.8 in /opt/anaconda3/lib/python3.11/site-packages (from bokeh<3.4.0,>=3.2.0->panel) (23.1)\n",
+ "Requirement already satisfied: pillow>=7.1.0 in /opt/anaconda3/lib/python3.11/site-packages (from bokeh<3.4.0,>=3.2.0->panel) (10.2.0)\n",
+ "Requirement already satisfied: PyYAML>=3.10 in /opt/anaconda3/lib/python3.11/site-packages (from bokeh<3.4.0,>=3.2.0->panel) (6.0.1)\n",
+ "Requirement already satisfied: tornado>=5.1 in /opt/anaconda3/lib/python3.11/site-packages (from bokeh<3.4.0,>=3.2.0->panel) (6.3.3)\n",
+ "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/anaconda3/lib/python3.11/site-packages (from pandas>=1.2->panel) (2.8.2)\n",
+ "Requirement already satisfied: pytz>=2020.1 in /opt/anaconda3/lib/python3.11/site-packages (from pandas>=1.2->panel) (2023.3.post1)\n",
+ "Requirement already satisfied: tzdata>=2022.1 in /opt/anaconda3/lib/python3.11/site-packages (from pandas>=1.2->panel) (2023.3)\n",
+ "Requirement already satisfied: six>=1.9.0 in /opt/anaconda3/lib/python3.11/site-packages (from bleach->panel) (1.16.0)\n",
+ "Requirement already satisfied: webencodings in /opt/anaconda3/lib/python3.11/site-packages (from bleach->panel) (0.5.1)\n",
+ "Requirement already satisfied: uc-micro-py in /opt/anaconda3/lib/python3.11/site-packages (from linkify-it-py->panel) (1.0.1)\n",
+ "Requirement already satisfied: mdurl~=0.1 in /opt/anaconda3/lib/python3.11/site-packages (from markdown-it-py->panel) (0.1.0)\n",
+ "Requirement already satisfied: charset-normalizer<4,>=2 in /opt/anaconda3/lib/python3.11/site-packages (from requests->panel) (2.0.4)\n",
+ "Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/anaconda3/lib/python3.11/site-packages (from requests->panel) (2.0.7)\n",
+ "Requirement already satisfied: certifi>=2017.4.17 in /opt/anaconda3/lib/python3.11/site-packages (from requests->panel) (2024.2.2)\n",
+ "Requirement already satisfied: MarkupSafe>=2.0 in /opt/anaconda3/lib/python3.11/site-packages (from Jinja2>=2.9->bokeh<3.4.0,>=3.2.0->panel) (2.1.3)\n",
+ "Note: you may need to restart the kernel to use updated packages.\n"
+ ]
+ }
+ ],
+ "source": [
+ "pip install panel watchfiles"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "efdf3910",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Requirement already satisfied: pygments in /opt/anaconda3/lib/python3.11/site-packages (2.15.1)\n",
+ "Note: you may need to restart the kernel to use updated packages.\n"
+ ]
+ }
+ ],
+ "source": [
+ "pip install pygments"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "1e483a15",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import plotly.express as px\n",
+ "import panel as pn\n",
+ "import holoviews as hv\n",
+ "import hvplot.pandas\n",
+ "from my_modules import apply_header_changes, apply_df_changes, compare_headers, add_metadata_location, shorten_feature_names"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "9936cc24-34f7-41b5-b184-94a8f2237b05",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "#Silence FutureWarnings & UserWarnings\n",
+ "warnings.filterwarnings('ignore', category= FutureWarning)\n",
+ "warnings.filterwarnings('ignore', category= UserWarning)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "73290289",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "(function(root) {\n",
+ " function now() {\n",
+ " return new Date();\n",
+ " }\n",
+ "\n",
+ " var force = true;\n",
+ " var py_version = '3.3.4'.replace('rc', '-rc.').replace('.dev', '-dev.');\n",
+ " var reloading = true;\n",
+ " var Bokeh = root.Bokeh;\n",
+ "\n",
+ " if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n",
+ " root._bokeh_timeout = Date.now() + 5000;\n",
+ " root._bokeh_failed_load = false;\n",
+ " }\n",
+ "\n",
+ " function run_callbacks() {\n",
+ " try {\n",
+ " root._bokeh_onload_callbacks.forEach(function(callback) {\n",
+ " if (callback != null)\n",
+ " callback();\n",
+ " });\n",
+ " } finally {\n",
+ " delete root._bokeh_onload_callbacks;\n",
+ " }\n",
+ " console.debug(\"Bokeh: all callbacks have finished\");\n",
+ " }\n",
+ "\n",
+ " function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n",
+ " if (css_urls == null) css_urls = [];\n",
+ " if (js_urls == null) js_urls = [];\n",
+ " if (js_modules == null) js_modules = [];\n",
+ " if (js_exports == null) js_exports = {};\n",
+ "\n",
+ " root._bokeh_onload_callbacks.push(callback);\n",
+ "\n",
+ " if (root._bokeh_is_loading > 0) {\n",
+ " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
+ " return null;\n",
+ " }\n",
+ " if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n",
+ " run_callbacks();\n",
+ " return null;\n",
+ " }\n",
+ " if (!reloading) {\n",
+ " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
+ " }\n",
+ "\n",
+ " function on_load() {\n",
+ " root._bokeh_is_loading--;\n",
+ " if (root._bokeh_is_loading === 0) {\n",
+ " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n",
+ " run_callbacks()\n",
+ " }\n",
+ " }\n",
+ " window._bokeh_on_load = on_load\n",
+ "\n",
+ " function on_error() {\n",
+ " console.error(\"failed to load \" + url);\n",
+ " }\n",
+ "\n",
+ " var skip = [];\n",
+ " if (window.requirejs) {\n",
+ " window.requirejs.config({'packages': {}, 'paths': {'jspanel': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/jspanel', 'jspanel-modal': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal', 'jspanel-tooltip': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip', 'jspanel-hint': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint', 'jspanel-layout': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout', 'jspanel-contextmenu': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu', 'jspanel-dock': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock', 'gridstack': 'https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all', 'notyf': 'https://cdn.jsdelivr.net/npm/notyf@3/notyf.min'}, 'shim': {'jspanel': {'exports': 'jsPanel'}, 'gridstack': {'exports': 'GridStack'}}});\n",
+ " require([\"jspanel\"], function(jsPanel) {\n",
+ "\twindow.jsPanel = jsPanel\n",
+ "\ton_load()\n",
+ " })\n",
+ " require([\"jspanel-modal\"], function() {\n",
+ "\ton_load()\n",
+ " })\n",
+ " require([\"jspanel-tooltip\"], function() {\n",
+ "\ton_load()\n",
+ " })\n",
+ " require([\"jspanel-hint\"], function() {\n",
+ "\ton_load()\n",
+ " })\n",
+ " require([\"jspanel-layout\"], function() {\n",
+ "\ton_load()\n",
+ " })\n",
+ " require([\"jspanel-contextmenu\"], function() {\n",
+ "\ton_load()\n",
+ " })\n",
+ " require([\"jspanel-dock\"], function() {\n",
+ "\ton_load()\n",
+ " })\n",
+ " require([\"gridstack\"], function(GridStack) {\n",
+ "\twindow.GridStack = GridStack\n",
+ "\ton_load()\n",
+ " })\n",
+ " require([\"notyf\"], function() {\n",
+ "\ton_load()\n",
+ " })\n",
+ " root._bokeh_is_loading = css_urls.length + 9;\n",
+ " } else {\n",
+ " root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n",
+ " }\n",
+ "\n",
+ " var existing_stylesheets = []\n",
+ " var links = document.getElementsByTagName('link')\n",
+ " for (var i = 0; i < links.length; i++) {\n",
+ " var link = links[i]\n",
+ " if (link.href != null) {\n",
+ "\texisting_stylesheets.push(link.href)\n",
+ " }\n",
+ " }\n",
+ " for (var i = 0; i < css_urls.length; i++) {\n",
+ " var url = css_urls[i];\n",
+ " if (existing_stylesheets.indexOf(url) !== -1) {\n",
+ "\ton_load()\n",
+ "\tcontinue;\n",
+ " }\n",
+ " const element = document.createElement(\"link\");\n",
+ " element.onload = on_load;\n",
+ " element.onerror = on_error;\n",
+ " element.rel = \"stylesheet\";\n",
+ " element.type = \"text/css\";\n",
+ " element.href = url;\n",
+ " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n",
+ " document.body.appendChild(element);\n",
+ " } if (((window['jsPanel'] !== undefined) && (!(window['jsPanel'] instanceof HTMLElement))) || window.requirejs) {\n",
+ " var urls = ['https://cdn.holoviz.org/panel/1.3.8/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.3.8/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.3.8/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.3.8/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.3.8/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.3.8/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.3.8/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock.js'];\n",
+ " for (var i = 0; i < urls.length; i++) {\n",
+ " skip.push(urls[i])\n",
+ " }\n",
+ " } if (((window['GridStack'] !== undefined) && (!(window['GridStack'] instanceof HTMLElement))) || window.requirejs) {\n",
+ " var urls = ['https://cdn.holoviz.org/panel/1.3.8/dist/bundled/gridstack/gridstack@7.2.3/dist/gridstack-all.js'];\n",
+ " for (var i = 0; i < urls.length; i++) {\n",
+ " skip.push(urls[i])\n",
+ " }\n",
+ " } if (((window['Notyf'] !== undefined) && (!(window['Notyf'] instanceof HTMLElement))) || window.requirejs) {\n",
+ " var urls = ['https://cdn.holoviz.org/panel/1.3.8/dist/bundled/notificationarea/notyf@3/notyf.min.js'];\n",
+ " for (var i = 0; i < urls.length; i++) {\n",
+ " skip.push(urls[i])\n",
+ " }\n",
+ " } var existing_scripts = []\n",
+ " var scripts = document.getElementsByTagName('script')\n",
+ " for (var i = 0; i < scripts.length; i++) {\n",
+ " var script = scripts[i]\n",
+ " if (script.src != null) {\n",
+ "\texisting_scripts.push(script.src)\n",
+ " }\n",
+ " }\n",
+ " for (var i = 0; i < js_urls.length; i++) {\n",
+ " var url = js_urls[i];\n",
+ " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n",
+ "\tif (!window.requirejs) {\n",
+ "\t on_load();\n",
+ "\t}\n",
+ "\tcontinue;\n",
+ " }\n",
+ " var element = document.createElement('script');\n",
+ " element.onload = on_load;\n",
+ " element.onerror = on_error;\n",
+ " element.async = false;\n",
+ " element.src = url;\n",
+ " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
+ " document.head.appendChild(element);\n",
+ " }\n",
+ " for (var i = 0; i < js_modules.length; i++) {\n",
+ " var url = js_modules[i];\n",
+ " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n",
+ "\tif (!window.requirejs) {\n",
+ "\t on_load();\n",
+ "\t}\n",
+ "\tcontinue;\n",
+ " }\n",
+ " var element = document.createElement('script');\n",
+ " element.onload = on_load;\n",
+ " element.onerror = on_error;\n",
+ " element.async = false;\n",
+ " element.src = url;\n",
+ " element.type = \"module\";\n",
+ " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
+ " document.head.appendChild(element);\n",
+ " }\n",
+ " for (const name in js_exports) {\n",
+ " var url = js_exports[name];\n",
+ " if (skip.indexOf(url) >= 0 || root[name] != null) {\n",
+ "\tif (!window.requirejs) {\n",
+ "\t on_load();\n",
+ "\t}\n",
+ "\tcontinue;\n",
+ " }\n",
+ " var element = document.createElement('script');\n",
+ " element.onerror = on_error;\n",
+ " element.async = false;\n",
+ " element.type = \"module\";\n",
+ " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
+ " element.textContent = `\n",
+ " import ${name} from \"${url}\"\n",
+ " window.${name} = ${name}\n",
+ " window._bokeh_on_load()\n",
+ " `\n",
+ " document.head.appendChild(element);\n",
+ " }\n",
+ " if (!js_urls.length && !js_modules.length) {\n",
+ " on_load()\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " function inject_raw_css(css) {\n",
+ " const element = document.createElement(\"style\");\n",
+ " element.appendChild(document.createTextNode(css));\n",
+ " document.body.appendChild(element);\n",
+ " }\n",
+ "\n",
+ " var js_urls = [];\n",
+ " var js_modules = [];\n",
+ " var js_exports = {};\n",
+ " var css_urls = [];\n",
+ " var inline_js = [ function(Bokeh) {\n",
+ " Bokeh.set_log_level(\"info\");\n",
+ " },\n",
+ "function(Bokeh) {} // ensure no trailing comma for IE\n",
+ " ];\n",
+ "\n",
+ " function run_inline_js() {\n",
+ " if ((root.Bokeh !== undefined) || (force === true)) {\n",
+ " for (var i = 0; i < inline_js.length; i++) {\n",
+ "\ttry {\n",
+ " inline_js[i].call(root, root.Bokeh);\n",
+ "\t} catch(e) {\n",
+ "\t if (!reloading) {\n",
+ "\t throw e;\n",
+ "\t }\n",
+ "\t}\n",
+ " }\n",
+ " // Cache old bokeh versions\n",
+ " if (Bokeh != undefined && !reloading) {\n",
+ "\tvar NewBokeh = root.Bokeh;\n",
+ "\tif (Bokeh.versions === undefined) {\n",
+ "\t Bokeh.versions = new Map();\n",
+ "\t}\n",
+ "\tif (NewBokeh.version !== Bokeh.version) {\n",
+ "\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n",
+ "\t}\n",
+ "\troot.Bokeh = Bokeh;\n",
+ " }} else if (Date.now() < root._bokeh_timeout) {\n",
+ " setTimeout(run_inline_js, 100);\n",
+ " } else if (!root._bokeh_failed_load) {\n",
+ " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
+ " root._bokeh_failed_load = true;\n",
+ " }\n",
+ " root._bokeh_is_initializing = false\n",
+ " }\n",
+ "\n",
+ " function load_or_wait() {\n",
+ " // Implement a backoff loop that tries to ensure we do not load multiple\n",
+ " // versions of Bokeh and its dependencies at the same time.\n",
+ " // In recent versions we use the root._bokeh_is_initializing flag\n",
+ " // to determine whether there is an ongoing attempt to initialize\n",
+ " // bokeh, however for backward compatibility we also try to ensure\n",
+ " // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n",
+ " // before older versions are fully initialized.\n",
+ " if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n",
+ " root._bokeh_is_initializing = false;\n",
+ " root._bokeh_onload_callbacks = undefined;\n",
+ " console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n",
+ " load_or_wait();\n",
+ " } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n",
+ " setTimeout(load_or_wait, 100);\n",
+ " } else {\n",
+ " root._bokeh_is_initializing = true\n",
+ " root._bokeh_onload_callbacks = []\n",
+ " var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n",
+ " if (!reloading && !bokeh_loaded) {\n",
+ "\troot.Bokeh = undefined;\n",
+ " }\n",
+ " load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n",
+ "\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n",
+ "\trun_inline_js();\n",
+ " });\n",
+ " }\n",
+ " }\n",
+ " // Give older versions of the autoload script a head-start to ensure\n",
+ " // they initialize before we start loading newer version.\n",
+ " setTimeout(load_or_wait, 100)\n",
+ "}(window));"
+ ],
+ "application/vnd.holoviews_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n var py_version = '3.3.4'.replace('rc', '-rc.').replace('.dev', '-dev.');\n var reloading = true;\n var Bokeh = root.Bokeh;\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks;\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n run_callbacks();\n return null;\n }\n if (!reloading) {\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n window._bokeh_on_load = on_load\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n var skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {'jspanel': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/jspanel', 'jspanel-modal': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal', 'jspanel-tooltip': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip', 'jspanel-hint': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint', 'jspanel-layout': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout', 'jspanel-contextmenu': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu', 'jspanel-dock': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock', 'gridstack': 'https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all', 'notyf': 'https://cdn.jsdelivr.net/npm/notyf@3/notyf.min'}, 'shim': {'jspanel': {'exports': 'jsPanel'}, 'gridstack': {'exports': 'GridStack'}}});\n require([\"jspanel\"], function(jsPanel) {\n\twindow.jsPanel = jsPanel\n\ton_load()\n })\n require([\"jspanel-modal\"], function() {\n\ton_load()\n })\n require([\"jspanel-tooltip\"], function() {\n\ton_load()\n })\n require([\"jspanel-hint\"], function() {\n\ton_load()\n })\n require([\"jspanel-layout\"], function() {\n\ton_load()\n })\n require([\"jspanel-contextmenu\"], function() {\n\ton_load()\n })\n require([\"jspanel-dock\"], function() {\n\ton_load()\n })\n require([\"gridstack\"], function(GridStack) {\n\twindow.GridStack = GridStack\n\ton_load()\n })\n require([\"notyf\"], function() {\n\ton_load()\n })\n root._bokeh_is_loading = css_urls.length + 9;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n var existing_stylesheets = []\n var links = document.getElementsByTagName('link')\n for (var i = 0; i < links.length; i++) {\n var link = links[i]\n if (link.href != null) {\n\texisting_stylesheets.push(link.href)\n }\n }\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n if (existing_stylesheets.indexOf(url) !== -1) {\n\ton_load()\n\tcontinue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } if (((window['jsPanel'] !== undefined) && (!(window['jsPanel'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.3.8/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.3.8/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.3.8/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.3.8/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.3.8/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.3.8/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.3.8/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['GridStack'] !== undefined) && (!(window['GridStack'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.3.8/dist/bundled/gridstack/gridstack@7.2.3/dist/gridstack-all.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['Notyf'] !== undefined) && (!(window['Notyf'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.3.8/dist/bundled/notificationarea/notyf@3/notyf.min.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } var existing_scripts = []\n var scripts = document.getElementsByTagName('script')\n for (var i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n\texisting_scripts.push(script.src)\n }\n }\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (var i = 0; i < js_modules.length; i++) {\n var url = js_modules[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n var url = js_exports[name];\n if (skip.indexOf(url) >= 0 || root[name] != null) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n var js_urls = [];\n var js_modules = [];\n var js_exports = {};\n var css_urls = [];\n var inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n\ttry {\n inline_js[i].call(root, root.Bokeh);\n\t} catch(e) {\n\t if (!reloading) {\n\t throw e;\n\t }\n\t}\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n\tvar NewBokeh = root.Bokeh;\n\tif (Bokeh.versions === undefined) {\n\t Bokeh.versions = new Map();\n\t}\n\tif (NewBokeh.version !== Bokeh.version) {\n\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n\t}\n\troot.Bokeh = Bokeh;\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n if (!reloading && !bokeh_loaded) {\n\troot.Bokeh = undefined;\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n\trun_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));"
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ "if ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n",
+ " window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n",
+ "}\n",
+ "\n",
+ "\n",
+ " function JupyterCommManager() {\n",
+ " }\n",
+ "\n",
+ " JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n",
+ " if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n",
+ " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n",
+ " comm_manager.register_target(comm_id, function(comm) {\n",
+ " comm.on_msg(msg_handler);\n",
+ " });\n",
+ " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n",
+ " window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n",
+ " comm.onMsg = msg_handler;\n",
+ " });\n",
+ " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n",
+ " google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n",
+ " var messages = comm.messages[Symbol.asyncIterator]();\n",
+ " function processIteratorResult(result) {\n",
+ " var message = result.value;\n",
+ " console.log(message)\n",
+ " var content = {data: message.data, comm_id};\n",
+ " var buffers = []\n",
+ " for (var buffer of message.buffers || []) {\n",
+ " buffers.push(new DataView(buffer))\n",
+ " }\n",
+ " var metadata = message.metadata || {};\n",
+ " var msg = {content, buffers, metadata}\n",
+ " msg_handler(msg);\n",
+ " return messages.next().then(processIteratorResult);\n",
+ " }\n",
+ " return messages.next().then(processIteratorResult);\n",
+ " })\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n",
+ " if (comm_id in window.PyViz.comms) {\n",
+ " return window.PyViz.comms[comm_id];\n",
+ " } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n",
+ " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n",
+ " var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n",
+ " if (msg_handler) {\n",
+ " comm.on_msg(msg_handler);\n",
+ " }\n",
+ " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n",
+ " var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n",
+ " comm.open();\n",
+ " if (msg_handler) {\n",
+ " comm.onMsg = msg_handler;\n",
+ " }\n",
+ " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n",
+ " var comm_promise = google.colab.kernel.comms.open(comm_id)\n",
+ " comm_promise.then((comm) => {\n",
+ " window.PyViz.comms[comm_id] = comm;\n",
+ " if (msg_handler) {\n",
+ " var messages = comm.messages[Symbol.asyncIterator]();\n",
+ " function processIteratorResult(result) {\n",
+ " var message = result.value;\n",
+ " var content = {data: message.data};\n",
+ " var metadata = message.metadata || {comm_id};\n",
+ " var msg = {content, metadata}\n",
+ " msg_handler(msg);\n",
+ " return messages.next().then(processIteratorResult);\n",
+ " }\n",
+ " return messages.next().then(processIteratorResult);\n",
+ " }\n",
+ " }) \n",
+ " var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n",
+ " return comm_promise.then((comm) => {\n",
+ " comm.send(data, metadata, buffers, disposeOnDone);\n",
+ " });\n",
+ " };\n",
+ " var comm = {\n",
+ " send: sendClosure\n",
+ " };\n",
+ " }\n",
+ " window.PyViz.comms[comm_id] = comm;\n",
+ " return comm;\n",
+ " }\n",
+ " window.PyViz.comm_manager = new JupyterCommManager();\n",
+ " \n",
+ "\n",
+ "\n",
+ "var JS_MIME_TYPE = 'application/javascript';\n",
+ "var HTML_MIME_TYPE = 'text/html';\n",
+ "var EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\n",
+ "var CLASS_NAME = 'output';\n",
+ "\n",
+ "/**\n",
+ " * Render data to the DOM node\n",
+ " */\n",
+ "function render(props, node) {\n",
+ " var div = document.createElement(\"div\");\n",
+ " var script = document.createElement(\"script\");\n",
+ " node.appendChild(div);\n",
+ " node.appendChild(script);\n",
+ "}\n",
+ "\n",
+ "/**\n",
+ " * Handle when a new output is added\n",
+ " */\n",
+ "function handle_add_output(event, handle) {\n",
+ " var output_area = handle.output_area;\n",
+ " var output = handle.output;\n",
+ " if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n",
+ " return\n",
+ " }\n",
+ " var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n",
+ " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n",
+ " if (id !== undefined) {\n",
+ " var nchildren = toinsert.length;\n",
+ " var html_node = toinsert[nchildren-1].children[0];\n",
+ " html_node.innerHTML = output.data[HTML_MIME_TYPE];\n",
+ " var scripts = [];\n",
+ " var nodelist = html_node.querySelectorAll(\"script\");\n",
+ " for (var i in nodelist) {\n",
+ " if (nodelist.hasOwnProperty(i)) {\n",
+ " scripts.push(nodelist[i])\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " scripts.forEach( function (oldScript) {\n",
+ " var newScript = document.createElement(\"script\");\n",
+ " var attrs = [];\n",
+ " var nodemap = oldScript.attributes;\n",
+ " for (var j in nodemap) {\n",
+ " if (nodemap.hasOwnProperty(j)) {\n",
+ " attrs.push(nodemap[j])\n",
+ " }\n",
+ " }\n",
+ " attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n",
+ " newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n",
+ " oldScript.parentNode.replaceChild(newScript, oldScript);\n",
+ " });\n",
+ " if (JS_MIME_TYPE in output.data) {\n",
+ " toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n",
+ " }\n",
+ " output_area._hv_plot_id = id;\n",
+ " if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n",
+ " window.PyViz.plot_index[id] = Bokeh.index[id];\n",
+ " } else {\n",
+ " window.PyViz.plot_index[id] = null;\n",
+ " }\n",
+ " } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n",
+ " var bk_div = document.createElement(\"div\");\n",
+ " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n",
+ " var script_attrs = bk_div.children[0].attributes;\n",
+ " for (var i = 0; i < script_attrs.length; i++) {\n",
+ " toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n",
+ " }\n",
+ " // store reference to server id on output_area\n",
+ " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "/**\n",
+ " * Handle when an output is cleared or removed\n",
+ " */\n",
+ "function handle_clear_output(event, handle) {\n",
+ " var id = handle.cell.output_area._hv_plot_id;\n",
+ " var server_id = handle.cell.output_area._bokeh_server_id;\n",
+ " if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n",
+ " var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n",
+ " if (server_id !== null) {\n",
+ " comm.send({event_type: 'server_delete', 'id': server_id});\n",
+ " return;\n",
+ " } else if (comm !== null) {\n",
+ " comm.send({event_type: 'delete', 'id': id});\n",
+ " }\n",
+ " delete PyViz.plot_index[id];\n",
+ " if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n",
+ " var doc = window.Bokeh.index[id].model.document\n",
+ " doc.clear();\n",
+ " const i = window.Bokeh.documents.indexOf(doc);\n",
+ " if (i > -1) {\n",
+ " window.Bokeh.documents.splice(i, 1);\n",
+ " }\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "/**\n",
+ " * Handle kernel restart event\n",
+ " */\n",
+ "function handle_kernel_cleanup(event, handle) {\n",
+ " delete PyViz.comms[\"hv-extension-comm\"];\n",
+ " window.PyViz.plot_index = {}\n",
+ "}\n",
+ "\n",
+ "/**\n",
+ " * Handle update_display_data messages\n",
+ " */\n",
+ "function handle_update_output(event, handle) {\n",
+ " handle_clear_output(event, {cell: {output_area: handle.output_area}})\n",
+ " handle_add_output(event, handle)\n",
+ "}\n",
+ "\n",
+ "function register_renderer(events, OutputArea) {\n",
+ " function append_mime(data, metadata, element) {\n",
+ " // create a DOM node to render to\n",
+ " var toinsert = this.create_output_subarea(\n",
+ " metadata,\n",
+ " CLASS_NAME,\n",
+ " EXEC_MIME_TYPE\n",
+ " );\n",
+ " this.keyboard_manager.register_events(toinsert);\n",
+ " // Render to node\n",
+ " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n",
+ " render(props, toinsert[0]);\n",
+ " element.append(toinsert);\n",
+ " return toinsert\n",
+ " }\n",
+ "\n",
+ " events.on('output_added.OutputArea', handle_add_output);\n",
+ " events.on('output_updated.OutputArea', handle_update_output);\n",
+ " events.on('clear_output.CodeCell', handle_clear_output);\n",
+ " events.on('delete.Cell', handle_clear_output);\n",
+ " events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n",
+ "\n",
+ " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n",
+ " safe: true,\n",
+ " index: 0\n",
+ " });\n",
+ "}\n",
+ "\n",
+ "if (window.Jupyter !== undefined) {\n",
+ " try {\n",
+ " var events = require('base/js/events');\n",
+ " var OutputArea = require('notebook/js/outputarea').OutputArea;\n",
+ " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n",
+ " register_renderer(events, OutputArea);\n",
+ " }\n",
+ " } catch(err) {\n",
+ " }\n",
+ "}\n"
+ ],
+ "application/vnd.holoviews_load.v0+json": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n console.log(message)\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n comm.open();\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n }) \n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n"
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.holoviews_exec.v0+json": "",
+ "text/html": [
+ "
\n",
+ ""
+ ]
+ },
+ "metadata": {
+ "application/vnd.holoviews_exec.v0+json": {
+ "id": "8e44b995-9262-4ec8-9602-2f43b99d97ac"
+ }
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Initialize Panel extension\n",
+ "pn.extension()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b179f303-c098-4c30-b4b9-df10db6c485a",
+ "metadata": {},
+ "source": [
+ "## I.2. *DIRECTORIES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "849b1dd3-c940-4c7a-8cf6-2fd5b4dc43f4",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "/Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Set base directory\n",
+ "\n",
+ "directorio_actual = os.getcwd()\n",
+ "print(directorio_actual)\n",
+ "\n",
+ "##### MAC WORKSTATION #####\n",
+ "#base_dir = r'/Volumes/LaboLabrie/Projets/OC_TMA_Pejovic/Temp/Zoe/CyCIF_pipeline/'\n",
+ "###########################\n",
+ "\n",
+ "##### WINDOWS WORKSTATION #####\n",
+ "#base_dir = r'C:\\Users\\LaboLabrie\\gerz2701\\cyCIF-pipeline\\Set_B'\n",
+ "###############################\n",
+ "\n",
+ "##### LOCAL WORKSTATION #####\n",
+ "base_dir = r'/Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/'\n",
+ "#############################\n",
+ "\n",
+ "#set_name = 'Set_A'\n",
+ "set_name = 'test'"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "1f68584f-c1f6-49cd-99f8-5a7cc8aae26e",
+ "metadata": {},
+ "source": [
+ "The project is organized as :\n",
+ "main dir \n",
+ " code\n",
+ " proj_data > all input csv files\n",
+ " proj_metadata > exposure time csv file, images dir,...\n",
+ " proj_qc_eda > csv after the QC/EDA step"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "e8a4b389-1136-4470-9898-29fd39baf1f5",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/ directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_data directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/images directory already exists !\n"
+ ]
+ }
+ ],
+ "source": [
+ "project_name = set_name # Project name\n",
+ "step_suffix = 'qc_eda' # Curent part (here part I)\n",
+ "previous_step_suffix_long = \"\" # Previous part (here empty)\n",
+ "\n",
+ "# Initial input data directory\n",
+ "input_data_dir = os.path.join(base_dir, project_name + \"_data\")\n",
+ "\n",
+ "# QC/EDA output directories\n",
+ "# global output\n",
+ "output_data_dir = os.path.join(base_dir, project_name + \"_\" + step_suffix)\n",
+ "# images subdirectory\n",
+ "output_images_dir = os.path.join(output_data_dir,\"images\")\n",
+ "\n",
+ "# Data and Metadata directories\n",
+ "# global data\n",
+ "metadata_dir = os.path.join(base_dir, project_name + \"_metadata\")\n",
+ "# images subdirectory\n",
+ "metadata_images_dir = os.path.join(metadata_dir,\"images\")\n",
+ "\n",
+ "# Create directories if they don't already exist\n",
+ "for d in [base_dir, input_data_dir, output_data_dir, output_images_dir, metadata_dir, metadata_images_dir]:\n",
+ " if not os.path.exists(d):\n",
+ " print(\"Creation of the\" , d, \"directory...\")\n",
+ " os.makedirs(d)\n",
+ " else :\n",
+ " print(\"The\", d, \"directory already exists !\")\n",
+ "\n",
+ "os.chdir(input_data_dir)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "b6e9df25-588a-41b4-a1f5-45bb81f012ff",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "base_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/\n",
+ "input_data_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_data\n",
+ "output_data_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda\n",
+ "output_images_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images\n",
+ "metadata_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata\n",
+ "metadata_images_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/images\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Verify paths\n",
+ "print('base_dir :', base_dir)\n",
+ "print('input_data_dir :', input_data_dir)\n",
+ "print('output_data_dir :', output_data_dir)\n",
+ "print('output_images_dir :', output_images_dir)\n",
+ "print('metadata_dir :', metadata_dir)\n",
+ "print('metadata_images_dir :', metadata_images_dir)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "44ebdb24-d428-4948-8d9d-485e4591212b",
+ "metadata": {},
+ "source": [
+ "## I.3. FILES"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "b81abd9c-2501-4b31-8c71-aa191c518b31",
+ "metadata": {},
+ "source": [
+ "Don't forget to put your data in the projname_data directory !"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "b2569b34-ef84-4af6-836d-befe3bdda706",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The following CSV files were detected:\n",
+ "\n",
+ " ['DD3S1.csv', 'DD3S2.csv', 'DD3S3.csv', 'TMA.csv'] \n",
+ "\n",
+ "in /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_data directory.\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Listing all the .csv files in the metadata/data directory\n",
+ "# Don't forget to move the csv files into the proj_data directory\n",
+ "# if the data dir is empty it's not going to work \n",
+ "ls_samples = [sample for sample in os.listdir(input_data_dir) if sample.endswith(\".csv\")]\n",
+ "\n",
+ "print(\"The following CSV files were detected:\\n\\n\",[sample for sample in ls_samples], \"\\n\\nin\", input_data_dir, \"directory.\")\n",
+ "\n",
+ "#print(ls_samples[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "591d76f3-8b5b-4dfc-a71a-0d3ec6eeb93e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "df :\n",
+ " Cell Size Nuc X Nuc Y Inv ROI index Nucleus Size \\\n",
+ "Cell Id \n",
+ "1@1 339 1484.771729 16632.205078 0 127 \n",
+ "\n",
+ " Nucleus Roundness AF488 Cell Intensity Average \\\n",
+ "Cell Id \n",
+ "1@1 0.95504 2385.867188 \n",
+ "\n",
+ " AF488 Cytoplasm Intensity Average AF488 Nucleus Intensity Average \\\n",
+ "Cell Id \n",
+ "1@1 2356.6604 2434.62207 \n",
+ "\n",
+ " AF555 Cell Intensity Average ... r7c2 Nucleus Intensity Average \\\n",
+ "Cell Id ... \n",
+ "1@1 1358.528076 ... 290.582672 \n",
+ "\n",
+ " r8c2 Cell Intensity Average r8c2 Cytoplasm Intensity Average \\\n",
+ "Cell Id \n",
+ "1@1 341.790558 337.82547 \n",
+ "\n",
+ " r8c2 Nucleus Intensity Average Sting Cell Intensity Average \\\n",
+ "Cell Id \n",
+ "1@1 348.409454 1567.100342 \n",
+ "\n",
+ " Sting Cytoplasm Intensity Average Sting Nucleus Intensity Average \\\n",
+ "Cell Id \n",
+ "1@1 1533.22168 1623.653564 \n",
+ "\n",
+ " Vimentin Cell Intensity Average \\\n",
+ "Cell Id \n",
+ "1@1 7279.144531 \n",
+ "\n",
+ " Vimentin Cytoplasm Intensity Average \\\n",
+ "Cell Id \n",
+ "1@1 7040.108398 \n",
+ "\n",
+ " Vimentin Nucleus Intensity Average \n",
+ "Cell Id \n",
+ "1@1 7678.165527 \n",
+ "\n",
+ "[1 rows x 141 columns] \n",
+ "\n",
+ "df's columns :\n",
+ " Index(['Cell Size', 'Nuc X', 'Nuc Y Inv', 'ROI index', 'Nucleus Size',\n",
+ " 'Nucleus Roundness', 'AF488 Cell Intensity Average',\n",
+ " 'AF488 Cytoplasm Intensity Average', 'AF488 Nucleus Intensity Average',\n",
+ " 'AF555 Cell Intensity Average',\n",
+ " ...\n",
+ " 'r7c2 Nucleus Intensity Average', 'r8c2 Cell Intensity Average',\n",
+ " 'r8c2 Cytoplasm Intensity Average', 'r8c2 Nucleus Intensity Average',\n",
+ " 'Sting Cell Intensity Average', 'Sting Cytoplasm Intensity Average',\n",
+ " 'Sting Nucleus Intensity Average', 'Vimentin Cell Intensity Average',\n",
+ " 'Vimentin Cytoplasm Intensity Average',\n",
+ " 'Vimentin Nucleus Intensity Average'],\n",
+ " dtype='object', length=141) \n",
+ "\n",
+ "df's index :\n",
+ " Index(['1@1'], dtype='object', name='Cell Id') \n",
+ "\n",
+ "df's index name :\n",
+ " Cell Id\n"
+ ]
+ }
+ ],
+ "source": [
+ "# First gather information on expected headers using first file in ls_samples\n",
+ "# Read in the first row of the file corresponding to the first sample (index = 0) in ls_samples\n",
+ "df = pd.read_csv(os.path.join(input_data_dir, ls_samples[0]) , index_col = 0, nrows = 1)\n",
+ "\n",
+ "\n",
+ "# Make sure the file was imported correctly\n",
+ "print(\"df :\\n\", df.head(), \"\\n\")\n",
+ "print(\"df's columns :\\n\", df.columns, \"\\n\")\n",
+ "print(\"df's index :\\n\", df.index, \"\\n\")\n",
+ "print(\"df's index name :\\n\", df.index.name)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "7caa2335-ea22-4973-b50c-7087349c2dc6",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Expected the first column in input file (index_col = 0) to be 'ID'. \n",
+ "This column will be used to set the index names (cell number for each sample). \n",
+ "It appears that the column 'Cell Id' was actually the imported as the index column.\n",
+ "A new index name (first column) will be given ('ID') to replace the current one 'Cell Id'\n",
+ "\n",
+ "['Cell_Size' 'Nuc_X' 'Nuc_Y_Inv' 'ROI_index' 'Nucleus_Size'\n",
+ " 'Nucleus_Roundness' 'AF488_Cell_Intensity_Average'\n",
+ " 'AF488_Cytoplasm_Intensity_Average' 'AF488_Nucleus_Intensity_Average'\n",
+ " 'AF555_Cell_Intensity_Average' 'AF555_Cytoplasm_Intensity_Average'\n",
+ " 'AF555_Nucleus_Intensity_Average' 'AF647_Cell_Intensity_Average'\n",
+ " 'AF647_Cytoplasm_Intensity_Average' 'AF647_Nucleus_Intensity_Average'\n",
+ " 'AF750_Cell_Intensity_Average' 'AF750_Cytoplasm_Intensity_Average'\n",
+ " 'AF750_Nucleus_Intensity_Average' 'aSMA_Cell_Intensity_Average'\n",
+ " 'aSMA_Cytoplasm_Intensity_Average' 'aSMA_Nucleus_Intensity_Average'\n",
+ " 'AXL_Cell_Intensity_Average' 'AXL_Cytoplasm_Intensity_Average'\n",
+ " 'AXL_Nucleus_Intensity_Average' 'B7H4_Cell_Intensity_Average'\n",
+ " 'B7H4_Cytoplasm_Intensity_Average' 'B7H4_Nucleus_Intensity_Average'\n",
+ " 'CA9_Cell_Intensity_Average' 'CA9_Cytoplasm_Intensity_Average'\n",
+ " 'CA9_Nucleus_Intensity_Average' 'CD4_Cell_Intensity_Average'\n",
+ " 'CD4_Cytoplasm_Intensity_Average' 'CD4_Nucleus_Intensity_Average'\n",
+ " 'CD8_Cell_Intensity_Average' 'CD8_Cytoplasm_Intensity_Average'\n",
+ " 'CD8_Nucleus_Intensity_Average' 'CD11b_Cell_Intensity_Average'\n",
+ " 'CD11b_Cytoplasm_Intensity_Average' 'CD11b_Nucleus_Intensity_Average'\n",
+ " 'CD11c_Cell_Intensity_Average' 'CD11c_Cytoplasm_Intensity_Average'\n",
+ " 'CD11c_Nucleus_Intensity_Average' 'CD20_Cell_Intensity_Average'\n",
+ " 'CD20_Cytoplasm_Intensity_Average' 'CD20_Nucleus_Intensity_Average'\n",
+ " 'CD31_Cell_Intensity_Average' 'CD31_Cytoplasm_Intensity_Average'\n",
+ " 'CD31_Nucleus_Intensity_Average' 'CD44_Cell_Intensity_Average'\n",
+ " 'CD44_Cytoplasm_Intensity_Average' 'CD44_Nucleus_Intensity_Average'\n",
+ " 'CD45_Cell_Intensity_Average' 'CD45_Cytoplasm_Intensity_Average'\n",
+ " 'CD45_Nucleus_Intensity_Average' 'CD68_Cell_Intensity_Average'\n",
+ " 'CD68_Cytoplasm_Intensity_Average' 'CD68_Nucleus_Intensity_Average'\n",
+ " 'CD163_Cell_Intensity_Average' 'CD163_Cytoplasm_Intensity_Average'\n",
+ " 'CD163_Nucleus_Intensity_Average' 'CKs_Cell_Intensity_Average'\n",
+ " 'CKs_Cytoplasm_Intensity_Average' 'CKs_Nucleus_Intensity_Average'\n",
+ " 'ColVI_Cell_Intensity_Average' 'ColVI_Cytoplasm_Intensity_Average'\n",
+ " 'ColVI_Nucleus_Intensity_Average' 'DAPI0_Cell_Intensity_Average'\n",
+ " 'DAPI0_Cytoplasm_Intensity_Average' 'DAPI0_Nucleus_Intensity_Average'\n",
+ " 'DAPI1_Cell_Intensity_Average' 'DAPI1_Cytoplasm_Intensity_Average'\n",
+ " 'DAPI1_Nucleus_Intensity_Average' 'DAPI2_Cell_Intensity_Average'\n",
+ " 'DAPI2_Cytoplasm_Intensity_Average' 'DAPI2_Nucleus_Intensity_Average'\n",
+ " 'DAPI3_Cell_Intensity_Average' 'DAPI3_Cytoplasm_Intensity_Average'\n",
+ " 'DAPI3_Nucleus_Intensity_Average' 'DAPI4_Cell_Intensity_Average'\n",
+ " 'DAPI4_Cytoplasm_Intensity_Average' 'DAPI4_Nucleus_Intensity_Average'\n",
+ " 'DAPI5_Cell_Intensity_Average' 'DAPI5_Cytoplasm_Intensity_Average'\n",
+ " 'DAPI5_Nucleus_Intensity_Average' 'DAPI6_Cell_Intensity_Average'\n",
+ " 'DAPI6_Cytoplasm_Intensity_Average' 'DAPI6_Nucleus_Intensity_Average'\n",
+ " 'DAPI7_Cell_Intensity_Average' 'DAPI7_Cytoplasm_Intensity_Average'\n",
+ " 'DAPI7_Nucleus_Intensity_Average' 'DAPI8_Cell_Intensity_Average'\n",
+ " 'DAPI8_Cytoplasm_Intensity_Average' 'DAPI8_Nucleus_Intensity_Average'\n",
+ " 'Desmin_Cell_Intensity_Average' 'Desmin_Cytoplasm_Intensity_Average'\n",
+ " 'Desmin_Nucleus_Intensity_Average' 'Ecad_Cell_Intensity_Average'\n",
+ " 'Ecad_Cytoplasm_Intensity_Average' 'Ecad_Nucleus_Intensity_Average'\n",
+ " 'Fibronectin_Cell_Intensity_Average'\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average'\n",
+ " 'Fibronectin_Nucleus_Intensity_Average' 'FOXP3_Cell_Intensity_Average'\n",
+ " 'FOXP3_Cytoplasm_Intensity_Average' 'FOXP3_Nucleus_Intensity_Average'\n",
+ " 'GATA3_Cell_Intensity_Average' 'GATA3_Cytoplasm_Intensity_Average'\n",
+ " 'GATA3_Nucleus_Intensity_Average' 'HLA_Cell_Intensity_Average'\n",
+ " 'HLA_Cytoplasm_Intensity_Average' 'HLA_Nucleus_Intensity_Average'\n",
+ " 'Ki67_Cell_Intensity_Average' 'Ki67_Cytoplasm_Intensity_Average'\n",
+ " 'Ki67_Nucleus_Intensity_Average' 'MMP9_Cell_Intensity_Average'\n",
+ " 'MMP9_Cytoplasm_Intensity_Average' 'MMP9_Nucleus_Intensity_Average'\n",
+ " 'PD1_Cell_Intensity_Average' 'PD1_Cytoplasm_Intensity_Average'\n",
+ " 'PD1_Nucleus_Intensity_Average' 'PDGFR_Cell_Intensity_Average'\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average' 'PDGFR_Nucleus_Intensity_Average'\n",
+ " 'PDL1_Cell_Intensity_Average' 'PDL1_Cytoplasm_Intensity_Average'\n",
+ " 'PDL1_Nucleus_Intensity_Average' 'r5c2_Cell_Intensity_Average'\n",
+ " 'r5c2_Cytoplasm_Intensity_Average' 'r5c2_Nucleus_Intensity_Average'\n",
+ " 'r7c2_Cell_Intensity_Average' 'r7c2_Cytoplasm_Intensity_Average'\n",
+ " 'r7c2_Nucleus_Intensity_Average' 'r8c2_Cell_Intensity_Average'\n",
+ " 'r8c2_Cytoplasm_Intensity_Average' 'r8c2_Nucleus_Intensity_Average'\n",
+ " 'Sting_Cell_Intensity_Average' 'Sting_Cytoplasm_Intensity_Average'\n",
+ " 'Sting_Nucleus_Intensity_Average' 'Vimentin_Cell_Intensity_Average'\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average'\n",
+ " 'Vimentin_Nucleus_Intensity_Average']\n",
+ "\n",
+ "df :\n",
+ " Cell_Size Nuc_X Nuc_Y_Inv ROI_index Nucleus_Size \\\n",
+ "ID \n",
+ "1@1 339 1484.771729 16632.205078 0 127 \n",
+ "\n",
+ " Nucleus_Roundness AF488_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 0.95504 2385.867188 \n",
+ "\n",
+ " AF488_Cytoplasm_Intensity_Average AF488_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 2356.6604 2434.62207 \n",
+ "\n",
+ " AF555_Cell_Intensity_Average ... r7c2_Nucleus_Intensity_Average \\\n",
+ "ID ... \n",
+ "1@1 1358.528076 ... 290.582672 \n",
+ "\n",
+ " r8c2_Cell_Intensity_Average r8c2_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 341.790558 337.82547 \n",
+ "\n",
+ " r8c2_Nucleus_Intensity_Average Sting_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 348.409454 1567.100342 \n",
+ "\n",
+ " Sting_Cytoplasm_Intensity_Average Sting_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 1533.22168 1623.653564 \n",
+ "\n",
+ " Vimentin_Cell_Intensity_Average Vimentin_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 7279.144531 7040.108398 \n",
+ "\n",
+ " Vimentin_Nucleus_Intensity_Average \n",
+ "ID \n",
+ "1@1 7678.165527 \n",
+ "\n",
+ "[1 rows x 141 columns] \n",
+ "\n",
+ "df's columns :\n",
+ " Index(['Cell_Size', 'Nuc_X', 'Nuc_Y_Inv', 'ROI_index', 'Nucleus_Size',\n",
+ " 'Nucleus_Roundness', 'AF488_Cell_Intensity_Average',\n",
+ " 'AF488_Cytoplasm_Intensity_Average', 'AF488_Nucleus_Intensity_Average',\n",
+ " 'AF555_Cell_Intensity_Average',\n",
+ " ...\n",
+ " 'r7c2_Nucleus_Intensity_Average', 'r8c2_Cell_Intensity_Average',\n",
+ " 'r8c2_Cytoplasm_Intensity_Average', 'r8c2_Nucleus_Intensity_Average',\n",
+ " 'Sting_Cell_Intensity_Average', 'Sting_Cytoplasm_Intensity_Average',\n",
+ " 'Sting_Nucleus_Intensity_Average', 'Vimentin_Cell_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'Vimentin_Nucleus_Intensity_Average'],\n",
+ " dtype='object', length=141) \n",
+ "\n",
+ "df's index :\n",
+ " Index(['1@1'], dtype='object', name='ID') \n",
+ "\n",
+ "df's index name :\n",
+ " ID\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Verify that the ID column in input file became the index\n",
+ "# Verify that the index name column is \"ID\", if not, rename it\n",
+ "if df.index.name != \"ID\":\n",
+ " print(\"Expected the first column in input file (index_col = 0) to be 'ID'. \\n\"\n",
+ " \"This column will be used to set the index names (cell number for each sample). \\n\"\n",
+ " \"It appears that the column '\" + df.index.name + \"' was actually the imported as the index column.\")\n",
+ " #df.index.name = 'ID'\n",
+ " print(\"A new index name (first column) will be given ('ID') to replace the current one '\" + df.index.name + \"'\\n\")\n",
+ "\n",
+ "# Apply the changes to the headers as specified with apply_header_changes() function (in my_modules.py)\n",
+ "# Apply the changes to the dataframe rows as specified with apply_df_changes() function (in my_modules.py)\n",
+ "df = apply_header_changes(df)\n",
+ "df = apply_df_changes(df)\n",
+ "\n",
+ "# Set variable to hold default header values\n",
+ "expected_headers = df.columns.values\n",
+ "print(expected_headers)\n",
+ "\n",
+ "# Make sure the file is now formated correctly\n",
+ "print(\"\\ndf :\\n\", df.head(), \"\\n\")\n",
+ "print(\"df's columns :\\n\", df.columns, \"\\n\")\n",
+ "print(\"df's index :\\n\", df.index, \"\\n\")\n",
+ "print(\"df's index name :\\n\", df.index.name)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "1e7448a1-b156-4d5e-9698-e94ebe9ef7b4",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Used DD3S1.csv to determine the expected and corrected headers for all files.\n",
+ "\n",
+ "These headers are: \n",
+ "Cell_Size, Nuc_X, Nuc_Y_Inv, ROI_index, Nucleus_Size, Nucleus_Roundness, AF488_Cell_Intensity_Average, AF488_Cytoplasm_Intensity_Average, AF488_Nucleus_Intensity_Average, AF555_Cell_Intensity_Average, AF555_Cytoplasm_Intensity_Average, AF555_Nucleus_Intensity_Average, AF647_Cell_Intensity_Average, AF647_Cytoplasm_Intensity_Average, AF647_Nucleus_Intensity_Average, AF750_Cell_Intensity_Average, AF750_Cytoplasm_Intensity_Average, AF750_Nucleus_Intensity_Average, aSMA_Cell_Intensity_Average, aSMA_Cytoplasm_Intensity_Average, aSMA_Nucleus_Intensity_Average, AXL_Cell_Intensity_Average, AXL_Cytoplasm_Intensity_Average, AXL_Nucleus_Intensity_Average, B7H4_Cell_Intensity_Average, B7H4_Cytoplasm_Intensity_Average, B7H4_Nucleus_Intensity_Average, CA9_Cell_Intensity_Average, CA9_Cytoplasm_Intensity_Average, CA9_Nucleus_Intensity_Average, CD4_Cell_Intensity_Average, CD4_Cytoplasm_Intensity_Average, CD4_Nucleus_Intensity_Average, CD8_Cell_Intensity_Average, CD8_Cytoplasm_Intensity_Average, CD8_Nucleus_Intensity_Average, CD11b_Cell_Intensity_Average, CD11b_Cytoplasm_Intensity_Average, CD11b_Nucleus_Intensity_Average, CD11c_Cell_Intensity_Average, CD11c_Cytoplasm_Intensity_Average, CD11c_Nucleus_Intensity_Average, CD20_Cell_Intensity_Average, CD20_Cytoplasm_Intensity_Average, CD20_Nucleus_Intensity_Average, CD31_Cell_Intensity_Average, CD31_Cytoplasm_Intensity_Average, CD31_Nucleus_Intensity_Average, CD44_Cell_Intensity_Average, CD44_Cytoplasm_Intensity_Average, CD44_Nucleus_Intensity_Average, CD45_Cell_Intensity_Average, CD45_Cytoplasm_Intensity_Average, CD45_Nucleus_Intensity_Average, CD68_Cell_Intensity_Average, CD68_Cytoplasm_Intensity_Average, CD68_Nucleus_Intensity_Average, CD163_Cell_Intensity_Average, CD163_Cytoplasm_Intensity_Average, CD163_Nucleus_Intensity_Average, CKs_Cell_Intensity_Average, CKs_Cytoplasm_Intensity_Average, CKs_Nucleus_Intensity_Average, ColVI_Cell_Intensity_Average, ColVI_Cytoplasm_Intensity_Average, ColVI_Nucleus_Intensity_Average, DAPI0_Cell_Intensity_Average, DAPI0_Cytoplasm_Intensity_Average, DAPI0_Nucleus_Intensity_Average, DAPI1_Cell_Intensity_Average, DAPI1_Cytoplasm_Intensity_Average, DAPI1_Nucleus_Intensity_Average, DAPI2_Cell_Intensity_Average, DAPI2_Cytoplasm_Intensity_Average, DAPI2_Nucleus_Intensity_Average, DAPI3_Cell_Intensity_Average, DAPI3_Cytoplasm_Intensity_Average, DAPI3_Nucleus_Intensity_Average, DAPI4_Cell_Intensity_Average, DAPI4_Cytoplasm_Intensity_Average, DAPI4_Nucleus_Intensity_Average, DAPI5_Cell_Intensity_Average, DAPI5_Cytoplasm_Intensity_Average, DAPI5_Nucleus_Intensity_Average, DAPI6_Cell_Intensity_Average, DAPI6_Cytoplasm_Intensity_Average, DAPI6_Nucleus_Intensity_Average, DAPI7_Cell_Intensity_Average, DAPI7_Cytoplasm_Intensity_Average, DAPI7_Nucleus_Intensity_Average, DAPI8_Cell_Intensity_Average, DAPI8_Cytoplasm_Intensity_Average, DAPI8_Nucleus_Intensity_Average, Desmin_Cell_Intensity_Average, Desmin_Cytoplasm_Intensity_Average, Desmin_Nucleus_Intensity_Average, Ecad_Cell_Intensity_Average, Ecad_Cytoplasm_Intensity_Average, Ecad_Nucleus_Intensity_Average, Fibronectin_Cell_Intensity_Average, Fibronectin_Cytoplasm_Intensity_Average, Fibronectin_Nucleus_Intensity_Average, FOXP3_Cell_Intensity_Average, FOXP3_Cytoplasm_Intensity_Average, FOXP3_Nucleus_Intensity_Average, GATA3_Cell_Intensity_Average, GATA3_Cytoplasm_Intensity_Average, GATA3_Nucleus_Intensity_Average, HLA_Cell_Intensity_Average, HLA_Cytoplasm_Intensity_Average, HLA_Nucleus_Intensity_Average, Ki67_Cell_Intensity_Average, Ki67_Cytoplasm_Intensity_Average, Ki67_Nucleus_Intensity_Average, MMP9_Cell_Intensity_Average, MMP9_Cytoplasm_Intensity_Average, MMP9_Nucleus_Intensity_Average, PD1_Cell_Intensity_Average, PD1_Cytoplasm_Intensity_Average, PD1_Nucleus_Intensity_Average, PDGFR_Cell_Intensity_Average, PDGFR_Cytoplasm_Intensity_Average, PDGFR_Nucleus_Intensity_Average, PDL1_Cell_Intensity_Average, PDL1_Cytoplasm_Intensity_Average, PDL1_Nucleus_Intensity_Average, r5c2_Cell_Intensity_Average, r5c2_Cytoplasm_Intensity_Average, r5c2_Nucleus_Intensity_Average, r7c2_Cell_Intensity_Average, r7c2_Cytoplasm_Intensity_Average, r7c2_Nucleus_Intensity_Average, r8c2_Cell_Intensity_Average, r8c2_Cytoplasm_Intensity_Average, r8c2_Nucleus_Intensity_Average, Sting_Cell_Intensity_Average, Sting_Cytoplasm_Intensity_Average, Sting_Nucleus_Intensity_Average, Vimentin_Cell_Intensity_Average, Vimentin_Cytoplasm_Intensity_Average, Vimentin_Nucleus_Intensity_Average\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"Used \" + ls_samples[0] + \" to determine the expected and corrected headers for all files.\\n\")\n",
+ "print(\"These headers are: \\n\" + \", \".join([h for h in expected_headers]))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "d0e4670c-acd0-4183-ad09-4b0442abb2ef",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "DD3S1.csv file is processed !\n",
+ "\n",
+ "DD3S2.csv file is processed !\n",
+ "\n",
+ "DD3S3.csv file is processed !\n",
+ "\n",
+ "TMA.csv file is processed !\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Import all the others files\n",
+ "dfs = {}\n",
+ "\n",
+ "###############################\n",
+ "# !! This may take a while !! #\n",
+ "###############################\n",
+ "for sample in ls_samples:\n",
+ " file_path = os.path.join(input_data_dir,sample)\n",
+ " \n",
+ " try:\n",
+ " # Read the CSV file\n",
+ " df = pd.read_csv(file_path, index_col=0)\n",
+ " # Check if the DataFrame is empty, if so, don't continue trying to process df and remove it\n",
+ " \n",
+ " if not df.empty:\n",
+ " # Manipulations necessary for concatenation\n",
+ " df = apply_header_changes(df)\n",
+ " df = apply_df_changes(df)\n",
+ " # Reorder the columns to match the expected headers list\n",
+ " df = df.reindex(columns=expected_headers)\n",
+ " print(sample, \"file is processed !\\n\")\n",
+ " #print(df) \n",
+ " \n",
+ " # Compare df's header df against what is expected\n",
+ " compare_headers(expected_headers, df.columns.values, sample)\n",
+ " #print(df.columns.values)\n",
+ " # Add a new colunm to identify the csv file (sample) where the df comes from\n",
+ " df['Sample_ID'] = sample \n",
+ " \n",
+ " except pd.errors.EmptyDataError:\n",
+ " print(f'\\nEmpty data error in {sample} file. Removing from analysis...')\n",
+ " ls_samples.remove(sample) \n",
+ " \n",
+ " # Add df to dfs \n",
+ " dfs[sample] = df\n",
+ "\n",
+ "#print(dfs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "69a6106c-8106-427c-8d53-abc26c9db6e1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Cell_Size Nuc_X Nuc_Y_Inv ROI_index Nucleus_Size \\\n",
+ "ID \n",
+ "1@1 339 1484.771729 16632.205078 0 127 \n",
+ "2@1 344 1426.250000 16627.384766 0 112 \n",
+ "3@1 422 1531.110474 16622.238281 0 181 \n",
+ "4@1 278 1518.907593 16623.007812 0 119 \n",
+ "5@1 502 1488.051758 16616.375000 0 232 \n",
+ "\n",
+ " Nucleus_Roundness AF488_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 0.955040 2385.867188 \n",
+ "2@1 0.966643 2818.250000 \n",
+ "3@1 0.721534 2162.047363 \n",
+ "4@1 0.587196 2422.715820 \n",
+ "5@1 0.655828 2265.306885 \n",
+ "\n",
+ " AF488_Cytoplasm_Intensity_Average AF488_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 2356.660400 2434.622070 \n",
+ "2@1 2884.366455 2681.294678 \n",
+ "3@1 2124.817383 2211.618896 \n",
+ "4@1 2411.867920 2437.210205 \n",
+ "5@1 2154.796387 2393.918213 \n",
+ "\n",
+ " AF555_Cell_Intensity_Average ... r8c2_Cell_Intensity_Average \\\n",
+ "ID ... \n",
+ "1@1 1358.528076 ... 341.790558 \n",
+ "2@1 1472.325562 ... 365.531982 \n",
+ "3@1 1289.054443 ... 320.874420 \n",
+ "4@1 1397.992798 ... 343.320129 \n",
+ "5@1 1288.657349 ... 326.241028 \n",
+ "\n",
+ " r8c2_Cytoplasm_Intensity_Average r8c2_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 337.825470 348.409454 \n",
+ "2@1 369.340515 357.642853 \n",
+ "3@1 315.605804 327.889496 \n",
+ "4@1 338.679260 349.520996 \n",
+ "5@1 314.748138 339.616394 \n",
+ "\n",
+ " Sting_Cell_Intensity_Average Sting_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 1567.100342 1533.221680 \n",
+ "2@1 1508.014526 1565.086182 \n",
+ "3@1 1841.360229 1772.647339 \n",
+ "4@1 1723.863281 1688.094360 \n",
+ "5@1 1711.464111 1629.670410 \n",
+ "\n",
+ " Sting_Nucleus_Intensity_Average Vimentin_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 1623.653564 7279.144531 \n",
+ "2@1 1389.794678 6123.456543 \n",
+ "3@1 1932.850830 4252.185059 \n",
+ "4@1 1771.655518 6178.647461 \n",
+ "5@1 1806.655151 5208.479980 \n",
+ "\n",
+ " Vimentin_Cytoplasm_Intensity_Average Vimentin_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 7040.108398 7678.165527 \n",
+ "2@1 6734.603516 4857.508789 \n",
+ "3@1 4473.178223 3957.933594 \n",
+ "4@1 5316.924316 7330.025391 \n",
+ "5@1 4386.700195 6164.862305 \n",
+ "\n",
+ " Sample_ID \n",
+ "ID \n",
+ "1@1 DD3S1.csv \n",
+ "2@1 DD3S1.csv \n",
+ "3@1 DD3S1.csv \n",
+ "4@1 DD3S1.csv \n",
+ "5@1 DD3S1.csv \n",
+ "\n",
+ "[5 rows x 142 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Merge dfs into one df\n",
+ "df = pd.concat(dfs.values(), ignore_index=False , sort = False)\n",
+ "#del dfs\n",
+ "\n",
+ "print(df.head())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "5c724db9-eb76-4af1-8fe3-8beff43d8940",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Cell_Size Nuc_X Nuc_Y_Inv ROI_index Nucleus_Size \\\n",
+ "DD3S1_Cell_0 339 1484.771729 16632.205078 0 127 \n",
+ "DD3S1_Cell_1 344 1426.250000 16627.384766 0 112 \n",
+ "DD3S1_Cell_2 422 1531.110474 16622.238281 0 181 \n",
+ "DD3S1_Cell_3 278 1518.907593 16623.007812 0 119 \n",
+ "DD3S1_Cell_4 502 1488.051758 16616.375000 0 232 \n",
+ "\n",
+ " Nucleus_Roundness AF488_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 0.955040 2385.867188 \n",
+ "DD3S1_Cell_1 0.966643 2818.250000 \n",
+ "DD3S1_Cell_2 0.721534 2162.047363 \n",
+ "DD3S1_Cell_3 0.587196 2422.715820 \n",
+ "DD3S1_Cell_4 0.655828 2265.306885 \n",
+ "\n",
+ " AF488_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 2356.660400 \n",
+ "DD3S1_Cell_1 2884.366455 \n",
+ "DD3S1_Cell_2 2124.817383 \n",
+ "DD3S1_Cell_3 2411.867920 \n",
+ "DD3S1_Cell_4 2154.796387 \n",
+ "\n",
+ " AF488_Nucleus_Intensity_Average AF555_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 2434.622070 1358.528076 \n",
+ "DD3S1_Cell_1 2681.294678 1472.325562 \n",
+ "DD3S1_Cell_2 2211.618896 1289.054443 \n",
+ "DD3S1_Cell_3 2437.210205 1397.992798 \n",
+ "DD3S1_Cell_4 2393.918213 1288.657349 \n",
+ "\n",
+ " ... r8c2_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 ... 341.790558 \n",
+ "DD3S1_Cell_1 ... 365.531982 \n",
+ "DD3S1_Cell_2 ... 320.874420 \n",
+ "DD3S1_Cell_3 ... 343.320129 \n",
+ "DD3S1_Cell_4 ... 326.241028 \n",
+ "\n",
+ " r8c2_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 337.825470 \n",
+ "DD3S1_Cell_1 369.340515 \n",
+ "DD3S1_Cell_2 315.605804 \n",
+ "DD3S1_Cell_3 338.679260 \n",
+ "DD3S1_Cell_4 314.748138 \n",
+ "\n",
+ " r8c2_Nucleus_Intensity_Average Sting_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 348.409454 1567.100342 \n",
+ "DD3S1_Cell_1 357.642853 1508.014526 \n",
+ "DD3S1_Cell_2 327.889496 1841.360229 \n",
+ "DD3S1_Cell_3 349.520996 1723.863281 \n",
+ "DD3S1_Cell_4 339.616394 1711.464111 \n",
+ "\n",
+ " Sting_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 1533.221680 \n",
+ "DD3S1_Cell_1 1565.086182 \n",
+ "DD3S1_Cell_2 1772.647339 \n",
+ "DD3S1_Cell_3 1688.094360 \n",
+ "DD3S1_Cell_4 1629.670410 \n",
+ "\n",
+ " Sting_Nucleus_Intensity_Average \\\n",
+ "DD3S1_Cell_0 1623.653564 \n",
+ "DD3S1_Cell_1 1389.794678 \n",
+ "DD3S1_Cell_2 1932.850830 \n",
+ "DD3S1_Cell_3 1771.655518 \n",
+ "DD3S1_Cell_4 1806.655151 \n",
+ "\n",
+ " Vimentin_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 7279.144531 \n",
+ "DD3S1_Cell_1 6123.456543 \n",
+ "DD3S1_Cell_2 4252.185059 \n",
+ "DD3S1_Cell_3 6178.647461 \n",
+ "DD3S1_Cell_4 5208.479980 \n",
+ "\n",
+ " Vimentin_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 7040.108398 \n",
+ "DD3S1_Cell_1 6734.603516 \n",
+ "DD3S1_Cell_2 4473.178223 \n",
+ "DD3S1_Cell_3 5316.924316 \n",
+ "DD3S1_Cell_4 4386.700195 \n",
+ "\n",
+ " Vimentin_Nucleus_Intensity_Average Sample_ID \n",
+ "DD3S1_Cell_0 7678.165527 DD3S1.csv \n",
+ "DD3S1_Cell_1 4857.508789 DD3S1.csv \n",
+ "DD3S1_Cell_2 3957.933594 DD3S1.csv \n",
+ "DD3S1_Cell_3 7330.025391 DD3S1.csv \n",
+ "DD3S1_Cell_4 6164.862305 DD3S1.csv \n",
+ "\n",
+ "[5 rows x 142 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Set index to Sample_ID + cell number : \n",
+ "# create a new custom index for df based on the sample names and integer cell numbers, and then remove the temporary columns 'level_0' and 'index' that were introduced during the operations\n",
+ "\n",
+ "# Creates a copy of the DataFrame df and resets its index without creating a new column for the old index\n",
+ "# This essentially removes the old index column and replaces it with a default integer index\n",
+ "df = df.copy().reset_index(drop=True)\n",
+ "\n",
+ "#print(df)\n",
+ "\n",
+ "# Initializing an empty list index to store the new index labels for the DataFrame\n",
+ "index = []\n",
+ "\n",
+ "for sample in ls_samples:\n",
+ " # Extract a chunk of data from the original df where the 'Sample_ID' column matches the current sample name\n",
+ " # This chunk is stored in the df_chunk df, which is a subset of the original data for that specific sample\n",
+ " df_chunk = df.loc[df['Sample_ID'] == sample,:].copy()\n",
+ " old_index = df_chunk.index\n",
+ " # Reset the index of the df_chunk df, removing the old index and replacing it with a default integer index\n",
+ " df_chunk = df_chunk.reset_index(drop=True)\n",
+ " # A new index is created for the df_chunk df. It combines the sample name with 'Cell_' and the integer index values, converting them to strings\n",
+ " # This new index will have labels like 'SampleName_Cell_0', 'SampleName_Cell_1', and so on.\n",
+ " sample = sample.split('.')[0]\n",
+ " df_chunk = df_chunk.set_index(f'{sample}_Cell_' + df_chunk.index.astype(str))\n",
+ " # The index values of df_chunk are then added to the index list\n",
+ " index = index + df_chunk.index.values.tolist()\n",
+ "\n",
+ "# After processing all the samples in the loop, assign the index list as the new index of the original df.\n",
+ "df.index = index\n",
+ "# Remove the 'level_0' and 'index' columns from df\n",
+ "df = df.loc[:,~df.columns.isin(['level_0','index'])]\n",
+ "\n",
+ "print(df.head())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c95a292d-72df-4f1e-8a9d-a3de84d99057",
+ "metadata": {},
+ "source": [
+ "### I.3.2. NOT_INTENSITIES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "8e4bb227-2a4f-477b-a435-e85178d1003a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# not_intensities is the list of the columns unrelated to the markers fluorescence intensities\n",
+ "# Can include items that aren't in a given header.\n",
+ "#not_intensitiehttp://localhost:8888/lab/tree/Downloads/wetransfer_data-zip_2024-05-17_1431/1_qc_eda.ipynb\n",
+ "#I.3.2.-NOT_INTENSITIESs = ['Nuc_X', 'Nuc_X_Inv', 'Nuc_Y', 'Nuc_Y_Inv', 'Nucleus_Roundness', 'Nucleus_Size', 'Cell_Size', \n",
+ "# 'ROI_index', 'Sample_ID', 'replicate_ID', 'Cell_ID','cell_type', 'cell_subtype', 'cluster','ID', \n",
+ "# 'Cytoplasm_Size', 'immune_checkpoint', 'Unique_ROI_index', 'Patient', 'Primary_chem(1)_vs_surg(0)']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "3a0b81d8-1fa0-45da-92ab-2ee59ef9d51d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# not_intensities is the list of the columns unrelated to the markers fluorescence intensities\n",
+ "# Can include items that aren't in a given header.\n",
+ "not_intensities = ['Nuc_X', 'Nuc_X_Inv', 'Nuc_Y', 'Nuc_Y_Inv', 'Nucleus_Roundness', 'Nucleus_Size', 'Cell_Size', \n",
+ " 'ROI_index', 'Sample_ID', 'replicate_ID', 'Cell_ID','cell_type', 'cell_subtype', 'cluster','ID', \n",
+ " 'Cytoplasm_Size', 'immune_checkpoint', 'Unique_ROI_index', 'Patient', 'Primary_chem(1)_vs_surg(0)']\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "26669861-4eef-43f5-82f8-532f83bd7f9b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "'not_intensities.csv' already exists.\n",
+ "Reconciling file and Jupyter notebook lists.\n"
+ ]
+ }
+ ],
+ "source": [
+ "path_not_intensities = os.path.join(metadata_dir,\"not_intensities.csv\")\n",
+ "\n",
+ "# If this file already exists, add only not_intensities items of the list not already present in file\n",
+ "if os.path.exists(path_not_intensities):\n",
+ " print(\"'not_intensities.csv' already exists.\")\n",
+ " print(\"Reconciling file and Jupyter notebook lists.\")\n",
+ " file_not_intensities = open(path_not_intensities, \"r\")\n",
+ " file_ni = file_not_intensities.read().splitlines()\n",
+ " # Set difference to identify items not already in file\n",
+ " to_add = set(not_intensities) - set(file_ni)\n",
+ " # We want not_intensities to the a complete list\n",
+ " not_intensities = list(set(file_ni) | set(not_intensities))\n",
+ " file_not_intensities.close()\n",
+ " file_not_intensities = open(path_not_intensities, \"a\")\n",
+ " for item in to_add:\n",
+ " file_not_intensities.write(item +\"\\n\")\n",
+ " file_not_intensities.close()\n",
+ "\n",
+ "else:\n",
+ " # The file does not yet exist\n",
+ " print(\"Could not find \" + path_not_intensities + \". Creating now.\")\n",
+ " file_not_intensities = open(path_not_intensities, \"w\")\n",
+ " for item in not_intensities:\n",
+ " file_not_intensities.write(item + \"\\n\")\n",
+ " file_not_intensities.close()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "175ef4cd-600f-47d6-8e16-583f4a1a0abf",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['ROI_index',\n",
+ " 'Nuc_Y',\n",
+ " 'Nuc_Y_Inv',\n",
+ " 'Nuc_X_Inv',\n",
+ " 'cell_subtype',\n",
+ " 'Cell_ID',\n",
+ " 'Cytoplasm_Size',\n",
+ " 'ID',\n",
+ " 'replicate_ID',\n",
+ " 'Nucleus_Roundness',\n",
+ " 'Patient',\n",
+ " 'Primary_chem(1)_vs_surg(0)',\n",
+ " 'cell_type',\n",
+ " 'immune_checkpoint',\n",
+ " 'Cell_Size',\n",
+ " 'Sample_ID',\n",
+ " 'Nucleus_Size',\n",
+ " 'Nuc_X',\n",
+ " 'cluster',\n",
+ " 'Unique_ROI_index',\n",
+ " 'AF488_Cell_Intensity_Average',\n",
+ " 'AF488_Cytoplasm_Intensity_Average',\n",
+ " 'AF488_Nucleus_Intensity_Average',\n",
+ " 'AF555_Cell_Intensity_Average',\n",
+ " 'AF555_Cytoplasm_Intensity_Average',\n",
+ " 'AF555_Nucleus_Intensity_Average',\n",
+ " 'AF647_Cell_Intensity_Average',\n",
+ " 'AF647_Cytoplasm_Intensity_Average',\n",
+ " 'AF647_Nucleus_Intensity_Average',\n",
+ " 'AF750_Cell_Intensity_Average',\n",
+ " 'AF750_Cytoplasm_Intensity_Average',\n",
+ " 'AF750_Nucleus_Intensity_Average',\n",
+ " 'aSMA_Cell_Intensity_Average',\n",
+ " 'aSMA_Cytoplasm_Intensity_Average',\n",
+ " 'aSMA_Nucleus_Intensity_Average',\n",
+ " 'AXL_Cell_Intensity_Average',\n",
+ " 'AXL_Cytoplasm_Intensity_Average',\n",
+ " 'AXL_Nucleus_Intensity_Average',\n",
+ " 'B7H4_Cell_Intensity_Average',\n",
+ " 'B7H4_Cytoplasm_Intensity_Average',\n",
+ " 'B7H4_Nucleus_Intensity_Average',\n",
+ " 'CA9_Cell_Intensity_Average',\n",
+ " 'CA9_Cytoplasm_Intensity_Average',\n",
+ " 'CA9_Nucleus_Intensity_Average',\n",
+ " 'CD4_Cell_Intensity_Average',\n",
+ " 'CD4_Cytoplasm_Intensity_Average',\n",
+ " 'CD4_Nucleus_Intensity_Average',\n",
+ " 'CD8_Cell_Intensity_Average',\n",
+ " 'CD8_Cytoplasm_Intensity_Average',\n",
+ " 'CD8_Nucleus_Intensity_Average',\n",
+ " 'CD11b_Cell_Intensity_Average',\n",
+ " 'CD11b_Cytoplasm_Intensity_Average',\n",
+ " 'CD11b_Nucleus_Intensity_Average',\n",
+ " 'CD11c_Cell_Intensity_Average',\n",
+ " 'CD11c_Cytoplasm_Intensity_Average',\n",
+ " 'CD11c_Nucleus_Intensity_Average',\n",
+ " 'CD20_Cell_Intensity_Average',\n",
+ " 'CD20_Cytoplasm_Intensity_Average',\n",
+ " 'CD20_Nucleus_Intensity_Average',\n",
+ " 'CD31_Cell_Intensity_Average',\n",
+ " 'CD31_Cytoplasm_Intensity_Average',\n",
+ " 'CD31_Nucleus_Intensity_Average',\n",
+ " 'CD44_Cell_Intensity_Average',\n",
+ " 'CD44_Cytoplasm_Intensity_Average',\n",
+ " 'CD44_Nucleus_Intensity_Average',\n",
+ " 'CD45_Cell_Intensity_Average',\n",
+ " 'CD45_Cytoplasm_Intensity_Average',\n",
+ " 'CD45_Nucleus_Intensity_Average',\n",
+ " 'CD68_Cell_Intensity_Average',\n",
+ " 'CD68_Cytoplasm_Intensity_Average',\n",
+ " 'CD68_Nucleus_Intensity_Average',\n",
+ " 'CD163_Cell_Intensity_Average',\n",
+ " 'CD163_Cytoplasm_Intensity_Average',\n",
+ " 'CD163_Nucleus_Intensity_Average',\n",
+ " 'CKs_Cell_Intensity_Average',\n",
+ " 'CKs_Cytoplasm_Intensity_Average',\n",
+ " 'CKs_Nucleus_Intensity_Average',\n",
+ " 'ColVI_Cell_Intensity_Average',\n",
+ " 'ColVI_Cytoplasm_Intensity_Average',\n",
+ " 'ColVI_Nucleus_Intensity_Average',\n",
+ " 'DAPI0_Cell_Intensity_Average',\n",
+ " 'DAPI0_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI0_Nucleus_Intensity_Average',\n",
+ " 'DAPI1_Cell_Intensity_Average',\n",
+ " 'DAPI1_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI1_Nucleus_Intensity_Average',\n",
+ " 'DAPI2_Cell_Intensity_Average',\n",
+ " 'DAPI2_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI2_Nucleus_Intensity_Average',\n",
+ " 'DAPI3_Cell_Intensity_Average',\n",
+ " 'DAPI3_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI3_Nucleus_Intensity_Average',\n",
+ " 'DAPI4_Cell_Intensity_Average',\n",
+ " 'DAPI4_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI4_Nucleus_Intensity_Average',\n",
+ " 'DAPI5_Cell_Intensity_Average',\n",
+ " 'DAPI5_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI5_Nucleus_Intensity_Average',\n",
+ " 'DAPI6_Cell_Intensity_Average',\n",
+ " 'DAPI6_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI6_Nucleus_Intensity_Average',\n",
+ " 'DAPI7_Cell_Intensity_Average',\n",
+ " 'DAPI7_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI7_Nucleus_Intensity_Average',\n",
+ " 'DAPI8_Cell_Intensity_Average',\n",
+ " 'DAPI8_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI8_Nucleus_Intensity_Average',\n",
+ " 'Desmin_Cell_Intensity_Average',\n",
+ " 'Desmin_Cytoplasm_Intensity_Average',\n",
+ " 'Desmin_Nucleus_Intensity_Average',\n",
+ " 'Ecad_Cell_Intensity_Average',\n",
+ " 'Ecad_Cytoplasm_Intensity_Average',\n",
+ " 'Ecad_Nucleus_Intensity_Average',\n",
+ " 'Fibronectin_Cell_Intensity_Average',\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average',\n",
+ " 'Fibronectin_Nucleus_Intensity_Average',\n",
+ " 'FOXP3_Cell_Intensity_Average',\n",
+ " 'FOXP3_Cytoplasm_Intensity_Average',\n",
+ " 'FOXP3_Nucleus_Intensity_Average',\n",
+ " 'GATA3_Cell_Intensity_Average',\n",
+ " 'GATA3_Cytoplasm_Intensity_Average',\n",
+ " 'GATA3_Nucleus_Intensity_Average',\n",
+ " 'HLA_Cell_Intensity_Average',\n",
+ " 'HLA_Cytoplasm_Intensity_Average',\n",
+ " 'HLA_Nucleus_Intensity_Average',\n",
+ " 'Ki67_Cell_Intensity_Average',\n",
+ " 'Ki67_Cytoplasm_Intensity_Average',\n",
+ " 'Ki67_Nucleus_Intensity_Average',\n",
+ " 'MMP9_Cell_Intensity_Average',\n",
+ " 'MMP9_Cytoplasm_Intensity_Average',\n",
+ " 'MMP9_Nucleus_Intensity_Average',\n",
+ " 'PD1_Cell_Intensity_Average',\n",
+ " 'PD1_Cytoplasm_Intensity_Average',\n",
+ " 'PD1_Nucleus_Intensity_Average',\n",
+ " 'PDGFR_Cell_Intensity_Average',\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average',\n",
+ " 'PDGFR_Nucleus_Intensity_Average',\n",
+ " 'PDL1_Cell_Intensity_Average',\n",
+ " 'PDL1_Cytoplasm_Intensity_Average',\n",
+ " 'PDL1_Nucleus_Intensity_Average',\n",
+ " 'r5c2_Cell_Intensity_Average',\n",
+ " 'r5c2_Cytoplasm_Intensity_Average',\n",
+ " 'r5c2_Nucleus_Intensity_Average',\n",
+ " 'r7c2_Cell_Intensity_Average',\n",
+ " 'r7c2_Cytoplasm_Intensity_Average',\n",
+ " 'r7c2_Nucleus_Intensity_Average',\n",
+ " 'r8c2_Cell_Intensity_Average',\n",
+ " 'r8c2_Cytoplasm_Intensity_Average',\n",
+ " 'r8c2_Nucleus_Intensity_Average',\n",
+ " 'Sting_Cell_Intensity_Average',\n",
+ " 'Sting_Cytoplasm_Intensity_Average',\n",
+ " 'Sting_Nucleus_Intensity_Average',\n",
+ " 'Vimentin_Cell_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'Vimentin_Nucleus_Intensity_Average']"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Columns we want to keep: not_intensities, and any intensity column that contains 'Intensity_Average' (drop any intensity marker column that is not a mean intensity)\n",
+ "to_keep = not_intensities + [x for x in df.columns.values[~df.columns.isin(not_intensities)] if 'Intensity_Average' in x]\n",
+ "\n",
+ "to_keep"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "7ecf0c10-605d-486e-9b9e-f3cbb2a349cc",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " ROI_index Nuc_Y_Inv Nucleus_Roundness Cell_Size \\\n",
+ "DD3S1_Cell_0 0 16632.205078 0.955040 339 \n",
+ "DD3S1_Cell_1 0 16627.384766 0.966643 344 \n",
+ "DD3S1_Cell_2 0 16622.238281 0.721534 422 \n",
+ "DD3S1_Cell_3 0 16623.007812 0.587196 278 \n",
+ "DD3S1_Cell_4 0 16616.375000 0.655828 502 \n",
+ "\n",
+ " Sample_ID Nucleus_Size Nuc_X \\\n",
+ "DD3S1_Cell_0 DD3S1.csv 127 1484.771729 \n",
+ "DD3S1_Cell_1 DD3S1.csv 112 1426.250000 \n",
+ "DD3S1_Cell_2 DD3S1.csv 181 1531.110474 \n",
+ "DD3S1_Cell_3 DD3S1.csv 119 1518.907593 \n",
+ "DD3S1_Cell_4 DD3S1.csv 232 1488.051758 \n",
+ "\n",
+ " AF488_Cell_Intensity_Average AF488_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 2385.867188 2356.660400 \n",
+ "DD3S1_Cell_1 2818.250000 2884.366455 \n",
+ "DD3S1_Cell_2 2162.047363 2124.817383 \n",
+ "DD3S1_Cell_3 2422.715820 2411.867920 \n",
+ "DD3S1_Cell_4 2265.306885 2154.796387 \n",
+ "\n",
+ " AF488_Nucleus_Intensity_Average ... \\\n",
+ "DD3S1_Cell_0 2434.622070 ... \n",
+ "DD3S1_Cell_1 2681.294678 ... \n",
+ "DD3S1_Cell_2 2211.618896 ... \n",
+ "DD3S1_Cell_3 2437.210205 ... \n",
+ "DD3S1_Cell_4 2393.918213 ... \n",
+ "\n",
+ " r7c2_Nucleus_Intensity_Average r8c2_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 290.582672 341.790558 \n",
+ "DD3S1_Cell_1 304.133942 365.531982 \n",
+ "DD3S1_Cell_2 271.353577 320.874420 \n",
+ "DD3S1_Cell_3 292.134460 343.320129 \n",
+ "DD3S1_Cell_4 284.642242 326.241028 \n",
+ "\n",
+ " r8c2_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 337.825470 \n",
+ "DD3S1_Cell_1 369.340515 \n",
+ "DD3S1_Cell_2 315.605804 \n",
+ "DD3S1_Cell_3 338.679260 \n",
+ "DD3S1_Cell_4 314.748138 \n",
+ "\n",
+ " r8c2_Nucleus_Intensity_Average Sting_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 348.409454 1567.100342 \n",
+ "DD3S1_Cell_1 357.642853 1508.014526 \n",
+ "DD3S1_Cell_2 327.889496 1841.360229 \n",
+ "DD3S1_Cell_3 349.520996 1723.863281 \n",
+ "DD3S1_Cell_4 339.616394 1711.464111 \n",
+ "\n",
+ " Sting_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 1533.221680 \n",
+ "DD3S1_Cell_1 1565.086182 \n",
+ "DD3S1_Cell_2 1772.647339 \n",
+ "DD3S1_Cell_3 1688.094360 \n",
+ "DD3S1_Cell_4 1629.670410 \n",
+ "\n",
+ " Sting_Nucleus_Intensity_Average \\\n",
+ "DD3S1_Cell_0 1623.653564 \n",
+ "DD3S1_Cell_1 1389.794678 \n",
+ "DD3S1_Cell_2 1932.850830 \n",
+ "DD3S1_Cell_3 1771.655518 \n",
+ "DD3S1_Cell_4 1806.655151 \n",
+ "\n",
+ " Vimentin_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 7279.144531 \n",
+ "DD3S1_Cell_1 6123.456543 \n",
+ "DD3S1_Cell_2 4252.185059 \n",
+ "DD3S1_Cell_3 6178.647461 \n",
+ "DD3S1_Cell_4 5208.479980 \n",
+ "\n",
+ " Vimentin_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 7040.108398 \n",
+ "DD3S1_Cell_1 6734.603516 \n",
+ "DD3S1_Cell_2 4473.178223 \n",
+ "DD3S1_Cell_3 5316.924316 \n",
+ "DD3S1_Cell_4 4386.700195 \n",
+ "\n",
+ " Vimentin_Nucleus_Intensity_Average \n",
+ "DD3S1_Cell_0 7678.165527 \n",
+ "DD3S1_Cell_1 4857.508789 \n",
+ "DD3S1_Cell_2 3957.933594 \n",
+ "DD3S1_Cell_3 7330.025391 \n",
+ "DD3S1_Cell_4 6164.862305 \n",
+ "\n",
+ "[5 rows x 142 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# However, our to_keep list contains items that might not be in our df headers!\n",
+ "# These items are from our not_intensities list. So let's ask for only those items from to_keep that are actually found in our df\n",
+ "# Retains only the columns from the to_keep list that are found in the df's headers (columns). \n",
+ "# This ensures that we are only keeping the columns that exist in your df, avoiding any potential issues with non-existent column names. \n",
+ "# The result is a df containing only the specified columns.\n",
+ "df = df[[x for x in to_keep if x in df.columns.values]]\n",
+ "\n",
+ "print(df.head())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "284c8270-e13e-4f93-839b-5774a7fc9f4d",
+ "metadata": {},
+ "source": [
+ "## I.4. QC CHECKS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "91d9bebf-3c62-408e-923e-00447527ae3c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Index(['DD3S1_Cell_0', 'DD3S1_Cell_1', 'DD3S1_Cell_2', 'DD3S1_Cell_3',\n",
+ " 'DD3S1_Cell_4', 'DD3S1_Cell_5', 'DD3S1_Cell_6', 'DD3S1_Cell_7',\n",
+ " 'DD3S1_Cell_8', 'DD3S1_Cell_9',\n",
+ " ...\n",
+ " 'TMA_Cell_115751', 'TMA_Cell_115752', 'TMA_Cell_115753',\n",
+ " 'TMA_Cell_115754', 'TMA_Cell_115755', 'TMA_Cell_115756',\n",
+ " 'TMA_Cell_115757', 'TMA_Cell_115758', 'TMA_Cell_115759',\n",
+ " 'TMA_Cell_115760'],\n",
+ " dtype='object', length=433976)"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Let's take a look at a few features to make sure our dataframe is as expected\n",
+ "df.index"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "fe138d0d-7b02-48ac-af9e-caf85c4d3b73",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(433976, 142)"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "e1f30957-ab09-416b-8ed5-41b99a5c0b51",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False"
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Check for NaN entries (should not be any unless columns do not align)\n",
+ "# False means no NaN entries \n",
+ "# True means NaN entries \n",
+ "df.isnull().any().any()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "86e29b98-4758-4014-b976-db155fa9205f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "All expected filenames are present in big df Sample_ID column.\n",
+ "DD3S1_Cell_0 DD3S1.csv\n",
+ "DD3S1_Cell_1 DD3S1.csv\n",
+ "DD3S1_Cell_2 DD3S1.csv\n",
+ "DD3S1_Cell_3 DD3S1.csv\n",
+ "DD3S1_Cell_4 DD3S1.csv\n",
+ " ... \n",
+ "TMA_Cell_115756 TMA.csv\n",
+ "TMA_Cell_115757 TMA.csv\n",
+ "TMA_Cell_115758 TMA.csv\n",
+ "TMA_Cell_115759 TMA.csv\n",
+ "TMA_Cell_115760 TMA.csv\n",
+ "Name: Sample_ID, Length: 433976, dtype: object\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Check that all expected files were imported into final dataframe\n",
+ "if sorted(df.Sample_ID.unique()) == sorted(ls_samples):\n",
+ " print(\"All expected filenames are present in big df Sample_ID column.\")\n",
+ "else:\n",
+ " compare_headers(['no samples'], df.Sample_ID.unique(), \"big df Sample_ID column\")\n",
+ "\n",
+ "print(df.Sample_ID)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "66e0487d-8a29-400d-bde6-afde02985fdb",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "df.shape before removing 0 mean values: (433976, 142)\n",
+ "No zero intensity values found in the DataFrame.\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Delete rows that have 0 value mean intensities for intensity columns\n",
+ "print(\"df.shape before removing 0 mean values: \", df.shape)\n",
+ "\n",
+ "# We use the apply method on df to calculate the mean intensity for each row. It's done this by applying a lambda function to each row. \n",
+ "# The lambda function excludes the columns listed in the not_intensities list (which are not to be considered for mean intensity calculations) \n",
+ "# and calculates the mean of the remaining values in each row.\n",
+ "###############################\n",
+ "# !! This may take a while !! #\n",
+ "###############################\n",
+ "# Calculate mean intensity excluding 'not_intensities' columns\n",
+ "mean_intensity = df.loc[:, ~df.columns.isin(not_intensities)].mean(axis=1)\n",
+ "\n",
+ "# Check if there are any 0 mean intensity values\n",
+ "if (mean_intensity == 0).any():\n",
+ " df = df.loc[mean_intensity > 0, :]\n",
+ " print(\"df.shape after removing 0 mean values: \", df.shape)\n",
+ "else:\n",
+ " print(\"No zero intensity values found in the DataFrame.\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "93ff0fac-33ac-4120-b1cf-f3d413489b58",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Get quantiles (5th, 50th, 95th)\n",
+ "# List of nucleus size percentiles to extract \n",
+ "qs = [0.05,0.50,0.95] "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "86b0158b-6cb1-4ff8-815b-26aeed908b4b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.05 42.0\n",
+ "0.50 88.0\n",
+ "0.95 217.0\n",
+ "Name: Nucleus_Size, dtype: float64"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[\"Nucleus_Size\"].quantile(q=qs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "d7d6bf19-f83c-47b6-8e3a-a32d78e64a5c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA20AAAIhCAYAAADdH1JpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAACbyklEQVR4nOzdeXhM1/8H8PdkkpnsQ8giliSIJWKnJEqiEbEERS2NxlKlrSpBWkWLKGIN/VZbWiqKil0RSxTVqi3Voqi1dolYYiJ7MnN+f8wvl8meSDoT3q/nmSd37j333s+9c2YynznnnisTQggQERERERGRUTIxdABERERERERUMCZtRERERERERoxJGxERERERkRFj0kZERERERGTEmLQREREREREZMSZtRERERERERoxJGxERERERkRFj0kZERERERGTEmLQREREREREZMSZtRiwyMhIymUx6mJubw8nJCR07dkR4eDgSEhLyrDN9+nTIZLIS7Sc1NRXTp0/HL7/8UqL18tuXq6srAgMDS7Sdovz4449YvHhxvstkMhmmT59epvsra/v370erVq1gZWUFmUyGbdu25Vvu+vXr0msdFRWVZ3nO+X7w4EG5xVoRzmeO48ePo3fv3qhVqxaUSiUcHR3h5eWFCRMm6JXz9fWFr6+vYYIsAzmfA9evXzd0KEahItXR4nJ1dcXQoUOl53fv3sX06dNx6tSpPGWHDh0Ka2vr59pXWX9GF+SXX36BTCYr8f+Wslba/3HPyvl8joyMLLRczjFv2rSp1PsyJoXVxYJkZWUhLCwMrq6uUCqVaNCgAb788stir5+cnIyQkBA4OzvD3NwczZo1y/d/4tChQ/W+I+U8GjRoUOx9/RdK8j4o7rEXZO/evWjXrh0sLCygUqnQo0cPnDt3Lk85X1/ffM9dly5dSnJoRu38+fOYPn16vv87hw4dCldXV715uT+HjZGpoQOgoq1cuRINGjRAVlYWEhIScPjwYcydOxcLFizA+vXr0alTJ6nsO++8U+I3XWpqKsLCwgCgRF9uS7Ov0vjxxx9x9uxZhISE5Fl29OhR1KhRo9xjKC0hBPr374969eph+/btsLKyQv369Ytcb8qUKejbty/MzMz+gygrnujoaPTs2RO+vr6YN28eqlWrhri4OPzxxx+IiorCwoULpbJff/21ASMlKtrWrVtha2srPb979670pbdZs2aGC+w5tWjRAkePHoWHh4dB4yjt/zgqXV0cNWoUVq9ejc8//xytW7fG3r17MXbsWDx58gSTJ08ucv0+ffogNjYWc+bMQb169fDjjz/izTffhFarRVBQkF5ZCwsLHDhwIM+8iqokx57bTz/9hN69e6NXr17YvHkz1Go1wsLC0L59e8TGxqJOnTp65WvXro21a9fqzatUqVJZH5LBnD9/HmFhYfD19c2ToH322WcYO3asYQJ7DkzaKgBPT0+0atVKet63b1+MGzcOr776Kvr06YPLly/D0dERAFCjRo1yT2JSU1NhaWn5n+yrKG3btjXo/oty9+5dPHr0CL1794afn1+x1unatSt2796NpUuX4sMPPyznCCumefPmwc3NDXv37oWp6dOPsYEDB2LevHl6ZQ39hZGoKM2bNzd0CGUqKysLMpkMtra2Rv8ZXVGlpaXB3Ny8xD1rytu5c+ewYsUKzJo1Cx999BEAXaL88OFDzJw5E++99x7s7OwKXH/Xrl3Yt2+flKwAQMeOHXHjxg189NFHGDBgAORyuVTexMTkhaljJT323CZOnIjGjRtjy5YtUr3w9vZGvXr1MHXq1DwJmoWFxQtz7koqdwJbUbB7ZAVVq1YtLFy4EE+ePMGyZcuk+fl1WTxw4AB8fX1RpUoVWFhYoFatWujbty9SU1Nx/fp12NvbAwDCwsKkJvKcJuKc7f3555944403ULlyZamyF9YVc+vWrWjSpAnMzc1Ru3Zt/O9//9NbXlCXr9zdCHx9fREdHY0bN27oNeHnyK+r1NmzZ9GrVy9UrlxZ6l6watWqfPezbt06TJkyBc7OzrC1tUWnTp1w8eLFgk/8Mw4fPgw/Pz/Y2NjA0tIS3t7eiI6OlpZPnz5dSmonTpwImUyW59ee/Lz22msICAjA559/jidPnhRatqDm/Py6BD5+/BgTJkxA7dq1oVQq4eDggG7duuHChQuF7iM+Ph7vvvsuatSoAYVCATc3N4SFhSE7O1sqU1D3j/y6FP37778YOHAgnJ2dpW6Nfn5+Jep+8/DhQ1StWlUvYcthYqL/sZb7XBTUpSZ3XUpKSkJoaCjc3NygUChQvXp1hISEICUlpVgx7tmzB35+flCpVLC0tETDhg0RHh6uV2b79u3w8vKCpaUlbGxs4O/vj6NHjxa57eK+7jmvy48//oiJEyeiWrVqsLa2Ro8ePXDv3j08efIEI0eORNWqVVG1alUMGzYMycnJetuUyWQYPXo0Vq9ejYYNG8LS0hJNmzbFzp07C43x/v37UCgU+Oyzz/Isu3DhAmQymfS5cP/+fYwaNQoeHh6wtraGg4MDXnvtNfz2229FnouCPocK+oxZv349vLy8YGVlBWtrawQEBOCvv/7SK1OaOhodHQ2ZTIbY2Fhp3ubNmyGTydC9e3e9sk2aNEHfvn2l58++nr/88gtat24NABg2bFi+dRMArly5gm7dusHa2ho1a9bEhAkTkJGRUWB8ue3ZswctWrSAhYUFGjRogO+//z5PmZJ8lq5evRoTJkxA9erVoVQqceXKlTyfC892Ac/v8azvv/8eTZs2hbm5Oezs7NC7d2/8888/emVyuooWdi6K+h935coVDBs2DO7u7rC0tET16tXRo0cP/P3338U+l/lJT0/H+PHj4eTkBAsLC/j4+OSpZ3/88QcGDhwIV1dXWFhYwNXVFW+++SZu3LihVy6nLsfExODtt9+Gvb09LC0tkZGRgfv372PkyJGoWbMmlEol7O3t0a5dO/z888+Fxlec4y5uXXzWtm3bIITAsGHD9OYPGzYMaWlp2LNnT6Fxbd26FdbW1ujXr1+e9e/evYvjx48Xun5JfPXVV+jQoQMcHBxgZWWFxo0bY968ecjKytIr5+vrC09PT8TGxqJ9+/awtLRE7dq1MWfOHGi1Wr2yFy5cQJcuXWBpaYmqVavivffeK/L/eI7nOfaHDx/i4sWL6Nq1q957ycXFBZ6enti2bRs0Gk2x4iiOu3fvon///rCxsYFKpcKAAQNw7NixPP/vC7o8Ib/uiWFhYWjTpg3s7Oxga2uLFi1aYMWKFRBC6JXL6eJd2GdYZGSkdB47duwo1d2c2PLbf36K+z1g48aNaNOmjfT/vnbt2nj77beL3H5JMWmrwLp16wa5XI5ff/21wDLXr19H9+7doVAo8P3332PPnj2YM2cOrKyskJmZiWrVqkkfosOHD8fRo0dx9OjRPF+0+vTpg7p162Ljxo1YunRpoXGdOnUKISEhGDduHLZu3Qpvb2+MHTsWCxYsKPExfv3112jXrh2cnJyk2Ar7Unvx4kV4e3vj3Llz+N///octW7bAw8MDQ4cOzdMCAwCTJ0/GjRs3sHz5cnz77be4fPkyevToUeSH26FDh/Daa69BrVZjxYoVWLduHWxsbNCjRw+sX78egK776JYtWwAAH374IY4ePYqtW7cW67jnzp2LBw8eYP78+cUqX5QnT57g1VdfxbJlyzBs2DDs2LEDS5cuRb169RAXF1fgevHx8XjllVewd+9eTJ06Fbt378bw4cMRHh6OESNGlCqWbt264eTJk5g3bx727duHb775Bs2bN8fjx4+LvQ0vLy8cP34cY8aMwfHjx/P8ky3MZ599pleXjh49irfeegvA01a51NRU+Pj4YNWqVRgzZgx2796NiRMnIjIyEj179szzTyS3FStWoFu3btBqtVi6dCl27NiBMWPG4Pbt21KZH3/8Eb169YKtrS3WrVuHFStWIDExEb6+vjh8+HCxj6c4Jk+ejISEBERGRmLhwoX45Zdf8Oabb6Jv375QqVRYt24dPv74Y6xevTrf7kvR0dFYsmQJZsyYgc2bN0tfov/9998C92lvb4/AwECsWrUqzxeblStXQqFQYNCgQQCAR48eAQCmTZuG6OhorFy5ErVr14avr2+ZXg81e/ZsvPnmm/Dw8MCGDRuwevVqPHnyBO3bt8f58+elcqWpoz4+PjAzM9P7svzzzz/DwsIChw4dkupoQkICzp49q9et/VktWrTAypUrAQCffvqpVEffeecdqUxWVhZ69uwJPz8//PTTT3j77bexaNEizJ07t1jn4fTp05gwYQLGjRuHn376CU2aNMHw4cP1/peU9LN00qRJuHnzplTfHRwc8pSpVq1anvfe9u3bYWtri4YNG0rlwsPDMXz4cDRq1AhbtmzBF198gTNnzsDLywuXL1/W22ZR56Ko/3F3795FlSpVMGfOHOzZswdfffUVTE1N0aZNm2L/gJefyZMn499//8Xy5cuxfPly3L17F76+vnrvmevXr6N+/fpYvHgx9u7di7lz5yIuLg6tW7fO99rlt99+G2ZmZli9ejU2bdoEMzMzBAcHY9u2bZg6dSpiYmKwfPlydOrUCQ8fPiw0vuIcd3HqYm5nz56Fvb09nJyc9OY3adJEWl6Ys2fPomHDhnl+kCto/bS0NDg5OUEul6NGjRoYPXq09HlSlKtXryIoKAirV6/Gzp07MXz4cMyfPx/vvvtunrLx8fEYNGgQ3nrrLWzfvh1du3bFpEmTsGbNGqnMvXv34OPjg7Nnz+Lrr7/G6tWrkZycjNGjRxcrnpIe+7MyMzMBAEqlMs8ypVKJ1NRUXL16Nc/x29nZwdTUFHXq1MGUKVOQlpZWZJxpaWno1KkTYmJiEB4ejo0bN8LJyQkDBgwoct3CXL9+He+++y42bNiALVu2oE+fPvjwww/x+eef5ylb1GdY9+7dMXv2bAC65Dyn7ub+Aa0wxf0ecPToUQwYMAC1a9dGVFQUoqOjMXXqVL0ftsuMIKO1cuVKAUDExsYWWMbR0VE0bNhQej5t2jTx7Mu6adMmAUCcOnWqwG3cv39fABDTpk3Lsyxne1OnTi1w2bNcXFyETCbLsz9/f39ha2srUlJS9I7t2rVreuUOHjwoAIiDBw9K87p37y5cXFzyjT133AMHDhRKpVLcvHlTr1zXrl2FpaWlePz4sd5+unXrplduw4YNAoA4evRovvvL0bZtW+Hg4CCePHkizcvOzhaenp6iRo0aQqvVCiGEuHbtmgAg5s+fX+j28is7aNAgYWVlJeLi4oQQT8/3/fv3pXVcXFzEkCFD8mzLx8dH+Pj4SM9nzJghAIh9+/YVGkPu8/nuu+8Ka2trcePGDb1yCxYsEADEuXPnhBD5v27PHtPKlSuFEEI8ePBAABCLFy8uNI6iPHjwQLz66qsCgAAgzMzMhLe3twgPD9d7TYTIey5y27Bhg5DJZGLy5MnSvPDwcGFiYpLnvZfzftq1a1eB23vy5ImwtbUVr776qlQPctNoNMLZ2Vk0btxYaDQavXUdHByEt7e3NC+/90pxX/ec16VHjx565UJCQgQAMWbMGL35r7/+urCzs9ObB0A4OjqKpKQkaV58fLwwMTER4eHhBZ4HIYTYvn27ACBiYmKkednZ2cLZ2Vn07du3wPWys7NFVlaW8PPzE717984Tz7N1NL/PISHynrebN28KU1NT8eGHH+qVe/LkiXBychL9+/cXQjxfHX311VfFa6+9Jj2vW7eu+Oijj4SJiYk4dOiQEEKItWvXCgDi0qVLUrncr2dsbKze++ZZQ4YMEQDEhg0b9OZ369ZN1K9fv8gYXVxchLm5ud57Oi0tTdjZ2Yl3331XmlfSz9IOHTrk2VdBnws5UlJSxCuvvCKqVasmrl+/LoQQIjExUVhYWOT5bL5586ZQKpUiKCioxOeisP9xuWVnZ4vMzEzh7u4uxo0bJ83P/VlWkJxjbtGihd77//r168LMzEy88847he47OTlZWFlZiS+++EKan1OXBw8enGcda2trERISUuRxFaWg4y6sLubH39+/wHqoUCjEyJEjC13f3d1dBAQE5Jl/9+5dAUDMnj1bmhcRESEiIiJETEyMiImJEVOmTBGWlpaiQYMGef4PFEWj0YisrCzxww8/CLlcLh49eiQt8/HxEQDE8ePH9dbx8PDQi3XixIkFfv8p7H2QoyTHnl/8dnZ2ws/PT29+YmKisLGxEQDEkSNHpPlTpkwRX3/9tThw4ICIjo4Wo0ePFqampqJDhw56/5Py88033wgA4qefftKbP2LEiDx1paD/v0OGDCnwe13O8WRlZYkZM2aIKlWq6L2XivsZtnHjxgLPe377z/05XNzvATnfh3I+E8sTW9oqOFHEL/7NmjWDQqHAyJEjsWrVqkJ/GS/Ms115itKoUSM0bdpUb15QUBCSkpLw559/lmr/xXXgwAH4+fmhZs2aevOHDh2K1NTUPK10PXv21Hue84tW7u4pz0pJScHx48fxxhtv6I3iJpfLERwcjNu3bz/XL7Q5Zs6cKY3C9bx2796NevXqFfjrfkF27tyJjh07wtnZGdnZ2dKja9euAHQtjiVhZ2eHOnXqYP78+YiIiMBff/2VpxWmOKpUqYLffvtNumC7V69euHTpEiZNmoTGjRsXe4TNQ4cOITg4GG+99RZmzZolzd+5cyc8PT3RrFkzveMOCAgochSwI0eOICkpCaNGjSqw+/DFixdx9+5dBAcH63XntLa2Rt++fXHs2DGkpqYW72QUQ+7RAnNaNXL/6tiwYUM8evQoTxfJjh07wsbGRnru6OgIBweHQt8ngO76TCcnJ+nXekA3utndu3fzdB1ZunQpWrRoAXNzc5iamsLMzAz79+/P0yWutPbu3Yvs7GwMHjxY7zU1NzeHj4+P9Jo+Tx318/PD77//jrS0NNy4cQNXrlzBwIED0axZM+zbtw+ArvWtVq1acHd3L/WxyGQy9OjRQ29ekyZNinw9cjRr1gy1atWSnpubm6NevXp665f0s7Qk/yMAQKPRYMCAAfjnn3+wa9cuuLi4AND9ap2Wlpan+2/NmjXx2muvYf/+/Xrzn/dcZGdnY/bs2fDw8IBCoYCpqSkUCgUuX778XHUvKCgoTzc1b29vHDx4UJqXnJyMiRMnom7dujA1NYWpqSmsra2RkpKS777zO8evvPIKIiMjMXPmTBw7dqzYvQ7K67gBFHqdXXGuwSvu+uPGjcO4cePg7+8Pf39/zJw5Ez/88AMuXLiA7777rsj9/PXXX+jZsyeqVKkCuVwOMzMzDB48GBqNBpcuXdIr6+TkhFdeeUVvXu56dvDgwQK//xRXac+diYkJPvjgA+zfvx+ff/45EhIScOXKFbz11lvS/5Jn/9fMnDkT77//Pjp27Ihu3brhyy+/xJw5c/Drr7/ip59+KjTGgwcPwsbGJs/3p5IcZ34OHDiATp06QaVSSa/H1KlT8fDhwzyjpRfnM+x5Ffd7QE4X4v79+2PDhg24c+dOmcWQG5O2CiwlJQUPHz6Es7NzgWXq1KmDn3/+GQ4ODvjggw9Qp04d1KlTB1988UWJ9lWtWrVil83dLeLZeUV12XheDx8+zDfWnHOUe/9VqlTRe57TtaCwLgKJiYkQQpRoP6Xh6uqKUaNGYfny5Xm6BJXU/fv3SzVozL1797Bjxw6YmZnpPRo1agQAJb79gEwmw/79+xEQEIB58+ahRYsWsLe3x5gxY4rd7/9ZrVq1wsSJE7Fx40bcvXsX48aNw/Xr1/PtvpXbuXPn8Prrr6N9+/ZYsWKF3rJ79+7hzJkzeY7bxsYGQohCj/v+/fsAUOj5zqkfBdUhrVaLxMTEIo+huHJf+K9QKAqdn56erjc/9/sE0L1XiupKY2pqiuDgYGzdulXqWhgZGYlq1aohICBAKhcREYH3338fbdq0webNm3Hs2DHExsaiS5cuxequUxz37t0DoPsHm/t1Xb9+vfSaPk8d7dSpEzIyMnD48GHs27cPVatWRfPmzdGpUyep2+T+/ftL/ONJbpaWljA3N9ebp1Qq87xuBSnO61nSz9KS/I8AgPfeew979uzBpk2b9EYlLOq9kXu/z3suxo8fj88++wyvv/46duzYgePHjyM2NhZNmzZ9rrpX0P/BZ+MPCgrCkiVL8M4772Dv3r04ceIEYmNjYW9vn+++8zsn69evx5AhQ7B8+XJ4eXnBzs4OgwcPRnx8fKHxlddxV6lSJd//fykpKcjMzCx0EJLC1s/p8ljU+r1794aVlRWOHTtWaLmbN2+iffv2uHPnDr744gvpR8CvvvoKQN7vAMV9zxT2/acoz3vsU6dOxbhx4zBz5kw4OjpKPwzlXF9YvXr1QtfPuUygqHP38OFDafC7ZxX3OPNz4sQJdO7cGQDw3Xff4ffff0dsbCymTJkCoHSvx/Mq7veADh06YNu2bdKPgjVq1ICnpyfWrVtXZrHk4OiRFVh0dDQ0Gk2RQxi3b98e7du3h0ajwR9//IEvv/wSISEhcHR0xMCBA4u1r5KMUJXfP4uceTlvtJx/srkvnH/ee5BVqVIl32u07t69CwCoWrXqc20fACpXrgwTE5Ny3w+gu47g+++/x+TJk6VE6Vnm5ub5Dj7w4MEDvRjs7e31rqcqrqpVq6JJkyZ6rVDPyvkCV5LX08XFRUqSLl26hA0bNmD69OnIzMws8nrJwpiZmWHatGlYtGhRkddN3L59G126dEGtWrWwefPmPLdWqFq1KiwsLPIdnCFneUFyBj0o7HznvA8KqkMmJiaoXLlygesX93U3BsOGDcP8+fMRFRWFAQMGYPv27QgJCdEbBW3NmjXw9fXFN998o7ducRL5Z+ves9dz5K57Oedl06ZNUqtOQUpbR9u0aQNra2v8/PPPuH79Ovz8/CCTyeDn54eFCxciNjYWN2/efO6k7b9Q0s/SkvyPmD59OpYvX46VK1dKX9Se3S9Q8HujrOv3mjVrMHjwYOn6lxwPHjx4ruHPC/o/mHN8arUaO3fuxLRp0/DJJ59IZTIyMgq8Jiu/c1y1alUsXrwYixcvxs2bN7F9+3Z88sknSEhIKHTQj/I67saNGyMqKgrx8fF6X+JzBjjx9PQscv1169YhOztb79qu4q4P6Hog5R6QKrdt27YhJSUFW7Zs0fs8KMmAWLlVqVKl0O8/RXneYzc1NUVERARmzJiBa9euoWrVqtIPZG5ubsX+4baoc1elShWcOHEiz/z8jtPc3BxqtTrP/Nyfz1FRUTAzM8POnTv1foQp6L62/4WSfA/o1asXevXqhYyMDBw7dgzh4eEICgqCq6srvLy8yiwmtrRVUDdv3kRoaChUKlW+F83mRy6Xo02bNtIvSTldFYvTulQS586dw+nTp/Xm/fjjj7CxsUGLFi0AQBq158yZM3rltm/fnmd7Jfn1xM/PDwcOHJC+WOT44YcfYGlpWSbD21pZWaFNmzbYsmWLXlxarRZr1qxBjRo1UK9evefeD6D7cJw4cSI2bdqU74ekq6trnnN46dKlPN0zu3btikuXLuW5n01RAgMDcfbsWdSpUwetWrXK88hJ2kryej6rXr16+PTTT9G4ceMSdZ0taPCUnG49hbU+q9VqaYStXbt26d0fK0dgYCCuXr2KKlWq5HvchY065e3tDZVKhaVLlxbYfbl+/fqoXr06fvzxR70yKSkp2Lx5szSiZEGK+7obg4YNG6JNmzZYuXIlfvzxR2RkZOQZWU4mk+W5gP7MmTPFHkkzp/yzduzYofc8ICAApqamuHr1ar6v6bO3VXlWSeqomZkZOnTogH379uHAgQPw9/cHoPvhzNTUFJ9++qmUxBWmrD+TS6O8PktXrFiBsLAwzJgxI98RUL28vGBhYaE3wAOg+xEkp8tmSRV2PvOre9HR0c/dxWndunV67+0bN27gyJEj0o+sMpkMQog8+16+fHmpR/mrVasWRo8eDX9//yLranGPu6R1sVevXpDJZHlGGY2MjISFhUWR93bt3bs3kpOTsXnzZr35q1atgrOzM9q0aVPo+ps2bUJqamqR9TMnAX72HAghitWtsiAdO3Ys8PtPcTzvseewtrZG48aNUa1aNfz555/Yv39/se5JlvOaFXXuOnbsiCdPnuT5/57fcbq6uuLSpUt6PzI+fPgQR44c0Ssnk8lgamqq92NeWloaVq9eXWTcBXnez9HSfA9QKpXw8fGRBkLKPWLs82JLWwVw9uxZqS9tQkICfvvtN6xcuRJyuRxbt26VftnPz9KlS3HgwAF0794dtWrVQnp6uvSrQc6vvTY2NnBxccFPP/0EPz8/2NnZoWrVqsUaDjU/zs7O6NmzJ6ZPn45q1aphzZo12LdvH+bOnSt9EW3dujXq16+P0NBQZGdno3Llyti6dWu+o+bl3Hfkm2++QcuWLWFiYlLgF6xp06ZJ12FNnToVdnZ2WLt2LaKjozFv3jyoVKpSHVNu4eHh8Pf3R8eOHREaGgqFQoGvv/4aZ8+exbp168r03jkhISH46quvsHv37jzLcq7HGjVqFPr27YsbN25g3rx5eepESEgI1q9fj169euGTTz7BK6+8grS0NBw6dAiBgYHo2LFjvvueMWMG9u3bB29vb4wZMwb169dHeno6rl+/jl27dmHp0qWoUaMGnJyc0KlTJ4SHh6Ny5cpwcXHB/v37pdEzc5w5cwajR49Gv3794O7uDoVCgQMHDuDMmTN6vzYXJSAgADVq1ECPHj3QoEEDaLVanDp1CgsXLoS1tXWh/6CCgoJw/vx5fPvtt7h16xZu3bolLcu592BISAg2b96MDh06YNy4cWjSpAm0Wi1u3ryJmJgYTJgwocB/oNbW1li4cCHeeecddOrUCSNGjICjoyOuXLmC06dPY8mSJTAxMcG8efMwaNAgBAYG4t1330VGRgbmz5+Px48fY86cOYUef3Ffd2Px9ttv491338Xdu3fh7e2d5wbzgYGB+PzzzzFt2jT4+Pjg4sWLmDFjBtzc3Iocgatbt26ws7PD8OHDMWPGDJiamiIyMlLvdQV0Xx5mzJiBKVOm4N9//0WXLl1QuXJl3Lt3DydOnICVlRXCwsKeu476+flhwoQJAJ5+xlpYWMDb2xsxMTFo0qRJviMrPqtOnTqwsLDA2rVr0bBhQ1hbW8PZ2bnQHyPKWnl8lh49ehTvvfce2rVrB39//zzdsNq2bYtKlSrhs88+w+TJkzF48GC8+eabePjwIcLCwmBubo5p06aVeL+F/Y8LDAxEZGQkGjRogCZNmuDkyZOYP3/+c9+DNCEhAb1798aIESOgVqsxbdo0mJubY9KkSQAAW1tbdOjQAfPnz5diOXToEFasWFHsli61Wo2OHTsiKCgIDRo0gI2NDWJjY7Fnzx706dOn0HWLe9wlrYuNGjXC8OHDMW3aNMjlcrRu3RoxMTH49ttvMXPmTL0ufjNmzMCMGTOwf/9++Pj4AND9wOjv74/3338fSUlJqFu3LtatW4c9e/ZgzZo10pf6GzduICgoCAMHDkTdunUhk8lw6NAhLF68GI0aNSp0hEsA8Pf3h0KhwJtvvomPP/4Y6enp+Oabb56rW3pISAi+//57dO/eXeqiuHbt2iJvq5OjuMcO6EZCXbVqFa5evSq1FP7yyy+IjY1FkyZNIITAiRMnMHfuXHTp0kVvBMvffvsNs2bNQu/evVG7dm2kp6dj9+7d+Pbbb/Haa6/luUY0t8GDB2PRokUYPHgwZs2aBXd3d+zatQt79+7NUzY4OBjLli3DW2+9hREjRuDhw4eYN29enh9Lu3fvjoiICAQFBWHkyJF4+PAhFixYkO9omMWV0zL57bffwsbGBubm5nBzc8u3a2V+ivs9YOrUqbh9+zb8/PxQo0YNPH78GF988QXMzMykel1myn2oEyq1nBGjch4KhUI4ODgIHx8fMXv2bJGQkJBnndwjqR09elT07t1buLi4CKVSKapUqSJ8fHzE9u3b9db7+eefRfPmzYVSqRQApBF08huxsKB9CaEbfad79+5i06ZNolGjRkKhUAhXV1cRERGRZ/1Lly6Jzp07C1tbW2Fvby8+/PBDER0dnWe0n0ePHok33nhDVKpUSchkMr19Ip8Rwf7++2/Ro0cPoVKphEKhEE2bNs0z8lXOCF8bN27Um1/cEcKEEOK3334Tr732mrCyshIWFhaibdu2YseOHflurzSjRz7r22+/lerBs6+FVqsV8+bNE7Vr1xbm5uaiVatW4sCBA/mO2JSYmCjGjh0ratWqJczMzISDg4Po3r27uHDhglQmv/N5//59MWbMGOHm5ibMzMyEnZ2daNmypZgyZYpITk6WysXFxYk33nhD2NnZCZVKJd566y3xxx9/6J3Pe/fuiaFDh4oGDRoIKysrYW1tLZo0aSIWLVoksrOzizxHOdavXy+CgoKEu7u7sLa2FmZmZqJWrVoiODhYnD9/Xq9s7nPh4uKi97569vHssScnJ4tPP/1U1K9fXygUCqFSqUTjxo3FuHHjRHx8fJEx7tq1S/j4+AgrKythaWkpPDw8xNy5c/XKbNu2TbRp00aYm5sLKysr4efnJ37//Xe9MvmNHlnc172gel7QyLT5vd8BiA8++CDP8RU0gmV+1Gq1sLCwEADEd999l2d5RkaGCA0NFdWrVxfm5uaiRYsWYtu2bfmO8JVfHT1x4oTw9vYWVlZWonr16mLatGli+fLl+Y5Qu23bNtGxY0dha2srlEqlcHFxEW+88Yb4+eefhRDPX0dPnz4tAAh3d3e9+bNmzRIAxPjx4/Osk9+5XLdunWjQoIEwMzPTO+YhQ4YIKyurPNsoaBTN/PbVvXv3PPPz+8x4ns/SZ5flfJ7n/p+W+/Gs5cuXiyZNmkjvvV69ekmj1eYoybko6H9cYmKiGD58uHBwcBCWlpbi1VdfFb/99lue81HS0SNXr14txowZI+zt7YVSqRTt27cXf/zxh17Z27dvi759+4rKlSsLGxsb0aVLF3H27Nk89aGg92t6erp47733RJMmTYStra2wsLAQ9evXF9OmTZNGai5IcY9biILrYkEyMzPFtGnTRK1atYRCoRD16tUT//vf//KUy3mdco/u9+TJEzFmzBjh5OQkFAqFaNKkiVi3bp1emUePHonevXsLV1dXYWFhIRQKhXB3dxcff/xxsUfx27Fjh2jatKkwNzcX1atXFx999JHYvXt3nph8fHxEo0aN8qyf3+fT+fPnhb+/vzA3Nxd2dnZi+PDh4qeffirW6JHFPfacfef+fPv9999FmzZtpM82T09PsWDBApGZmam37uXLl0W3bt1E9erVhVKpFObm5qJx48Zi1qxZIj09vcgYhXhad62trYWNjY3o27evOHLkSL7vkVWrVomGDRsKc3Nz4eHhIdavX5/vufv+++9F/fr1hVKpFLVr1xbh4eFixYoV+Y6eXNzPsMWLFws3Nzchl8v1YivO6JFCFO97wM6dO0XXrl1F9erVpe/p3bp1E7/99luxzmVJyIQoYvhBIiIiIiKiAly/fh1ubm5YuXJlvl2f6fnxmjYiIiIiIiIjxmvaiMhoaLXaIu+J9eyoWkREREQvA3aPJCKjMX369CJvJn7t2rVSD5JDREREVBExaSMio3H37t08Q4zn1qRJE+km0EREREQvAyZtRERERERERowDkRARERERERkxXtH/H9Nqtbh79y5sbGzK9AbMRERERERUsQgh8OTJEzg7O8PEpOD2NCZt/7G7d++iZs2ahg6DiIiIiIiMxK1bt1CjRo0ClzNp+4/Z2NgA0L0wtra2Bo7mGVlZwMqVuulhwwAzszLZrK1KhdS1a5EdGFgm2zMmZmvXwnzSJDy5eRMAoAwPh2l0NFIOHzZwZJSfLE0WVv6lq+PDmg+Dmbxs6nhRbqhvoMn3TfDboN/QxKHJf7LP/1L40XBEX43G4bd09f79ve9DnaHGjz1/NHBkRERExi8pKQk1a9aUcoSCMGn7j+V0ibS1tTWupC0lBfjoI930++8DVlZPl12/Dri55V1n926gSxfd9PTpwLZtwKlTeYpZWloCJT3Wc+eAsDDg4EEgKQmoVQsYOBCYNAmwtCzZtsqCqysQEqJ75Bg6FOjb9+nrqFQCJibl97pmZABt2gCnTwN//QU0a6abf/o0MGcOcPgw8OCBLtb33gPGji16e6GhwLp1QFoa4OcHfP018OyvPImJwJgxwPbtuuc9ewJffglUqlQOB1i+UjJT8NFvujr+/qvvw0phpbd8w7kNmP3bbFx6eAn2VvYY3Xo0Pmr3kbT8l+u/oOOqjnm2+88H/6BB1QYAgKHbhuJx+mNsG7hNWm6j1X0IW1tbl7huHLl1BDN/nYmjt48iLSsN7lXcMbTpUIS0DYHcRF6ibZUFWZgMWwdsxesNXpfmTek4BaHtQ2FrqTs2MzMzmGpMy/R9cDr+NOb8PgeHbx7Gg9QHcK3kivdavoexbZ/W8fTsdLy38z2cjDuJf+7/g8B6gXqvA6B7fVadXpVn+x72Hjg36lyB+7+pvokPdn2AA9cOwMLUAkGNg7Cg8wIo5E9HMf373t8YvXs0Ttw5ATsLO7zb8l181uEzdoMnIqJiKer/BZM2Kr6ffwYaNXr63M6ufPZz7BjQqZPuER0NODoCJ04AEyYABw7oEjljGPLdwkL3+K98/DHg7KxL0p518iRgbw+sWQPUrAkcOQKMHAnI5cDo0QVvLyQE2LEDiIoCqlTRnd/AQN325P+fEAQFAbdvA3v26J6PHAkEB+vWe4Hsvrwbg7YMwpddv0TnOp3xz/1/8M6Od2BhZoHRr+ifw4ujL8JW+TQhsbe0L5eYtv6zFf039cewZsNwcMhBVDKvhJ///Rkf7/sYx+4cw4Y3NhhFQmCtsIa1wrpc93Ey7iTsLe2xpvca1FTVxJFbRzByx0jITeTS66PRamBhaoExr4zB5n8257udL7p8gTmd5kjPs7XZaLq0Kfp59Ctw3xqtBt1/7A57S3scHnYYD9MeYsi2IRBC4MtuXwIAkjKS4L/aHx3dOiJ2RCwuPbyEoduGwsrMChO8J5ThmSAiopeWoP+UWq0WAIRarTZ0KPqSk4UAdI/kZP1l167p5v/1V/7rrlz5dN2cx8qVumWAEN99J8TrrwthYSFE3bpC/PRTwXFotUJ4eAjRqpUQGo3+slOnhJDJhJgzp+C4EhN18w4e1D3Pzhbi7beFcHUVwtxciHr1hFi8WH+7Q4YI0auXEPPnC+HkJISdnRCjRgmRmalb7uOT9/hyjlulerqdadOEaNpUf9vffy9EgwZCKJVC1K8vxFdfFXzshdm1S7edc+cKfy1yjBolRMeOBS9//FgIMzMhoqKezrtzRwgTEyH27NE9P39et69jx56WOXpUN+/ChdIdhwElZyQLTIfAdIjkDP06/uamN8UbG97Qm7fo6CJRI6KG0Gq1QgghDl47KDAdIjEtMd/tTzs4Tdp+zuPgtYPiWuI1gekQm89vFr6RvsJipoVo8k0TceTmkUJjrTK3iuizvk+eZdsvbBeYDhH1d1SBcf0V95fAdIhrideEEEI8SHkgBm4aKKovrC4sZloIz689xY9nftTbrs9KH/Hhrg/FRzEficpzKgvH+Y5i2sFp0nKXRS56x+ayyEU67qbfNJXKDdk6RPRa10t6rtVqxdzDc4XbYjdhPtNcNPmmidh4bmOBx15co3aOEh0j86/juWMoyNZ/tgrZdJm4nni9wDK7Lu0SJmEm4k7SHWneur/XCeXnSqFO132Of33ia6EKV4n0rHSpTPhv4cJ5obNUf4iIiPJT3NyAQ/5T8fXsCTg4AO3aAZs2PZ0/YICulaZRIyAuTvcYMODp8rAwoH9/4MwZoFs3YNAg4NGj/Pdx6hRw/jwwfjyQewSdpk11rW/r1hU/Zq1W191vwwbddqdOBSZP1j1/1sGDwNWrur+rVgGRkboHAGzZotvGjBlPj684vvsOmDIFmDUL+OcfYPZs4LPPdNvP4eur62ZZmHv3gBEjgNWri981VK0uvCX05EnddYydOz+d5+wMeHrqWuoA4OhRQKXSdcnM0batbl5OmRdEhiYD5qbmevMsTC1wO+k2bqhv6M1vvqw5qi2sBr8f/HDw2kFpfqh3KPo36o8udbsgbkIc4ibEwbumt7R8yoEpCPUKxan3TqFelXp4c/ObyNZm5xtPzNUYPEx7iFCv0DzLetTvgXpV6mHd2eK/D9Kz09GyWkvsDNqJs6POYmSLkQjeGozjt4/rlVt1ehWszKxw/J3jmOc/DzMOzcC+q/sAALEjYgEAK3utRNyEOOl5UT498ClWnlqJb7p/g3OjzmFc23F4a8tbOHT9kFTGdbErpv8yvdjHAwDqDDXsLJ6vtX/FXyvQqXYnuFRyKbDM0dtH4engCWcbZ2leQJ0AZGgycPLuSamMj6sPlKZKvTJ3n9zF9cfXnytGIiIigN0jqTisrYGICF2yZmKiu75pwABd8vHWW7ougtbWgKkp4OSUd/2hQ4E339RNz56tuybqxImn18M969Il3d+GDfOPpWFD3bVbxWVmpksac7i56RKODRt0iWSOypWBJUt03QIbNAC6dwf279clS3Z2uvk2NvkfX0E+/xxYuBDo0+fpvs+fB5YtA4YM0c2rVQuoVq3gbQihO3/vvQe0aqW7vrAoR4/qji86uuAy8fG6LqaVK+vPd3TULcsp4+CQd10Hh6dlXhABdQIwbu84DG06FB3dOuLKoytYfHwxACDuSRxcK7mimnU1fBv4LVo6t0RGdgZWn1kNvx/88MvQX9DBpQOsFdawMLVARnYGnKzz1pNQr1B0r9cdABDmG4ZGXzfClUdXpOvhnnXpoe590NA+//dBg6oNpDLFUd22OkK9nyaAH7b5EHuu7sHG8xvRpsbTpLyJYxNM850GAHCv4o4lJ5Zg/7X98K/jD3srXTfQSuaV8j2+/KRkpiDiWAQODD4Ar5peAIDalWvj8M3DWHZyGXxcfQAAdezqoKpl1WIfz9FbR7Hh3AZEBxVSx4sQ9yQOuy/vxo99Cx8wJT45Ho5WjnrzKltUhkKuQHxyvFTGtZKrXhlHa0dpmVvlfK4JJqIKRwiB7OxsaDQaQ4dCFYhcLoepqelzX9LApI2KVrUqMG7c0+etWukGqJg3T5e0FaXJMyPmWVnpkp+EhNLFIkTJr2dbuhRYvhy4cUM34EZm5tNBPHI0avT0Oi5Al0j9/XfpYgSA+/eBW7eA4cN1iV+O7GxdS1WOH34ofDtffqkbiGXSpOLt99w5oFcvXYuiv3/J4xYCePZDJb8PmNxlXgAjWozA1UdXEbguEFmaLNgqbTG2zVhMPzRdGvCjftX6qF+1vrSOV00v3Eq6hQVHFqCDS4ci99HE8en7oJq1LlFPSEnIN2nLIYQocP6zg2AURaPVYM7hOVh/bj3uPLmDjOwMZGgyYGWmPxhL7tEtq9lUQ0JKKd+rAM7fP4/07HT4r9avi5maTDSv1lx6vn/w/mJv81zCOfSK6oWpPlPhX6cUdfz/RZ6KRCXzSnqDqhQkv3+0Qgi9+TLI8iwvaF0iqngyMzMRFxeH1NRUQ4dCFZClpSWqVasGxXOMycCkjUqnbVtdIlQcuW8fIJPpui3mx91d9/f8+byJFQBcuADUq6ebzuk++ewX26ws/fIbNugSzoULAS8vXcI4fz5wXL9bWIliLI6cdb/7Tr97IaCfHBblwAHdwCxKpf78Vq103Uyf7Wp5/jzw2mu6JPHTTwvfrpOTLnlNTNRvbUtIALy9n5a5dy/vuvfv61rkXiAymQxz/editt9sxCfHw97KHvv/1SUSuVtQntW2elus+XtNsfbx7C0Gcr7Ia0X+dcy9iu598M+Df/S6WOa48OACmjk1AwCYyHTvg2cTvCyN/vtg4dGFWHRsERZ3WYzGDo1hpbBCyJ4QZGoyC4wR0CUiBcVYHDnrRgdFo7ptdb1lSrkyv1UKdf7+ebz2w2sY0WIEPu1QRB0vhBAC35/6HsFNgotMfp2snXD8jv7nRWJaIrK0WVILnJO1E+JT9Fufc5Ld3K10RFTxaLVaXLt2DXK5HM7OzlAoFPxBhopFCIHMzEzcv38f165dg7u7e6E30C4MkzbSUSqBnTufThflr7/0u/UpFEBZdBdo3lzXPXHRIt0Q/89W7NOndSNYLlmie27//6P2xcXp1gPy3nLgt990ScioUU/nXb1a8rhKenyOjkD16sC//+qSq9L63/+AmTOfPr97FwgIANav108Gz53TJWxDhuiuoStKy5a6RHXfvqfdROPigLNndS2ogC7JVat1XVlfeUU37/hx3TzvvImEsVOaKrHzzZ3SdH7kJnIpuVh3dh28anjBwSqfLqL/76/4v6RWMwBQyBXQiOd/HwTUCYCdhR0WHl2YJ2nbfnE7Lj+6jMVdFgN4OnplXHIcKlvoEvBT8af01vnt5m/oVb8X3mqiaxnXCi0uP7qMhlUL6IZcADMTM2i0xT8+D3sPKOVK3FTflLpClta5hHN47YfXMKTpEMzyK0YdL8ShG4dw5dEVDG8xvMiyXjW8MOu3WYh7EodqNrrXOuZqDJRyJVo6t5TKTD4wGZmaTCkJjLkaA2cb50KTfiKqGDIzM6HValGzZk3dbYyISsDCwgJmZma4ceMGMjMzYW5uXvRK+WDSRjqmprrruPKzapXuC37z5rokascOXTIxd+7TMq6uwLVruqSpRg1di1Zxkr/cZDJdC17nzkDfvrpugU5OumRhwgRdwvLuu7qyFha6Fr85c3T7f/AgbwtT3bq6Loh79+quKVu9GoiNzf++c4VxdQV+/VWXSCqVui6jRZk+XXePM1tboGtX3X3R/vhD17o1fryuzODBuuQuPDz/bdSqpf/c+v+HVq9T5+n91M6dAzp21J2z8eOfXm8mlz9NbO/c0d2H7YcfdAmYSqXrujlhgm64fzs73T3bGjfWDfYC6K4f7NJF13K3bJlu3siRutsC1H/aTbCiMDUxla4py+1B6gNsOr8Jvq6+SM9Ox8q/VmLj+Y04NPTpYBmLjy2GayVXNLJvhExNJtacWYPN/2zG5v5Ph5d3reSKvVf34uKDi6hiWQUqpSq/3RXJSmGFZYHLMHDTQIzcMRKjXxkNW6Ut9v+7Hx/t+wjvNH8H3dy7AQDq2tVFTduamP7LdMx8bSYuP7yMhUcX6m2vbuW62PzPZhy5dQSVzSsj4mgE4pPjS5y0uVZyxf5r+9GuVjso5UopSSyIjdIGod6hGLd3HLRCi1drvYqkjCQcuXUE1gprDGmmu7bT7wc/9G7QO8/tFXKcSziHjqs6onOdzhjvNV66lkwuk0vX2gG6lrhMTSYepT3Ck8wnUvKa0yqZY8VfK9Cmeht4Onjm2dfWf7Zi0v5JuDD6AgCgc53O8LD3QPDWYMz3n49HaY8Qui8UI1qMkG79ENQ4CGGHwjB021BMbj8Zlx9exuzDszG1w1T+Gk/0AiltCwlRWdQdJm1UPDNn6q4Jk8t13RO//17/era+fXWjLHbsCDx+DKxcWfSoiAVp107XJTAsTJfs5Iw0OXq0rgXu2e6F338PvP22rrtg/fq6VqJnR0R87z1dIjlggC4hfPNNXavb7t0li2nGDF2yWKeOLvkq4FojPe+8oxvtcf583T3WrKx0SdGzN+i+eTPvKJkltXGjrsvi2rW6Rw4Xl6cDl2RlARcvAs/2xV+0SJes9+//9ObakZH653ftWl3imXNOe/Z82tL5gll1ehVCY0IhIOBVwwu/DPkFr1R/RVqeqclEaEwo7jy5AwtTCzRyaITooGgpeQJ018b9cv0XtPquFZIzk3FwyMFSt7S84fEGDg45iFm/zUL7le2RlJEEAJjjNwcTX50olTOTm2Fd33V4P/p9NF3aFK2dW2PmazPRb+PTe4995vMZrj2+hoA1AbA0s8TIFiPxeoPXoU5XlyimhZ0XYnzMeHz353eoblMd10OuF7nO5x0/h4OVA8IPh+PfxH9RybwSWlRrgcntJ0tlrj66igepDwrcxsbzG3E/9T7W/r0Wa/9+WsddVC56MXRb201vtM/my3Qt8GLa0/erOl2Nzec344suX+S7L3WGGhcfXpSey03kiA6KxqjoUWj3fTtYmFkgyFN3c+0cKnMV9gXvwwe7PkCrb1uhskVljG87HuO9xhd5foiIiIpDJgq60p3KRVJSElQqFdRqNWxtbYte4b+SlfX0C/+gQXmv8TIkrVbXKrR3L3Do0NPr3ohKIEuTJX3hH9R4UJ7rt4xdenY6ekX1wi31LRwaekivhYmIiMpPeno6rl27Bjc3t1J3baOXW2F1qLi5Adt5SSczExg2TPfIzCy6/H/JxARYsQKYOFF3jRpRKWRqMjHsp2EY9tOwPANwVATmpub4aeBPGNx0MH698auhwyEiIiozv/zyC2QyGR4/fgwAiIyMRKVKlQwak7Fh0kYVg4kJMHasrisk0UvK3NQcn7z6Cfp69DV0KEREVEHcunULw4cPl0a+dHFxwdixY/Hw4UODxOPr64uQZy8VAeDt7Y24uDioVKW7FrwgmzdvhoeHB5RKJTw8PLB169Yi1/n777/h4+MDCwsLVK9eHTNmzNAboTknwcz9uHDhQpnGnhuTNiIiIiKiF9C///6LVq1a4dKlS1i3bh2uXLmCpUuXYv/+/fDy8sKjnHEDDEyhUMDJyalMB286evQoBgwYgODgYJw+fRrBwcHo378/jue+7dMzkpKS4O/vD2dnZ8TGxuLLL7/EggULEBERkafsxYsXERcXJz3cy/nyHSZtRERERESlkZJS8CM9vfhl09KKV7aEPvjgAygUCsTExMDHxwe1atVC165d8fPPP+POnTuYMmWKVFYmk2Hbtm1661eqVAmRkZHS84kTJ6JevXqwtLRE7dq18dlnnyHrmXvkTp8+Hc2aNcPq1avh6uoKlUqFgQMH4smTJwCAoUOH4tChQ/jiiy+kFqrr16/n6R6Znx07dqBly5YwNzdH7dq1ERYWhuzs7ALLL168GP7+/pg0aRIaNGiASZMmwc/PD4sXLy5wnbVr1yI9PR2RkZHw9PREnz59MHnyZERERCD3MCAODg5wcnKSHvKS3Ie3FJi0ERERERGVhrV1wY++ubqyOzgUXLZrV/2yrq75lyuBR48eYe/evRg1ahQsLCz0ljk5OWHQoEFYv359nmSkMDY2NoiMjMT58+fxxRdf4LvvvsOiRYv0yly9ehXbtm3Dzp07sXPnThw6dAhz5swBAHzxxRfw8vLCiBEjpBaqmjVrFrnfvXv34q233sKYMWNw/vx5LFu2DJGRkZhVyL1pjx49is7PjigOICAgAEeOHCl0HR8fHyifuW1VQEAA7t69i+s5I3L/v+bNm6NatWrw8/PDwYMHizyG58WkjYiIiIjoBXP58mUIIdCwYf735GzYsCESExNx//79Ym/z008/hbe3N1xdXdGjRw9MmDABGzZs0Cuj1Wqllqr27dsjODgY+/fvBwCoVCooFApYWlqWqIVq1qxZ+OSTTzBkyBDUrl0b/v7++Pzzz7Es5z6y+YiPj4ejo6PePEdHR8Tn3M+2BOvkLAOAatWq4dtvv8XmzZuxZcsW1K9fH35+fvj11/IdJIz3aSMiIiIiKo3k5IKX5U5GEhIKLpv7nq25WnXKQ04Lm0KhKPY6mzZtwuLFi3HlyhUkJycjOzs7zzD1rq6usLGxkZ5Xq1YNCYUdezGcPHkSsbGxei1rGo0G6enpSE1NhaWlZb7r5b5GTghR5HVz+a3z7Pz69eujfv360nIvLy/cunULCxYsQIcOHYp/UCXEpI10lEog55eSZ5qEiV4USlMlNryxQZomIiJ6blZWhi9bgLp160Imk+H8+fN4/fXX8yy/cOEC7O3tpaH1ZTJZnq6Sz16vduzYMQwcOBBhYWEICAiASqVCVFQUFi5cqLeOWa57/cpkMmi12uc6Fq1Wi7CwMPTp0yfPsoLunefk5JSnVS0hISFPS1px1gFQ6Hpt27bFmjVrClxeFpi0kY6pKdCvn6GjICo3piam6NeIdZyIiF4OVapUgb+/P77++muMGzdO77q2+Ph4rF27Fh988IE0z97eHnFxcdLzy5cvIzU1VXr++++/w8XFRW/wkhs3bpQ4LoVCAY1GU6J1WrRogYsXL6Ju3brFXsfLywv79u3DuHHjpHkxMTHw9vYudJ3JkycjMzNTaoGMiYmBs7MzXF1dC1zvr7/+QrVq1YodW2kwaXvJbbyqLrdt96tTtvfaICIiIqLiW7JkCby9vREQEICZM2fCzc0N586dw0cffYR69eph6tSpUtnXXnsNS5YsQdu2baHVajFx4kS9VrO6devi5s2biIqKQuvWrREdHV2s+57l5urqiuPHj+P69euwtraGnZ1dketMnToVgYGBqFmzJvr16wcTExOcOXMGf//9N2bOnJnvOmPHjkWHDh0wd+5c9OrVCz/99BN+/vlnHD58WO/8bN26VbrmLigoCGFhYRg6dCgmT56My5cvY/bs2Zg6darUPXLx4sVwdXVFo0aNkJmZiTVr1mDz5s3YvHlzic9FSXAgEgIAyLKzUWPXNtTYtQ2yQoZPJaqosrXZ2HhuIzae24hsLes4ERG9+Nzd3REbG4vatWujf//+cHFxQdeuXVGvXj38/vvvsH5mRMqFCxeiZs2a6NChA4KCghAaGqp3rVivXr0wbtw4jB49Gs2aNcORI0fw2WeflTim0NBQyOVyeHh4wN7eHjdv3ixynYCAAOzcuRP79u1D69at0bZtW0RERMDFxaXAdby9vREVFYWVK1eiSZMmiIyMxPr169GmTRupzIMHD3D16lXpuUqlwr59+3D79m20atUKo0aNwvjx4zF+/HipTGZmJkJDQ9GkSRO0b98ehw8fRnR0dL5dN8uSTJRknE96bklJSVCpVFCr1Xku3DSEnJY2eWoK+jSpDgDYcuYONJbP35eaLW1kTFIyU2AdrvvnlDwpGVaK56/jRET04ktPT8e1a9fg5uZW4PVTFcm0adMQERGBmJgYeHl5GTqcl0Jhdai4uQG7RxIRERERvSTCwsKkLopt2rSBSe6RK8koMWkjIiIiInqJDBs2zNAhUAkxtSYiIiIiIjJiTNqIiIiIiIiMGJM2IiIiIiIiI8akjYiIiIiIyIhxIBICAGjNFDgx9ytpmuhFo5ArsLLXSmmaiIiIqKJg0kYAAGFmhht9Bxk6DKJyYyY3w9BmQw0dBhEREVGJsXskERERERGREWPSRgAAWXY2nA7uhdPBvZBlZxs6HKIyl63NRvSlaERfika2lnWciIjIWPzyyy+QyWR4/PgxACAyMhKVKlUyaEzGxqBJ26+//ooePXrA2dkZMpkM27Zt01suhMD06dPh7OwMCwsL+Pr64ty5c3plMjIy8OGHH6Jq1aqwsrJCz549cfv2bb0yiYmJCA4OhkqlgkqlQnBwsFQpcty8eRM9evSAlZUVqlatijFjxiAzM1OvzN9//w0fHx9YWFigevXqmDFjBoQQZXY+DMkkMwPtRwxA+xEDYJKZYehwiMpcRnYGAtcFInBdIDKyWceJiOjlcOvWLQwfPhzOzs5QKBRwcXHB2LFj8fDhQ4PE4+vri5CQEL153t7eiIuLg0qlKtN9bd68GR4eHlAqlfDw8MDWrVuLXGfDhg1o1qwZLC0t4eLigvnz5+stz0kwcz8uXLhQprHnZtCkLSUlBU2bNsWSJUvyXT5v3jxERERgyZIliI2NhZOTE/z9/fHkyROpTEhICLZu3YqoqCgcPnwYycnJCAwMhEajkcoEBQXh1KlT2LNnD/bs2YNTp04hODhYWq7RaNC9e3ekpKTg8OHDiIqKwubNmzFhwgSpTFJSEvz9/eHs7IzY2Fh8+eWXWLBgASIiIsrhzBARERERPZ9///0XrVq1wqVLl7Bu3TpcuXIFS5cuxf79++Hl5YVHjx4ZOkQAgEKhgJOTE2QyWZlt8+jRoxgwYACCg4Nx+vRpBAcHo3///jh+/HiB6+zevRuDBg3Ce++9h7Nnz+Lrr7+WcpHcLl68iLi4OOnh7u5eZrHnSxgJAGLr1q3Sc61WK5ycnMScOXOkeenp6UKlUomlS5cKIYR4/PixMDMzE1FRUVKZO3fuCBMTE7Fnzx4hhBDnz58XAMSxY8ekMkePHhUAxIULF4QQQuzatUuYmJiIO3fuSGXWrVsnlEqlUKvVQgghvv76a6FSqUR6erpUJjw8XDg7OwutVlvgcaWnpwu1Wi09bt26JQBI2zW0DVceiw1XHovNZ+4IAQgBiM1n7kjzn+dBZEySM5IFpkNgOkRyRrKhwyEiogoiLS1NnD9/XqSlpeVZlpyRXOAjLSut2GVTM1OLVbakunTpImrUqCFSU/W3HxcXJywtLcV7770nzcv9XVwIIVQqlVi5cqX0/OOPPxbu7u7CwsJCuLm5iU8//VRkZmZKy6dNmyaaNm0qfvjhB+Hi4iJsbW3FgAEDRFJSkhBCiCFDhggAeo9r166JgwcPCgAiMTFRCCHEypUrhUql0otl+/btokWLFkKpVAo3Nzcxffp0kZWVVeCx9+/fX3Tp0kVvXkBAgBg4cGCB67z55pvijTfe0Ju3aNEiUaNGDen7fu5Yi6OwOqRWq4uVGxjtNW3Xrl1DfHw8OnfuLM1TKpXw8fHBkSNHAAAnT55EVlaWXhlnZ2d4enpKZY4ePQqVSoU2bdpIZdq2bQuVSqVXxtPTE87OzlKZgIAAZGRk4OTJk1IZHx8fKJVKvTJ3797F9evXCzyO8PBwqVumSqVCzZo1n+OsEBEREZGxsA63LvDRd0NfvbIOCxwKLNt1bVe9sq5fuOZbriQePXqEvXv3YtSoUbCwsNBb5uTkhEGDBmH9+vUlutTHxsYGkZGROH/+PL744gt89913WLRokV6Zq1evYtu2bdi5cyd27tyJQ4cOYc6cOQCAL774Al5eXhgxYoTUQlWc78Z79+7FW2+9hTFjxuD8+fNYtmwZIiMjMWvWrALXOXr0qF6OAOi+u+d8/89PRkYGzM3N9eZZWFjg9u3buHHjht785s2bo1q1avDz88PBgweLPIbnZbRJW3x8PADA0dFRb76jo6O0LD4+HgqFApUrVy60jIODQ57tOzg46JXJvZ/KlStDoVAUWibneU6Z/EyaNAlqtVp63Lp1q/ADJyIiIiJ6TpcvX4YQAg0bNsx3ecOGDZGYmIj79+8Xe5uffvopvL294erqih49emDChAnYsGGDXhmtVovIyEh4enqiffv2CA4Oxv79+wEAKpUKCoUClpaWcHJygpOTE+RyeZH7nTVrFj755BMMGTIEtWvXhr+/Pz7//HMsW7aswHUK+u5e2Pf2gIAAbNmyBfv374dWq8WlS5ewePFiAEBcXBwAoFq1avj222+xefNmbNmyBfXr14efnx9+/fXXIo/jeRj9fdpy920VQhTZ3zV3mfzKl0WZnF8mCotHqVTqtc4RERER0YsheVJygcvkJvrJSEJoQoFlTWT67SjXx15/rriKI+d7rEKhKPY6mzZtwuLFi3HlyhUkJycjOzsbtra2emVcXV1hY2MjPa9WrRoSEgo+9uI4efIkYmNj9VrWNBoN0tPTkZqaCktLy3zXK2keMWLECFy9ehWBgYHIysqCra0txo4di+nTp0vJZf369VG/fn1pHS8vL9y6dQsLFixAhw4dnucwC2W0LW1OTk4A8rZiJSQkSFmzk5MTMjMzkZiYWGiZe/fu5dn+/fv39crk3k9iYiKysrIKLZNTAXNn8URERET04rNSWBX4MDc1L3ZZCzOLYpUtibp160Imk+H8+fP5Lr9w4QLs7e2lofVlMlmerpJZWVnS9LFjxzBw4EB07doVO3fuxF9//YUpU6bkGW3dzMxM77lMJoNWqy1R7LlptVqEhYXh1KlT0uPvv//G5cuX83RnzFHQd/fCvrfLZDLMnTsXycnJuHHjBuLj4/HKK68A0CWjBWnbti0uX75c8gMrAaNN2tzc3ODk5IR9+/ZJ8zIzM3Ho0CF4e3sDAFq2bAkzMzO9MnFxcTh79qxUxsvLC2q1GidOnJDKHD9+HGq1Wq/M2bNnpWZPAIiJiYFSqUTLli2lMr/++qtexYyJiYGzs3OhL2JFoTVT4M9p8/HntPnQmhX/FxeiikIhV2BJ1yVY0nUJFHLWcSIierFVqVIF/v7++Prrr5GWlqa3LD4+HmvXrsXQoUOlefb29nrfhS9fvozU1FTp+e+//w4XFxdMmTIFrVq1gru7e57rvIpDoVDojfJeHC1atMDFixdRt27dPA8Tk/zTGS8vL70cAdB9d8/5/l8YuVyO6tWrQ6FQYN26dfDy8sr3cqscf/31F6pVq1aiYyopg3aPTE5OxpUrV6Tn165dw6lTp2BnZ4datWohJCQEs2fPhru7O9zd3TF79mxYWloiKCgIgK5f7PDhwzFhwgRUqVIFdnZ2CA0NRePGjdGpUycAuv66Xbp0wYgRI6R+ryNHjkRgYKDUtNm5c2d4eHggODgY8+fPx6NHjxAaGooRI0ZITb5BQUEICwvD0KFDMXnyZFy+fBmzZ8/G1KlTy3R4UkMRZma4GjzC0GEQlRszuRk+eOUDQ4dBRET0n1myZAm8vb0REBCAmTNnws3NDefOncNHH32EevXqYerUqVLZ1157DUuWLEHbtm2h1WoxceJEvVazunXr4ubNm4iKikLr1q0RHR1drPue5ebq6orjx4/j+vXrsLa2hp2dXZHrTJ06FYGBgahZsyb69esHExMTnDlzBn///TdmzpyZ7zpjx45Fhw4dMHfuXPTq1Qs//fQTfv75Zxw+fFjv/GzdulW65u7BgwfYtGkTfH19kZ6ejpUrV2Ljxo04dOiQtM7ixYvh6uqKRo0aITMzE2vWrMHmzZuxefPmEp+LkjBoS9sff/yB5s2bo3nz5gCA8ePHo3nz5lIF+vjjjxESEoJRo0ahVatWuHPnDmJiYvT6yS5atAivv/46+vfvj3bt2sHS0hI7duzQu6hx7dq1aNy4MTp37ozOnTujSZMmWL16tbRcLpcjOjoa5ubmaNeuHfr374/XX38dCxYskMqoVCrs27cPt2/fRqtWrTBq1CiMHz8e48ePL+/TRERERERUYu7u7oiNjUXt2rXRv39/uLi4oGvXrqhXrx5+//13WFs/HZFy4cKFqFmzJjp06ICgoCCEhobqXSvWq1cvjBs3DqNHj0azZs1w5MgRfPbZZyWOKTQ0FHK5HB4eHrC3t8fNmzeLXCcgIAA7d+7Evn370Lp1a7Rt2xYRERFwcXEpcB1vb29ERUVh5cqVaNKkCSIjI7F+/Xq9EeUfPHiAq1ev6q23atUqtGrVCu3atcO5c+fwyy+/SF0kAV3Pv9DQUDRp0gTt27fH4cOHER0djT59+pT4XJSETJRknE96bklJSVCpVFCr1Xku3DSEjVfVugmNBvaxuiFQ77f2Booxkk9R+tUp27vaEz0PjVaD327+BgBoX6t9ngvEiYiI8pOeno5r167Bzc2twOunKpJp06YhIiICMTEx8PLyMnQ4L4XC6lBxcwOjHz2S/hvyjHT4vtUDALDlzB1oLEt2sSuRsUvPTkfHVR0B6Eb7KukF3URERC+CsLAwqYtimzZtCrwmjIwLkzYiIiIiopfIsGHDDB0ClRBTayIiIiIiIiPGpI2IiIiIiMiIMWkjIiIiIioCx+6j0iqLusOkjYiIiIioADn3Knv2RtNEJZFTd569711JcSASIiIiIqICyOVyVKpUCQkJCQAAS0tLyGQyA0dFFYEQAqmpqUhISEClSpX07iNdUkzaCACgNTXD6YkzpGmiF42Z3AzzOs2TpomIiIrLyckJAKTEjagkKlWqJNWh0uLNtf9jRntz7XLAm2sTERHRi0Sj0SArK8vQYVAFYmZmVmgLG2+uTURERERUhuRy+XN1cSMqLSZtpKPRoPK50wCAxEZNAX4g0QtGo9Xgz7g/AQAtqrWA3IR1nIiIiCoGJm0EAJBnpKNTn9cAAFvO3IHG0srAERGVrfTsdLyy/BUAQPKkZFgpWMeJiIioYuCQ/0REREREREaMSRsREREREZERY9JGRERERERkxJi0ERERERERGTEmbUREREREREaMSRsREREREZER45D/BADQmprh3IcTpWmiF42Z3AzTfKZJ00REREQVhUwIIQwdxMskKSkJKpUKarUatra2hg4HG6+qy23b/eqoym3bREREREQVXXFzA3aPJCIiIiIiMmLsHkk6Wi1sr1wEACTVrQ+YMJ+nF4tWaPHP/X8AAA3tG8JExjpOREREFQOTNgIAyNPTENDNCwCw5cwdaCytDBwRUdlKy0qD5zeeAIDkScmwUrCOExERUcXAn5qJiIiIiIiMGJM2IiIiIiIiI8akjYiIiIiIyIgxaSMiIiIiIjJiTNqIiIiIiIiMGEePpHJTnjfuBnjzbiIiIiJ6OTBpIwCA1tQMF9/5UJometGYyc0Q6hUqTRMRERFVFDIhhDB0EC+TpKQkqFQqqNVq2NraGjqccm8NK09saSMiIiKiiqy4uQGvaSMiIiIiIjJi7B5JOlotLO/eAgCkOtcETJjP04tFK7S4qb4JAKilqgUTGes4ERERVQxM2ggAIE9PQ3ffpgCALWfuQGNpZeCIiMpWWlYa3L5wAwAkT0qGlYJ1nIiIiCoG/tRMRERERERkxJi0ERERERERGTEmbUREREREREaMSRsREREREZERY9JGRERERERkxJi0ERERERERGTEO+U8AACE3xZVB70jTRC8aUxNTjGo1SpomIiIiqij4zYUAAFqlEn+FLTB0GETlRmmqxFfdvzJ0GEREREQlxu6RRERERERERowtbaQjBBSPHgIAMu2qADKZgQMiKltCCDxIfQAAqGpZFTLWcSIiIqogmLQRAECelopebeoCALacuQONpZWBIyIqW6lZqXBY4AAASJ6UDCsF6zgRERFVDOweSUREREREZMSYtBERERERERkxJm1ERERERERGjEkbERERERGREWPSRkREREREZMSYtBERERERERkxDvlPAAAhN8X1Pm9K00QvGlMTUwxpOkSaJiIiIqoo+M2FAABapRKx874xdBhE5UZpqkTk65GGDoOIiIioxNg9koiIiIiIyIixpY10hIA8LRUAoLGwBGQyAwdEVLaEEEjN0tVxSzNLyFjHiYiIqIJgSxsBAORpqejTpDr6NKkuJW9EL5LUrFRYh1vDOtxaSt6IiIiIKgImbUREREREREaMSRsREREREZERY9JGRERERERkxJi0ERERERERGTEmbUREREREREaMSRsREREREZER433aCAAg5HLc6tJLmiZ60chN5HjD4w1pmoiIiKiiYNJGAACt0hzHlqwydBhE5cbc1Bwb+200dBhEREREJcbukUREREREREaMSRsREREREZERY9JGAAB5agr61a2EfnUrQZ6aYuhwiMpcSmYKZGEyyMJkSMlkHSciIqKKg0kbERERERGREWPSRkREREREZMSYtBERERERERkxJm1ERERERERGjEkbERERERGREWPSRkREREREZMSMOmnLzs7Gp59+Cjc3N1hYWKB27dqYMWMGtFqtVEYIgenTp8PZ2RkWFhbw9fXFuXPn9LaTkZGBDz/8EFWrVoWVlRV69uyJ27dv65VJTExEcHAwVCoVVCoVgoOD8fjxY70yN2/eRI8ePWBlZYWqVatizJgxyMzMLLfj/y8JuRxxvp0R59sZQi43dDhEZU5uIkc3927o5t4NchPWcSIiIqo4TA0dQGHmzp2LpUuXYtWqVWjUqBH++OMPDBs2DCqVCmPHjgUAzJs3DxEREYiMjES9evUwc+ZM+Pv74+LFi7CxsQEAhISEYMeOHYiKikKVKlUwYcIEBAYG4uTJk5D/f4ISFBSE27dvY8+ePQCAkSNHIjg4GDt27AAAaDQadO/eHfb29jh8+DAePnyIIUOGQAiBL7/80gBnp2xpleY4vHyDocMgKjfmpuaIDoo2dBhEREREJSYTQghDB1GQwMBAODo6YsWKFdK8vn37wtLSEqtXr4YQAs7OzggJCcHEiRMB6FrVHB0dMXfuXLz77rtQq9Wwt7fH6tWrMWDAAADA3bt3UbNmTezatQsBAQH4559/4OHhgWPHjqFNmzYAgGPHjsHLywsXLlxA/fr1sXv3bgQGBuLWrVtwdnYGAERFRWHo0KFISEiAra1tsY4pKSkJKpUKarW62OuUp41X1YYOodT61VEZOgQiIiIiolIrbm5g1N0jX331Vezfvx+XLl0CAJw+fRqHDx9Gt27dAADXrl1DfHw8OnfuLK2jVCrh4+ODI0eOAABOnjyJrKwsvTLOzs7w9PSUyhw9ehQqlUpK2ACgbdu2UKlUemU8PT2lhA0AAgICkJGRgZMnTxZ4DBkZGUhKStJ7EBERERERFZdRd4+cOHEi1Go1GjRoALlcDo1Gg1mzZuHNN98EAMTHxwMAHB0d9dZzdHTEjRs3pDIKhQKVK1fOUyZn/fj4eDg4OOTZv4ODg16Z3PupXLkyFAqFVCY/4eHhCAsLK8lhG4Q8NQU927gDALYfvwyNpZWBIyIqWymZKXBYoHufJ4QmwErBOk5EREQVg1G3tK1fvx5r1qzBjz/+iD///BOrVq3CggULsGrVKr1yMplM77kQIs+83HKXya98acrkNmnSJKjVaulx69atQuMyJNO0VJimpRo6DKJyk5qVitQs1nEiIiKqWIy6pe2jjz7CJ598goEDBwIAGjdujBs3biA8PBxDhgyBk5MTAF0rWLVq1aT1EhISpFYxJycnZGZmIjExUa+1LSEhAd7e3lKZe/fu5dn//fv39bZz/PhxveWJiYnIysrK0wL3LKVSCaVSWZrDJyIiIiIiMu6WttTUVJiY6Icol8ulIf/d3Nzg5OSEffv2ScszMzNx6NAhKSFr2bIlzMzM9MrExcXh7NmzUhkvLy+o1WqcOHFCKnP8+HGo1Wq9MmfPnkVcXJxUJiYmBkqlEi1btizjIyciIiIiItIx6pa2Hj16YNasWahVqxYaNWqEv/76CxEREXj77bcB6LorhoSEYPbs2XB3d4e7uztmz54NS0tLBAUFAQBUKhWGDx+OCRMmoEqVKrCzs0NoaCgaN26MTp06AQAaNmyILl26YMSIEVi2bBkA3ZD/gYGBqF+/PgCgc+fO8PDwQHBwMObPn49Hjx4hNDQUI0aMMIpRIImIiIiI6MVk1Enbl19+ic8++wyjRo1CQkICnJ2d8e6772Lq1KlSmY8//hhpaWkYNWoUEhMT0aZNG8TExEj3aAOARYsWwdTUFP3790daWhr8/PwQGRkp3aMNANauXYsxY8ZIo0z27NkTS5YskZbL5XJER0dj1KhRaNeuHSwsLBAUFIQFCxb8B2eCiIiIiIheVkZ9n7YXkbHep02emoI+TaoDALacuVMhRo/kfdqoJFIyU2Adbg0ASJ6UzNEjiYiIyOCKmxsYdUsb/XeEiQkSXmknTRO9aExkJvBx8ZGmiYiIiCoKJm0EANCaW+DQj9GGDoOo3FiYWeCXob8YOgwiIiKiEuPPzUREREREREaMSRsREREREZERY9JGAHQDkfRsXQc9W9eBPDXF0OEQlbmUzBTYz7eH/Xx7pGSyjhMREVHFwWvaSKJMfGjoEIjK1YPUB4YOgYiIiKjE2NJGRERERERkxJi0ERERERERGTEmbUREREREREaMSRsREREREZERY9JGRERERERkxDh6JAEAhIkJHjVuLk0TvWhMZCZo5dxKmiYiIiKqKJi0EQBAa26B/VsPGjoMonJjYWaB2BGxhg6DiIiIqMT4czMREREREZERY9JGRERERERkxJi0EQBAnpaKbj6N0c2nMeRpqYYOh6jMpWalwnWxK1wXuyI1i3WciIiIKg5e00Y6QsDqzi1pmuhFI4TADfUNaZqIiIioomBLGxERERERkRFj0kZERERERGTEmLQREREREREZMV7TRhXWxqvqctt2vzqqcts2EREREVFJsKWNiIiIiIjIiLGljXRkMqjrNpCmiV40MpkMHvYe0jQRERFRRcGkjQAAGgtLxOw5ZugwiMqNpZklzo06Z+gwiIiIiEqM3SOJiIiIiIiMGJM2IiIiIiIiI8akjQAA8rRUdO7SFp27tIU8LdXQ4RCVudSsVDT6uhEafd0IqVms40RERFRx8Jo20hECqisXpGmiF40QAufvn5emiYiIiCoKtrQREREREREZMSZtRERERERERoxJGxERERERkRFj0kZERERERGTEmLQREREREREZMY4eSToyGVKq15SmiV40MpkMLioXaZqIiIioomDSRgAAjYUldh3629BhEJUbSzNLXA+5bugwiIiIiEqM3SOJiIiIiIiMGJM2IiIiIiIiI8akjQAAJulp8OvdEX69O8IkPc3Q4RCVubSsNLT+rjVaf9caaVms40RERFRx8Jo2AgDItFrY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xOzfZgMAJrefDIWcdZyIiIgMq7i5QakGIklKSsK9e/fyzE9ISMCTJ09Ks0kyMJPsLDT6ci4afTkXJtlZhg6HqMxlabIQdigMYYfCkKVhHSciIqKKo1RJW+/evTFs2DBs2rQJt2/fxu3bt7Fp0yYMHz4cffr0KesYiYiIiIiIXlqluqZt6dKlCA0NxVtvvYWsLN0v1qamphg+fDjmz59fpgESERERERG9zEqVtFlaWuLrr7/G/PnzcfXqVQghULduXVhZWZV1fERERERERC+157q5dlxcHOLi4lCvXj1YWVmhFGOaEBERERERUSFKlbQ9fPgQfn5+qFevHrp164a4uDgAwDvvvMPh/omIiIiIiMpQqZK2cePGwczMDDdv3oSlpaU0f8CAAdizZ0+ZBUdERERERPSyK9U1bTExMdi7dy9q1KihN9/d3R03btwok8Dov6VRmuPnLQekaaIXjbmpOU68c0KaJiIiIqooSpW0paSk6LWw5Xjw4AGUSuVzB0UGIJcjsUkLQ0dBVG7kJnK0rt7a0GEQERERlVipukd26NABP/zwg/RcJpNBq9Vi/vz56NixY5kFR0RERERE9LIrVUvb/Pnz4evriz/++AOZmZn4+OOPce7cOTx69Ai///57WcdI/wFZZibcVy0FAFwe8h6EQmHgiIjKVqYmE18c+wIAMLbtWCjkrONERERUMZQqafPw8MCZM2fwzTffQC6XIyUlBX369MEHH3yAatWqlXWM9B8wyc5C07lTAQBXBw2HhkkbvWCyNFn4+OePAQCjWo9i0kZEREQVRomTtqysLHTu3BnLli1DWFhYecRERERERERE/6/E17SZmZnh7NmzkMlk5REPERERERERPaNUA5EMHjwYK1asKOtYiIiIiIiIKJdSXdOWmZmJ5cuXY9++fWjVqhWsrKz0lkdERJRJcERERERERC+7EiVt//77L1xdXXH27Fm0aKG7p9elS5f0yrDbJBERERERUdkpUdLm7u6OuLg4HDx4EAAwYMAA/O9//4Ojo2O5BEdERERERPSyK1HSJoTQe757926kpKSUaUBkGBqlOX5Zs0OaJnrRmJua4+CQg9I0ERERUUVRqmvacuRO4qgCk8txv217Q0dBVG7kJnL4uvoaOgwiIiKiEivR6JEymSzPNWu8ho2IiIiIiKj8lLh75NChQ6FUKgEA6enpeO+9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QPsRAwAAW87cgYZJG71gMrIzELguEACQPCkZpgrWcSIiIqoY+K2FyAByWjjLA1vxiIiIiF4sRj16JBERERER0cuOSRsREREREZERY9JGRERERERkxJi0ERERERERGTEmbUREREREREaMo0cSAEBrpsCf0+ZL00QvGoVcgSVdl0jTRERERBUFkzYCAAgzM1wNHmHoMIjKjZncDB+88oGhwyAiIiIqMXaPJCIiIiIiMmJsaSMdjQb2sUcAAPdbewNyuYEDIipbGq0Gv938DQDQvlZ7yE1Yx4mIiKhiYNJGAAB5Rjp83+oBANhy5g40llYGjoiobKVnp6Pjqo4AgORJybBSsI4TERFRxcDukUREREREREaMSRsREREREZERY9JGRERERERkxJi0ERERERERGTEmbUREREREREaMSRsREREREZER45D/BADQmprh9MQZ0jTRi8ZMboZ5neZJ00REREQVBZM2AgAIhQKXRowxdBhE5UYhV+Cjdh8ZOgwiIiKiEmP3SCIiIiIiIiPGljbS0WhQ+dxpAEBio6aAXG7ggIjKlkarwZ9xfwIAWlRrAbkJ6zgRERFVDEzaCAAgz0hHpz6vAQC2nLkDjaWVgSMiKlvp2el4ZfkrAIDkScmwUrCOExERUcXA7pFERERERERGjEkbERERERGREWPSRkREREREZMSYtBERERERERkxJm1ERERERERGjEkbERERERGREeOQ/wQA0Jqa4dyHE6VpoheNmdwM03ymSdNEREREFYVMCCEMHcTLJCkpCSqVCmq1Gra2toYOBxuvqg0dApWxfnVUhg6BiIiIiIqhuLkBu0cSEREREREZMXaPJB2tFrZXLgIAkurWB0yYz9OLRSu0+Of+PwCAhvYNYSJjHSciIqKKgUkbAQDk6WkI6OYFANhy5g40llYGjoiobKVlpcHzG08AQPKkZFgpWMeJiIioYuBPzUREREREREaMSRsREREREZERY9JGRERERERkxJi0ERERERERGTEmbUREREREREaMSRsREREREZER45D/BADQmprh4jsfStNELxozuRlCvUKlaSIiIqKKQiaEEIYO4mWSlJQElUoFtVoNW1tbQ4eDjVfVhg6Byli/OipDh0BERERExVDc3IDdI4mIiIiIiIwYu0eSjlYLy7u3AACpzjUBE+bz9GLRCi1uqm8CAGqpasFExjpO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UJDCw8M1duxYHTx40Op/9913lZCQIJfLpebNm2vQoEEqKys75/sKAFciijYAwGXh6+urp556SgsXLtS333570evJzMzU5MmTdc899yg/P18rVqxQmzZtTju2vLxc/fv3V1BQkD7++GNt2rRJQUFBuvbaa1VVVXVe29u2bZvuu+8+zZkzR19++aVWrVqlvn37nvN1QUFBCgoK0vLly1VZWXle23rwwQdVXFxsPf70pz+pcePGSkpKkiTNmjVLWVlZyszM1M6dO3X//ffrjjvuUG5u7mnXd6pIzcrK8mjPyspSeHi4hg4dquPHj2vYsGFat26dduzYoSFDhmjkyJEqKio6r5hPp7i4WMnJyercubO2bdumVatW6fvvv9fNN99s9Y8ZM0bjx4/XF198oZycHN1www0yxlz0NgGgIfPzdgAAgCvHqFGj1LlzZ82ePVuvvPLKRa3jiSee0AMPPKBp06ZZbd27dz/t2KVLl8rHx0cvv/yyde9cVlaWmjRpopycHKWkpJxze0VFRQoMDNSIESMUHBysmJgYdenS5Zyv8/Pz02uvvaa7775bL7zwgrp27ark5GTdeuut6tSp02lfc6rQk6QtW7Zo1qxZWrJkiTp27KiysjLNnz9f69evV8+ePSVJcXFx2rRpk1588UUlJyefdp3jx4/XsGHDtHfvXsXFxckYo9dee01paWny9fVVYmKiEhMTrfFPPPGEsrOztWLFirOewTybzMxMde3aVU899ZTV9uqrryo6Olq7du3S8ePHVV1drRtuuEExMTGSTt5/BwA4Pc60AQAuq6efflpLlixRQUHBBb+2pKRE3333nQYOHHhe47dv366vvvpKwcHBVkHUrFkzVVRUaM+ePee1jsGDBysmJkZxcXEaO3as3nzzzdPeI3Y6N954o7777jutWLFCQ4YMUU5Ojrp27Wpd7ngmRUVFuv766/Xggw9aZ6cKCgpUUVGhwYMHW/sSFBSk119//az7kpKSopYtW1pn29avX6/CwkLdddddkqSysjL94Q9/UHx8vJo0aaKgoCD997///VVn2rZv364NGzZ4xNm+fXtJ0p49e5SYmKiBAwcqISFBo0eP1uLFi6+oex0B4EJRtAEALqu+fftqyJAhevTRR2v1+fj41LpE7qeffrKWXS7XBW3L7XarW7duysvL83js2rVLt91223ltMzg4WJ9++qneeustRUZG6rHHHlNiYqKOHDlyXjEEBARo8ODBeuyxx7R582alpaVp9uzZZxxfVlam6667Tj179tScOXM89kWSPvjgA499KSgoOOt9bT4+PkpLS9OSJUvkdruVlZWlvn37qm3btpKkhx56SO+9956efPJJbdy4UXl5eUpISDjj5aM+Pif/dPj5e/bz9+tUrCNHjqz1vu/evVt9+/aVr6+v1q5dq5UrVyo+Pl4LFy5Uu3bttG/fvnO8mwBwZaJoAwBcdnPnztX777+vzZs3e7SHhobqwIEDHgXBzye8CA4OVmxsrD766KPz2k7Xrl21e/duhYWFqU2bNh6PkJAQa5vFxcXWa2pqavT55597rMfPz0+DBg3SvHnz9Nlnn6mwsFDr16+/0N2WJMXHx59xwg1jjO644w653W799a9/9fg5hPj4eDmdThUVFdXal+jo6LNu86677tK3336rZcuWadmyZZowYYLVt3HjRqWlpWnUqFFKSEhQRESEx0QtvxQaGipJHu/Zz3MknXzfd+7cqdjY2FqxBgYGSjo5AUvv3r31+OOPa8eOHWrUqJGys7PPuh8AcKXinjYAwGWXkJCg22+/XQsXLvRo79evn3744QfNmzdPN910k1atWqWVK1fqqquussakp6dr0qRJCgsL09ChQ1VaWqpPPvlEU6dOrbWd22+/Xc8884xSU1M1Z84ctWzZUkVFRVq2bJkeeughtWzZUgMGDNCMGTP0wQcfqHXr1nr22Wc9zqL94x//0N69e9W3b181bdpUH374odxut9q1a3fWfTx06JBGjx6t8ePHq1OnTgoODta2bds0b948paamnvY16enpWrdundasWaPjx4/r+PHjkqSQkBAFBwfrwQcf1P333y+3260+ffro2LFj2rx5s4KCgjRu3LgzxtKqVSsNGDBA99xzj/z9/T1mv2zTpo2WLVumkSNHyuFw6I9//KN1Vu90XC6XevTooblz5yo2NlYHDx7UrFmzPMZMnjxZixcv1pgxY/TQQw+pRYsW+uqrr7R06VItXrxY27Zt00cffaSUlBSFhYXpX//6l3744Qddc801Z31PAeCKZQAAqGPjxo0zqampHm2FhYXG6XSaX34VZWZmmujoaBMYGGjuvPNO8+STT5qYmBiPMS+88IJp166d8ff3N5GRkWbq1KlWnySTnZ1tPS8uLjZ33nmnadGihXE6nSYuLs7cfffd5ujRo8YYY6qqqsy9995rmjVrZsLCwkxGRoZJTU0148aNM8YYs3HjRpOcnGyaNm1qXC6X6dSpk3n77bfPuc8VFRXmkUceMV27djUhISGmcePGpl27dmbWrFmmvLz8tPEmJycbSbUeWVlZxhhj3G63ee6556x9Dw0NNUOGDDG5ubnnjOdvf/ubkWTuuecej/Z9+/aZ/v37G5fLZaKjo83zzz9vkpOTzbRp06wxMTEx5tlnn7WeFxQUmB49ehiXy2U6d+5s1qxZYySZDRs2WGN27dplRo0aZZo0aWJcLpdp3769mT59unG73aagoMAMGTLEhIaGGqfTaX7zm9+YhQsXnnMfAOBK5TCG+XUBAAAAwK64pw0AAAAAbIyiDQCAi1BUVOQxpf0vH79mynwAAH6OyyMBALgI1dXVZ51lMTY2Vn5+zPcFAPj1KNoAAAAAwMa4PBIAAAAAbIyiDQAAAABsjKINAAAAAGyMog0AAAAAbIyiDQAAAABsjKINAAAAAGyMog0AAAAAbOz/AU3o+iGropfUAAAAAElFTkSuQmCC",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The plot is saved at: /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/Nucleus_Size_Distribution.png\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Plot the distribution of the Nucleus_Size column\n",
+ "fig, ax = plt.subplots(figsize=(10, 6))\n",
+ "ax.hist(df['Nucleus_Size'], bins=30, alpha=0.7, color='skyblue')\n",
+ "\n",
+ "# Add horizontal bars for the 0.05 and 0.95 quantiles\n",
+ "quantile_05 = df['Nucleus_Size'].quantile(0.05)\n",
+ "quantile_95 = df['Nucleus_Size'].quantile(0.95)\n",
+ "ax.axvline(x=quantile_05, color='r', linestyle='--', label='Quantile 0.05')\n",
+ "ax.axvline(x=quantile_95, color='g', linestyle='--', label='Quantile 0.95')\n",
+ "\n",
+ "# Add titles and labels\n",
+ "ax.set_title('Distribution of Nucleus_Size column values with horizontal bars at 0.05 and 0.95 quantiles')\n",
+ "ax.set_xlabel('Nucleus_Size Values')\n",
+ "ax.set_ylabel('Frequency')\n",
+ "ax.legend()\n",
+ "\n",
+ "# Display quantiles values\n",
+ "ax.text(quantile_05, ax.get_ylim()[1], f' 5th Quantile: {quantile_05:.2f}', color='r', verticalalignment='top')\n",
+ "ax.text(quantile_95, ax.get_ylim()[1], f' 95th Quantile: {quantile_95:.2f}', color='g', verticalalignment='top')\n",
+ "\n",
+ "# Display the plot\n",
+ "plt.show()\n",
+ "\n",
+ "# Save the plot in the output_images_dir directory using fig.savefig\n",
+ "plot_file_path = os.path.join(output_images_dir, \"Nucleus_Size_Distribution.png\")\n",
+ "fig.savefig(plot_file_path)\n",
+ "print(f\"The plot is saved at: {plot_file_path}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "fe562d2b-5026-4a88-8117-4ec910dd1242",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.05 1019.689148\n",
+ "0.50 1346.929932\n",
+ "0.95 2622.449524\n",
+ "Name: AF555_Cell_Intensity_Average, dtype: float64\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(df[\"AF555_Cell_Intensity_Average\"].quantile(q=qs))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "id": "8b53dced-802d-4bfd-8e37-de33ffec9c7a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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ItIrTFSJiIiIiIhIrzBRJSIiIiIiIr1SqrenIf0g5IaI6fme9FxXDA0MMajeIOk5ERERERGRNpg9ELKUSkTNXqLzcpWGSoR2D9V5uURERERE9GZj118iIiIiIiLSK2xRJUAIyF88BwCoTUwBmUxHxQo8z8gu19TIFDIdlUtERERERG82tqgS5C+eo2fdiuhZt6KUsOrC84znMJ9hDvMZ5lLCSkREREREVBQmqkRERERERKRXmKgSERERERGRXmGiSkRERERERHqFiSoRERERERHpFSaqREREREREpFeYqBIREREREZFe4X1UCUIux+323aTnuiI3kKOXay/pORERERERkTaYqBKylMaIXLRC5+UaGxpjU+9NOi+XiIiIiIjebOz6S0RERERERHqFiSoRERERERHpFSaqBPnzFPSuXga9q5eB/HmKzspNSU+BbIoMsikypKTrrlwiIiIiInqzMVElIiIiIiIivcJElYiIiIiIiPQKE1UiIiIiIiLSK0xUiYiIiIiISK8wUSUiIiIiIiK9wkSViIiIiIiI9IphaVeASp+QyxHX2kd6rityAzk61ugoPSciIiIiItIGE1VCltIYx3/eqPNyjQ2Nsctvl87LJSIiIiKiNxu7/hIREREREZFeYaJKREREREREeoWJKkH+PAU96tijRx17yJ+n6KzclPQUmE03g9l0M6Sk665cIiIiIiJ6s/EaVQIAGL54/lrKfZ7xesolIiIiIqI3F1tUiYiIiIiISK8wUSUiIiIiIiK9wkSViIiIiIiI9AoTVSIiIiIiItIrTFSJiIiIiIhIr3DUX4IwMEBCkxbSc10xkBnA09FTek5ERERERKQNJqqELGMTHFm7S+flmhiZ4HDAYZ2XS0REREREbzY2cxEREREREZFeYaJKREREREREeoWJKkH+PAVdG1dD18bVIH+eorNyU9JTUGFOBVSYUwEp6borl4iIiIiI3mylmqguWbIEdevWhaWlJSwtLeHh4YHdu3dL84UQmDx5Muzt7WFiYoLWrVvj4sWLGmWkpaXh448/Rvny5WFmZoauXbvizp07GjGJiYnw9/eHSqWCSqWCv78/njx5ohETGxuLLl26wMzMDOXLl8eoUaOQnp6uEXPhwgV4enrCxMQEFStWxDfffAMhhG53SilRJj6CMvGRzst9+PwhHj5/qPNyiYiIiIjozVWq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iYiIiIj+6/QtN9AnJer626pVK6xcuVJ6LZPJkJWVhTlz5qBNmzY6qxwRERERERG9fUrU9XfOnDlo3bo1fv/9d6Snp+PTTz/FxYsX8fjxY5w4cULXdaTXTJaejhorfgQAXB/0IYRCoZNy09XpWBC5AAAwutloKOS6KZeIiIiIiN5sJer6C2TfMmbJkiU4c+YMsrKy0LBhQ4wYMQJ2dna6ruMbRd+a9zfdSIL8eQp61q0IANh6/i7UpiW/H+7LOjoYwnyGOQDg2YRnMFPoplwiIiIiojeBvuUG+qTYLaoZGRnw8fHB0qVLMWXKlNdRJyIiIiIiInqLFfsaVSMjI0RHR/N2LERERERERPRalGgwpYEDB2L58uW6rgsRERERERFRyQZTSk9Px88//4x9+/bB3d0dZmaa1x4GBwfrpHJERERERET09ilWovr333/DyckJ0dHRaNiwIQDg2rVrGjHsEkxERERERESvoliJao0aNRAXF4dDhw4BAPr27Yvvv/8eNjY2r6VyRERERERE9PYpVqKa+042u3fvRkpKik4rRP8+tdIYh1fvkJ7rirGhMQ4NOiQ9JyIiIiIi0kaJrlHNUcJbsJK+kcvxoFlL3RdrIEdrp9Y6L5eIiIiIiN5sxRr1VyaT5bkGldekEhERERERkS4Vu+tvQEAAlEolACA1NRUffvhhnlF/t27dqrsa0msny8hA1fWhAIC/+wVAGBnppNwMdQaWnVkGAPig0QcwkuumXCIiIiIierMVK1EdNGiQxusBAwbotDJUOgwy0tFwyicAgJh3/aDWUaKark7HyN0jAQAB9QOYqBIRERERkVaKlaiGhIS8rnoQERERERERASjmNapERERERERErxsTVSIiIiIiItIrTFSJiIiIiIhIrzBRJSIiIiIiIr3CRJWIiIiIiIj0SrFG/aU3U5ZCiWM/bZCe64rSUImd7+2UnhMREREREWmDiSpBGBoivo2vzss1NDBEJ+dOOi+XiIiIiIjebOz6S0RERERERHqFLaoEWUYGKv+6EQAQ27UPhJGRTsrNUGdgzYU1AID+dfrDSK6bcomIiIiI6M3GRJVgkJGOJp+NAADc6dAdah0lqunqdAzePhgA0Nu1NxNVIiIiIiLSCrv+EhERERERkV5hokpERERERER6hYkqERERERER6RUmqkRERERERKRXmKgSERERERGR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sdvtNTqORx55RHv37tWmTZs0cuRItW3bVpdddpnGjBmjzMxMNWrUSJJUWlqqBx98UM2bN1dAQIC6dOmi1atX1+g9fqlRo0bppptu0qxZsxQeHq6mTZvqvvvuU1lZmSTp+uuv1759+/TAAw9YM8inrF+/Xtddd52cTqciIyM1YcIEFRUVWe1RUVGaMWOG7rzzTjVu3FgXXnih3njjDau9tLRU48aNU3h4uBo0aKCoqCjNnDnTav/5qb+tWrWSJF155ZWy2Wy6/vrr9dVXX8nPz085OTluxzR58mRdd911Nf4M5s+fr2HDhikpKUlvvfWWNbP9+uuvq3nz5qqsrHSLHzBggEaOHGk9/+STTxQTE6MGDRrooosu0hNPPKHy8nK343jttdc0cOBABQQE6KmnnlJFRYVGjx6tVq1ayel0qnXr1vrLX/7i9j7l5eWaMGGCmjRpoqZNm+qhhx7SyJEjddNNN1kxxhg999xzuuiii+R0OtWxY0f9/e9/P+OxJiUlqaSkRB9++KHb/v379+vLL7/U6NGjtXv3bg0cOFChoaFq1KiROnfurJUrV54xZ3Wz3UePHpXNZnMbtzt27NCNN96oRo0aKTQ0VElJSTpy5IjV/ve//13t27eX0+lU06ZN1atXL7fxBACoikIVAOrQ+++/r9atW6t169YaMWKEkpOTf9VpsuPGjVNwcLA6d+6s1157rUoBIp0sQkJCQtS9e/cz/sF/5ZVXKjw8XD179tSqVatq9N6VlZVavHixhg8froiIiCrtjRo1kq/vyRN47rjjDv3zn//U4sWLtXXrVg0ePFh9+vTRd9999wuOtuZWrVql3bt3a9WqVXr77be1YMEC68eApUuXqkWLFpo+fbqys7OVnZ0tScrKylJCQoIGDRqkrVu36v3339e6des0btw4t9wvvPCCOnXqpIyMDI0dO1b33nuvdar0Sy+9pI8//lgffPCBdu3apXfffVdRUVHV9nHz5s2STs54Z2dna+nSpbruuut00UUXaeHChVZceXm53n33Xd1xxx01OvZjx47pww8/1IgRI9S7d28VFRVZxdXgwYN15MgRt+84Ly9Pn3/+uYYPHy5J+vzzzzVixAhNmDBBO3bs0Ouvv64FCxbo6aefdnufadOmaeDAgcrKytKdd96pyspKtWjRQh988IF27Nihxx57TI888og++OAD6zXPPvusFi1apOTkZP3zn/9UQUFBlWt2//SnPyk5OVmvvvqqtm/frgceeEAjRozQmjVrqj3epk2bauDAgUpOTnbbn5ycrNDQUPXt21eFhYW68cYbtXLlSmVkZCghIUH9+/fX/v37a/SZVic7O1txcXG64oor9PXXX2vFihU6dOiQhgwZYrXffvvtuvPOO7Vz506tXr1agwYN+k1OhweA3zUDAKgz3bp1M3PmzDHGGFNWVmaCg4NNamqq1b5nzx4jyTidThMQEGA9tmzZYsU8+eSTZv369SYjI8PMmjXLNGzY0Dz55JNW++HDh83s2bPNpk2bTFpamvnzn/9sfHx8zMKFC62Yb775xrzxxhsmPT3drF+/3tx7773GZrOZNWvWnPMYDh06ZCSZ2bNnnzXu+++/NzabzRw8eNBtf8+ePc3UqVONMcYkJycbl8tltU2bNs107NjxnH2oLnbkyJGmZcuWpry83No3ePBgM3ToUOt5y5YtzYsvvuiWJykpydx9991u+9auXWt8fHxMcXGx9boRI0ZY7ZWVlSYkJMS8+uqrxhhjxo8fb2644QZTWVlZbV8lmWXLlhlj/u87zsjIcIt59tlnTZs2baznH330kWnUqJEpLCw8+wfxv9544w1zxRVXWM/vv/9+M3z4cOv5gAEDzJ133mk9f/31101YWJj1eV177bVmxowZbjkXLlxowsPD3Y5j4sSJ5+zL2LFjzS233GI9Dw0NNc8//7z1vLy83Fx44YVm4MCBxhhjCgsLTYMGDcz69evd8owePdrcfvvtZ3yfzz77zNhsNrN7925jzMnvJSoqyhpf1Wnbtq15+eWXrec/HxPVfTd5eXlGklm1apUxxpg///nPJj4+3i3ngQMHjCSza9cuk56ebiSZvXv3nrEPAICquEYVAOrIrl27tHnzZi1dulSS5Ovrq6FDh+qtt95Sr1693GLff/99tWnTxnoeGRlpbf/pT3+ytk8tJjR9+nRrf3BwsB544AErplOnTsrLy9Nzzz1nLcp0alb3lNjYWB04cECzZs0656mm5n9nhn5+6mx1tmzZImOMLrvsMrf9JSUlatq06Vlf+2u1a9fO7fTl8PBwZWVlnfU16enp+v7777Vo0SJrnzFGlZWV2rNnj/U9dOjQwWq32WwKCwtTbm6upJOnHffu3VutW7dWnz59lJiYqPj4+F/U91GjRulPf/qTNm7cqK5du+qtt97SkCFDFBAQUKPXz58/323RrREjRui6667T0aNH1aRJEw0fPlx33323XnnlFTkcDi1atEi33Xab9Xmlp6crLS3NbQa1oqJCJ06c0PHjx63rQDt16lTlvV977TW9+eab2rdvn4qLi1VaWmqNzfz8fB06dEhXX321FW+32xUTE2OdCbBjxw6dOHFCvXv3dstbWlqqK6+88ozHHB8frxYtWig5OVlPPvmkvvzyS+3du9eahS4qKtITTzyhf/zjH/rxxx9VXl6u4uLi/2pGNT09XatWrbJOb/+53bt3Kz4+Xj179lT79u2VkJCg+Ph43XrrrQoKCvrV7wkA5wMKVQCoI/Pnz1d5ebmaN29u7TPGyM/PT3l5eW5/yEZGRuqSSy6pUd6uXbuqoKBAhw4dOuPiMV27dtWbb755zjzvvvvuOd+vWbNmCgoK0s6dO88aV1lZKbvdrvT09CrXvlb3R74nnL6wj81mq/a06J+rrKzUPffcowkTJlRp+/lCV2fLfdVVV2nPnj367LPPtHLlSg0ZMkS9evU66zWWpwsJCVH//v2VnJysiy66SJ9++mmNr+fdsWOHNm3apLS0ND300EPW/oqKCr333nu699571b9/f1VWVmr58uXq3Lmz1q5dq9mzZ7t9Dk888YQGDRpUJX+DBg2s7dML5w8++EAPPPCAXnjhBcXGxqpx48Z6/vnntWnTJre403/YMD87FfbU57h8+XK3/z4kyeFwnPG4fXx8NGrUKC1YsEBPPPGEkpOTdd111+nSSy+VJP3xj3/U559/rlmzZumSSy6R0+nUrbfeqtLS0jPmO71vp65x/nlf+/fvr2effbbK68PDw2W325Wamqr169crJSVFL7/8sh599FFt2rTJuj4ZAFAVhSoA1IHy8nK98847euGFF6rMtN1yyy1atGhRlWsiayojI0MNGjQ46yq7GRkZCg8PP2eec8VIJ/+YHzp0qBYuXKhp06ZVuU61qKhIDodDV155pSoqKpSbm6trr722RsdS2/z9/VVRUeG276qrrtL27dtr/MPAmQQGBmro0KEaOnSobr31VvXp00f/+c9/qqy2fGpRq9P7IUl33XWXbrvtNrVo0UIXX3yxunfvXqP3nj9/vq677jr99a9/ddu/cOFCzZ8/X/fee6+cTqcGDRqkRYsW6fvvv9dll12mmJgYK/aqq67Srl27fvHnsHbtWnXr1k1jx4619u3evdvadrlcCg0N1ebNm61xUFFRoYyMDGvWtW3btnI4HNq/f7/i4uJ+0fvfcccdeuqpp7R06VItXbrU7VZNa9eu1ahRo3TzzTdLkgoLC7V3794z5jq16nV2drY1k3v6bYSuuuoqLVmyRFFRUda12Kez2Wzq3r27unfvrscee0wtW7bUsmXLNGnSpF90bABwPqFQBYA68I9//EN5eXkaPXp0lRV8b731Vs2fP79Gheonn3yinJwcxcbGyul0atWqVXr00Ud19913WzNPb7/9tvz8/HTllVfKx8dHn3zyiV566SW3GaA5c+YoKipK7dq1U2lpqd59910tWbJES5YsqdHxzJgxQ6tXr1aXLl309NNPq1OnTvLz89PatWs1c+ZMpaWl6bLLLtPw4cP1//7f/9MLL7ygK6+8UkeOHNGXX36p9u3b68Ybb/wFn6BnREVF6auvvtJtt90mh8Oh4OBgPfTQQ+ratavuu+8+jRkzRgEBAdq5c6dSU1P18ssv1yjviy++qPDwcF1xxRXy8fHRhx9+qLCwsGp/PAgJCZHT6dSKFSvUokULNWjQwBoTCQkJcrlceuqppzR9+vQavXdZWZkWLlyo6dOnKzo62q3trrvu0nPPPad//etf6tixo4YPH67+/ftr+/btbqcJS9Jjjz2mxMRERUZGavDgwfLx8dHWrVuVlZWlp5566ozvf8kll+idd97R559/rlatWmnhwoVKS0tzmz0cP368Zs6cqUsuuUSXX365Xn75ZeXl5VmzrI0bN9aUKVP0wAMPqLKyUtdcc40KCgq0fv16NWrUyG1l4tO1atVKN9xwg+6++275+fnp1ltvdevb0qVL1b9/f9lsNv35z38+6wy70+lU165d9cwzzygqKkpHjhxxO9Veku677z7NmzdPt99+u/74xz8qODhY33//vRYvXqx58+bp66+/1hdffKH4+HiFhIRo06ZNOnz4sNup/ACAatTlBbIAcL5KTEw0N954Y7VtpxZfSU9PP+NCO6d89tln5oorrjCNGjUyDRs2NNHR0WbOnDmmrKzMilmwYIFp06aNadiwoWncuLGJiYlxW0jJmJML91x88cWmQYMGJigoyFxzzTVm+fLlv+iYjh49ah5++GFz6aWXGn9/fxMaGmp69eplli1bZi0qVFpaah577DETFRVl/Pz8TFhYmLn55pvN1q1bjTGeX0zp1OI8p9x///0mLi7Oer5hwwbToUMH43A4zM//l7h582bTu3dv06hRIxMQEGA6dOhgnn76aau9ukWYOnbsaKZNm2aM+b+FjAICAkxgYKDp2bOn2wJY+tliSsYYM2/ePBMZGWl8fHzc+mfMycV67Ha7+fHHH2v0Ofz97383Pj4+Jicnp9r29u3bm/HjxxtjTi5iFB4ebiRZCxD93IoVK0y3bt2M0+k0gYGB5uqrrzZvvPHGGY/DGGNOnDhhRo0aZVwul2nSpIm59957zcMPP+z23ZSVlZlx48aZwMBAExQUZB566CEzePBgc9ttt1kxlZWV5i9/+Ytp3bq18fPzM82aNTMJCQk1WuDrb3/7m5FUZVGsPXv2mB49ehin02kiIyPN3LlzTVxcnLn//vutmNO/2x07dpiuXbsap9NprrjiCpOSkuK2mJIxxnz77bfm5ptvNk2aNDFOp9NcfvnlZuLEiaaystLs2LHDJCQkmGbNmhmHw2Euu+wyt8WbAADVsxnD+ugAAHirMWPG6NChQ/r444/ruiu1prKyUm3atNGQIUP05JNP1nV3AABegFN/AQDwQvn5+UpLS9OiRYv0P//zP3XdHY/at2+fUlJSFBcXp5KSEs2dO1d79uzRsGHD6rprAAAv4VPXHQAAeL9GjRqd8bF27drzpg+/pYEDB2rAgAG65557qtympW/fvmf8LGbMmFFHPa45Hx8fLViwQJ07d1b37t2VlZWllStXct0mAMDCqb8AgHP6/vvvz9jWvHlzOZ3O86IP3uLgwYMqLi6utu2CCy6osrIwAAC/NxSqAAAAAACvwqm/AAAAAACvQqEKAAAAAPAqFKoAAAAAAK9CoQoAAAAA8CoUqgAAAAAAr0KhCgAAAADwKhSqAAAAAACv8v8B75FiJyxFAAEAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The plot is saved at: /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/AF555_Cell_Intensity_Average_Distribution.png\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Plot the distribution of the Nucleus_Size column\n",
+ "fig, ax = plt.subplots(figsize=(10, 6))\n",
+ "ax.hist(df['AF555_Cell_Intensity_Average'], bins=30, alpha=0.7, color='skyblue')\n",
+ "\n",
+ "# Add horizontal bars for the 0.05 and 0.95 quantiles\n",
+ "quantile_05 = df['AF555_Cell_Intensity_Average'].quantile(0.05)\n",
+ "quantile_95 = df['AF555_Cell_Intensity_Average'].quantile(0.95)\n",
+ "ax.axvline(x=quantile_05, color='r', linestyle='--', label='Quantile 0.05')\n",
+ "ax.axvline(x=quantile_95, color='g', linestyle='--', label='Quantile 0.95')\n",
+ "\n",
+ "# Add titles and labels\n",
+ "ax.set_title('Distribution of AF555_Cell_Intensity_Average column values with horizontal bars at 0.05 and 0.95 quantiles')\n",
+ "ax.set_xlabel('AF555_Cell_Intensity_Average Values')\n",
+ "ax.set_ylabel('Frequency')\n",
+ "ax.legend()\n",
+ "\n",
+ "# Display quantiles values\n",
+ "ax.text(quantile_05, ax.get_ylim()[1], f' 5th Quantile: {quantile_05:.2f}', color='r', verticalalignment='top')\n",
+ "ax.text(quantile_95, ax.get_ylim()[1], f' 95th Quantile: {quantile_95:.2f}', color='g', verticalalignment='top')\n",
+ "\n",
+ "# Display the plot\n",
+ "plt.show()\n",
+ "\n",
+ "# Save the plot in the output_images_dir directory using fig.savefig\n",
+ "plot_file_path = os.path.join(output_images_dir, \"AF555_Cell_Intensity_Average_Distribution.png\")\n",
+ "fig.savefig(plot_file_path)\n",
+ "print(f\"The plot is saved at: {plot_file_path}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "116f1ba5-5a9b-4161-8fab-d5ecb8524179",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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FAjuFKztMIiIiIjeehz2noiIiIiISEvYQkbFJwSQnKyeNjQEODxsmSOEQHKGug4Y6htyiGAiIiKiEmILGRVfcjJgbKx+ZCdmVKYkZyTDeLoxjKcbS4kZERERERUfW8joP7E7OjHfZa3tjf/DSIiIiIiI3hxsISMiIiIiItISJmRERERERERawoSMiIiIiIhIS5iQERERERERaQkTMiIiIiIiIi3hKItUfLq6QJcuL6apzNHV0UUX9y7SNBERERGVDBMyKj4DA2DDBm1HQVpkoGeADZ+wDhARERG9KnZZJCIiIiIi0hImZERERERERFrChIyKLykJkMnUj6QkbUdDWpCUngTZJBlkk2RISmcdICIiIiopJmRERERERERawoSMiIiIiIhIS5iQERERERERaQkTMiIiIiIiIi1hQkZERERERKQlTMiIiIiIiIi0RE/bAdBbSFcXaNv2xTSVObo6umjr0laaJiIiIqKSYUJGxWdgAOzYoe0oSIsM9AywowfrABEREdGrYpdFIiIiIiIiLWELGWnd7ujEfJe1tjf+DyMhIiIiIvpvsYWMii8pCTAyUj+SkrQdDWlBUnoSjKYZwWiaEZLSWQeIiIiISootZFQyycnajoC0LDmDdYCIiIjoVbGFjIiIiIiISEuYkBEREREREWkJuyxSseyOToRuchJa/vt8751EZBkKrcZERERERPS2YgsZERERERGRljAhIyIiIiIi0hJ2WaRiEzo6eNqoiTRNZY+OTAfeDt7SNBERERGVDBMyKjaVgRLH1+3SdhikRUp9JUL9Q7UdBhEREdFbjz9tExERERERaQkTMiIiIiIiIi1hQkbFppuchA/qOuKDuo7QTU7SdjikBUnpSbCcZQnLWZZISmcdICIiIiopXkNGJSJ/+kTbIZCWPU5+rO0QiIiIiN56bCEjIiIiIiLSEiZkREREREREWsKEjIiIiIiISEuYkBEREREREWkJEzIiIiIiIiIt4SiLVGxCRwfxtepJ01T26Mh00MCugTRNRERERCXzxnyTmj59OmQyGUaOHCnNE0IgMDAQdnZ2UCqVaN68OS5evKixXlpaGr788ktYWFjAyMgIH374Ie7evatRJi4uDr1794apqSlMTU3Ru3dvPHv2TKNMdHQ0OnToACMjI1hYWGD48OFIT09/XYf7VlMZKBG+LQzh28KgMlBqOxzSAqW+EhEDIxAxMAJKfdYBIiIiopJ6IxKyiIgI/Pbbb6hVq5bG/JkzZ2Lu3LlYsGABIiIiYGNjg5YtW+L58+dSmZEjR2LLli1Yu3YtDh8+jMTERLRv3x5ZWVlSmR49euDMmTPYvXs3du/ejTNnzqB3797S8qysLLRr1w5JSUk4fPgw1q5di02bNmHMmDGv/+CJiIiIiKjM0npClpiYiJ49e2Lp0qUwMzOT5gshMH/+fHz33Xf46KOPULNmTSxfvhzJycn4448/AADx8fH4/fffMWfOHLRo0QJ169bFqlWrcP78eezbtw8AcPnyZezevRv/+9//4OnpCU9PTyxduhTbt2/H1atXAQAhISG4dOkSVq1ahbp166JFixaYM2cOli5dioSEhHxjT0tLQ0JCgsaDiIiIiIioqLSekA0dOhTt2rVDixYtNObfvn0bsbGxaNWqlTRPoVDA29sbR44cAQCcPHkSGRkZGmXs7OxQs2ZNqUx4eDhMTU3RsGFDqUyjRo1gamqqUaZmzZqws7OTyvj5+SEtLQ0nT57MN/bp06dL3SBNTU1RuXLlVzgTbw+dlGR4N64B78Y1oJOSrO1wSAuSM5LhON8RjvMdkZzBOkBERERUUlod1GPt2rU4deoUIiIici2LjY0FAFhbW2vMt7a2RlRUlFRGLpdrtKxll8lePzY2FlZWVrm2b2VlpVEm537MzMwgl8ulMnkZN24cRo8eLT1PSEgoE0mZTAgo70ZL01T2CCEQFR8lTRMRERFRyWgtIbtz5w5GjBiBkJAQGBgY5FtOJpNpPBdC5JqXU84yeZUvSZmcFAoFFApFgbEQERERERHlR2tdFk+ePImHDx+ifv360NPTg56eHsLCwvDzzz9DT09ParHK2UL18OFDaZmNjQ3S09MRFxdXYJkHDx7k2v+jR480yuTcT1xcHDIyMnK1nBEREREREZUWrSVkvr6+OH/+PM6cOSM9GjRogJ49e+LMmTOoUqUKbGxssHfvXmmd9PR0hIWFwcvLCwBQv3596Ovra5SJiYnBhQsXpDKenp6Ij4/H8ePHpTLHjh1DfHy8RpkLFy4gJiZGKhMSEgKFQoH69eu/1vNARERERERll9a6LJqYmKBmzZoa84yMjGBubi7NHzlyJKZNmwYXFxe4uLhg2rRpMDQ0RI8ePQAApqam6N+/P8aMGQNzc3NUqFABAQEB8PDwkAYJcXNzQ+vWrTFw4EAsWbIEAPD555+jffv2cHV1BQC0atUK7u7u6N27N2bNmoWnT58iICAAAwcORLly5f6rU0JERERERGWMVgf1KMzYsWORkpKCIUOGIC4uDg0bNkRISAhMTEykMvPmzYOenh66du2KlJQU+Pr6Ijg4GLq6ulKZ1atXY/jw4dJojB9++CEWLFggLdfV1cWOHTswZMgQNG7cGEqlEj169MDs2bP/u4MlIiIiIqIyRyY4RFqpSUhIgKmpKeLj49/ZlrXd0YnQSUmGZwdvAED4tjColIavbX+t7Y0BAOlJ6ZhuPB0AMC5xHORG8qJtIDMJWK/eBromAnpGryPMMic5IxnvLX0PABAxMAKG+q+vDhARERG9jYqaG7zRLWT0ZlIpDfHPvty3KqCyw1DfEBeHXNR2GERERERvPa3fGJqIiIiIiKisYkJGRERERESkJUzIqNh0UpLRuMV7aNziPeikJGs7HNKC5Ixk1FhYAzUW1kByBusAERERUUnxGjIqNpkQMLl+RZqmskcIgUuPLknTRERERFQybCEjIiIiIiLSEiZkREREREREWsKEjIiIiIiISEuYkBEREREREWkJEzIiIiIiIiIt4SiLVGxCJkNKJXtpmsoemUwGB1MHaZqIiIiISoYJGRWbSmmIsH8uajsM0iJDfUNEjozUdhhEREREbz12WSQiIiIiItISJmRERERERERawoSMik0nNQWeHbzh2cEbOqkp2g6HtCAlIwXvLX0P7y19DykZrANEREREJcVryKjYZCoVTM+dkqap7FEJFU7cPyFNExEREVHJsIWMiIiIiIhIS5iQERERERERaQkTMiIiIiIiIi1hQkZERERERKQlTMiIiIiIiIi0hKMsUomkVzDXdgikZRaGFtoOgYiIiOitx4SMii3L0AgHTkdqOwzSIiO5ER599UjbYRARERG99dhlkYiIiIiISEuYkBEREREREWkJEzIqNp3UFLzfrQ3e79YGOqkp2g6HtCAlIwXNg5ujeXBzpGSwDhARERGVFK8ho2KTqVSocPSwNP067Y5OBABkJWdI8/beSYKuYTpa2xu/1n1T/lRChbCoMGmaiIiIiEqGLWRERERERERawoSMiIiIiIhIS5iQERERERERaQkTMiIiIiIiIi1hQkZERERERKQlHGWRSiRTaajtEEjLDPVZB4iI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vfeeqVWrlrXepk0brybmdKc+6C5fvtzaNnv2bCPJahqMMebuu+82vXv3Puc5T3e2huzaa6/1iunQoYO57777rPXTP3yfct1115Vqjt98801Tt25dr9f97W9/s9azs7ONw+Ewn332mTHGmIEDB5q//OUvZ83z9IbMmLN/6DfGmHvuucf07dvXWp8/f75p0qSJ1/fofB544AEzZMgQa33w4MHmwQcftNbbtm1rHnnkEWt9xowZpkOHDtZ6VFSUefvtt72O+fe//93ExsZ6Xcf8+fN/M5d+/fqZqVOnGmOMOXbsmPHz8zPvv/++tf/o0aMmICDAqt0ff/zROBwOc/DgQa/jdO/e3cyYMeOc53nxxRetX1AYY8zx48dNYGCgeemll84aX1RUZIKDg81HH31kbStrQxYXF2fuuusur+N+9dVXxsfHx+Tl5ZX75wKAyw+3LALAWZj/3JLncDguKL5Xr17KycnR448/Xmpfz5491bBhQzVp0kRxcXFatGjRBd1uV5Yc7rzzTuvWt4yMDH3yySe64447zvua7du3KzY21uv4Xbp0UXZ2tg4cOGBt69Spk1dMbGysdu7cqeLi4rMed+XKlerZs6fq1aun4OBgjRgxQocPH7Zu1Zo0aZIeffRRdenSRTNnztTmzZtLHaNt27bWcnh4uAICAtSkSROvbRkZGee9vvM5/fiSVLdu3d88XnJysh555BEFBQVZX2PGjFFaWprX9/P0YwcGBio4ONg69j333KPFixfryiuv1PTp07V27doy5z5mzBglJibq4MGDkk7ePjhq1KgLqpPi4mK9/vrrGj58uLVt+PDhev31163v57Bhw7Ro0SJJJ2vwnXfe0bBhwyRJhw4d0v79+zV69Giv9+HRRx/VTz/95HWu9u3blzr3Y489prZt26pWrVoKCgpSYmKi9u3bJ0natWuXCgsL1bFjR+s1Ho9HLVq0sNZTUlJkjFHz5s29zr9q1apS5z/d7bffrpKSEr377ruSpHfffVfGGP35z3+WdPLfzNixY9W8eXN5PB55PB5lZ2dbuZVHcnKyFi5c6JVn7969VVJSot27d5f75wKAyw8NGQCcRbNmzeRwOLR9+/YLiu/evbuWLVuml19+WRMnTvTaFxwcrJSUFL3zzjuqW7euHnroIbVr1+43Z88rSw4jRozQrl27tG7dOr311ltq1KiRrrvu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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The plot is saved at: /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/CKs_Cytoplasm_Intensity_Average_Distribution.png\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Plot the distribution of the Nucleus_Size column\n",
+ "fig, ax = plt.subplots(figsize=(10, 6))\n",
+ "ax.hist(df['CKs_Cytoplasm_Intensity_Average'], bins=100, alpha=0.6, color='skyblue') # Augmented number of bins\n",
+ "\n",
+ "# Calculate mean and median\n",
+ "mean_value = df['CKs_Cytoplasm_Intensity_Average'].mean()\n",
+ "median_value = df['CKs_Cytoplasm_Intensity_Average'].median()\n",
+ "\n",
+ "# Add vertical lines for mean and median\n",
+ "ax.axvline(x=mean_value, color='orange', linestyle='-', label='Mean')\n",
+ "ax.axvline(x=median_value, color='purple', linestyle='-', label='Median')\n",
+ "\n",
+ "# Add horizontal bars for the 0.05 and 0.95 quantiles\n",
+ "quantile_05 = df['CKs_Cytoplasm_Intensity_Average'].quantile(0.05)\n",
+ "quantile_95 = df['CKs_Cytoplasm_Intensity_Average'].quantile(0.95)\n",
+ "ax.axvline(x=quantile_05, color='r', linestyle='--', label='Quantile 0.05')\n",
+ "ax.axvline(x=quantile_95, color='g', linestyle='--', label='Quantile 0.95')\n",
+ "\n",
+ "# Add titles and labels\n",
+ "ax.set_title('Distribution of CKs_Cytoplasm_Intensity_Average with Quantiles, Mean, and Median')\n",
+ "ax.set_xlabel('CKs_Cytoplasm_Intensity_Average Values')\n",
+ "ax.set_ylabel('Frequency')\n",
+ "ax.legend()\n",
+ "\n",
+ "# Display quantile values\n",
+ "ax.text(quantile_05, ax.get_ylim()[1], f' 5th Quantile: {quantile_05:.2f}', color='r', verticalalignment='top')\n",
+ "ax.text(quantile_95, ax.get_ylim()[1], f' 95th Quantile: {quantile_95:.2f}', color='g', verticalalignment='top')\n",
+ "\n",
+ "# Display mean and median values\n",
+ "ax.text(mean_value, ax.get_ylim()[1]*0.9, f' Mean: {mean_value:.2f}', color='orange', verticalalignment='top')\n",
+ "ax.text(median_value, ax.get_ylim()[1]*0.85, f' Median: {median_value:.2f}', color='purple', verticalalignment='top')\n",
+ "\n",
+ "# Display the plot\n",
+ "plt.show()\n",
+ "\n",
+ "# Save the plot\n",
+ "plot_file_path = os.path.join(output_images_dir, \"CKs_Cytoplasm_Intensity_Average_Distribution.png\")\n",
+ "fig.savefig(plot_file_path)\n",
+ "print(f\"The plot is saved at: {plot_file_path}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "id": "90c21233-43da-4692-bbf0-c90e037c035c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.05 1603.137970\n",
+ "0.50 3559.484741\n",
+ "0.95 10239.075195\n",
+ "Name: CKs_Cytoplasm_Intensity_Average, dtype: float64"
+ ]
+ },
+ "execution_count": 36,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[\"CKs_Cytoplasm_Intensity_Average\"].quantile(q=qs)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4a3e399c-684e-4c40-9963-1e96bb3fcffe",
+ "metadata": {},
+ "source": [
+ "## I.5. COLUMNS OF INTERESTS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "fdcf65d1-0d91-4688-9903-25a003d755b6",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Columns are now...\n",
+ "['ROI_index', 'Nuc_Y_Inv', 'Nucleus_Roundness', 'Cell_Size', 'Sample_ID', 'Nucleus_Size', 'Nuc_X', 'AF488_Cell_Intensity_Average', 'AF488_Cytoplasm_Intensity_Average', 'AF488_Nucleus_Intensity_Average', 'AF555_Cell_Intensity_Average', 'AF555_Cytoplasm_Intensity_Average', 'AF555_Nucleus_Intensity_Average', 'AF647_Cell_Intensity_Average', 'AF647_Cytoplasm_Intensity_Average', 'AF647_Nucleus_Intensity_Average', 'AF750_Cell_Intensity_Average', 'AF750_Cytoplasm_Intensity_Average', 'AF750_Nucleus_Intensity_Average', 'aSMA_Cell_Intensity_Average', 'aSMA_Cytoplasm_Intensity_Average', 'aSMA_Nucleus_Intensity_Average', 'AXL_Cell_Intensity_Average', 'AXL_Cytoplasm_Intensity_Average', 'AXL_Nucleus_Intensity_Average', 'B7H4_Cell_Intensity_Average', 'B7H4_Cytoplasm_Intensity_Average', 'B7H4_Nucleus_Intensity_Average', 'CA9_Cell_Intensity_Average', 'CA9_Cytoplasm_Intensity_Average', 'CA9_Nucleus_Intensity_Average', 'CD4_Cell_Intensity_Average', 'CD4_Cytoplasm_Intensity_Average', 'CD4_Nucleus_Intensity_Average', 'CD8_Cell_Intensity_Average', 'CD8_Cytoplasm_Intensity_Average', 'CD8_Nucleus_Intensity_Average', 'CD11b_Cell_Intensity_Average', 'CD11b_Cytoplasm_Intensity_Average', 'CD11b_Nucleus_Intensity_Average', 'CD11c_Cell_Intensity_Average', 'CD11c_Cytoplasm_Intensity_Average', 'CD11c_Nucleus_Intensity_Average', 'CD20_Cell_Intensity_Average', 'CD20_Cytoplasm_Intensity_Average', 'CD20_Nucleus_Intensity_Average', 'CD31_Cell_Intensity_Average', 'CD31_Cytoplasm_Intensity_Average', 'CD31_Nucleus_Intensity_Average', 'CD44_Cell_Intensity_Average', 'CD44_Cytoplasm_Intensity_Average', 'CD44_Nucleus_Intensity_Average', 'CD45_Cell_Intensity_Average', 'CD45_Cytoplasm_Intensity_Average', 'CD45_Nucleus_Intensity_Average', 'CD68_Cell_Intensity_Average', 'CD68_Cytoplasm_Intensity_Average', 'CD68_Nucleus_Intensity_Average', 'CD163_Cell_Intensity_Average', 'CD163_Cytoplasm_Intensity_Average', 'CD163_Nucleus_Intensity_Average', 'CKs_Cell_Intensity_Average', 'CKs_Cytoplasm_Intensity_Average', 'CKs_Nucleus_Intensity_Average', 'ColVI_Cell_Intensity_Average', 'ColVI_Cytoplasm_Intensity_Average', 'ColVI_Nucleus_Intensity_Average', 'Desmin_Cell_Intensity_Average', 'Desmin_Cytoplasm_Intensity_Average', 'Desmin_Nucleus_Intensity_Average', 'Ecad_Cell_Intensity_Average', 'Ecad_Cytoplasm_Intensity_Average', 'Ecad_Nucleus_Intensity_Average', 'Fibronectin_Cell_Intensity_Average', 'Fibronectin_Cytoplasm_Intensity_Average', 'Fibronectin_Nucleus_Intensity_Average', 'FOXP3_Cell_Intensity_Average', 'FOXP3_Cytoplasm_Intensity_Average', 'FOXP3_Nucleus_Intensity_Average', 'GATA3_Cell_Intensity_Average', 'GATA3_Cytoplasm_Intensity_Average', 'GATA3_Nucleus_Intensity_Average', 'HLA_Cell_Intensity_Average', 'HLA_Cytoplasm_Intensity_Average', 'HLA_Nucleus_Intensity_Average', 'Ki67_Cell_Intensity_Average', 'Ki67_Cytoplasm_Intensity_Average', 'Ki67_Nucleus_Intensity_Average', 'MMP9_Cell_Intensity_Average', 'MMP9_Cytoplasm_Intensity_Average', 'MMP9_Nucleus_Intensity_Average', 'PD1_Cell_Intensity_Average', 'PD1_Cytoplasm_Intensity_Average', 'PD1_Nucleus_Intensity_Average', 'PDGFR_Cell_Intensity_Average', 'PDGFR_Cytoplasm_Intensity_Average', 'PDGFR_Nucleus_Intensity_Average', 'PDL1_Cell_Intensity_Average', 'PDL1_Cytoplasm_Intensity_Average', 'PDL1_Nucleus_Intensity_Average', 'r5c2_Cell_Intensity_Average', 'r5c2_Cytoplasm_Intensity_Average', 'r5c2_Nucleus_Intensity_Average', 'r7c2_Cell_Intensity_Average', 'r7c2_Cytoplasm_Intensity_Average', 'r7c2_Nucleus_Intensity_Average', 'r8c2_Cell_Intensity_Average', 'r8c2_Cytoplasm_Intensity_Average', 'r8c2_Nucleus_Intensity_Average', 'Sting_Cell_Intensity_Average', 'Sting_Cytoplasm_Intensity_Average', 'Sting_Nucleus_Intensity_Average', 'Vimentin_Cell_Intensity_Average', 'Vimentin_Cytoplasm_Intensity_Average', 'Vimentin_Nucleus_Intensity_Average']\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Remove columns containing \"DAPI\"\n",
+ "df = df[[x for x in df.columns.values if 'DAPI' not in x]]\n",
+ "\n",
+ "print(\"Columns are now...\")\n",
+ "print([c for c in df.columns.values])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "17741329-f501-4eec-af23-ed5026b13a94",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'AF488_Cell': 'AF488_Cell_Intensity_Average',\n",
+ " 'AF488_Cytoplasm': 'AF488_Cytoplasm_Intensity_Average',\n",
+ " 'AF488_Nucleus': 'AF488_Nucleus_Intensity_Average',\n",
+ " 'AF555_Cell': 'AF555_Cell_Intensity_Average',\n",
+ " 'AF555_Cytoplasm': 'AF555_Cytoplasm_Intensity_Average',\n",
+ " 'AF555_Nucleus': 'AF555_Nucleus_Intensity_Average',\n",
+ " 'AF647_Cell': 'AF647_Cell_Intensity_Average',\n",
+ " 'AF647_Cytoplasm': 'AF647_Cytoplasm_Intensity_Average',\n",
+ " 'AF647_Nucleus': 'AF647_Nucleus_Intensity_Average',\n",
+ " 'AF750_Cell': 'AF750_Cell_Intensity_Average',\n",
+ " 'AF750_Cytoplasm': 'AF750_Cytoplasm_Intensity_Average',\n",
+ " 'AF750_Nucleus': 'AF750_Nucleus_Intensity_Average',\n",
+ " 'aSMA_Cell': 'aSMA_Cell_Intensity_Average',\n",
+ " 'aSMA_Cytoplasm': 'aSMA_Cytoplasm_Intensity_Average',\n",
+ " 'aSMA_Nucleus': 'aSMA_Nucleus_Intensity_Average',\n",
+ " 'AXL_Cell': 'AXL_Cell_Intensity_Average',\n",
+ " 'AXL_Cytoplasm': 'AXL_Cytoplasm_Intensity_Average',\n",
+ " 'AXL_Nucleus': 'AXL_Nucleus_Intensity_Average',\n",
+ " 'B7H4_Cell': 'B7H4_Cell_Intensity_Average',\n",
+ " 'B7H4_Cytoplasm': 'B7H4_Cytoplasm_Intensity_Average',\n",
+ " 'B7H4_Nucleus': 'B7H4_Nucleus_Intensity_Average',\n",
+ " 'CA9_Cell': 'CA9_Cell_Intensity_Average',\n",
+ " 'CA9_Cytoplasm': 'CA9_Cytoplasm_Intensity_Average',\n",
+ " 'CA9_Nucleus': 'CA9_Nucleus_Intensity_Average',\n",
+ " 'CD4_Cell': 'CD4_Cell_Intensity_Average',\n",
+ " 'CD4_Cytoplasm': 'CD4_Cytoplasm_Intensity_Average',\n",
+ " 'CD4_Nucleus': 'CD4_Nucleus_Intensity_Average',\n",
+ " 'CD8_Cell': 'CD8_Cell_Intensity_Average',\n",
+ " 'CD8_Cytoplasm': 'CD8_Cytoplasm_Intensity_Average',\n",
+ " 'CD8_Nucleus': 'CD8_Nucleus_Intensity_Average',\n",
+ " 'CD11b_Cell': 'CD11b_Cell_Intensity_Average',\n",
+ " 'CD11b_Cytoplasm': 'CD11b_Cytoplasm_Intensity_Average',\n",
+ " 'CD11b_Nucleus': 'CD11b_Nucleus_Intensity_Average',\n",
+ " 'CD11c_Cell': 'CD11c_Cell_Intensity_Average',\n",
+ " 'CD11c_Cytoplasm': 'CD11c_Cytoplasm_Intensity_Average',\n",
+ " 'CD11c_Nucleus': 'CD11c_Nucleus_Intensity_Average',\n",
+ " 'CD20_Cell': 'CD20_Cell_Intensity_Average',\n",
+ " 'CD20_Cytoplasm': 'CD20_Cytoplasm_Intensity_Average',\n",
+ " 'CD20_Nucleus': 'CD20_Nucleus_Intensity_Average',\n",
+ " 'CD31_Cell': 'CD31_Cell_Intensity_Average',\n",
+ " 'CD31_Cytoplasm': 'CD31_Cytoplasm_Intensity_Average',\n",
+ " 'CD31_Nucleus': 'CD31_Nucleus_Intensity_Average',\n",
+ " 'CD44_Cell': 'CD44_Cell_Intensity_Average',\n",
+ " 'CD44_Cytoplasm': 'CD44_Cytoplasm_Intensity_Average',\n",
+ " 'CD44_Nucleus': 'CD44_Nucleus_Intensity_Average',\n",
+ " 'CD45_Cell': 'CD45_Cell_Intensity_Average',\n",
+ " 'CD45_Cytoplasm': 'CD45_Cytoplasm_Intensity_Average',\n",
+ " 'CD45_Nucleus': 'CD45_Nucleus_Intensity_Average',\n",
+ " 'CD68_Cell': 'CD68_Cell_Intensity_Average',\n",
+ " 'CD68_Cytoplasm': 'CD68_Cytoplasm_Intensity_Average',\n",
+ " 'CD68_Nucleus': 'CD68_Nucleus_Intensity_Average',\n",
+ " 'CD163_Cell': 'CD163_Cell_Intensity_Average',\n",
+ " 'CD163_Cytoplasm': 'CD163_Cytoplasm_Intensity_Average',\n",
+ " 'CD163_Nucleus': 'CD163_Nucleus_Intensity_Average',\n",
+ " 'CKs_Cell': 'CKs_Cell_Intensity_Average',\n",
+ " 'CKs_Cytoplasm': 'CKs_Cytoplasm_Intensity_Average',\n",
+ " 'CKs_Nucleus': 'CKs_Nucleus_Intensity_Average',\n",
+ " 'ColVI_Cell': 'ColVI_Cell_Intensity_Average',\n",
+ " 'ColVI_Cytoplasm': 'ColVI_Cytoplasm_Intensity_Average',\n",
+ " 'ColVI_Nucleus': 'ColVI_Nucleus_Intensity_Average',\n",
+ " 'Desmin_Cell': 'Desmin_Cell_Intensity_Average',\n",
+ " 'Desmin_Cytoplasm': 'Desmin_Cytoplasm_Intensity_Average',\n",
+ " 'Desmin_Nucleus': 'Desmin_Nucleus_Intensity_Average',\n",
+ " 'Ecad_Cell': 'Ecad_Cell_Intensity_Average',\n",
+ " 'Ecad_Cytoplasm': 'Ecad_Cytoplasm_Intensity_Average',\n",
+ " 'Ecad_Nucleus': 'Ecad_Nucleus_Intensity_Average',\n",
+ " 'Fibronectin_Cell': 'Fibronectin_Cell_Intensity_Average',\n",
+ " 'Fibronectin_Cytoplasm': 'Fibronectin_Cytoplasm_Intensity_Average',\n",
+ " 'Fibronectin_Nucleus': 'Fibronectin_Nucleus_Intensity_Average',\n",
+ " 'FOXP3_Cell': 'FOXP3_Cell_Intensity_Average',\n",
+ " 'FOXP3_Cytoplasm': 'FOXP3_Cytoplasm_Intensity_Average',\n",
+ " 'FOXP3_Nucleus': 'FOXP3_Nucleus_Intensity_Average',\n",
+ " 'GATA3_Cell': 'GATA3_Cell_Intensity_Average',\n",
+ " 'GATA3_Cytoplasm': 'GATA3_Cytoplasm_Intensity_Average',\n",
+ " 'GATA3_Nucleus': 'GATA3_Nucleus_Intensity_Average',\n",
+ " 'HLA_Cell': 'HLA_Cell_Intensity_Average',\n",
+ " 'HLA_Cytoplasm': 'HLA_Cytoplasm_Intensity_Average',\n",
+ " 'HLA_Nucleus': 'HLA_Nucleus_Intensity_Average',\n",
+ " 'Ki67_Cell': 'Ki67_Cell_Intensity_Average',\n",
+ " 'Ki67_Cytoplasm': 'Ki67_Cytoplasm_Intensity_Average',\n",
+ " 'Ki67_Nucleus': 'Ki67_Nucleus_Intensity_Average',\n",
+ " 'MMP9_Cell': 'MMP9_Cell_Intensity_Average',\n",
+ " 'MMP9_Cytoplasm': 'MMP9_Cytoplasm_Intensity_Average',\n",
+ " 'MMP9_Nucleus': 'MMP9_Nucleus_Intensity_Average',\n",
+ " 'PD1_Cell': 'PD1_Cell_Intensity_Average',\n",
+ " 'PD1_Cytoplasm': 'PD1_Cytoplasm_Intensity_Average',\n",
+ " 'PD1_Nucleus': 'PD1_Nucleus_Intensity_Average',\n",
+ " 'PDGFR_Cell': 'PDGFR_Cell_Intensity_Average',\n",
+ " 'PDGFR_Cytoplasm': 'PDGFR_Cytoplasm_Intensity_Average',\n",
+ " 'PDGFR_Nucleus': 'PDGFR_Nucleus_Intensity_Average',\n",
+ " 'PDL1_Cell': 'PDL1_Cell_Intensity_Average',\n",
+ " 'PDL1_Cytoplasm': 'PDL1_Cytoplasm_Intensity_Average',\n",
+ " 'PDL1_Nucleus': 'PDL1_Nucleus_Intensity_Average',\n",
+ " 'r5c2_Cell': 'r5c2_Cell_Intensity_Average',\n",
+ " 'r5c2_Cytoplasm': 'r5c2_Cytoplasm_Intensity_Average',\n",
+ " 'r5c2_Nucleus': 'r5c2_Nucleus_Intensity_Average',\n",
+ " 'r7c2_Cell': 'r7c2_Cell_Intensity_Average',\n",
+ " 'r7c2_Cytoplasm': 'r7c2_Cytoplasm_Intensity_Average',\n",
+ " 'r7c2_Nucleus': 'r7c2_Nucleus_Intensity_Average',\n",
+ " 'r8c2_Cell': 'r8c2_Cell_Intensity_Average',\n",
+ " 'r8c2_Cytoplasm': 'r8c2_Cytoplasm_Intensity_Average',\n",
+ " 'r8c2_Nucleus': 'r8c2_Nucleus_Intensity_Average',\n",
+ " 'Sting_Cell': 'Sting_Cell_Intensity_Average',\n",
+ " 'Sting_Cytoplasm': 'Sting_Cytoplasm_Intensity_Average',\n",
+ " 'Sting_Nucleus': 'Sting_Nucleus_Intensity_Average',\n",
+ " 'Vimentin_Cell': 'Vimentin_Cell_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm': 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'Vimentin_Nucleus': 'Vimentin_Nucleus_Intensity_Average'}"
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Create lists of full names and shortened names to use in plotting\n",
+ "full_to_short_names, short_to_full_names = \\\n",
+ " shorten_feature_names(df.columns.values[~df.columns.isin(not_intensities)])\n",
+ "\n",
+ "short_to_full_names"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "id": "dfdd64a5-8705-4ed6-b94f-c42379faefd7",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The full_to_short_column_names.csv file was created !\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Save this data to a metadata file\n",
+ "filename = os.path.join(metadata_dir, \"full_to_short_column_names.csv\")\n",
+ "fh = open(filename, \"w\")\n",
+ "fh.write(\"full_name,short_name\\n\")\n",
+ "for k,v in full_to_short_names.items():\n",
+ " fh.write(k + \",\" + v + \"\\n\")\n",
+ " \n",
+ "fh.close()\n",
+ "print(\"The full_to_short_column_names.csv file was created !\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "b4e26e25-620a-4700-b091-928c6ba08a00",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The short_to_full_column_names.csv file was created !\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Save this data to a metadata file\n",
+ "filename = os.path.join(metadata_dir, \"short_to_full_column_names.csv\")\n",
+ "fh = open(filename, \"w\")\n",
+ "fh.write(\"short_name,full_name\\n\")\n",
+ "for k,v in short_to_full_names.items():\n",
+ " fh.write(k + \",\" + v + \"\\n\")\n",
+ " \n",
+ "fh.close()\n",
+ "print(\"The short_to_full_column_names.csv file was created !\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4c5da27d-39a6-411b-a71f-0cd82ce2b728",
+ "metadata": {},
+ "source": [
+ "## I.6. EXPOSURE TIME"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "2e0c99c9-b254-41c7-b264-58441252c976",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Round Target Exp Channel\n",
+ "0 R0 AF488 300 c2\n",
+ "1 R0 AF555 1500 c3\n",
+ "2 R0 AF647 1500 c4\n",
+ "3 R0 AF750 1500 c5\n",
+ "4 R1 ColVI 300 c2\n",
+ "df's shape: (36, 4)\n",
+ "\n",
+ "No null values detected.\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Here, we want to end up with a data structure that incorporates metadata on each intensity marker column used in our big dataframe in an easy-to-use format. \n",
+ "# This is going to include the full name of the intensity marker columns in the big data frame, \n",
+ "# the corresponding round and channel, \n",
+ "# the target protein (e.g., CD45), \n",
+ "# and the segmentation localization information (cell, cytoplasm, nucleus)\n",
+ "\n",
+ "# We can use this data structure to assign unique colors to all channels and rounds, for example, for use in later visualizations\n",
+ "# Exposure_time file from ASHLAR analysis\n",
+ "filename = \"Exposure_Time.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "exp_df = pd.read_csv(filename)\n",
+ "\n",
+ "print(exp_df.head())\n",
+ "\n",
+ "# Verify file imported correctly\n",
+ "# File length\n",
+ "print(\"df's shape: \", exp_df.shape)\n",
+ "# Headers\n",
+ "expected_headers =['Round','Target','Exp','Channel']\n",
+ "compare_headers(expected_headers, exp_df.columns.values, \"Imported metadata file\")\n",
+ "\n",
+ "# Missingness\n",
+ "if exp_df.isnull().any().any():\n",
+ " print(\"\\nexp_df has null value(s) in row(s):\")\n",
+ " print(exp_df[exp_df.isna().any(axis=1)])\n",
+ "else:\n",
+ " print(\"\\nNo null values detected.\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "id": "17501193-977f-4b30-bbb8-5afdae4a0356",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "if len(exp_df['Target']) > len(exp_df['Target'].unique()):\n",
+ " print(\"One or more non-unique Target values in exp_df. Currently not supported.\")\n",
+ "exp_df = exp_df.drop_duplicates(subset = 'Target').reindex()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "id": "90d1feb7-2459-4a02-a526-ddc64082345b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Round \n",
+ " Target \n",
+ " Exp \n",
+ " Channel \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " R0 \n",
+ " AF647 \n",
+ " 1500 \n",
+ " c4 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " R0 \n",
+ " AF750 \n",
+ " 1500 \n",
+ " c5 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " R4 \n",
+ " AXL \n",
+ " 1500 \n",
+ " c3 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Round Target Exp Channel\n",
+ "0 R0 AF488 300 c2\n",
+ "1 R0 AF555 1500 c3\n",
+ "2 R0 AF647 1500 c4\n",
+ "3 R0 AF750 1500 c5\n",
+ "17 R4 AXL 1500 c3"
+ ]
+ },
+ "execution_count": 43,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# sort exp_df by the values in the 'Target' column in ascending order and then retrieve the first few rows of the sorted df\n",
+ "exp_df.sort_values(by = ['Target']).head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "id": "b7373851-14bb-4813-be00-7f8c4e1f4ebf",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Round \n",
+ " Target \n",
+ " Exp \n",
+ " Channel \n",
+ " target_lower \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " R0 \n",
+ " AF647 \n",
+ " 1500 \n",
+ " c4 \n",
+ " af647 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " R0 \n",
+ " AF750 \n",
+ " 1500 \n",
+ " c5 \n",
+ " af750 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " R1 \n",
+ " ColVI \n",
+ " 300 \n",
+ " c2 \n",
+ " colvi \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Round Target Exp Channel target_lower\n",
+ "0 R0 AF488 300 c2 af488\n",
+ "1 R0 AF555 1500 c3 af555\n",
+ "2 R0 AF647 1500 c4 af647\n",
+ "3 R0 AF750 1500 c5 af750\n",
+ "4 R1 ColVI 300 c2 colvi"
+ ]
+ },
+ "execution_count": 44,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Create lowercase version of target\n",
+ "exp_df['target_lower'] = exp_df['Target'].str.lower()\n",
+ "exp_df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "id": "4722fdb1-cd93-45a0-b196-89d50918b2e2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " full_column \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " full_column\n",
+ "0 AF488_Cell_Intensity_Average\n",
+ "1 AF488_Cytoplasm_Intensity_Average\n",
+ "2 AF488_Nucleus_Intensity_Average\n",
+ "3 AF555_Cell_Intensity_Average\n",
+ "4 AF555_Cytoplasm_Intensity_Average"
+ ]
+ },
+ "execution_count": 45,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Create df that contains marker intensity columns in our df that aren't in not_intensities\n",
+ "intensities = pd.DataFrame({'full_column':df.columns.values[~df.columns.isin(not_intensities)]})\n",
+ "\n",
+ "intensities.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "id": "f88ef6d6-8160-4fa4-a0ed-942e4127414e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " full_column \n",
+ " marker \n",
+ " marker_lower \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488 \n",
+ " af488 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488 \n",
+ " af488 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " AF488 \n",
+ " af488 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " AF555 \n",
+ " af555 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " AF555 \n",
+ " af555 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " full_column marker marker_lower\n",
+ "0 AF488_Cell_Intensity_Average AF488 af488\n",
+ "1 AF488_Cytoplasm_Intensity_Average AF488 af488\n",
+ "2 AF488_Nucleus_Intensity_Average AF488 af488\n",
+ "3 AF555_Cell_Intensity_Average AF555 af555\n",
+ "4 AF555_Cytoplasm_Intensity_Average AF555 af555"
+ ]
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Extract the marker information from the `full_column`, which corresponds to full column in big dataframe\n",
+ "# Use regular expressions (regex) to isolate the part of the field that begins (^) with an alphanumeric value (W), and ends with an underscore (_)\n",
+ "# '$' is end of line\n",
+ "intensities['marker'] = intensities['full_column'].str.extract(r'([^\\W_]+)')\n",
+ "# convert to lowercase\n",
+ "intensities['marker_lower'] = intensities['marker'].str.lower()\n",
+ "\n",
+ "intensities.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "id": "2b9ff02b-a33b-4f42-95c0-4b4132e2aa25",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " full_column \n",
+ " marker \n",
+ " marker_lower \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488 \n",
+ " af488 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488 \n",
+ " af488 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " AF488 \n",
+ " af488 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " AF555 \n",
+ " af555 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " AF555 \n",
+ " af555 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " full_column marker marker_lower\n",
+ "0 AF488_Cell_Intensity_Average AF488 af488\n",
+ "1 AF488_Cytoplasm_Intensity_Average AF488 af488\n",
+ "2 AF488_Nucleus_Intensity_Average AF488 af488\n",
+ "3 AF555_Cell_Intensity_Average AF555 af555\n",
+ "4 AF555_Cytoplasm_Intensity_Average AF555 af555"
+ ]
+ },
+ "execution_count": 47,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Subset the intensities df to exclude any column pertaining to DAPI\n",
+ "intensities = intensities.loc[intensities['marker_lower'] != 'dapi']\n",
+ "\n",
+ "intensities.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "id": "fa1340aa-1c86-4b0f-82a2-ded1892dea6e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Round \n",
+ " Target \n",
+ " Exp \n",
+ " Channel \n",
+ " target_lower \n",
+ " full_column \n",
+ " marker \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " AF488 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " AF555 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " AF555 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " R8 \n",
+ " Sting \n",
+ " 1000 \n",
+ " c4 \n",
+ " sting \n",
+ " Sting_Cytoplasm_Intensity_Average \n",
+ " Sting \n",
+ " \n",
+ " \n",
+ " 104 \n",
+ " R8 \n",
+ " Sting \n",
+ " 1000 \n",
+ " c4 \n",
+ " sting \n",
+ " Sting_Nucleus_Intensity_Average \n",
+ " Sting \n",
+ " \n",
+ " \n",
+ " 105 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Cell_Intensity_Average \n",
+ " CD11b \n",
+ " \n",
+ " \n",
+ " 106 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Cytoplasm_Intensity_Average \n",
+ " CD11b \n",
+ " \n",
+ " \n",
+ " 107 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Nucleus_Intensity_Average \n",
+ " CD11b \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
108 rows Ć 7 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Round Target Exp Channel target_lower \\\n",
+ "0 R0 AF488 300 c2 af488 \n",
+ "1 R0 AF488 300 c2 af488 \n",
+ "2 R0 AF488 300 c2 af488 \n",
+ "3 R0 AF555 1500 c3 af555 \n",
+ "4 R0 AF555 1500 c3 af555 \n",
+ ".. ... ... ... ... ... \n",
+ "103 R8 Sting 1000 c4 sting \n",
+ "104 R8 Sting 1000 c4 sting \n",
+ "105 R8 CD11b 1500 c5 cd11b \n",
+ "106 R8 CD11b 1500 c5 cd11b \n",
+ "107 R8 CD11b 1500 c5 cd11b \n",
+ "\n",
+ " full_column marker \n",
+ "0 AF488_Cell_Intensity_Average AF488 \n",
+ "1 AF488_Cytoplasm_Intensity_Average AF488 \n",
+ "2 AF488_Nucleus_Intensity_Average AF488 \n",
+ "3 AF555_Cell_Intensity_Average AF555 \n",
+ "4 AF555_Cytoplasm_Intensity_Average AF555 \n",
+ ".. ... ... \n",
+ "103 Sting_Cytoplasm_Intensity_Average Sting \n",
+ "104 Sting_Nucleus_Intensity_Average Sting \n",
+ "105 CD11b_Cell_Intensity_Average CD11b \n",
+ "106 CD11b_Cytoplasm_Intensity_Average CD11b \n",
+ "107 CD11b_Nucleus_Intensity_Average CD11b \n",
+ "\n",
+ "[108 rows x 7 columns]"
+ ]
+ },
+ "execution_count": 48,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Merge the intensities andexp_df together to create metadata\n",
+ "metadata = pd.merge(exp_df, intensities, how = 'left', left_on = 'target_lower',right_on = 'marker_lower')\n",
+ "metadata = metadata.drop(columns = ['marker_lower'])\n",
+ "metadata = metadata.dropna()\n",
+ "\n",
+ "# Target is the capitalization from the Exposure_Time.csv\n",
+ "# target_lower is Target in small caps\n",
+ "# marker is the extracted first component of the full column in segmentation data, with corresponding capitalization\n",
+ "metadata"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "id": "75378ca2-3ecb-4c60-a7d4-da997f851066",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Round \n",
+ " Target \n",
+ " Exp \n",
+ " Channel \n",
+ " target_lower \n",
+ " full_column \n",
+ " marker \n",
+ " localisation \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488 \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488 \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " AF488 \n",
+ " nucleus \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " AF555 \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " AF555 \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " R8 \n",
+ " Sting \n",
+ " 1000 \n",
+ " c4 \n",
+ " sting \n",
+ " Sting_Cytoplasm_Intensity_Average \n",
+ " Sting \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " 104 \n",
+ " R8 \n",
+ " Sting \n",
+ " 1000 \n",
+ " c4 \n",
+ " sting \n",
+ " Sting_Nucleus_Intensity_Average \n",
+ " Sting \n",
+ " nucleus \n",
+ " \n",
+ " \n",
+ " 105 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Cell_Intensity_Average \n",
+ " CD11b \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 106 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Cytoplasm_Intensity_Average \n",
+ " CD11b \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " 107 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Nucleus_Intensity_Average \n",
+ " CD11b \n",
+ " nucleus \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
108 rows Ć 8 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Round Target Exp Channel target_lower \\\n",
+ "0 R0 AF488 300 c2 af488 \n",
+ "1 R0 AF488 300 c2 af488 \n",
+ "2 R0 AF488 300 c2 af488 \n",
+ "3 R0 AF555 1500 c3 af555 \n",
+ "4 R0 AF555 1500 c3 af555 \n",
+ ".. ... ... ... ... ... \n",
+ "103 R8 Sting 1000 c4 sting \n",
+ "104 R8 Sting 1000 c4 sting \n",
+ "105 R8 CD11b 1500 c5 cd11b \n",
+ "106 R8 CD11b 1500 c5 cd11b \n",
+ "107 R8 CD11b 1500 c5 cd11b \n",
+ "\n",
+ " full_column marker localisation \n",
+ "0 AF488_Cell_Intensity_Average AF488 cell \n",
+ "1 AF488_Cytoplasm_Intensity_Average AF488 cytoplasm \n",
+ "2 AF488_Nucleus_Intensity_Average AF488 nucleus \n",
+ "3 AF555_Cell_Intensity_Average AF555 cell \n",
+ "4 AF555_Cytoplasm_Intensity_Average AF555 cytoplasm \n",
+ ".. ... ... ... \n",
+ "103 Sting_Cytoplasm_Intensity_Average Sting cytoplasm \n",
+ "104 Sting_Nucleus_Intensity_Average Sting nucleus \n",
+ "105 CD11b_Cell_Intensity_Average CD11b cell \n",
+ "106 CD11b_Cytoplasm_Intensity_Average CD11b cytoplasm \n",
+ "107 CD11b_Nucleus_Intensity_Average CD11b nucleus \n",
+ "\n",
+ "[108 rows x 8 columns]"
+ ]
+ },
+ "execution_count": 49,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Add a column to signify marker target localisation.\n",
+ "# Use a lambda to determine segmented location of intensity marker column and update metadata accordingly\n",
+ "# Using the add_metadata_location() function in my_modules.py\n",
+ "metadata['localisation'] = metadata.apply(\n",
+ " lambda row: add_metadata_location(row), axis = 1)\n",
+ "\n",
+ "metadata"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "id": "9779567d-bd63-468a-acdb-e30901c71e03",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The marker_intensity_metadata.csv file was created !\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Save this data structure to the metadata folder\n",
+ "# don't want to add color in because that's better off treating color the same for round, channel, and sample\n",
+ "filename = \"marker_intensity_metadata.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "metadata.to_csv(filename, index = False)\n",
+ "print(\"The marker_intensity_metadata.csv file was created !\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d371ebc6-4aee-4b43-914e-933e3f9abbd5",
+ "metadata": {},
+ "source": [
+ "## I.7. COLORS WORKFLOW"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0f4e010e-149b-4fe9-8a58-7f9f872d2be9",
+ "metadata": {},
+ "source": [
+ "### I.7.1. CHANNELS COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "id": "fb818967-a0b7-4bd0-9b81-32fd1bfefde1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Unique channels are: ['c2' 'c3' 'c4' 'c5']\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUoAAABlCAYAAAArpKpSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAACs0lEQVR4nO3ZQWoTYRzG4X9CawI6CXQZEjc9hSdw4QW8gndQ2nt5Affuu+hADtC0UKR0XIgKgnmnqWEa+zzrb/HyBX7MZEZd13UFwF+Nhx4A8NQJJUAglACBUAIEQgkQCCVAIJQAwVGfQ/f397Ver6tpmhqNRvveBLB3XdfVZrOpxWJR4/H2Z8ZeoVyv17Varf7JOICnpG3bWi6XW8/0CmXTNFVVdf71vKbN9PHLnokPnz4PPeEwvf849IKD8+718dATDs7d9U19efP2V9+26RXKn6/b02Za05lQ9jV70et6+dPLV0MvODhHjVDuqs/fiT7mAARCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRHfQ51XVdVVbeb272O+d9cfbsbesJhurkeesHBudscDz3h4Nxd31TV775tM+p6nLq4uKjT09PHLwN4Ytq2reVyufVMryfKk5OTqqq6vLys+Xz++GXPxNXVVa1Wq2rbtmaz2dBzDoI72417e7iu62qz2dRisYhne4VyPP7xV+Z8Pvcj7GA2m7m3B3Jnu3FvD9P3wc/HHIBAKAGCXqGcTCZ1dnZWk8lk33v+K+7t4dzZbtzbfvX66g3wnHn1BgiEEiAQSoBAKAECoQQIhBIgEEqAQCgBgu+VwWR6hdDVcgAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUoAAABlCAYAAAArpKpSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAACpklEQVR4nO3Zv2rbUBjG4WNj0FLLkNHYU4bupXTp2KV3lYvrPXTMEIHnYgVKIfh0CKFd6ld2ahQlz7PYwxk+Ppsf+jOrtdYCwD/Nxx4A4KUTSoBAKAECoQQIhBIgEEqAQCgBgsWQQ4fDoex2u7JcLstsNrv0TAAXV2stfd+X9Xpd5vPj14yDQrnb7cp2u/0vwwG8JF3Xlc1mc/TMoFAul8vHL5+6Mlu0zx7srfjxeTX2CJP0/uvHsUeYnG9fvo89wuT0pZYP5eefvh0xKJRPt9uzRSuUJ2ibsSeYpvm7QX9L/rIsHomda8jjRC9zAAKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAYLFkEO11sfPh/1Fh3lt9r/GnmCaDvcPY48wOX2pY48wOU87e+rbMbM64NTt7W25vr5+/mQAL0zXdWWz2Rw9M+iK8urqqpRSyt3dXVmtVs+f7I3Y7/dlu92WrutK27ZjjzMJdnYeeztdrbX0fV/W63U8OyiU8/njo8zVauVHOEPbtvZ2Ijs7j72dZuiFn5c5AIFQAgSDQtk0Tbm5uSlN01x6nlfF3k5nZ+ext8sa9NYb4C1z6w0QCCVAIJQAgVACBEIJEAglQCCUAIFQAgS/AVPOYnIQS7DnAAAAAElFTkSuQmCC",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# we want colors that are categorical, since Channel is a non-ordered category (yes, they are numbered, but arbitrarily). \n",
+ "# A categorical color palette will have dissimilar colors.\n",
+ "# Get those unique colors\n",
+ "if len(metadata.Channel.unique()) > 10:\n",
+ " print(\"WARNING: There are more unique channel values than \\\n",
+ " there are colors to choose from. Select different palette, e.g., \\\n",
+ " continuous palette 'husl'.\")\n",
+ "channel_color_values = sb.color_palette(\"bright\",n_colors = len(metadata.Channel.unique()))\n",
+ "# chose 'colorblind' because it is categorical and we're unlikely to have > 10\n",
+ "\n",
+ "# You can customize the colors for each channel here\n",
+ "custom_colors = {\n",
+ " 'c2': 'lightgreen',\n",
+ " 'c3': 'tomato',\n",
+ " 'c4': 'pink',\n",
+ " 'c5': 'turquoise'\n",
+ "}\n",
+ "\n",
+ "custom_colors_values = sb.palplot(sb.color_palette([custom_colors.get(ch, 'blue') for ch in metadata.Channel.unique()]))\n",
+ "\n",
+ "# Display those unique customs colors\n",
+ "print(\"Unique channels are:\", metadata.Channel.unique())\n",
+ "sb.palplot(sb.color_palette(channel_color_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "id": "e7aa9d2e-94b5-461b-859f-fadfa2ccc0c5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'c2': array([0.00784314, 0.24313725, 1. ]),\n",
+ " 'c3': array([1. , 0.48627451, 0. ]),\n",
+ " 'c4': array([0.10196078, 0.78823529, 0.21960784]),\n",
+ " 'c5': array([0.90980392, 0. , 0.04313725])}"
+ ]
+ },
+ "execution_count": 52,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Store in a dictionary\n",
+ "channel_color_dict = dict(zip(metadata.Channel.unique(), channel_color_values))\n",
+ "channel_color_dict\n",
+ "for k,v in channel_color_dict.items():\n",
+ " channel_color_dict[k] = np.float64(v)\n",
+ "\n",
+ "channel_color_dict"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "id": "aa2d6cf5-2126-4df4-a54f-c6926c2c06a1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " rgb \n",
+ " hex \n",
+ " Channel \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " c2 \n",
+ " (0.00784313725490196, 0.24313725490196078, 1.0) \n",
+ " #023eff \n",
+ " c2 \n",
+ " \n",
+ " \n",
+ " c3 \n",
+ " (1.0, 0.48627450980392156, 0.0) \n",
+ " #ff7c00 \n",
+ " c3 \n",
+ " \n",
+ " \n",
+ " c4 \n",
+ " (0.10196078431372549, 0.788235294117647, 0.219... \n",
+ " #1ac938 \n",
+ " c4 \n",
+ " \n",
+ " \n",
+ " c5 \n",
+ " (0.9098039215686274, 0.0, 0.043137254901960784) \n",
+ " #e8000b \n",
+ " c5 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " rgb hex Channel\n",
+ "c2 (0.00784313725490196, 0.24313725490196078, 1.0) #023eff c2\n",
+ "c3 (1.0, 0.48627450980392156, 0.0) #ff7c00 c3\n",
+ "c4 (0.10196078431372549, 0.788235294117647, 0.219... #1ac938 c4\n",
+ "c5 (0.9098039215686274, 0.0, 0.043137254901960784) #e8000b c5"
+ ]
+ },
+ "execution_count": 53,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "color_df_channel = color_dict_to_df(channel_color_dict, \"Channel\")\n",
+ "\n",
+ "# Save to file in metadatadirectory\n",
+ "filename = \"channel_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "color_df_channel.to_csv(filename, index = False)\n",
+ "\n",
+ "color_df_channel"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "id": "d8117d2d-c60e-477c-bef4-dc89d18fa6aa",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Legend of channel info only\n",
+ "g = plt.figure(figsize = (1,1)).add_subplot(111)\n",
+ "g.axis('off')\n",
+ "handles = []\n",
+ "for item in channel_color_dict.keys():\n",
+ " h = g.bar(0,0, color = channel_color_dict[item],\n",
+ " label = item, linewidth =0)\n",
+ " handles.append(h)\n",
+ "first_legend = plt.legend(handles=handles, loc='upper right', title = 'Channel'),\n",
+ " # bbox_to_anchor=(10,10), \n",
+ " # bbox_transform=plt.gcf().transFigure)\n",
+ "\n",
+ "filename = \"Channel_legend.png\"\n",
+ "filename = os.path.join(metadata_images_dir, filename)\n",
+ "plt.savefig(filename, bbox_inches = 'tight')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b5d587ec-809c-4312-acda-3747fc63fd83",
+ "metadata": {},
+ "source": [
+ "### I.7.2. ROUNDS COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "id": "40bedb40-5740-4956-aa97-a95ac9fb341a",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['R0' 'R1' 'R2' 'R3' 'R4' 'R5' 'R6' 'R7' 'R8']\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAs0AAABlCAYAAAC2n94rAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAD40lEQVR4nO3cwU5jBRiG4b+lUBDbzmAmUUJNTLwDvQB3XoAXxK25NvEipAk7NpQKQeG4MGqchPnOOQ6eOcPzbGnIn4+SvpDCpGmapgAAgCdNhz4AAAA+dKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQzNo86PHxsS4vL2uxWNRkMnnumwAA4H/RNE1tt9s6PT2t6fTp3ye3iubLy8tar9fv7TgAAPiQbDabOjs7e/LjraJ5sVhUVdV3629qNt17P5e9AJ+9/nroE0bp+M1XQ58wOvt+qO1l7+z10CeM0uHZ0dAnjM6rL1q93PKWz9/YrasvX30y9Amjs7vZ1Q/ffv937z6l1bPxr7dkzKZ7tT/1BG7rYO9g6BNG6WD/cOgTRmf/QMT0MTv04tLH/MhuXR0ee+3s4+hTu3V1vDge+oTRSm9B9oeAAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQzNo8qGmaqqr6/fHhWY/52Nw/3A99wijt/3Y39Amj09zfDn3CKD3c/Tr0CaM0uW2GPmF07natXm55y+2N3brazXx/drW72VXVP737lFbPxqurq6qq+nHz838864X55aehLwAAoIXtdlur1erJj7eK5pOTk6qquri4eOcn49+ur69rvV7XZrOp5XI59DmjYLN+7NadzfqxW3c268du3dmsn6Zparvd1unp6Tsf1yqap9M/3/q8Wq18EXpYLpd268hm/ditO5v1Y7fubNaP3bqzWXdtfinsDwEBACAQzQAAELSK5vl8Xufn5zWfz5/7no+K3bqzWT92685m/ditO5v1Y7fubPa8Jk36/xoAAPDCeXsGAAAEohkAAALRDAAAgWgGAIBANAMAQCCaAQAgEM0AABCIZgAACP4AgRCVeH0RRYAAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# we want colors that are sequential, since Round is an ordered category. \n",
+ "# We can still generate colors that are easy to distinguish. Also, many of the categorical palettes cap at at about 10 or so unique colors, and repeat from there. \n",
+ "# We do not want any repeats!\n",
+ "round_color_values = sb.cubehelix_palette(\n",
+ " len(metadata.Round.unique()), start=1, rot= -0.75, dark=0.19, light=.85, reverse=True)\n",
+ "# round_color_values = sb.color_palette(\"cubehelix\",n_colors = len(metadata.Round.unique()))\n",
+ "# chose 'cubehelix' because it is sequential, and round is a continuous process\n",
+ "# each color value is a tuple of three values: (R, G, B)\n",
+ "print(metadata.Round.unique())\n",
+ "\n",
+ "sb.palplot(sb.color_palette(round_color_values))\n",
+ "\n",
+ "## TO-DO: write what these parameters mean"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "id": "4372b4f0-2242-4d76-8881-a78fba5fd814",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'R0': array([0.28685356, 0.13009829, 0.23110332]),\n",
+ " 'R1': array([0.36541462, 0.2025447 , 0.3769331 ]),\n",
+ " 'R2': array([0.40867533, 0.29407612, 0.51667119]),\n",
+ " 'R3': array([0.42890614, 0.40822902, 0.63353489]),\n",
+ " 'R4': array([0.44444629, 0.5264665 , 0.70563219]),\n",
+ " 'R5': array([0.47707206, 0.64270618, 0.74184779]),\n",
+ " 'R6': array([0.54144549, 0.74667592, 0.75729058]),\n",
+ " 'R7': array([0.64147101, 0.83215511, 0.7746773 ]),\n",
+ " 'R8': array([0.76842569, 0.89926671, 0.81713833])}"
+ ]
+ },
+ "execution_count": 56,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Store in a dictionary\n",
+ "round_color_dict = dict(zip(metadata.Round.unique(), round_color_values))\n",
+ "\n",
+ "for k,v in round_color_dict.items():\n",
+ " round_color_dict[k] = np.float64(v)\n",
+ "\n",
+ "round_color_dict"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "id": "3a6053ce-d87c-4137-8c70-a6772208fc37",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " rgb \n",
+ " hex \n",
+ " Round \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " R0 \n",
+ " (0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ " #49213b \n",
+ " R0 \n",
+ " \n",
+ " \n",
+ " R1 \n",
+ " (0.36541462435986094, 0.2025447048359916, 0.37... \n",
+ " #5d3460 \n",
+ " R1 \n",
+ " \n",
+ " \n",
+ " R2 \n",
+ " (0.40867533458903105, 0.2940761173840091, 0.51... \n",
+ " #684b84 \n",
+ " R2 \n",
+ " \n",
+ " \n",
+ " R3 \n",
+ " (0.42890613750051265, 0.4082290173220481, 0.63... \n",
+ " #6d68a2 \n",
+ " R3 \n",
+ " \n",
+ " \n",
+ " R4 \n",
+ " (0.4444462906865238, 0.5264664993764805, 0.705... \n",
+ " #7186b4 \n",
+ " R4 \n",
+ " \n",
+ " \n",
+ " R5 \n",
+ " (0.47707206309601013, 0.6427061780374552, 0.74... \n",
+ " #7aa4bd \n",
+ " R5 \n",
+ " \n",
+ " \n",
+ " R6 \n",
+ " (0.5414454866716836, 0.7466759172596551, 0.757... \n",
+ " #8abec1 \n",
+ " R6 \n",
+ " \n",
+ " \n",
+ " R7 \n",
+ " (0.6414710091647722, 0.8321551072276492, 0.774... \n",
+ " #a4d4c6 \n",
+ " R7 \n",
+ " \n",
+ " \n",
+ " R8 \n",
+ " (0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ " #c4e5d0 \n",
+ " R8 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " rgb hex Round\n",
+ "R0 (0.28685356234627135, 0.13009829239513535, 0.2... #49213b R0\n",
+ "R1 (0.36541462435986094, 0.2025447048359916, 0.37... #5d3460 R1\n",
+ "R2 (0.40867533458903105, 0.2940761173840091, 0.51... #684b84 R2\n",
+ "R3 (0.42890613750051265, 0.4082290173220481, 0.63... #6d68a2 R3\n",
+ "R4 (0.4444462906865238, 0.5264664993764805, 0.705... #7186b4 R4\n",
+ "R5 (0.47707206309601013, 0.6427061780374552, 0.74... #7aa4bd R5\n",
+ "R6 (0.5414454866716836, 0.7466759172596551, 0.757... #8abec1 R6\n",
+ "R7 (0.6414710091647722, 0.8321551072276492, 0.774... #a4d4c6 R7\n",
+ "R8 (0.7684256891219349, 0.8992667116749021, 0.817... #c4e5d0 R8"
+ ]
+ },
+ "execution_count": 57,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "color_df_round = color_dict_to_df(round_color_dict, \"Round\")\n",
+ "\n",
+ "# Save to file in metadatadirectory\n",
+ "filename = \"round_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "color_df_round.to_csv(filename, index = False)\n",
+ "\n",
+ "color_df_round"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "id": "977a7e45-64df-4bd6-ab21-cecd44d76fd9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Legend of round info only\n",
+ "\n",
+ "round_legend = plt.figure(figsize = (1,1)).add_subplot(111)\n",
+ "round_legend.axis('off')\n",
+ "handles = []\n",
+ "for item in round_color_dict.keys():\n",
+ " h = round_legend.bar(0,0, color = round_color_dict[item],\n",
+ " label = item, linewidth =0)\n",
+ " handles.append(h)\n",
+ "first_legend = plt.legend(handles=handles, loc='upper right', title = 'Round'),\n",
+ " # bbox_to_anchor=(10,10), \n",
+ " # bbox_transform=plt.gcf().transFigure)\n",
+ "\n",
+ "filename = \"Round_legend.png\"\n",
+ "filename = os.path.join(metadata_images_dir, filename)\n",
+ "plt.savefig(filename, bbox_inches = 'tight')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "34b81c62-58a4-432c-876a-dfa5df0bbe9e",
+ "metadata": {},
+ "source": [
+ "### I.7.3. SAMPLES COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "id": "3ccb74da-fb1d-4fda-9116-bf6b6a6d868b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUoAAABlCAYAAAArpKpSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAACuUlEQVR4nO3ZMWsTcRzG8V9SaVohCXQMydTB2ffhu3BxEFzduvhWuvqGhA49yAvogSmCPQdRJ/NcW8P17Ocz/4eHf+DLXW7SdV1XAPzVdOgBAE+dUAIEQgkQCCVAIJQAgVACBEIJELzoc+ju7q62223N5/OaTCaH3gRwcF3XVdu2tVqtajrd/8zYK5Tb7bY2m80/GQfwlDRNU+v1eu+ZXqGcz+dVVfXl7ceaH588ftkzcfn689ATRuny5P3QE0bn3fWboSeMzu62rQ+fXv3u2z69QvnrdXt+fFKLmVD2dXp6NPSEUTo6fTn0hNE5PVkMPWG0+vyd6GMOQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQPCiz6Gu66qqqv12e9Ax/5vd7vvQE0bpe/d16Amjs7u9GXrC6Oxu26r607d9Jl2PU1dXV3V+fv74ZQBPTNM0tV6v957p9UR5dnZWVVXX19e1XC4fv+yZuLm5qc1mU03T1GKxGHrOKLizh3Fv99d1XbVtW6vVKp7tFcrp9Odfmcvl0o/wAIvFwr3dkzt7GPd2P30f/HzMAQiEEiDoFcrZbFYXFxc1m80Ovee/4t7uz509jHs7rF5fvQGeM6/eAIFQAgRCCRAIJUAglACBUAIEQgkQCCVA8ANJyGd00cXSZwAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# we want colors that are neither sequential nor categorical. \n",
+ "# Categorical would be ideal if we could generate an arbitrary number of colors, but I do not think that we can. \n",
+ "# Hense, we will choose `n` colors from a continuous palette. First we will generate the right number of colors. Later, we will assign TMA samples to gray.\n",
+ "\n",
+ "# Get those unique colors\n",
+ "color_values = sb.color_palette(\"husl\",n_colors = len(ls_samples))#'HLS'\n",
+ "# each color value is a tuple of three values: (R, G, B)\n",
+ "\n",
+ "# Display those unique colors\n",
+ "sb.palplot(sb.color_palette(color_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "id": "441a57fe-d55a-49e1-8593-0f1939472b89",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGEAAABlCAYAAABdl421AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAABwUlEQVR4nO3dP2oCQRxH8e9KYGzWBUtv6Qk8gie0ccELWNk4KcIGUqiDRnyJ7wPTuTDM2z92v67WWqOXmr16AzICghEAjABgBAAjABgB4KPlR+fzOYfDIX3fp+u6Z+/p36i15ng8ZrVaZTa7cr/XBuM41iSuO9c4jlfPt+lJ6Ps+SbJer1NKablESU6nU7bb7ff5XdIUYXoFlVIyn88f392bufUK98MMYAQAIwAYAcAIAEYAMAKAEQCMAGAEACMAGAHACABGADACgBEAjABgBAAjABgBwAgARgAwAoARAIwAYAQAIwAYAcAIAEYAMAKAEQCMAGAEACMAGAHACABGADACgBEAjABgBAAjABgBwAgARgAwAoARAIwAYAQAIwAYAcAIAEYAMAKAEQCMAGAEACMAGAHACABGADACgBEAjABgBAAjABgBwAgARgAwAoARAIwA0DRxsNaa5GuModpN5zWd30UtA1B3u93Lh4j+5fUrA1CXy2WSZL/fZxiGlkuU/BgFfE1ThGmW8DAMWSwWj+/ujbTctH6YAYwA0BShlJLNZuNA7Cfp6s3/T3o2X0cARgAwAoARAIwAYAQAIwAYAeATtddd94S3hxMAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "TMA_samples = [s for s in df.Sample_ID.unique() if 'TMA' in s]\n",
+ "TMA_color_values = sb.color_palette(n_colors = len(TMA_samples),palette = \"gray\")\n",
+ "sb.palplot(sb.color_palette(TMA_color_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "id": "18dbf741-983e-4652-97d1-d55e87eba4fb",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'DD3S1.csv': (0.9677975592919913, 0.44127456009157356, 0.5358103155058701),\n",
+ " 'DD3S2.csv': (0.5920891529639701, 0.6418467016378244, 0.1935069134991043),\n",
+ " 'DD3S3.csv': (0.21044753832183283, 0.6773105080456748, 0.6433941168468681),\n",
+ " 'TMA.csv': (0.5019607843137255, 0.5019607843137255, 0.5019607843137255)}"
+ ]
+ },
+ "execution_count": 61,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Store in a dictionary\n",
+ "color_dict = dict()\n",
+ "color_dict = dict(zip(df.Sample_ID.unique(), color_values))\n",
+ "\n",
+ "# Replace all TMA samples' colors with gray\n",
+ "i = 0\n",
+ "for key in color_dict.keys():\n",
+ " if 'TMA' in key:\n",
+ " color_dict[key] = TMA_color_values[i]\n",
+ " i +=1\n",
+ "\n",
+ "color_dict"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "id": "807f2bb5-6d19-4086-81c1-98836e850dcd",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " rgb \n",
+ " hex \n",
+ " Sample_ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1.csv \n",
+ " (0.9677975592919913, 0.44127456009157356, 0.53... \n",
+ " #f77189 \n",
+ " DD3S1.csv \n",
+ " \n",
+ " \n",
+ " DD3S2.csv \n",
+ " (0.5920891529639701, 0.6418467016378244, 0.193... \n",
+ " #97a431 \n",
+ " DD3S2.csv \n",
+ " \n",
+ " \n",
+ " DD3S3.csv \n",
+ " (0.21044753832183283, 0.6773105080456748, 0.64... \n",
+ " #36ada4 \n",
+ " DD3S3.csv \n",
+ " \n",
+ " \n",
+ " TMA.csv \n",
+ " (0.5019607843137255, 0.5019607843137255, 0.501... \n",
+ " #808080 \n",
+ " TMA.csv \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " rgb hex \\\n",
+ "DD3S1.csv (0.9677975592919913, 0.44127456009157356, 0.53... #f77189 \n",
+ "DD3S2.csv (0.5920891529639701, 0.6418467016378244, 0.193... #97a431 \n",
+ "DD3S3.csv (0.21044753832183283, 0.6773105080456748, 0.64... #36ada4 \n",
+ "TMA.csv (0.5019607843137255, 0.5019607843137255, 0.501... #808080 \n",
+ "\n",
+ " Sample_ID \n",
+ "DD3S1.csv DD3S1.csv \n",
+ "DD3S2.csv DD3S2.csv \n",
+ "DD3S3.csv DD3S3.csv \n",
+ "TMA.csv TMA.csv "
+ ]
+ },
+ "execution_count": 62,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "color_df_sample = color_dict_to_df(color_dict, \"Sample_ID\")\n",
+ "\n",
+ "# Save to file in metadatadirectory\n",
+ "filename = \"sample_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "color_df_sample.to_csv(filename, index = False)\n",
+ "\n",
+ "color_df_sample"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "id": "39b6afdb-2e37-471e-86a0-e55ab7667e39",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Legend of sample info only\n",
+ "g = plt.figure(figsize = (1,1)).add_subplot(111)\n",
+ "g.axis('off')\n",
+ "handles = []\n",
+ "for item in color_dict.keys():\n",
+ " h = g.bar(0,0, color = color_dict[item],\n",
+ " label = item, linewidth =0)\n",
+ " handles.append(h)\n",
+ "first_legend = plt.legend(handles=handles, loc='upper right', title = 'Sample')\n",
+ "\n",
+ "filename = \"Sample_legend.png\"\n",
+ "filename = os.path.join(metadata_images_dir, filename)\n",
+ "plt.savefig(filename, bbox_inches = 'tight')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e3cf0dea-43db-41fa-952e-bbba53e89cdb",
+ "metadata": {},
+ "source": [
+ "### I.7.4. CLUSTERS COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "id": "d37c61d7-de64-4b7c-8d01-86ee16ac67c4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "if 'cluster' in df.columns:\n",
+ " cluster_color_values = sb.color_palette(\"hls\",n_colors = len(df.cluster.unique()))\n",
+ "\n",
+ " print(sorted(test_df.cluster.unique()))\n",
+ " # Display those unique colors\n",
+ " sb.palplot(sb.color_palette(cluster_color_values))\n",
+ " \n",
+ " cluster_color_dict = dict(zip(sorted(test_df.cluster.unique()), cluster_color_values))\n",
+ " print(cluster_color_dict)\n",
+ " \n",
+ " # Create dataframe\n",
+ " cluster_color_df = color_dict_to_df(cluster_color_dict, \"cluster\")\n",
+ " cluster_color_df.head()\n",
+ "\n",
+ " # Save to file in metadatadirectory\n",
+ " filename = \"cluster_color_data.csv\"\n",
+ " filename = os.path.join(metadata_dir, filename)\n",
+ " cluster_color_df.to_csv(filename, index = False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "id": "c9215452-fdb6-4963-9f56-31f16e0483bb",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Legend of cluster info only\n",
+ "\n",
+ "if 'cluster' in df.columns:\n",
+ " g = plt.figure(figsize = (1,1)).add_subplot(111)\n",
+ " g.axis('off')\n",
+ " handles = []\n",
+ " for item in sorted(cluster_color_dict.keys()):\n",
+ " h = g.bar(0,0, color = cluster_color_dict[item],\n",
+ " label = item, linewidth =0)\n",
+ " handles.append(h)\n",
+ " first_legend = plt.legend(handles=handles, loc='upper right', title = 'Cluster'),\n",
+ "\n",
+ "\n",
+ " filename = \"Clustertype_legend.png\"\n",
+ " filename = os.path.join(metadata_images_dir, filename)\n",
+ " plt.savefig(filename, bbox_inches = 'tight')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "id": "715409aa",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Round \n",
+ " Target \n",
+ " Exp \n",
+ " Channel \n",
+ " target_lower \n",
+ " full_column \n",
+ " marker \n",
+ " localisation \n",
+ " round_color \n",
+ " channel_color \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488 \n",
+ " cell \n",
+ " [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ " [0.00784313725490196, 0.24313725490196078, 1.0] \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488 \n",
+ " cytoplasm \n",
+ " [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ " [0.00784313725490196, 0.24313725490196078, 1.0] \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " AF488 \n",
+ " nucleus \n",
+ " [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ " [0.00784313725490196, 0.24313725490196078, 1.0] \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " AF555 \n",
+ " cell \n",
+ " [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ " [1.0, 0.48627450980392156, 0.0] \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " AF555 \n",
+ " cytoplasm \n",
+ " [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ " [1.0, 0.48627450980392156, 0.0] \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " R8 \n",
+ " Sting \n",
+ " 1000 \n",
+ " c4 \n",
+ " sting \n",
+ " Sting_Cytoplasm_Intensity_Average \n",
+ " Sting \n",
+ " cytoplasm \n",
+ " [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ " [0.10196078431372549, 0.788235294117647, 0.219... \n",
+ " \n",
+ " \n",
+ " 104 \n",
+ " R8 \n",
+ " Sting \n",
+ " 1000 \n",
+ " c4 \n",
+ " sting \n",
+ " Sting_Nucleus_Intensity_Average \n",
+ " Sting \n",
+ " nucleus \n",
+ " [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ " [0.10196078431372549, 0.788235294117647, 0.219... \n",
+ " \n",
+ " \n",
+ " 105 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Cell_Intensity_Average \n",
+ " CD11b \n",
+ " cell \n",
+ " [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ " [0.9098039215686274, 0.0, 0.043137254901960784] \n",
+ " \n",
+ " \n",
+ " 106 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Cytoplasm_Intensity_Average \n",
+ " CD11b \n",
+ " cytoplasm \n",
+ " [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ " [0.9098039215686274, 0.0, 0.043137254901960784] \n",
+ " \n",
+ " \n",
+ " 107 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Nucleus_Intensity_Average \n",
+ " CD11b \n",
+ " nucleus \n",
+ " [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ " [0.9098039215686274, 0.0, 0.043137254901960784] \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
108 rows Ć 10 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Round Target Exp Channel target_lower \\\n",
+ "0 R0 AF488 300 c2 af488 \n",
+ "1 R0 AF488 300 c2 af488 \n",
+ "2 R0 AF488 300 c2 af488 \n",
+ "3 R0 AF555 1500 c3 af555 \n",
+ "4 R0 AF555 1500 c3 af555 \n",
+ ".. ... ... ... ... ... \n",
+ "103 R8 Sting 1000 c4 sting \n",
+ "104 R8 Sting 1000 c4 sting \n",
+ "105 R8 CD11b 1500 c5 cd11b \n",
+ "106 R8 CD11b 1500 c5 cd11b \n",
+ "107 R8 CD11b 1500 c5 cd11b \n",
+ "\n",
+ " full_column marker localisation \\\n",
+ "0 AF488_Cell_Intensity_Average AF488 cell \n",
+ "1 AF488_Cytoplasm_Intensity_Average AF488 cytoplasm \n",
+ "2 AF488_Nucleus_Intensity_Average AF488 nucleus \n",
+ "3 AF555_Cell_Intensity_Average AF555 cell \n",
+ "4 AF555_Cytoplasm_Intensity_Average AF555 cytoplasm \n",
+ ".. ... ... ... \n",
+ "103 Sting_Cytoplasm_Intensity_Average Sting cytoplasm \n",
+ "104 Sting_Nucleus_Intensity_Average Sting nucleus \n",
+ "105 CD11b_Cell_Intensity_Average CD11b cell \n",
+ "106 CD11b_Cytoplasm_Intensity_Average CD11b cytoplasm \n",
+ "107 CD11b_Nucleus_Intensity_Average CD11b nucleus \n",
+ "\n",
+ " round_color \\\n",
+ "0 [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ "1 [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ "2 [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ "3 [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ "4 [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ ".. ... \n",
+ "103 [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ "104 [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ "105 [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ "106 [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ "107 [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ "\n",
+ " channel_color \n",
+ "0 [0.00784313725490196, 0.24313725490196078, 1.0] \n",
+ "1 [0.00784313725490196, 0.24313725490196078, 1.0] \n",
+ "2 [0.00784313725490196, 0.24313725490196078, 1.0] \n",
+ "3 [1.0, 0.48627450980392156, 0.0] \n",
+ "4 [1.0, 0.48627450980392156, 0.0] \n",
+ ".. ... \n",
+ "103 [0.10196078431372549, 0.788235294117647, 0.219... \n",
+ "104 [0.10196078431372549, 0.788235294117647, 0.219... \n",
+ "105 [0.9098039215686274, 0.0, 0.043137254901960784] \n",
+ "106 [0.9098039215686274, 0.0, 0.043137254901960784] \n",
+ "107 [0.9098039215686274, 0.0, 0.043137254901960784] \n",
+ "\n",
+ "[108 rows x 10 columns]"
+ ]
+ },
+ "execution_count": 66,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Add in the color information in both RGB (range 0-1) and hex values, for use in visualizations\n",
+ "metadata['round_color'] = metadata.apply(lambda row: round_color_dict[row['Round']], axis = 1)\n",
+ "metadata['channel_color'] = metadata.apply(lambda row: channel_color_dict[row['Channel']], axis = 1)\n",
+ "\n",
+ "metadata"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 78,
+ "id": "9cca88fa",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import hvplot.pandas\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import panel as pn\n",
+ "\n",
+ "PRIMARY_COLOR = \"#0072B5\"\n",
+ "SECONDARY_COLOR = \"#B54300\"\n",
+ "CSV_FILE = (\n",
+ " \"https://raw.githubusercontent.com/holoviz/panel/main/examples/assets/occupancy.csv\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 79,
+ "id": "3c7402e9",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "def transform_data(variable, window, sigma):\n",
+ " \"\"\"Calculates the rolling average and identifies outliers\"\"\"\n",
+ " avg = metadata[variable].rolling(window=window).mean()\n",
+ " residual = metadata[variable] - avg\n",
+ " std = residual.rolling(window=window).std()\n",
+ " outliers = np.abs(residual) > std * sigma\n",
+ " return avg, avg[outliers]\n",
+ "\n",
+ "\n",
+ "def get_plot(variable=\"Exp\", window=30, sigma=10):\n",
+ " \"\"\"Plots the rolling average and the outliers\"\"\"\n",
+ " avg, highlight = transform_data(variable, window, sigma)\n",
+ " return avg.hvplot(\n",
+ " height=300, legend=False, color=PRIMARY_COLOR\n",
+ " ) * highlight.hvplot.scatter(color=SECONDARY_COLOR, padding=0.1, legend=False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 80,
+ "id": "38636bb3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "variable_widget = pn.widgets.Select(name=\"Target\", value=\"Exp\", options=list(metadata.columns))\n",
+ "window_widget = pn.widgets.IntSlider(name=\"window\", value=30, start=1, end=60)\n",
+ "sigma_widget = pn.widgets.IntSlider(name=\"sigma\", value=10, start=0, end=20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 81,
+ "id": "a4785336",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {},
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.holoviews_exec.v0+json": "",
+ "text/html": [
+ "\n",
+ ""
+ ],
+ "text/plain": [
+ ":Overlay\n",
+ " .Curve.Exp :Curve [index] (Exp)\n",
+ " .Scatter.Exp :Scatter [index] (Exp)"
+ ]
+ },
+ "execution_count": 81,
+ "metadata": {
+ "application/vnd.holoviews_exec.v0+json": {
+ "id": "8c06a97e-378a-4028-a51c-8b8fbb1cf019"
+ }
+ },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "get_plot(variable='Exp', window=20, sigma=10)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 82,
+ "id": "39f7b3e6",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "bound_plot = pn.bind(\n",
+ " get_plot, variable=variable_widget, window=window_widget, sigma=sigma_widget\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 83,
+ "id": "c58b4fb2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {},
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {},
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.holoviews_exec.v0+json": "",
+ "text/html": [
+ "\n",
+ ""
+ ],
+ "text/plain": [
+ "Column\n",
+ " [0] Column(sizing_mode='fixed', width=300)\n",
+ " [0] Select(name='Target', options=['Round', 'Target', ...], value='Exp')\n",
+ " [1] IntSlider(end=60, name='window', start=1, value=30)\n",
+ " [2] IntSlider(end=20, name='sigma', value=10)\n",
+ " [1] ParamFunction(function, _pane=HoloViews, defer_load=False)"
+ ]
+ },
+ "execution_count": 83,
+ "metadata": {
+ "application/vnd.holoviews_exec.v0+json": {
+ "id": "31cb1aa6-32cb-4971-9559-0aecc17d32d4"
+ }
+ },
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "widgets = pn.Column(variable_widget, window_widget, sigma_widget, sizing_mode=\"fixed\", width=300)\n",
+ "pn.Column(widgets, bound_plot)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f0642911-7a0b-49f6-9598-c8975b188807",
+ "metadata": {},
+ "source": [
+ "## I.8. SAVE"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "id": "67b33926-3ecf-415d-b67e-09d1054eab62",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Do you want to overwrite all existing files without confirmation? (yes/no): \n"
+ ]
+ },
+ {
+ "ename": "KeyboardInterrupt",
+ "evalue": "Interrupted by user",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[0;32mIn[68], line 13\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFile \u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m+\u001b[39m filename \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m was overwritten!\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 12\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m---> 13\u001b[0m user_response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28minput\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFile by name \u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m+\u001b[39m filename \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m already exists. Do you want to overwrite it? (yes/no): \u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 14\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m user_response\u001b[38;5;241m.\u001b[39mlower()\u001b[38;5;241m.\u001b[39mstrip() \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124myes\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m 15\u001b[0m df_save \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mloc[df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mSample_ID\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m==\u001b[39m sample, :]\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/ipykernel/kernelbase.py:1262\u001b[0m, in \u001b[0;36mKernel.raw_input\u001b[0;34m(self, prompt)\u001b[0m\n\u001b[1;32m 1260\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mraw_input was called, but this frontend does not support input requests.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1261\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m StdinNotImplementedError(msg)\n\u001b[0;32m-> 1262\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_input_request(\n\u001b[1;32m 1263\u001b[0m \u001b[38;5;28mstr\u001b[39m(prompt),\n\u001b[1;32m 1264\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_parent_ident[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m],\n\u001b[1;32m 1265\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_parent(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshell\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[1;32m 1266\u001b[0m password\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[1;32m 1267\u001b[0m )\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/ipykernel/kernelbase.py:1305\u001b[0m, in \u001b[0;36mKernel._input_request\u001b[0;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[1;32m 1302\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m:\n\u001b[1;32m 1303\u001b[0m \u001b[38;5;66;03m# re-raise KeyboardInterrupt, to truncate traceback\u001b[39;00m\n\u001b[1;32m 1304\u001b[0m msg \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInterrupted by user\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m-> 1305\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyboardInterrupt\u001b[39;00m(msg) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 1306\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[1;32m 1307\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlog\u001b[38;5;241m.\u001b[39mwarning(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid Message:\u001b[39m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n",
+ "\u001b[0;31mKeyboardInterrupt\u001b[0m: Interrupted by user"
+ ]
+ }
+ ],
+ "source": [
+ "overwrite_all = input(\"Do you want to overwrite all existing files without confirmation? (yes/no): \")\n",
+ "overwrite_all = overwrite_all.lower().strip()\n",
+ "\n",
+ "for sample in ls_samples:\n",
+ " sample_id = sample.split('.csv')[0]\n",
+ " filename = os.path.join(output_data_dir, sample_id + \"_\" + step_suffix + \".csv\")\n",
+ " if os.path.exists(filename):\n",
+ " if overwrite_all == 'yes':\n",
+ " df_save = df.loc[df['Sample_ID'] == sample, :]\n",
+ " df_save.to_csv(filename, index=True, index_label='ID', mode='w') # 'mode='w'' overwrites the file\n",
+ " print(\"File \" + filename + \" was overwritten!\")\n",
+ " else:\n",
+ " user_response = input(\"File by name \" + filename + \" already exists. Do you want to overwrite it? (yes/no): \")\n",
+ " if user_response.lower().strip() == 'yes':\n",
+ " df_save = df.loc[df['Sample_ID'] == sample, :]\n",
+ " df_save.to_csv(filename, index=True, index_label='ID', mode='w') # 'mode='w'' overwrites the file\n",
+ " print(\"File \" + filename + \" was overwritten!\")\n",
+ " else:\n",
+ " print(\"File was not overwritten. Moving to the next sample.\")\n",
+ " else:\n",
+ " df_save = df.loc[df['Sample_ID'] == sample, :]\n",
+ " df_save.to_csv(filename, index=True, index_label='ID') # Save normally if the file doesn't exist\n",
+ " print(\"File \" + filename + \" was created and saved !\")\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e41a9fb8",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "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.11.7"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/wetransfer_data-zip_2024-05-17_1431/1_qc_eda.ipynb b/wetransfer_data-zip_2024-05-17_1431/1_qc_eda.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..c756446bc7333b3d6a8ed930a68cd435518db9da
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/1_qc_eda.ipynb
@@ -0,0 +1,3695 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "5fad9226-7ffa-41fc-a6d8-55dcdd1c9eb5",
+ "metadata": {},
+ "source": [
+ "# CyCIF PYTHON PIPELINE"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "8337a11b-813a-4abd-8a5e-45a1dcde430f",
+ "metadata": {},
+ "source": [
+ "This sequence of Jupiter Notebooks is designed to run the CyCIF analysis after the ASHLAR registratiom step.\n",
+ "When a '*' is on a part name (see the table of content to your left), it means the user have an input to give.\n",
+ "The pipeline is composed of 5 Notebooks (see README file)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "87b047ee-225e-415d-a0ae-17f30c0d5f35",
+ "metadata": {},
+ "source": [
+ "# I. QC/EDA NOTEBOOK"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "fbb817d5-aee1-447a-a8dd-786bbd3cc381",
+ "metadata": {},
+ "source": [
+ "10/01/24\n",
+ "Modifications by ZoƩ Gerber\n",
+ "from an original code from Marilyne Labrie"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "a48dc9ff-3dd1-4f86-bbb5-68bc6254b787",
+ "metadata": {},
+ "source": [
+ "I.1. PACKAGES IMPORT\n",
+ "I.2. DIRECTORIES\n",
+ "I.3. FILES\n",
+ " I.3.1. DATA\n",
+ " I.3.2. NOT_INTENSITIES\n",
+ "I.4. QC CHECKS\n",
+ "I.5. COLUMNS OF INTERESTS\n",
+ "I.6. EXPOSURE TIME\n",
+ "I.7. COLORS WORKFLOW\n",
+ " I.7.1. CHANNELS COLORS\n",
+ " I.7.2. ROUNDS COLORS\n",
+ " I.7.3. SAMPLES COLORS\n",
+ " I.7.4. CLUSTERS COLORS\n",
+ "I.8. SAVE"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "46755cfd-7896-4ca0-ba50-6792612e7650",
+ "metadata": {},
+ "source": [
+ "## I.1. PACKAGES IMPORT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "d52f4de4-6db2-4590-9574-326ccf5bc97e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import warnings\n",
+ "import os\n",
+ "import plotly as plt\n",
+ "import seaborn as sb\n",
+ "\n",
+ "from my_modules import *"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "9936cc24-34f7-41b5-b184-94a8f2237b05",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "#Silence FutureWarnings & UserWarnings\n",
+ "warnings.filterwarnings('ignore', category= FutureWarning)\n",
+ "warnings.filterwarnings('ignore', category= UserWarning)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b179f303-c098-4c30-b4b9-df10db6c485a",
+ "metadata": {},
+ "source": [
+ "## I.2. *DIRECTORIES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "849b1dd3-c940-4c7a-8cf6-2fd5b4dc43f4",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "/Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Set base directory\n",
+ "\n",
+ "directorio_actual = os.getcwd()\n",
+ "print(directorio_actual)\n",
+ "\n",
+ "##### MAC WORKSTATION #####\n",
+ "#base_dir = r'/Volumes/LaboLabrie/Projets/OC_TMA_Pejovic/Temp/Zoe/CyCIF_pipeline/'\n",
+ "###########################\n",
+ "\n",
+ "##### WINDOWS WORKSTATION #####\n",
+ "#base_dir = r'C:\\Users\\LaboLabrie\\gerz2701\\cyCIF-pipeline\\Set_B'\n",
+ "###############################\n",
+ "\n",
+ "##### LOCAL WORKSTATION #####\n",
+ "base_dir = r'/Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/'\n",
+ "#############################\n",
+ "\n",
+ "#set_name = 'Set_A'\n",
+ "set_name = 'test'"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "1f68584f-c1f6-49cd-99f8-5a7cc8aae26e",
+ "metadata": {},
+ "source": [
+ "The project is organized as :\n",
+ "main dir \n",
+ " code\n",
+ " proj_data > all input csv files\n",
+ " proj_metadata > exposure time csv file, images dir,...\n",
+ " proj_qc_eda > csv after the QC/EDA step"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "e8a4b389-1136-4470-9898-29fd39baf1f5",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/ directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_data directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/images directory already exists !\n"
+ ]
+ }
+ ],
+ "source": [
+ "project_name = set_name # Project name\n",
+ "step_suffix = 'qc_eda' # Curent part (here part I)\n",
+ "previous_step_suffix_long = \"\" # Previous part (here empty)\n",
+ "\n",
+ "# Initial input data directory\n",
+ "input_data_dir = os.path.join(base_dir, project_name + \"_data\")\n",
+ "\n",
+ "# QC/EDA output directories\n",
+ "# global output\n",
+ "output_data_dir = os.path.join(base_dir, project_name + \"_\" + step_suffix)\n",
+ "# images subdirectory\n",
+ "output_images_dir = os.path.join(output_data_dir,\"images\")\n",
+ "\n",
+ "# Data and Metadata directories\n",
+ "# global data\n",
+ "metadata_dir = os.path.join(base_dir, project_name + \"_metadata\")\n",
+ "# images subdirectory\n",
+ "metadata_images_dir = os.path.join(metadata_dir,\"images\")\n",
+ "\n",
+ "# Create directories if they don't already exist\n",
+ "for d in [base_dir, input_data_dir, output_data_dir, output_images_dir, metadata_dir, metadata_images_dir]:\n",
+ " if not os.path.exists(d):\n",
+ " print(\"Creation of the\" , d, \"directory...\")\n",
+ " os.makedirs(d)\n",
+ " else :\n",
+ " print(\"The\", d, \"directory already exists !\")\n",
+ "\n",
+ "os.chdir(input_data_dir)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "b6e9df25-588a-41b4-a1f5-45bb81f012ff",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "base_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/\n",
+ "input_data_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_data\n",
+ "output_data_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda\n",
+ "output_images_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images\n",
+ "metadata_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata\n",
+ "metadata_images_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/images\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Verify paths\n",
+ "print('base_dir :', base_dir)\n",
+ "print('input_data_dir :', input_data_dir)\n",
+ "print('output_data_dir :', output_data_dir)\n",
+ "print('output_images_dir :', output_images_dir)\n",
+ "print('metadata_dir :', metadata_dir)\n",
+ "print('metadata_images_dir :', metadata_images_dir)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "44ebdb24-d428-4948-8d9d-485e4591212b",
+ "metadata": {},
+ "source": [
+ "## I.3. FILES"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "b81abd9c-2501-4b31-8c71-aa191c518b31",
+ "metadata": {},
+ "source": [
+ "Don't forget to put your data in the projname_data directory !"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "b2569b34-ef84-4af6-836d-befe3bdda706",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The following CSV files were detected:\n",
+ "\n",
+ " ['DD3S1.csv', 'DD3S2.csv', 'DD3S3.csv', 'TMA.csv'] \n",
+ "\n",
+ "in /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_data directory.\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Listing all the .csv files in the metadata/data directory\n",
+ "# Don't forget to move the csv files into the proj_data directory\n",
+ "# if the data dir is empty it's not going to work \n",
+ "ls_samples = [sample for sample in os.listdir(input_data_dir) if sample.endswith(\".csv\")]\n",
+ "\n",
+ "print(\"The following CSV files were detected:\\n\\n\",[sample for sample in ls_samples], \"\\n\\nin\", input_data_dir, \"directory.\")\n",
+ "\n",
+ "#print(ls_samples[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "591d76f3-8b5b-4dfc-a71a-0d3ec6eeb93e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "df :\n",
+ " Cell Size Nuc X Nuc Y Inv ROI index Nucleus Size \\\n",
+ "Cell Id \n",
+ "1@1 339 1484.771729 16632.205078 0 127 \n",
+ "\n",
+ " Nucleus Roundness AF488 Cell Intensity Average \\\n",
+ "Cell Id \n",
+ "1@1 0.95504 2385.867188 \n",
+ "\n",
+ " AF488 Cytoplasm Intensity Average AF488 Nucleus Intensity Average \\\n",
+ "Cell Id \n",
+ "1@1 2356.6604 2434.62207 \n",
+ "\n",
+ " AF555 Cell Intensity Average ... r7c2 Nucleus Intensity Average \\\n",
+ "Cell Id ... \n",
+ "1@1 1358.528076 ... 290.582672 \n",
+ "\n",
+ " r8c2 Cell Intensity Average r8c2 Cytoplasm Intensity Average \\\n",
+ "Cell Id \n",
+ "1@1 341.790558 337.82547 \n",
+ "\n",
+ " r8c2 Nucleus Intensity Average Sting Cell Intensity Average \\\n",
+ "Cell Id \n",
+ "1@1 348.409454 1567.100342 \n",
+ "\n",
+ " Sting Cytoplasm Intensity Average Sting Nucleus Intensity Average \\\n",
+ "Cell Id \n",
+ "1@1 1533.22168 1623.653564 \n",
+ "\n",
+ " Vimentin Cell Intensity Average \\\n",
+ "Cell Id \n",
+ "1@1 7279.144531 \n",
+ "\n",
+ " Vimentin Cytoplasm Intensity Average \\\n",
+ "Cell Id \n",
+ "1@1 7040.108398 \n",
+ "\n",
+ " Vimentin Nucleus Intensity Average \n",
+ "Cell Id \n",
+ "1@1 7678.165527 \n",
+ "\n",
+ "[1 rows x 141 columns] \n",
+ "\n",
+ "df's columns :\n",
+ " Index(['Cell Size', 'Nuc X', 'Nuc Y Inv', 'ROI index', 'Nucleus Size',\n",
+ " 'Nucleus Roundness', 'AF488 Cell Intensity Average',\n",
+ " 'AF488 Cytoplasm Intensity Average', 'AF488 Nucleus Intensity Average',\n",
+ " 'AF555 Cell Intensity Average',\n",
+ " ...\n",
+ " 'r7c2 Nucleus Intensity Average', 'r8c2 Cell Intensity Average',\n",
+ " 'r8c2 Cytoplasm Intensity Average', 'r8c2 Nucleus Intensity Average',\n",
+ " 'Sting Cell Intensity Average', 'Sting Cytoplasm Intensity Average',\n",
+ " 'Sting Nucleus Intensity Average', 'Vimentin Cell Intensity Average',\n",
+ " 'Vimentin Cytoplasm Intensity Average',\n",
+ " 'Vimentin Nucleus Intensity Average'],\n",
+ " dtype='object', length=141) \n",
+ "\n",
+ "df's index :\n",
+ " Index(['1@1'], dtype='object', name='Cell Id') \n",
+ "\n",
+ "df's index name :\n",
+ " Cell Id\n"
+ ]
+ }
+ ],
+ "source": [
+ "# First gather information on expected headers using first file in ls_samples\n",
+ "# Read in the first row of the file corresponding to the first sample (index = 0) in ls_samples\n",
+ "df = pd.read_csv(os.path.join(input_data_dir, ls_samples[0]) , index_col = 0, nrows = 1)\n",
+ "\n",
+ "\n",
+ "# Make sure the file was imported correctly\n",
+ "print(\"df :\\n\", df.head(), \"\\n\")\n",
+ "print(\"df's columns :\\n\", df.columns, \"\\n\")\n",
+ "print(\"df's index :\\n\", df.index, \"\\n\")\n",
+ "print(\"df's index name :\\n\", df.index.name)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "7caa2335-ea22-4973-b50c-7087349c2dc6",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Expected the first column in input file (index_col = 0) to be 'ID'. \n",
+ "This column will be used to set the index names (cell number for each sample). \n",
+ "It appears that the column 'Cell Id' was actually the imported as the index column.\n",
+ "A new index name (first column) will be given ('ID') to replace the current one 'Cell Id'\n",
+ "\n",
+ "['Cell_Size' 'Nuc_X' 'Nuc_Y_Inv' 'ROI_index' 'Nucleus_Size'\n",
+ " 'Nucleus_Roundness' 'AF488_Cell_Intensity_Average'\n",
+ " 'AF488_Cytoplasm_Intensity_Average' 'AF488_Nucleus_Intensity_Average'\n",
+ " 'AF555_Cell_Intensity_Average' 'AF555_Cytoplasm_Intensity_Average'\n",
+ " 'AF555_Nucleus_Intensity_Average' 'AF647_Cell_Intensity_Average'\n",
+ " 'AF647_Cytoplasm_Intensity_Average' 'AF647_Nucleus_Intensity_Average'\n",
+ " 'AF750_Cell_Intensity_Average' 'AF750_Cytoplasm_Intensity_Average'\n",
+ " 'AF750_Nucleus_Intensity_Average' 'aSMA_Cell_Intensity_Average'\n",
+ " 'aSMA_Cytoplasm_Intensity_Average' 'aSMA_Nucleus_Intensity_Average'\n",
+ " 'AXL_Cell_Intensity_Average' 'AXL_Cytoplasm_Intensity_Average'\n",
+ " 'AXL_Nucleus_Intensity_Average' 'B7H4_Cell_Intensity_Average'\n",
+ " 'B7H4_Cytoplasm_Intensity_Average' 'B7H4_Nucleus_Intensity_Average'\n",
+ " 'CA9_Cell_Intensity_Average' 'CA9_Cytoplasm_Intensity_Average'\n",
+ " 'CA9_Nucleus_Intensity_Average' 'CD4_Cell_Intensity_Average'\n",
+ " 'CD4_Cytoplasm_Intensity_Average' 'CD4_Nucleus_Intensity_Average'\n",
+ " 'CD8_Cell_Intensity_Average' 'CD8_Cytoplasm_Intensity_Average'\n",
+ " 'CD8_Nucleus_Intensity_Average' 'CD11b_Cell_Intensity_Average'\n",
+ " 'CD11b_Cytoplasm_Intensity_Average' 'CD11b_Nucleus_Intensity_Average'\n",
+ " 'CD11c_Cell_Intensity_Average' 'CD11c_Cytoplasm_Intensity_Average'\n",
+ " 'CD11c_Nucleus_Intensity_Average' 'CD20_Cell_Intensity_Average'\n",
+ " 'CD20_Cytoplasm_Intensity_Average' 'CD20_Nucleus_Intensity_Average'\n",
+ " 'CD31_Cell_Intensity_Average' 'CD31_Cytoplasm_Intensity_Average'\n",
+ " 'CD31_Nucleus_Intensity_Average' 'CD44_Cell_Intensity_Average'\n",
+ " 'CD44_Cytoplasm_Intensity_Average' 'CD44_Nucleus_Intensity_Average'\n",
+ " 'CD45_Cell_Intensity_Average' 'CD45_Cytoplasm_Intensity_Average'\n",
+ " 'CD45_Nucleus_Intensity_Average' 'CD68_Cell_Intensity_Average'\n",
+ " 'CD68_Cytoplasm_Intensity_Average' 'CD68_Nucleus_Intensity_Average'\n",
+ " 'CD163_Cell_Intensity_Average' 'CD163_Cytoplasm_Intensity_Average'\n",
+ " 'CD163_Nucleus_Intensity_Average' 'CKs_Cell_Intensity_Average'\n",
+ " 'CKs_Cytoplasm_Intensity_Average' 'CKs_Nucleus_Intensity_Average'\n",
+ " 'ColVI_Cell_Intensity_Average' 'ColVI_Cytoplasm_Intensity_Average'\n",
+ " 'ColVI_Nucleus_Intensity_Average' 'DAPI0_Cell_Intensity_Average'\n",
+ " 'DAPI0_Cytoplasm_Intensity_Average' 'DAPI0_Nucleus_Intensity_Average'\n",
+ " 'DAPI1_Cell_Intensity_Average' 'DAPI1_Cytoplasm_Intensity_Average'\n",
+ " 'DAPI1_Nucleus_Intensity_Average' 'DAPI2_Cell_Intensity_Average'\n",
+ " 'DAPI2_Cytoplasm_Intensity_Average' 'DAPI2_Nucleus_Intensity_Average'\n",
+ " 'DAPI3_Cell_Intensity_Average' 'DAPI3_Cytoplasm_Intensity_Average'\n",
+ " 'DAPI3_Nucleus_Intensity_Average' 'DAPI4_Cell_Intensity_Average'\n",
+ " 'DAPI4_Cytoplasm_Intensity_Average' 'DAPI4_Nucleus_Intensity_Average'\n",
+ " 'DAPI5_Cell_Intensity_Average' 'DAPI5_Cytoplasm_Intensity_Average'\n",
+ " 'DAPI5_Nucleus_Intensity_Average' 'DAPI6_Cell_Intensity_Average'\n",
+ " 'DAPI6_Cytoplasm_Intensity_Average' 'DAPI6_Nucleus_Intensity_Average'\n",
+ " 'DAPI7_Cell_Intensity_Average' 'DAPI7_Cytoplasm_Intensity_Average'\n",
+ " 'DAPI7_Nucleus_Intensity_Average' 'DAPI8_Cell_Intensity_Average'\n",
+ " 'DAPI8_Cytoplasm_Intensity_Average' 'DAPI8_Nucleus_Intensity_Average'\n",
+ " 'Desmin_Cell_Intensity_Average' 'Desmin_Cytoplasm_Intensity_Average'\n",
+ " 'Desmin_Nucleus_Intensity_Average' 'Ecad_Cell_Intensity_Average'\n",
+ " 'Ecad_Cytoplasm_Intensity_Average' 'Ecad_Nucleus_Intensity_Average'\n",
+ " 'Fibronectin_Cell_Intensity_Average'\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average'\n",
+ " 'Fibronectin_Nucleus_Intensity_Average' 'FOXP3_Cell_Intensity_Average'\n",
+ " 'FOXP3_Cytoplasm_Intensity_Average' 'FOXP3_Nucleus_Intensity_Average'\n",
+ " 'GATA3_Cell_Intensity_Average' 'GATA3_Cytoplasm_Intensity_Average'\n",
+ " 'GATA3_Nucleus_Intensity_Average' 'HLA_Cell_Intensity_Average'\n",
+ " 'HLA_Cytoplasm_Intensity_Average' 'HLA_Nucleus_Intensity_Average'\n",
+ " 'Ki67_Cell_Intensity_Average' 'Ki67_Cytoplasm_Intensity_Average'\n",
+ " 'Ki67_Nucleus_Intensity_Average' 'MMP9_Cell_Intensity_Average'\n",
+ " 'MMP9_Cytoplasm_Intensity_Average' 'MMP9_Nucleus_Intensity_Average'\n",
+ " 'PD1_Cell_Intensity_Average' 'PD1_Cytoplasm_Intensity_Average'\n",
+ " 'PD1_Nucleus_Intensity_Average' 'PDGFR_Cell_Intensity_Average'\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average' 'PDGFR_Nucleus_Intensity_Average'\n",
+ " 'PDL1_Cell_Intensity_Average' 'PDL1_Cytoplasm_Intensity_Average'\n",
+ " 'PDL1_Nucleus_Intensity_Average' 'r5c2_Cell_Intensity_Average'\n",
+ " 'r5c2_Cytoplasm_Intensity_Average' 'r5c2_Nucleus_Intensity_Average'\n",
+ " 'r7c2_Cell_Intensity_Average' 'r7c2_Cytoplasm_Intensity_Average'\n",
+ " 'r7c2_Nucleus_Intensity_Average' 'r8c2_Cell_Intensity_Average'\n",
+ " 'r8c2_Cytoplasm_Intensity_Average' 'r8c2_Nucleus_Intensity_Average'\n",
+ " 'Sting_Cell_Intensity_Average' 'Sting_Cytoplasm_Intensity_Average'\n",
+ " 'Sting_Nucleus_Intensity_Average' 'Vimentin_Cell_Intensity_Average'\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average'\n",
+ " 'Vimentin_Nucleus_Intensity_Average']\n",
+ "\n",
+ "df :\n",
+ " Cell_Size Nuc_X Nuc_Y_Inv ROI_index Nucleus_Size \\\n",
+ "ID \n",
+ "1@1 339 1484.771729 16632.205078 0 127 \n",
+ "\n",
+ " Nucleus_Roundness AF488_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 0.95504 2385.867188 \n",
+ "\n",
+ " AF488_Cytoplasm_Intensity_Average AF488_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 2356.6604 2434.62207 \n",
+ "\n",
+ " AF555_Cell_Intensity_Average ... r7c2_Nucleus_Intensity_Average \\\n",
+ "ID ... \n",
+ "1@1 1358.528076 ... 290.582672 \n",
+ "\n",
+ " r8c2_Cell_Intensity_Average r8c2_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 341.790558 337.82547 \n",
+ "\n",
+ " r8c2_Nucleus_Intensity_Average Sting_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 348.409454 1567.100342 \n",
+ "\n",
+ " Sting_Cytoplasm_Intensity_Average Sting_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 1533.22168 1623.653564 \n",
+ "\n",
+ " Vimentin_Cell_Intensity_Average Vimentin_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 7279.144531 7040.108398 \n",
+ "\n",
+ " Vimentin_Nucleus_Intensity_Average \n",
+ "ID \n",
+ "1@1 7678.165527 \n",
+ "\n",
+ "[1 rows x 141 columns] \n",
+ "\n",
+ "df's columns :\n",
+ " Index(['Cell_Size', 'Nuc_X', 'Nuc_Y_Inv', 'ROI_index', 'Nucleus_Size',\n",
+ " 'Nucleus_Roundness', 'AF488_Cell_Intensity_Average',\n",
+ " 'AF488_Cytoplasm_Intensity_Average', 'AF488_Nucleus_Intensity_Average',\n",
+ " 'AF555_Cell_Intensity_Average',\n",
+ " ...\n",
+ " 'r7c2_Nucleus_Intensity_Average', 'r8c2_Cell_Intensity_Average',\n",
+ " 'r8c2_Cytoplasm_Intensity_Average', 'r8c2_Nucleus_Intensity_Average',\n",
+ " 'Sting_Cell_Intensity_Average', 'Sting_Cytoplasm_Intensity_Average',\n",
+ " 'Sting_Nucleus_Intensity_Average', 'Vimentin_Cell_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'Vimentin_Nucleus_Intensity_Average'],\n",
+ " dtype='object', length=141) \n",
+ "\n",
+ "df's index :\n",
+ " Index(['1@1'], dtype='object', name='ID') \n",
+ "\n",
+ "df's index name :\n",
+ " ID\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Verify that the ID column in input file became the index\n",
+ "# Verify that the index name column is \"ID\", if not, rename it\n",
+ "if df.index.name != \"ID\":\n",
+ " print(\"Expected the first column in input file (index_col = 0) to be 'ID'. \\n\"\n",
+ " \"This column will be used to set the index names (cell number for each sample). \\n\"\n",
+ " \"It appears that the column '\" + df.index.name + \"' was actually the imported as the index column.\")\n",
+ " #df.index.name = 'ID'\n",
+ " print(\"A new index name (first column) will be given ('ID') to replace the current one '\" + df.index.name + \"'\\n\")\n",
+ "\n",
+ "# Apply the changes to the headers as specified with apply_header_changes() function (in my_modules.py)\n",
+ "# Apply the changes to the dataframe rows as specified with apply_df_changes() function (in my_modules.py)\n",
+ "df = apply_header_changes(df)\n",
+ "df = apply_df_changes(df)\n",
+ "\n",
+ "# Set variable to hold default header values\n",
+ "expected_headers = df.columns.values\n",
+ "print(expected_headers)\n",
+ "\n",
+ "# Make sure the file is now formated correctly\n",
+ "print(\"\\ndf :\\n\", df.head(), \"\\n\")\n",
+ "print(\"df's columns :\\n\", df.columns, \"\\n\")\n",
+ "print(\"df's index :\\n\", df.index, \"\\n\")\n",
+ "print(\"df's index name :\\n\", df.index.name)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "1e7448a1-b156-4d5e-9698-e94ebe9ef7b4",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Used DD3S1.csv to determine the expected and corrected headers for all files.\n",
+ "\n",
+ "These headers are: \n",
+ "Cell_Size, Nuc_X, Nuc_Y_Inv, ROI_index, Nucleus_Size, Nucleus_Roundness, AF488_Cell_Intensity_Average, AF488_Cytoplasm_Intensity_Average, AF488_Nucleus_Intensity_Average, AF555_Cell_Intensity_Average, AF555_Cytoplasm_Intensity_Average, AF555_Nucleus_Intensity_Average, AF647_Cell_Intensity_Average, AF647_Cytoplasm_Intensity_Average, AF647_Nucleus_Intensity_Average, AF750_Cell_Intensity_Average, AF750_Cytoplasm_Intensity_Average, AF750_Nucleus_Intensity_Average, aSMA_Cell_Intensity_Average, aSMA_Cytoplasm_Intensity_Average, aSMA_Nucleus_Intensity_Average, AXL_Cell_Intensity_Average, AXL_Cytoplasm_Intensity_Average, AXL_Nucleus_Intensity_Average, B7H4_Cell_Intensity_Average, B7H4_Cytoplasm_Intensity_Average, B7H4_Nucleus_Intensity_Average, CA9_Cell_Intensity_Average, CA9_Cytoplasm_Intensity_Average, CA9_Nucleus_Intensity_Average, CD4_Cell_Intensity_Average, CD4_Cytoplasm_Intensity_Average, CD4_Nucleus_Intensity_Average, CD8_Cell_Intensity_Average, CD8_Cytoplasm_Intensity_Average, CD8_Nucleus_Intensity_Average, CD11b_Cell_Intensity_Average, CD11b_Cytoplasm_Intensity_Average, CD11b_Nucleus_Intensity_Average, CD11c_Cell_Intensity_Average, CD11c_Cytoplasm_Intensity_Average, CD11c_Nucleus_Intensity_Average, CD20_Cell_Intensity_Average, CD20_Cytoplasm_Intensity_Average, CD20_Nucleus_Intensity_Average, CD31_Cell_Intensity_Average, CD31_Cytoplasm_Intensity_Average, CD31_Nucleus_Intensity_Average, CD44_Cell_Intensity_Average, CD44_Cytoplasm_Intensity_Average, CD44_Nucleus_Intensity_Average, CD45_Cell_Intensity_Average, CD45_Cytoplasm_Intensity_Average, CD45_Nucleus_Intensity_Average, CD68_Cell_Intensity_Average, CD68_Cytoplasm_Intensity_Average, CD68_Nucleus_Intensity_Average, CD163_Cell_Intensity_Average, CD163_Cytoplasm_Intensity_Average, CD163_Nucleus_Intensity_Average, CKs_Cell_Intensity_Average, CKs_Cytoplasm_Intensity_Average, CKs_Nucleus_Intensity_Average, ColVI_Cell_Intensity_Average, ColVI_Cytoplasm_Intensity_Average, ColVI_Nucleus_Intensity_Average, DAPI0_Cell_Intensity_Average, DAPI0_Cytoplasm_Intensity_Average, DAPI0_Nucleus_Intensity_Average, DAPI1_Cell_Intensity_Average, DAPI1_Cytoplasm_Intensity_Average, DAPI1_Nucleus_Intensity_Average, DAPI2_Cell_Intensity_Average, DAPI2_Cytoplasm_Intensity_Average, DAPI2_Nucleus_Intensity_Average, DAPI3_Cell_Intensity_Average, DAPI3_Cytoplasm_Intensity_Average, DAPI3_Nucleus_Intensity_Average, DAPI4_Cell_Intensity_Average, DAPI4_Cytoplasm_Intensity_Average, DAPI4_Nucleus_Intensity_Average, DAPI5_Cell_Intensity_Average, DAPI5_Cytoplasm_Intensity_Average, DAPI5_Nucleus_Intensity_Average, DAPI6_Cell_Intensity_Average, DAPI6_Cytoplasm_Intensity_Average, DAPI6_Nucleus_Intensity_Average, DAPI7_Cell_Intensity_Average, DAPI7_Cytoplasm_Intensity_Average, DAPI7_Nucleus_Intensity_Average, DAPI8_Cell_Intensity_Average, DAPI8_Cytoplasm_Intensity_Average, DAPI8_Nucleus_Intensity_Average, Desmin_Cell_Intensity_Average, Desmin_Cytoplasm_Intensity_Average, Desmin_Nucleus_Intensity_Average, Ecad_Cell_Intensity_Average, Ecad_Cytoplasm_Intensity_Average, Ecad_Nucleus_Intensity_Average, Fibronectin_Cell_Intensity_Average, Fibronectin_Cytoplasm_Intensity_Average, Fibronectin_Nucleus_Intensity_Average, FOXP3_Cell_Intensity_Average, FOXP3_Cytoplasm_Intensity_Average, FOXP3_Nucleus_Intensity_Average, GATA3_Cell_Intensity_Average, GATA3_Cytoplasm_Intensity_Average, GATA3_Nucleus_Intensity_Average, HLA_Cell_Intensity_Average, HLA_Cytoplasm_Intensity_Average, HLA_Nucleus_Intensity_Average, Ki67_Cell_Intensity_Average, Ki67_Cytoplasm_Intensity_Average, Ki67_Nucleus_Intensity_Average, MMP9_Cell_Intensity_Average, MMP9_Cytoplasm_Intensity_Average, MMP9_Nucleus_Intensity_Average, PD1_Cell_Intensity_Average, PD1_Cytoplasm_Intensity_Average, PD1_Nucleus_Intensity_Average, PDGFR_Cell_Intensity_Average, PDGFR_Cytoplasm_Intensity_Average, PDGFR_Nucleus_Intensity_Average, PDL1_Cell_Intensity_Average, PDL1_Cytoplasm_Intensity_Average, PDL1_Nucleus_Intensity_Average, r5c2_Cell_Intensity_Average, r5c2_Cytoplasm_Intensity_Average, r5c2_Nucleus_Intensity_Average, r7c2_Cell_Intensity_Average, r7c2_Cytoplasm_Intensity_Average, r7c2_Nucleus_Intensity_Average, r8c2_Cell_Intensity_Average, r8c2_Cytoplasm_Intensity_Average, r8c2_Nucleus_Intensity_Average, Sting_Cell_Intensity_Average, Sting_Cytoplasm_Intensity_Average, Sting_Nucleus_Intensity_Average, Vimentin_Cell_Intensity_Average, Vimentin_Cytoplasm_Intensity_Average, Vimentin_Nucleus_Intensity_Average\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"Used \" + ls_samples[0] + \" to determine the expected and corrected headers for all files.\\n\")\n",
+ "print(\"These headers are: \\n\" + \", \".join([h for h in expected_headers]))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "d0e4670c-acd0-4183-ad09-4b0442abb2ef",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "DD3S1.csv file is processed !\n",
+ "\n",
+ "DD3S2.csv file is processed !\n",
+ "\n",
+ "DD3S3.csv file is processed !\n",
+ "\n",
+ "TMA.csv file is processed !\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Import all the others files\n",
+ "dfs = {}\n",
+ "\n",
+ "###############################\n",
+ "# !! This may take a while !! #\n",
+ "###############################\n",
+ "for sample in ls_samples:\n",
+ " file_path = os.path.join(input_data_dir,sample)\n",
+ " \n",
+ " try:\n",
+ " # Read the CSV file\n",
+ " df = pd.read_csv(file_path, index_col=0)\n",
+ " # Check if the DataFrame is empty, if so, don't continue trying to process df and remove it\n",
+ " \n",
+ " if not df.empty:\n",
+ " # Manipulations necessary for concatenation\n",
+ " df = apply_header_changes(df)\n",
+ " df = apply_df_changes(df)\n",
+ " # Reorder the columns to match the expected headers list\n",
+ " df = df.reindex(columns=expected_headers)\n",
+ " print(sample, \"file is processed !\\n\")\n",
+ " #print(df) \n",
+ " \n",
+ " # Compare df's header df against what is expected\n",
+ " compare_headers(expected_headers, df.columns.values, sample)\n",
+ " #print(df.columns.values)\n",
+ " # Add a new colunm to identify the csv file (sample) where the df comes from\n",
+ " df['Sample_ID'] = sample \n",
+ " \n",
+ " except pd.errors.EmptyDataError:\n",
+ " print(f'\\nEmpty data error in {sample} file. Removing from analysis...')\n",
+ " ls_samples.remove(sample) \n",
+ " \n",
+ " # Add df to dfs \n",
+ " dfs[sample] = df\n",
+ "\n",
+ "#print(dfs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "69a6106c-8106-427c-8d53-abc26c9db6e1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Cell_Size Nuc_X Nuc_Y_Inv ROI_index Nucleus_Size \\\n",
+ "ID \n",
+ "1@1 339 1484.771729 16632.205078 0 127 \n",
+ "2@1 344 1426.250000 16627.384766 0 112 \n",
+ "3@1 422 1531.110474 16622.238281 0 181 \n",
+ "4@1 278 1518.907593 16623.007812 0 119 \n",
+ "5@1 502 1488.051758 16616.375000 0 232 \n",
+ "\n",
+ " Nucleus_Roundness AF488_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 0.955040 2385.867188 \n",
+ "2@1 0.966643 2818.250000 \n",
+ "3@1 0.721534 2162.047363 \n",
+ "4@1 0.587196 2422.715820 \n",
+ "5@1 0.655828 2265.306885 \n",
+ "\n",
+ " AF488_Cytoplasm_Intensity_Average AF488_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 2356.660400 2434.622070 \n",
+ "2@1 2884.366455 2681.294678 \n",
+ "3@1 2124.817383 2211.618896 \n",
+ "4@1 2411.867920 2437.210205 \n",
+ "5@1 2154.796387 2393.918213 \n",
+ "\n",
+ " AF555_Cell_Intensity_Average ... r8c2_Cell_Intensity_Average \\\n",
+ "ID ... \n",
+ "1@1 1358.528076 ... 341.790558 \n",
+ "2@1 1472.325562 ... 365.531982 \n",
+ "3@1 1289.054443 ... 320.874420 \n",
+ "4@1 1397.992798 ... 343.320129 \n",
+ "5@1 1288.657349 ... 326.241028 \n",
+ "\n",
+ " r8c2_Cytoplasm_Intensity_Average r8c2_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 337.825470 348.409454 \n",
+ "2@1 369.340515 357.642853 \n",
+ "3@1 315.605804 327.889496 \n",
+ "4@1 338.679260 349.520996 \n",
+ "5@1 314.748138 339.616394 \n",
+ "\n",
+ " Sting_Cell_Intensity_Average Sting_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 1567.100342 1533.221680 \n",
+ "2@1 1508.014526 1565.086182 \n",
+ "3@1 1841.360229 1772.647339 \n",
+ "4@1 1723.863281 1688.094360 \n",
+ "5@1 1711.464111 1629.670410 \n",
+ "\n",
+ " Sting_Nucleus_Intensity_Average Vimentin_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 1623.653564 7279.144531 \n",
+ "2@1 1389.794678 6123.456543 \n",
+ "3@1 1932.850830 4252.185059 \n",
+ "4@1 1771.655518 6178.647461 \n",
+ "5@1 1806.655151 5208.479980 \n",
+ "\n",
+ " Vimentin_Cytoplasm_Intensity_Average Vimentin_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "1@1 7040.108398 7678.165527 \n",
+ "2@1 6734.603516 4857.508789 \n",
+ "3@1 4473.178223 3957.933594 \n",
+ "4@1 5316.924316 7330.025391 \n",
+ "5@1 4386.700195 6164.862305 \n",
+ "\n",
+ " Sample_ID \n",
+ "ID \n",
+ "1@1 DD3S1.csv \n",
+ "2@1 DD3S1.csv \n",
+ "3@1 DD3S1.csv \n",
+ "4@1 DD3S1.csv \n",
+ "5@1 DD3S1.csv \n",
+ "\n",
+ "[5 rows x 142 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Merge dfs into one df\n",
+ "df = pd.concat(dfs.values(), ignore_index=False , sort = False)\n",
+ "#del dfs\n",
+ "\n",
+ "print(df.head())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "5c724db9-eb76-4af1-8fe3-8beff43d8940",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Cell_Size Nuc_X Nuc_Y_Inv ROI_index Nucleus_Size \\\n",
+ "DD3S1_Cell_0 339 1484.771729 16632.205078 0 127 \n",
+ "DD3S1_Cell_1 344 1426.250000 16627.384766 0 112 \n",
+ "DD3S1_Cell_2 422 1531.110474 16622.238281 0 181 \n",
+ "DD3S1_Cell_3 278 1518.907593 16623.007812 0 119 \n",
+ "DD3S1_Cell_4 502 1488.051758 16616.375000 0 232 \n",
+ "\n",
+ " Nucleus_Roundness AF488_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 0.955040 2385.867188 \n",
+ "DD3S1_Cell_1 0.966643 2818.250000 \n",
+ "DD3S1_Cell_2 0.721534 2162.047363 \n",
+ "DD3S1_Cell_3 0.587196 2422.715820 \n",
+ "DD3S1_Cell_4 0.655828 2265.306885 \n",
+ "\n",
+ " AF488_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 2356.660400 \n",
+ "DD3S1_Cell_1 2884.366455 \n",
+ "DD3S1_Cell_2 2124.817383 \n",
+ "DD3S1_Cell_3 2411.867920 \n",
+ "DD3S1_Cell_4 2154.796387 \n",
+ "\n",
+ " AF488_Nucleus_Intensity_Average AF555_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 2434.622070 1358.528076 \n",
+ "DD3S1_Cell_1 2681.294678 1472.325562 \n",
+ "DD3S1_Cell_2 2211.618896 1289.054443 \n",
+ "DD3S1_Cell_3 2437.210205 1397.992798 \n",
+ "DD3S1_Cell_4 2393.918213 1288.657349 \n",
+ "\n",
+ " ... r8c2_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 ... 341.790558 \n",
+ "DD3S1_Cell_1 ... 365.531982 \n",
+ "DD3S1_Cell_2 ... 320.874420 \n",
+ "DD3S1_Cell_3 ... 343.320129 \n",
+ "DD3S1_Cell_4 ... 326.241028 \n",
+ "\n",
+ " r8c2_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 337.825470 \n",
+ "DD3S1_Cell_1 369.340515 \n",
+ "DD3S1_Cell_2 315.605804 \n",
+ "DD3S1_Cell_3 338.679260 \n",
+ "DD3S1_Cell_4 314.748138 \n",
+ "\n",
+ " r8c2_Nucleus_Intensity_Average Sting_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 348.409454 1567.100342 \n",
+ "DD3S1_Cell_1 357.642853 1508.014526 \n",
+ "DD3S1_Cell_2 327.889496 1841.360229 \n",
+ "DD3S1_Cell_3 349.520996 1723.863281 \n",
+ "DD3S1_Cell_4 339.616394 1711.464111 \n",
+ "\n",
+ " Sting_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 1533.221680 \n",
+ "DD3S1_Cell_1 1565.086182 \n",
+ "DD3S1_Cell_2 1772.647339 \n",
+ "DD3S1_Cell_3 1688.094360 \n",
+ "DD3S1_Cell_4 1629.670410 \n",
+ "\n",
+ " Sting_Nucleus_Intensity_Average \\\n",
+ "DD3S1_Cell_0 1623.653564 \n",
+ "DD3S1_Cell_1 1389.794678 \n",
+ "DD3S1_Cell_2 1932.850830 \n",
+ "DD3S1_Cell_3 1771.655518 \n",
+ "DD3S1_Cell_4 1806.655151 \n",
+ "\n",
+ " Vimentin_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 7279.144531 \n",
+ "DD3S1_Cell_1 6123.456543 \n",
+ "DD3S1_Cell_2 4252.185059 \n",
+ "DD3S1_Cell_3 6178.647461 \n",
+ "DD3S1_Cell_4 5208.479980 \n",
+ "\n",
+ " Vimentin_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 7040.108398 \n",
+ "DD3S1_Cell_1 6734.603516 \n",
+ "DD3S1_Cell_2 4473.178223 \n",
+ "DD3S1_Cell_3 5316.924316 \n",
+ "DD3S1_Cell_4 4386.700195 \n",
+ "\n",
+ " Vimentin_Nucleus_Intensity_Average Sample_ID \n",
+ "DD3S1_Cell_0 7678.165527 DD3S1.csv \n",
+ "DD3S1_Cell_1 4857.508789 DD3S1.csv \n",
+ "DD3S1_Cell_2 3957.933594 DD3S1.csv \n",
+ "DD3S1_Cell_3 7330.025391 DD3S1.csv \n",
+ "DD3S1_Cell_4 6164.862305 DD3S1.csv \n",
+ "\n",
+ "[5 rows x 142 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Set index to Sample_ID + cell number : \n",
+ "# create a new custom index for df based on the sample names and integer cell numbers, and then remove the temporary columns 'level_0' and 'index' that were introduced during the operations\n",
+ "\n",
+ "# Creates a copy of the DataFrame df and resets its index without creating a new column for the old index\n",
+ "# This essentially removes the old index column and replaces it with a default integer index\n",
+ "df = df.copy().reset_index(drop=True)\n",
+ "\n",
+ "#print(df)\n",
+ "\n",
+ "# Initializing an empty list index to store the new index labels for the DataFrame\n",
+ "index = []\n",
+ "\n",
+ "for sample in ls_samples:\n",
+ " # Extract a chunk of data from the original df where the 'Sample_ID' column matches the current sample name\n",
+ " # This chunk is stored in the df_chunk df, which is a subset of the original data for that specific sample\n",
+ " df_chunk = df.loc[df['Sample_ID'] == sample,:].copy()\n",
+ " old_index = df_chunk.index\n",
+ " # Reset the index of the df_chunk df, removing the old index and replacing it with a default integer index\n",
+ " df_chunk = df_chunk.reset_index(drop=True)\n",
+ " # A new index is created for the df_chunk df. It combines the sample name with 'Cell_' and the integer index values, converting them to strings\n",
+ " # This new index will have labels like 'SampleName_Cell_0', 'SampleName_Cell_1', and so on.\n",
+ " sample = sample.split('.')[0]\n",
+ " df_chunk = df_chunk.set_index(f'{sample}_Cell_' + df_chunk.index.astype(str))\n",
+ " # The index values of df_chunk are then added to the index list\n",
+ " index = index + df_chunk.index.values.tolist()\n",
+ "\n",
+ "# After processing all the samples in the loop, assign the index list as the new index of the original df.\n",
+ "df.index = index\n",
+ "# Remove the 'level_0' and 'index' columns from df\n",
+ "df = df.loc[:,~df.columns.isin(['level_0','index'])]\n",
+ "\n",
+ "print(df.head())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c95a292d-72df-4f1e-8a9d-a3de84d99057",
+ "metadata": {},
+ "source": [
+ "### I.3.2. NOT_INTENSITIES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "8e4bb227-2a4f-477b-a435-e85178d1003a",
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "SyntaxError",
+ "evalue": "leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers (562768646.py, line 3)",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;36m Cell \u001b[0;32mIn[15], line 3\u001b[0;36m\u001b[0m\n\u001b[0;31m not_intensitiehttp://localhost:8888/lab/tree/Downloads/wetransfer_data-zip_2024-05-17_1431/1_qc_eda.ipynb\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers\n"
+ ]
+ }
+ ],
+ "source": [
+ "# not_intensities is the list of the columns unrelated to the markers fluorescence intensities\n",
+ "# Can include items that aren't in a given header.\n",
+ "not_intensitiehttp://localhost:8888/lab/tree/Downloads/wetransfer_data-zip_2024-05-17_1431/1_qc_eda.ipynb\n",
+ "#I.3.2.-NOT_INTENSITIESs = ['Nuc_X', 'Nuc_X_Inv', 'Nuc_Y', 'Nuc_Y_Inv', 'Nucleus_Roundness', 'Nucleus_Size', 'Cell_Size', \n",
+ "# 'ROI_index', 'Sample_ID', 'replicate_ID', 'Cell_ID','cell_type', 'cell_subtype', 'cluster','ID', \n",
+ "# 'Cytoplasm_Size', 'immune_checkpoint', 'Unique_ROI_index', 'Patient', 'Primary_chem(1)_vs_surg(0)']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "3a0b81d8-1fa0-45da-92ab-2ee59ef9d51d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# not_intensities is the list of the columns unrelated to the markers fluorescence intensities\n",
+ "# Can include items that aren't in a given header.\n",
+ "not_intensities = ['Nuc_X', 'Nuc_X_Inv', 'Nuc_Y', 'Nuc_Y_Inv', 'Nucleus_Roundness', 'Nucleus_Size', 'Cell_Size', \n",
+ " 'ROI_index', 'Sample_ID', 'replicate_ID', 'Cell_ID','cell_type', 'cell_subtype', 'cluster','ID', \n",
+ " 'Cytoplasm_Size', 'immune_checkpoint', 'Unique_ROI_index', 'Patient', 'Primary_chem(1)_vs_surg(0)']\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "26669861-4eef-43f5-82f8-532f83bd7f9b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "'not_intensities.csv' already exists.\n",
+ "Reconciling file and Jupyter notebook lists.\n"
+ ]
+ }
+ ],
+ "source": [
+ "path_not_intensities = os.path.join(metadata_dir,\"not_intensities.csv\")\n",
+ "\n",
+ "# If this file already exists, add only not_intensities items of the list not already present in file\n",
+ "if os.path.exists(path_not_intensities):\n",
+ " print(\"'not_intensities.csv' already exists.\")\n",
+ " print(\"Reconciling file and Jupyter notebook lists.\")\n",
+ " file_not_intensities = open(path_not_intensities, \"r\")\n",
+ " file_ni = file_not_intensities.read().splitlines()\n",
+ " # Set difference to identify items not already in file\n",
+ " to_add = set(not_intensities) - set(file_ni)\n",
+ " # We want not_intensities to the a complete list\n",
+ " not_intensities = list(set(file_ni) | set(not_intensities))\n",
+ " file_not_intensities.close()\n",
+ " file_not_intensities = open(path_not_intensities, \"a\")\n",
+ " for item in to_add:\n",
+ " file_not_intensities.write(item +\"\\n\")\n",
+ " file_not_intensities.close()\n",
+ "\n",
+ "else:\n",
+ " # The file does not yet exist\n",
+ " print(\"Could not find \" + path_not_intensities + \". Creating now.\")\n",
+ " file_not_intensities = open(path_not_intensities, \"w\")\n",
+ " for item in not_intensities:\n",
+ " file_not_intensities.write(item + \"\\n\")\n",
+ " file_not_intensities.close()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "175ef4cd-600f-47d6-8e16-583f4a1a0abf",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['ROI_index',\n",
+ " 'Nuc_X_Inv',\n",
+ " 'Patient',\n",
+ " 'ID',\n",
+ " 'cluster',\n",
+ " 'Sample_ID',\n",
+ " 'replicate_ID',\n",
+ " 'cell_subtype',\n",
+ " 'cell_type',\n",
+ " 'Nucleus_Roundness',\n",
+ " 'Nucleus_Size',\n",
+ " 'Primary_chem(1)_vs_surg(0)',\n",
+ " 'Nuc_X',\n",
+ " 'Nuc_Y',\n",
+ " 'Nuc_Y_Inv',\n",
+ " 'Unique_ROI_index',\n",
+ " 'Cytoplasm_Size',\n",
+ " 'immune_checkpoint',\n",
+ " 'Cell_ID',\n",
+ " 'Cell_Size',\n",
+ " 'AF488_Cell_Intensity_Average',\n",
+ " 'AF488_Cytoplasm_Intensity_Average',\n",
+ " 'AF488_Nucleus_Intensity_Average',\n",
+ " 'AF555_Cell_Intensity_Average',\n",
+ " 'AF555_Cytoplasm_Intensity_Average',\n",
+ " 'AF555_Nucleus_Intensity_Average',\n",
+ " 'AF647_Cell_Intensity_Average',\n",
+ " 'AF647_Cytoplasm_Intensity_Average',\n",
+ " 'AF647_Nucleus_Intensity_Average',\n",
+ " 'AF750_Cell_Intensity_Average',\n",
+ " 'AF750_Cytoplasm_Intensity_Average',\n",
+ " 'AF750_Nucleus_Intensity_Average',\n",
+ " 'aSMA_Cell_Intensity_Average',\n",
+ " 'aSMA_Cytoplasm_Intensity_Average',\n",
+ " 'aSMA_Nucleus_Intensity_Average',\n",
+ " 'AXL_Cell_Intensity_Average',\n",
+ " 'AXL_Cytoplasm_Intensity_Average',\n",
+ " 'AXL_Nucleus_Intensity_Average',\n",
+ " 'B7H4_Cell_Intensity_Average',\n",
+ " 'B7H4_Cytoplasm_Intensity_Average',\n",
+ " 'B7H4_Nucleus_Intensity_Average',\n",
+ " 'CA9_Cell_Intensity_Average',\n",
+ " 'CA9_Cytoplasm_Intensity_Average',\n",
+ " 'CA9_Nucleus_Intensity_Average',\n",
+ " 'CD4_Cell_Intensity_Average',\n",
+ " 'CD4_Cytoplasm_Intensity_Average',\n",
+ " 'CD4_Nucleus_Intensity_Average',\n",
+ " 'CD8_Cell_Intensity_Average',\n",
+ " 'CD8_Cytoplasm_Intensity_Average',\n",
+ " 'CD8_Nucleus_Intensity_Average',\n",
+ " 'CD11b_Cell_Intensity_Average',\n",
+ " 'CD11b_Cytoplasm_Intensity_Average',\n",
+ " 'CD11b_Nucleus_Intensity_Average',\n",
+ " 'CD11c_Cell_Intensity_Average',\n",
+ " 'CD11c_Cytoplasm_Intensity_Average',\n",
+ " 'CD11c_Nucleus_Intensity_Average',\n",
+ " 'CD20_Cell_Intensity_Average',\n",
+ " 'CD20_Cytoplasm_Intensity_Average',\n",
+ " 'CD20_Nucleus_Intensity_Average',\n",
+ " 'CD31_Cell_Intensity_Average',\n",
+ " 'CD31_Cytoplasm_Intensity_Average',\n",
+ " 'CD31_Nucleus_Intensity_Average',\n",
+ " 'CD44_Cell_Intensity_Average',\n",
+ " 'CD44_Cytoplasm_Intensity_Average',\n",
+ " 'CD44_Nucleus_Intensity_Average',\n",
+ " 'CD45_Cell_Intensity_Average',\n",
+ " 'CD45_Cytoplasm_Intensity_Average',\n",
+ " 'CD45_Nucleus_Intensity_Average',\n",
+ " 'CD68_Cell_Intensity_Average',\n",
+ " 'CD68_Cytoplasm_Intensity_Average',\n",
+ " 'CD68_Nucleus_Intensity_Average',\n",
+ " 'CD163_Cell_Intensity_Average',\n",
+ " 'CD163_Cytoplasm_Intensity_Average',\n",
+ " 'CD163_Nucleus_Intensity_Average',\n",
+ " 'CKs_Cell_Intensity_Average',\n",
+ " 'CKs_Cytoplasm_Intensity_Average',\n",
+ " 'CKs_Nucleus_Intensity_Average',\n",
+ " 'ColVI_Cell_Intensity_Average',\n",
+ " 'ColVI_Cytoplasm_Intensity_Average',\n",
+ " 'ColVI_Nucleus_Intensity_Average',\n",
+ " 'DAPI0_Cell_Intensity_Average',\n",
+ " 'DAPI0_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI0_Nucleus_Intensity_Average',\n",
+ " 'DAPI1_Cell_Intensity_Average',\n",
+ " 'DAPI1_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI1_Nucleus_Intensity_Average',\n",
+ " 'DAPI2_Cell_Intensity_Average',\n",
+ " 'DAPI2_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI2_Nucleus_Intensity_Average',\n",
+ " 'DAPI3_Cell_Intensity_Average',\n",
+ " 'DAPI3_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI3_Nucleus_Intensity_Average',\n",
+ " 'DAPI4_Cell_Intensity_Average',\n",
+ " 'DAPI4_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI4_Nucleus_Intensity_Average',\n",
+ " 'DAPI5_Cell_Intensity_Average',\n",
+ " 'DAPI5_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI5_Nucleus_Intensity_Average',\n",
+ " 'DAPI6_Cell_Intensity_Average',\n",
+ " 'DAPI6_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI6_Nucleus_Intensity_Average',\n",
+ " 'DAPI7_Cell_Intensity_Average',\n",
+ " 'DAPI7_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI7_Nucleus_Intensity_Average',\n",
+ " 'DAPI8_Cell_Intensity_Average',\n",
+ " 'DAPI8_Cytoplasm_Intensity_Average',\n",
+ " 'DAPI8_Nucleus_Intensity_Average',\n",
+ " 'Desmin_Cell_Intensity_Average',\n",
+ " 'Desmin_Cytoplasm_Intensity_Average',\n",
+ " 'Desmin_Nucleus_Intensity_Average',\n",
+ " 'Ecad_Cell_Intensity_Average',\n",
+ " 'Ecad_Cytoplasm_Intensity_Average',\n",
+ " 'Ecad_Nucleus_Intensity_Average',\n",
+ " 'Fibronectin_Cell_Intensity_Average',\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average',\n",
+ " 'Fibronectin_Nucleus_Intensity_Average',\n",
+ " 'FOXP3_Cell_Intensity_Average',\n",
+ " 'FOXP3_Cytoplasm_Intensity_Average',\n",
+ " 'FOXP3_Nucleus_Intensity_Average',\n",
+ " 'GATA3_Cell_Intensity_Average',\n",
+ " 'GATA3_Cytoplasm_Intensity_Average',\n",
+ " 'GATA3_Nucleus_Intensity_Average',\n",
+ " 'HLA_Cell_Intensity_Average',\n",
+ " 'HLA_Cytoplasm_Intensity_Average',\n",
+ " 'HLA_Nucleus_Intensity_Average',\n",
+ " 'Ki67_Cell_Intensity_Average',\n",
+ " 'Ki67_Cytoplasm_Intensity_Average',\n",
+ " 'Ki67_Nucleus_Intensity_Average',\n",
+ " 'MMP9_Cell_Intensity_Average',\n",
+ " 'MMP9_Cytoplasm_Intensity_Average',\n",
+ " 'MMP9_Nucleus_Intensity_Average',\n",
+ " 'PD1_Cell_Intensity_Average',\n",
+ " 'PD1_Cytoplasm_Intensity_Average',\n",
+ " 'PD1_Nucleus_Intensity_Average',\n",
+ " 'PDGFR_Cell_Intensity_Average',\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average',\n",
+ " 'PDGFR_Nucleus_Intensity_Average',\n",
+ " 'PDL1_Cell_Intensity_Average',\n",
+ " 'PDL1_Cytoplasm_Intensity_Average',\n",
+ " 'PDL1_Nucleus_Intensity_Average',\n",
+ " 'r5c2_Cell_Intensity_Average',\n",
+ " 'r5c2_Cytoplasm_Intensity_Average',\n",
+ " 'r5c2_Nucleus_Intensity_Average',\n",
+ " 'r7c2_Cell_Intensity_Average',\n",
+ " 'r7c2_Cytoplasm_Intensity_Average',\n",
+ " 'r7c2_Nucleus_Intensity_Average',\n",
+ " 'r8c2_Cell_Intensity_Average',\n",
+ " 'r8c2_Cytoplasm_Intensity_Average',\n",
+ " 'r8c2_Nucleus_Intensity_Average',\n",
+ " 'Sting_Cell_Intensity_Average',\n",
+ " 'Sting_Cytoplasm_Intensity_Average',\n",
+ " 'Sting_Nucleus_Intensity_Average',\n",
+ " 'Vimentin_Cell_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'Vimentin_Nucleus_Intensity_Average']"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Columns we want to keep: not_intensities, and any intensity column that contains 'Intensity_Average' (drop any intensity marker column that is not a mean intensity)\n",
+ "to_keep = not_intensities + [x for x in df.columns.values[~df.columns.isin(not_intensities)] if 'Intensity_Average' in x]\n",
+ "\n",
+ "to_keep"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "7ecf0c10-605d-486e-9b9e-f3cbb2a349cc",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " ROI_index Sample_ID Nucleus_Roundness Nucleus_Size \\\n",
+ "DD3S1_Cell_0 0 DD3S1.csv 0.955040 127 \n",
+ "DD3S1_Cell_1 0 DD3S1.csv 0.966643 112 \n",
+ "DD3S1_Cell_2 0 DD3S1.csv 0.721534 181 \n",
+ "DD3S1_Cell_3 0 DD3S1.csv 0.587196 119 \n",
+ "DD3S1_Cell_4 0 DD3S1.csv 0.655828 232 \n",
+ "\n",
+ " Nuc_X Nuc_Y_Inv Cell_Size \\\n",
+ "DD3S1_Cell_0 1484.771729 16632.205078 339 \n",
+ "DD3S1_Cell_1 1426.250000 16627.384766 344 \n",
+ "DD3S1_Cell_2 1531.110474 16622.238281 422 \n",
+ "DD3S1_Cell_3 1518.907593 16623.007812 278 \n",
+ "DD3S1_Cell_4 1488.051758 16616.375000 502 \n",
+ "\n",
+ " AF488_Cell_Intensity_Average AF488_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 2385.867188 2356.660400 \n",
+ "DD3S1_Cell_1 2818.250000 2884.366455 \n",
+ "DD3S1_Cell_2 2162.047363 2124.817383 \n",
+ "DD3S1_Cell_3 2422.715820 2411.867920 \n",
+ "DD3S1_Cell_4 2265.306885 2154.796387 \n",
+ "\n",
+ " AF488_Nucleus_Intensity_Average ... \\\n",
+ "DD3S1_Cell_0 2434.622070 ... \n",
+ "DD3S1_Cell_1 2681.294678 ... \n",
+ "DD3S1_Cell_2 2211.618896 ... \n",
+ "DD3S1_Cell_3 2437.210205 ... \n",
+ "DD3S1_Cell_4 2393.918213 ... \n",
+ "\n",
+ " r7c2_Nucleus_Intensity_Average r8c2_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 290.582672 341.790558 \n",
+ "DD3S1_Cell_1 304.133942 365.531982 \n",
+ "DD3S1_Cell_2 271.353577 320.874420 \n",
+ "DD3S1_Cell_3 292.134460 343.320129 \n",
+ "DD3S1_Cell_4 284.642242 326.241028 \n",
+ "\n",
+ " r8c2_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 337.825470 \n",
+ "DD3S1_Cell_1 369.340515 \n",
+ "DD3S1_Cell_2 315.605804 \n",
+ "DD3S1_Cell_3 338.679260 \n",
+ "DD3S1_Cell_4 314.748138 \n",
+ "\n",
+ " r8c2_Nucleus_Intensity_Average Sting_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 348.409454 1567.100342 \n",
+ "DD3S1_Cell_1 357.642853 1508.014526 \n",
+ "DD3S1_Cell_2 327.889496 1841.360229 \n",
+ "DD3S1_Cell_3 349.520996 1723.863281 \n",
+ "DD3S1_Cell_4 339.616394 1711.464111 \n",
+ "\n",
+ " Sting_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 1533.221680 \n",
+ "DD3S1_Cell_1 1565.086182 \n",
+ "DD3S1_Cell_2 1772.647339 \n",
+ "DD3S1_Cell_3 1688.094360 \n",
+ "DD3S1_Cell_4 1629.670410 \n",
+ "\n",
+ " Sting_Nucleus_Intensity_Average \\\n",
+ "DD3S1_Cell_0 1623.653564 \n",
+ "DD3S1_Cell_1 1389.794678 \n",
+ "DD3S1_Cell_2 1932.850830 \n",
+ "DD3S1_Cell_3 1771.655518 \n",
+ "DD3S1_Cell_4 1806.655151 \n",
+ "\n",
+ " Vimentin_Cell_Intensity_Average \\\n",
+ "DD3S1_Cell_0 7279.144531 \n",
+ "DD3S1_Cell_1 6123.456543 \n",
+ "DD3S1_Cell_2 4252.185059 \n",
+ "DD3S1_Cell_3 6178.647461 \n",
+ "DD3S1_Cell_4 5208.479980 \n",
+ "\n",
+ " Vimentin_Cytoplasm_Intensity_Average \\\n",
+ "DD3S1_Cell_0 7040.108398 \n",
+ "DD3S1_Cell_1 6734.603516 \n",
+ "DD3S1_Cell_2 4473.178223 \n",
+ "DD3S1_Cell_3 5316.924316 \n",
+ "DD3S1_Cell_4 4386.700195 \n",
+ "\n",
+ " Vimentin_Nucleus_Intensity_Average \n",
+ "DD3S1_Cell_0 7678.165527 \n",
+ "DD3S1_Cell_1 4857.508789 \n",
+ "DD3S1_Cell_2 3957.933594 \n",
+ "DD3S1_Cell_3 7330.025391 \n",
+ "DD3S1_Cell_4 6164.862305 \n",
+ "\n",
+ "[5 rows x 142 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# However, our to_keep list contains items that might not be in our df headers!\n",
+ "# These items are from our not_intensities list. So let's ask for only those items from to_keep that are actually found in our df\n",
+ "# Retains only the columns from the to_keep list that are found in the df's headers (columns). \n",
+ "# This ensures that we are only keeping the columns that exist in your df, avoiding any potential issues with non-existent column names. \n",
+ "# The result is a df containing only the specified columns.\n",
+ "df = df[[x for x in to_keep if x in df.columns.values]]\n",
+ "\n",
+ "print(df.head())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "284c8270-e13e-4f93-839b-5774a7fc9f4d",
+ "metadata": {},
+ "source": [
+ "## I.4. QC CHECKS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "91d9bebf-3c62-408e-923e-00447527ae3c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Index(['DD3S1_Cell_0', 'DD3S1_Cell_1', 'DD3S1_Cell_2', 'DD3S1_Cell_3',\n",
+ " 'DD3S1_Cell_4', 'DD3S1_Cell_5', 'DD3S1_Cell_6', 'DD3S1_Cell_7',\n",
+ " 'DD3S1_Cell_8', 'DD3S1_Cell_9',\n",
+ " ...\n",
+ " 'TMA_Cell_115751', 'TMA_Cell_115752', 'TMA_Cell_115753',\n",
+ " 'TMA_Cell_115754', 'TMA_Cell_115755', 'TMA_Cell_115756',\n",
+ " 'TMA_Cell_115757', 'TMA_Cell_115758', 'TMA_Cell_115759',\n",
+ " 'TMA_Cell_115760'],\n",
+ " dtype='object', length=433976)"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Let's take a look at a few features to make sure our dataframe is as expected\n",
+ "df.index"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "fe138d0d-7b02-48ac-af9e-caf85c4d3b73",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(433976, 142)"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "e1f30957-ab09-416b-8ed5-41b99a5c0b51",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Check for NaN entries (should not be any unless columns do not align)\n",
+ "# False means no NaN entries \n",
+ "# True means NaN entries \n",
+ "df.isnull().any().any()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "86e29b98-4758-4014-b976-db155fa9205f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "All expected filenames are present in big df Sample_ID column.\n",
+ "DD3S1_Cell_0 DD3S1.csv\n",
+ "DD3S1_Cell_1 DD3S1.csv\n",
+ "DD3S1_Cell_2 DD3S1.csv\n",
+ "DD3S1_Cell_3 DD3S1.csv\n",
+ "DD3S1_Cell_4 DD3S1.csv\n",
+ " ... \n",
+ "TMA_Cell_115756 TMA.csv\n",
+ "TMA_Cell_115757 TMA.csv\n",
+ "TMA_Cell_115758 TMA.csv\n",
+ "TMA_Cell_115759 TMA.csv\n",
+ "TMA_Cell_115760 TMA.csv\n",
+ "Name: Sample_ID, Length: 433976, dtype: object\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Check that all expected files were imported into final dataframe\n",
+ "if sorted(df.Sample_ID.unique()) == sorted(ls_samples):\n",
+ " print(\"All expected filenames are present in big df Sample_ID column.\")\n",
+ "else:\n",
+ " compare_headers(['no samples'], df.Sample_ID.unique(), \"big df Sample_ID column\")\n",
+ "\n",
+ "print(df.Sample_ID)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "66e0487d-8a29-400d-bde6-afde02985fdb",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "df.shape before removing 0 mean values: (433976, 142)\n",
+ "No zero intensity values found in the DataFrame.\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Delete rows that have 0 value mean intensities for intensity columns\n",
+ "print(\"df.shape before removing 0 mean values: \", df.shape)\n",
+ "\n",
+ "# We use the apply method on df to calculate the mean intensity for each row. It's done this by applying a lambda function to each row. \n",
+ "# The lambda function excludes the columns listed in the not_intensities list (which are not to be considered for mean intensity calculations) \n",
+ "# and calculates the mean of the remaining values in each row.\n",
+ "###############################\n",
+ "# !! This may take a while !! #\n",
+ "###############################\n",
+ "# Calculate mean intensity excluding 'not_intensities' columns\n",
+ "mean_intensity = df.loc[:, ~df.columns.isin(not_intensities)].mean(axis=1)\n",
+ "\n",
+ "# Check if there are any 0 mean intensity values\n",
+ "if (mean_intensity == 0).any():\n",
+ " df = df.loc[mean_intensity > 0, :]\n",
+ " print(\"df.shape after removing 0 mean values: \", df.shape)\n",
+ "else:\n",
+ " print(\"No zero intensity values found in the DataFrame.\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "93ff0fac-33ac-4120-b1cf-f3d413489b58",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Get quantiles (5th, 50th, 95th)\n",
+ "# List of nucleus size percentiles to extract \n",
+ "qs = [0.05,0.50,0.95] "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "86b0158b-6cb1-4ff8-815b-26aeed908b4b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.05 42.0\n",
+ "0.50 88.0\n",
+ "0.95 217.0\n",
+ "Name: Nucleus_Size, dtype: float64"
+ ]
+ },
+ "execution_count": 26,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[\"Nucleus_Size\"].quantile(q=qs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "d7d6bf19-f83c-47b6-8e3a-a32d78e64a5c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA20AAAIhCAYAAADdH1JpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAACbyklEQVR4nOzdeXhM1/8H8PdkkpnsQ8giliSIJWKnJEqiEbEERS2NxlKlrSpBWkWLKGIN/VZbWiqKil0RSxTVqi3Voqi1dolYYiJ7MnN+f8wvl8meSDoT3q/nmSd37j333s+9c2YynznnnisTQggQERERERGRUTIxdABERERERERUMCZtRERERERERoxJGxERERERkRFj0kZERERERGTEmLQREREREREZMSZtRERERERERoxJGxERERERkRFj0kZERERERGTEmLQREREREREZMSZtRiwyMhIymUx6mJubw8nJCR07dkR4eDgSEhLyrDN9+nTIZLIS7Sc1NRXTp0/HL7/8UqL18tuXq6srAgMDS7Sdovz4449YvHhxvstkMhmmT59epvsra/v370erVq1gZWUFmUyGbdu25Vvu+vXr0msdFRWVZ3nO+X7w4EG5xVoRzmeO48ePo3fv3qhVqxaUSiUcHR3h5eWFCRMm6JXz9fWFr6+vYYIsAzmfA9evXzd0KEahItXR4nJ1dcXQoUOl53fv3sX06dNx6tSpPGWHDh0Ka2vr59pXWX9GF+SXX36BTCYr8f+Wslba/3HPyvl8joyMLLRczjFv2rSp1PsyJoXVxYJkZWUhLCwMrq6uUCqVaNCgAb788stir5+cnIyQkBA4OzvD3NwczZo1y/d/4tChQ/W+I+U8GjRoUOx9/RdK8j4o7rEXZO/evWjXrh0sLCygUqnQo0cPnDt3Lk85X1/ffM9dly5dSnJoRu38+fOYPn16vv87hw4dCldXV715uT+HjZGpoQOgoq1cuRINGjRAVlYWEhIScPjwYcydOxcLFizA+vXr0alTJ6nsO++8U+I3XWpqKsLCwgCgRF9uS7Ov0vjxxx9x9uxZhISE5Fl29OhR1KhRo9xjKC0hBPr374969eph+/btsLKyQv369Ytcb8qUKejbty/MzMz+gygrnujoaPTs2RO+vr6YN28eqlWrhri4OPzxxx+IiorCwoULpbJff/21ASMlKtrWrVtha2srPb97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IiIiIiPGpI2IiIiIiMiIMWkjIiIiIioCx+6j0iqLusOkjYiIiIioADn3Knv2RtNEJZFTd569711JcSASIiIiIqICyOVyVKpUCQkJCQAAS0tLyGQyA0dFFYEQAqmpqUhISEClSpX07iNdUkzaCACgNTXD6YkzpGmiF42Z3AzzOs2TpomIiIrLyckJAKTEjagkKlWqJNWh0uLNtf9jRntz7XLAm2sTERHRi0Sj0SArK8vQYVAFYmZmVmgLG2+uTURERERUhuRy+XN1cSMqLSZtpKPRoPK50wCAxEZNAX4g0QtGo9Xgz7g/AQAtqrWA3IR1nIiIiCoGJm0EAJBnpKNTn9cAAFvO3IHG0srAERGVrfTsdLyy/BUAQPKkZFgpWMeJiIioYuCQ/0REREREREaMSRsREREREZERY9JGRERERERkxJi0ERERERERGTEmbUREREREREaMSRsREREREZER45D/BADQmprh3IcTpWmiF42Z3AzTfKZJ00REREQVhUwIIQwdxMskKSkJKpUKarUatra2hg4HG6+qy23b/eqoym3bREREREQVXXFzA3aPJCIiIiIiMmLsHkk6Wi1sr1wEACTVrQ+YMJ+nF4tWaPHP/X8AAA3tG8JExjpOREREFQOTNgIAyNPTENDNCwCw5cwdaCytDBwRUdlKy0qD5zeeAIDkScmwUrCOExERUcXAn5qJiIiIiIiMGJM2IiIiIiIiI8akjYiIiIiIyIgxaSMiIiIiIjJiTNqIiIiIiIiMGEePpHJTnjfuBnjzbiIiIiJ6OTBpIwCA1tQMF9/5UJometGYyc0Q6hUqTRMRERFVFDIhhDB0EC+TpKQkqFQqqNVq2NraGjqccm8NK09saSMiIiKiiqy4uQGvaSMiIiIiIjJi7B5JOlotLO/eAgCkOtcETJjP04tFK7S4qb4JAKilqgUTGes4ERERVQxM2ggAIE9PQ3ffpgCALWfuQGNpZeCIiMpWWlYa3L5wAwAkT0qGlYJ1nIiIiCoG/tRMRERERERkxJi0ERERERERGTEmbUREREREREaMSRsREREREZERY9JGRERERERkxJi0ERERERERGTEO+U8AACE3xZVB70jTRC8aUxNTjGo1SpomIiIiqij4zYUAAFqlEn+FLTB0GETlRmmqxFfdvzJ0GEREREQlxu6RRERERERERowtbaQjBBSPHgIAMu2qADKZgQMiKltCCDxIfQAAqGpZFTLWcSIiIqogmLQRAECelopebeoCALacuQONpZWBIyIqW6lZqXBY4AAASJ6UDCsF6zgRERFVDOweSUREREREZMSYtBERERERERkxJm1ERERERERGjEkbERERERGREWPSRkREREREZMSYtBERERERERkxDvlPAAAhN8X1Pm9K00QvGlMTUwxpOkSaJiIiIqoo+M2FAABapRKx874xdBhE5UZpqkTk65GGDoOIiIioxNg9koiIiIiIyIixpY10hIA8LRUAoLGwBGQyAwdEVLaEEEjN0tVxSzNLyFjHiYiIqIJgSxsBAORpqejTpDr6NKkuJW9EL5LUrFRYh1vDOtxaSt6IiIiIKgImbUREREREREaMSRsREREREZERY9JGRERERERkxJi0ERERERERGTEmbUREREREREaMSRsREREREZER433aCAAg5HLc6tJLmiZ60chN5HjD4w1pmoiIiKiiYNJGAACt0hzHlqwydBhE5cbc1Bwb+200dBhEREREJcbukUREREREREaMSRsREREREZERY9JGAAB5agr61a2EfnUrQZ6aYuhwiMpcSmYKZGEyyMJkSMlkHSciIqKKg0kbERERERGREWPSRkREREREZMSYtBERERERERkxJm1ERERERERGjEkbERERERGREWPSRkREREREZMSMOmnLzs7Gp59+Cjc3N1hYWKB27dqYMWMGtFqtVEYIgenTp8PZ2RkWFhbw9fXFuXPn9LaTkZGBDz/8EFWrVoWVlRV69uyJ27dv65VJTExEcHAwVCoVVCoVgoOD8fjxY70yN2/eRI8ePWBlZYWqVatizJgxyMzMLLfj/y8JuRxxvp0R59sZQi43dDhEZU5uIkc3927o5t4NchPWcSIiIqo4TA0dQGHmzp2LpUuXYtWqVWjUqBH++OMPDBs2DCqVCmPHjgUAzJs3DxEREYiMjES9evUwc+ZM+Pv74+LFi7CxsQEAhISEYMeOHYiKikKVKlUwYcIEBAYG4uTJk5D/f4ISFBSE27dvY8+ePQCAkSNHIjg4GDt27AAAaDQadO/eHfb29jh8+DAePnyIIUOGQAiBL7/80gBnp2xpleY4vHyDocMgKjfmpuaIDoo2dBhEREREJSYTQghDB1GQwMBAODo6YsWKFdK8vn37wtLSEqtXr4YQAs7OzggJCcHEiRMB6FrVHB0dMXfuXLz77rtQq9Wwt7fH6tWrMWDAAADA3bt3UbNmTezatQsBAQH4559/4OHhgWPHjqFNmzYAgGPHjsHLywsXLlxA/fr1sXv3bgQGBuLWrVtwdnYGAERFRWHo0KFISEiAra1tsY4pKSkJKpUKarW62OuUp41X1YYOodT61VEZOgQiIiIiolIrbm5g1N0jX331Vezfvx+XLl0CAJw+fRqHDx9Gt27dAADXrl1DfHw8OnfuLK2jVCrh4+ODI0eOAABOnjyJrKwsvTLOzs7w9PSUyhw9ehQqlUpK2ACgbdu2UKlUemU8PT2lhA0AAgICkJGRgZMnTxZ4DBkZGUhKStJ7EBERERERFZdRd4+cOHEi1Go1GjRoALlcDo1Gg1mzZuHNN98EAMTHxwMAHB0d9dZzdHTEjRs3pDIKhQKVK1fOUyZn/fj4eDg4OOTZv4ODg16Z3PupXLkyFAqFVCY/4eHhCAsLK8lhG4Q8NQU927gDALYfvwyNpZWBIyIqWymZKXBYoHufJ4QmwErBOk5EREQVg1G3tK1fvx5r1qzBjz/+iD///BOrVq3CggULsGrVKr1yMplM77kQIs+83HKXya98acrkNmnSJKjVaulx69atQuMyJNO0VJimpRo6DKJyk5qVitQs1nEiIiKqWIy6pe2jjz7CJ598goEDBwIAGjdujBs3biA8PBxDhgyBk5MTAF0rWLVq1aT1EhISpFYxJycnZGZmIjExUa+1LSEhAd7e3lKZe/fu5dn//fv39bZz/PhxveWJiYnIysrK0wL3LKVSCaVSWZrDJyIiIiIiMu6WttTUVJiY6Icol8ulIf/d3Nzg5OSEffv2ScszMzNx6NAhKSFr2bIlzMzM9MrExcXh7NmzUhkvLy+o1WqcOHFCKnP8+HGo1Wq9MmfPnkVcXJxUJiYmBkqlEi1btizjIyciIiIiItIx6pa2Hj16YNasWahVqxYaNWqEv/76CxEREXj77bcB6LorhoSEYPbs2XB3d4e7uztmz54NS0tLBAUFAQBUKhWGDx+OCRMmoEqVKrCzs0NoaCgaN26MTp06AQAaNmyILl26YMSIEVi2bBkA3ZD/gYGBqF+/PgCgc+fO8PDwQHBwMObPn49Hjx4hNDQUI0aMMIpRIImIiIiI6MVk1Enbl19+ic8++wyjRo1CQkICnJ2d8e6772Lq1KlSmY8//hhpaWkYNWoUEhMT0aZNG8TExEj3aAOARYsWwdTUFP3790daWhr8/PwQGRkp3aMNANauXYsxY8ZIo0z27NkTS5YskZbL5XJER0dj1KhRaNeuHSwsLBAUFIQFCxb8B2eCiIiIiIheVkZ9n7YXkbHep02emoI+TaoDALacuVMhRo/kfdqoJFIyU2Adbg0ASJ6UzNEjiYiIyOCKmxsYdUsb/XeEiQkSXmknTRO9aExkJvBx8ZGmiYiIiCoKJm0EANCaW+DQj9GGDoOo3FiYWeCXob8YOgwiIiKiEuPPzUREREREREaMSRsREREREZERY9JGAHQDkfRsXQc9W9eBPDXF0OEQlbmUzBTYz7eH/Xx7pGSyjhMREVHFwWvaSKJMfGjoEIjK1YPUB4YOgYiIiKjE2NJGRERERERkxJi0ERERERERGTEmbUREREREREaMSRsREREREZERY9JGRERERERkxDh6JAEAhIkJHjVuLk0TvWhMZCZo5dxKmiYiIiKqKJi0EQBAa26B/VsPGjoMonJjYWaB2BGxhg6DiIiIqMT4czMREREREZERY9JGRERERERkxJi0EQBAnpaKbj6N0c2nMeRpqYYOh6jMpWalwnWxK1wXuyI1i3WciIiIKg5e00Y6QsDqzi1pmuhFI4TADfUNaZqIiIioomBLGxERERERkRFj0kZERERERGTEmLQREREREREZMV7TRhXWxqvqctt2vzqqcts2EREREVFJsKWNiIiIiIjIiLGljXRkMqjrNpCmiV40MpkMHvYe0jQRERFRRcGkjQAAGgtLxOw5ZugwiMqNpZklzo06Z+gwiIiIiEqM3SOJiIiIiIiMGJM2IiIiIiIiI8akjQAA8rRUdO7SFp27tIU8LdXQ4RCVudSsVDT6uhEafd0IqVms40RERFRx8Jo20hECqisXpGmiF40QAufvn5emiYiIiCoKtrQREREREREZMSZtRERERERERoxJGxERERERkRFj0kZERERERGTEmLQREREREREZMY4eSToyGVKq15SmiV40MpkMLioXaZqIiIioomDSRgAAjYUldh3629BhEJUbSzNLXA+5bugwiIiIiEqM3SOJiIiIiIiMGJM2IiIiIiIiI8akjQAAJulp8OvdEX69O8IkPc3Q4RCVubSsNLT+rjVaf9caaVms40RERFRx8Jo2AgDItFrY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xOzfZgMAJrefDIWcdZyIiIgMq7i5QakGIklKSsK9e/fyzE9ISMCTJ09Ks0kyMJPsLDT6ci4afTkXJtlZhg6HqMxlabIQdigMYYfCkKVhHSciIqKKo1RJW+/evTFs2DBs2rQJt2/fxu3bt7Fp0yYMHz4cffr0KesYiYiIiIiIXlqluqZt6dKlCA0NxVtvvYWsLN0v1qamphg+fDjmz59fpgESERERERG9zEqVtFlaWuLrr7/G/PnzcfXqVQghULduXVhZWZV1fERERERERC+157q5dlxcHOLi4lCvXj1YWVmhFGOaEBERERERUSFKlbQ9fPgQfn5+qFevHrp164a4uDgAwDvvvMPh/omIiIiIiMpQqZK2cePGwczMDDdv3oSlpaU0f8CAAdizZ0+ZBUdERERERPSyK9U1bTExMdi7dy9q1KihN9/d3R03btwok8Dov6VRmuPnLQekaaIXjbmpOU68c0KaJiIiIqooSpW0paSk6LWw5Xjw4AGUSuVzB0UGIJcjsUkLQ0dBVG7kJnK0rt7a0GEQERERlVipukd26NABP/zwg/RcJpNBq9Vi/vz56NixY5kFR0RERERE9LIrVUvb/Pnz4evriz/++AOZmZn4+OOPce7cOTx69Ai///57WcdI/wFZZibcVy0FAFwe8h6EQmHgiIjKVqYmE18c+wIAMLbtWCjkrONERERUMZQqafPw8MCZM2fwzTffQC6XIyUlBX369MEHH3yAatWqlXWM9B8wyc5C07lTAQBXBw2HhkkbvWCyNFn4+OePAQCjWo9i0kZEREQVRomTtqysLHTu3BnLli1DWFhYecRERERERERE/6/E17SZmZnh7NmzkMlk5REPERERERERPaNUA5EMHjwYK1asKOtYiIiIiIiIKJdSXdOWmZmJ5cuXY9++fWjVqhWsrKz0lkdERJRJcERERERERC+7EiVt//77L1xdXXH27Fm0aKG7p9elS5f0yrDbJBERERERUdkpUdLm7u6OuLg4HDx4EAAwYMAA/O9//4Ojo2O5BEdERERERPSyK1HSJoTQe757926kpKSUaUBkGBqlOX5Zs0OaJnrRmJua4+CQg9I0ERERUUVRqmvacuRO4qgCk8txv217Q0dBVG7kJnL4uvoaOgwiIiKiEivR6JEymSzPNWu8ho2IiIiIiKj8lLh75NChQ6FUKgEA6enpeO+9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QPsRAwAAW87cgYZJG71gMrIzELguEACQPCkZpgrWcSIiIqoY+K2FyAByWjjLA1vxiIiIiF4sRj16JBERERER0cuOSRsREREREZERY9JGRERERERkxJi0ERERERERGTEmbUREREREREaMo0cSAEBrpsCf0+ZL00QvGoVcgSVdl0jTRERERBUFkzYCAAgzM1wNHmHoMIjKjZncDB+88oGhwyAiIiIqMXaPJCIiIiIiMmJsaSMdjQb2sUcAAPdbewNyuYEDIipbGq0Gv938DQDQvlZ7yE1Yx4mIiKhiYNJGAAB5Rjp83+oBANhy5g40llYGjoiobKVnp6Pjqo4AgORJybBSsI4TERFRxcDukUREREREREaMSRsREREREZERY9JGRERERERkxJi0ERERERERGTEmbUREREREREaMSRsREREREZER45D/BADQmprh9MQZ0jTRi8ZMboZ5neZJ00REREQVBZM2AgAIhQKXRowxdBhE5UYhV+Cjdh8ZOgwiIiKiEmP3SCIiIiIiIiPGljbS0WhQ+dxpAEBio6aAXG7ggIjKlkarwZ9xfwIAWlRrAbkJ6zgRERFVDEzaCAAgz0hHpz6vAQC2nLkDjaWVgSMiKlvp2el4ZfkrAIDkScmwUrCOExERUcXA7pFERERERERGjEkbERERERGREWPSRkREREREZMSYtBERERERERkxJm1ERERERERGjEkbERERERGREeOQ/wQA0Jqa4dyHE6VpoheNmdwM03ymSdNEREREFYVMCCEMHcTLJCkpCSqVCmq1Gra2toYOBxuvqg0dApWxfnVUhg6BiIiIiIqhuLkBu0cSEREREREZMXaPJB2tFrZXLgIAkurWB0yYz9OLRSu0+Of+PwCAhvYNYSJjHSciIqKKgUkbAQDk6WkI6OYFANhy5g40llYGjoiobKVlpcHzG08AQPKkZFgpWMeJiIioYuBPzUREREREREaMSRsREREREZERY9JGRERERERkxJi0ERERERERGTEmbUREREREREaMSRsREREREZER45D/BADQmprh4jsfStNELxozuRlCvUKlaSIiIqKKQiaEEIYO4mWSlJQElUoFtVoNW1tbQ4eDjVfVhg6Byli/OipDh0BERERExVDc3IDdI4mIiIiIiIwYu0eSjlYLy7u3AACpzjUBE+bz9GLRCi1uqm8CAGqpasFExjpO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UJDCw8M1duxYHTx40Op/9913lZCQIJfLpebNm2vQoEEqKys75/sKAFciijYAwGXh6+urp556SgsXLtS333570evJzMzU5MmTdc899yg/P18rVqxQmzZtTju2vLxc/fv3V1BQkD7++GNt2rRJQUFBuvbaa1VVVXVe29u2bZvuu+8+zZkzR19++aVWrVqlvn37nvN1QUFBCgoK0vLly1VZWXle23rwwQdVXFxsPf70pz+pcePGSkpKkiTNmjVLWVlZyszM1M6dO3X//ffrjjvuUG5u7mnXd6pIzcrK8mjPyspSeHi4hg4dquPHj2vYsGFat26dduzYoSFDhmjkyJEqKio6r5hPp7i4WMnJyercubO2bdumVatW6fvvv9fNN99s9Y8ZM0bjx4/XF198oZycHN1www0yxlz0NgGgIfPzdgAAgCvHqFGj1LlzZ82ePVuvvPLKRa3jiSee0AMPPKBp06ZZbd27dz/t2KVLl8rHx0cvv/yyde9cVlaWmjRpopycHKWkpJxze0VFRQoMDNSIESMUHBysmJgYdenS5Zyv8/Pz02uvvaa7775bL7zwgrp27ark5GTdeuut6tSp02lfc6rQk6QtW7Zo1qxZWrJkiTp27KiysjLNnz9f69evV8+ePSVJcXFx2rRpk1588UUlJyefdp3jx4/XsGHDtHfvXsXFxckYo9dee01paWny9fVVYmKiEhMTrfFPPPGEsrOztWLFirOewTybzMxMde3aVU899ZTV9uqrryo6Olq7du3S8ePHVV1drRtuuEExMTGSTt5/BwA4Pc60AQAuq6efflpLlixRQUHBBb+2pKRE3333nQYOHHhe47dv366vvvpKwcHBVkHUrFkzVVRUaM+ePee1jsGDBysmJkZxcXEaO3as3nzzzdPeI3Y6N954o7777jutWLFCQ4YMUU5Ojrp27Wpd7ngmRUVFuv766/Xggw9aZ6cKCgpUUVGhwYMHW/sSFBSk119//az7kpKSopYtW1pn29avX6/CwkLdddddkqSysjL94Q9/UHx8vJo0aaKgoCD997///VVn2rZv364NGzZ4xNm+fXtJ0p49e5SYmKiBAwcqISFBo0eP1uLFi6+oex0B4EJRtAEALqu+fftqyJAhevTRR2v1+fj41LpE7qeffrKWXS7XBW3L7XarW7duysvL83js2rVLt91223ltMzg4WJ9++qneeustRUZG6rHHHlNiYqKOHDlyXjEEBARo8ODBeuyxx7R582alpaVp9uzZZxxfVlam6667Tj179tScOXM89kWSPvjgA499KSgoOOt9bT4+PkpLS9OSJUvkdruVlZWlvn37qm3btpKkhx56SO+9956efPJJbdy4UXl5eUpISDjj5aM+Pif/dPj5e/bz9+tUrCNHjqz1vu/evVt9+/aVr6+v1q5dq5UrVyo+Pl4LFy5Uu3bttG/fvnO8mwBwZaJoAwBcdnPnztX777+vzZs3e7SHhobqwIEDHgXBzye8CA4OVmxsrD766KPz2k7Xrl21e/duhYWFqU2bNh6PkJAQa5vFxcXWa2pqavT55597rMfPz0+DBg3SvHnz9Nlnn6mwsFDr16+/0N2WJMXHx59xwg1jjO644w653W799a9/9fg5hPj4eDmdThUVFdXal+jo6LNu86677tK3336rZcuWadmyZZowYYLVt3HjRqWlpWnUqFFKSEhQRESEx0QtvxQaGipJHu/Zz3MknXzfd+7cqdjY2FqxBgYGSjo5AUvv3r31+OOPa8eOHWrUqJGys7PPuh8AcKXinjYAwGWXkJCg22+/XQsXLvRo79evn3744QfNmzdPN910k1atWqWVK1fqqquussakp6dr0qRJCgsL09ChQ1VaWqpPPvlEU6dOrbWd22+/Xc8884xSU1M1Z84ctWzZUkVFRVq2bJkeeughtWzZUgMGDNCMGTP0wQcfqHXr1nr22Wc9zqL94x//0N69e9W3b181bdpUH374odxut9q1a3fWfTx06JBGjx6t8ePHq1OnTgoODta2bds0b948paamnvY16enpWrdundasWaPjx4/r+PHjkqSQkBAFBwfrwQcf1P333y+3260+ffro2LFj2rx5s4KCgjRu3LgzxtKqVSsNGDBA99xzj/z9/T1mv2zTpo2WLVumkSNHyuFw6I9//KN1Vu90XC6XevTooblz5yo2NlYHDx7UrFmzPMZMnjxZixcv1pgxY/TQQw+pRYsW+uqrr7R06VItXrxY27Zt00cffaSUlBSFhYXpX//6l3744Qddc801Z31PAeCKZQAAqGPjxo0zqampHm2FhYXG6XSaX34VZWZmmujoaBMYGGjuvPNO8+STT5qYmBiPMS+88IJp166d8ff3N5GRkWbq1KlWnySTnZ1tPS8uLjZ33nmnadGihXE6nSYuLs7cfffd5ujRo8YYY6qqqsy9995rmjVrZsLCwkxGRoZJTU0148aNM8YYs3HjRpOcnGyaNm1qXC6X6dSpk3n77bfPuc8VFRXmkUceMV27djUhISGmcePGpl27dmbWrFmmvLz8tPEmJycbSbUeWVlZxhhj3G63ee6556x9Dw0NNUOGDDG5ubnnjOdvf/ubkWTuuecej/Z9+/aZ/v37G5fLZaKjo83zzz9vkpOTzbRp06wxMTEx5tlnn7WeFxQUmB49ehiXy2U6d+5s1qxZYySZDRs2WGN27dplRo0aZZo0aWJcLpdp3769mT59unG73aagoMAMGTLEhIaGGqfTaX7zm9+YhQsXnnMfAOBK5TCG+XUBAAAAwK64pw0AAAAAbIyiDQCAi1BUVOQxpf0vH79mynwAAH6OyyMBALgI1dXVZ51lMTY2Vn5+zPcFAPj1KNoAAAAAwMa4PBIAAAAAbIyiDQAAAABsjKINAAAAAGyMog0AAAAAbIyiDQAAAABsjKINAAAAAGyMog0AAAAAbOz/AU3o+iGropfUAAAAAElFTkSuQmCC",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The plot is saved at: /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/Nucleus_Size_Distribution.png\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Plot the distribution of the Nucleus_Size column\n",
+ "fig, ax = plt.subplots(figsize=(10, 6))\n",
+ "ax.hist(df['Nucleus_Size'], bins=30, alpha=0.7, color='skyblue')\n",
+ "\n",
+ "# Add horizontal bars for the 0.05 and 0.95 quantiles\n",
+ "quantile_05 = df['Nucleus_Size'].quantile(0.05)\n",
+ "quantile_95 = df['Nucleus_Size'].quantile(0.95)\n",
+ "ax.axvline(x=quantile_05, color='r', linestyle='--', label='Quantile 0.05')\n",
+ "ax.axvline(x=quantile_95, color='g', linestyle='--', label='Quantile 0.95')\n",
+ "\n",
+ "# Add titles and labels\n",
+ "ax.set_title('Distribution of Nucleus_Size column values with horizontal bars at 0.05 and 0.95 quantiles')\n",
+ "ax.set_xlabel('Nucleus_Size Values')\n",
+ "ax.set_ylabel('Frequency')\n",
+ "ax.legend()\n",
+ "\n",
+ "# Display quantiles values\n",
+ "ax.text(quantile_05, ax.get_ylim()[1], f' 5th Quantile: {quantile_05:.2f}', color='r', verticalalignment='top')\n",
+ "ax.text(quantile_95, ax.get_ylim()[1], f' 95th Quantile: {quantile_95:.2f}', color='g', verticalalignment='top')\n",
+ "\n",
+ "# Display the plot\n",
+ "plt.show()\n",
+ "\n",
+ "# Save the plot in the output_images_dir directory using fig.savefig\n",
+ "plot_file_path = os.path.join(output_images_dir, \"Nucleus_Size_Distribution.png\")\n",
+ "fig.savefig(plot_file_path)\n",
+ "print(f\"The plot is saved at: {plot_file_path}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "fe562d2b-5026-4a88-8117-4ec910dd1242",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0.05 1019.689148\n",
+ "0.50 1346.929932\n",
+ "0.95 2622.449524\n",
+ "Name: AF555_Cell_Intensity_Average, dtype: float64\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(df[\"AF555_Cell_Intensity_Average\"].quantile(q=qs))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "8b53dced-802d-4bfd-8e37-de33ffec9c7a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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ItIrTFSJiIiIiIhIrzBRJSIiIiIiIr1SqrenIf0g5IaI6fme9FxXDA0MMajeIOk5ERERERGRNpg9ELKUSkTNXqLzcpWGSoR2D9V5uURERERE9GZj118iIiIiIiLSK2xRJUAIyF88BwCoTUwBmUxHxQo8z8gu19TIFDIdlUtERERERG82tqgS5C+eo2fdiuhZt6KUsOrC84znMJ9hDvMZ5lLCSkREREREVBQmqkRERERERKRXmKgSERERERGRXmGiSkRERERERHqFiSoRERERERHpFSaqREREREREpFeYqBIREREREZFe4X1UCUIux+323aTnuiI3kKOXay/pORERERERkTaYqBKylMaIXLRC5+UaGxpjU+9NOi+XiIiIiIjebOz6S0RERERERHqFiSoRERERERHpFSaqBPnzFPSuXga9q5eB/HmKzspNSU+BbIoMsikypKTrrlwiIiIiInqzMVElIiIiIiIivcJElYiIiIiIiPQKE1UiIiIiIiLSK0xUiYiIiIiISK8wUSUiIiIiIiK9wkSViIiIiIiI9IphaVeASp+QyxHX2kd6rityAzk61ugoPSciIiIiItIGE1VCltIYx3/eqPNyjQ2Nsctvl87LJSIiIiKiNxu7/hIREREREZFeYaJKREREREREeoWJKkH+PAU96tijRx17yJ+n6KzclPQUmE03g9l0M6Sk665cIiIiIiJ6s/EaVQIAGL54/lrKfZ7xesolIiIiIqI3F1tUiYiIiIiISK8wUSUiIiIiIiK9wkSViIiIiIiI9AoTVSIiIiIiItIrTFSJiIiIiIhIr3DUX4IwMEBCkxbSc10xkBnA09FTek5ERERERKQNJqqELGMTHFm7S+flmhiZ4HDAYZ2XS0REREREbzY2cxEREREREZFeYaJKREREREREeoWJKkH+PAVdG1dD18bVIH+eorNyU9JTUGFOBVSYUwEp6borl4iIiIiI3mylmqguWbIEdevWhaWlJSwtLeHh4YHdu3dL84UQmDx5Muzt7WFiYoLWrVvj4sWLGmWkpaXh448/Rvny5WFmZoauXbvizp07GjGJiYnw9/eHSqWCSqWCv78/njx5ohETGxuLLl26wMzMDOXLl8eoUaOQnp6uEXPhwgV4enrCxMQEFStWxDfffAMhhG53SilRJj6CMvGRzst9+PwhHj5/qPNyiYiIiIjozVWq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iYiIiIj+6/QtN9AnJer626pVK6xcuVJ6LZPJkJWVhTlz5qBNmzY6qxwRERERERG9fUrU9XfOnDlo3bo1fv/9d6Snp+PTTz/FxYsX8fjxY5w4cULXdaTXTJaejhorfgQAXB/0IYRCoZNy09XpWBC5AAAwutloKOS6KZeIiIiIiN5sJer6C2TfMmbJkiU4c+YMsrKy0LBhQ4wYMQJ2dna6ruMbRd+a9zfdSIL8eQp61q0IANh6/i7UpiW/H+7LOjoYwnyGOQDg2YRnMFPoplwiIiIiojeBvuUG+qTYLaoZGRnw8fHB0qVLMWXKlNdRJyIiIiIiInqLFfsaVSMjI0RHR/N2LERERERERPRalGgwpYEDB2L58uW6rgsRERERERFRyQZTSk9Px88//4x9+/bB3d0dZmaa1x4GBwfrpHJERERERET09ilWovr333/DyckJ0dHRaNiwIQDg2rVrGjHsEkxERERERESvoliJao0aNRAXF4dDhw4BAPr27Yvvv/8eNjY2r6VyRERERERE9PYpVqKa+042u3fvRkpKik4rRP8+tdIYh1fvkJ7rirGhMQ4NOiQ9JyIiIiIi0kaJrlHNUcJbsJK+kcvxoFlL3RdrIEdrp9Y6L5eIiIiIiN5sxRr1VyaT5bkGldekEhERERERkS4Vu+tvQEAAlEolACA1NRUffvhhnlF/t27dqrsa0msny8hA1fWhAIC/+wVAGBnppNwMdQaWnVkGAPig0QcwkuumXCIiIiIierMVK1EdNGiQxusBAwbotDJUOgwy0tFwyicAgJh3/aDWUaKark7HyN0jAQAB9QOYqBIRERERkVaKlaiGhIS8rnoQERERERERASjmNapERERERERErxsTVSIiIiIiItIrTFSJiIiIiIhIrzBRJSIiIiIiIr3CRJWIiIiIiIj0SrFG/aU3U5ZCiWM/bZCe64rSUImd7+2UnhMREREREWmDiSpBGBoivo2vzss1NDBEJ+dOOi+XiIiIiIjebOz6S0RERERERHqFLaoEWUYGKv+6EQAQ27UPhJGRTsrNUGdgzYU1AID+dfrDSK6bcomIiIiI6M3GRJVgkJGOJp+NAADc6dAdah0lqunqdAzePhgA0Nu1NxNVIiIiIiLSCrv+EhERERERkV5hokpERERERER6hYkqERERERER6RUmqkRERERERKRXmKgSERERERGR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sdvtNTqORx55RHv37tWmTZs0cuRItW3bVpdddpnGjBmjzMxMNWrUSJJUWlqqBx98UM2bN1dAQIC6dOmi1atX1+g9fqlRo0bppptu0qxZsxQeHq6mTZvqvvvuU1lZmSTp+uuv1759+/TAAw9YM8inrF+/Xtddd52cTqciIyM1YcIEFRUVWe1RUVGaMWOG7rzzTjVu3FgXXnih3njjDau9tLRU48aNU3h4uBo0aKCoqCjNnDnTav/5qb+tWrWSJF155ZWy2Wy6/vrr9dVXX8nPz085OTluxzR58mRdd911Nf4M5s+fr2HDhikpKUlvvfWWNbP9+uuvq3nz5qqsrHSLHzBggEaOHGk9/+STTxQTE6MGDRrooosu0hNPPKHy8nK343jttdc0cOBABQQE6KmnnlJFRYVGjx6tVq1ayel0qnXr1vrLX/7i9j7l5eWaMGGCmjRpoqZNm+qhhx7SyJEjddNNN1kxxhg999xzuuiii+R0OtWxY0f9/e9/P+OxJiUlqaSkRB9++KHb/v379+vLL7/U6NGjtXv3bg0cOFChoaFq1KiROnfurJUrV54xZ3Wz3UePHpXNZnMbtzt27NCNN96oRo0aKTQ0VElJSTpy5IjV/ve//13t27eX0+lU06ZN1atXL7fxBACoikIVAOrQ+++/r9atW6t169YaMWKEkpOTf9VpsuPGjVNwcLA6d+6s1157rUoBIp0sQkJCQtS9e/cz/sF/5ZVXKjw8XD179tSqVatq9N6VlZVavHixhg8froiIiCrtjRo1kq/vyRN47rjjDv3zn//U4sWLtXXrVg0ePFh9+vTRd9999wuOtuZWrVql3bt3a9WqVXr77be1YMEC68eApUuXqkWLFpo+fbqys7OVnZ0tScrKylJCQoIGDRqkrVu36v3339e6des0btw4t9wvvPCCOnXqpIyMDI0dO1b33nuvdar0Sy+9pI8//lgffPCBdu3apXfffVdRUVHV9nHz5s2STs54Z2dna+nSpbruuut00UUXaeHChVZceXm53n33Xd1xxx01OvZjx47pww8/1IgRI9S7d28VFRVZxdXgwYN15MgRt+84Ly9Pn3/+uYYPHy5J+vzzzzVixAhNmDBBO3bs0Ouvv64FCxbo6aefdnufadOmaeDAgcrKytKdd96pyspKtWjRQh988IF27Nihxx57TI888og++OAD6zXPPvusFi1apOTkZP3zn/9UQUFBlWt2//SnPyk5OVmvvvqqtm/frgceeEAjRozQmjVrqj3epk2bauDAgUpOTnbbn5ycrNDQUPXt21eFhYW68cYbtXLlSmVkZCghIUH9+/fX/v37a/SZVic7O1txcXG64oor9PXXX2vFihU6dOiQhgwZYrXffvvtuvPOO7Vz506tXr1agwYN+k1OhweA3zUDAKgz3bp1M3PmzDHGGFNWVmaCg4NNamqq1b5nzx4jyTidThMQEGA9tmzZYsU8+eSTZv369SYjI8PMmjXLNGzY0Dz55JNW++HDh83s2bPNpk2bTFpamvnzn/9sfHx8zMKFC62Yb775xrzxxhsmPT3drF+/3tx7773GZrOZNWvWnPMYDh06ZCSZ2bNnnzXu+++/NzabzRw8eNBtf8+ePc3UqVONMcYkJycbl8tltU2bNs107NjxnH2oLnbkyJGmZcuWpry83No3ePBgM3ToUOt5y5YtzYsvvuiWJykpydx9991u+9auXWt8fHxMcXGx9boRI0ZY7ZWVlSYkJMS8+uqrxhhjxo8fb2644QZTWVlZbV8lmWXLlhlj/u87zsjIcIt59tlnTZs2baznH330kWnUqJEpLCw8+wfxv9544w1zxRVXWM/vv/9+M3z4cOv5gAEDzJ133mk9f/31101YWJj1eV177bVmxowZbjkXLlxowsPD3Y5j4sSJ5+zL2LFjzS233GI9Dw0NNc8//7z1vLy83Fx44YVm4MCBxhhjCgsLTYMGDcz69evd8owePdrcfvvtZ3yfzz77zNhsNrN7925jzMnvJSoqyhpf1Wnbtq15+eWXrec/HxPVfTd5eXlGklm1apUxxpg///nPJj4+3i3ngQMHjCSza9cuk56ebiSZvXv3nrEPAICquEYVAOrIrl27tHnzZi1dulSS5Ovrq6FDh+qtt95Sr1693GLff/99tWnTxnoeGRlpbf/pT3+ytk8tJjR9+nRrf3BwsB544AErplOnTsrLy9Nzzz1nLcp0alb3lNjYWB04cECzZs0656mm5n9nhn5+6mx1tmzZImOMLrvsMrf9JSUlatq06Vlf+2u1a9fO7fTl8PBwZWVlnfU16enp+v7777Vo0SJrnzFGlZWV2rNnj/U9dOjQwWq32WwKCwtTbm6upJOnHffu3VutW7dWnz59lJiYqPj4+F/U91GjRulPf/qTNm7cqK5du+qtt97SkCFDFBAQUKPXz58/323RrREjRui6667T0aNH1aRJEw0fPlx33323XnnlFTkcDi1atEi33Xab9Xmlp6crLS3NbQa1oqJCJ06c0PHjx63rQDt16lTlvV977TW9+eab2rdvn4qLi1VaWmqNzfz8fB06dEhXX321FW+32xUTE2OdCbBjxw6dOHFCvXv3dstbWlqqK6+88ozHHB8frxYtWig5OVlPPvmkvvzyS+3du9eahS4qKtITTzyhf/zjH/rxxx9VXl6u4uLi/2pGNT09XatWrbJOb/+53bt3Kz4+Xj179lT79u2VkJCg+Ph43XrrrQoKCvrV7wkA5wMKVQCoI/Pnz1d5ebmaN29u7TPGyM/PT3l5eW5/yEZGRuqSSy6pUd6uXbuqoKBAhw4dOuPiMV27dtWbb755zjzvvvvuOd+vWbNmCgoK0s6dO88aV1lZKbvdrvT09CrXvlb3R74nnL6wj81mq/a06J+rrKzUPffcowkTJlRp+/lCV2fLfdVVV2nPnj367LPPtHLlSg0ZMkS9evU66zWWpwsJCVH//v2VnJysiy66SJ9++mmNr+fdsWOHNm3apLS0ND300EPW/oqKCr333nu699571b9/f1VWVmr58uXq3Lmz1q5dq9mzZ7t9Dk888YQGDRpUJX+DBg2s7dML5w8++EAPPPCAXnjhBcXGxqpx48Z6/vnntWnTJre403/YMD87FfbU57h8+XK3/z4kyeFwnPG4fXx8NGrUKC1YsEBPPPGEkpOTdd111+nSSy+VJP3xj3/U559/rlmzZumSSy6R0+nUrbfeqtLS0jPmO71vp65x/nlf+/fvr2effbbK68PDw2W325Wamqr169crJSVFL7/8sh599FFt2rTJuj4ZAFAVhSoA1IHy8nK98847euGFF6rMtN1yyy1atGhRlWsiayojI0MNGjQ46yq7GRkZCg8PP2eec8VIJ/+YHzp0qBYuXKhp06ZVuU61qKhIDodDV155pSoqKpSbm6trr722RsdS2/z9/VVRUeG276qrrtL27dtr/MPAmQQGBmro0KEaOnSobr31VvXp00f/+c9/qqy2fGpRq9P7IUl33XWXbrvtNrVo0UIXX3yxunfvXqP3nj9/vq677jr99a9/ddu/cOFCzZ8/X/fee6+cTqcGDRqkRYsW6fvvv9dll12mmJgYK/aqq67Srl27fvHnsHbtWnXr1k1jx4619u3evdvadrlcCg0N1ebNm61xUFFRoYyMDGvWtW3btnI4HNq/f7/i4uJ+0fvfcccdeuqpp7R06VItXbrU7VZNa9eu1ahRo3TzzTdLkgoLC7V3794z5jq16nV2drY1k3v6bYSuuuoqLVmyRFFRUda12Kez2Wzq3r27unfvrscee0wtW7bUsmXLNGnSpF90bABwPqFQBYA68I9//EN5eXkaPXp0lRV8b731Vs2fP79Gheonn3yinJwcxcbGyul0atWqVXr00Ud19913WzNPb7/9tvz8/HTllVfKx8dHn3zyiV566SW3GaA5c+YoKipK7dq1U2lpqd59910tWbJES5YsqdHxzJgxQ6tXr1aXLl309NNPq1OnTvLz89PatWs1c+ZMpaWl6bLLLtPw4cP1//7f/9MLL7ygK6+8UkeOHNGXX36p9u3b68Ybb/wFn6BnREVF6auvvtJtt90mh8Oh4OBgPfTQQ+ratavuu+8+jRkzRgEBAdq5c6dSU1P18ssv1yjviy++qPDwcF1xxRXy8fHRhx9+qLCwsGp/PAgJCZHT6dSKFSvUokULNWjQwBoTCQkJcrlceuqppzR9+vQavXdZWZkWLlyo6dOnKzo62q3trrvu0nPPPad//etf6tixo4YPH67+/ftr+/btbqcJS9Jjjz2mxMRERUZGavDgwfLx8dHWrVuVlZWlp5566ozvf8kll+idd97R559/rlatWmnhwoVKS0tzmz0cP368Zs6cqUsuuUSXX365Xn75ZeXl5VmzrI0bN9aUKVP0wAMPqLKyUtdcc40KCgq0fv16NWrUyG1l4tO1atVKN9xwg+6++275+fnp1ltvdevb0qVL1b9/f9lsNv35z38+6wy70+lU165d9cwzzygqKkpHjhxxO9Veku677z7NmzdPt99+u/74xz8qODhY33//vRYvXqx58+bp66+/1hdffKH4+HiFhIRo06ZNOnz4sNup/ACAatTlBbIAcL5KTEw0N954Y7VtpxZfSU9PP+NCO6d89tln5oorrjCNGjUyDRs2NNHR0WbOnDmmrKzMilmwYIFp06aNadiwoWncuLGJiYlxW0jJmJML91x88cWmQYMGJigoyFxzzTVm+fLlv+iYjh49ah5++GFz6aWXGn9/fxMaGmp69eplli1bZi0qVFpaah577DETFRVl/Pz8TFhYmLn55pvN1q1bjTGeX0zp1OI8p9x///0mLi7Oer5hwwbToUMH43A4zM//l7h582bTu3dv06hRIxMQEGA6dOhgnn76aau9ukWYOnbsaKZNm2aM+b+FjAICAkxgYKDp2bOn2wJY+tliSsYYM2/ePBMZGWl8fHzc+mfMycV67Ha7+fHHH2v0Ofz97383Pj4+Jicnp9r29u3bm/HjxxtjTi5iFB4ebiRZCxD93IoVK0y3bt2M0+k0gYGB5uqrrzZvvPHGGY/DGGNOnDhhRo0aZVwul2nSpIm59957zcMPP+z23ZSVlZlx48aZwMBAExQUZB566CEzePBgc9ttt1kxlZWV5i9/+Ytp3bq18fPzM82aNTMJCQk1WuDrb3/7m5FUZVGsPXv2mB49ehin02kiIyPN3LlzTVxcnLn//vutmNO/2x07dpiuXbsap9NprrjiCpOSkuK2mJIxxnz77bfm5ptvNk2aNDFOp9NcfvnlZuLEiaaystLs2LHDJCQkmGbNmhmHw2Euu+wyt8WbAADVsxnD+ugAAHirMWPG6NChQ/r444/ruiu1prKyUm3atNGQIUP05JNP1nV3AABegFN/AQDwQvn5+UpLS9OiRYv0P//zP3XdHY/at2+fUlJSFBcXp5KSEs2dO1d79uzRsGHD6rprAAAv4VPXHQAAeL9GjRqd8bF27drzpg+/pYEDB2rAgAG65557qtympW/fvmf8LGbMmFFHPa45Hx8fLViwQJ07d1b37t2VlZWllStXct0mAMDCqb8AgHP6/vvvz9jWvHlzOZ3O86IP3uLgwYMqLi6utu2CCy6osrIwAAC/NxSqAAAAAACvwqm/AAAAAACvQqEKAAAAAPAqFKoAAAAAAK9CoQoAAAAA8CoUqgAAAAAAr0KhCgAAAADwKhSqAAAAAACv8v8B75FiJyxFAAEAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The plot is saved at: /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/AF555_Cell_Intensity_Average_Distribution.png\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Plot the distribution of the Nucleus_Size column\n",
+ "fig, ax = plt.subplots(figsize=(10, 6))\n",
+ "ax.hist(df['AF555_Cell_Intensity_Average'], bins=30, alpha=0.7, color='skyblue')\n",
+ "\n",
+ "# Add horizontal bars for the 0.05 and 0.95 quantiles\n",
+ "quantile_05 = df['AF555_Cell_Intensity_Average'].quantile(0.05)\n",
+ "quantile_95 = df['AF555_Cell_Intensity_Average'].quantile(0.95)\n",
+ "ax.axvline(x=quantile_05, color='r', linestyle='--', label='Quantile 0.05')\n",
+ "ax.axvline(x=quantile_95, color='g', linestyle='--', label='Quantile 0.95')\n",
+ "\n",
+ "# Add titles and labels\n",
+ "ax.set_title('Distribution of AF555_Cell_Intensity_Average column values with horizontal bars at 0.05 and 0.95 quantiles')\n",
+ "ax.set_xlabel('AF555_Cell_Intensity_Average Values')\n",
+ "ax.set_ylabel('Frequency')\n",
+ "ax.legend()\n",
+ "\n",
+ "# Display quantiles values\n",
+ "ax.text(quantile_05, ax.get_ylim()[1], f' 5th Quantile: {quantile_05:.2f}', color='r', verticalalignment='top')\n",
+ "ax.text(quantile_95, ax.get_ylim()[1], f' 95th Quantile: {quantile_95:.2f}', color='g', verticalalignment='top')\n",
+ "\n",
+ "# Display the plot\n",
+ "plt.show()\n",
+ "\n",
+ "# Save the plot in the output_images_dir directory using fig.savefig\n",
+ "plot_file_path = os.path.join(output_images_dir, \"AF555_Cell_Intensity_Average_Distribution.png\")\n",
+ "fig.savefig(plot_file_path)\n",
+ "print(f\"The plot is saved at: {plot_file_path}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "116f1ba5-5a9b-4161-8fab-d5ecb8524179",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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FAjuFKztMIiIiIjeehz2noiIiIiISEvYQkbFJwSQnKyeNjQEODxsmSOEQHKGug4Y6htyiGAiIiKiEmILGRVfcjJgbKx+ZCdmVKYkZyTDeLoxjKcbS4kZERERERUfW8joP7E7OjHfZa3tjf/DSIiIiIiI3hxsISMiIiIiItISJmRERERERERawoSMiIiIiIhIS5iQERERERERaQkTMiIiIiIiIi3hKItUfLq6QJcuL6apzNHV0UUX9y7SNBERERGVDBMyKj4DA2DDBm1HQVpkoGeADZ+wDhARERG9KnZZJCIiIiIi0hImZERERERERFrChIyKLykJkMnUj6QkbUdDWpCUngTZJBlkk2RISmcdICIiIiopJmRERERERERawoSMiIiIiIhIS5iQERERERERaQkTMiIiIiIiIi1hQkZERERERKQlTMiIiIiIiIi0RE/bAdBbSFcXaNv2xTSVObo6umjr0laaJiIiIqKSYUJGxWdgAOzYoe0oSIsM9AywowfrABEREdGrYpdFIiIiIiIiLWELGWnd7ujEfJe1tjf+DyMhIiIiIvpvsYWMii8pCTAyUj+SkrQdDWlBUnoSjKYZwWiaEZLSWQeIiIiISootZFQyycnajoC0LDmDdYCIiIjoVbGFjIiIiIiISEuYkBEREREREWkJuyxSseyOToRuchJa/vt8751EZBkKrcZERERERPS2YgsZERERERGRljAhIyIiIiIi0hJ2WaRiEzo6eNqoiTRNZY+OTAfeDt7SNBERERGVDBMyKjaVgRLH1+3SdhikRUp9JUL9Q7UdBhEREdFbjz9tExERERERaQkTMiIiIiIiIi1hQkbFppuchA/qOuKDuo7QTU7SdjikBUnpSbCcZQnLWZZISmcdICIiIiopXkNGJSJ/+kTbIZCWPU5+rO0QiIiIiN56bCEjIiIiIiLSEiZkREREREREWsKEjIiIiIiISEuYkBEREREREWkJEzIiIiIiIiIt4SiLVGxCRwfxtepJ01T26Mh00MCugTRNRERERCXzxnyTmj59OmQyGUaOHCnNE0IgMDAQdnZ2UCqVaN68OS5evKixXlpaGr788ktYWFjAyMgIH374Ie7evatRJi4uDr1794apqSlMTU3Ru3dvPHv2TKNMdHQ0OnToACMjI1hYWGD48OFIT09/XYf7VlMZKBG+LQzh28KgMlBqOxzSAqW+EhEDIxAxMAJKfdYBIiIiopJ6IxKyiIgI/Pbbb6hVq5bG/JkzZ2Lu3LlYsGABIiIiYGNjg5YtW+L58+dSmZEjR2LLli1Yu3YtDh8+jMTERLRv3x5ZWVlSmR49euDMmTPYvXs3du/ejTNnzqB3797S8qysLLRr1w5JSUk4fPgw1q5di02bNmHMmDGv/+CJiIiIiKjM0npClpiYiJ49e2Lp0qUwMzOT5gshMH/+fHz33Xf46KOPULNmTSxfvhzJycn4448/AADx8fH4/fffMWfOHLRo0QJ169bFqlWrcP78eezbtw8AcPnyZezevRv/+9//4OnpCU9PTyxduhTbt2/H1atXAQAhISG4dOkSVq1ahbp166JFixaYM2cOli5dioSEhHxjT0tLQ0JCgsaDiIiIiIioqLSekA0dOhTt2rVDixYtNObfvn0bsbGxaNWqlTRPoVDA29sbR44cAQCcPHkSGRkZGmXs7OxQs2ZNqUx4eDhMTU3RsGFDqUyjRo1gamqqUaZmzZqws7OTyvj5+SEtLQ0nT57MN/bp06dL3SBNTU1RuXLlVzgTbw+dlGR4N64B78Y1oJOSrO1wSAuSM5LhON8RjvMdkZzBOkBERERUUlod1GPt2rU4deoUIiIici2LjY0FAFhbW2vMt7a2RlRUlFRGLpdrtKxll8lePzY2FlZWVrm2b2VlpVEm537MzMwgl8ulMnkZN24cRo8eLT1PSEgoE0mZTAgo70ZL01T2CCEQFR8lTRMRERFRyWgtIbtz5w5GjBiBkJAQGBgY5FtOJpNpPBdC5JqXU84yeZUvSZmcFAoFFApFgbEQERERERHlR2tdFk+ePImHDx+ifv360NPTg56eHsLCwvDzzz9DT09ParHK2UL18OFDaZmNjQ3S09MRFxdXYJkHDx7k2v+jR480yuTcT1xcHDIyMnK1nBEREREREZUWrSVkvr6+OH/+PM6cOSM9GjRogJ49e+LMmTOoUqUKbGxssHfvXmmd9PR0hIWFwcvLCwBQv3596Ovra5SJiYnBhQsXpDKenp6Ij4/H8ePHpTLHjh1DfHy8RpkLFy4gJiZGKhMSEgKFQoH69eu/1vNARERERERll9a6LJqYmKBmzZoa84yMjGBubi7NHzlyJKZNmwYXFxe4uLhg2rRpMDQ0RI8ePQAApqam6N+/P8aMGQNzc3NUqFABAQEB8PDwkAYJcXNzQ+vWrTFw4EAsWbIEAPD555+jffv2cHV1BQC0atUK7u7u6N27N2bNmoWnT58iICAAAwcORLly5f6rU0JERERERGWMVgf1KMzYsWORkpKCIUOGIC4uDg0bNkRISAhMTEykMvPmzYOenh66du2KlJQU+Pr6Ijg4GLq6ulKZ1atXY/jw4dJojB9++CEWLFggLdfV1cWOHTswZMgQNG7cGEqlEj169MDs2bP/u4MlIiIiIqIyRyY4RFqpSUhIgKmpKeLj49/ZlrXd0YnQSUmGZwdvAED4tjColIavbX+t7Y0BAOlJ6ZhuPB0AMC5xHORG8qJtIDMJWK/eBromAnpGryPMMic5IxnvLX0PABAxMAKG+q+vDhARERG9jYqaG7zRLWT0ZlIpDfHPvty3KqCyw1DfEBeHXNR2GERERERvPa3fGJqIiIiIiKisYkJGRERERESkJUzIqNh0UpLRuMV7aNziPeikJGs7HNKC5Ixk1FhYAzUW1kByBusAERERUUnxGjIqNpkQMLl+RZqmskcIgUuPLknTRERERFQybCEjIiIiIiLSEiZkREREREREWsKEjIiIiIiISEuYkBEREREREWkJEzIiIiIiIiIt4SiLVGxCJkNKJXtpmsoemUwGB1MHaZqIiIiISoYJGRWbSmmIsH8uajsM0iJDfUNEjozUdhhEREREbz12WSQiIiIiItISJmRERERERERawoSMik0nNQWeHbzh2cEbOqkp2g6HtCAlIwXvLX0P7y19DykZrANEREREJcVryKjYZCoVTM+dkqap7FEJFU7cPyFNExEREVHJsIWMiIiIiIhIS5iQERERERERaQkTMiIiIiIiIi1hQkZERERERKQlTMiIiIiIiIi0hKMsUomkVzDXdgikZRaGFtoOgYiIiOitx4SMii3L0AgHTkdqOwzSIiO5ER599UjbYRARERG99dhlkYiIiIiISEuYkBEREREREWkJEzIqNp3UFLzfrQ3e79YGOqkp2g6HtCAlIwXNg5ujeXBzpGSwDhARERGVFK8ho2KTqVSocPSwNP067Y5OBABkJWdI8/beSYKuYTpa2xu/1n1T/lRChbCoMGmaiIiIiEqGLWRERERERERawoSMiIiIiIhIS5iQERERERERaQkTMiIiIiIiIi1hQkZERERERKQlHGWRSiRTaajtEEjLDPVZB4iI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vfeeqVWrlrXepk0brybmdKc+6C5fvtzaNnv2bCPJahqMMebuu+82vXv3Puc5T3e2huzaa6/1iunQoYO57777rPXTP3yfct1115Vqjt98801Tt25dr9f97W9/s9azs7ONw+Ewn332mTHGmIEDB5q//OUvZ83z9IbMmLN/6DfGmHvuucf07dvXWp8/f75p0qSJ1/fofB544AEzZMgQa33w4MHmwQcftNbbtm1rHnnkEWt9xowZpkOHDtZ6VFSUefvtt72O+fe//93ExsZ6Xcf8+fN/M5d+/fqZqVOnGmOMOXbsmPHz8zPvv/++tf/o0aMmICDAqt0ff/zROBwOc/DgQa/jdO/e3cyYMeOc53nxxRetX1AYY8zx48dNYGCgeemll84aX1RUZIKDg81HH31kbStrQxYXF2fuuusur+N+9dVXxsfHx+Tl5ZX75wKAyw+3LALAWZj/3JLncDguKL5Xr17KycnR448/Xmpfz5491bBhQzVp0kRxcXFatGjRBd1uV5Yc7rzzTuvWt4yMDH3yySe64447zvua7du3KzY21uv4Xbp0UXZ2tg4cOGBt69Spk1dMbGysdu7cqeLi4rMed+XKlerZs6fq1aun4OBgjRgxQocPH7Zu1Zo0aZIeffRRdenSRTNnztTmzZtLHaNt27bWcnh4uAICAtSkSROvbRkZGee9vvM5/fiSVLdu3d88XnJysh555BEFBQVZX2PGjFFaWprX9/P0YwcGBio4ONg69j333KPFixfryiuv1PTp07V27doy5z5mzBglJibq4MGDkk7ePjhq1KgLqpPi4mK9/vrrGj58uLVt+PDhev31163v57Bhw7Ro0SJJJ2vwnXfe0bBhwyRJhw4d0v79+zV69Giv9+HRRx/VTz/95HWu9u3blzr3Y489prZt26pWrVoKCgpSYmKi9u3bJ0natWuXCgsL1bFjR+s1Ho9HLVq0sNZTUlJkjFHz5s29zr9q1apS5z/d7bffrpKSEr377ruSpHfffVfGGP35z3+WdPLfzNixY9W8eXN5PB55PB5lZ2dbuZVHcnKyFi5c6JVn7969VVJSot27d5f75wKAyw8NGQCcRbNmzeRwOLR9+/YLiu/evbuWLVuml19+WRMnTvTaFxwcrJSUFL3zzjuqW7euHnroIbVr1+43Z88rSw4jRozQrl27tG7dOr311ltq1KiRrrvu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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The plot is saved at: /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/CKs_Cytoplasm_Intensity_Average_Distribution.png\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Plot the distribution of the Nucleus_Size column\n",
+ "fig, ax = plt.subplots(figsize=(10, 6))\n",
+ "ax.hist(df['CKs_Cytoplasm_Intensity_Average'], bins=100, alpha=0.6, color='skyblue') # Augmented number of bins\n",
+ "\n",
+ "# Calculate mean and median\n",
+ "mean_value = df['CKs_Cytoplasm_Intensity_Average'].mean()\n",
+ "median_value = df['CKs_Cytoplasm_Intensity_Average'].median()\n",
+ "\n",
+ "# Add vertical lines for mean and median\n",
+ "ax.axvline(x=mean_value, color='orange', linestyle='-', label='Mean')\n",
+ "ax.axvline(x=median_value, color='purple', linestyle='-', label='Median')\n",
+ "\n",
+ "# Add horizontal bars for the 0.05 and 0.95 quantiles\n",
+ "quantile_05 = df['CKs_Cytoplasm_Intensity_Average'].quantile(0.05)\n",
+ "quantile_95 = df['CKs_Cytoplasm_Intensity_Average'].quantile(0.95)\n",
+ "ax.axvline(x=quantile_05, color='r', linestyle='--', label='Quantile 0.05')\n",
+ "ax.axvline(x=quantile_95, color='g', linestyle='--', label='Quantile 0.95')\n",
+ "\n",
+ "# Add titles and labels\n",
+ "ax.set_title('Distribution of CKs_Cytoplasm_Intensity_Average with Quantiles, Mean, and Median')\n",
+ "ax.set_xlabel('CKs_Cytoplasm_Intensity_Average Values')\n",
+ "ax.set_ylabel('Frequency')\n",
+ "ax.legend()\n",
+ "\n",
+ "# Display quantile values\n",
+ "ax.text(quantile_05, ax.get_ylim()[1], f' 5th Quantile: {quantile_05:.2f}', color='r', verticalalignment='top')\n",
+ "ax.text(quantile_95, ax.get_ylim()[1], f' 95th Quantile: {quantile_95:.2f}', color='g', verticalalignment='top')\n",
+ "\n",
+ "# Display mean and median values\n",
+ "ax.text(mean_value, ax.get_ylim()[1]*0.9, f' Mean: {mean_value:.2f}', color='orange', verticalalignment='top')\n",
+ "ax.text(median_value, ax.get_ylim()[1]*0.85, f' Median: {median_value:.2f}', color='purple', verticalalignment='top')\n",
+ "\n",
+ "# Display the plot\n",
+ "plt.show()\n",
+ "\n",
+ "# Save the plot\n",
+ "plot_file_path = os.path.join(output_images_dir, \"CKs_Cytoplasm_Intensity_Average_Distribution.png\")\n",
+ "fig.savefig(plot_file_path)\n",
+ "print(f\"The plot is saved at: {plot_file_path}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "90c21233-43da-4692-bbf0-c90e037c035c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.05 1603.137970\n",
+ "0.50 3559.484741\n",
+ "0.95 10239.075195\n",
+ "Name: CKs_Cytoplasm_Intensity_Average, dtype: float64"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[\"CKs_Cytoplasm_Intensity_Average\"].quantile(q=qs)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4a3e399c-684e-4c40-9963-1e96bb3fcffe",
+ "metadata": {},
+ "source": [
+ "## I.5. COLUMNS OF INTERESTS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "fdcf65d1-0d91-4688-9903-25a003d755b6",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Columns are now...\n",
+ "['ROI_index', 'Sample_ID', 'Nucleus_Roundness', 'Nucleus_Size', 'Nuc_X', 'Nuc_Y_Inv', 'Cell_Size', 'AF488_Cell_Intensity_Average', 'AF488_Cytoplasm_Intensity_Average', 'AF488_Nucleus_Intensity_Average', 'AF555_Cell_Intensity_Average', 'AF555_Cytoplasm_Intensity_Average', 'AF555_Nucleus_Intensity_Average', 'AF647_Cell_Intensity_Average', 'AF647_Cytoplasm_Intensity_Average', 'AF647_Nucleus_Intensity_Average', 'AF750_Cell_Intensity_Average', 'AF750_Cytoplasm_Intensity_Average', 'AF750_Nucleus_Intensity_Average', 'aSMA_Cell_Intensity_Average', 'aSMA_Cytoplasm_Intensity_Average', 'aSMA_Nucleus_Intensity_Average', 'AXL_Cell_Intensity_Average', 'AXL_Cytoplasm_Intensity_Average', 'AXL_Nucleus_Intensity_Average', 'B7H4_Cell_Intensity_Average', 'B7H4_Cytoplasm_Intensity_Average', 'B7H4_Nucleus_Intensity_Average', 'CA9_Cell_Intensity_Average', 'CA9_Cytoplasm_Intensity_Average', 'CA9_Nucleus_Intensity_Average', 'CD4_Cell_Intensity_Average', 'CD4_Cytoplasm_Intensity_Average', 'CD4_Nucleus_Intensity_Average', 'CD8_Cell_Intensity_Average', 'CD8_Cytoplasm_Intensity_Average', 'CD8_Nucleus_Intensity_Average', 'CD11b_Cell_Intensity_Average', 'CD11b_Cytoplasm_Intensity_Average', 'CD11b_Nucleus_Intensity_Average', 'CD11c_Cell_Intensity_Average', 'CD11c_Cytoplasm_Intensity_Average', 'CD11c_Nucleus_Intensity_Average', 'CD20_Cell_Intensity_Average', 'CD20_Cytoplasm_Intensity_Average', 'CD20_Nucleus_Intensity_Average', 'CD31_Cell_Intensity_Average', 'CD31_Cytoplasm_Intensity_Average', 'CD31_Nucleus_Intensity_Average', 'CD44_Cell_Intensity_Average', 'CD44_Cytoplasm_Intensity_Average', 'CD44_Nucleus_Intensity_Average', 'CD45_Cell_Intensity_Average', 'CD45_Cytoplasm_Intensity_Average', 'CD45_Nucleus_Intensity_Average', 'CD68_Cell_Intensity_Average', 'CD68_Cytoplasm_Intensity_Average', 'CD68_Nucleus_Intensity_Average', 'CD163_Cell_Intensity_Average', 'CD163_Cytoplasm_Intensity_Average', 'CD163_Nucleus_Intensity_Average', 'CKs_Cell_Intensity_Average', 'CKs_Cytoplasm_Intensity_Average', 'CKs_Nucleus_Intensity_Average', 'ColVI_Cell_Intensity_Average', 'ColVI_Cytoplasm_Intensity_Average', 'ColVI_Nucleus_Intensity_Average', 'Desmin_Cell_Intensity_Average', 'Desmin_Cytoplasm_Intensity_Average', 'Desmin_Nucleus_Intensity_Average', 'Ecad_Cell_Intensity_Average', 'Ecad_Cytoplasm_Intensity_Average', 'Ecad_Nucleus_Intensity_Average', 'Fibronectin_Cell_Intensity_Average', 'Fibronectin_Cytoplasm_Intensity_Average', 'Fibronectin_Nucleus_Intensity_Average', 'FOXP3_Cell_Intensity_Average', 'FOXP3_Cytoplasm_Intensity_Average', 'FOXP3_Nucleus_Intensity_Average', 'GATA3_Cell_Intensity_Average', 'GATA3_Cytoplasm_Intensity_Average', 'GATA3_Nucleus_Intensity_Average', 'HLA_Cell_Intensity_Average', 'HLA_Cytoplasm_Intensity_Average', 'HLA_Nucleus_Intensity_Average', 'Ki67_Cell_Intensity_Average', 'Ki67_Cytoplasm_Intensity_Average', 'Ki67_Nucleus_Intensity_Average', 'MMP9_Cell_Intensity_Average', 'MMP9_Cytoplasm_Intensity_Average', 'MMP9_Nucleus_Intensity_Average', 'PD1_Cell_Intensity_Average', 'PD1_Cytoplasm_Intensity_Average', 'PD1_Nucleus_Intensity_Average', 'PDGFR_Cell_Intensity_Average', 'PDGFR_Cytoplasm_Intensity_Average', 'PDGFR_Nucleus_Intensity_Average', 'PDL1_Cell_Intensity_Average', 'PDL1_Cytoplasm_Intensity_Average', 'PDL1_Nucleus_Intensity_Average', 'r5c2_Cell_Intensity_Average', 'r5c2_Cytoplasm_Intensity_Average', 'r5c2_Nucleus_Intensity_Average', 'r7c2_Cell_Intensity_Average', 'r7c2_Cytoplasm_Intensity_Average', 'r7c2_Nucleus_Intensity_Average', 'r8c2_Cell_Intensity_Average', 'r8c2_Cytoplasm_Intensity_Average', 'r8c2_Nucleus_Intensity_Average', 'Sting_Cell_Intensity_Average', 'Sting_Cytoplasm_Intensity_Average', 'Sting_Nucleus_Intensity_Average', 'Vimentin_Cell_Intensity_Average', 'Vimentin_Cytoplasm_Intensity_Average', 'Vimentin_Nucleus_Intensity_Average']\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Remove columns containing \"DAPI\"\n",
+ "df = df[[x for x in df.columns.values if 'DAPI' not in x]]\n",
+ "\n",
+ "print(\"Columns are now...\")\n",
+ "print([c for c in df.columns.values])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "17741329-f501-4eec-af23-ed5026b13a94",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'AF488_Cell': 'AF488_Cell_Intensity_Average',\n",
+ " 'AF488_Cytoplasm': 'AF488_Cytoplasm_Intensity_Average',\n",
+ " 'AF488_Nucleus': 'AF488_Nucleus_Intensity_Average',\n",
+ " 'AF555_Cell': 'AF555_Cell_Intensity_Average',\n",
+ " 'AF555_Cytoplasm': 'AF555_Cytoplasm_Intensity_Average',\n",
+ " 'AF555_Nucleus': 'AF555_Nucleus_Intensity_Average',\n",
+ " 'AF647_Cell': 'AF647_Cell_Intensity_Average',\n",
+ " 'AF647_Cytoplasm': 'AF647_Cytoplasm_Intensity_Average',\n",
+ " 'AF647_Nucleus': 'AF647_Nucleus_Intensity_Average',\n",
+ " 'AF750_Cell': 'AF750_Cell_Intensity_Average',\n",
+ " 'AF750_Cytoplasm': 'AF750_Cytoplasm_Intensity_Average',\n",
+ " 'AF750_Nucleus': 'AF750_Nucleus_Intensity_Average',\n",
+ " 'aSMA_Cell': 'aSMA_Cell_Intensity_Average',\n",
+ " 'aSMA_Cytoplasm': 'aSMA_Cytoplasm_Intensity_Average',\n",
+ " 'aSMA_Nucleus': 'aSMA_Nucleus_Intensity_Average',\n",
+ " 'AXL_Cell': 'AXL_Cell_Intensity_Average',\n",
+ " 'AXL_Cytoplasm': 'AXL_Cytoplasm_Intensity_Average',\n",
+ " 'AXL_Nucleus': 'AXL_Nucleus_Intensity_Average',\n",
+ " 'B7H4_Cell': 'B7H4_Cell_Intensity_Average',\n",
+ " 'B7H4_Cytoplasm': 'B7H4_Cytoplasm_Intensity_Average',\n",
+ " 'B7H4_Nucleus': 'B7H4_Nucleus_Intensity_Average',\n",
+ " 'CA9_Cell': 'CA9_Cell_Intensity_Average',\n",
+ " 'CA9_Cytoplasm': 'CA9_Cytoplasm_Intensity_Average',\n",
+ " 'CA9_Nucleus': 'CA9_Nucleus_Intensity_Average',\n",
+ " 'CD4_Cell': 'CD4_Cell_Intensity_Average',\n",
+ " 'CD4_Cytoplasm': 'CD4_Cytoplasm_Intensity_Average',\n",
+ " 'CD4_Nucleus': 'CD4_Nucleus_Intensity_Average',\n",
+ " 'CD8_Cell': 'CD8_Cell_Intensity_Average',\n",
+ " 'CD8_Cytoplasm': 'CD8_Cytoplasm_Intensity_Average',\n",
+ " 'CD8_Nucleus': 'CD8_Nucleus_Intensity_Average',\n",
+ " 'CD11b_Cell': 'CD11b_Cell_Intensity_Average',\n",
+ " 'CD11b_Cytoplasm': 'CD11b_Cytoplasm_Intensity_Average',\n",
+ " 'CD11b_Nucleus': 'CD11b_Nucleus_Intensity_Average',\n",
+ " 'CD11c_Cell': 'CD11c_Cell_Intensity_Average',\n",
+ " 'CD11c_Cytoplasm': 'CD11c_Cytoplasm_Intensity_Average',\n",
+ " 'CD11c_Nucleus': 'CD11c_Nucleus_Intensity_Average',\n",
+ " 'CD20_Cell': 'CD20_Cell_Intensity_Average',\n",
+ " 'CD20_Cytoplasm': 'CD20_Cytoplasm_Intensity_Average',\n",
+ " 'CD20_Nucleus': 'CD20_Nucleus_Intensity_Average',\n",
+ " 'CD31_Cell': 'CD31_Cell_Intensity_Average',\n",
+ " 'CD31_Cytoplasm': 'CD31_Cytoplasm_Intensity_Average',\n",
+ " 'CD31_Nucleus': 'CD31_Nucleus_Intensity_Average',\n",
+ " 'CD44_Cell': 'CD44_Cell_Intensity_Average',\n",
+ " 'CD44_Cytoplasm': 'CD44_Cytoplasm_Intensity_Average',\n",
+ " 'CD44_Nucleus': 'CD44_Nucleus_Intensity_Average',\n",
+ " 'CD45_Cell': 'CD45_Cell_Intensity_Average',\n",
+ " 'CD45_Cytoplasm': 'CD45_Cytoplasm_Intensity_Average',\n",
+ " 'CD45_Nucleus': 'CD45_Nucleus_Intensity_Average',\n",
+ " 'CD68_Cell': 'CD68_Cell_Intensity_Average',\n",
+ " 'CD68_Cytoplasm': 'CD68_Cytoplasm_Intensity_Average',\n",
+ " 'CD68_Nucleus': 'CD68_Nucleus_Intensity_Average',\n",
+ " 'CD163_Cell': 'CD163_Cell_Intensity_Average',\n",
+ " 'CD163_Cytoplasm': 'CD163_Cytoplasm_Intensity_Average',\n",
+ " 'CD163_Nucleus': 'CD163_Nucleus_Intensity_Average',\n",
+ " 'CKs_Cell': 'CKs_Cell_Intensity_Average',\n",
+ " 'CKs_Cytoplasm': 'CKs_Cytoplasm_Intensity_Average',\n",
+ " 'CKs_Nucleus': 'CKs_Nucleus_Intensity_Average',\n",
+ " 'ColVI_Cell': 'ColVI_Cell_Intensity_Average',\n",
+ " 'ColVI_Cytoplasm': 'ColVI_Cytoplasm_Intensity_Average',\n",
+ " 'ColVI_Nucleus': 'ColVI_Nucleus_Intensity_Average',\n",
+ " 'Desmin_Cell': 'Desmin_Cell_Intensity_Average',\n",
+ " 'Desmin_Cytoplasm': 'Desmin_Cytoplasm_Intensity_Average',\n",
+ " 'Desmin_Nucleus': 'Desmin_Nucleus_Intensity_Average',\n",
+ " 'Ecad_Cell': 'Ecad_Cell_Intensity_Average',\n",
+ " 'Ecad_Cytoplasm': 'Ecad_Cytoplasm_Intensity_Average',\n",
+ " 'Ecad_Nucleus': 'Ecad_Nucleus_Intensity_Average',\n",
+ " 'Fibronectin_Cell': 'Fibronectin_Cell_Intensity_Average',\n",
+ " 'Fibronectin_Cytoplasm': 'Fibronectin_Cytoplasm_Intensity_Average',\n",
+ " 'Fibronectin_Nucleus': 'Fibronectin_Nucleus_Intensity_Average',\n",
+ " 'FOXP3_Cell': 'FOXP3_Cell_Intensity_Average',\n",
+ " 'FOXP3_Cytoplasm': 'FOXP3_Cytoplasm_Intensity_Average',\n",
+ " 'FOXP3_Nucleus': 'FOXP3_Nucleus_Intensity_Average',\n",
+ " 'GATA3_Cell': 'GATA3_Cell_Intensity_Average',\n",
+ " 'GATA3_Cytoplasm': 'GATA3_Cytoplasm_Intensity_Average',\n",
+ " 'GATA3_Nucleus': 'GATA3_Nucleus_Intensity_Average',\n",
+ " 'HLA_Cell': 'HLA_Cell_Intensity_Average',\n",
+ " 'HLA_Cytoplasm': 'HLA_Cytoplasm_Intensity_Average',\n",
+ " 'HLA_Nucleus': 'HLA_Nucleus_Intensity_Average',\n",
+ " 'Ki67_Cell': 'Ki67_Cell_Intensity_Average',\n",
+ " 'Ki67_Cytoplasm': 'Ki67_Cytoplasm_Intensity_Average',\n",
+ " 'Ki67_Nucleus': 'Ki67_Nucleus_Intensity_Average',\n",
+ " 'MMP9_Cell': 'MMP9_Cell_Intensity_Average',\n",
+ " 'MMP9_Cytoplasm': 'MMP9_Cytoplasm_Intensity_Average',\n",
+ " 'MMP9_Nucleus': 'MMP9_Nucleus_Intensity_Average',\n",
+ " 'PD1_Cell': 'PD1_Cell_Intensity_Average',\n",
+ " 'PD1_Cytoplasm': 'PD1_Cytoplasm_Intensity_Average',\n",
+ " 'PD1_Nucleus': 'PD1_Nucleus_Intensity_Average',\n",
+ " 'PDGFR_Cell': 'PDGFR_Cell_Intensity_Average',\n",
+ " 'PDGFR_Cytoplasm': 'PDGFR_Cytoplasm_Intensity_Average',\n",
+ " 'PDGFR_Nucleus': 'PDGFR_Nucleus_Intensity_Average',\n",
+ " 'PDL1_Cell': 'PDL1_Cell_Intensity_Average',\n",
+ " 'PDL1_Cytoplasm': 'PDL1_Cytoplasm_Intensity_Average',\n",
+ " 'PDL1_Nucleus': 'PDL1_Nucleus_Intensity_Average',\n",
+ " 'r5c2_Cell': 'r5c2_Cell_Intensity_Average',\n",
+ " 'r5c2_Cytoplasm': 'r5c2_Cytoplasm_Intensity_Average',\n",
+ " 'r5c2_Nucleus': 'r5c2_Nucleus_Intensity_Average',\n",
+ " 'r7c2_Cell': 'r7c2_Cell_Intensity_Average',\n",
+ " 'r7c2_Cytoplasm': 'r7c2_Cytoplasm_Intensity_Average',\n",
+ " 'r7c2_Nucleus': 'r7c2_Nucleus_Intensity_Average',\n",
+ " 'r8c2_Cell': 'r8c2_Cell_Intensity_Average',\n",
+ " 'r8c2_Cytoplasm': 'r8c2_Cytoplasm_Intensity_Average',\n",
+ " 'r8c2_Nucleus': 'r8c2_Nucleus_Intensity_Average',\n",
+ " 'Sting_Cell': 'Sting_Cell_Intensity_Average',\n",
+ " 'Sting_Cytoplasm': 'Sting_Cytoplasm_Intensity_Average',\n",
+ " 'Sting_Nucleus': 'Sting_Nucleus_Intensity_Average',\n",
+ " 'Vimentin_Cell': 'Vimentin_Cell_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm': 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'Vimentin_Nucleus': 'Vimentin_Nucleus_Intensity_Average'}"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Create lists of full names and shortened names to use in plotting\n",
+ "full_to_short_names, short_to_full_names = \\\n",
+ " shorten_feature_names(df.columns.values[~df.columns.isin(not_intensities)])\n",
+ "\n",
+ "short_to_full_names"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "id": "dfdd64a5-8705-4ed6-b94f-c42379faefd7",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The full_to_short_column_names.csv file was created !\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Save this data to a metadata file\n",
+ "filename = os.path.join(metadata_dir, \"full_to_short_column_names.csv\")\n",
+ "fh = open(filename, \"w\")\n",
+ "fh.write(\"full_name,short_name\\n\")\n",
+ "for k,v in full_to_short_names.items():\n",
+ " fh.write(k + \",\" + v + \"\\n\")\n",
+ " \n",
+ "fh.close()\n",
+ "print(\"The full_to_short_column_names.csv file was created !\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "b4e26e25-620a-4700-b091-928c6ba08a00",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The short_to_full_column_names.csv file was created !\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Save this data to a metadata file\n",
+ "filename = os.path.join(metadata_dir, \"short_to_full_column_names.csv\")\n",
+ "fh = open(filename, \"w\")\n",
+ "fh.write(\"short_name,full_name\\n\")\n",
+ "for k,v in short_to_full_names.items():\n",
+ " fh.write(k + \",\" + v + \"\\n\")\n",
+ " \n",
+ "fh.close()\n",
+ "print(\"The short_to_full_column_names.csv file was created !\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4c5da27d-39a6-411b-a71f-0cd82ce2b728",
+ "metadata": {},
+ "source": [
+ "## I.6. EXPOSURE TIME"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "id": "2e0c99c9-b254-41c7-b264-58441252c976",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Round Target Exp Channel\n",
+ "0 R0 AF488 300 c2\n",
+ "1 R0 AF555 1500 c3\n",
+ "2 R0 AF647 1500 c4\n",
+ "3 R0 AF750 1500 c5\n",
+ "4 R1 ColVI 300 c2\n",
+ "df's shape: (36, 4)\n",
+ "\n",
+ "No null values detected.\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Here, we want to end up with a data structure that incorporates metadata on each intensity marker column used in our big dataframe in an easy-to-use format. \n",
+ "# This is going to include the full name of the intensity marker columns in the big data frame, \n",
+ "# the corresponding round and channel, \n",
+ "# the target protein (e.g., CD45), \n",
+ "# and the segmentation localization information (cell, cytoplasm, nucleus)\n",
+ "\n",
+ "# We can use this data structure to assign unique colors to all channels and rounds, for example, for use in later visualizations\n",
+ "# Exposure_time file from ASHLAR analysis\n",
+ "filename = \"Exposure_Time.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "exp_df = pd.read_csv(filename)\n",
+ "\n",
+ "print(exp_df.head())\n",
+ "\n",
+ "# Verify file imported correctly\n",
+ "# File length\n",
+ "print(\"df's shape: \", exp_df.shape)\n",
+ "# Headers\n",
+ "expected_headers =['Round','Target','Exp','Channel']\n",
+ "compare_headers(expected_headers, exp_df.columns.values, \"Imported metadata file\")\n",
+ "\n",
+ "# Missingness\n",
+ "if exp_df.isnull().any().any():\n",
+ " print(\"\\nexp_df has null value(s) in row(s):\")\n",
+ " print(exp_df[exp_df.isna().any(axis=1)])\n",
+ "else:\n",
+ " print(\"\\nNo null values detected.\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "17501193-977f-4b30-bbb8-5afdae4a0356",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "if len(exp_df['Target']) > len(exp_df['Target'].unique()):\n",
+ " print(\"One or more non-unique Target values in exp_df. Currently not supported.\")\n",
+ "exp_df = exp_df.drop_duplicates(subset = 'Target').reindex()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "90d1feb7-2459-4a02-a526-ddc64082345b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Round \n",
+ " Target \n",
+ " Exp \n",
+ " Channel \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " R0 \n",
+ " AF647 \n",
+ " 1500 \n",
+ " c4 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " R0 \n",
+ " AF750 \n",
+ " 1500 \n",
+ " c5 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " R4 \n",
+ " AXL \n",
+ " 1500 \n",
+ " c3 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Round Target Exp Channel\n",
+ "0 R0 AF488 300 c2\n",
+ "1 R0 AF555 1500 c3\n",
+ "2 R0 AF647 1500 c4\n",
+ "3 R0 AF750 1500 c5\n",
+ "17 R4 AXL 1500 c3"
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# sort exp_df by the values in the 'Target' column in ascending order and then retrieve the first few rows of the sorted df\n",
+ "exp_df.sort_values(by = ['Target']).head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "id": "b7373851-14bb-4813-be00-7f8c4e1f4ebf",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Round \n",
+ " Target \n",
+ " Exp \n",
+ " Channel \n",
+ " target_lower \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " R0 \n",
+ " AF647 \n",
+ " 1500 \n",
+ " c4 \n",
+ " af647 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " R0 \n",
+ " AF750 \n",
+ " 1500 \n",
+ " c5 \n",
+ " af750 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " R1 \n",
+ " ColVI \n",
+ " 300 \n",
+ " c2 \n",
+ " colvi \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Round Target Exp Channel target_lower\n",
+ "0 R0 AF488 300 c2 af488\n",
+ "1 R0 AF555 1500 c3 af555\n",
+ "2 R0 AF647 1500 c4 af647\n",
+ "3 R0 AF750 1500 c5 af750\n",
+ "4 R1 ColVI 300 c2 colvi"
+ ]
+ },
+ "execution_count": 39,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Create lowercase version of target\n",
+ "exp_df['target_lower'] = exp_df['Target'].str.lower()\n",
+ "exp_df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "4722fdb1-cd93-45a0-b196-89d50918b2e2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " full_column \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " full_column\n",
+ "0 AF488_Cell_Intensity_Average\n",
+ "1 AF488_Cytoplasm_Intensity_Average\n",
+ "2 AF488_Nucleus_Intensity_Average\n",
+ "3 AF555_Cell_Intensity_Average\n",
+ "4 AF555_Cytoplasm_Intensity_Average"
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Create df that contains marker intensity columns in our df that aren't in not_intensities\n",
+ "intensities = pd.DataFrame({'full_column':df.columns.values[~df.columns.isin(not_intensities)]})\n",
+ "\n",
+ "intensities.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "f88ef6d6-8160-4fa4-a0ed-942e4127414e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " full_column \n",
+ " marker \n",
+ " marker_lower \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488 \n",
+ " af488 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488 \n",
+ " af488 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " AF488 \n",
+ " af488 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " AF555 \n",
+ " af555 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " AF555 \n",
+ " af555 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " full_column marker marker_lower\n",
+ "0 AF488_Cell_Intensity_Average AF488 af488\n",
+ "1 AF488_Cytoplasm_Intensity_Average AF488 af488\n",
+ "2 AF488_Nucleus_Intensity_Average AF488 af488\n",
+ "3 AF555_Cell_Intensity_Average AF555 af555\n",
+ "4 AF555_Cytoplasm_Intensity_Average AF555 af555"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Extract the marker information from the `full_column`, which corresponds to full column in big dataframe\n",
+ "# Use regular expressions (regex) to isolate the part of the field that begins (^) with an alphanumeric value (W), and ends with an underscore (_)\n",
+ "# '$' is end of line\n",
+ "intensities['marker'] = intensities['full_column'].str.extract(r'([^\\W_]+)')\n",
+ "# convert to lowercase\n",
+ "intensities['marker_lower'] = intensities['marker'].str.lower()\n",
+ "\n",
+ "intensities.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "id": "2b9ff02b-a33b-4f42-95c0-4b4132e2aa25",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " full_column \n",
+ " marker \n",
+ " marker_lower \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488 \n",
+ " af488 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488 \n",
+ " af488 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " AF488 \n",
+ " af488 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " AF555 \n",
+ " af555 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " AF555 \n",
+ " af555 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " full_column marker marker_lower\n",
+ "0 AF488_Cell_Intensity_Average AF488 af488\n",
+ "1 AF488_Cytoplasm_Intensity_Average AF488 af488\n",
+ "2 AF488_Nucleus_Intensity_Average AF488 af488\n",
+ "3 AF555_Cell_Intensity_Average AF555 af555\n",
+ "4 AF555_Cytoplasm_Intensity_Average AF555 af555"
+ ]
+ },
+ "execution_count": 42,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Subset the intensities df to exclude any column pertaining to DAPI\n",
+ "intensities = intensities.loc[intensities['marker_lower'] != 'dapi']\n",
+ "\n",
+ "intensities.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "id": "fa1340aa-1c86-4b0f-82a2-ded1892dea6e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Round \n",
+ " Target \n",
+ " Exp \n",
+ " Channel \n",
+ " target_lower \n",
+ " full_column \n",
+ " marker \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " AF488 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " AF555 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " AF555 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " R8 \n",
+ " Sting \n",
+ " 1000 \n",
+ " c4 \n",
+ " sting \n",
+ " Sting_Cytoplasm_Intensity_Average \n",
+ " Sting \n",
+ " \n",
+ " \n",
+ " 104 \n",
+ " R8 \n",
+ " Sting \n",
+ " 1000 \n",
+ " c4 \n",
+ " sting \n",
+ " Sting_Nucleus_Intensity_Average \n",
+ " Sting \n",
+ " \n",
+ " \n",
+ " 105 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Cell_Intensity_Average \n",
+ " CD11b \n",
+ " \n",
+ " \n",
+ " 106 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Cytoplasm_Intensity_Average \n",
+ " CD11b \n",
+ " \n",
+ " \n",
+ " 107 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Nucleus_Intensity_Average \n",
+ " CD11b \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
108 rows Ć 7 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Round Target Exp Channel target_lower \\\n",
+ "0 R0 AF488 300 c2 af488 \n",
+ "1 R0 AF488 300 c2 af488 \n",
+ "2 R0 AF488 300 c2 af488 \n",
+ "3 R0 AF555 1500 c3 af555 \n",
+ "4 R0 AF555 1500 c3 af555 \n",
+ ".. ... ... ... ... ... \n",
+ "103 R8 Sting 1000 c4 sting \n",
+ "104 R8 Sting 1000 c4 sting \n",
+ "105 R8 CD11b 1500 c5 cd11b \n",
+ "106 R8 CD11b 1500 c5 cd11b \n",
+ "107 R8 CD11b 1500 c5 cd11b \n",
+ "\n",
+ " full_column marker \n",
+ "0 AF488_Cell_Intensity_Average AF488 \n",
+ "1 AF488_Cytoplasm_Intensity_Average AF488 \n",
+ "2 AF488_Nucleus_Intensity_Average AF488 \n",
+ "3 AF555_Cell_Intensity_Average AF555 \n",
+ "4 AF555_Cytoplasm_Intensity_Average AF555 \n",
+ ".. ... ... \n",
+ "103 Sting_Cytoplasm_Intensity_Average Sting \n",
+ "104 Sting_Nucleus_Intensity_Average Sting \n",
+ "105 CD11b_Cell_Intensity_Average CD11b \n",
+ "106 CD11b_Cytoplasm_Intensity_Average CD11b \n",
+ "107 CD11b_Nucleus_Intensity_Average CD11b \n",
+ "\n",
+ "[108 rows x 7 columns]"
+ ]
+ },
+ "execution_count": 43,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Merge the intensities andexp_df together to create metadata\n",
+ "metadata = pd.merge(exp_df, intensities, how = 'left', left_on = 'target_lower',right_on = 'marker_lower')\n",
+ "metadata = metadata.drop(columns = ['marker_lower'])\n",
+ "metadata = metadata.dropna()\n",
+ "\n",
+ "# Target is the capitalization from the Exposure_Time.csv\n",
+ "# target_lower is Target in small caps\n",
+ "# marker is the extracted first component of the full column in segmentation data, with corresponding capitalization\n",
+ "metadata"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "id": "75378ca2-3ecb-4c60-a7d4-da997f851066",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Round \n",
+ " Target \n",
+ " Exp \n",
+ " Channel \n",
+ " target_lower \n",
+ " full_column \n",
+ " marker \n",
+ " localisation \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488 \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488 \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " AF488 \n",
+ " nucleus \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " AF555 \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " AF555 \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " R8 \n",
+ " Sting \n",
+ " 1000 \n",
+ " c4 \n",
+ " sting \n",
+ " Sting_Cytoplasm_Intensity_Average \n",
+ " Sting \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " 104 \n",
+ " R8 \n",
+ " Sting \n",
+ " 1000 \n",
+ " c4 \n",
+ " sting \n",
+ " Sting_Nucleus_Intensity_Average \n",
+ " Sting \n",
+ " nucleus \n",
+ " \n",
+ " \n",
+ " 105 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Cell_Intensity_Average \n",
+ " CD11b \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 106 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Cytoplasm_Intensity_Average \n",
+ " CD11b \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " 107 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Nucleus_Intensity_Average \n",
+ " CD11b \n",
+ " nucleus \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
108 rows Ć 8 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Round Target Exp Channel target_lower \\\n",
+ "0 R0 AF488 300 c2 af488 \n",
+ "1 R0 AF488 300 c2 af488 \n",
+ "2 R0 AF488 300 c2 af488 \n",
+ "3 R0 AF555 1500 c3 af555 \n",
+ "4 R0 AF555 1500 c3 af555 \n",
+ ".. ... ... ... ... ... \n",
+ "103 R8 Sting 1000 c4 sting \n",
+ "104 R8 Sting 1000 c4 sting \n",
+ "105 R8 CD11b 1500 c5 cd11b \n",
+ "106 R8 CD11b 1500 c5 cd11b \n",
+ "107 R8 CD11b 1500 c5 cd11b \n",
+ "\n",
+ " full_column marker localisation \n",
+ "0 AF488_Cell_Intensity_Average AF488 cell \n",
+ "1 AF488_Cytoplasm_Intensity_Average AF488 cytoplasm \n",
+ "2 AF488_Nucleus_Intensity_Average AF488 nucleus \n",
+ "3 AF555_Cell_Intensity_Average AF555 cell \n",
+ "4 AF555_Cytoplasm_Intensity_Average AF555 cytoplasm \n",
+ ".. ... ... ... \n",
+ "103 Sting_Cytoplasm_Intensity_Average Sting cytoplasm \n",
+ "104 Sting_Nucleus_Intensity_Average Sting nucleus \n",
+ "105 CD11b_Cell_Intensity_Average CD11b cell \n",
+ "106 CD11b_Cytoplasm_Intensity_Average CD11b cytoplasm \n",
+ "107 CD11b_Nucleus_Intensity_Average CD11b nucleus \n",
+ "\n",
+ "[108 rows x 8 columns]"
+ ]
+ },
+ "execution_count": 44,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Add a column to signify marker target localisation.\n",
+ "# Use a lambda to determine segmented location of intensity marker column and update metadata accordingly\n",
+ "# Using the add_metadata_location() function in my_modules.py\n",
+ "metadata['localisation'] = metadata.apply(\n",
+ " lambda row: add_metadata_location(row), axis = 1)\n",
+ "\n",
+ "metadata"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "id": "9779567d-bd63-468a-acdb-e30901c71e03",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The marker_intensity_metadata.csv file was created !\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Save this data structure to the metadata folder\n",
+ "# don't want to add color in because that's better off treating color the same for round, channel, and sample\n",
+ "filename = \"marker_intensity_metadata.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "metadata.to_csv(filename, index = False)\n",
+ "print(\"The marker_intensity_metadata.csv file was created !\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d371ebc6-4aee-4b43-914e-933e3f9abbd5",
+ "metadata": {},
+ "source": [
+ "## I.7. COLORS WORKFLOW"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0f4e010e-149b-4fe9-8a58-7f9f872d2be9",
+ "metadata": {},
+ "source": [
+ "### I.7.1. CHANNELS COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "id": "fb818967-a0b7-4bd0-9b81-32fd1bfefde1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Unique channels are: ['c2' 'c3' 'c4' 'c5']\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUoAAABlCAYAAAArpKpSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAACs0lEQVR4nO3ZQWoTYRzG4X9CawI6CXQZEjc9hSdw4QW8gndQ2nt5Affuu+hADtC0UKR0XIgKgnmnqWEa+zzrb/HyBX7MZEZd13UFwF+Nhx4A8NQJJUAglACBUAIEQgkQCCVAIJQAwVGfQ/f397Ver6tpmhqNRvveBLB3XdfVZrOpxWJR4/H2Z8ZeoVyv17Varf7JOICnpG3bWi6XW8/0CmXTNFVVdf71vKbN9PHLnokPnz4PPeEwvf849IKD8+718dATDs7d9U19efP2V9+26RXKn6/b02Za05lQ9jV70et6+dPLV0MvODhHjVDuqs/fiT7mAARCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRHfQ51XVdVVbeb272O+d9cfbsbesJhurkeesHBudscDz3h4Nxd31TV775tM+p6nLq4uKjT09PHLwN4Ytq2reVyufVMryfKk5OTqqq6vLys+Xz++GXPxNXVVa1Wq2rbtmaz2dBzDoI72417e7iu62qz2dRisYhne4VyPP7xV+Z8Pvcj7GA2m7m3B3Jnu3FvD9P3wc/HHIBAKAGCXqGcTCZ1dnZWk8lk33v+K+7t4dzZbtzbfvX66g3wnHn1BgiEEiAQSoBAKAECoQQIhBIgEEqAQCgBgu+VwWR6hdDVcgAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUoAAABlCAYAAAArpKpSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAACpklEQVR4nO3Zv2rbUBjG4WNj0FLLkNHYU4bupXTp2KV3lYvrPXTMEIHnYgVKIfh0CKFd6ld2ahQlz7PYwxk+Ppsf+jOrtdYCwD/Nxx4A4KUTSoBAKAECoQQIhBIgEEqAQCgBgsWQQ4fDoex2u7JcLstsNrv0TAAXV2stfd+X9Xpd5vPj14yDQrnb7cp2u/0vwwG8JF3Xlc1mc/TMoFAul8vHL5+6Mlu0zx7srfjxeTX2CJP0/uvHsUeYnG9fvo89wuT0pZYP5eefvh0xKJRPt9uzRSuUJ2ibsSeYpvm7QX9L/rIsHomda8jjRC9zAAKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAQKhBAiEEiAQSoBAKAECoQQIhBIgEEqAQCgBAqEECIQSIBBKgEAoAYLFkEO11sfPh/1Fh3lt9r/GnmCaDvcPY48wOX2pY48wOU87e+rbMbM64NTt7W25vr5+/mQAL0zXdWWz2Rw9M+iK8urqqpRSyt3dXVmtVs+f7I3Y7/dlu92WrutK27ZjjzMJdnYeeztdrbX0fV/W63U8OyiU8/njo8zVauVHOEPbtvZ2Ijs7j72dZuiFn5c5AIFQAgSDQtk0Tbm5uSlN01x6nlfF3k5nZ+ext8sa9NYb4C1z6w0QCCVAIJQAgVACBEIJEAglQCCUAIFQAgS/AVPOYnIQS7DnAAAAAElFTkSuQmCC",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# we want colors that are categorical, since Channel is a non-ordered category (yes, they are numbered, but arbitrarily). \n",
+ "# A categorical color palette will have dissimilar colors.\n",
+ "# Get those unique colors\n",
+ "if len(metadata.Channel.unique()) > 10:\n",
+ " print(\"WARNING: There are more unique channel values than \\\n",
+ " there are colors to choose from. Select different palette, e.g., \\\n",
+ " continuous palette 'husl'.\")\n",
+ "channel_color_values = sb.color_palette(\"bright\",n_colors = len(metadata.Channel.unique()))\n",
+ "# chose 'colorblind' because it is categorical and we're unlikely to have > 10\n",
+ "\n",
+ "# You can customize the colors for each channel here\n",
+ "custom_colors = {\n",
+ " 'c2': 'lightgreen',\n",
+ " 'c3': 'tomato',\n",
+ " 'c4': 'pink',\n",
+ " 'c5': 'turquoise'\n",
+ "}\n",
+ "\n",
+ "custom_colors_values = sb.palplot(sb.color_palette([custom_colors.get(ch, 'blue') for ch in metadata.Channel.unique()]))\n",
+ "\n",
+ "# Display those unique customs colors\n",
+ "print(\"Unique channels are:\", metadata.Channel.unique())\n",
+ "sb.palplot(sb.color_palette(channel_color_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "id": "e7aa9d2e-94b5-461b-859f-fadfa2ccc0c5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'c2': array([0.00784314, 0.24313725, 1. ]),\n",
+ " 'c3': array([1. , 0.48627451, 0. ]),\n",
+ " 'c4': array([0.10196078, 0.78823529, 0.21960784]),\n",
+ " 'c5': array([0.90980392, 0. , 0.04313725])}"
+ ]
+ },
+ "execution_count": 47,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Store in a dictionary\n",
+ "channel_color_dict = dict(zip(metadata.Channel.unique(), channel_color_values))\n",
+ "channel_color_dict\n",
+ "for k,v in channel_color_dict.items():\n",
+ " channel_color_dict[k] = np.float64(v)\n",
+ "\n",
+ "channel_color_dict"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "id": "aa2d6cf5-2126-4df4-a54f-c6926c2c06a1",
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "AttributeError",
+ "evalue": "module 'numpy' has no attribute 'float'.\n`np.float` was a deprecated alias for the builtin `float`. To avoid this error in existing code, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.\nThe aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:\n https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[0;32mIn[65], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m color_df_channel \u001b[38;5;241m=\u001b[39m color_dict_to_df(channel_color_dict, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mChannel\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 3\u001b[0m \u001b[38;5;66;03m# Save to file in metadatadirectory\u001b[39;00m\n\u001b[1;32m 4\u001b[0m filename \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mchannel_color_data.csv\u001b[39m\u001b[38;5;124m\"\u001b[39m\n",
+ "File \u001b[0;32m~/Downloads/wetransfer_data-zip_2024-05-17_1431/my_modules.py:379\u001b[0m, in \u001b[0;36mcolor_dict_to_df\u001b[0;34m(cd, column_name)\u001b[0m\n\u001b[1;32m 377\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcolor_dict_to_df\u001b[39m(cd, column_name):\n\u001b[1;32m 378\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame\u001b[38;5;241m.\u001b[39mfrom_dict(cd, orient \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mindex\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m--> 379\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrgb\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;01mlambda\u001b[39;00m row: (np\u001b[38;5;241m.\u001b[39mfloat64(row[\u001b[38;5;241m0\u001b[39m]), np\u001b[38;5;241m.\u001b[39mfloat(row[\u001b[38;5;241m1\u001b[39m]), np\u001b[38;5;241m.\u001b[39mfloat64(row[\u001b[38;5;241m2\u001b[39m])), axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m 380\u001b[0m df \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mdrop(columns \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m0\u001b[39m,\u001b[38;5;241m1\u001b[39m,\u001b[38;5;241m2\u001b[39m])\n\u001b[1;32m 381\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mhex\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;01mlambda\u001b[39;00m row: mplc\u001b[38;5;241m.\u001b[39mto_hex(row[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrgb\u001b[39m\u001b[38;5;124m'\u001b[39m]), axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m)\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/frame.py:10034\u001b[0m, in \u001b[0;36mDataFrame.apply\u001b[0;34m(self, func, axis, raw, result_type, args, by_row, **kwargs)\u001b[0m\n\u001b[1;32m 10022\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mapply\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m frame_apply\n\u001b[1;32m 10024\u001b[0m op \u001b[38;5;241m=\u001b[39m frame_apply(\n\u001b[1;32m 10025\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 10026\u001b[0m func\u001b[38;5;241m=\u001b[39mfunc,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 10032\u001b[0m kwargs\u001b[38;5;241m=\u001b[39mkwargs,\n\u001b[1;32m 10033\u001b[0m )\n\u001b[0;32m> 10034\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m op\u001b[38;5;241m.\u001b[39mapply()\u001b[38;5;241m.\u001b[39m__finalize__(\u001b[38;5;28mself\u001b[39m, method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mapply\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/apply.py:837\u001b[0m, in \u001b[0;36mFrameApply.apply\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 834\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mraw:\n\u001b[1;32m 835\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_raw()\n\u001b[0;32m--> 837\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_standard()\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/apply.py:965\u001b[0m, in \u001b[0;36mFrameApply.apply_standard\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 964\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mapply_standard\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m--> 965\u001b[0m results, res_index \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_series_generator()\n\u001b[1;32m 967\u001b[0m \u001b[38;5;66;03m# wrap results\u001b[39;00m\n\u001b[1;32m 968\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwrap_results(results, res_index)\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/apply.py:981\u001b[0m, in \u001b[0;36mFrameApply.apply_series_generator\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 978\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m option_context(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmode.chained_assignment\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m 979\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, v \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(series_gen):\n\u001b[1;32m 980\u001b[0m \u001b[38;5;66;03m# ignore SettingWithCopy here in case the user mutates\u001b[39;00m\n\u001b[0;32m--> 981\u001b[0m results[i] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfunc(v, \u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkwargs)\n\u001b[1;32m 982\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(results[i], ABCSeries):\n\u001b[1;32m 983\u001b[0m \u001b[38;5;66;03m# If we have a view on v, we need to make a copy because\u001b[39;00m\n\u001b[1;32m 984\u001b[0m \u001b[38;5;66;03m# series_generator will swap out the underlying data\u001b[39;00m\n\u001b[1;32m 985\u001b[0m results[i] \u001b[38;5;241m=\u001b[39m results[i]\u001b[38;5;241m.\u001b[39mcopy(deep\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n",
+ "File \u001b[0;32m~/Downloads/wetransfer_data-zip_2024-05-17_1431/my_modules.py:379\u001b[0m, in \u001b[0;36mcolor_dict_to_df..\u001b[0;34m(row)\u001b[0m\n\u001b[1;32m 377\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcolor_dict_to_df\u001b[39m(cd, column_name):\n\u001b[1;32m 378\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame\u001b[38;5;241m.\u001b[39mfrom_dict(cd, orient \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mindex\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m--> 379\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrgb\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;01mlambda\u001b[39;00m row: (np\u001b[38;5;241m.\u001b[39mfloat64(row[\u001b[38;5;241m0\u001b[39m]), np\u001b[38;5;241m.\u001b[39mfloat(row[\u001b[38;5;241m1\u001b[39m]), np\u001b[38;5;241m.\u001b[39mfloat64(row[\u001b[38;5;241m2\u001b[39m])), axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m 380\u001b[0m df \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mdrop(columns \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m0\u001b[39m,\u001b[38;5;241m1\u001b[39m,\u001b[38;5;241m2\u001b[39m])\n\u001b[1;32m 381\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mhex\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;01mlambda\u001b[39;00m row: mplc\u001b[38;5;241m.\u001b[39mto_hex(row[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrgb\u001b[39m\u001b[38;5;124m'\u001b[39m]), axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m)\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/numpy/__init__.py:324\u001b[0m, in \u001b[0;36m__getattr__\u001b[0;34m(attr)\u001b[0m\n\u001b[1;32m 319\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m 320\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIn the future `np.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mattr\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m` will be defined as the \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcorresponding NumPy scalar.\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;167;01mFutureWarning\u001b[39;00m, stacklevel\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m)\n\u001b[1;32m 323\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attr \u001b[38;5;129;01min\u001b[39;00m __former_attrs__:\n\u001b[0;32m--> 324\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(__former_attrs__[attr])\n\u001b[1;32m 326\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attr \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtesting\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m 327\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtesting\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mtesting\u001b[39;00m\n",
+ "\u001b[0;31mAttributeError\u001b[0m: module 'numpy' has no attribute 'float'.\n`np.float` was a deprecated alias for the builtin `float`. To avoid this error in existing code, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.\nThe aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:\n https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations"
+ ]
+ }
+ ],
+ "source": [
+ "color_df_channel = color_dict_to_df(channel_color_dict, \"Channel\")\n",
+ "\n",
+ "# Save to file in metadatadirectory\n",
+ "filename = \"channel_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "color_df_channel.to_csv(filename, index = False)\n",
+ "\n",
+ "color_df_channel"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d8117d2d-c60e-477c-bef4-dc89d18fa6aa",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Legend of channel info only\n",
+ "g = plt.figure(figsize = (1,1)).add_subplot(111)\n",
+ "g.axis('off')\n",
+ "handles = []\n",
+ "for item in channel_color_dict.keys():\n",
+ " h = g.bar(0,0, color = channel_color_dict[item],\n",
+ " label = item, linewidth =0)\n",
+ " handles.append(h)\n",
+ "first_legend = plt.legend(handles=handles, loc='upper right', title = 'Channel'),\n",
+ " # bbox_to_anchor=(10,10), \n",
+ " # bbox_transform=plt.gcf().transFigure)\n",
+ "\n",
+ "filename = \"Channel_legend.png\"\n",
+ "filename = os.path.join(metadata_images_dir, filename)\n",
+ "plt.savefig(filename, bbox_inches = 'tight')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b5d587ec-809c-4312-acda-3747fc63fd83",
+ "metadata": {},
+ "source": [
+ "### I.7.2. ROUNDS COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "id": "40bedb40-5740-4956-aa97-a95ac9fb341a",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['R0' 'R1' 'R2' 'R3' 'R4' 'R5' 'R6' 'R7' 'R8']\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAs0AAABlCAYAAAC2n94rAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAD40lEQVR4nO3cwU5jBRiG4b+lUBDbzmAmUUJNTLwDvQB3XoAXxK25NvEipAk7NpQKQeG4MGqchPnOOQ6eOcPzbGnIn4+SvpDCpGmapgAAgCdNhz4AAAA+dKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQzNo86PHxsS4vL2uxWNRkMnnumwAA4H/RNE1tt9s6PT2t6fTp3ye3iubLy8tar9fv7TgAAPiQbDabOjs7e/LjraJ5sVhUVdV3629qNt17P5e9AJ+9/nroE0bp+M1XQ58wOvt+qO1l7+z10CeM0uHZ0dAnjM6rL1q93PKWz9/YrasvX30y9Amjs7vZ1Q/ffv937z6l1bPxr7dkzKZ7tT/1BG7rYO9g6BNG6WD/cOgTRmf/QMT0MTv04tLH/MhuXR0ee+3s4+hTu3V1vDge+oTRSm9B9oeAAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQiGYAAAhEMwAABKIZAAAC0QwAAIFoBgCAQDQDAEAgmgEAIBDNAAAQzNo8qGmaqqr6/fHhWY/52Nw/3A99wijt/3Y39Amj09zfDn3CKD3c/Tr0CaM0uW2GPmF07natXm55y+2N3brazXx/drW72VXVP737lFbPxqurq6qq+nHz838864X55aehLwAAoIXtdlur1erJj7eK5pOTk6qquri4eOcn49+ur69rvV7XZrOp5XI59DmjYLN+7NadzfqxW3c268du3dmsn6Zparvd1unp6Tsf1yqap9M/3/q8Wq18EXpYLpd268hm/ditO5v1Y7fubNaP3bqzWXdtfinsDwEBACAQzQAAELSK5vl8Xufn5zWfz5/7no+K3bqzWT92685m/ditO5v1Y7fubPa8Jk36/xoAAPDCeXsGAAAEohkAAALRDAAAgWgGAIBANAMAQCCaAQAgEM0AABCIZgAACP4AgRCVeH0RRYAAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# we want colors that are sequential, since Round is an ordered category. \n",
+ "# We can still generate colors that are easy to distinguish. Also, many of the categorical palettes cap at at about 10 or so unique colors, and repeat from there. \n",
+ "# We do not want any repeats!\n",
+ "round_color_values = sb.cubehelix_palette(\n",
+ " len(metadata.Round.unique()), start=1, rot= -0.75, dark=0.19, light=.85, reverse=True)\n",
+ "# round_color_values = sb.color_palette(\"cubehelix\",n_colors = len(metadata.Round.unique()))\n",
+ "# chose 'cubehelix' because it is sequential, and round is a continuous process\n",
+ "# each color value is a tuple of three values: (R, G, B)\n",
+ "print(metadata.Round.unique())\n",
+ "\n",
+ "sb.palplot(sb.color_palette(round_color_values))\n",
+ "\n",
+ "## TO-DO: write what these parameters mean"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "id": "4372b4f0-2242-4d76-8881-a78fba5fd814",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'R0': array([0.28685356, 0.13009829, 0.23110332]),\n",
+ " 'R1': array([0.36541462, 0.2025447 , 0.3769331 ]),\n",
+ " 'R2': array([0.40867533, 0.29407612, 0.51667119]),\n",
+ " 'R3': array([0.42890614, 0.40822902, 0.63353489]),\n",
+ " 'R4': array([0.44444629, 0.5264665 , 0.70563219]),\n",
+ " 'R5': array([0.47707206, 0.64270618, 0.74184779]),\n",
+ " 'R6': array([0.54144549, 0.74667592, 0.75729058]),\n",
+ " 'R7': array([0.64147101, 0.83215511, 0.7746773 ]),\n",
+ " 'R8': array([0.76842569, 0.89926671, 0.81713833])}"
+ ]
+ },
+ "execution_count": 50,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Store in a dictionary\n",
+ "round_color_dict = dict(zip(metadata.Round.unique(), round_color_values))\n",
+ "\n",
+ "for k,v in round_color_dict.items():\n",
+ " round_color_dict[k] = np.float64(v)\n",
+ "\n",
+ "round_color_dict"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "id": "3a6053ce-d87c-4137-8c70-a6772208fc37",
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "AttributeError",
+ "evalue": "module 'numpy' has no attribute 'float'.\n`np.float` was a deprecated alias for the builtin `float`. To avoid this error in existing code, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.\nThe aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:\n https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[0;32mIn[51], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m color_df_round \u001b[38;5;241m=\u001b[39m color_dict_to_df(round_color_dict, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mRound\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 3\u001b[0m \u001b[38;5;66;03m# Save to file in metadatadirectory\u001b[39;00m\n\u001b[1;32m 4\u001b[0m filename \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mround_color_data.csv\u001b[39m\u001b[38;5;124m\"\u001b[39m\n",
+ "File \u001b[0;32m~/Downloads/wetransfer_data-zip_2024-05-17_1431/my_modules.py:379\u001b[0m, in \u001b[0;36mcolor_dict_to_df\u001b[0;34m(cd, column_name)\u001b[0m\n\u001b[1;32m 377\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcolor_dict_to_df\u001b[39m(cd, column_name):\n\u001b[1;32m 378\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame\u001b[38;5;241m.\u001b[39mfrom_dict(cd, orient \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mindex\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m--> 379\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrgb\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;01mlambda\u001b[39;00m row: (np\u001b[38;5;241m.\u001b[39mfloat64(row[\u001b[38;5;241m0\u001b[39m]), np\u001b[38;5;241m.\u001b[39mfloat(row[\u001b[38;5;241m1\u001b[39m]), np\u001b[38;5;241m.\u001b[39mfloat64(row[\u001b[38;5;241m2\u001b[39m])), axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m 380\u001b[0m df \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mdrop(columns \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m0\u001b[39m,\u001b[38;5;241m1\u001b[39m,\u001b[38;5;241m2\u001b[39m])\n\u001b[1;32m 381\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mhex\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;01mlambda\u001b[39;00m row: mplc\u001b[38;5;241m.\u001b[39mto_hex(row[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrgb\u001b[39m\u001b[38;5;124m'\u001b[39m]), axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m)\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/frame.py:10034\u001b[0m, in \u001b[0;36mDataFrame.apply\u001b[0;34m(self, func, axis, raw, result_type, args, by_row, **kwargs)\u001b[0m\n\u001b[1;32m 10022\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mapply\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m frame_apply\n\u001b[1;32m 10024\u001b[0m op \u001b[38;5;241m=\u001b[39m frame_apply(\n\u001b[1;32m 10025\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 10026\u001b[0m func\u001b[38;5;241m=\u001b[39mfunc,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 10032\u001b[0m kwargs\u001b[38;5;241m=\u001b[39mkwargs,\n\u001b[1;32m 10033\u001b[0m )\n\u001b[0;32m> 10034\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m op\u001b[38;5;241m.\u001b[39mapply()\u001b[38;5;241m.\u001b[39m__finalize__(\u001b[38;5;28mself\u001b[39m, method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mapply\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/apply.py:837\u001b[0m, in \u001b[0;36mFrameApply.apply\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 834\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mraw:\n\u001b[1;32m 835\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_raw()\n\u001b[0;32m--> 837\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_standard()\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/apply.py:965\u001b[0m, in \u001b[0;36mFrameApply.apply_standard\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 964\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mapply_standard\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m--> 965\u001b[0m results, res_index \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_series_generator()\n\u001b[1;32m 967\u001b[0m \u001b[38;5;66;03m# wrap results\u001b[39;00m\n\u001b[1;32m 968\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwrap_results(results, res_index)\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/apply.py:981\u001b[0m, in \u001b[0;36mFrameApply.apply_series_generator\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 978\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m option_context(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmode.chained_assignment\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m 979\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, v \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(series_gen):\n\u001b[1;32m 980\u001b[0m \u001b[38;5;66;03m# ignore SettingWithCopy here in case the user mutates\u001b[39;00m\n\u001b[0;32m--> 981\u001b[0m results[i] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfunc(v, \u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkwargs)\n\u001b[1;32m 982\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(results[i], ABCSeries):\n\u001b[1;32m 983\u001b[0m \u001b[38;5;66;03m# If we have a view on v, we need to make a copy because\u001b[39;00m\n\u001b[1;32m 984\u001b[0m \u001b[38;5;66;03m# series_generator will swap out the underlying data\u001b[39;00m\n\u001b[1;32m 985\u001b[0m results[i] \u001b[38;5;241m=\u001b[39m results[i]\u001b[38;5;241m.\u001b[39mcopy(deep\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n",
+ "File \u001b[0;32m~/Downloads/wetransfer_data-zip_2024-05-17_1431/my_modules.py:379\u001b[0m, in \u001b[0;36mcolor_dict_to_df..\u001b[0;34m(row)\u001b[0m\n\u001b[1;32m 377\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcolor_dict_to_df\u001b[39m(cd, column_name):\n\u001b[1;32m 378\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame\u001b[38;5;241m.\u001b[39mfrom_dict(cd, orient \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mindex\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m--> 379\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrgb\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;01mlambda\u001b[39;00m row: (np\u001b[38;5;241m.\u001b[39mfloat64(row[\u001b[38;5;241m0\u001b[39m]), np\u001b[38;5;241m.\u001b[39mfloat(row[\u001b[38;5;241m1\u001b[39m]), np\u001b[38;5;241m.\u001b[39mfloat64(row[\u001b[38;5;241m2\u001b[39m])), axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m 380\u001b[0m df \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mdrop(columns \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m0\u001b[39m,\u001b[38;5;241m1\u001b[39m,\u001b[38;5;241m2\u001b[39m])\n\u001b[1;32m 381\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mhex\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;01mlambda\u001b[39;00m row: mplc\u001b[38;5;241m.\u001b[39mto_hex(row[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrgb\u001b[39m\u001b[38;5;124m'\u001b[39m]), axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m)\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/numpy/__init__.py:324\u001b[0m, in \u001b[0;36m__getattr__\u001b[0;34m(attr)\u001b[0m\n\u001b[1;32m 319\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m 320\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIn the future `np.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mattr\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m` will be defined as the \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcorresponding NumPy scalar.\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;167;01mFutureWarning\u001b[39;00m, stacklevel\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m)\n\u001b[1;32m 323\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attr \u001b[38;5;129;01min\u001b[39;00m __former_attrs__:\n\u001b[0;32m--> 324\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(__former_attrs__[attr])\n\u001b[1;32m 326\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attr \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtesting\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m 327\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtesting\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mtesting\u001b[39;00m\n",
+ "\u001b[0;31mAttributeError\u001b[0m: module 'numpy' has no attribute 'float'.\n`np.float` was a deprecated alias for the builtin `float`. To avoid this error in existing code, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.\nThe aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:\n https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations"
+ ]
+ }
+ ],
+ "source": [
+ "color_df_round = color_dict_to_df(round_color_dict, \"Round\")\n",
+ "\n",
+ "# Save to file in metadatadirectory\n",
+ "filename = \"round_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "color_df_round.to_csv(filename, index = False)\n",
+ "\n",
+ "color_df_round"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "id": "977a7e45-64df-4bd6-ab21-cecd44d76fd9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Legend of round info only\n",
+ "\n",
+ "round_legend = plt.figure(figsize = (1,1)).add_subplot(111)\n",
+ "round_legend.axis('off')\n",
+ "handles = []\n",
+ "for item in round_color_dict.keys():\n",
+ " h = round_legend.bar(0,0, color = round_color_dict[item],\n",
+ " label = item, linewidth =0)\n",
+ " handles.append(h)\n",
+ "first_legend = plt.legend(handles=handles, loc='upper right', title = 'Round'),\n",
+ " # bbox_to_anchor=(10,10), \n",
+ " # bbox_transform=plt.gcf().transFigure)\n",
+ "\n",
+ "filename = \"Round_legend.png\"\n",
+ "filename = os.path.join(metadata_images_dir, filename)\n",
+ "plt.savefig(filename, bbox_inches = 'tight')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "34b81c62-58a4-432c-876a-dfa5df0bbe9e",
+ "metadata": {},
+ "source": [
+ "### I.7.3. SAMPLES COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "id": "3ccb74da-fb1d-4fda-9116-bf6b6a6d868b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUoAAABlCAYAAAArpKpSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAACuUlEQVR4nO3ZMWsTcRzG8V9SaVohCXQMydTB2ffhu3BxEFzduvhWuvqGhA49yAvogSmCPQdRJ/NcW8P17Ocz/4eHf+DLXW7SdV1XAPzVdOgBAE+dUAIEQgkQCCVAIJQAgVACBEIJELzoc+ju7q62223N5/OaTCaH3gRwcF3XVdu2tVqtajrd/8zYK5Tb7bY2m80/GQfwlDRNU+v1eu+ZXqGcz+dVVfXl7ceaH588ftkzcfn689ATRuny5P3QE0bn3fWboSeMzu62rQ+fXv3u2z69QvnrdXt+fFKLmVD2dXp6NPSEUTo6fTn0hNE5PVkMPWG0+vyd6GMOQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQPCiz6Gu66qqqv12e9Ax/5vd7vvQE0bpe/d16Amjs7u9GXrC6Oxu26r607d9Jl2PU1dXV3V+fv74ZQBPTNM0tV6v957p9UR5dnZWVVXX19e1XC4fv+yZuLm5qc1mU03T1GKxGHrOKLizh3Fv99d1XbVtW6vVKp7tFcrp9Odfmcvl0o/wAIvFwr3dkzt7GPd2P30f/HzMAQiEEiDoFcrZbFYXFxc1m80Ovee/4t7uz509jHs7rF5fvQGeM6/eAIFQAgRCCRAIJUAglACBUAIEQgkQCCVA8ANJyGd00cXSZwAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# we want colors that are neither sequential nor categorical. \n",
+ "# Categorical would be ideal if we could generate an arbitrary number of colors, but I do not think that we can. \n",
+ "# Hense, we will choose `n` colors from a continuous palette. First we will generate the right number of colors. Later, we will assign TMA samples to gray.\n",
+ "\n",
+ "# Get those unique colors\n",
+ "color_values = sb.color_palette(\"husl\",n_colors = len(ls_samples))#'HLS'\n",
+ "# each color value is a tuple of three values: (R, G, B)\n",
+ "\n",
+ "# Display those unique colors\n",
+ "sb.palplot(sb.color_palette(color_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "id": "441a57fe-d55a-49e1-8593-0f1939472b89",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGEAAABlCAYAAABdl421AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAABwUlEQVR4nO3dP2oCQRxH8e9KYGzWBUtv6Qk8gie0ccELWNk4KcIGUqiDRnyJ7wPTuTDM2z92v67WWqOXmr16AzICghEAjABgBAAjABgB4KPlR+fzOYfDIX3fp+u6Z+/p36i15ng8ZrVaZTa7cr/XBuM41iSuO9c4jlfPt+lJ6Ps+SbJer1NKablESU6nU7bb7ff5XdIUYXoFlVIyn88f392bufUK98MMYAQAIwAYAcAIAEYAMAKAEQCMAGAEACMAGAHACABGADACgBEAjABgBAAjABgBwAgARgAwAoARAIwAYAQAIwAYAcAIAEYAMAKAEQCMAGAEACMAGAHACABGADACgBEAjABgBAAjABgBwAgARgAwAoARAIwAYAQAIwAYAcAIAEYAMAKAEQCMAGAEACMAGAHACABGADACgBEAjABgBAAjABgBwAgARgAwAoARAIwA0DRxsNaa5GuModpN5zWd30UtA1B3u93Lh4j+5fUrA1CXy2WSZL/fZxiGlkuU/BgFfE1ThGmW8DAMWSwWj+/ujbTctH6YAYwA0BShlJLNZuNA7Cfp6s3/T3o2X0cARgAwAoARAIwAYAQAIwAYAeATtddd94S3hxMAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "TMA_samples = [s for s in df.Sample_ID.unique() if 'TMA' in s]\n",
+ "TMA_color_values = sb.color_palette(n_colors = len(TMA_samples),palette = \"gray\")\n",
+ "sb.palplot(sb.color_palette(TMA_color_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "id": "18dbf741-983e-4652-97d1-d55e87eba4fb",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'DD3S1.csv': (0.9677975592919913, 0.44127456009157356, 0.5358103155058701),\n",
+ " 'DD3S2.csv': (0.5920891529639701, 0.6418467016378244, 0.1935069134991043),\n",
+ " 'DD3S3.csv': (0.21044753832183283, 0.6773105080456748, 0.6433941168468681),\n",
+ " 'TMA.csv': (0.5019607843137255, 0.5019607843137255, 0.5019607843137255)}"
+ ]
+ },
+ "execution_count": 55,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Store in a dictionary\n",
+ "color_dict = dict()\n",
+ "color_dict = dict(zip(df.Sample_ID.unique(), color_values))\n",
+ "\n",
+ "# Replace all TMA samples' colors with gray\n",
+ "i = 0\n",
+ "for key in color_dict.keys():\n",
+ " if 'TMA' in key:\n",
+ " color_dict[key] = TMA_color_values[i]\n",
+ " i +=1\n",
+ "\n",
+ "color_dict"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "id": "807f2bb5-6d19-4086-81c1-98836e850dcd",
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "AttributeError",
+ "evalue": "module 'numpy' has no attribute 'float'.\n`np.float` was a deprecated alias for the builtin `float`. To avoid this error in existing code, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.\nThe aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:\n https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[0;32mIn[56], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m color_df_sample \u001b[38;5;241m=\u001b[39m color_dict_to_df(color_dict, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSample_ID\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 3\u001b[0m \u001b[38;5;66;03m# Save to file in metadatadirectory\u001b[39;00m\n\u001b[1;32m 4\u001b[0m filename \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msample_color_data.csv\u001b[39m\u001b[38;5;124m\"\u001b[39m\n",
+ "File \u001b[0;32m~/Downloads/wetransfer_data-zip_2024-05-17_1431/my_modules.py:379\u001b[0m, in \u001b[0;36mcolor_dict_to_df\u001b[0;34m(cd, column_name)\u001b[0m\n\u001b[1;32m 377\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcolor_dict_to_df\u001b[39m(cd, column_name):\n\u001b[1;32m 378\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame\u001b[38;5;241m.\u001b[39mfrom_dict(cd, orient \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mindex\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m--> 379\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrgb\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;01mlambda\u001b[39;00m row: (np\u001b[38;5;241m.\u001b[39mfloat64(row[\u001b[38;5;241m0\u001b[39m]), np\u001b[38;5;241m.\u001b[39mfloat(row[\u001b[38;5;241m1\u001b[39m]), np\u001b[38;5;241m.\u001b[39mfloat64(row[\u001b[38;5;241m2\u001b[39m])), axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m 380\u001b[0m df \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mdrop(columns \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m0\u001b[39m,\u001b[38;5;241m1\u001b[39m,\u001b[38;5;241m2\u001b[39m])\n\u001b[1;32m 381\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mhex\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;01mlambda\u001b[39;00m row: mplc\u001b[38;5;241m.\u001b[39mto_hex(row[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrgb\u001b[39m\u001b[38;5;124m'\u001b[39m]), axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m)\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/frame.py:10034\u001b[0m, in \u001b[0;36mDataFrame.apply\u001b[0;34m(self, func, axis, raw, result_type, args, by_row, **kwargs)\u001b[0m\n\u001b[1;32m 10022\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mapply\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m frame_apply\n\u001b[1;32m 10024\u001b[0m op \u001b[38;5;241m=\u001b[39m frame_apply(\n\u001b[1;32m 10025\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 10026\u001b[0m func\u001b[38;5;241m=\u001b[39mfunc,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 10032\u001b[0m kwargs\u001b[38;5;241m=\u001b[39mkwargs,\n\u001b[1;32m 10033\u001b[0m )\n\u001b[0;32m> 10034\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m op\u001b[38;5;241m.\u001b[39mapply()\u001b[38;5;241m.\u001b[39m__finalize__(\u001b[38;5;28mself\u001b[39m, method\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mapply\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/apply.py:837\u001b[0m, in \u001b[0;36mFrameApply.apply\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 834\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mraw:\n\u001b[1;32m 835\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_raw()\n\u001b[0;32m--> 837\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_standard()\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/apply.py:965\u001b[0m, in \u001b[0;36mFrameApply.apply_standard\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 964\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mapply_standard\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[0;32m--> 965\u001b[0m results, res_index \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mapply_series_generator()\n\u001b[1;32m 967\u001b[0m \u001b[38;5;66;03m# wrap results\u001b[39;00m\n\u001b[1;32m 968\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwrap_results(results, res_index)\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/pandas/core/apply.py:981\u001b[0m, in \u001b[0;36mFrameApply.apply_series_generator\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 978\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m option_context(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmode.chained_assignment\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m 979\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, v \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(series_gen):\n\u001b[1;32m 980\u001b[0m \u001b[38;5;66;03m# ignore SettingWithCopy here in case the user mutates\u001b[39;00m\n\u001b[0;32m--> 981\u001b[0m results[i] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfunc(v, \u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkwargs)\n\u001b[1;32m 982\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(results[i], ABCSeries):\n\u001b[1;32m 983\u001b[0m \u001b[38;5;66;03m# If we have a view on v, we need to make a copy because\u001b[39;00m\n\u001b[1;32m 984\u001b[0m \u001b[38;5;66;03m# series_generator will swap out the underlying data\u001b[39;00m\n\u001b[1;32m 985\u001b[0m results[i] \u001b[38;5;241m=\u001b[39m results[i]\u001b[38;5;241m.\u001b[39mcopy(deep\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n",
+ "File \u001b[0;32m~/Downloads/wetransfer_data-zip_2024-05-17_1431/my_modules.py:379\u001b[0m, in \u001b[0;36mcolor_dict_to_df..\u001b[0;34m(row)\u001b[0m\n\u001b[1;32m 377\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcolor_dict_to_df\u001b[39m(cd, column_name):\n\u001b[1;32m 378\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame\u001b[38;5;241m.\u001b[39mfrom_dict(cd, orient \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mindex\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m--> 379\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrgb\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;01mlambda\u001b[39;00m row: (np\u001b[38;5;241m.\u001b[39mfloat64(row[\u001b[38;5;241m0\u001b[39m]), np\u001b[38;5;241m.\u001b[39mfloat(row[\u001b[38;5;241m1\u001b[39m]), np\u001b[38;5;241m.\u001b[39mfloat64(row[\u001b[38;5;241m2\u001b[39m])), axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m 380\u001b[0m df \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mdrop(columns \u001b[38;5;241m=\u001b[39m [\u001b[38;5;241m0\u001b[39m,\u001b[38;5;241m1\u001b[39m,\u001b[38;5;241m2\u001b[39m])\n\u001b[1;32m 381\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mhex\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28;01mlambda\u001b[39;00m row: mplc\u001b[38;5;241m.\u001b[39mto_hex(row[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrgb\u001b[39m\u001b[38;5;124m'\u001b[39m]), axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m)\n",
+ "File \u001b[0;32m/opt/anaconda3/lib/python3.11/site-packages/numpy/__init__.py:324\u001b[0m, in \u001b[0;36m__getattr__\u001b[0;34m(attr)\u001b[0m\n\u001b[1;32m 319\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m 320\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIn the future `np.\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mattr\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m` will be defined as the \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 321\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcorresponding NumPy scalar.\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;167;01mFutureWarning\u001b[39;00m, stacklevel\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m)\n\u001b[1;32m 323\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attr \u001b[38;5;129;01min\u001b[39;00m __former_attrs__:\n\u001b[0;32m--> 324\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mAttributeError\u001b[39;00m(__former_attrs__[attr])\n\u001b[1;32m 326\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m attr \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mtesting\u001b[39m\u001b[38;5;124m'\u001b[39m:\n\u001b[1;32m 327\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtesting\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mtesting\u001b[39;00m\n",
+ "\u001b[0;31mAttributeError\u001b[0m: module 'numpy' has no attribute 'float'.\n`np.float` was a deprecated alias for the builtin `float`. To avoid this error in existing code, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.\nThe aliases was originally deprecated in NumPy 1.20; for more details and guidance see the original release note at:\n https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations"
+ ]
+ }
+ ],
+ "source": [
+ "color_df_sample = color_dict_to_df(color_dict, \"Sample_ID\")\n",
+ "\n",
+ "# Save to file in metadatadirectory\n",
+ "filename = \"sample_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "color_df_sample.to_csv(filename, index = False)\n",
+ "\n",
+ "color_df_sample"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "id": "39b6afdb-2e37-471e-86a0-e55ab7667e39",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Legend of sample info only\n",
+ "g = plt.figure(figsize = (1,1)).add_subplot(111)\n",
+ "g.axis('off')\n",
+ "handles = []\n",
+ "for item in color_dict.keys():\n",
+ " h = g.bar(0,0, color = color_dict[item],\n",
+ " label = item, linewidth =0)\n",
+ " handles.append(h)\n",
+ "first_legend = plt.legend(handles=handles, loc='upper right', title = 'Sample')\n",
+ "\n",
+ "filename = \"Sample_legend.png\"\n",
+ "filename = os.path.join(metadata_images_dir, filename)\n",
+ "plt.savefig(filename, bbox_inches = 'tight')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e3cf0dea-43db-41fa-952e-bbba53e89cdb",
+ "metadata": {},
+ "source": [
+ "### I.7.4. CLUSTERS COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "id": "d37c61d7-de64-4b7c-8d01-86ee16ac67c4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "if 'cluster' in df.columns:\n",
+ " cluster_color_values = sb.color_palette(\"hls\",n_colors = len(df.cluster.unique()))\n",
+ "\n",
+ " print(sorted(test_df.cluster.unique()))\n",
+ " # Display those unique colors\n",
+ " sb.palplot(sb.color_palette(cluster_color_values))\n",
+ " \n",
+ " cluster_color_dict = dict(zip(sorted(test_df.cluster.unique()), cluster_color_values))\n",
+ " print(cluster_color_dict)\n",
+ " \n",
+ " # Create dataframe\n",
+ " cluster_color_df = color_dict_to_df(cluster_color_dict, \"cluster\")\n",
+ " cluster_color_df.head()\n",
+ "\n",
+ " # Save to file in metadatadirectory\n",
+ " filename = \"cluster_color_data.csv\"\n",
+ " filename = os.path.join(metadata_dir, filename)\n",
+ " cluster_color_df.to_csv(filename, index = False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "id": "c9215452-fdb6-4963-9f56-31f16e0483bb",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Legend of cluster info only\n",
+ "\n",
+ "if 'cluster' in df.columns:\n",
+ " g = plt.figure(figsize = (1,1)).add_subplot(111)\n",
+ " g.axis('off')\n",
+ " handles = []\n",
+ " for item in sorted(cluster_color_dict.keys()):\n",
+ " h = g.bar(0,0, color = cluster_color_dict[item],\n",
+ " label = item, linewidth =0)\n",
+ " handles.append(h)\n",
+ " first_legend = plt.legend(handles=handles, loc='upper right', title = 'Cluster'),\n",
+ "\n",
+ "\n",
+ " filename = \"Clustertype_legend.png\"\n",
+ " filename = os.path.join(metadata_images_dir, filename)\n",
+ " plt.savefig(filename, bbox_inches = 'tight')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "id": "d0a7ff0a-98a8-4c58-8646-e50d07314dd9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Round \n",
+ " Target \n",
+ " Exp \n",
+ " Channel \n",
+ " target_lower \n",
+ " full_column \n",
+ " marker \n",
+ " localisation \n",
+ " round_color \n",
+ " channel_color \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488 \n",
+ " cell \n",
+ " [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ " [0.00784313725490196, 0.24313725490196078, 1.0] \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488 \n",
+ " cytoplasm \n",
+ " [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ " [0.00784313725490196, 0.24313725490196078, 1.0] \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " AF488 \n",
+ " nucleus \n",
+ " [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ " [0.00784313725490196, 0.24313725490196078, 1.0] \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " AF555 \n",
+ " cell \n",
+ " [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ " [1.0, 0.48627450980392156, 0.0] \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " AF555 \n",
+ " cytoplasm \n",
+ " [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ " [1.0, 0.48627450980392156, 0.0] \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " R8 \n",
+ " Sting \n",
+ " 1000 \n",
+ " c4 \n",
+ " sting \n",
+ " Sting_Cytoplasm_Intensity_Average \n",
+ " Sting \n",
+ " cytoplasm \n",
+ " [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ " [0.10196078431372549, 0.788235294117647, 0.219... \n",
+ " \n",
+ " \n",
+ " 104 \n",
+ " R8 \n",
+ " Sting \n",
+ " 1000 \n",
+ " c4 \n",
+ " sting \n",
+ " Sting_Nucleus_Intensity_Average \n",
+ " Sting \n",
+ " nucleus \n",
+ " [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ " [0.10196078431372549, 0.788235294117647, 0.219... \n",
+ " \n",
+ " \n",
+ " 105 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Cell_Intensity_Average \n",
+ " CD11b \n",
+ " cell \n",
+ " [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ " [0.9098039215686274, 0.0, 0.043137254901960784] \n",
+ " \n",
+ " \n",
+ " 106 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Cytoplasm_Intensity_Average \n",
+ " CD11b \n",
+ " cytoplasm \n",
+ " [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ " [0.9098039215686274, 0.0, 0.043137254901960784] \n",
+ " \n",
+ " \n",
+ " 107 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Nucleus_Intensity_Average \n",
+ " CD11b \n",
+ " nucleus \n",
+ " [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ " [0.9098039215686274, 0.0, 0.043137254901960784] \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
108 rows Ć 10 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Round Target Exp Channel target_lower \\\n",
+ "0 R0 AF488 300 c2 af488 \n",
+ "1 R0 AF488 300 c2 af488 \n",
+ "2 R0 AF488 300 c2 af488 \n",
+ "3 R0 AF555 1500 c3 af555 \n",
+ "4 R0 AF555 1500 c3 af555 \n",
+ ".. ... ... ... ... ... \n",
+ "103 R8 Sting 1000 c4 sting \n",
+ "104 R8 Sting 1000 c4 sting \n",
+ "105 R8 CD11b 1500 c5 cd11b \n",
+ "106 R8 CD11b 1500 c5 cd11b \n",
+ "107 R8 CD11b 1500 c5 cd11b \n",
+ "\n",
+ " full_column marker localisation \\\n",
+ "0 AF488_Cell_Intensity_Average AF488 cell \n",
+ "1 AF488_Cytoplasm_Intensity_Average AF488 cytoplasm \n",
+ "2 AF488_Nucleus_Intensity_Average AF488 nucleus \n",
+ "3 AF555_Cell_Intensity_Average AF555 cell \n",
+ "4 AF555_Cytoplasm_Intensity_Average AF555 cytoplasm \n",
+ ".. ... ... ... \n",
+ "103 Sting_Cytoplasm_Intensity_Average Sting cytoplasm \n",
+ "104 Sting_Nucleus_Intensity_Average Sting nucleus \n",
+ "105 CD11b_Cell_Intensity_Average CD11b cell \n",
+ "106 CD11b_Cytoplasm_Intensity_Average CD11b cytoplasm \n",
+ "107 CD11b_Nucleus_Intensity_Average CD11b nucleus \n",
+ "\n",
+ " round_color \\\n",
+ "0 [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ "1 [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ "2 [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ "3 [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ "4 [0.28685356234627135, 0.13009829239513535, 0.2... \n",
+ ".. ... \n",
+ "103 [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ "104 [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ "105 [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ "106 [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ "107 [0.7684256891219349, 0.8992667116749021, 0.817... \n",
+ "\n",
+ " channel_color \n",
+ "0 [0.00784313725490196, 0.24313725490196078, 1.0] \n",
+ "1 [0.00784313725490196, 0.24313725490196078, 1.0] \n",
+ "2 [0.00784313725490196, 0.24313725490196078, 1.0] \n",
+ "3 [1.0, 0.48627450980392156, 0.0] \n",
+ "4 [1.0, 0.48627450980392156, 0.0] \n",
+ ".. ... \n",
+ "103 [0.10196078431372549, 0.788235294117647, 0.219... \n",
+ "104 [0.10196078431372549, 0.788235294117647, 0.219... \n",
+ "105 [0.9098039215686274, 0.0, 0.043137254901960784] \n",
+ "106 [0.9098039215686274, 0.0, 0.043137254901960784] \n",
+ "107 [0.9098039215686274, 0.0, 0.043137254901960784] \n",
+ "\n",
+ "[108 rows x 10 columns]"
+ ]
+ },
+ "execution_count": 60,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Add in the color information in both RGB (range 0-1) and hex values, for use in visualizations\n",
+ "metadata['round_color'] = metadata.apply(lambda row: round_color_dict[row['Round']], axis = 1)\n",
+ "metadata['channel_color'] = metadata.apply(lambda row: channel_color_dict[row['Channel']], axis = 1)\n",
+ "\n",
+ "metadata"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f0642911-7a0b-49f6-9598-c8975b188807",
+ "metadata": {},
+ "source": [
+ "## I.8. SAVE"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "id": "67b33926-3ecf-415d-b67e-09d1054eab62",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Do you want to overwrite all existing files without confirmation? (yes/no): n\n",
+ "File by name /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S1_qc_eda.csv already exists. Do you want to overwrite it? (yes/no): n\n",
+ "File was not overwritten. Moving to the next sample.\n",
+ "File by name /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S2_qc_eda.csv already exists. Do you want to overwrite it? (yes/no): n\n",
+ "File was not overwritten. Moving to the next sample.\n",
+ "File by name /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S3_qc_eda.csv already exists. Do you want to overwrite it? (yes/no): n\n",
+ "File was not overwritten. Moving to the next sample.\n",
+ "File by name /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/TMA_qc_eda.csv already exists. Do you want to overwrite it? (yes/no): n\n",
+ "File was not overwritten. Moving to the next sample.\n"
+ ]
+ }
+ ],
+ "source": [
+ "overwrite_all = input(\"Do you want to overwrite all existing files without confirmation? (yes/no): \")\n",
+ "overwrite_all = overwrite_all.lower().strip()\n",
+ "\n",
+ "for sample in ls_samples:\n",
+ " sample_id = sample.split('.csv')[0]\n",
+ " filename = os.path.join(output_data_dir, sample_id + \"_\" + step_suffix + \".csv\")\n",
+ " if os.path.exists(filename):\n",
+ " if overwrite_all == 'yes':\n",
+ " df_save = df.loc[df['Sample_ID'] == sample, :]\n",
+ " df_save.to_csv(filename, index=True, index_label='ID', mode='w') # 'mode='w'' overwrites the file\n",
+ " print(\"File \" + filename + \" was overwritten!\")\n",
+ " else:\n",
+ " user_response = input(\"File by name \" + filename + \" already exists. Do you want to overwrite it? (yes/no): \")\n",
+ " if user_response.lower().strip() == 'yes':\n",
+ " df_save = df.loc[df['Sample_ID'] == sample, :]\n",
+ " df_save.to_csv(filename, index=True, index_label='ID', mode='w') # 'mode='w'' overwrites the file\n",
+ " print(\"File \" + filename + \" was overwritten!\")\n",
+ " else:\n",
+ " print(\"File was not overwritten. Moving to the next sample.\")\n",
+ " else:\n",
+ " df_save = df.loc[df['Sample_ID'] == sample, :]\n",
+ " df_save.to_csv(filename, index=True, index_label='ID') # Save normally if the file doesn't exist\n",
+ " print(\"File \" + filename + \" was created and saved !\")\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e010511b-6128-4870-a365-8d202dead49e",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "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.11.7"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/wetransfer_data-zip_2024-05-17_1431/2_background_substraction.ipynb b/wetransfer_data-zip_2024-05-17_1431/2_background_substraction.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..bec51650c72f49e2b32b824294bf4cbf137f1997
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/2_background_substraction.ipynb
@@ -0,0 +1,3525 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "1107981a-6197-4184-8327-03ed05b31a5e",
+ "metadata": {},
+ "source": [
+ "# II. BACKGROUND SUBSTRACTION NOTEBOOK"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "a0c470f4-c306-4b84-8aa5-d8b3daf9c810",
+ "metadata": {},
+ "source": [
+ "10/01/24\n",
+ "Modifications by ZoƩ Gerber\n",
+ "from an original code from Marilyne Labrie"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "d53c8eb3-f434-4f16-bbd4-4f757747b501",
+ "metadata": {},
+ "source": [
+ "II.1. PACKAGES IMPORT\n",
+ "II.2. DIRECTORIES\n",
+ "II.3. FILES\n",
+ " II.3.1. METADATA\n",
+ " II.3.2. NOT_INTENSITIES\n",
+ " II.3.3. FULL_TO_SHORT_COLUMN_NAMES\n",
+ " II.3.4. SHORT_TO_FULL_COLUMN_NAMES\n",
+ " II.3.5. SAMPLES COLORS\n",
+ " II.3.6. CHANNELS COLORS\n",
+ " II.3.7. ROUNDS COLORS\n",
+ " II.3.8. DATA\n",
+ "II.4. FILTERING\n",
+ "II.5. CELL TYPES COLORS\n",
+ "II.6. CELL SUBTYPES COLORS\n",
+ "\n",
+ "II.7. BACKGROUND SUBSTRACTION\n",
+ "II.8. SAVE"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "125cf03e-b740-4daa-9b16-21057959faee",
+ "metadata": {},
+ "source": [
+ "## II.1. PACKAGES IMPORT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "b4faaea6-5510-44e5-9e8d-b9160dc4b3b5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ " \n",
+ " "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import os\n",
+ "import random\n",
+ "import re\n",
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import seaborn as sb\n",
+ "import matplotlib.pyplot as plt\n",
+ "import matplotlib.colors as mplc\n",
+ "import subprocess\n",
+ "import warnings\n",
+ "\n",
+ "from scipy import signal\n",
+ "\n",
+ "import plotly.figure_factory as ff\n",
+ "import plotly\n",
+ "import plotly.graph_objs as go\n",
+ "from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot \n",
+ "import plotly.express as px\n",
+ "init_notebook_mode(connected = True)\n",
+ "\n",
+ "from my_modules import *"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "41c1e319-4dfb-43a2-b38b-83b789498988",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Silence FutureWarnings & UserWarnings\n",
+ "warnings.filterwarnings('ignore', category= FutureWarning)\n",
+ "warnings.filterwarnings('ignore', category= UserWarning)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7946a507-14f5-4dd0-b2f7-a8b1ced9c3df",
+ "metadata": {},
+ "source": [
+ "## II.2. *DIRECTORIES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "108f1f6d-4cd5-495f-91b7-b826f3d1f772",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Set base directory\n",
+ "\n",
+ "##### MAC WORKSTATION #####\n",
+ "#base_dir = r'/Volumes/LaboLabrie/Projets/OC_TMA_Pejovic/Temp/Zoe/CyCIF_pipeline/'\n",
+ "###########################\n",
+ "\n",
+ "##### WINDOWS WORKSTATION #####\n",
+ "#base_dir = r'C:\\Users\\LaboLabrie\\gerz2701\\cyCIF-pipeline\\Set_B'\n",
+ "###############################\n",
+ "\n",
+ "##### LOCAL WORKSTATION #####\n",
+ "base_dir = r'/Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/'\n",
+ "#############################\n",
+ "\n",
+ "#set_name = 'Set_A'\n",
+ "set_name = 'test'"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "aa48c54f-12f6-4f27-bb71-edcae686bb2b",
+ "metadata": {},
+ "source": [
+ "The project is organized as :\n",
+ "main dir \n",
+ " code\n",
+ " proj_data > all csv files\n",
+ " proj_metadata > exposure time csv file, images dir,...\n",
+ " proj_qc_eda > csv after the QC/EDA step\n",
+ " proj_bs > csv after the BS step"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "id": "a64af03a-7a84-4121-8eaa-7f08e6b3b21e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/ directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_bs directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_bs/images directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/images directory already exists !\n"
+ ]
+ }
+ ],
+ "source": [
+ "project_name = set_name # Project name\n",
+ "step_suffix = 'bs' # Curent part (here part II)\n",
+ "previous_step_suffix_long = \"_qc_eda\" # Previous part (here QC/EDA NOTEBOOK)\n",
+ "\n",
+ "# Initial input data directory\n",
+ "input_data_dir = os.path.join(base_dir, project_name + previous_step_suffix_long) \n",
+ "\n",
+ "# BS output directories\n",
+ "output_data_dir = os.path.join(base_dir, project_name + \"_\" + step_suffix)\n",
+ "# BS images subdirectory\n",
+ "output_images_dir = os.path.join(output_data_dir,\"images\")\n",
+ "\n",
+ "# Data and Metadata directories\n",
+ "# Metadata directories\n",
+ "metadata_dir = os.path.join(base_dir, project_name + \"_metadata\")\n",
+ "# images subdirectory\n",
+ "metadata_images_dir = os.path.join(metadata_dir,\"images\")\n",
+ "\n",
+ "# Create directories if they don't already exist\n",
+ "for d in [base_dir, input_data_dir, output_data_dir, output_images_dir, metadata_dir, metadata_images_dir]:\n",
+ " if not os.path.exists(d):\n",
+ " print(\"Creation of the\" , d, \"directory...\")\n",
+ " os.makedirs(d)\n",
+ " else :\n",
+ " print(\"The\", d, \"directory already exists !\")\n",
+ "\n",
+ "os.chdir(input_data_dir)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "3396590c-e964-4053-be52-ef079e2d8e46",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "base_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/\n",
+ "input_data_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_qc_eda\n",
+ "output_data_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_bs\n",
+ "output_images_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_bs/images\n",
+ "metadata_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata\n",
+ "metadata_images_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/images\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Verify paths\n",
+ "print('base_dir :', base_dir)\n",
+ "print('input_data_dir :', input_data_dir)\n",
+ "print('output_data_dir :', output_data_dir)\n",
+ "print('output_images_dir :', output_images_dir)\n",
+ "print('metadata_dir :', metadata_dir)\n",
+ "print('metadata_images_dir :', metadata_images_dir)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8fce1113-2492-49a1-bb79-2553cb4a4fcd",
+ "metadata": {},
+ "source": [
+ "## II.3. FILES"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "41524daf-bcaa-4407-96aa-7a11a2dff993",
+ "metadata": {},
+ "source": [
+ "Don't forget to put your data in the projname_data directory !"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3d6665ba-cb34-4e75-bb77-085888c8af8b",
+ "metadata": {},
+ "source": [
+ "### II.3.1. METADATA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "558e4ac8-3fd8-45fb-acdc-803baaf8a8a5",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/marker_intensity_metadata.csv file was imported for further analysis!\n",
+ "WARNING: 'Marker metadata file' has the following unexpected item(s): \n",
+ "['Exp']\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Round \n",
+ " Target \n",
+ " Exp \n",
+ " Channel \n",
+ " target_lower \n",
+ " full_column \n",
+ " marker \n",
+ " localisation \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488 \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488 \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " AF488 \n",
+ " nucleus \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " AF555 \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " AF555 \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Round Target Exp Channel target_lower full_column \\\n",
+ "0 R0 AF488 300 c2 af488 AF488_Cell_Intensity_Average \n",
+ "1 R0 AF488 300 c2 af488 AF488_Cytoplasm_Intensity_Average \n",
+ "2 R0 AF488 300 c2 af488 AF488_Nucleus_Intensity_Average \n",
+ "3 R0 AF555 1500 c3 af555 AF555_Cell_Intensity_Average \n",
+ "4 R0 AF555 1500 c3 af555 AF555_Cytoplasm_Intensity_Average \n",
+ "\n",
+ " marker localisation \n",
+ "0 AF488 cell \n",
+ "1 AF488 cytoplasm \n",
+ "2 AF488 nucleus \n",
+ "3 AF555 cell \n",
+ "4 AF555 cytoplasm "
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Import all metadata we need from the QC/EDA chapter\n",
+ "\n",
+ "# METADATA\n",
+ "filename = \"marker_intensity_metadata.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "metadata = pd.read_csv(filename)\n",
+ "\n",
+ "# Verify size with verify_line_no() function in my_modules.py\n",
+ "#verify_line_no(filename, metadata.shape[0] + 1)\n",
+ "\n",
+ "# Verify headers\n",
+ "exp_cols = ['Round','Target','Channel','target_lower','full_column','marker','localisation']\n",
+ "compare_headers(exp_cols, metadata.columns.values, \"Marker metadata file\")\n",
+ "\n",
+ "metadata = metadata.dropna()\n",
+ "metadata.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "85e0a921-eeb1-4ece-8252-1df8325bc883",
+ "metadata": {},
+ "source": [
+ "### II.3.2. NOT_INTENSITIES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "id": "f5965d04-1254-45d8-be20-f207068d25c4",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/not_intensities.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "not_intensities =\n",
+ " ['Cytoplasm_Size', 'Nuc_X', 'Primary_chem(1)_vs_surg(0)', 'cluster', 'immune_checkpoint', 'Sample_ID', 'Nucleus_Roundness', 'Unique_ROI_index', 'Nuc_Y', 'Nuc_X_Inv', 'Cell_ID', 'cell_subtype', 'ID', 'Nuc_Y_Inv', 'Patient', 'replicate_ID', 'cell_type', 'ROI_index', 'Cell_Size', 'Nucleus_Size']\n"
+ ]
+ }
+ ],
+ "source": [
+ "# NOT_INTENSITIES\n",
+ "filename = \"not_intensities.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ "\n",
+ "# Open, read in information\n",
+ "not_intensities = []\n",
+ "with open(filename, 'r') as fh:\n",
+ " not_intensities = fh.read().strip().split(\"\\n\")\n",
+ " # take str, strip whitespace, split on new line character\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, len(not_intensities))\n",
+ "\n",
+ "# Print to console\n",
+ "print(\"not_intensities =\\n\", not_intensities)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4568f560-eca8-4010-8d61-ef585d0bc5b3",
+ "metadata": {},
+ "source": [
+ "### II.3.3. FULL_TO_SHORT_COLUMN_NAMES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "4fccb7b8-27e0-47e3-8b86-392ac2dfed8d",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/full_to_short_column_names.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "full_to_short_names =\n",
+ " {'AF488_Cell_Intensity_Average': 'AF488_Cell', 'AF488_Cytoplasm_Intensity_Average': 'AF488_Cytoplasm', 'AF488_Nucleus_Intensity_Average': 'AF488_Nucleus', 'AF555_Cell_Intensity_Average': 'AF555_Cell', 'AF555_Cytoplasm_Intensity_Average': 'AF555_Cytoplasm', 'AF555_Nucleus_Intensity_Average': 'AF555_Nucleus', 'AF647_Cell_Intensity_Average': 'AF647_Cell', 'AF647_Cytoplasm_Intensity_Average': 'AF647_Cytoplasm', 'AF647_Nucleus_Intensity_Average': 'AF647_Nucleus', 'AF750_Cell_Intensity_Average': 'AF750_Cell', 'AF750_Cytoplasm_Intensity_Average': 'AF750_Cytoplasm', 'AF750_Nucleus_Intensity_Average': 'AF750_Nucleus', 'aSMA_Cell_Intensity_Average': 'aSMA_Cell', 'aSMA_Cytoplasm_Intensity_Average': 'aSMA_Cytoplasm', 'aSMA_Nucleus_Intensity_Average': 'aSMA_Nucleus', 'AXL_Cell_Intensity_Average': 'AXL_Cell', 'AXL_Cytoplasm_Intensity_Average': 'AXL_Cytoplasm', 'AXL_Nucleus_Intensity_Average': 'AXL_Nucleus', 'B7H4_Cell_Intensity_Average': 'B7H4_Cell', 'B7H4_Cytoplasm_Intensity_Average': 'B7H4_Cytoplasm', 'B7H4_Nucleus_Intensity_Average': 'B7H4_Nucleus', 'CA9_Cell_Intensity_Average': 'CA9_Cell', 'CA9_Cytoplasm_Intensity_Average': 'CA9_Cytoplasm', 'CA9_Nucleus_Intensity_Average': 'CA9_Nucleus', 'CD4_Cell_Intensity_Average': 'CD4_Cell', 'CD4_Cytoplasm_Intensity_Average': 'CD4_Cytoplasm', 'CD4_Nucleus_Intensity_Average': 'CD4_Nucleus', 'CD8_Cell_Intensity_Average': 'CD8_Cell', 'CD8_Cytoplasm_Intensity_Average': 'CD8_Cytoplasm', 'CD8_Nucleus_Intensity_Average': 'CD8_Nucleus', 'CD11b_Cell_Intensity_Average': 'CD11b_Cell', 'CD11b_Cytoplasm_Intensity_Average': 'CD11b_Cytoplasm', 'CD11b_Nucleus_Intensity_Average': 'CD11b_Nucleus', 'CD11c_Cell_Intensity_Average': 'CD11c_Cell', 'CD11c_Cytoplasm_Intensity_Average': 'CD11c_Cytoplasm', 'CD11c_Nucleus_Intensity_Average': 'CD11c_Nucleus', 'CD20_Cell_Intensity_Average': 'CD20_Cell', 'CD20_Cytoplasm_Intensity_Average': 'CD20_Cytoplasm', 'CD20_Nucleus_Intensity_Average': 'CD20_Nucleus', 'CD31_Cell_Intensity_Average': 'CD31_Cell', 'CD31_Cytoplasm_Intensity_Average': 'CD31_Cytoplasm', 'CD31_Nucleus_Intensity_Average': 'CD31_Nucleus', 'CD44_Cell_Intensity_Average': 'CD44_Cell', 'CD44_Cytoplasm_Intensity_Average': 'CD44_Cytoplasm', 'CD44_Nucleus_Intensity_Average': 'CD44_Nucleus', 'CD45_Cell_Intensity_Average': 'CD45_Cell', 'CD45_Cytoplasm_Intensity_Average': 'CD45_Cytoplasm', 'CD45_Nucleus_Intensity_Average': 'CD45_Nucleus', 'CD68_Cell_Intensity_Average': 'CD68_Cell', 'CD68_Cytoplasm_Intensity_Average': 'CD68_Cytoplasm', 'CD68_Nucleus_Intensity_Average': 'CD68_Nucleus', 'CD163_Cell_Intensity_Average': 'CD163_Cell', 'CD163_Cytoplasm_Intensity_Average': 'CD163_Cytoplasm', 'CD163_Nucleus_Intensity_Average': 'CD163_Nucleus', 'CKs_Cell_Intensity_Average': 'CKs_Cell', 'CKs_Cytoplasm_Intensity_Average': 'CKs_Cytoplasm', 'CKs_Nucleus_Intensity_Average': 'CKs_Nucleus', 'ColVI_Cell_Intensity_Average': 'ColVI_Cell', 'ColVI_Cytoplasm_Intensity_Average': 'ColVI_Cytoplasm', 'ColVI_Nucleus_Intensity_Average': 'ColVI_Nucleus', 'Desmin_Cell_Intensity_Average': 'Desmin_Cell', 'Desmin_Cytoplasm_Intensity_Average': 'Desmin_Cytoplasm', 'Desmin_Nucleus_Intensity_Average': 'Desmin_Nucleus', 'Ecad_Cell_Intensity_Average': 'Ecad_Cell', 'Ecad_Cytoplasm_Intensity_Average': 'Ecad_Cytoplasm', 'Ecad_Nucleus_Intensity_Average': 'Ecad_Nucleus', 'Fibronectin_Cell_Intensity_Average': 'Fibronectin_Cell', 'Fibronectin_Cytoplasm_Intensity_Average': 'Fibronectin_Cytoplasm', 'Fibronectin_Nucleus_Intensity_Average': 'Fibronectin_Nucleus', 'FOXP3_Cell_Intensity_Average': 'FOXP3_Cell', 'FOXP3_Cytoplasm_Intensity_Average': 'FOXP3_Cytoplasm', 'FOXP3_Nucleus_Intensity_Average': 'FOXP3_Nucleus', 'GATA3_Cell_Intensity_Average': 'GATA3_Cell', 'GATA3_Cytoplasm_Intensity_Average': 'GATA3_Cytoplasm', 'GATA3_Nucleus_Intensity_Average': 'GATA3_Nucleus', 'HLA_Cell_Intensity_Average': 'HLA_Cell', 'HLA_Cytoplasm_Intensity_Average': 'HLA_Cytoplasm', 'HLA_Nucleus_Intensity_Average': 'HLA_Nucleus', 'Ki67_Cell_Intensity_Average': 'Ki67_Cell', 'Ki67_Cytoplasm_Intensity_Average': 'Ki67_Cytoplasm', 'Ki67_Nucleus_Intensity_Average': 'Ki67_Nucleus', 'MMP9_Cell_Intensity_Average': 'MMP9_Cell', 'MMP9_Cytoplasm_Intensity_Average': 'MMP9_Cytoplasm', 'MMP9_Nucleus_Intensity_Average': 'MMP9_Nucleus', 'PD1_Cell_Intensity_Average': 'PD1_Cell', 'PD1_Cytoplasm_Intensity_Average': 'PD1_Cytoplasm', 'PD1_Nucleus_Intensity_Average': 'PD1_Nucleus', 'PDGFR_Cell_Intensity_Average': 'PDGFR_Cell', 'PDGFR_Cytoplasm_Intensity_Average': 'PDGFR_Cytoplasm', 'PDGFR_Nucleus_Intensity_Average': 'PDGFR_Nucleus', 'PDL1_Cell_Intensity_Average': 'PDL1_Cell', 'PDL1_Cytoplasm_Intensity_Average': 'PDL1_Cytoplasm', 'PDL1_Nucleus_Intensity_Average': 'PDL1_Nucleus', 'r5c2_Cell_Intensity_Average': 'r5c2_Cell', 'r5c2_Cytoplasm_Intensity_Average': 'r5c2_Cytoplasm', 'r5c2_Nucleus_Intensity_Average': 'r5c2_Nucleus', 'r7c2_Cell_Intensity_Average': 'r7c2_Cell', 'r7c2_Cytoplasm_Intensity_Average': 'r7c2_Cytoplasm', 'r7c2_Nucleus_Intensity_Average': 'r7c2_Nucleus', 'r8c2_Cell_Intensity_Average': 'r8c2_Cell', 'r8c2_Cytoplasm_Intensity_Average': 'r8c2_Cytoplasm', 'r8c2_Nucleus_Intensity_Average': 'r8c2_Nucleus', 'Sting_Cell_Intensity_Average': 'Sting_Cell', 'Sting_Cytoplasm_Intensity_Average': 'Sting_Cytoplasm', 'Sting_Nucleus_Intensity_Average': 'Sting_Nucleus', 'Vimentin_Cell_Intensity_Average': 'Vimentin_Cell', 'Vimentin_Cytoplasm_Intensity_Average': 'Vimentin_Cytoplasm', 'Vimentin_Nucleus_Intensity_Average': 'Vimentin_Nucleus'}\n"
+ ]
+ }
+ ],
+ "source": [
+ "# FULL_TO_SHORT_COLUMN_NAMES\n",
+ "filename = \"full_to_short_column_names.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \" + filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "full_to_short_names = df.set_index('full_name').T.to_dict('records')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('full_to_short_names =\\n',full_to_short_names)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f5858f81-2f63-44b7-abee-9c00ed6c7aba",
+ "metadata": {},
+ "source": [
+ "### II.3.4. SHORT_TO_FULL_COLUMN_NAMES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "b47edf92-9401-4d16-b532-0156fb493c0c",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/short_to_full_column_names.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "short_to_full_names =\n",
+ " {'AF488_Cell': 'AF488_Cell_Intensity_Average', 'AF488_Cytoplasm': 'AF488_Cytoplasm_Intensity_Average', 'AF488_Nucleus': 'AF488_Nucleus_Intensity_Average', 'AF555_Cell': 'AF555_Cell_Intensity_Average', 'AF555_Cytoplasm': 'AF555_Cytoplasm_Intensity_Average', 'AF555_Nucleus': 'AF555_Nucleus_Intensity_Average', 'AF647_Cell': 'AF647_Cell_Intensity_Average', 'AF647_Cytoplasm': 'AF647_Cytoplasm_Intensity_Average', 'AF647_Nucleus': 'AF647_Nucleus_Intensity_Average', 'AF750_Cell': 'AF750_Cell_Intensity_Average', 'AF750_Cytoplasm': 'AF750_Cytoplasm_Intensity_Average', 'AF750_Nucleus': 'AF750_Nucleus_Intensity_Average', 'aSMA_Cell': 'aSMA_Cell_Intensity_Average', 'aSMA_Cytoplasm': 'aSMA_Cytoplasm_Intensity_Average', 'aSMA_Nucleus': 'aSMA_Nucleus_Intensity_Average', 'AXL_Cell': 'AXL_Cell_Intensity_Average', 'AXL_Cytoplasm': 'AXL_Cytoplasm_Intensity_Average', 'AXL_Nucleus': 'AXL_Nucleus_Intensity_Average', 'B7H4_Cell': 'B7H4_Cell_Intensity_Average', 'B7H4_Cytoplasm': 'B7H4_Cytoplasm_Intensity_Average', 'B7H4_Nucleus': 'B7H4_Nucleus_Intensity_Average', 'CA9_Cell': 'CA9_Cell_Intensity_Average', 'CA9_Cytoplasm': 'CA9_Cytoplasm_Intensity_Average', 'CA9_Nucleus': 'CA9_Nucleus_Intensity_Average', 'CD4_Cell': 'CD4_Cell_Intensity_Average', 'CD4_Cytoplasm': 'CD4_Cytoplasm_Intensity_Average', 'CD4_Nucleus': 'CD4_Nucleus_Intensity_Average', 'CD8_Cell': 'CD8_Cell_Intensity_Average', 'CD8_Cytoplasm': 'CD8_Cytoplasm_Intensity_Average', 'CD8_Nucleus': 'CD8_Nucleus_Intensity_Average', 'CD11b_Cell': 'CD11b_Cell_Intensity_Average', 'CD11b_Cytoplasm': 'CD11b_Cytoplasm_Intensity_Average', 'CD11b_Nucleus': 'CD11b_Nucleus_Intensity_Average', 'CD11c_Cell': 'CD11c_Cell_Intensity_Average', 'CD11c_Cytoplasm': 'CD11c_Cytoplasm_Intensity_Average', 'CD11c_Nucleus': 'CD11c_Nucleus_Intensity_Average', 'CD20_Cell': 'CD20_Cell_Intensity_Average', 'CD20_Cytoplasm': 'CD20_Cytoplasm_Intensity_Average', 'CD20_Nucleus': 'CD20_Nucleus_Intensity_Average', 'CD31_Cell': 'CD31_Cell_Intensity_Average', 'CD31_Cytoplasm': 'CD31_Cytoplasm_Intensity_Average', 'CD31_Nucleus': 'CD31_Nucleus_Intensity_Average', 'CD44_Cell': 'CD44_Cell_Intensity_Average', 'CD44_Cytoplasm': 'CD44_Cytoplasm_Intensity_Average', 'CD44_Nucleus': 'CD44_Nucleus_Intensity_Average', 'CD45_Cell': 'CD45_Cell_Intensity_Average', 'CD45_Cytoplasm': 'CD45_Cytoplasm_Intensity_Average', 'CD45_Nucleus': 'CD45_Nucleus_Intensity_Average', 'CD68_Cell': 'CD68_Cell_Intensity_Average', 'CD68_Cytoplasm': 'CD68_Cytoplasm_Intensity_Average', 'CD68_Nucleus': 'CD68_Nucleus_Intensity_Average', 'CD163_Cell': 'CD163_Cell_Intensity_Average', 'CD163_Cytoplasm': 'CD163_Cytoplasm_Intensity_Average', 'CD163_Nucleus': 'CD163_Nucleus_Intensity_Average', 'CKs_Cell': 'CKs_Cell_Intensity_Average', 'CKs_Cytoplasm': 'CKs_Cytoplasm_Intensity_Average', 'CKs_Nucleus': 'CKs_Nucleus_Intensity_Average', 'ColVI_Cell': 'ColVI_Cell_Intensity_Average', 'ColVI_Cytoplasm': 'ColVI_Cytoplasm_Intensity_Average', 'ColVI_Nucleus': 'ColVI_Nucleus_Intensity_Average', 'Desmin_Cell': 'Desmin_Cell_Intensity_Average', 'Desmin_Cytoplasm': 'Desmin_Cytoplasm_Intensity_Average', 'Desmin_Nucleus': 'Desmin_Nucleus_Intensity_Average', 'Ecad_Cell': 'Ecad_Cell_Intensity_Average', 'Ecad_Cytoplasm': 'Ecad_Cytoplasm_Intensity_Average', 'Ecad_Nucleus': 'Ecad_Nucleus_Intensity_Average', 'Fibronectin_Cell': 'Fibronectin_Cell_Intensity_Average', 'Fibronectin_Cytoplasm': 'Fibronectin_Cytoplasm_Intensity_Average', 'Fibronectin_Nucleus': 'Fibronectin_Nucleus_Intensity_Average', 'FOXP3_Cell': 'FOXP3_Cell_Intensity_Average', 'FOXP3_Cytoplasm': 'FOXP3_Cytoplasm_Intensity_Average', 'FOXP3_Nucleus': 'FOXP3_Nucleus_Intensity_Average', 'GATA3_Cell': 'GATA3_Cell_Intensity_Average', 'GATA3_Cytoplasm': 'GATA3_Cytoplasm_Intensity_Average', 'GATA3_Nucleus': 'GATA3_Nucleus_Intensity_Average', 'HLA_Cell': 'HLA_Cell_Intensity_Average', 'HLA_Cytoplasm': 'HLA_Cytoplasm_Intensity_Average', 'HLA_Nucleus': 'HLA_Nucleus_Intensity_Average', 'Ki67_Cell': 'Ki67_Cell_Intensity_Average', 'Ki67_Cytoplasm': 'Ki67_Cytoplasm_Intensity_Average', 'Ki67_Nucleus': 'Ki67_Nucleus_Intensity_Average', 'MMP9_Cell': 'MMP9_Cell_Intensity_Average', 'MMP9_Cytoplasm': 'MMP9_Cytoplasm_Intensity_Average', 'MMP9_Nucleus': 'MMP9_Nucleus_Intensity_Average', 'PD1_Cell': 'PD1_Cell_Intensity_Average', 'PD1_Cytoplasm': 'PD1_Cytoplasm_Intensity_Average', 'PD1_Nucleus': 'PD1_Nucleus_Intensity_Average', 'PDGFR_Cell': 'PDGFR_Cell_Intensity_Average', 'PDGFR_Cytoplasm': 'PDGFR_Cytoplasm_Intensity_Average', 'PDGFR_Nucleus': 'PDGFR_Nucleus_Intensity_Average', 'PDL1_Cell': 'PDL1_Cell_Intensity_Average', 'PDL1_Cytoplasm': 'PDL1_Cytoplasm_Intensity_Average', 'PDL1_Nucleus': 'PDL1_Nucleus_Intensity_Average', 'r5c2_Cell': 'r5c2_Cell_Intensity_Average', 'r5c2_Cytoplasm': 'r5c2_Cytoplasm_Intensity_Average', 'r5c2_Nucleus': 'r5c2_Nucleus_Intensity_Average', 'r7c2_Cell': 'r7c2_Cell_Intensity_Average', 'r7c2_Cytoplasm': 'r7c2_Cytoplasm_Intensity_Average', 'r7c2_Nucleus': 'r7c2_Nucleus_Intensity_Average', 'r8c2_Cell': 'r8c2_Cell_Intensity_Average', 'r8c2_Cytoplasm': 'r8c2_Cytoplasm_Intensity_Average', 'r8c2_Nucleus': 'r8c2_Nucleus_Intensity_Average', 'Sting_Cell': 'Sting_Cell_Intensity_Average', 'Sting_Cytoplasm': 'Sting_Cytoplasm_Intensity_Average', 'Sting_Nucleus': 'Sting_Nucleus_Intensity_Average', 'Vimentin_Cell': 'Vimentin_Cell_Intensity_Average', 'Vimentin_Cytoplasm': 'Vimentin_Cytoplasm_Intensity_Average', 'Vimentin_Nucleus': 'Vimentin_Nucleus_Intensity_Average'}\n"
+ ]
+ }
+ ],
+ "source": [
+ "# SHORT_TO_FULL_COLUMN_NAMES\n",
+ "filename = \"short_to_full_column_names.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \" + filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ "\n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "short_to_full_names = df.set_index('short_name').T.to_dict('records')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('short_to_full_names =\\n',short_to_full_names)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "450d6f35-64de-47da-a359-7125a677cfd6",
+ "metadata": {},
+ "source": [
+ "### II.3.5. SAMPLES COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "id": "4a72b8c0-bdc2-4d2a-8549-2b24cefba020",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/sample_color_data.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "sample_color_dict =\n",
+ " {'DD3S1.csv': (0.9677975592919913, 0.44127456009157356, 0.5358103155058701), 'DD3S2.csv': (0.5920891529639701, 0.6418467016378244, 0.1935069134991043), 'DD3S3.csv': (0.21044753832183283, 0.6773105080456748, 0.6433941168468681), 'TMA.csv': (0.5019607843137255, 0.5019607843137255, 0.5019607843137255)}\n"
+ ]
+ }
+ ],
+ "source": [
+ "# COLORS INFORMATION\n",
+ "filename = \"sample_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \" + filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "sample_color_dict = df.set_index('Sample_ID').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('sample_color_dict =\\n',sample_color_dict)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f6249335-5aef-4d35-9c80-163d68ae1432",
+ "metadata": {},
+ "source": [
+ "### II.3.6. CHANNELS COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "id": "e460924e-82b4-4542-b297-399cd8fd6e68",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/channel_color_data.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "channel_color_dict =\n",
+ " {'c2': (0.00784313725490196, 0.24313725490196078, 1.0), 'c3': (1.0, 0.48627450980392156, 0.0), 'c4': (0.10196078431372549, 0.788235294117647, 0.2196078431372549), 'c5': (0.9098039215686274, 0.0, 0.043137254901960784)}\n"
+ ]
+ }
+ ],
+ "source": [
+ "# CHANNELS\n",
+ "filename = \"channel_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ "\n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "channel_color_dict = df.set_index('Channel').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('channel_color_dict =\\n',channel_color_dict)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "051455b8-048b-4392-b5b5-9145d03391a8",
+ "metadata": {},
+ "source": [
+ "### II.3.7. ROUNDS COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "id": "636ec133-d4e8-4f61-9893-f369d1538c83",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/round_color_data.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "round_color_dict =\n",
+ " {'R0': (0.28685356234627135, 0.13009829239513535, 0.23110332132624437), 'R1': (0.36541462435986094, 0.2025447048359916, 0.37693310021636883), 'R2': (0.40867533458903105, 0.2940761173840091, 0.5166711878800253), 'R3': (0.42890613750051265, 0.4082290173220481, 0.6335348887063806), 'R4': (0.4444462906865238, 0.5264664993764805, 0.7056321892616532), 'R5': (0.47707206309601013, 0.6427061780374552, 0.7418477948908153), 'R6': (0.5414454866716836, 0.7466759172596551, 0.7572905778378964), 'R7': (0.6414710091647722, 0.8321551072276492, 0.7746773027952071), 'R8': (0.7684256891219349, 0.8992667116749021, 0.8171383269422353)}\n"
+ ]
+ }
+ ],
+ "source": [
+ "# ROUND\n",
+ "filename = \"round_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "round_color_dict = df.set_index('Round').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('round_color_dict =\\n',round_color_dict)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "05ad70c3-4525-4e98-ac85-2398bde990ab",
+ "metadata": {},
+ "source": [
+ "### II.3.8. DATA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "id": "eb2392ef-dd07-44cb-b94e-0a044abd0a47",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The following CSV files were detected:\n",
+ "['DD3S3_qc_eda.csv', 'TMA_qc_eda.csv', 'DD3S1_qc_eda.csv', 'DD3S2_qc_eda.csv']\n"
+ ]
+ }
+ ],
+ "source": [
+ "# DATA\n",
+ "# List files in the directory\n",
+ "# Check if the directory exists\n",
+ "if os.path.exists(input_data_dir):\n",
+ " ls_samples = [sample for sample in os.listdir(input_data_dir) if sample.endswith(\"_qc_eda.csv\")]\n",
+ "\n",
+ " print(\"The following CSV files were detected:\")\n",
+ " print([sample for sample in ls_samples])\n",
+ "else:\n",
+ " print(f\"The directory {input_data_dir} does not exist.\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "id": "99e5b1af-1b1a-432e-8e75-e31e0c70e7c8",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['Nuc_X' 'Sample_ID' 'Nucleus_Roundness' 'Nuc_Y_Inv' 'ROI_index'\n",
+ " 'Cell_Size' 'Nucleus_Size' 'AF488_Cell_Intensity_Average'\n",
+ " 'AF488_Cytoplasm_Intensity_Average' 'AF488_Nucleus_Intensity_Average'\n",
+ " 'AF555_Cell_Intensity_Average' 'AF555_Cytoplasm_Intensity_Average'\n",
+ " 'AF555_Nucleus_Intensity_Average' 'AF647_Cell_Intensity_Average'\n",
+ " 'AF647_Cytoplasm_Intensity_Average' 'AF647_Nucleus_Intensity_Average'\n",
+ " 'AF750_Cell_Intensity_Average' 'AF750_Cytoplasm_Intensity_Average'\n",
+ " 'AF750_Nucleus_Intensity_Average' 'aSMA_Cell_Intensity_Average'\n",
+ " 'aSMA_Cytoplasm_Intensity_Average' 'aSMA_Nucleus_Intensity_Average'\n",
+ " 'AXL_Cell_Intensity_Average' 'AXL_Cytoplasm_Intensity_Average'\n",
+ " 'AXL_Nucleus_Intensity_Average' 'B7H4_Cell_Intensity_Average'\n",
+ " 'B7H4_Cytoplasm_Intensity_Average' 'B7H4_Nucleus_Intensity_Average'\n",
+ " 'CA9_Cell_Intensity_Average' 'CA9_Cytoplasm_Intensity_Average'\n",
+ " 'CA9_Nucleus_Intensity_Average' 'CD4_Cell_Intensity_Average'\n",
+ " 'CD4_Cytoplasm_Intensity_Average' 'CD4_Nucleus_Intensity_Average'\n",
+ " 'CD8_Cell_Intensity_Average' 'CD8_Cytoplasm_Intensity_Average'\n",
+ " 'CD8_Nucleus_Intensity_Average' 'CD11b_Cell_Intensity_Average'\n",
+ " 'CD11b_Cytoplasm_Intensity_Average' 'CD11b_Nucleus_Intensity_Average'\n",
+ " 'CD11c_Cell_Intensity_Average' 'CD11c_Cytoplasm_Intensity_Average'\n",
+ " 'CD11c_Nucleus_Intensity_Average' 'CD20_Cell_Intensity_Average'\n",
+ " 'CD20_Cytoplasm_Intensity_Average' 'CD20_Nucleus_Intensity_Average'\n",
+ " 'CD31_Cell_Intensity_Average' 'CD31_Cytoplasm_Intensity_Average'\n",
+ " 'CD31_Nucleus_Intensity_Average' 'CD44_Cell_Intensity_Average'\n",
+ " 'CD44_Cytoplasm_Intensity_Average' 'CD44_Nucleus_Intensity_Average'\n",
+ " 'CD45_Cell_Intensity_Average' 'CD45_Cytoplasm_Intensity_Average'\n",
+ " 'CD45_Nucleus_Intensity_Average' 'CD68_Cell_Intensity_Average'\n",
+ " 'CD68_Cytoplasm_Intensity_Average' 'CD68_Nucleus_Intensity_Average'\n",
+ " 'CD163_Cell_Intensity_Average' 'CD163_Cytoplasm_Intensity_Average'\n",
+ " 'CD163_Nucleus_Intensity_Average' 'CKs_Cell_Intensity_Average'\n",
+ " 'CKs_Cytoplasm_Intensity_Average' 'CKs_Nucleus_Intensity_Average'\n",
+ " 'ColVI_Cell_Intensity_Average' 'ColVI_Cytoplasm_Intensity_Average'\n",
+ " 'ColVI_Nucleus_Intensity_Average' 'Desmin_Cell_Intensity_Average'\n",
+ " 'Desmin_Cytoplasm_Intensity_Average' 'Desmin_Nucleus_Intensity_Average'\n",
+ " 'Ecad_Cell_Intensity_Average' 'Ecad_Cytoplasm_Intensity_Average'\n",
+ " 'Ecad_Nucleus_Intensity_Average' 'Fibronectin_Cell_Intensity_Average'\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average'\n",
+ " 'Fibronectin_Nucleus_Intensity_Average' 'FOXP3_Cell_Intensity_Average'\n",
+ " 'FOXP3_Cytoplasm_Intensity_Average' 'FOXP3_Nucleus_Intensity_Average'\n",
+ " 'GATA3_Cell_Intensity_Average' 'GATA3_Cytoplasm_Intensity_Average'\n",
+ " 'GATA3_Nucleus_Intensity_Average' 'HLA_Cell_Intensity_Average'\n",
+ " 'HLA_Cytoplasm_Intensity_Average' 'HLA_Nucleus_Intensity_Average'\n",
+ " 'Ki67_Cell_Intensity_Average' 'Ki67_Cytoplasm_Intensity_Average'\n",
+ " 'Ki67_Nucleus_Intensity_Average' 'MMP9_Cell_Intensity_Average'\n",
+ " 'MMP9_Cytoplasm_Intensity_Average' 'MMP9_Nucleus_Intensity_Average'\n",
+ " 'PD1_Cell_Intensity_Average' 'PD1_Cytoplasm_Intensity_Average'\n",
+ " 'PD1_Nucleus_Intensity_Average' 'PDGFR_Cell_Intensity_Average'\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average' 'PDGFR_Nucleus_Intensity_Average'\n",
+ " 'PDL1_Cell_Intensity_Average' 'PDL1_Cytoplasm_Intensity_Average'\n",
+ " 'PDL1_Nucleus_Intensity_Average' 'r5c2_Cell_Intensity_Average'\n",
+ " 'r5c2_Cytoplasm_Intensity_Average' 'r5c2_Nucleus_Intensity_Average'\n",
+ " 'r7c2_Cell_Intensity_Average' 'r7c2_Cytoplasm_Intensity_Average'\n",
+ " 'r7c2_Nucleus_Intensity_Average' 'r8c2_Cell_Intensity_Average'\n",
+ " 'r8c2_Cytoplasm_Intensity_Average' 'r8c2_Nucleus_Intensity_Average'\n",
+ " 'Sting_Cell_Intensity_Average' 'Sting_Cytoplasm_Intensity_Average'\n",
+ " 'Sting_Nucleus_Intensity_Average' 'Vimentin_Cell_Intensity_Average'\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average'\n",
+ " 'Vimentin_Nucleus_Intensity_Average']\n",
+ "DD3S3_qc_eda.csv file is processed !\n",
+ "\n",
+ "TMA_qc_eda.csv file is processed !\n",
+ "\n",
+ "DD3S1_qc_eda.csv file is processed !\n",
+ "\n",
+ "DD3S2_qc_eda.csv file is processed !\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Import all the others files\n",
+ "dfs = {}\n",
+ "\n",
+ "# Set variable to hold default header values\n",
+ "# First gather information on expected headers using first file in ls_samples\n",
+ "# Read in the first row of the file corresponding to the first sample (index = 0) in ls_samples\n",
+ "df = pd.read_csv(os.path.join(input_data_dir, ls_samples[0]) , index_col = 0, nrows = 1)\n",
+ "expected_headers = df.columns.values\n",
+ "print(expected_headers)\n",
+ "\n",
+ "###############################\n",
+ "# !! This may take a while !! #\n",
+ "###############################\n",
+ "for sample in ls_samples:\n",
+ " file_path = os.path.join(input_data_dir,sample)\n",
+ " \n",
+ " try:\n",
+ " # Read the CSV file\n",
+ " df = pd.read_csv(file_path, index_col=0)\n",
+ " # Check if the DataFrame is empty, if so, don't continue trying to process df and remove it\n",
+ " \n",
+ " if not df.empty:\n",
+ " # Reorder the columns to match the expected headers list\n",
+ " df = df.reindex(columns=expected_headers)\n",
+ " print(sample, \"file is processed !\\n\")\n",
+ " #print(df) \n",
+ " \n",
+ " except pd.errors.EmptyDataError:\n",
+ " print(f'\\nEmpty data error in {sample} file. Removing from analysis...')\n",
+ " ls_samples.remove(sample) \n",
+ " \n",
+ " # Add df to dfs \n",
+ " dfs[sample] = df\n",
+ "\n",
+ "#print(dfs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "id": "2e2def98-8ea5-46ee-bad3-10d19feb56db",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Nuc_X Sample_ID Nucleus_Roundness Nuc_Y_Inv \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 823.567871 DD3S3.csv 0.835324 15699.382812 \n",
+ "DD3S3_Cell_1 852.840027 DD3S3.csv 0.523421 15690.533203 \n",
+ "DD3S3_Cell_2 868.272705 DD3S3.csv 0.686147 15682.994141 \n",
+ "DD3S3_Cell_3 842.131592 DD3S3.csv 0.881136 15688.894531 \n",
+ "DD3S3_Cell_4 704.337280 DD3S3.csv 0.757623 15683.059570 \n",
+ "\n",
+ " ROI_index Cell_Size Nucleus_Size \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 0 281 81 \n",
+ "DD3S3_Cell_1 0 200 75 \n",
+ "DD3S3_Cell_2 0 425 165 \n",
+ "DD3S3_Cell_3 0 114 38 \n",
+ "DD3S3_Cell_4 0 418 169 \n",
+ "\n",
+ " AF488_Cell_Intensity_Average AF488_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 1996.348755 1883.150024 \n",
+ "DD3S3_Cell_1 2523.199951 2450.087891 \n",
+ "DD3S3_Cell_2 2864.345947 2765.046143 \n",
+ "DD3S3_Cell_3 2328.473633 2267.855225 \n",
+ "DD3S3_Cell_4 3349.023926 3018.883545 \n",
+ "\n",
+ " AF488_Nucleus_Intensity_Average ... \\\n",
+ "ID ... \n",
+ "DD3S3_Cell_0 2275.851807 ... \n",
+ "DD3S3_Cell_1 2645.053223 ... \n",
+ "DD3S3_Cell_2 3020.818115 ... \n",
+ "DD3S3_Cell_3 2449.710449 ... \n",
+ "DD3S3_Cell_4 3835.443848 ... \n",
+ "\n",
+ " r7c2_Nucleus_Intensity_Average r8c2_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 252.555557 268.523132 \n",
+ "DD3S3_Cell_1 271.226654 310.339996 \n",
+ "DD3S3_Cell_2 333.078796 349.395294 \n",
+ "DD3S3_Cell_3 263.500000 291.289459 \n",
+ "DD3S3_Cell_4 375.662720 384.011963 \n",
+ "\n",
+ " r8c2_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 257.945007 \n",
+ "DD3S3_Cell_1 301.056000 \n",
+ "DD3S3_Cell_2 339.603851 \n",
+ "DD3S3_Cell_3 282.789459 \n",
+ "DD3S3_Cell_4 350.662659 \n",
+ "\n",
+ " r8c2_Nucleus_Intensity_Average Sting_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 294.641968 1358.562256 \n",
+ "DD3S3_Cell_1 325.813324 1856.005005 \n",
+ "DD3S3_Cell_2 364.824249 1969.552979 \n",
+ "DD3S3_Cell_3 308.289459 1319.236816 \n",
+ "DD3S3_Cell_4 433.147919 1398.476074 \n",
+ "\n",
+ " Sting_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 1318.834961 \n",
+ "DD3S3_Cell_1 1954.375977 \n",
+ "DD3S3_Cell_2 2171.303955 \n",
+ "DD3S3_Cell_3 1249.684204 \n",
+ "DD3S3_Cell_4 1301.931763 \n",
+ "\n",
+ " Sting_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 1456.654297 \n",
+ "DD3S3_Cell_1 1692.053345 \n",
+ "DD3S3_Cell_2 1651.642456 \n",
+ "DD3S3_Cell_3 1458.342163 \n",
+ "DD3S3_Cell_4 1540.721924 \n",
+ "\n",
+ " Vimentin_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 2862.252686 \n",
+ "DD3S3_Cell_1 3007.534912 \n",
+ "DD3S3_Cell_2 1955.188232 \n",
+ "DD3S3_Cell_3 3467.263184 \n",
+ "DD3S3_Cell_4 1861.600464 \n",
+ "\n",
+ " Vimentin_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 2464.334961 \n",
+ "DD3S3_Cell_1 3135.496094 \n",
+ "DD3S3_Cell_2 2099.076904 \n",
+ "DD3S3_Cell_3 3773.605225 \n",
+ "DD3S3_Cell_4 1678.666626 \n",
+ "\n",
+ " Vimentin_Nucleus_Intensity_Average \n",
+ "ID \n",
+ "DD3S3_Cell_0 3844.765381 \n",
+ "DD3S3_Cell_1 2794.266602 \n",
+ "DD3S3_Cell_2 1728.454590 \n",
+ "DD3S3_Cell_3 2854.578857 \n",
+ "DD3S3_Cell_4 2131.130127 \n",
+ "\n",
+ "[5 rows x 115 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Merge dfs into one df\n",
+ "df = pd.concat(dfs.values(), ignore_index=False , sort = False)\n",
+ "del dfs\n",
+ "\n",
+ "print(df.head())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "id": "bbe27b0f-c7a0-489a-b845-74c42289f7bf",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(433976, 115)"
+ ]
+ },
+ "execution_count": 48,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "id": "949edaa7-22ec-4544-a250-4705759ca1bd",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False"
+ ]
+ },
+ "execution_count": 49,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Check for NaN entries (should not be any unless columns do not align)\n",
+ "# False means no NaN entries \n",
+ "# True means NaN entries \n",
+ "df.isnull().any().any()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "657ba08b-cb75-437a-9557-97e8acb46dcb",
+ "metadata": {},
+ "source": [
+ "## II.4. *FILTERING"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "id": "db040ebb-6447-4e0a-a904-21e62eb3e1c3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Number of cells before filtering : 433976\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"Number of cells before filtering :\", df.shape[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "id": "d571eb73-5e76-4c16-b7ba-37a55553d454",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#print(df)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "id": "0b66a96e-32e2-4682-ae20-ebd6fc41a9c5",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Number of cells after filtering on nucleus size: 389617\n",
+ "Number of cells after filtering on AF555A ___ intensity: 350554\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Delete small cells and objects w/high AF555 Signal (RBCs) \n",
+ "# We usually use the 95th percentile calculated during QC_EDA\n",
+ "df = df.loc[(df['Nucleus_Size'] > 42 )]\n",
+ "df = df.loc[(df['Nucleus_Size'] < 216)]\n",
+ "print(\"Number of cells after filtering on nucleus size:\", df.shape[0])\n",
+ "\n",
+ "df = df.loc[(df['AF555_Cell_Intensity_Average'] < 2000)]\n",
+ "print(\"Number of cells after filtering on AF555A ___ intensity:\", df.shape[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "id": "3b3ecc8d-66ad-4153-8289-6e4935cf7fa1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Assign cell type\n",
+ "# Assign tumor cells at each row at first (random assigning here just for development purposes)\n",
+ "# Generate random values for cell_type column\n",
+ "random_values = np.random.randint(0, 10, size=len(df))\n",
+ "\n",
+ "# Assign cell type based on random values\n",
+ "def assign_cell_type(n):\n",
+ " return 'none'\n",
+ "\n",
+ "df['cell_type'] = np.vectorize(assign_cell_type)(random_values)\n",
+ "df['cell_subtype'] = df['cell_type'].copy()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "id": "15dd4c6e-87d3-419e-b824-0a39fce7faa9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Nuc_X \n",
+ " Sample_ID \n",
+ " Nucleus_Roundness \n",
+ " Nuc_Y_Inv \n",
+ " ROI_index \n",
+ " Cell_Size \n",
+ " Nucleus_Size \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " ... \n",
+ " r8c2_Cytoplasm_Intensity_Average \n",
+ " r8c2_Nucleus_Intensity_Average \n",
+ " Sting_Cell_Intensity_Average \n",
+ " Sting_Cytoplasm_Intensity_Average \n",
+ " Sting_Nucleus_Intensity_Average \n",
+ " Vimentin_Cell_Intensity_Average \n",
+ " Vimentin_Cytoplasm_Intensity_Average \n",
+ " Vimentin_Nucleus_Intensity_Average \n",
+ " cell_type \n",
+ " cell_subtype \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_0 \n",
+ " 823.567871 \n",
+ " DD3S3.csv \n",
+ " 0.835324 \n",
+ " 15699.382812 \n",
+ " 0 \n",
+ " 281 \n",
+ " 81 \n",
+ " 1996.348755 \n",
+ " 1883.150024 \n",
+ " 2275.851807 \n",
+ " ... \n",
+ " 257.945007 \n",
+ " 294.641968 \n",
+ " 1358.562256 \n",
+ " 1318.834961 \n",
+ " 1456.654297 \n",
+ " 2862.252686 \n",
+ " 2464.334961 \n",
+ " 3844.765381 \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_1 \n",
+ " 852.840027 \n",
+ " DD3S3.csv \n",
+ " 0.523421 \n",
+ " 15690.533203 \n",
+ " 0 \n",
+ " 200 \n",
+ " 75 \n",
+ " 2523.199951 \n",
+ " 2450.087891 \n",
+ " 2645.053223 \n",
+ " ... \n",
+ " 301.056000 \n",
+ " 325.813324 \n",
+ " 1856.005005 \n",
+ " 1954.375977 \n",
+ " 1692.053345 \n",
+ " 3007.534912 \n",
+ " 3135.496094 \n",
+ " 2794.266602 \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_2 \n",
+ " 868.272705 \n",
+ " DD3S3.csv \n",
+ " 0.686147 \n",
+ " 15682.994141 \n",
+ " 0 \n",
+ " 425 \n",
+ " 165 \n",
+ " 2864.345947 \n",
+ " 2765.046143 \n",
+ " 3020.818115 \n",
+ " ... \n",
+ " 339.603851 \n",
+ " 364.824249 \n",
+ " 1969.552979 \n",
+ " 2171.303955 \n",
+ " 1651.642456 \n",
+ " 1955.188232 \n",
+ " 2099.076904 \n",
+ " 1728.454590 \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_4 \n",
+ " 704.337280 \n",
+ " DD3S3.csv \n",
+ " 0.757623 \n",
+ " 15683.059570 \n",
+ " 0 \n",
+ " 418 \n",
+ " 169 \n",
+ " 3349.023926 \n",
+ " 3018.883545 \n",
+ " 3835.443848 \n",
+ " ... \n",
+ " 350.662659 \n",
+ " 433.147919 \n",
+ " 1398.476074 \n",
+ " 1301.931763 \n",
+ " 1540.721924 \n",
+ " 1861.600464 \n",
+ " 1678.666626 \n",
+ " 2131.130127 \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_5 \n",
+ " 852.893799 \n",
+ " DD3S3.csv \n",
+ " 0.714651 \n",
+ " 15683.017578 \n",
+ " 0 \n",
+ " 201 \n",
+ " 113 \n",
+ " 2366.134277 \n",
+ " 2088.715820 \n",
+ " 2582.177002 \n",
+ " ... \n",
+ " 276.897736 \n",
+ " 326.592926 \n",
+ " 1328.602051 \n",
+ " 1144.681763 \n",
+ " 1471.831909 \n",
+ " 1457.726318 \n",
+ " 1205.852295 \n",
+ " 1653.876099 \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
5 rows Ć 117 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Nuc_X Sample_ID Nucleus_Roundness Nuc_Y_Inv \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 823.567871 DD3S3.csv 0.835324 15699.382812 \n",
+ "DD3S3_Cell_1 852.840027 DD3S3.csv 0.523421 15690.533203 \n",
+ "DD3S3_Cell_2 868.272705 DD3S3.csv 0.686147 15682.994141 \n",
+ "DD3S3_Cell_4 704.337280 DD3S3.csv 0.757623 15683.059570 \n",
+ "DD3S3_Cell_5 852.893799 DD3S3.csv 0.714651 15683.017578 \n",
+ "\n",
+ " ROI_index Cell_Size Nucleus_Size \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 0 281 81 \n",
+ "DD3S3_Cell_1 0 200 75 \n",
+ "DD3S3_Cell_2 0 425 165 \n",
+ "DD3S3_Cell_4 0 418 169 \n",
+ "DD3S3_Cell_5 0 201 113 \n",
+ "\n",
+ " AF488_Cell_Intensity_Average AF488_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 1996.348755 1883.150024 \n",
+ "DD3S3_Cell_1 2523.199951 2450.087891 \n",
+ "DD3S3_Cell_2 2864.345947 2765.046143 \n",
+ "DD3S3_Cell_4 3349.023926 3018.883545 \n",
+ "DD3S3_Cell_5 2366.134277 2088.715820 \n",
+ "\n",
+ " AF488_Nucleus_Intensity_Average ... \\\n",
+ "ID ... \n",
+ "DD3S3_Cell_0 2275.851807 ... \n",
+ "DD3S3_Cell_1 2645.053223 ... \n",
+ "DD3S3_Cell_2 3020.818115 ... \n",
+ "DD3S3_Cell_4 3835.443848 ... \n",
+ "DD3S3_Cell_5 2582.177002 ... \n",
+ "\n",
+ " r8c2_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 257.945007 \n",
+ "DD3S3_Cell_1 301.056000 \n",
+ "DD3S3_Cell_2 339.603851 \n",
+ "DD3S3_Cell_4 350.662659 \n",
+ "DD3S3_Cell_5 276.897736 \n",
+ "\n",
+ " r8c2_Nucleus_Intensity_Average Sting_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 294.641968 1358.562256 \n",
+ "DD3S3_Cell_1 325.813324 1856.005005 \n",
+ "DD3S3_Cell_2 364.824249 1969.552979 \n",
+ "DD3S3_Cell_4 433.147919 1398.476074 \n",
+ "DD3S3_Cell_5 326.592926 1328.602051 \n",
+ "\n",
+ " Sting_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 1318.834961 \n",
+ "DD3S3_Cell_1 1954.375977 \n",
+ "DD3S3_Cell_2 2171.303955 \n",
+ "DD3S3_Cell_4 1301.931763 \n",
+ "DD3S3_Cell_5 1144.681763 \n",
+ "\n",
+ " Sting_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 1456.654297 \n",
+ "DD3S3_Cell_1 1692.053345 \n",
+ "DD3S3_Cell_2 1651.642456 \n",
+ "DD3S3_Cell_4 1540.721924 \n",
+ "DD3S3_Cell_5 1471.831909 \n",
+ "\n",
+ " Vimentin_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 2862.252686 \n",
+ "DD3S3_Cell_1 3007.534912 \n",
+ "DD3S3_Cell_2 1955.188232 \n",
+ "DD3S3_Cell_4 1861.600464 \n",
+ "DD3S3_Cell_5 1457.726318 \n",
+ "\n",
+ " Vimentin_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 2464.334961 \n",
+ "DD3S3_Cell_1 3135.496094 \n",
+ "DD3S3_Cell_2 2099.076904 \n",
+ "DD3S3_Cell_4 1678.666626 \n",
+ "DD3S3_Cell_5 1205.852295 \n",
+ "\n",
+ " Vimentin_Nucleus_Intensity_Average cell_type cell_subtype \n",
+ "ID \n",
+ "DD3S3_Cell_0 3844.765381 none none \n",
+ "DD3S3_Cell_1 2794.266602 none none \n",
+ "DD3S3_Cell_2 1728.454590 none none \n",
+ "DD3S3_Cell_4 2131.130127 none none \n",
+ "DD3S3_Cell_5 1653.876099 none none \n",
+ "\n",
+ "[5 rows x 117 columns]"
+ ]
+ },
+ "execution_count": 54,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "de4deb80-bdbe-430b-9991-019406d99ae2",
+ "metadata": {},
+ "source": [
+ "## II.5. CELL TYPES COLORS"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "9214d297-2e4b-45eb-b664-43f748c4bd6d",
+ "metadata": {},
+ "source": [
+ "# Establish colors to use throughout workflow\n",
+ "\n",
+ "# we want colors that are categorical, since Cell Type is a non-ordered category. \n",
+ "# A categorical color palette will have dissimilar colors.\n",
+ "# Get those unique colors\n",
+ "cell_types = ['STROMA','CANCER','IMMUNE','ENDOTHELIAL']\n",
+ "color_values = sb.color_palette(\"hls\", n_colors = len(cell_types))\n",
+ "# each color value is a tuple of three values: (R, G, B)\n",
+ "\n",
+ "print(\"Unique cell types are:\",df.cell_type.unique())\n",
+ "# Display those unique colors\n",
+ "sb.palplot(sb.color_palette(color_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "id": "72a0ac93-964a-4541-91e0-5e21c46154f1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUoAAABlCAYAAAArpKpSAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAACpUlEQVR4nO3ZMW4aURiF0R9kGRpAcomg8kq8q0gpXKa0vINsLC48EguAxrhgUkRJqnAHHDQe+5z6FVcP6dPMMGrbti0A/mnc9wCA904oAQKhBAiEEiAQSoBAKAECoQQIrrocOhwOtdlsajab1Wg0uvQmgItr27Z2u10tl8saj48/M3YK5WazqfV6/V/GAbwnTdPUarU6eqZTKGezWVVVrb+uazz1tt7V3Y+7vicM0uPj974nDM63xZe+JwzOvvb1UA9/+nZMp1D+ft0eT8dCeYLr6+u+JwzSfN73guGZ1rTvCYPV5XOi6gEEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEQgkQCCVAIJQAgVACBEIJEAglQCCUAIFQAgRCCRAIJUAglACBUAIEV10OtW1bVVWHl8NFx3w0r6+vfU8YpO227wXD81IvfU8YnH3tq+pv344ZtR1OPT091e3t7duXAbwzTdPUarU6eqbTE+XNzU1VVT0/P9disXj7sk9iu93Wer2upmlqPp/3PWcQ3Nl53Nvp2rat3W5Xy+Uynu0UyvH416fMxWLhRzjDfD53bydyZ+dxb6fp+uDnzxyAQCgBgk6hnEwmdX9/X5PJ5NJ7PhT3djp3dh73dlmd/vUG+My8egMEQgkQCCVAIJQAgVACBEIJEAglQCCUAMFPFNNia56tTbkAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Define your custom colors for each cell type\n",
+ "custom_colors = {\n",
+ " 'CANCER': (0.1333, 0.5451, 0.1333),\n",
+ " 'STROMA': (0.4, 0.4, 0.4),\n",
+ " 'IMMUNE': (1, 1, 0),\n",
+ " 'ENDOTHELIAL': (0.502, 0, 0.502)\n",
+ "}\n",
+ "\n",
+ "# Retrieve the list of cell types\n",
+ "cell_types = list(custom_colors.keys())\n",
+ "\n",
+ "# Extract the corresponding colors from the dictionary\n",
+ "color_values = [custom_colors[cell] for cell in cell_types]\n",
+ "\n",
+ "# Display the colors\n",
+ "sb.palplot(sb.color_palette(color_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "id": "704674b9-be53-414b-a03a-4ad1465cfb23",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'CANCER': (0.1333, 0.5451, 0.1333),\n",
+ " 'STROMA': (0.4, 0.4, 0.4),\n",
+ " 'IMMUNE': (1, 1, 0),\n",
+ " 'ENDOTHELIAL': (0.502, 0, 0.502)}"
+ ]
+ },
+ "execution_count": 56,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Store in a dctionnary\n",
+ "celltype_color_dict = dict(zip(cell_types, color_values))\n",
+ "celltype_color_dict"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "id": "eeeb576b-aea8-4c37-ada1-7f324ddde99a",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "File/Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/celltype_color_data.csv was created!\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Save color information (mapping and legend) to metadata directory\n",
+ "# Create dataframe\n",
+ "celltype_color_df = color_dict_to_df(celltype_color_dict, \"cell_type\")\n",
+ "celltype_color_df.head()\n",
+ "\n",
+ "# Save to file in metadatadirectory\n",
+ "filename = \"celltype_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "celltype_color_df.to_csv(filename, index = False)\n",
+ "print(\"File\" + filename + \" was created!\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "id": "e5ba634f-bbc8-4662-9c8b-48bf3c649cc8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Legend of cell type info only\n",
+ "g = plt.figure(figsize = (1,1)).add_subplot(111)\n",
+ "g.axis('off')\n",
+ "handles = []\n",
+ "for item in celltype_color_dict.keys():\n",
+ " h = g.bar(0,0, color = celltype_color_dict[item],\n",
+ " label = item, linewidth =0)\n",
+ " handles.append(h)\n",
+ "first_legend = plt.legend(handles=handles, loc='upper right', title = 'Cell type'),\n",
+ "\n",
+ "\n",
+ "filename = \"Celltype_legend.png\"\n",
+ "filename = os.path.join(metadata_images_dir, filename)\n",
+ "plt.savefig(filename, bbox_inches = 'tight')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "id": "4b3305bb-688b-4540-bcf8-32c7c0ff69fe",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Round \n",
+ " Target \n",
+ " Exp \n",
+ " Channel \n",
+ " target_lower \n",
+ " full_column \n",
+ " marker \n",
+ " localisation \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488 \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488 \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " AF488 \n",
+ " nucleus \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " AF555 \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " AF555 \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " R8 \n",
+ " Sting \n",
+ " 1000 \n",
+ " c4 \n",
+ " sting \n",
+ " Sting_Cytoplasm_Intensity_Average \n",
+ " Sting \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " 104 \n",
+ " R8 \n",
+ " Sting \n",
+ " 1000 \n",
+ " c4 \n",
+ " sting \n",
+ " Sting_Nucleus_Intensity_Average \n",
+ " Sting \n",
+ " nucleus \n",
+ " \n",
+ " \n",
+ " 105 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Cell_Intensity_Average \n",
+ " CD11b \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 106 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Cytoplasm_Intensity_Average \n",
+ " CD11b \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " 107 \n",
+ " R8 \n",
+ " CD11b \n",
+ " 1500 \n",
+ " c5 \n",
+ " cd11b \n",
+ " CD11b_Nucleus_Intensity_Average \n",
+ " CD11b \n",
+ " nucleus \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
108 rows Ć 8 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Round Target Exp Channel target_lower \\\n",
+ "0 R0 AF488 300 c2 af488 \n",
+ "1 R0 AF488 300 c2 af488 \n",
+ "2 R0 AF488 300 c2 af488 \n",
+ "3 R0 AF555 1500 c3 af555 \n",
+ "4 R0 AF555 1500 c3 af555 \n",
+ ".. ... ... ... ... ... \n",
+ "103 R8 Sting 1000 c4 sting \n",
+ "104 R8 Sting 1000 c4 sting \n",
+ "105 R8 CD11b 1500 c5 cd11b \n",
+ "106 R8 CD11b 1500 c5 cd11b \n",
+ "107 R8 CD11b 1500 c5 cd11b \n",
+ "\n",
+ " full_column marker localisation \n",
+ "0 AF488_Cell_Intensity_Average AF488 cell \n",
+ "1 AF488_Cytoplasm_Intensity_Average AF488 cytoplasm \n",
+ "2 AF488_Nucleus_Intensity_Average AF488 nucleus \n",
+ "3 AF555_Cell_Intensity_Average AF555 cell \n",
+ "4 AF555_Cytoplasm_Intensity_Average AF555 cytoplasm \n",
+ ".. ... ... ... \n",
+ "103 Sting_Cytoplasm_Intensity_Average Sting cytoplasm \n",
+ "104 Sting_Nucleus_Intensity_Average Sting nucleus \n",
+ "105 CD11b_Cell_Intensity_Average CD11b cell \n",
+ "106 CD11b_Cytoplasm_Intensity_Average CD11b cytoplasm \n",
+ "107 CD11b_Nucleus_Intensity_Average CD11b nucleus \n",
+ "\n",
+ "[108 rows x 8 columns]"
+ ]
+ },
+ "execution_count": 59,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "metadata"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "id": "a54e644d-00a8-409a-9f62-12e6cd30e669",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['Nuc_X', 'Sample_ID', 'Nucleus_Roundness', 'Nuc_Y_Inv',\n",
+ " 'ROI_index', 'Cell_Size', 'Nucleus_Size',\n",
+ " 'AF488_Cell_Intensity_Average',\n",
+ " 'AF488_Cytoplasm_Intensity_Average',\n",
+ " 'AF488_Nucleus_Intensity_Average', 'AF555_Cell_Intensity_Average',\n",
+ " 'AF555_Cytoplasm_Intensity_Average',\n",
+ " 'AF555_Nucleus_Intensity_Average', 'AF647_Cell_Intensity_Average',\n",
+ " 'AF647_Cytoplasm_Intensity_Average',\n",
+ " 'AF647_Nucleus_Intensity_Average', 'AF750_Cell_Intensity_Average',\n",
+ " 'AF750_Cytoplasm_Intensity_Average',\n",
+ " 'AF750_Nucleus_Intensity_Average', 'aSMA_Cell_Intensity_Average',\n",
+ " 'aSMA_Cytoplasm_Intensity_Average',\n",
+ " 'aSMA_Nucleus_Intensity_Average', 'AXL_Cell_Intensity_Average',\n",
+ " 'AXL_Cytoplasm_Intensity_Average', 'AXL_Nucleus_Intensity_Average',\n",
+ " 'B7H4_Cell_Intensity_Average', 'B7H4_Cytoplasm_Intensity_Average',\n",
+ " 'B7H4_Nucleus_Intensity_Average', 'CA9_Cell_Intensity_Average',\n",
+ " 'CA9_Cytoplasm_Intensity_Average', 'CA9_Nucleus_Intensity_Average',\n",
+ " 'CD4_Cell_Intensity_Average', 'CD4_Cytoplasm_Intensity_Average',\n",
+ " 'CD4_Nucleus_Intensity_Average', 'CD8_Cell_Intensity_Average',\n",
+ " 'CD8_Cytoplasm_Intensity_Average', 'CD8_Nucleus_Intensity_Average',\n",
+ " 'CD11b_Cell_Intensity_Average',\n",
+ " 'CD11b_Cytoplasm_Intensity_Average',\n",
+ " 'CD11b_Nucleus_Intensity_Average', 'CD11c_Cell_Intensity_Average',\n",
+ " 'CD11c_Cytoplasm_Intensity_Average',\n",
+ " 'CD11c_Nucleus_Intensity_Average', 'CD20_Cell_Intensity_Average',\n",
+ " 'CD20_Cytoplasm_Intensity_Average',\n",
+ " 'CD20_Nucleus_Intensity_Average', 'CD31_Cell_Intensity_Average',\n",
+ " 'CD31_Cytoplasm_Intensity_Average',\n",
+ " 'CD31_Nucleus_Intensity_Average', 'CD44_Cell_Intensity_Average',\n",
+ " 'CD44_Cytoplasm_Intensity_Average',\n",
+ " 'CD44_Nucleus_Intensity_Average', 'CD45_Cell_Intensity_Average',\n",
+ " 'CD45_Cytoplasm_Intensity_Average',\n",
+ " 'CD45_Nucleus_Intensity_Average', 'CD68_Cell_Intensity_Average',\n",
+ " 'CD68_Cytoplasm_Intensity_Average',\n",
+ " 'CD68_Nucleus_Intensity_Average', 'CD163_Cell_Intensity_Average',\n",
+ " 'CD163_Cytoplasm_Intensity_Average',\n",
+ " 'CD163_Nucleus_Intensity_Average', 'CKs_Cell_Intensity_Average',\n",
+ " 'CKs_Cytoplasm_Intensity_Average', 'CKs_Nucleus_Intensity_Average',\n",
+ " 'ColVI_Cell_Intensity_Average',\n",
+ " 'ColVI_Cytoplasm_Intensity_Average',\n",
+ " 'ColVI_Nucleus_Intensity_Average', 'Desmin_Cell_Intensity_Average',\n",
+ " 'Desmin_Cytoplasm_Intensity_Average',\n",
+ " 'Desmin_Nucleus_Intensity_Average', 'Ecad_Cell_Intensity_Average',\n",
+ " 'Ecad_Cytoplasm_Intensity_Average',\n",
+ " 'Ecad_Nucleus_Intensity_Average',\n",
+ " 'Fibronectin_Cell_Intensity_Average',\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average',\n",
+ " 'Fibronectin_Nucleus_Intensity_Average',\n",
+ " 'FOXP3_Cell_Intensity_Average',\n",
+ " 'FOXP3_Cytoplasm_Intensity_Average',\n",
+ " 'FOXP3_Nucleus_Intensity_Average', 'GATA3_Cell_Intensity_Average',\n",
+ " 'GATA3_Cytoplasm_Intensity_Average',\n",
+ " 'GATA3_Nucleus_Intensity_Average', 'HLA_Cell_Intensity_Average',\n",
+ " 'HLA_Cytoplasm_Intensity_Average', 'HLA_Nucleus_Intensity_Average',\n",
+ " 'Ki67_Cell_Intensity_Average', 'Ki67_Cytoplasm_Intensity_Average',\n",
+ " 'Ki67_Nucleus_Intensity_Average', 'MMP9_Cell_Intensity_Average',\n",
+ " 'MMP9_Cytoplasm_Intensity_Average',\n",
+ " 'MMP9_Nucleus_Intensity_Average', 'PD1_Cell_Intensity_Average',\n",
+ " 'PD1_Cytoplasm_Intensity_Average', 'PD1_Nucleus_Intensity_Average',\n",
+ " 'PDGFR_Cell_Intensity_Average',\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average',\n",
+ " 'PDGFR_Nucleus_Intensity_Average', 'PDL1_Cell_Intensity_Average',\n",
+ " 'PDL1_Cytoplasm_Intensity_Average',\n",
+ " 'PDL1_Nucleus_Intensity_Average', 'r5c2_Cell_Intensity_Average',\n",
+ " 'r5c2_Cytoplasm_Intensity_Average',\n",
+ " 'r5c2_Nucleus_Intensity_Average', 'r7c2_Cell_Intensity_Average',\n",
+ " 'r7c2_Cytoplasm_Intensity_Average',\n",
+ " 'r7c2_Nucleus_Intensity_Average', 'r8c2_Cell_Intensity_Average',\n",
+ " 'r8c2_Cytoplasm_Intensity_Average',\n",
+ " 'r8c2_Nucleus_Intensity_Average', 'Sting_Cell_Intensity_Average',\n",
+ " 'Sting_Cytoplasm_Intensity_Average',\n",
+ " 'Sting_Nucleus_Intensity_Average',\n",
+ " 'Vimentin_Cell_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'Vimentin_Nucleus_Intensity_Average', 'cell_type', 'cell_subtype'],\n",
+ " dtype=object)"
+ ]
+ },
+ "execution_count": 60,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.columns.values"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "id": "23fc3f34-ae00-4e5b-9003-bbdb69442dc6",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(350554, 117)"
+ ]
+ },
+ "execution_count": 61,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.shape\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "id": "f0434951-c5b4-4bc3-bbb8-329ed86603bb",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(108, 8)"
+ ]
+ },
+ "execution_count": 62,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "metadata.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "id": "8fdee906-95a9-4e44-8990-5ee8ab25458a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Divide each marker (and its localisation) by the right exposure setting for each group of samples\n",
+ "df.loc[:, ~df.columns.isin(not_intensities)] = \\\n",
+ " df.loc[:, ~df.columns.isin(not_intensities)].apply(lambda column: divide_exp_time(column, 'Exp', metadata), axis = 0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "23ac4db9-d5e4-47ca-a8d8-3250ee3a9a03",
+ "metadata": {},
+ "source": [
+ "## II.6. *CELL SUBTYPES COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "id": "8f77d2ca-4282-4ffd-987d-9ab547b59b96",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Unique cell types are: ['none']\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAABlCAYAAAB5uH+EAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAEpElEQVR4nO3cv25bdRzG4V+cgMkf21I2LHvKDXAl3APqwGVETKAihqpCYmCGEbEACxsIqRIbA1OGWLLEarcOTYkPQxUmlJxzQvTjbZ5nPoq+ejPEH9nOTtM0TQEAAIBQg9oHAAAAwF0IWwAAAKIJWwAAAKIJWwAAAKIJWwAAAKIJWwAAAKIJWwAAAKLttXlou92W5XJZRqNR2dnZue+bAAAAeOCapinr9bpMp9MyGNz8nmyrsF0ul2U+n/8nxwEAAEBbi8WizGazG59pFbaj0aiUUsrT75+V/cOju1/2QHz0zW+1T4j06Qe/1z4hzic/f137hEg/Xn5Y+4Q4f3z8uPYJkd798v3aJ8QZ/PRF7RMi/fres9onxPnqyS+1T4j02Q9N7RPifPfo89onxNm8uiqPvj37p0dv0ipsrz9+vH94VA6Obv+hvDYYHtQ+IdLB6J3aJ8TZ3d+tfUKk8e5+7RPibG75GBD/bnw4rH1CnIHJejk68AZEV2/v+VvQx3gsbLs6eMvrtb7afB3WKxQAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACiCVsAAACi7bV5qGmaUkopFy+e3+sxb5rty03tEyJt1n/WPiHO1cVV7RMirS4vap8QZ73d1j4h0urFy9onxBmYrJfnG6/Vurr8y9+CPlarpvYJcTavvF7r6nqz6x69yU7T4qmzs7NycnJy98sAAACgg8ViUWaz2Y3PtHrH9vj4uJRSyvn5eZlMJne/7IFYrVZlPp+XxWJRxuNx7XMi2Kwfu3Vns37s1p3N+rFbdzbrx27d2awfu3XXNE1Zr9dlOp3e+myrsB0MXn8VdzKZ+CX0MB6P7daRzfqxW3c268du3dmsH7t1Z7N+7NadzfqxWzdt31j1z6MAAACIJmwBAACI1ipsh8NhOT09LcPh8L7veaPYrTub9WO37mzWj926s1k/duvOZv3YrTub9WO3+9XqvyIDAADA/5WPIgMAABBN2AIAABBN2AIAABBN2AIAABBN2AIAABBN2AIAABBN2AIAABBN2AIAABDtbxF10D5wSqeJAAAAAElFTkSuQmCC",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Establish colors to use throughout workflow\n",
+ "\n",
+ "# we want colors that are categorical, since Cell Type is a non-ordered category. \n",
+ "# A categorical color palette will have dissimilar colors.\n",
+ "# Get those unique colors\n",
+ "cell_subtypes = ['DC','B', 'TCD4','TCD8','M1','M2','Treg', \\\n",
+ " 'IMMUNE_OTHER', 'CANCER', 'αSMA_myCAF',\\\n",
+ " 'STROMA_OTHER', 'ENDOTHELIAL']\n",
+ "color_values = sb.color_palette(\"Paired\",n_colors = len(cell_subtypes))\n",
+ "# each color value is a tuple of three values: (R, G, B)\n",
+ "\n",
+ "print(\"Unique cell types are:\",df.cell_subtype.unique())\n",
+ "# Display those unique colors\n",
+ "sb.palplot(sb.color_palette(color_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "id": "bf75f91b-2bc2-4d4f-bc94-861c6ccf27da",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'DC': (0.6509803921568628, 0.807843137254902, 0.8901960784313725),\n",
+ " 'B': (0.12156862745098039, 0.47058823529411764, 0.7058823529411765),\n",
+ " 'TCD4': (0.6980392156862745, 0.8745098039215686, 0.5411764705882353),\n",
+ " 'TCD8': (0.2, 0.6274509803921569, 0.17254901960784313),\n",
+ " 'M1': (0.984313725490196, 0.6039215686274509, 0.6),\n",
+ " 'M2': (0.8901960784313725, 0.10196078431372549, 0.10980392156862745),\n",
+ " 'Treg': (0.9921568627450981, 0.7490196078431373, 0.43529411764705883),\n",
+ " 'IMMUNE_OTHER': (1.0, 0.4980392156862745, 0.0),\n",
+ " 'CANCER': (0.792156862745098, 0.6980392156862745, 0.8392156862745098),\n",
+ " 'αSMA_myCAF': (0.41568627450980394, 0.23921568627450981, 0.6039215686274509),\n",
+ " 'STROMA_OTHER': (1.0, 1.0, 0.6),\n",
+ " 'ENDOTHELIAL': (0.6941176470588235, 0.34901960784313724, 0.1568627450980392)}"
+ ]
+ },
+ "execution_count": 65,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Store in a dctionnary\n",
+ "cellsubtype_color_dict = dict(zip(cell_subtypes, color_values))\n",
+ "cellsubtype_color_dict"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "id": "b24374ef-ea1c-4910-a343-364fa7567497",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "File/Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/cellsubtype_color_data.csv was created!\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Save color information (mapping and legend) to metadata directory\n",
+ "# Create dataframe\n",
+ "cellsubtype_color_df = color_dict_to_df(cellsubtype_color_dict, \"cell_subtype\")\n",
+ "cellsubtype_color_df.head()\n",
+ "\n",
+ "# Save to file in metadatadirectory\n",
+ "filename = \"cellsubtype_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "cellsubtype_color_df.to_csv(filename, index = False)\n",
+ "print(\"File\" + filename + \" was created!\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 67,
+ "id": "90df1f96-7934-42d9-948f-69fdbbc284df",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Legend of cell type info only\n",
+ "g = plt.figure(figsize = (1,1)).add_subplot(111)\n",
+ "g.axis('off')\n",
+ "handles = []\n",
+ "for item in cellsubtype_color_dict.keys():\n",
+ " h = g.bar(0,0, color = cellsubtype_color_dict[item],\n",
+ " label = item, linewidth =0)\n",
+ " handles.append(h)\n",
+ "first_legend = plt.legend(handles=handles, loc='upper right', title = 'Cell subtype'),\n",
+ "\n",
+ "\n",
+ "filename = \"Cellsubtype_legend.png\"\n",
+ "filename = os.path.join(metadata_images_dir, filename)\n",
+ "plt.savefig(filename, bbox_inches = 'tight')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3c0e92c5-e026-4868-a5f3-20cee185d893",
+ "metadata": {},
+ "source": [
+ "## II.7. IMMUNE CHECKPOINT COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "id": "e4b41aab-bdd0-41b0-a39e-0fe3e74fe830",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Nuc_X \n",
+ " Sample_ID \n",
+ " Nucleus_Roundness \n",
+ " Nuc_Y_Inv \n",
+ " ROI_index \n",
+ " Cell_Size \n",
+ " Nucleus_Size \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " ... \n",
+ " r8c2_Nucleus_Intensity_Average \n",
+ " Sting_Cell_Intensity_Average \n",
+ " Sting_Cytoplasm_Intensity_Average \n",
+ " Sting_Nucleus_Intensity_Average \n",
+ " Vimentin_Cell_Intensity_Average \n",
+ " Vimentin_Cytoplasm_Intensity_Average \n",
+ " Vimentin_Nucleus_Intensity_Average \n",
+ " cell_type \n",
+ " cell_subtype \n",
+ " immune_checkpoint \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_0 \n",
+ " 823.567871 \n",
+ " DD3S3.csv \n",
+ " 0.835324 \n",
+ " 15699.382812 \n",
+ " 0 \n",
+ " 281 \n",
+ " 81 \n",
+ " 6.654496 \n",
+ " 6.277167 \n",
+ " 7.586173 \n",
+ " ... \n",
+ " 11.785679 \n",
+ " 1.358562 \n",
+ " 1.318835 \n",
+ " 1.456654 \n",
+ " 19.081685 \n",
+ " 16.428900 \n",
+ " 25.631769 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_1 \n",
+ " 852.840027 \n",
+ " DD3S3.csv \n",
+ " 0.523421 \n",
+ " 15690.533203 \n",
+ " 0 \n",
+ " 200 \n",
+ " 75 \n",
+ " 8.410667 \n",
+ " 8.166960 \n",
+ " 8.816844 \n",
+ " ... \n",
+ " 13.032533 \n",
+ " 1.856005 \n",
+ " 1.954376 \n",
+ " 1.692053 \n",
+ " 20.050233 \n",
+ " 20.903307 \n",
+ " 18.628444 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_2 \n",
+ " 868.272705 \n",
+ " DD3S3.csv \n",
+ " 0.686147 \n",
+ " 15682.994141 \n",
+ " 0 \n",
+ " 425 \n",
+ " 165 \n",
+ " 9.547820 \n",
+ " 9.216820 \n",
+ " 10.069394 \n",
+ " ... \n",
+ " 14.592970 \n",
+ " 1.969553 \n",
+ " 2.171304 \n",
+ " 1.651642 \n",
+ " 13.034588 \n",
+ " 13.993846 \n",
+ " 11.523031 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_4 \n",
+ " 704.337280 \n",
+ " DD3S3.csv \n",
+ " 0.757623 \n",
+ " 15683.059570 \n",
+ " 0 \n",
+ " 418 \n",
+ " 169 \n",
+ " 11.163413 \n",
+ " 10.062945 \n",
+ " 12.784813 \n",
+ " ... \n",
+ " 17.325917 \n",
+ " 1.398476 \n",
+ " 1.301932 \n",
+ " 1.540722 \n",
+ " 12.410670 \n",
+ " 11.191111 \n",
+ " 14.207534 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_5 \n",
+ " 852.893799 \n",
+ " DD3S3.csv \n",
+ " 0.714651 \n",
+ " 15683.017578 \n",
+ " 0 \n",
+ " 201 \n",
+ " 113 \n",
+ " 7.887114 \n",
+ " 6.962386 \n",
+ " 8.607257 \n",
+ " ... \n",
+ " 13.063717 \n",
+ " 1.328602 \n",
+ " 1.144682 \n",
+ " 1.471832 \n",
+ " 9.718175 \n",
+ " 8.039015 \n",
+ " 11.025841 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_91241 \n",
+ " 11890.440430 \n",
+ " DD3S2.csv \n",
+ " 0.654341 \n",
+ " 1231.699951 \n",
+ " 45 \n",
+ " 185 \n",
+ " 50 \n",
+ " 11.222882 \n",
+ " 11.690247 \n",
+ " 9.961000 \n",
+ " ... \n",
+ " 13.310400 \n",
+ " 2.154859 \n",
+ " 2.332244 \n",
+ " 1.675920 \n",
+ " 11.001081 \n",
+ " 11.442271 \n",
+ " 9.809867 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_91243 \n",
+ " 11915.123047 \n",
+ " DD3S2.csv \n",
+ " 0.854257 \n",
+ " 1228.222168 \n",
+ " 45 \n",
+ " 203 \n",
+ " 81 \n",
+ " 10.506076 \n",
+ " 10.907295 \n",
+ " 9.901769 \n",
+ " ... \n",
+ " 13.592593 \n",
+ " 2.356256 \n",
+ " 2.432205 \n",
+ " 2.241864 \n",
+ " 10.545419 \n",
+ " 10.825956 \n",
+ " 10.122881 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_91244 \n",
+ " 11961.339844 \n",
+ " DD3S2.csv \n",
+ " 0.651563 \n",
+ " 1230.939941 \n",
+ " 45 \n",
+ " 157 \n",
+ " 50 \n",
+ " 11.337304 \n",
+ " 11.769533 \n",
+ " 10.412333 \n",
+ " ... \n",
+ " 13.680000 \n",
+ " 2.176707 \n",
+ " 2.105561 \n",
+ " 2.328960 \n",
+ " 11.364076 \n",
+ " 11.828598 \n",
+ " 10.370000 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_91245 \n",
+ " 11969.869141 \n",
+ " DD3S2.csv \n",
+ " 0.764502 \n",
+ " 1230.717407 \n",
+ " 45 \n",
+ " 115 \n",
+ " 46 \n",
+ " 10.039797 \n",
+ " 10.513092 \n",
+ " 9.329855 \n",
+ " ... \n",
+ " 12.852174 \n",
+ " 2.346356 \n",
+ " 2.526551 \n",
+ " 2.076065 \n",
+ " 11.523826 \n",
+ " 12.672657 \n",
+ " 9.800579 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_91247 \n",
+ " 11965.208984 \n",
+ " DD3S2.csv \n",
+ " 0.873094 \n",
+ " 1224.179077 \n",
+ " 45 \n",
+ " 146 \n",
+ " 67 \n",
+ " 10.225981 \n",
+ " 10.388186 \n",
+ " 10.034727 \n",
+ " ... \n",
+ " 13.613732 \n",
+ " 2.212938 \n",
+ " 2.229595 \n",
+ " 2.193299 \n",
+ " 16.504383 \n",
+ " 21.886076 \n",
+ " 10.158806 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
350554 rows Ć 118 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Nuc_X Sample_ID Nucleus_Roundness Nuc_Y_Inv \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 823.567871 DD3S3.csv 0.835324 15699.382812 \n",
+ "DD3S3_Cell_1 852.840027 DD3S3.csv 0.523421 15690.533203 \n",
+ "DD3S3_Cell_2 868.272705 DD3S3.csv 0.686147 15682.994141 \n",
+ "DD3S3_Cell_4 704.337280 DD3S3.csv 0.757623 15683.059570 \n",
+ "DD3S3_Cell_5 852.893799 DD3S3.csv 0.714651 15683.017578 \n",
+ "... ... ... ... ... \n",
+ "DD3S2_Cell_91241 11890.440430 DD3S2.csv 0.654341 1231.699951 \n",
+ "DD3S2_Cell_91243 11915.123047 DD3S2.csv 0.854257 1228.222168 \n",
+ "DD3S2_Cell_91244 11961.339844 DD3S2.csv 0.651563 1230.939941 \n",
+ "DD3S2_Cell_91245 11969.869141 DD3S2.csv 0.764502 1230.717407 \n",
+ "DD3S2_Cell_91247 11965.208984 DD3S2.csv 0.873094 1224.179077 \n",
+ "\n",
+ " ROI_index Cell_Size Nucleus_Size \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 0 281 81 \n",
+ "DD3S3_Cell_1 0 200 75 \n",
+ "DD3S3_Cell_2 0 425 165 \n",
+ "DD3S3_Cell_4 0 418 169 \n",
+ "DD3S3_Cell_5 0 201 113 \n",
+ "... ... ... ... \n",
+ "DD3S2_Cell_91241 45 185 50 \n",
+ "DD3S2_Cell_91243 45 203 81 \n",
+ "DD3S2_Cell_91244 45 157 50 \n",
+ "DD3S2_Cell_91245 45 115 46 \n",
+ "DD3S2_Cell_91247 45 146 67 \n",
+ "\n",
+ " AF488_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 6.654496 \n",
+ "DD3S3_Cell_1 8.410667 \n",
+ "DD3S3_Cell_2 9.547820 \n",
+ "DD3S3_Cell_4 11.163413 \n",
+ "DD3S3_Cell_5 7.887114 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 11.222882 \n",
+ "DD3S2_Cell_91243 10.506076 \n",
+ "DD3S2_Cell_91244 11.337304 \n",
+ "DD3S2_Cell_91245 10.039797 \n",
+ "DD3S2_Cell_91247 10.225981 \n",
+ "\n",
+ " AF488_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 6.277167 \n",
+ "DD3S3_Cell_1 8.166960 \n",
+ "DD3S3_Cell_2 9.216820 \n",
+ "DD3S3_Cell_4 10.062945 \n",
+ "DD3S3_Cell_5 6.962386 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 11.690247 \n",
+ "DD3S2_Cell_91243 10.907295 \n",
+ "DD3S2_Cell_91244 11.769533 \n",
+ "DD3S2_Cell_91245 10.513092 \n",
+ "DD3S2_Cell_91247 10.388186 \n",
+ "\n",
+ " AF488_Nucleus_Intensity_Average ... \\\n",
+ "ID ... \n",
+ "DD3S3_Cell_0 7.586173 ... \n",
+ "DD3S3_Cell_1 8.816844 ... \n",
+ "DD3S3_Cell_2 10.069394 ... \n",
+ "DD3S3_Cell_4 12.784813 ... \n",
+ "DD3S3_Cell_5 8.607257 ... \n",
+ "... ... ... \n",
+ "DD3S2_Cell_91241 9.961000 ... \n",
+ "DD3S2_Cell_91243 9.901769 ... \n",
+ "DD3S2_Cell_91244 10.412333 ... \n",
+ "DD3S2_Cell_91245 9.329855 ... \n",
+ "DD3S2_Cell_91247 10.034727 ... \n",
+ "\n",
+ " r8c2_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 11.785679 \n",
+ "DD3S3_Cell_1 13.032533 \n",
+ "DD3S3_Cell_2 14.592970 \n",
+ "DD3S3_Cell_4 17.325917 \n",
+ "DD3S3_Cell_5 13.063717 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 13.310400 \n",
+ "DD3S2_Cell_91243 13.592593 \n",
+ "DD3S2_Cell_91244 13.680000 \n",
+ "DD3S2_Cell_91245 12.852174 \n",
+ "DD3S2_Cell_91247 13.613732 \n",
+ "\n",
+ " Sting_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 1.358562 \n",
+ "DD3S3_Cell_1 1.856005 \n",
+ "DD3S3_Cell_2 1.969553 \n",
+ "DD3S3_Cell_4 1.398476 \n",
+ "DD3S3_Cell_5 1.328602 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 2.154859 \n",
+ "DD3S2_Cell_91243 2.356256 \n",
+ "DD3S2_Cell_91244 2.176707 \n",
+ "DD3S2_Cell_91245 2.346356 \n",
+ "DD3S2_Cell_91247 2.212938 \n",
+ "\n",
+ " Sting_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 1.318835 \n",
+ "DD3S3_Cell_1 1.954376 \n",
+ "DD3S3_Cell_2 2.171304 \n",
+ "DD3S3_Cell_4 1.301932 \n",
+ "DD3S3_Cell_5 1.144682 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 2.332244 \n",
+ "DD3S2_Cell_91243 2.432205 \n",
+ "DD3S2_Cell_91244 2.105561 \n",
+ "DD3S2_Cell_91245 2.526551 \n",
+ "DD3S2_Cell_91247 2.229595 \n",
+ "\n",
+ " Sting_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 1.456654 \n",
+ "DD3S3_Cell_1 1.692053 \n",
+ "DD3S3_Cell_2 1.651642 \n",
+ "DD3S3_Cell_4 1.540722 \n",
+ "DD3S3_Cell_5 1.471832 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 1.675920 \n",
+ "DD3S2_Cell_91243 2.241864 \n",
+ "DD3S2_Cell_91244 2.328960 \n",
+ "DD3S2_Cell_91245 2.076065 \n",
+ "DD3S2_Cell_91247 2.193299 \n",
+ "\n",
+ " Vimentin_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 19.081685 \n",
+ "DD3S3_Cell_1 20.050233 \n",
+ "DD3S3_Cell_2 13.034588 \n",
+ "DD3S3_Cell_4 12.410670 \n",
+ "DD3S3_Cell_5 9.718175 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 11.001081 \n",
+ "DD3S2_Cell_91243 10.545419 \n",
+ "DD3S2_Cell_91244 11.364076 \n",
+ "DD3S2_Cell_91245 11.523826 \n",
+ "DD3S2_Cell_91247 16.504383 \n",
+ "\n",
+ " Vimentin_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 16.428900 \n",
+ "DD3S3_Cell_1 20.903307 \n",
+ "DD3S3_Cell_2 13.993846 \n",
+ "DD3S3_Cell_4 11.191111 \n",
+ "DD3S3_Cell_5 8.039015 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 11.442271 \n",
+ "DD3S2_Cell_91243 10.825956 \n",
+ "DD3S2_Cell_91244 11.828598 \n",
+ "DD3S2_Cell_91245 12.672657 \n",
+ "DD3S2_Cell_91247 21.886076 \n",
+ "\n",
+ " Vimentin_Nucleus_Intensity_Average cell_type cell_subtype \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 25.631769 none none \n",
+ "DD3S3_Cell_1 18.628444 none none \n",
+ "DD3S3_Cell_2 11.523031 none none \n",
+ "DD3S3_Cell_4 14.207534 none none \n",
+ "DD3S3_Cell_5 11.025841 none none \n",
+ "... ... ... ... \n",
+ "DD3S2_Cell_91241 9.809867 none none \n",
+ "DD3S2_Cell_91243 10.122881 none none \n",
+ "DD3S2_Cell_91244 10.370000 none none \n",
+ "DD3S2_Cell_91245 9.800579 none none \n",
+ "DD3S2_Cell_91247 10.158806 none none \n",
+ "\n",
+ " immune_checkpoint \n",
+ "ID \n",
+ "DD3S3_Cell_0 none \n",
+ "DD3S3_Cell_1 none \n",
+ "DD3S3_Cell_2 none \n",
+ "DD3S3_Cell_4 none \n",
+ "DD3S3_Cell_5 none \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 none \n",
+ "DD3S2_Cell_91243 none \n",
+ "DD3S2_Cell_91244 none \n",
+ "DD3S2_Cell_91245 none \n",
+ "DD3S2_Cell_91247 none \n",
+ "\n",
+ "[350554 rows x 118 columns]"
+ ]
+ },
+ "execution_count": 68,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Assign IMMUNE SUBTYPES\n",
+ "df['cell_subtype'] = df['cell_type'].copy()\n",
+ "df['immune_checkpoint'] = 'none'\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "984f9fe2-41d1-4c00-be20-e2d6ca9d2394",
+ "metadata": {},
+ "source": [
+ "immune_checkpoint = ['B7H4', 'PDL1', 'PD1', 'None']\n",
+ "color_values = sb.color_palette(\"husl\",n_colors=len(immune_checkpoint))\n",
+ "# each color value is a tuple of three values: (R, G, B)\n",
+ "\n",
+ "print(\"Unique immune checkpoint are:\",df.immune_checkpoint.unique())\n",
+ "# Display those unique colors\n",
+ "sb.palplot(sb.color_palette(color_values))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 69,
+ "id": "3b593828-a016-4d52-b722-9908aac4e2d1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Unique immune checkpoint combinations are: ['B7H4', 'PDL1', 'PD1', 'B7H4_PDL1', 'None']\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZcAAABlCAYAAACBS66rAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAADBUlEQVR4nO3aPW4TYRSG0WsT4oBkW0pp2VV6dsBmYBEgUaShZydIrAcpRUZyB0WMwPwkQ4GgwjC23miYcE47U1xdW348/jxq27YtAAga9z0AAHePuAAQJy4AxIkLAHHiAkCcuAAQJy4AxB11uenm5qbW63VNp9MajUa3PRMA/6i2bWuz2dRisajxePfzSae4rNfrWq1WseEAGLamaWq5XO683iku0+m0qqrePn1e0+OTzGT/gSePX/c9wiC9+/Cm7xEG6en7Z32PMDgX9x/1PcLgfN5u69WLl7+6sEunuPz8KWx6fFKzibh0df/hvb5HGKSj6z+/afm9ByfHfY8wOCe+LB/sb0ckDvQBiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiBMXAOLEBYA4cQEgTlwAiDvqclPbtlVVtfmyvdVh7pqvH6/7HmGQvn3a9D3CIH3aful7hMHZXvtM29fn7Y+d/ezCLqP2b3dU1cXFRZ2dnWUmA2Dwmqap5XK583qnJ5fT09Oqqrq8vKz5fJ6Z7D9wdXVVq9Wqmqap2WzW9ziDYGeHsbf92dlh2ratzWZTi8Xij/d1ist4/ONoZj6fexEOMJvN7G1PdnYYe9ufne2vy0OGA30A4sQFgLhOcZlMJnV+fl6TyeS257lT7G1/dnYYe9ufnd2uTv8WA4B9+FkMgDhxASBOXACIExcA4sQFgDhxASBOXACIExcA4r4DOnx2ZebrFYYAAAAASUVORK5CYII=",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "immune_checkpoint = ['B7H4', 'PDL1', 'PD1', 'B7H4_PDL1', 'None']\n",
+ "\n",
+ "# Base colors for the primary checkpoints\n",
+ "base_colors = sb.color_palette(\"husl\", n_colors=3) # Three distinct colors\n",
+ "\n",
+ "# Function to mix two RGB colors\n",
+ "def mix_colors(color1, color2):\n",
+ " return tuple((c1 + c2) / 2 for c1, c2 in zip(color1, color2))\n",
+ "\n",
+ "# Generate mixed colors for the combinations of checkpoints\n",
+ "mixed_colors = [\n",
+ " mix_colors(base_colors[0], base_colors[1]), # Mix B7H4 and PDL1\n",
+ "# mix_colors(base_colors[0], base_colors[2]), # Mix B7H4 and PD1\n",
+ "# mix_colors(base_colors[1], base_colors[2]), # Mix PDL1 and PD1\n",
+ " tuple(np.mean(base_colors, axis=0)) # Mix B7H4, PDL1, and PD1\n",
+ "]\n",
+ "\n",
+ "# Adding the color for 'None'\n",
+ "#none_color = [(0.8, 0.8, 0.8)] # A shade of gray\n",
+ "\n",
+ "# Combine all colors into one list\n",
+ "color_values = base_colors + mixed_colors #+ none_color\n",
+ "\n",
+ "# Display unique immune checkpoint combinations\n",
+ "print(\"Unique immune checkpoint combinations are:\", immune_checkpoint)\n",
+ "# Display the unique colors\n",
+ "sb.palplot(color_values)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 70,
+ "id": "ce2c7c21-f90b-4d06-a93f-418d9aae4304",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'B7H4': (0.9677975592919913, 0.44127456009157356, 0.5358103155058701),\n",
+ " 'PDL1': (0.3126890019504329, 0.6928754610296064, 0.1923704830330379),\n",
+ " 'PD1': (0.23299120924703914, 0.639586552066035, 0.9260706093977744),\n",
+ " 'B7H4_PDL1': (0.6402432806212122, 0.56707501056059, 0.36409039926945397),\n",
+ " 'None': (0.5044925901631545, 0.5912455243957383, 0.5514171359788941)}"
+ ]
+ },
+ "execution_count": 70,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Store in a dctionnary\n",
+ "immunecheckpoint_color_dict = dict(zip(immune_checkpoint, color_values))\n",
+ "immunecheckpoint_color_dict"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 71,
+ "id": "2f38cc65-50f3-463d-be1b-9fc1f8c90aa1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "File /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/immunecheckpoint_color_data.csv was created!\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Save color information (mapping and legend) to metadata directory\n",
+ "# Create dataframe\n",
+ "immunecheckpoint_color_df = color_dict_to_df(immunecheckpoint_color_dict, \"immune_checkpoint\")\n",
+ "immunecheckpoint_color_df.head()\n",
+ "\n",
+ "# Save to file in metadatadirectory\n",
+ "filename = \"immunecheckpoint_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "immunecheckpoint_color_df.to_csv(filename, index = False)\n",
+ "print(\"File \" + filename + \" was created!\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 72,
+ "id": "9e2ae256-bbc3-4e93-93bb-560ffa02fb71",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Legend of cell type info only\n",
+ "g = plt.figure(figsize = (1,1)).add_subplot(111)\n",
+ "g.axis('off')\n",
+ "handles = []\n",
+ "for item in immunecheckpoint_color_dict.keys():\n",
+ " h = g.bar(0,0, color = immunecheckpoint_color_dict[item],\n",
+ " label = item, linewidth =0)\n",
+ " handles.append(h)\n",
+ "first_legend = plt.legend(handles=handles, loc='upper right', title = 'Immune checkpoint'),\n",
+ "\n",
+ "\n",
+ "filename = \"Cellsubtype_legend.png\"\n",
+ "filename = os.path.join(metadata_images_dir, filename)\n",
+ "plt.savefig(filename, bbox_inches = 'tight')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "92332958-9ac4-4415-81b3-b3ae27354da3",
+ "metadata": {},
+ "source": [
+ "## II.7. BACKGROUND SUBSTRACTION"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 73,
+ "id": "30fb1c46-e5f9-4a8e-91eb-010c878a8785",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Do background subtraction\n",
+ "# this uses a df (metadata) outside of \n",
+ "# the scope of the lambda...\n",
+ "# careful that this might break inside of a script...\n",
+ "df.loc[:,~df.columns.isin(not_intensities)] = \\\n",
+ " df.loc[:,~df.columns.isin(not_intensities)].apply(lambda column: do_background_sub(column, df, metadata), axis = 0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 74,
+ "id": "b47e45ac-deed-447b-b630-1ccdaa85d195",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Nuc_X \n",
+ " Sample_ID \n",
+ " Nucleus_Roundness \n",
+ " Nuc_Y_Inv \n",
+ " ROI_index \n",
+ " Cell_Size \n",
+ " Nucleus_Size \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " ... \n",
+ " r8c2_Nucleus_Intensity_Average \n",
+ " Sting_Cell_Intensity_Average \n",
+ " Sting_Cytoplasm_Intensity_Average \n",
+ " Sting_Nucleus_Intensity_Average \n",
+ " Vimentin_Cell_Intensity_Average \n",
+ " Vimentin_Cytoplasm_Intensity_Average \n",
+ " Vimentin_Nucleus_Intensity_Average \n",
+ " cell_type \n",
+ " cell_subtype \n",
+ " immune_checkpoint \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_0 \n",
+ " 823.567871 \n",
+ " DD3S3.csv \n",
+ " 0.835324 \n",
+ " 15699.382812 \n",
+ " 0 \n",
+ " 281 \n",
+ " 81 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 4.199506 \n",
+ " 0.663407 \n",
+ " 0.636738 \n",
+ " 0.729255 \n",
+ " 12.427189 \n",
+ " 10.151733 \n",
+ " 18.045597 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_1 \n",
+ " 852.840027 \n",
+ " DD3S3.csv \n",
+ " 0.523421 \n",
+ " 15690.533203 \n",
+ " 0 \n",
+ " 200 \n",
+ " 75 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 4.215689 \n",
+ " 1.107392 \n",
+ " 1.215437 \n",
+ " 0.927316 \n",
+ " 11.639566 \n",
+ " 12.736348 \n",
+ " 9.811600 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_2 \n",
+ " 868.272705 \n",
+ " DD3S3.csv \n",
+ " 0.686147 \n",
+ " 15682.994141 \n",
+ " 0 \n",
+ " 425 \n",
+ " 165 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 4.523576 \n",
+ " 1.151564 \n",
+ " 1.370796 \n",
+ " 0.806107 \n",
+ " 3.486768 \n",
+ " 4.777026 \n",
+ " 1.453637 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_4 \n",
+ " 704.337280 \n",
+ " DD3S3.csv \n",
+ " 0.757623 \n",
+ " 15683.059570 \n",
+ " 0 \n",
+ " 418 \n",
+ " 169 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 4.541104 \n",
+ " 0.516323 \n",
+ " 0.459996 \n",
+ " 0.599314 \n",
+ " 1.247257 \n",
+ " 1.128166 \n",
+ " 1.422721 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_5 \n",
+ " 852.893799 \n",
+ " DD3S3.csv \n",
+ " 0.714651 \n",
+ " 15683.017578 \n",
+ " 0 \n",
+ " 201 \n",
+ " 113 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 4.456460 \n",
+ " 0.591222 \n",
+ " 0.442303 \n",
+ " 0.707195 \n",
+ " 1.831061 \n",
+ " 1.076629 \n",
+ " 2.418584 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_91241 \n",
+ " 11890.440430 \n",
+ " DD3S2.csv \n",
+ " 0.654341 \n",
+ " 1231.699951 \n",
+ " 45 \n",
+ " 185 \n",
+ " 50 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 3.349400 \n",
+ " 1.266964 \n",
+ " 1.422560 \n",
+ " 0.846853 \n",
+ " -0.221802 \n",
+ " -0.247975 \n",
+ " -0.151134 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_91243 \n",
+ " 11915.123047 \n",
+ " DD3S2.csv \n",
+ " 0.854257 \n",
+ " 1228.222168 \n",
+ " 45 \n",
+ " 203 \n",
+ " 81 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 3.690824 \n",
+ " 1.506736 \n",
+ " 1.552194 \n",
+ " 1.438268 \n",
+ " 0.039343 \n",
+ " -0.081339 \n",
+ " 0.221112 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_91244 \n",
+ " 11961.339844 \n",
+ " DD3S2.csv \n",
+ " 0.651563 \n",
+ " 1230.939941 \n",
+ " 45 \n",
+ " 157 \n",
+ " 50 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 3.267667 \n",
+ " 1.252032 \n",
+ " 1.162981 \n",
+ " 1.442600 \n",
+ " 0.026772 \n",
+ " 0.059065 \n",
+ " -0.042333 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_91245 \n",
+ " 11969.869141 \n",
+ " DD3S2.csv \n",
+ " 0.764502 \n",
+ " 1230.717407 \n",
+ " 45 \n",
+ " 115 \n",
+ " 46 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 3.522319 \n",
+ " 1.508861 \n",
+ " 1.657759 \n",
+ " 1.285514 \n",
+ " 1.484028 \n",
+ " 2.159565 \n",
+ " 0.470724 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_91247 \n",
+ " 11965.208984 \n",
+ " DD3S2.csv \n",
+ " 0.873094 \n",
+ " 1224.179077 \n",
+ " 45 \n",
+ " 146 \n",
+ " 67 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 3.579005 \n",
+ " 1.367290 \n",
+ " 1.387004 \n",
+ " 1.344045 \n",
+ " 6.278402 \n",
+ " 11.497890 \n",
+ " 0.124080 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
350554 rows Ć 118 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Nuc_X Sample_ID Nucleus_Roundness Nuc_Y_Inv \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 823.567871 DD3S3.csv 0.835324 15699.382812 \n",
+ "DD3S3_Cell_1 852.840027 DD3S3.csv 0.523421 15690.533203 \n",
+ "DD3S3_Cell_2 868.272705 DD3S3.csv 0.686147 15682.994141 \n",
+ "DD3S3_Cell_4 704.337280 DD3S3.csv 0.757623 15683.059570 \n",
+ "DD3S3_Cell_5 852.893799 DD3S3.csv 0.714651 15683.017578 \n",
+ "... ... ... ... ... \n",
+ "DD3S2_Cell_91241 11890.440430 DD3S2.csv 0.654341 1231.699951 \n",
+ "DD3S2_Cell_91243 11915.123047 DD3S2.csv 0.854257 1228.222168 \n",
+ "DD3S2_Cell_91244 11961.339844 DD3S2.csv 0.651563 1230.939941 \n",
+ "DD3S2_Cell_91245 11969.869141 DD3S2.csv 0.764502 1230.717407 \n",
+ "DD3S2_Cell_91247 11965.208984 DD3S2.csv 0.873094 1224.179077 \n",
+ "\n",
+ " ROI_index Cell_Size Nucleus_Size \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 0 281 81 \n",
+ "DD3S3_Cell_1 0 200 75 \n",
+ "DD3S3_Cell_2 0 425 165 \n",
+ "DD3S3_Cell_4 0 418 169 \n",
+ "DD3S3_Cell_5 0 201 113 \n",
+ "... ... ... ... \n",
+ "DD3S2_Cell_91241 45 185 50 \n",
+ "DD3S2_Cell_91243 45 203 81 \n",
+ "DD3S2_Cell_91244 45 157 50 \n",
+ "DD3S2_Cell_91245 45 115 46 \n",
+ "DD3S2_Cell_91247 45 146 67 \n",
+ "\n",
+ " AF488_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 0.0 \n",
+ "DD3S3_Cell_1 0.0 \n",
+ "DD3S3_Cell_2 0.0 \n",
+ "DD3S3_Cell_4 0.0 \n",
+ "DD3S3_Cell_5 0.0 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 0.0 \n",
+ "DD3S2_Cell_91243 0.0 \n",
+ "DD3S2_Cell_91244 0.0 \n",
+ "DD3S2_Cell_91245 0.0 \n",
+ "DD3S2_Cell_91247 0.0 \n",
+ "\n",
+ " AF488_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 0.0 \n",
+ "DD3S3_Cell_1 0.0 \n",
+ "DD3S3_Cell_2 0.0 \n",
+ "DD3S3_Cell_4 0.0 \n",
+ "DD3S3_Cell_5 0.0 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 0.0 \n",
+ "DD3S2_Cell_91243 0.0 \n",
+ "DD3S2_Cell_91244 0.0 \n",
+ "DD3S2_Cell_91245 0.0 \n",
+ "DD3S2_Cell_91247 0.0 \n",
+ "\n",
+ " AF488_Nucleus_Intensity_Average ... \\\n",
+ "ID ... \n",
+ "DD3S3_Cell_0 0.0 ... \n",
+ "DD3S3_Cell_1 0.0 ... \n",
+ "DD3S3_Cell_2 0.0 ... \n",
+ "DD3S3_Cell_4 0.0 ... \n",
+ "DD3S3_Cell_5 0.0 ... \n",
+ "... ... ... \n",
+ "DD3S2_Cell_91241 0.0 ... \n",
+ "DD3S2_Cell_91243 0.0 ... \n",
+ "DD3S2_Cell_91244 0.0 ... \n",
+ "DD3S2_Cell_91245 0.0 ... \n",
+ "DD3S2_Cell_91247 0.0 ... \n",
+ "\n",
+ " r8c2_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 4.199506 \n",
+ "DD3S3_Cell_1 4.215689 \n",
+ "DD3S3_Cell_2 4.523576 \n",
+ "DD3S3_Cell_4 4.541104 \n",
+ "DD3S3_Cell_5 4.456460 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 3.349400 \n",
+ "DD3S2_Cell_91243 3.690824 \n",
+ "DD3S2_Cell_91244 3.267667 \n",
+ "DD3S2_Cell_91245 3.522319 \n",
+ "DD3S2_Cell_91247 3.579005 \n",
+ "\n",
+ " Sting_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 0.663407 \n",
+ "DD3S3_Cell_1 1.107392 \n",
+ "DD3S3_Cell_2 1.151564 \n",
+ "DD3S3_Cell_4 0.516323 \n",
+ "DD3S3_Cell_5 0.591222 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 1.266964 \n",
+ "DD3S2_Cell_91243 1.506736 \n",
+ "DD3S2_Cell_91244 1.252032 \n",
+ "DD3S2_Cell_91245 1.508861 \n",
+ "DD3S2_Cell_91247 1.367290 \n",
+ "\n",
+ " Sting_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 0.636738 \n",
+ "DD3S3_Cell_1 1.215437 \n",
+ "DD3S3_Cell_2 1.370796 \n",
+ "DD3S3_Cell_4 0.459996 \n",
+ "DD3S3_Cell_5 0.442303 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 1.422560 \n",
+ "DD3S2_Cell_91243 1.552194 \n",
+ "DD3S2_Cell_91244 1.162981 \n",
+ "DD3S2_Cell_91245 1.657759 \n",
+ "DD3S2_Cell_91247 1.387004 \n",
+ "\n",
+ " Sting_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 0.729255 \n",
+ "DD3S3_Cell_1 0.927316 \n",
+ "DD3S3_Cell_2 0.806107 \n",
+ "DD3S3_Cell_4 0.599314 \n",
+ "DD3S3_Cell_5 0.707195 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 0.846853 \n",
+ "DD3S2_Cell_91243 1.438268 \n",
+ "DD3S2_Cell_91244 1.442600 \n",
+ "DD3S2_Cell_91245 1.285514 \n",
+ "DD3S2_Cell_91247 1.344045 \n",
+ "\n",
+ " Vimentin_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 12.427189 \n",
+ "DD3S3_Cell_1 11.639566 \n",
+ "DD3S3_Cell_2 3.486768 \n",
+ "DD3S3_Cell_4 1.247257 \n",
+ "DD3S3_Cell_5 1.831061 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 -0.221802 \n",
+ "DD3S2_Cell_91243 0.039343 \n",
+ "DD3S2_Cell_91244 0.026772 \n",
+ "DD3S2_Cell_91245 1.484028 \n",
+ "DD3S2_Cell_91247 6.278402 \n",
+ "\n",
+ " Vimentin_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 10.151733 \n",
+ "DD3S3_Cell_1 12.736348 \n",
+ "DD3S3_Cell_2 4.777026 \n",
+ "DD3S3_Cell_4 1.128166 \n",
+ "DD3S3_Cell_5 1.076629 \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 -0.247975 \n",
+ "DD3S2_Cell_91243 -0.081339 \n",
+ "DD3S2_Cell_91244 0.059065 \n",
+ "DD3S2_Cell_91245 2.159565 \n",
+ "DD3S2_Cell_91247 11.497890 \n",
+ "\n",
+ " Vimentin_Nucleus_Intensity_Average cell_type cell_subtype \\\n",
+ "ID \n",
+ "DD3S3_Cell_0 18.045597 none none \n",
+ "DD3S3_Cell_1 9.811600 none none \n",
+ "DD3S3_Cell_2 1.453637 none none \n",
+ "DD3S3_Cell_4 1.422721 none none \n",
+ "DD3S3_Cell_5 2.418584 none none \n",
+ "... ... ... ... \n",
+ "DD3S2_Cell_91241 -0.151134 none none \n",
+ "DD3S2_Cell_91243 0.221112 none none \n",
+ "DD3S2_Cell_91244 -0.042333 none none \n",
+ "DD3S2_Cell_91245 0.470724 none none \n",
+ "DD3S2_Cell_91247 0.124080 none none \n",
+ "\n",
+ " immune_checkpoint \n",
+ "ID \n",
+ "DD3S3_Cell_0 none \n",
+ "DD3S3_Cell_1 none \n",
+ "DD3S3_Cell_2 none \n",
+ "DD3S3_Cell_4 none \n",
+ "DD3S3_Cell_5 none \n",
+ "... ... \n",
+ "DD3S2_Cell_91241 none \n",
+ "DD3S2_Cell_91243 none \n",
+ "DD3S2_Cell_91244 none \n",
+ "DD3S2_Cell_91245 none \n",
+ "DD3S2_Cell_91247 none \n",
+ "\n",
+ "[350554 rows x 118 columns]"
+ ]
+ },
+ "execution_count": 74,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 75,
+ "id": "729f24de-6494-4eae-91d5-d3eb399f1e56",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['Nuc_X' 'Sample_ID' 'Nucleus_Roundness' 'Nuc_Y_Inv' 'ROI_index'\n",
+ " 'Cell_Size' 'Nucleus_Size' 'aSMA_Cell_Intensity_Average'\n",
+ " 'aSMA_Cytoplasm_Intensity_Average' 'aSMA_Nucleus_Intensity_Average'\n",
+ " 'AXL_Cell_Intensity_Average' 'AXL_Cytoplasm_Intensity_Average'\n",
+ " 'AXL_Nucleus_Intensity_Average' 'B7H4_Cell_Intensity_Average'\n",
+ " 'B7H4_Cytoplasm_Intensity_Average' 'B7H4_Nucleus_Intensity_Average'\n",
+ " 'CA9_Cell_Intensity_Average' 'CA9_Cytoplasm_Intensity_Average'\n",
+ " 'CA9_Nucleus_Intensity_Average' 'CD4_Cell_Intensity_Average'\n",
+ " 'CD4_Cytoplasm_Intensity_Average' 'CD4_Nucleus_Intensity_Average'\n",
+ " 'CD8_Cell_Intensity_Average' 'CD8_Cytoplasm_Intensity_Average'\n",
+ " 'CD8_Nucleus_Intensity_Average' 'CD11b_Cell_Intensity_Average'\n",
+ " 'CD11b_Cytoplasm_Intensity_Average' 'CD11b_Nucleus_Intensity_Average'\n",
+ " 'CD11c_Cell_Intensity_Average' 'CD11c_Cytoplasm_Intensity_Average'\n",
+ " 'CD11c_Nucleus_Intensity_Average' 'CD20_Cell_Intensity_Average'\n",
+ " 'CD20_Cytoplasm_Intensity_Average' 'CD20_Nucleus_Intensity_Average'\n",
+ " 'CD31_Cell_Intensity_Average' 'CD31_Cytoplasm_Intensity_Average'\n",
+ " 'CD31_Nucleus_Intensity_Average' 'CD44_Cell_Intensity_Average'\n",
+ " 'CD44_Cytoplasm_Intensity_Average' 'CD44_Nucleus_Intensity_Average'\n",
+ " 'CD45_Cell_Intensity_Average' 'CD45_Cytoplasm_Intensity_Average'\n",
+ " 'CD45_Nucleus_Intensity_Average' 'CD68_Cell_Intensity_Average'\n",
+ " 'CD68_Cytoplasm_Intensity_Average' 'CD68_Nucleus_Intensity_Average'\n",
+ " 'CD163_Cell_Intensity_Average' 'CD163_Cytoplasm_Intensity_Average'\n",
+ " 'CD163_Nucleus_Intensity_Average' 'CKs_Cell_Intensity_Average'\n",
+ " 'CKs_Cytoplasm_Intensity_Average' 'CKs_Nucleus_Intensity_Average'\n",
+ " 'ColVI_Cell_Intensity_Average' 'ColVI_Cytoplasm_Intensity_Average'\n",
+ " 'ColVI_Nucleus_Intensity_Average' 'Desmin_Cell_Intensity_Average'\n",
+ " 'Desmin_Cytoplasm_Intensity_Average' 'Desmin_Nucleus_Intensity_Average'\n",
+ " 'Ecad_Cell_Intensity_Average' 'Ecad_Cytoplasm_Intensity_Average'\n",
+ " 'Ecad_Nucleus_Intensity_Average' 'Fibronectin_Cell_Intensity_Average'\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average'\n",
+ " 'Fibronectin_Nucleus_Intensity_Average' 'FOXP3_Cell_Intensity_Average'\n",
+ " 'FOXP3_Cytoplasm_Intensity_Average' 'FOXP3_Nucleus_Intensity_Average'\n",
+ " 'GATA3_Cell_Intensity_Average' 'GATA3_Cytoplasm_Intensity_Average'\n",
+ " 'GATA3_Nucleus_Intensity_Average' 'HLA_Cell_Intensity_Average'\n",
+ " 'HLA_Cytoplasm_Intensity_Average' 'HLA_Nucleus_Intensity_Average'\n",
+ " 'Ki67_Cell_Intensity_Average' 'Ki67_Cytoplasm_Intensity_Average'\n",
+ " 'Ki67_Nucleus_Intensity_Average' 'MMP9_Cell_Intensity_Average'\n",
+ " 'MMP9_Cytoplasm_Intensity_Average' 'MMP9_Nucleus_Intensity_Average'\n",
+ " 'PD1_Cell_Intensity_Average' 'PD1_Cytoplasm_Intensity_Average'\n",
+ " 'PD1_Nucleus_Intensity_Average' 'PDGFR_Cell_Intensity_Average'\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average' 'PDGFR_Nucleus_Intensity_Average'\n",
+ " 'PDL1_Cell_Intensity_Average' 'PDL1_Cytoplasm_Intensity_Average'\n",
+ " 'PDL1_Nucleus_Intensity_Average' 'r5c2_Cell_Intensity_Average'\n",
+ " 'r5c2_Cytoplasm_Intensity_Average' 'r5c2_Nucleus_Intensity_Average'\n",
+ " 'r7c2_Cell_Intensity_Average' 'r7c2_Cytoplasm_Intensity_Average'\n",
+ " 'r7c2_Nucleus_Intensity_Average' 'r8c2_Cell_Intensity_Average'\n",
+ " 'r8c2_Cytoplasm_Intensity_Average' 'r8c2_Nucleus_Intensity_Average'\n",
+ " 'Sting_Cell_Intensity_Average' 'Sting_Cytoplasm_Intensity_Average'\n",
+ " 'Sting_Nucleus_Intensity_Average' 'Vimentin_Cell_Intensity_Average'\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average'\n",
+ " 'Vimentin_Nucleus_Intensity_Average' 'cell_type' 'cell_subtype'\n",
+ " 'immune_checkpoint']\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Drop AF columns\n",
+ "df = df.filter(regex='^(?!AF\\d{3}).*')\n",
+ "print(df.columns.values)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5c23ca0a-2d0e-4f30-b358-54acc69ac3d0",
+ "metadata": {},
+ "source": [
+ "## II.8. SAVE"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 76,
+ "id": "8c0c8c62-9b55-451f-8c2f-bdc9a33b9fff",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "File /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S3_bs.csv was created!\n",
+ "File /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_bs/TMA_bs.csv was created!\n",
+ "File /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S1_bs.csv was created!\n",
+ "File /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S2_bs.csv was created!\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Save the data by Sample_ID\n",
+ "# Check for the existence of the output file first\n",
+ "for sample in ls_samples:\n",
+ " sample_id = sample.split('_')[0]\n",
+ " filename = os.path.join(output_data_dir, sample_id + \"_\" + step_suffix + \".csv\")\n",
+ " if os.path.exists(filename):\n",
+ " print(\"File by name \"+filename+\" already exists.\")\n",
+ " else:\n",
+ " sample_id_csv = sample_id + '.csv'\n",
+ " df_save = df.loc[df['Sample_ID'] == sample_id_csv, :]\n",
+ " #print(df_save)\n",
+ " filename = os.path.join(output_data_dir, sample_id + \"_\" + step_suffix + \".csv\")\n",
+ " df_save.to_csv(filename, index=True, index_label='ID') # Set index parameter to True to retain the index column\n",
+ " print(\"File \" + filename + \" was created!\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8ef5b66d-fcc6-4677-aab7-f5a748196295",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5a2991f1-7ef3-430e-82f1-810ad70e769d",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "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.11.7"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/wetransfer_data-zip_2024-05-17_1431/3_z_scores.ipynb b/wetransfer_data-zip_2024-05-17_1431/3_z_scores.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..1eab4634bda99a6405846c1f2b28cc72cc81be3b
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/3_z_scores.ipynb
@@ -0,0 +1,7067 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "8a154f88-1c05-497c-b407-87aab0ec0713",
+ "metadata": {},
+ "source": [
+ "# III. Z-SCORES NOTEBOOK"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "0b3b5aa2-e248-402e-a96f-38797d83f3ed",
+ "metadata": {},
+ "source": [
+ "10/01/24\n",
+ "Modifications by ZoƩ Gerber\n",
+ "from an original code from Marilyne Labrie"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "5a98ebd2-51b0-45d4-b9eb-fa1206d151a8",
+ "metadata": {},
+ "source": [
+ "III.1. PACKAGES IMPORT\n",
+ "III.2. DIRECTORIES\n",
+ "III.3. FILES\n",
+ " III.3.1. METADATA\n",
+ " III.3.2. NOT_INTENSITIES\n",
+ " III.3.3. FULL_TO_SHORT_COLUMN_NAMES\n",
+ " III.3.4. SHORT_TO_FULL_COLUMN_NAMES\n",
+ " III.3.5. SAMPLES COLORS\n",
+ " III.3.6. CHANNELS COLORS\n",
+ " III.3.7. ROUND COLORS\n",
+ " III.3.8. CELL TYPES COLORS\n",
+ " III.3.9. CELL SUBTYPES COLORS\n",
+ " III.3.10. DATA\n",
+ "III.4. MARKERS\n",
+ "III.5. Z-SCORE TRANSFORMATION\n",
+ "III.6. VISUALISATIONS\n",
+ "III.7. SAVE"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7bedcd47-92af-4b16-b7ec-db9c315c4e4e",
+ "metadata": {},
+ "source": [
+ "## III.1. PACKAGES IMPORT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "7ac57cd3-ce6a-4cf9-bfc0-f78726aafb05",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/5g/xq32h5h56rj2qzygbnhjg65h0000gn/T/ipykernel_18885/364558441.py:14: DeprecationWarning:\n",
+ "\n",
+ "Please import `pearsonr` from the `scipy.stats` namespace; the `scipy.stats.stats` namespace is deprecated and will be removed in SciPy 2.0.0.\n",
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ " \n",
+ " "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Warning: Cannot change to a different GUI toolkit: widget. Using notebook instead.\n"
+ ]
+ }
+ ],
+ "source": [
+ "import os\n",
+ "import random\n",
+ "import re\n",
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import seaborn as sb\n",
+ "import matplotlib.pyplot as plt\n",
+ "import matplotlib.colors as mplc\n",
+ "import subprocess\n",
+ "import warnings\n",
+ "\n",
+ "\n",
+ "from scipy import signal\n",
+ "from scipy.stats.stats import pearsonr\n",
+ "\n",
+ "import plotly.figure_factory as ff\n",
+ "import plotly\n",
+ "import plotly.graph_objs as go\n",
+ "from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot \n",
+ "import plotly.express as px\n",
+ "init_notebook_mode(connected = True)\n",
+ "\n",
+ "%matplotlib notebook\n",
+ "%matplotlib widget\n",
+ "\n",
+ "from my_modules import *"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "84449f59-6d25-4b0c-8ae0-718d94d892b9",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Silence FutureWarnings & UserWarnings\n",
+ "warnings.filterwarnings('ignore', category= FutureWarning)\n",
+ "warnings.filterwarnings('ignore', category= UserWarning)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "089a79ee-bab1-47c3-90ae-d2bbc0b12491",
+ "metadata": {},
+ "source": [
+ "## III.2. *DIRECTORIES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "2da0047f-5a18-48fb-9fe9-cf94c0186e57",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Set base directory\n",
+ "\n",
+ "##### MAC WORKSTATION #####\n",
+ "#base_dir = r'/Volumes/LaboLabrie/Projets/OC_TMA_Pejovic/Temp/Zoe/CyCIF_pipeline/'\n",
+ "###########################\n",
+ "\n",
+ "##### WINDOWS WORKSTATION #####\n",
+ "#base_dir = r'C:\\Users\\LaboLabrie\\gerz2701\\cyCIF-pipeline\\Set_B'\n",
+ "###############################\n",
+ "\n",
+ "##### LOCAL WORKSTATION #####\n",
+ "base_dir = r'/Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431'\n",
+ "#############################\n",
+ "\n",
+ "#set_name = 'Set_A'\n",
+ "set_name = 'test'"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "446dec49-f5d7-4606-b107-864eeb799273",
+ "metadata": {},
+ "source": [
+ "The project is organized as :\n",
+ "main dir \n",
+ " code\n",
+ " proj_data > all csv files\n",
+ " proj_metadata > exposure time csv file, images dir,...\n",
+ " proj_qc_eda > csv after the QC/EDA step\n",
+ " proj_bs > csv after the BS step\n",
+ " proj_zscore > csv after the ZCORES step"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "99a4320f-d3a2-480e-970d-5a2bcd456c15",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431 directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_bs directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_zscore directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_zscore/images directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/images directory already exists !\n"
+ ]
+ }
+ ],
+ "source": [
+ "project_name = set_name # Project name\n",
+ "step_suffix = 'zscore' # Curent part (here part III)\n",
+ "previous_step_suffix_long = \"_bs\" # Previous part (here BS NOTEBOOK)\n",
+ "\n",
+ "# Initial input data directory\n",
+ "input_data_dir = os.path.join(base_dir, project_name + previous_step_suffix_long) \n",
+ "\n",
+ "# ZSCORE/LOG2 output directories\n",
+ "output_data_dir = os.path.join(base_dir, project_name + \"_\" + step_suffix)\n",
+ "# ZSCORE/LOG2 images subdirectory\n",
+ "output_images_dir = os.path.join(output_data_dir,\"images\")\n",
+ "\n",
+ "# Data and Metadata directories\n",
+ "# Metadata directories\n",
+ "metadata_dir = os.path.join(base_dir, project_name + \"_metadata\")\n",
+ "# images subdirectory\n",
+ "metadata_images_dir = os.path.join(metadata_dir,\"images\")\n",
+ "\n",
+ "# Create directories if they don't already exist\n",
+ "for d in [base_dir, input_data_dir, output_data_dir, output_images_dir, metadata_dir, metadata_images_dir]:\n",
+ " if not os.path.exists(d):\n",
+ " print(\"Creation of the\" , d, \"directory...\")\n",
+ " os.makedirs(d)\n",
+ " else :\n",
+ " print(\"The\", d, \"directory already exists !\")\n",
+ "\n",
+ "os.chdir(input_data_dir)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "9d54e9d7-465b-4f08-92e1-5c05b0471175",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "base_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431\n",
+ "input_data_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_bs\n",
+ "output_data_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_zscore\n",
+ "output_images_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_zscore/images\n",
+ "metadata_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata\n",
+ "metadata_images_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/images\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Verify paths\n",
+ "print('base_dir :', base_dir)\n",
+ "print('input_data_dir :', input_data_dir)\n",
+ "print('output_data_dir :', output_data_dir)\n",
+ "print('output_images_dir :', output_images_dir)\n",
+ "print('metadata_dir :', metadata_dir)\n",
+ "print('metadata_images_dir :', metadata_images_dir)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ab2c6c2d-0747-41d1-939c-259c53ea95bf",
+ "metadata": {},
+ "source": [
+ "## III.3. FILES"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "0d7cca3f-05a5-4fe2-a207-731f354307fa",
+ "metadata": {},
+ "source": [
+ "Don't forget to put your data in the projname_data directory !"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b4a5879e-ef18-4dd8-a526-fa24f7ba2147",
+ "metadata": {},
+ "source": [
+ "### III.3.1. METADATA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "84f7e435-b9f7-421b-8339-b326b869ebca",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/marker_intensity_metadata.csv file was imported for further analysis!\n",
+ "WARNING: 'Marker metadata file' has the following unexpected item(s): \n",
+ "['Exp']\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Round \n",
+ " Target \n",
+ " Exp \n",
+ " Channel \n",
+ " target_lower \n",
+ " full_column \n",
+ " marker \n",
+ " localisation \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488 \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488 \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " AF488 \n",
+ " nucleus \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " AF555 \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " AF555 \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Round Target Exp Channel target_lower full_column \\\n",
+ "0 R0 AF488 300 c2 af488 AF488_Cell_Intensity_Average \n",
+ "1 R0 AF488 300 c2 af488 AF488_Cytoplasm_Intensity_Average \n",
+ "2 R0 AF488 300 c2 af488 AF488_Nucleus_Intensity_Average \n",
+ "3 R0 AF555 1500 c3 af555 AF555_Cell_Intensity_Average \n",
+ "4 R0 AF555 1500 c3 af555 AF555_Cytoplasm_Intensity_Average \n",
+ "\n",
+ " marker localisation \n",
+ "0 AF488 cell \n",
+ "1 AF488 cytoplasm \n",
+ "2 AF488 nucleus \n",
+ "3 AF555 cell \n",
+ "4 AF555 cytoplasm "
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Import all metadata we need from the BS chapter\n",
+ "\n",
+ "# METADATA\n",
+ "filename = \"marker_intensity_metadata.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ "\n",
+ "# Open, read in information\n",
+ "metadata = pd.read_csv(filename)\n",
+ "\n",
+ "# Verify size with verify_line_no() function in my_modules.py\n",
+ "#verify_line_no(filename, metadata.shape[0] + 1)\n",
+ "\n",
+ "# Verify headers\n",
+ "exp_cols = ['Round','Target','Channel','target_lower','full_column','marker','localisation']\n",
+ "compare_headers(exp_cols, metadata.columns.values, \"Marker metadata file\")\n",
+ "\n",
+ "metadata = metadata.dropna()\n",
+ "metadata.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9c4c0a65-4d6b-4c9a-96f3-04d920f77c1c",
+ "metadata": {},
+ "source": [
+ "### III.3.2. NOT_INTENSITIES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "8cd5efc8-dc94-4f33-ace4-2866159b2b94",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/not_intensities.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "not_intensities =\n",
+ " ['Cytoplasm_Size', 'Nuc_X', 'Primary_chem(1)_vs_surg(0)', 'cluster', 'immune_checkpoint', 'Sample_ID', 'Nucleus_Roundness', 'Unique_ROI_index', 'Nuc_Y', 'Nuc_X_Inv', 'Cell_ID', 'cell_subtype', 'ID', 'Nuc_Y_Inv', 'Patient', 'replicate_ID', 'cell_type', 'ROI_index', 'Cell_Size', 'Nucleus_Size']\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"not_intensities.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "not_intensities = []\n",
+ "with open(filename, 'r') as fh:\n",
+ " not_intensities = fh.read().strip().split(\"\\n\")\n",
+ " # take str, strip whitespace, split on new line character\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, len(not_intensities))\n",
+ "\n",
+ "# Print to console\n",
+ "print(\"not_intensities =\\n\", not_intensities)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f786a938-6722-4b4d-909d-9587a8d1c7d4",
+ "metadata": {},
+ "source": [
+ "### III.3.3. FULL_TO_SHORT_COLUMN_NAMES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "dc7ab2e8-53c8-458f-be7f-c4da02f92c5e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/full_to_short_column_names.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "full_to_short_names =\n",
+ " {'AF488_Cell_Intensity_Average': 'AF488_Cell', 'AF488_Cytoplasm_Intensity_Average': 'AF488_Cytoplasm', 'AF488_Nucleus_Intensity_Average': 'AF488_Nucleus', 'AF555_Cell_Intensity_Average': 'AF555_Cell', 'AF555_Cytoplasm_Intensity_Average': 'AF555_Cytoplasm', 'AF555_Nucleus_Intensity_Average': 'AF555_Nucleus', 'AF647_Cell_Intensity_Average': 'AF647_Cell', 'AF647_Cytoplasm_Intensity_Average': 'AF647_Cytoplasm', 'AF647_Nucleus_Intensity_Average': 'AF647_Nucleus', 'AF750_Cell_Intensity_Average': 'AF750_Cell', 'AF750_Cytoplasm_Intensity_Average': 'AF750_Cytoplasm', 'AF750_Nucleus_Intensity_Average': 'AF750_Nucleus', 'aSMA_Cell_Intensity_Average': 'aSMA_Cell', 'aSMA_Cytoplasm_Intensity_Average': 'aSMA_Cytoplasm', 'aSMA_Nucleus_Intensity_Average': 'aSMA_Nucleus', 'AXL_Cell_Intensity_Average': 'AXL_Cell', 'AXL_Cytoplasm_Intensity_Average': 'AXL_Cytoplasm', 'AXL_Nucleus_Intensity_Average': 'AXL_Nucleus', 'B7H4_Cell_Intensity_Average': 'B7H4_Cell', 'B7H4_Cytoplasm_Intensity_Average': 'B7H4_Cytoplasm', 'B7H4_Nucleus_Intensity_Average': 'B7H4_Nucleus', 'CA9_Cell_Intensity_Average': 'CA9_Cell', 'CA9_Cytoplasm_Intensity_Average': 'CA9_Cytoplasm', 'CA9_Nucleus_Intensity_Average': 'CA9_Nucleus', 'CD4_Cell_Intensity_Average': 'CD4_Cell', 'CD4_Cytoplasm_Intensity_Average': 'CD4_Cytoplasm', 'CD4_Nucleus_Intensity_Average': 'CD4_Nucleus', 'CD8_Cell_Intensity_Average': 'CD8_Cell', 'CD8_Cytoplasm_Intensity_Average': 'CD8_Cytoplasm', 'CD8_Nucleus_Intensity_Average': 'CD8_Nucleus', 'CD11b_Cell_Intensity_Average': 'CD11b_Cell', 'CD11b_Cytoplasm_Intensity_Average': 'CD11b_Cytoplasm', 'CD11b_Nucleus_Intensity_Average': 'CD11b_Nucleus', 'CD11c_Cell_Intensity_Average': 'CD11c_Cell', 'CD11c_Cytoplasm_Intensity_Average': 'CD11c_Cytoplasm', 'CD11c_Nucleus_Intensity_Average': 'CD11c_Nucleus', 'CD20_Cell_Intensity_Average': 'CD20_Cell', 'CD20_Cytoplasm_Intensity_Average': 'CD20_Cytoplasm', 'CD20_Nucleus_Intensity_Average': 'CD20_Nucleus', 'CD31_Cell_Intensity_Average': 'CD31_Cell', 'CD31_Cytoplasm_Intensity_Average': 'CD31_Cytoplasm', 'CD31_Nucleus_Intensity_Average': 'CD31_Nucleus', 'CD44_Cell_Intensity_Average': 'CD44_Cell', 'CD44_Cytoplasm_Intensity_Average': 'CD44_Cytoplasm', 'CD44_Nucleus_Intensity_Average': 'CD44_Nucleus', 'CD45_Cell_Intensity_Average': 'CD45_Cell', 'CD45_Cytoplasm_Intensity_Average': 'CD45_Cytoplasm', 'CD45_Nucleus_Intensity_Average': 'CD45_Nucleus', 'CD68_Cell_Intensity_Average': 'CD68_Cell', 'CD68_Cytoplasm_Intensity_Average': 'CD68_Cytoplasm', 'CD68_Nucleus_Intensity_Average': 'CD68_Nucleus', 'CD163_Cell_Intensity_Average': 'CD163_Cell', 'CD163_Cytoplasm_Intensity_Average': 'CD163_Cytoplasm', 'CD163_Nucleus_Intensity_Average': 'CD163_Nucleus', 'CKs_Cell_Intensity_Average': 'CKs_Cell', 'CKs_Cytoplasm_Intensity_Average': 'CKs_Cytoplasm', 'CKs_Nucleus_Intensity_Average': 'CKs_Nucleus', 'ColVI_Cell_Intensity_Average': 'ColVI_Cell', 'ColVI_Cytoplasm_Intensity_Average': 'ColVI_Cytoplasm', 'ColVI_Nucleus_Intensity_Average': 'ColVI_Nucleus', 'Desmin_Cell_Intensity_Average': 'Desmin_Cell', 'Desmin_Cytoplasm_Intensity_Average': 'Desmin_Cytoplasm', 'Desmin_Nucleus_Intensity_Average': 'Desmin_Nucleus', 'Ecad_Cell_Intensity_Average': 'Ecad_Cell', 'Ecad_Cytoplasm_Intensity_Average': 'Ecad_Cytoplasm', 'Ecad_Nucleus_Intensity_Average': 'Ecad_Nucleus', 'Fibronectin_Cell_Intensity_Average': 'Fibronectin_Cell', 'Fibronectin_Cytoplasm_Intensity_Average': 'Fibronectin_Cytoplasm', 'Fibronectin_Nucleus_Intensity_Average': 'Fibronectin_Nucleus', 'FOXP3_Cell_Intensity_Average': 'FOXP3_Cell', 'FOXP3_Cytoplasm_Intensity_Average': 'FOXP3_Cytoplasm', 'FOXP3_Nucleus_Intensity_Average': 'FOXP3_Nucleus', 'GATA3_Cell_Intensity_Average': 'GATA3_Cell', 'GATA3_Cytoplasm_Intensity_Average': 'GATA3_Cytoplasm', 'GATA3_Nucleus_Intensity_Average': 'GATA3_Nucleus', 'HLA_Cell_Intensity_Average': 'HLA_Cell', 'HLA_Cytoplasm_Intensity_Average': 'HLA_Cytoplasm', 'HLA_Nucleus_Intensity_Average': 'HLA_Nucleus', 'Ki67_Cell_Intensity_Average': 'Ki67_Cell', 'Ki67_Cytoplasm_Intensity_Average': 'Ki67_Cytoplasm', 'Ki67_Nucleus_Intensity_Average': 'Ki67_Nucleus', 'MMP9_Cell_Intensity_Average': 'MMP9_Cell', 'MMP9_Cytoplasm_Intensity_Average': 'MMP9_Cytoplasm', 'MMP9_Nucleus_Intensity_Average': 'MMP9_Nucleus', 'PD1_Cell_Intensity_Average': 'PD1_Cell', 'PD1_Cytoplasm_Intensity_Average': 'PD1_Cytoplasm', 'PD1_Nucleus_Intensity_Average': 'PD1_Nucleus', 'PDGFR_Cell_Intensity_Average': 'PDGFR_Cell', 'PDGFR_Cytoplasm_Intensity_Average': 'PDGFR_Cytoplasm', 'PDGFR_Nucleus_Intensity_Average': 'PDGFR_Nucleus', 'PDL1_Cell_Intensity_Average': 'PDL1_Cell', 'PDL1_Cytoplasm_Intensity_Average': 'PDL1_Cytoplasm', 'PDL1_Nucleus_Intensity_Average': 'PDL1_Nucleus', 'r5c2_Cell_Intensity_Average': 'r5c2_Cell', 'r5c2_Cytoplasm_Intensity_Average': 'r5c2_Cytoplasm', 'r5c2_Nucleus_Intensity_Average': 'r5c2_Nucleus', 'r7c2_Cell_Intensity_Average': 'r7c2_Cell', 'r7c2_Cytoplasm_Intensity_Average': 'r7c2_Cytoplasm', 'r7c2_Nucleus_Intensity_Average': 'r7c2_Nucleus', 'r8c2_Cell_Intensity_Average': 'r8c2_Cell', 'r8c2_Cytoplasm_Intensity_Average': 'r8c2_Cytoplasm', 'r8c2_Nucleus_Intensity_Average': 'r8c2_Nucleus', 'Sting_Cell_Intensity_Average': 'Sting_Cell', 'Sting_Cytoplasm_Intensity_Average': 'Sting_Cytoplasm', 'Sting_Nucleus_Intensity_Average': 'Sting_Nucleus', 'Vimentin_Cell_Intensity_Average': 'Vimentin_Cell', 'Vimentin_Cytoplasm_Intensity_Average': 'Vimentin_Cytoplasm', 'Vimentin_Nucleus_Intensity_Average': 'Vimentin_Nucleus'}\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"full_to_short_column_names.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \" + filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "full_to_short_names = df.set_index('full_name').T.to_dict('records')[0]\n",
+ "\n",
+ "# CD45 instead of CD45b\n",
+ "if project_name == 'Slide_A' :\n",
+ " full_to_short_names['CD45_Cytoplasm_Intensity_Average'] = full_to_short_names.pop('CD45b_Cytoplasm_Intensity_Average')\n",
+ " full_to_short_names['CD45_Cytoplasm_Intensity_Average'] = 'CD45_Cytoplasm'\n",
+ "\n",
+ "# Print information\n",
+ "print('full_to_short_names =\\n',full_to_short_names)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "61b99332-be87-4ba5-9254-2d9f87668f7b",
+ "metadata": {},
+ "source": [
+ "### III.3.4. SHORT_TO_FULL_COLUMN_NAMES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "920169e1-8dad-4682-9b56-12d2d8f7b984",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/short_to_full_column_names.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "short_to_full_names =\n",
+ " {'AF488_Cell': 'AF488_Cell_Intensity_Average', 'AF488_Cytoplasm': 'AF488_Cytoplasm_Intensity_Average', 'AF488_Nucleus': 'AF488_Nucleus_Intensity_Average', 'AF555_Cell': 'AF555_Cell_Intensity_Average', 'AF555_Cytoplasm': 'AF555_Cytoplasm_Intensity_Average', 'AF555_Nucleus': 'AF555_Nucleus_Intensity_Average', 'AF647_Cell': 'AF647_Cell_Intensity_Average', 'AF647_Cytoplasm': 'AF647_Cytoplasm_Intensity_Average', 'AF647_Nucleus': 'AF647_Nucleus_Intensity_Average', 'AF750_Cell': 'AF750_Cell_Intensity_Average', 'AF750_Cytoplasm': 'AF750_Cytoplasm_Intensity_Average', 'AF750_Nucleus': 'AF750_Nucleus_Intensity_Average', 'aSMA_Cell': 'aSMA_Cell_Intensity_Average', 'aSMA_Cytoplasm': 'aSMA_Cytoplasm_Intensity_Average', 'aSMA_Nucleus': 'aSMA_Nucleus_Intensity_Average', 'AXL_Cell': 'AXL_Cell_Intensity_Average', 'AXL_Cytoplasm': 'AXL_Cytoplasm_Intensity_Average', 'AXL_Nucleus': 'AXL_Nucleus_Intensity_Average', 'B7H4_Cell': 'B7H4_Cell_Intensity_Average', 'B7H4_Cytoplasm': 'B7H4_Cytoplasm_Intensity_Average', 'B7H4_Nucleus': 'B7H4_Nucleus_Intensity_Average', 'CA9_Cell': 'CA9_Cell_Intensity_Average', 'CA9_Cytoplasm': 'CA9_Cytoplasm_Intensity_Average', 'CA9_Nucleus': 'CA9_Nucleus_Intensity_Average', 'CD4_Cell': 'CD4_Cell_Intensity_Average', 'CD4_Cytoplasm': 'CD4_Cytoplasm_Intensity_Average', 'CD4_Nucleus': 'CD4_Nucleus_Intensity_Average', 'CD8_Cell': 'CD8_Cell_Intensity_Average', 'CD8_Cytoplasm': 'CD8_Cytoplasm_Intensity_Average', 'CD8_Nucleus': 'CD8_Nucleus_Intensity_Average', 'CD11b_Cell': 'CD11b_Cell_Intensity_Average', 'CD11b_Cytoplasm': 'CD11b_Cytoplasm_Intensity_Average', 'CD11b_Nucleus': 'CD11b_Nucleus_Intensity_Average', 'CD11c_Cell': 'CD11c_Cell_Intensity_Average', 'CD11c_Cytoplasm': 'CD11c_Cytoplasm_Intensity_Average', 'CD11c_Nucleus': 'CD11c_Nucleus_Intensity_Average', 'CD20_Cell': 'CD20_Cell_Intensity_Average', 'CD20_Cytoplasm': 'CD20_Cytoplasm_Intensity_Average', 'CD20_Nucleus': 'CD20_Nucleus_Intensity_Average', 'CD31_Cell': 'CD31_Cell_Intensity_Average', 'CD31_Cytoplasm': 'CD31_Cytoplasm_Intensity_Average', 'CD31_Nucleus': 'CD31_Nucleus_Intensity_Average', 'CD44_Cell': 'CD44_Cell_Intensity_Average', 'CD44_Cytoplasm': 'CD44_Cytoplasm_Intensity_Average', 'CD44_Nucleus': 'CD44_Nucleus_Intensity_Average', 'CD45_Cell': 'CD45_Cell_Intensity_Average', 'CD45_Cytoplasm': 'CD45_Cytoplasm_Intensity_Average', 'CD45_Nucleus': 'CD45_Nucleus_Intensity_Average', 'CD68_Cell': 'CD68_Cell_Intensity_Average', 'CD68_Cytoplasm': 'CD68_Cytoplasm_Intensity_Average', 'CD68_Nucleus': 'CD68_Nucleus_Intensity_Average', 'CD163_Cell': 'CD163_Cell_Intensity_Average', 'CD163_Cytoplasm': 'CD163_Cytoplasm_Intensity_Average', 'CD163_Nucleus': 'CD163_Nucleus_Intensity_Average', 'CKs_Cell': 'CKs_Cell_Intensity_Average', 'CKs_Cytoplasm': 'CKs_Cytoplasm_Intensity_Average', 'CKs_Nucleus': 'CKs_Nucleus_Intensity_Average', 'ColVI_Cell': 'ColVI_Cell_Intensity_Average', 'ColVI_Cytoplasm': 'ColVI_Cytoplasm_Intensity_Average', 'ColVI_Nucleus': 'ColVI_Nucleus_Intensity_Average', 'Desmin_Cell': 'Desmin_Cell_Intensity_Average', 'Desmin_Cytoplasm': 'Desmin_Cytoplasm_Intensity_Average', 'Desmin_Nucleus': 'Desmin_Nucleus_Intensity_Average', 'Ecad_Cell': 'Ecad_Cell_Intensity_Average', 'Ecad_Cytoplasm': 'Ecad_Cytoplasm_Intensity_Average', 'Ecad_Nucleus': 'Ecad_Nucleus_Intensity_Average', 'Fibronectin_Cell': 'Fibronectin_Cell_Intensity_Average', 'Fibronectin_Cytoplasm': 'Fibronectin_Cytoplasm_Intensity_Average', 'Fibronectin_Nucleus': 'Fibronectin_Nucleus_Intensity_Average', 'FOXP3_Cell': 'FOXP3_Cell_Intensity_Average', 'FOXP3_Cytoplasm': 'FOXP3_Cytoplasm_Intensity_Average', 'FOXP3_Nucleus': 'FOXP3_Nucleus_Intensity_Average', 'GATA3_Cell': 'GATA3_Cell_Intensity_Average', 'GATA3_Cytoplasm': 'GATA3_Cytoplasm_Intensity_Average', 'GATA3_Nucleus': 'GATA3_Nucleus_Intensity_Average', 'HLA_Cell': 'HLA_Cell_Intensity_Average', 'HLA_Cytoplasm': 'HLA_Cytoplasm_Intensity_Average', 'HLA_Nucleus': 'HLA_Nucleus_Intensity_Average', 'Ki67_Cell': 'Ki67_Cell_Intensity_Average', 'Ki67_Cytoplasm': 'Ki67_Cytoplasm_Intensity_Average', 'Ki67_Nucleus': 'Ki67_Nucleus_Intensity_Average', 'MMP9_Cell': 'MMP9_Cell_Intensity_Average', 'MMP9_Cytoplasm': 'MMP9_Cytoplasm_Intensity_Average', 'MMP9_Nucleus': 'MMP9_Nucleus_Intensity_Average', 'PD1_Cell': 'PD1_Cell_Intensity_Average', 'PD1_Cytoplasm': 'PD1_Cytoplasm_Intensity_Average', 'PD1_Nucleus': 'PD1_Nucleus_Intensity_Average', 'PDGFR_Cell': 'PDGFR_Cell_Intensity_Average', 'PDGFR_Cytoplasm': 'PDGFR_Cytoplasm_Intensity_Average', 'PDGFR_Nucleus': 'PDGFR_Nucleus_Intensity_Average', 'PDL1_Cell': 'PDL1_Cell_Intensity_Average', 'PDL1_Cytoplasm': 'PDL1_Cytoplasm_Intensity_Average', 'PDL1_Nucleus': 'PDL1_Nucleus_Intensity_Average', 'r5c2_Cell': 'r5c2_Cell_Intensity_Average', 'r5c2_Cytoplasm': 'r5c2_Cytoplasm_Intensity_Average', 'r5c2_Nucleus': 'r5c2_Nucleus_Intensity_Average', 'r7c2_Cell': 'r7c2_Cell_Intensity_Average', 'r7c2_Cytoplasm': 'r7c2_Cytoplasm_Intensity_Average', 'r7c2_Nucleus': 'r7c2_Nucleus_Intensity_Average', 'r8c2_Cell': 'r8c2_Cell_Intensity_Average', 'r8c2_Cytoplasm': 'r8c2_Cytoplasm_Intensity_Average', 'r8c2_Nucleus': 'r8c2_Nucleus_Intensity_Average', 'Sting_Cell': 'Sting_Cell_Intensity_Average', 'Sting_Cytoplasm': 'Sting_Cytoplasm_Intensity_Average', 'Sting_Nucleus': 'Sting_Nucleus_Intensity_Average', 'Vimentin_Cell': 'Vimentin_Cell_Intensity_Average', 'Vimentin_Cytoplasm': 'Vimentin_Cytoplasm_Intensity_Average', 'Vimentin_Nucleus': 'Vimentin_Nucleus_Intensity_Average'}\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"short_to_full_column_names.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \" + filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "short_to_full_names = df.set_index('short_name').T.to_dict('records')[0]\n",
+ "\n",
+ "# CD45 instead of CD45b\n",
+ "if project_name == 'Slide_A' :\n",
+ " short_to_full_names['CD45_Cytoplasm'] = short_to_full_names.pop('CD45b_Cytoplasm')\n",
+ " short_to_full_names['CD45_Cytoplasm'] = 'CD45_Cytoplasm_Intensity_Average'\n",
+ "\n",
+ "# Print information\n",
+ "print('short_to_full_names =\\n',short_to_full_names)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f34deee2-da48-455d-a9c3-c85c19b44af6",
+ "metadata": {},
+ "source": [
+ "### III.3.5. SAMPLES COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "e37ab86f-1ffe-4a13-8c06-10de2bfd6ca3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/sample_color_data.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "sample_color_dict =\n",
+ " {'DD3S1.csv': (0.9677975592919913, 0.44127456009157356, 0.5358103155058701), 'DD3S2.csv': (0.5920891529639701, 0.6418467016378244, 0.1935069134991043), 'DD3S3.csv': (0.21044753832183283, 0.6773105080456748, 0.6433941168468681), 'TMA.csv': (0.5019607843137255, 0.5019607843137255, 0.5019607843137255)}\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"sample_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \" + filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "sample_color_dict = df.set_index('Sample_ID').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('sample_color_dict =\\n',sample_color_dict)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ab0a8169-0607-446f-9fd0-589a1cd71013",
+ "metadata": {},
+ "source": [
+ "### III.3.6. CHANNELS COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "99baf121-de7b-4158-97a3-2d3a1d550ce0",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/channel_color_data.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "channel_color_dict =\n",
+ " {'c2': (0.00784313725490196, 0.24313725490196078, 1.0), 'c3': (1.0, 0.48627450980392156, 0.0), 'c4': (0.10196078431372549, 0.788235294117647, 0.2196078431372549), 'c5': (0.9098039215686274, 0.0, 0.043137254901960784)}\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"channel_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "channel_color_dict = df.set_index('Channel').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('channel_color_dict =\\n',channel_color_dict)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "03ba7a15-762d-4535-93b2-a95b88b48a80",
+ "metadata": {},
+ "source": [
+ "### III.3.7. ROUNDS COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "15d9630d-9e68-47bf-9d09-b57b6ac76dce",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/round_color_data.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "round_color_dict =\n",
+ " {'R0': (0.28685356234627135, 0.13009829239513535, 0.23110332132624437), 'R1': (0.36541462435986094, 0.2025447048359916, 0.37693310021636883), 'R2': (0.40867533458903105, 0.2940761173840091, 0.5166711878800253), 'R3': (0.42890613750051265, 0.4082290173220481, 0.6335348887063806), 'R4': (0.4444462906865238, 0.5264664993764805, 0.7056321892616532), 'R5': (0.47707206309601013, 0.6427061780374552, 0.7418477948908153), 'R6': (0.5414454866716836, 0.7466759172596551, 0.7572905778378964), 'R7': (0.6414710091647722, 0.8321551072276492, 0.7746773027952071), 'R8': (0.7684256891219349, 0.8992667116749021, 0.8171383269422353)}\n"
+ ]
+ }
+ ],
+ "source": [
+ "# ROUND\n",
+ "filename = \"round_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "round_color_dict = df.set_index('Round').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('round_color_dict =\\n',round_color_dict)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "4bf75afa-7681-455e-a752-478993946a4c",
+ "metadata": {},
+ "source": [
+ "### III.3.8. CELL TYPES COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "e53d9ea2-204f-44c0-88c2-871c5b106f2f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/celltype_color_data.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "cell_type_color_dict =\n",
+ " {'CANCER': (0.1333, 0.5451, 0.1333), 'STROMA': (0.4, 0.4, 0.4), 'IMMUNE': (1.0, 1.0, 0.0), 'ENDOTHELIAL': (0.502, 0.0, 0.502)}\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"celltype_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "cell_type_color_dict = df.set_index('cell_type').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('cell_type_color_dict =\\n',cell_type_color_dict)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c8092e80-bed7-4e73-a8d6-76c5a9d60e18",
+ "metadata": {},
+ "source": [
+ "### III.3.9. CELL SUBTYPES COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "9377b7d3-2761-49b2-9b34-32f9ffe9ae83",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/cellsubtype_color_data.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "cell_subtype_color_dict =\n",
+ " {'DC': (0.6509803921568628, 0.807843137254902, 0.8901960784313725), 'B': (0.12156862745098039, 0.47058823529411764, 0.7058823529411765), 'TCD4': (0.6980392156862745, 0.8745098039215686, 0.5411764705882353), 'TCD8': (0.2, 0.6274509803921569, 0.17254901960784313), 'M1': (0.984313725490196, 0.6039215686274509, 0.6), 'M2': (0.8901960784313725, 0.10196078431372549, 0.10980392156862745), 'Treg': (0.9921568627450981, 0.7490196078431373, 0.43529411764705883), 'IMMUNE_OTHER': (1.0, 0.4980392156862745, 0.0), 'CANCER': (0.792156862745098, 0.6980392156862745, 0.8392156862745098), 'αSMA_myCAF': (0.41568627450980394, 0.23921568627450981, 0.6039215686274509), 'STROMA_OTHER': (1.0, 1.0, 0.6), 'ENDOTHELIAL': (0.6941176470588235, 0.34901960784313724, 0.1568627450980392)}\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"cellsubtype_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "cell_subtype_color_dict = df.set_index('cell_subtype').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('cell_subtype_color_dict =\\n',cell_subtype_color_dict)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9a9b59e2-f9d7-49e1-96ea-85353638ed5c",
+ "metadata": {},
+ "source": [
+ "### III.3.10. IMMUNE CHECKPOINT COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "7a204d2b-ead7-488a-b629-32dd10731bd0",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/immunecheckpoint_color_data.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "immune_checkpoint_color_dict =\n",
+ " {'B7H4': (0.9677975592919913, 0.44127456009157356, 0.5358103155058701), 'PDL1': (0.3126890019504329, 0.6928754610296064, 0.1923704830330379), 'PD1': (0.23299120924703914, 0.639586552066035, 0.9260706093977744), 'B7H4_PDL1': (0.6402432806212122, 0.56707501056059, 0.36409039926945397), 'None': (0.5044925901631545, 0.5912455243957383, 0.5514171359788941)}\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"immunecheckpoint_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "immune_checkpoint_color_dict = df.set_index('immune_checkpoint').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('immune_checkpoint_color_dict =\\n',immune_checkpoint_color_dict)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "19d63518-7ae4-4b1d-b517-2c9149f2df9a",
+ "metadata": {},
+ "source": [
+ "### III.3.10. DATA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "52ec0eca-b36a-440e-b9ec-340f4a8e66ad",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The following CSV files were detected:\n",
+ "['DD3S2_bs.csv', 'TMA_bs.csv', 'DD3S1_bs.csv', 'DD3S3_bs.csv']\n"
+ ]
+ }
+ ],
+ "source": [
+ "# DATA\n",
+ "# List files in the directory\n",
+ "# Check if the directory exists\n",
+ "if os.path.exists(input_data_dir):\n",
+ " # List files in the directory\n",
+ " ls_samples = [sample for sample in os.listdir(input_data_dir) if sample.endswith(\"_bs.csv\")]\n",
+ " print(\"The following CSV files were detected:\")\n",
+ " print([sample for sample in ls_samples])\n",
+ "else:\n",
+ " print(f\"The directory {input_data_dir} does not exist.\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "3d10d406-ff16-49db-8144-06577a45e1d3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['Nuc_X' 'Sample_ID' 'Nucleus_Roundness' 'Nuc_Y_Inv' 'ROI_index'\n",
+ " 'Cell_Size' 'Nucleus_Size' 'aSMA_Cell_Intensity_Average'\n",
+ " 'aSMA_Cytoplasm_Intensity_Average' 'aSMA_Nucleus_Intensity_Average'\n",
+ " 'AXL_Cell_Intensity_Average' 'AXL_Cytoplasm_Intensity_Average'\n",
+ " 'AXL_Nucleus_Intensity_Average' 'B7H4_Cell_Intensity_Average'\n",
+ " 'B7H4_Cytoplasm_Intensity_Average' 'B7H4_Nucleus_Intensity_Average'\n",
+ " 'CA9_Cell_Intensity_Average' 'CA9_Cytoplasm_Intensity_Average'\n",
+ " 'CA9_Nucleus_Intensity_Average' 'CD4_Cell_Intensity_Average'\n",
+ " 'CD4_Cytoplasm_Intensity_Average' 'CD4_Nucleus_Intensity_Average'\n",
+ " 'CD8_Cell_Intensity_Average' 'CD8_Cytoplasm_Intensity_Average'\n",
+ " 'CD8_Nucleus_Intensity_Average' 'CD11b_Cell_Intensity_Average'\n",
+ " 'CD11b_Cytoplasm_Intensity_Average' 'CD11b_Nucleus_Intensity_Average'\n",
+ " 'CD11c_Cell_Intensity_Average' 'CD11c_Cytoplasm_Intensity_Average'\n",
+ " 'CD11c_Nucleus_Intensity_Average' 'CD20_Cell_Intensity_Average'\n",
+ " 'CD20_Cytoplasm_Intensity_Average' 'CD20_Nucleus_Intensity_Average'\n",
+ " 'CD31_Cell_Intensity_Average' 'CD31_Cytoplasm_Intensity_Average'\n",
+ " 'CD31_Nucleus_Intensity_Average' 'CD44_Cell_Intensity_Average'\n",
+ " 'CD44_Cytoplasm_Intensity_Average' 'CD44_Nucleus_Intensity_Average'\n",
+ " 'CD45_Cell_Intensity_Average' 'CD45_Cytoplasm_Intensity_Average'\n",
+ " 'CD45_Nucleus_Intensity_Average' 'CD68_Cell_Intensity_Average'\n",
+ " 'CD68_Cytoplasm_Intensity_Average' 'CD68_Nucleus_Intensity_Average'\n",
+ " 'CD163_Cell_Intensity_Average' 'CD163_Cytoplasm_Intensity_Average'\n",
+ " 'CD163_Nucleus_Intensity_Average' 'CKs_Cell_Intensity_Average'\n",
+ " 'CKs_Cytoplasm_Intensity_Average' 'CKs_Nucleus_Intensity_Average'\n",
+ " 'ColVI_Cell_Intensity_Average' 'ColVI_Cytoplasm_Intensity_Average'\n",
+ " 'ColVI_Nucleus_Intensity_Average' 'Desmin_Cell_Intensity_Average'\n",
+ " 'Desmin_Cytoplasm_Intensity_Average' 'Desmin_Nucleus_Intensity_Average'\n",
+ " 'Ecad_Cell_Intensity_Average' 'Ecad_Cytoplasm_Intensity_Average'\n",
+ " 'Ecad_Nucleus_Intensity_Average' 'Fibronectin_Cell_Intensity_Average'\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average'\n",
+ " 'Fibronectin_Nucleus_Intensity_Average' 'FOXP3_Cell_Intensity_Average'\n",
+ " 'FOXP3_Cytoplasm_Intensity_Average' 'FOXP3_Nucleus_Intensity_Average'\n",
+ " 'GATA3_Cell_Intensity_Average' 'GATA3_Cytoplasm_Intensity_Average'\n",
+ " 'GATA3_Nucleus_Intensity_Average' 'HLA_Cell_Intensity_Average'\n",
+ " 'HLA_Cytoplasm_Intensity_Average' 'HLA_Nucleus_Intensity_Average'\n",
+ " 'Ki67_Cell_Intensity_Average' 'Ki67_Cytoplasm_Intensity_Average'\n",
+ " 'Ki67_Nucleus_Intensity_Average' 'MMP9_Cell_Intensity_Average'\n",
+ " 'MMP9_Cytoplasm_Intensity_Average' 'MMP9_Nucleus_Intensity_Average'\n",
+ " 'PD1_Cell_Intensity_Average' 'PD1_Cytoplasm_Intensity_Average'\n",
+ " 'PD1_Nucleus_Intensity_Average' 'PDGFR_Cell_Intensity_Average'\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average' 'PDGFR_Nucleus_Intensity_Average'\n",
+ " 'PDL1_Cell_Intensity_Average' 'PDL1_Cytoplasm_Intensity_Average'\n",
+ " 'PDL1_Nucleus_Intensity_Average' 'r5c2_Cell_Intensity_Average'\n",
+ " 'r5c2_Cytoplasm_Intensity_Average' 'r5c2_Nucleus_Intensity_Average'\n",
+ " 'r7c2_Cell_Intensity_Average' 'r7c2_Cytoplasm_Intensity_Average'\n",
+ " 'r7c2_Nucleus_Intensity_Average' 'r8c2_Cell_Intensity_Average'\n",
+ " 'r8c2_Cytoplasm_Intensity_Average' 'r8c2_Nucleus_Intensity_Average'\n",
+ " 'Sting_Cell_Intensity_Average' 'Sting_Cytoplasm_Intensity_Average'\n",
+ " 'Sting_Nucleus_Intensity_Average' 'Vimentin_Cell_Intensity_Average'\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average'\n",
+ " 'Vimentin_Nucleus_Intensity_Average' 'cell_type' 'cell_subtype'\n",
+ " 'immune_checkpoint']\n",
+ "DD3S2_bs.csv file is processed !\n",
+ "\n",
+ "TMA_bs.csv file is processed !\n",
+ "\n",
+ "DD3S1_bs.csv file is processed !\n",
+ "\n",
+ "DD3S3_bs.csv file is processed !\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Import all the others files\n",
+ "dfs = {}\n",
+ "\n",
+ "# Set variable to hold default header values\n",
+ "# First gather information on expected headers using first file in ls_samples\n",
+ "# Read in the first row of the file corresponding to the first sample (index = 0) in ls_samples\n",
+ "df = pd.read_csv(os.path.join(input_data_dir, ls_samples[0]) , index_col = 0, nrows = 1)\n",
+ "expected_headers = df.columns.values\n",
+ "print(expected_headers)\n",
+ "\n",
+ "###############################\n",
+ "# !! This may take a while !! #\n",
+ "###############################\n",
+ "for sample in ls_samples:\n",
+ " file_path = os.path.join(input_data_dir,sample)\n",
+ " \n",
+ " try:\n",
+ " # Read the CSV file\n",
+ " df = pd.read_csv(file_path, index_col=0)\n",
+ " # Check if the DataFrame is empty, if so, don't continue trying to process df and remove it\n",
+ " \n",
+ " if not df.empty:\n",
+ " # Reorder the columns to match the expected headers list\n",
+ " df = df.reindex(columns=expected_headers)\n",
+ " print(sample, \"file is processed !\\n\")\n",
+ " #print(df) \n",
+ " \n",
+ " except pd.errors.EmptyDataError:\n",
+ " print(f'\\nEmpty data error in {sample} file. Removing from analysis...')\n",
+ " ls_samples.remove(sample) \n",
+ " \n",
+ " # Add df to dfs \n",
+ " dfs[sample] = df\n",
+ "\n",
+ "#print(dfs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "de221729-777e-4985-9206-97ae97f1253b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " Nuc_X Sample_ID Nucleus_Roundness Nuc_Y_Inv \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 2033.197510 DD3S2.csv 0.792312 15494.777344 \n",
+ "DD3S2_Cell_1 2101.638184 DD3S2.csv 0.749236 15495.552734 \n",
+ "DD3S2_Cell_2 2008.148193 DD3S2.csv 0.835324 15492.370117 \n",
+ "DD3S2_Cell_3 1992.441162 DD3S2.csv 0.671957 15489.808594 \n",
+ "DD3S2_Cell_4 2092.007080 DD3S2.csv 0.710829 15488.482422 \n",
+ "\n",
+ " ROI_index Cell_Size Nucleus_Size aSMA_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0 307 81 25.086319 \n",
+ "DD3S2_Cell_1 0 159 47 3.587149 \n",
+ "DD3S2_Cell_2 0 267 81 32.531833 \n",
+ "DD3S2_Cell_3 0 293 68 40.645667 \n",
+ "DD3S2_Cell_4 0 225 141 5.189259 \n",
+ "\n",
+ " aSMA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 23.127993 \n",
+ "DD3S2_Cell_1 3.733333 \n",
+ "DD3S2_Cell_2 28.868405 \n",
+ "DD3S2_Cell_3 41.192237 \n",
+ "DD3S2_Cell_4 6.561389 \n",
+ "\n",
+ " aSMA_Nucleus_Intensity_Average ... \\\n",
+ "ID ... \n",
+ "DD3S2_Cell_0 30.550290 ... \n",
+ "DD3S2_Cell_1 3.238795 ... \n",
+ "DD3S2_Cell_2 40.944156 ... \n",
+ "DD3S2_Cell_3 38.837158 ... \n",
+ "DD3S2_Cell_4 4.371820 ... \n",
+ "\n",
+ " r8c2_Nucleus_Intensity_Average Sting_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.244609 1.549813 \n",
+ "DD3S2_Cell_1 3.793689 2.063667 \n",
+ "DD3S2_Cell_2 3.794774 2.317112 \n",
+ "DD3S2_Cell_3 3.287451 0.956001 \n",
+ "DD3S2_Cell_4 3.533523 1.756521 \n",
+ "\n",
+ " Sting_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 1.505413 \n",
+ "DD3S2_Cell_1 2.211345 \n",
+ "DD3S2_Cell_2 2.198314 \n",
+ "DD3S2_Cell_3 0.951068 \n",
+ "DD3S2_Cell_4 1.922095 \n",
+ "\n",
+ " Sting_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 1.673696 \n",
+ "DD3S2_Cell_1 1.711752 \n",
+ "DD3S2_Cell_2 2.589909 \n",
+ "DD3S2_Cell_3 0.972323 \n",
+ "DD3S2_Cell_4 1.657882 \n",
+ "\n",
+ " Vimentin_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 8.406796 \n",
+ "DD3S2_Cell_1 0.159812 \n",
+ "DD3S2_Cell_2 21.313608 \n",
+ "DD3S2_Cell_3 8.170421 \n",
+ "DD3S2_Cell_4 1.829408 \n",
+ "\n",
+ " Vimentin_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 8.064129 \n",
+ "DD3S2_Cell_1 0.133691 \n",
+ "DD3S2_Cell_2 22.438442 \n",
+ "DD3S2_Cell_3 7.536326 \n",
+ "DD3S2_Cell_4 3.737342 \n",
+ "\n",
+ " Vimentin_Nucleus_Intensity_Average cell_type cell_subtype \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 9.362881 none none \n",
+ "DD3S2_Cell_1 0.222056 none none \n",
+ "DD3S2_Cell_2 18.730657 none none \n",
+ "DD3S2_Cell_3 10.268529 none none \n",
+ "DD3S2_Cell_4 0.692766 none none \n",
+ "\n",
+ " immune_checkpoint \n",
+ "ID \n",
+ "DD3S2_Cell_0 none \n",
+ "DD3S2_Cell_1 none \n",
+ "DD3S2_Cell_2 none \n",
+ "DD3S2_Cell_3 none \n",
+ "DD3S2_Cell_4 none \n",
+ "\n",
+ "[5 rows x 106 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Merge dfs into one df\n",
+ "df = pd.concat(dfs.values(), ignore_index=False , sort = False)\n",
+ "del dfs\n",
+ "\n",
+ "print(df.head())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "a750b9a2-7cdf-4e6d-9571-756e0aed5e73",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(341938, 106)"
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "ad2bc997-52dc-470d-a96a-290ceb7987a4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Index(['DD3S2_Cell_0', 'DD3S2_Cell_1', 'DD3S2_Cell_2', 'DD3S2_Cell_3',\n",
+ " 'DD3S2_Cell_4', 'DD3S2_Cell_5', 'DD3S2_Cell_6', 'DD3S2_Cell_7',\n",
+ " 'DD3S2_Cell_9', 'DD3S2_Cell_10',\n",
+ " ...\n",
+ " 'DD3S3_Cell_138961', 'DD3S3_Cell_138962', 'DD3S3_Cell_138963',\n",
+ " 'DD3S3_Cell_138964', 'DD3S3_Cell_138966', 'DD3S3_Cell_138967',\n",
+ " 'DD3S3_Cell_138968', 'DD3S3_Cell_138969', 'DD3S3_Cell_138970',\n",
+ " 'DD3S3_Cell_138971'],\n",
+ " dtype='object', name='ID', length=341938)"
+ ]
+ },
+ "execution_count": 31,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.index "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "5b8d1763-f600-4206-ac7a-14e8a598659d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['Nuc_X', 'Sample_ID', 'Nucleus_Roundness', 'Nuc_Y_Inv',\n",
+ " 'ROI_index', 'Cell_Size', 'Nucleus_Size',\n",
+ " 'aSMA_Cell_Intensity_Average', 'aSMA_Cytoplasm_Intensity_Average',\n",
+ " 'aSMA_Nucleus_Intensity_Average', 'AXL_Cell_Intensity_Average',\n",
+ " 'AXL_Cytoplasm_Intensity_Average', 'AXL_Nucleus_Intensity_Average',\n",
+ " 'B7H4_Cell_Intensity_Average', 'B7H4_Cytoplasm_Intensity_Average',\n",
+ " 'B7H4_Nucleus_Intensity_Average', 'CA9_Cell_Intensity_Average',\n",
+ " 'CA9_Cytoplasm_Intensity_Average', 'CA9_Nucleus_Intensity_Average',\n",
+ " 'CD4_Cell_Intensity_Average', 'CD4_Cytoplasm_Intensity_Average',\n",
+ " 'CD4_Nucleus_Intensity_Average', 'CD8_Cell_Intensity_Average',\n",
+ " 'CD8_Cytoplasm_Intensity_Average', 'CD8_Nucleus_Intensity_Average',\n",
+ " 'CD11b_Cell_Intensity_Average',\n",
+ " 'CD11b_Cytoplasm_Intensity_Average',\n",
+ " 'CD11b_Nucleus_Intensity_Average', 'CD11c_Cell_Intensity_Average',\n",
+ " 'CD11c_Cytoplasm_Intensity_Average',\n",
+ " 'CD11c_Nucleus_Intensity_Average', 'CD20_Cell_Intensity_Average',\n",
+ " 'CD20_Cytoplasm_Intensity_Average',\n",
+ " 'CD20_Nucleus_Intensity_Average', 'CD31_Cell_Intensity_Average',\n",
+ " 'CD31_Cytoplasm_Intensity_Average',\n",
+ " 'CD31_Nucleus_Intensity_Average', 'CD44_Cell_Intensity_Average',\n",
+ " 'CD44_Cytoplasm_Intensity_Average',\n",
+ " 'CD44_Nucleus_Intensity_Average', 'CD45_Cell_Intensity_Average',\n",
+ " 'CD45_Cytoplasm_Intensity_Average',\n",
+ " 'CD45_Nucleus_Intensity_Average', 'CD68_Cell_Intensity_Average',\n",
+ " 'CD68_Cytoplasm_Intensity_Average',\n",
+ " 'CD68_Nucleus_Intensity_Average', 'CD163_Cell_Intensity_Average',\n",
+ " 'CD163_Cytoplasm_Intensity_Average',\n",
+ " 'CD163_Nucleus_Intensity_Average', 'CKs_Cell_Intensity_Average',\n",
+ " 'CKs_Cytoplasm_Intensity_Average', 'CKs_Nucleus_Intensity_Average',\n",
+ " 'ColVI_Cell_Intensity_Average',\n",
+ " 'ColVI_Cytoplasm_Intensity_Average',\n",
+ " 'ColVI_Nucleus_Intensity_Average', 'Desmin_Cell_Intensity_Average',\n",
+ " 'Desmin_Cytoplasm_Intensity_Average',\n",
+ " 'Desmin_Nucleus_Intensity_Average', 'Ecad_Cell_Intensity_Average',\n",
+ " 'Ecad_Cytoplasm_Intensity_Average',\n",
+ " 'Ecad_Nucleus_Intensity_Average',\n",
+ " 'Fibronectin_Cell_Intensity_Average',\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average',\n",
+ " 'Fibronectin_Nucleus_Intensity_Average',\n",
+ " 'FOXP3_Cell_Intensity_Average',\n",
+ " 'FOXP3_Cytoplasm_Intensity_Average',\n",
+ " 'FOXP3_Nucleus_Intensity_Average', 'GATA3_Cell_Intensity_Average',\n",
+ " 'GATA3_Cytoplasm_Intensity_Average',\n",
+ " 'GATA3_Nucleus_Intensity_Average', 'HLA_Cell_Intensity_Average',\n",
+ " 'HLA_Cytoplasm_Intensity_Average', 'HLA_Nucleus_Intensity_Average',\n",
+ " 'Ki67_Cell_Intensity_Average', 'Ki67_Cytoplasm_Intensity_Average',\n",
+ " 'Ki67_Nucleus_Intensity_Average', 'MMP9_Cell_Intensity_Average',\n",
+ " 'MMP9_Cytoplasm_Intensity_Average',\n",
+ " 'MMP9_Nucleus_Intensity_Average', 'PD1_Cell_Intensity_Average',\n",
+ " 'PD1_Cytoplasm_Intensity_Average', 'PD1_Nucleus_Intensity_Average',\n",
+ " 'PDGFR_Cell_Intensity_Average',\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average',\n",
+ " 'PDGFR_Nucleus_Intensity_Average', 'PDL1_Cell_Intensity_Average',\n",
+ " 'PDL1_Cytoplasm_Intensity_Average',\n",
+ " 'PDL1_Nucleus_Intensity_Average', 'r5c2_Cell_Intensity_Average',\n",
+ " 'r5c2_Cytoplasm_Intensity_Average',\n",
+ " 'r5c2_Nucleus_Intensity_Average', 'r7c2_Cell_Intensity_Average',\n",
+ " 'r7c2_Cytoplasm_Intensity_Average',\n",
+ " 'r7c2_Nucleus_Intensity_Average', 'r8c2_Cell_Intensity_Average',\n",
+ " 'r8c2_Cytoplasm_Intensity_Average',\n",
+ " 'r8c2_Nucleus_Intensity_Average', 'Sting_Cell_Intensity_Average',\n",
+ " 'Sting_Cytoplasm_Intensity_Average',\n",
+ " 'Sting_Nucleus_Intensity_Average',\n",
+ " 'Vimentin_Cell_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'Vimentin_Nucleus_Intensity_Average', 'cell_type', 'cell_subtype',\n",
+ " 'immune_checkpoint'], dtype=object)"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.columns.values"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "2bc3ca56-ff3e-41c0-9f96-7915611485cd",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Check for NaN entries (should not be any unless columns do not align)\n",
+ "# False means no NaN entries \n",
+ "# True means NaN entries \n",
+ "df.isnull().any().any()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e62d125a-1293-4720-8803-0d66d3ee2f76",
+ "metadata": {},
+ "source": [
+ "## III.4. MARKERS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "id": "86c821eb-a70c-4959-86eb-01f87b915656",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Listing all the markers of interest for downstream analyses\n",
+ "# !!TODO WITH MARILYNE!!\n",
+ "markers = [\n",
+ " '53BP1_Nucleus_Intensity_Average',\n",
+ " 'AR_Nucleus_Intensity_Average',\n",
+ " 'CCNB1_Cell_Intensity_Average',\n",
+ " 'CCND1_Nucleus_Intensity_Average',\n",
+ " 'CCNE_Nucleus_Intensity_Average',\n",
+ " 'CD31_Cytoplasm_Intensity_Average',\n",
+ " 'CKs_Cytoplasm_Intensity_Average',\n",
+ " 'ERa_Nucleus_Intensity_Average',\n",
+ " 'Ecad_Cytoplasm_Intensity_Average',\n",
+ " 'GATA3_Nucleus_Intensity_Average',\n",
+ " 'H3K27_Nucleus_Intensity_Average',\n",
+ " 'H3K4me3_Nucleus_Intensity_Average',\n",
+ " 'HER2_Cytoplasm_Intensity_Average',\n",
+ " 'HSP90_Cell_Intensity_Average',\n",
+ " 'Ki67_Nucleus_Intensity_Average',\n",
+ " 'PAX8_Nucleus_Intensity_Average',\n",
+ " 'PCNA_Nucleus_Intensity_Average',\n",
+ " 'PRg_Nucleus_Intensity_Average',\n",
+ " 'S100b_Cytoplasm_Intensity_Average',\n",
+ " 'TP53_Cell_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'pAKT_Cytoplasm_Intensity_Average',\n",
+ " 'pATM_Nucleus_Intensity_Average',\n",
+ " 'pATR_Nucleus_Intensity_Average',\n",
+ " 'pERK_Cell_Intensity_Average',\n",
+ " 'pRB_Nucleus_Intensity_Average',\n",
+ " 'pS6_Cytoplasm_Intensity_Average',\n",
+ " 'AXL_Cytoplasm_Intensity_Average',\n",
+ " 'B7H4_Cell_Intensity_Average',\n",
+ " 'CD11c_Cytoplasm_Intensity_Average',\n",
+ " 'CD163_Cytoplasm_Intensity_Average',\n",
+ " 'CD20_Cytoplasm_Intensity_Average',\n",
+ " 'CD31_Cytoplasm_Intensity_Average',\n",
+ " 'CD44_Cytoplasm_Intensity_Average',\n",
+ " 'CD45_Cytoplasm_Intensity_Average',\n",
+ " 'CD45b_Cytoplasm_Intensity_Average', \n",
+ " 'CD4_Cytoplasm_Intensity_Average',\n",
+ " 'CD68_Cytoplasm_Intensity_Average',\n",
+ " 'CD8_Cytoplasm_Intensity_Average',\n",
+ " 'CKs_Cytoplasm_Intensity_Average',\n",
+ " 'ColVI_Cytoplasm_Intensity_Average',\n",
+ " 'Desmin_Cytoplasm_Intensity_Average',\n",
+ " 'Ecad_Cytoplasm_Intensity_Average',\n",
+ " 'FOXP3_Nucleus_Intensity_Average',\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average',\n",
+ " 'GATA3_Nucleus_Intensity_Average',\n",
+ " 'HLA_Cytoplasm_Intensity_Average',\n",
+ " 'Ki67_Nucleus_Intensity_Average',\n",
+ " 'MMP9_Cytoplasm_Intensity_Average',\n",
+ " 'PD1_Cytoplasm_Intensity_Average',\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average',\n",
+ " 'PDL1_Cytoplasm_Intensity_Average',\n",
+ " 'Sting_Cytoplasm_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'aSMA_Cytoplasm_Intensity_Average'\n",
+ "]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "3fb24fb3-32e5-4a21-9913-7783a357f73e",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The following columns are not present in the DataFrame (22 columns missing): \n",
+ "['53BP1_Nucleus_Intensity_Average', 'AR_Nucleus_Intensity_Average', 'CCNB1_Cell_Intensity_Average', 'CCND1_Nucleus_Intensity_Average', 'CCNE_Nucleus_Intensity_Average', 'ERa_Nucleus_Intensity_Average', 'H3K27_Nucleus_Intensity_Average', 'H3K4me3_Nucleus_Intensity_Average', 'HER2_Cytoplasm_Intensity_Average', 'HSP90_Cell_Intensity_Average', 'PAX8_Nucleus_Intensity_Average', 'PCNA_Nucleus_Intensity_Average', 'PRg_Nucleus_Intensity_Average', 'S100b_Cytoplasm_Intensity_Average', 'TP53_Cell_Intensity_Average', 'pAKT_Cytoplasm_Intensity_Average', 'pATM_Nucleus_Intensity_Average', 'pATR_Nucleus_Intensity_Average', 'pERK_Cell_Intensity_Average', 'pRB_Nucleus_Intensity_Average', 'pS6_Cytoplasm_Intensity_Average', 'CD45b_Cytoplasm_Intensity_Average']\n",
+ "\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " CD11c_Cytoplasm_Intensity_Average \n",
+ " B7H4_Cell_Intensity_Average \n",
+ " CD68_Cytoplasm_Intensity_Average \n",
+ " CD4_Cytoplasm_Intensity_Average \n",
+ " CD44_Cytoplasm_Intensity_Average \n",
+ " PDGFR_Cytoplasm_Intensity_Average \n",
+ " aSMA_Cytoplasm_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " Fibronectin_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Ki67_Nucleus_Intensity_Average \n",
+ " Sting_Cytoplasm_Intensity_Average \n",
+ " Desmin_Cytoplasm_Intensity_Average \n",
+ " CD31_Cytoplasm_Intensity_Average \n",
+ " PD1_Cytoplasm_Intensity_Average \n",
+ " ColVI_Cytoplasm_Intensity_Average \n",
+ " GATA3_Nucleus_Intensity_Average \n",
+ " Vimentin_Cytoplasm_Intensity_Average \n",
+ " CKs_Cytoplasm_Intensity_Average \n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_0 \n",
+ " 0.183086 \n",
+ " -0.109646 \n",
+ " -0.007868 \n",
+ " -0.060652 \n",
+ " 0.181378 \n",
+ " 0.179445 \n",
+ " 0.225944 \n",
+ " 23.127993 \n",
+ " -0.016142 \n",
+ " -0.002348 \n",
+ " ... \n",
+ " 0.569737 \n",
+ " 1.505413 \n",
+ " -0.710457 \n",
+ " 0.064117 \n",
+ " -0.042649 \n",
+ " -0.285973 \n",
+ " -0.016453 \n",
+ " 8.064129 \n",
+ " 6.736799 \n",
+ " -0.172625 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_1 \n",
+ " 0.300446 \n",
+ " 0.467911 \n",
+ " 0.078235 \n",
+ " 0.014423 \n",
+ " 0.157720 \n",
+ " 0.076214 \n",
+ " 0.101970 \n",
+ " 3.733333 \n",
+ " 0.080869 \n",
+ " 0.200440 \n",
+ " ... \n",
+ " 0.711191 \n",
+ " 2.211345 \n",
+ " -0.259137 \n",
+ " 0.095387 \n",
+ " 0.024518 \n",
+ " -0.089077 \n",
+ " 0.161915 \n",
+ " 0.133691 \n",
+ " 12.466549 \n",
+ " -0.104625 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_2 \n",
+ " 0.261423 \n",
+ " 0.130480 \n",
+ " 0.040497 \n",
+ " 0.050348 \n",
+ " 0.387416 \n",
+ " 0.329509 \n",
+ " 0.466484 \n",
+ " 28.868405 \n",
+ " 0.075090 \n",
+ " 0.119287 \n",
+ " ... \n",
+ " 0.520292 \n",
+ " 2.198314 \n",
+ " -0.548943 \n",
+ " 0.174529 \n",
+ " 0.010638 \n",
+ " 0.164462 \n",
+ " 0.045070 \n",
+ " 22.438442 \n",
+ " 1.152088 \n",
+ " -0.028749 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_3 \n",
+ " 0.161573 \n",
+ " 0.064504 \n",
+ " -0.010307 \n",
+ " 0.002116 \n",
+ " 0.285289 \n",
+ " 0.291479 \n",
+ " 0.318115 \n",
+ " 41.192237 \n",
+ " 0.032175 \n",
+ " 0.063606 \n",
+ " ... \n",
+ " 0.417573 \n",
+ " 0.951068 \n",
+ " -0.819126 \n",
+ " 0.118600 \n",
+ " -0.039049 \n",
+ " -0.124460 \n",
+ " -0.010618 \n",
+ " 7.536326 \n",
+ " 2.129703 \n",
+ " -0.145493 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_4 \n",
+ " 0.302397 \n",
+ " -0.161730 \n",
+ " 0.052735 \n",
+ " -0.030714 \n",
+ " 0.146556 \n",
+ " 0.062800 \n",
+ " 0.161722 \n",
+ " 6.561389 \n",
+ " 0.043548 \n",
+ " 0.187722 \n",
+ " ... \n",
+ " 0.699875 \n",
+ " 1.922095 \n",
+ " -0.430555 \n",
+ " 0.077284 \n",
+ " -0.003968 \n",
+ " -0.158928 \n",
+ " 0.179002 \n",
+ " 3.737342 \n",
+ " 9.608294 \n",
+ " -0.140294 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
5 rows Ć 27 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.183086 \n",
+ "DD3S2_Cell_1 0.300446 \n",
+ "DD3S2_Cell_2 0.261423 \n",
+ "DD3S2_Cell_3 0.161573 \n",
+ "DD3S2_Cell_4 0.302397 \n",
+ "\n",
+ " CD11c_Cytoplasm_Intensity_Average B7H4_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.109646 -0.007868 \n",
+ "DD3S2_Cell_1 0.467911 0.078235 \n",
+ "DD3S2_Cell_2 0.130480 0.040497 \n",
+ "DD3S2_Cell_3 0.064504 -0.010307 \n",
+ "DD3S2_Cell_4 -0.161730 0.052735 \n",
+ "\n",
+ " CD68_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.060652 \n",
+ "DD3S2_Cell_1 0.014423 \n",
+ "DD3S2_Cell_2 0.050348 \n",
+ "DD3S2_Cell_3 0.002116 \n",
+ "DD3S2_Cell_4 -0.030714 \n",
+ "\n",
+ " CD4_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.181378 \n",
+ "DD3S2_Cell_1 0.157720 \n",
+ "DD3S2_Cell_2 0.387416 \n",
+ "DD3S2_Cell_3 0.285289 \n",
+ "DD3S2_Cell_4 0.146556 \n",
+ "\n",
+ " CD44_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.179445 \n",
+ "DD3S2_Cell_1 0.076214 \n",
+ "DD3S2_Cell_2 0.329509 \n",
+ "DD3S2_Cell_3 0.291479 \n",
+ "DD3S2_Cell_4 0.062800 \n",
+ "\n",
+ " PDGFR_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.225944 \n",
+ "DD3S2_Cell_1 0.101970 \n",
+ "DD3S2_Cell_2 0.466484 \n",
+ "DD3S2_Cell_3 0.318115 \n",
+ "DD3S2_Cell_4 0.161722 \n",
+ "\n",
+ " aSMA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 23.127993 \n",
+ "DD3S2_Cell_1 3.733333 \n",
+ "DD3S2_Cell_2 28.868405 \n",
+ "DD3S2_Cell_3 41.192237 \n",
+ "DD3S2_Cell_4 6.561389 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.016142 \n",
+ "DD3S2_Cell_1 0.080869 \n",
+ "DD3S2_Cell_2 0.075090 \n",
+ "DD3S2_Cell_3 0.032175 \n",
+ "DD3S2_Cell_4 0.043548 \n",
+ "\n",
+ " Fibronectin_Cytoplasm_Intensity_Average ... \\\n",
+ "ID ... \n",
+ "DD3S2_Cell_0 -0.002348 ... \n",
+ "DD3S2_Cell_1 0.200440 ... \n",
+ "DD3S2_Cell_2 0.119287 ... \n",
+ "DD3S2_Cell_3 0.063606 ... \n",
+ "DD3S2_Cell_4 0.187722 ... \n",
+ "\n",
+ " Ki67_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.569737 \n",
+ "DD3S2_Cell_1 0.711191 \n",
+ "DD3S2_Cell_2 0.520292 \n",
+ "DD3S2_Cell_3 0.417573 \n",
+ "DD3S2_Cell_4 0.699875 \n",
+ "\n",
+ " Sting_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 1.505413 \n",
+ "DD3S2_Cell_1 2.211345 \n",
+ "DD3S2_Cell_2 2.198314 \n",
+ "DD3S2_Cell_3 0.951068 \n",
+ "DD3S2_Cell_4 1.922095 \n",
+ "\n",
+ " Desmin_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.710457 \n",
+ "DD3S2_Cell_1 -0.259137 \n",
+ "DD3S2_Cell_2 -0.548943 \n",
+ "DD3S2_Cell_3 -0.819126 \n",
+ "DD3S2_Cell_4 -0.430555 \n",
+ "\n",
+ " CD31_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.064117 \n",
+ "DD3S2_Cell_1 0.095387 \n",
+ "DD3S2_Cell_2 0.174529 \n",
+ "DD3S2_Cell_3 0.118600 \n",
+ "DD3S2_Cell_4 0.077284 \n",
+ "\n",
+ " PD1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.042649 \n",
+ "DD3S2_Cell_1 0.024518 \n",
+ "DD3S2_Cell_2 0.010638 \n",
+ "DD3S2_Cell_3 -0.039049 \n",
+ "DD3S2_Cell_4 -0.003968 \n",
+ "\n",
+ " ColVI_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.285973 \n",
+ "DD3S2_Cell_1 -0.089077 \n",
+ "DD3S2_Cell_2 0.164462 \n",
+ "DD3S2_Cell_3 -0.124460 \n",
+ "DD3S2_Cell_4 -0.158928 \n",
+ "\n",
+ " GATA3_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.016453 \n",
+ "DD3S2_Cell_1 0.161915 \n",
+ "DD3S2_Cell_2 0.045070 \n",
+ "DD3S2_Cell_3 -0.010618 \n",
+ "DD3S2_Cell_4 0.179002 \n",
+ "\n",
+ " Vimentin_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 8.064129 \n",
+ "DD3S2_Cell_1 0.133691 \n",
+ "DD3S2_Cell_2 22.438442 \n",
+ "DD3S2_Cell_3 7.536326 \n",
+ "DD3S2_Cell_4 3.737342 \n",
+ "\n",
+ " CKs_Cytoplasm_Intensity_Average AXL_Cytoplasm_Intensity_Average \n",
+ "ID \n",
+ "DD3S2_Cell_0 6.736799 -0.172625 \n",
+ "DD3S2_Cell_1 12.466549 -0.104625 \n",
+ "DD3S2_Cell_2 1.152088 -0.028749 \n",
+ "DD3S2_Cell_3 2.129703 -0.145493 \n",
+ "DD3S2_Cell_4 9.608294 -0.140294 \n",
+ "\n",
+ "[5 rows x 27 columns]"
+ ]
+ },
+ "execution_count": 35,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Check if all columns in the markers list are present in the DataFrame\n",
+ "missing_columns = [col for col in markers if col not in df.columns]\n",
+ "if missing_columns:\n",
+ " # If columns are missing that can be because the markers may be present in the other slide\n",
+ " print(f\"The following columns are not present in the DataFrame ({len(missing_columns)} columns missing): \\n{missing_columns}\\n\")\n",
+ " # Filter the DataFrame to keep only the columns that are in the markers list and also exist in the DataFrame\n",
+ " intersected_columns = list(set(markers).intersection(df.columns))\n",
+ " df_markers = df[intersected_columns]\n",
+ "else:\n",
+ " # Filter the DataFrame to keep only the columns in the markers list\n",
+ " df_markers = df[markers]\n",
+ "\n",
+ "df_markers.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "id": "4d63bf5f-3bc6-4d19-8e8f-2cdf639c3bd6",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['PDL1_Cytoplasm_Intensity_Average',\n",
+ " 'CD11c_Cytoplasm_Intensity_Average', 'B7H4_Cell_Intensity_Average',\n",
+ " 'CD68_Cytoplasm_Intensity_Average',\n",
+ " 'CD4_Cytoplasm_Intensity_Average',\n",
+ " 'CD44_Cytoplasm_Intensity_Average',\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average',\n",
+ " 'aSMA_Cytoplasm_Intensity_Average',\n",
+ " 'CD163_Cytoplasm_Intensity_Average',\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average',\n",
+ " 'CD8_Cytoplasm_Intensity_Average',\n",
+ " 'Ecad_Cytoplasm_Intensity_Average',\n",
+ " 'FOXP3_Nucleus_Intensity_Average',\n",
+ " 'CD20_Cytoplasm_Intensity_Average',\n",
+ " 'HLA_Cytoplasm_Intensity_Average',\n",
+ " 'CD45_Cytoplasm_Intensity_Average',\n",
+ " 'MMP9_Cytoplasm_Intensity_Average',\n",
+ " 'Ki67_Nucleus_Intensity_Average',\n",
+ " 'Sting_Cytoplasm_Intensity_Average',\n",
+ " 'Desmin_Cytoplasm_Intensity_Average',\n",
+ " 'CD31_Cytoplasm_Intensity_Average',\n",
+ " 'PD1_Cytoplasm_Intensity_Average',\n",
+ " 'ColVI_Cytoplasm_Intensity_Average',\n",
+ " 'GATA3_Nucleus_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'CKs_Cytoplasm_Intensity_Average',\n",
+ " 'AXL_Cytoplasm_Intensity_Average'], dtype=object)"
+ ]
+ },
+ "execution_count": 36,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Rename CD45b into CD45 (Slide A!)\n",
+ "if project_name == 'Slide_A' :\n",
+ " df_markers.rename(columns={\"CD45b_Cytoplasm_Intensity_Average\": \"CD45_Cytoplasm_Intensity_Average\"}, inplace=True)\n",
+ "df_markers.columns.values"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "0e0ea1a5-8e6f-4475-a75f-c3f2fbe6faa6",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(341938, 27)"
+ ]
+ },
+ "execution_count": 37,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_markers.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "4351a81a-30f6-4878-be4d-d2a1436bb18c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[-0.9338211263020836,\n",
+ " -0.8475121256510417,\n",
+ " -0.5234746093749999,\n",
+ " -0.7297129720052083,\n",
+ " -1.2201360677083333,\n",
+ " -1.0585365397135418,\n",
+ " -0.7113063151041668,\n",
+ " -8.014408569335938,\n",
+ " -1.4501634114583335,\n",
+ " -0.910650634765625,\n",
+ " -1.238843587239583,\n",
+ " -0.0288550618489584,\n",
+ " -0.9764022623697918,\n",
+ " -0.1649319661458335,\n",
+ " -1.9483092447916663,\n",
+ " -0.2165327148437499,\n",
+ " -1.4945714518229165,\n",
+ " 0.0681667887369792,\n",
+ " -1.1650885416666663,\n",
+ " -12.347664388020831,\n",
+ " -0.7537534790039063,\n",
+ " -1.570408203125,\n",
+ " -10.08868896484375,\n",
+ " -0.2946448567708331,\n",
+ " -10.01797119140625,\n",
+ " -11.341695353190104,\n",
+ " -0.90746337890625]"
+ ]
+ },
+ "execution_count": 38,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "min_values = df_markers.min().tolist()\n",
+ "min_values"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "id": "a7d19ce3-0770-4987-9af5-03a3dcb62b2c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Keep not_intensities and markers columns\n",
+ "# Combine both lists\n",
+ "combined_columns = list(set(markers) | set(not_intensities))\n",
+ "\n",
+ "# Filter the DataFrame to keep only the combined columns present in both df and combined_columns\n",
+ "df_markers_not_intensities = df[df.columns.intersection(combined_columns)]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "cfc45faf-f38a-4366-86e7-979f3837b6e8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Nuc_X \n",
+ " Sample_ID \n",
+ " Nucleus_Roundness \n",
+ " Nuc_Y_Inv \n",
+ " ROI_index \n",
+ " Cell_Size \n",
+ " Nucleus_Size \n",
+ " aSMA_Cytoplasm_Intensity_Average \n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ " B7H4_Cell_Intensity_Average \n",
+ " ... \n",
+ " Ki67_Nucleus_Intensity_Average \n",
+ " MMP9_Cytoplasm_Intensity_Average \n",
+ " PD1_Cytoplasm_Intensity_Average \n",
+ " PDGFR_Cytoplasm_Intensity_Average \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " Sting_Cytoplasm_Intensity_Average \n",
+ " Vimentin_Cytoplasm_Intensity_Average \n",
+ " cell_type \n",
+ " cell_subtype \n",
+ " immune_checkpoint \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_0 \n",
+ " 2033.197510 \n",
+ " DD3S2.csv \n",
+ " 0.792312 \n",
+ " 15494.777344 \n",
+ " 0 \n",
+ " 307 \n",
+ " 81 \n",
+ " 23.127993 \n",
+ " -0.172625 \n",
+ " -0.007868 \n",
+ " ... \n",
+ " 0.569737 \n",
+ " -0.054124 \n",
+ " -0.042649 \n",
+ " 0.225944 \n",
+ " 0.183086 \n",
+ " 1.505413 \n",
+ " 8.064129 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_1 \n",
+ " 2101.638184 \n",
+ " DD3S2.csv \n",
+ " 0.749236 \n",
+ " 15495.552734 \n",
+ " 0 \n",
+ " 159 \n",
+ " 47 \n",
+ " 3.733333 \n",
+ " -0.104625 \n",
+ " 0.078235 \n",
+ " ... \n",
+ " 0.711191 \n",
+ " 0.031119 \n",
+ " 0.024518 \n",
+ " 0.101970 \n",
+ " 0.300446 \n",
+ " 2.211345 \n",
+ " 0.133691 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_2 \n",
+ " 2008.148193 \n",
+ " DD3S2.csv \n",
+ " 0.835324 \n",
+ " 15492.370117 \n",
+ " 0 \n",
+ " 267 \n",
+ " 81 \n",
+ " 28.868405 \n",
+ " -0.028749 \n",
+ " 0.040497 \n",
+ " ... \n",
+ " 0.520292 \n",
+ " 0.013989 \n",
+ " 0.010638 \n",
+ " 0.466484 \n",
+ " 0.261423 \n",
+ " 2.198314 \n",
+ " 22.438442 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_3 \n",
+ " 1992.441162 \n",
+ " DD3S2.csv \n",
+ " 0.671957 \n",
+ " 15489.808594 \n",
+ " 0 \n",
+ " 293 \n",
+ " 68 \n",
+ " 41.192237 \n",
+ " -0.145493 \n",
+ " -0.010307 \n",
+ " ... \n",
+ " 0.417573 \n",
+ " -0.017410 \n",
+ " -0.039049 \n",
+ " 0.318115 \n",
+ " 0.161573 \n",
+ " 0.951068 \n",
+ " 7.536326 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_4 \n",
+ " 2092.007080 \n",
+ " DD3S2.csv \n",
+ " 0.710829 \n",
+ " 15488.482422 \n",
+ " 0 \n",
+ " 225 \n",
+ " 141 \n",
+ " 6.561389 \n",
+ " -0.140294 \n",
+ " 0.052735 \n",
+ " ... \n",
+ " 0.699875 \n",
+ " 0.001389 \n",
+ " -0.003968 \n",
+ " 0.161722 \n",
+ " 0.302397 \n",
+ " 1.922095 \n",
+ " 3.737342 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138967 \n",
+ " 14827.791992 \n",
+ " DD3S3.csv \n",
+ " 0.921498 \n",
+ " 1648.513916 \n",
+ " 63 \n",
+ " 318 \n",
+ " 72 \n",
+ " -2.829689 \n",
+ " -0.316496 \n",
+ " -0.291786 \n",
+ " ... \n",
+ " 0.802662 \n",
+ " -0.068195 \n",
+ " -0.087062 \n",
+ " -0.201317 \n",
+ " 0.114778 \n",
+ " 0.673324 \n",
+ " -3.891558 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138968 \n",
+ " 14520.892578 \n",
+ " DD3S3.csv \n",
+ " 0.740617 \n",
+ " 1642.884644 \n",
+ " 63 \n",
+ " 309 \n",
+ " 130 \n",
+ " 10.666499 \n",
+ " 0.079829 \n",
+ " 0.158183 \n",
+ " ... \n",
+ " 3.596646 \n",
+ " 0.102268 \n",
+ " 0.131940 \n",
+ " 0.800220 \n",
+ " 1.348149 \n",
+ " 5.238821 \n",
+ " 22.863111 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138969 \n",
+ " 14528.000000 \n",
+ " DD3S3.csv \n",
+ " 0.694157 \n",
+ " 1640.038452 \n",
+ " 63 \n",
+ " 155 \n",
+ " 52 \n",
+ " 8.390907 \n",
+ " 0.051903 \n",
+ " 0.158396 \n",
+ " ... \n",
+ " 3.006776 \n",
+ " 0.098123 \n",
+ " 0.203340 \n",
+ " 0.624563 \n",
+ " 1.102123 \n",
+ " 5.399366 \n",
+ " 26.146441 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138970 \n",
+ " 14553.461914 \n",
+ " DD3S3.csv \n",
+ " 0.821441 \n",
+ " 1629.507690 \n",
+ " 63 \n",
+ " 243 \n",
+ " 65 \n",
+ " 16.200505 \n",
+ " 0.180491 \n",
+ " 0.051547 \n",
+ " ... \n",
+ " 1.706959 \n",
+ " 0.033674 \n",
+ " 0.068232 \n",
+ " 0.742682 \n",
+ " 0.888573 \n",
+ " 5.667290 \n",
+ " 33.745450 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138971 \n",
+ " 14543.513672 \n",
+ " DD3S3.csv \n",
+ " 0.816589 \n",
+ " 1628.541626 \n",
+ " 63 \n",
+ " 193 \n",
+ " 72 \n",
+ " 13.525318 \n",
+ " 0.097702 \n",
+ " 0.165548 \n",
+ " ... \n",
+ " 5.402329 \n",
+ " 0.085251 \n",
+ " 0.201504 \n",
+ " 1.100634 \n",
+ " 1.284419 \n",
+ " 4.288573 \n",
+ " 14.974078 \n",
+ " none \n",
+ " none \n",
+ " none \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
341938 rows Ć 37 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Nuc_X Sample_ID Nucleus_Roundness Nuc_Y_Inv \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 2033.197510 DD3S2.csv 0.792312 15494.777344 \n",
+ "DD3S2_Cell_1 2101.638184 DD3S2.csv 0.749236 15495.552734 \n",
+ "DD3S2_Cell_2 2008.148193 DD3S2.csv 0.835324 15492.370117 \n",
+ "DD3S2_Cell_3 1992.441162 DD3S2.csv 0.671957 15489.808594 \n",
+ "DD3S2_Cell_4 2092.007080 DD3S2.csv 0.710829 15488.482422 \n",
+ "... ... ... ... ... \n",
+ "DD3S3_Cell_138967 14827.791992 DD3S3.csv 0.921498 1648.513916 \n",
+ "DD3S3_Cell_138968 14520.892578 DD3S3.csv 0.740617 1642.884644 \n",
+ "DD3S3_Cell_138969 14528.000000 DD3S3.csv 0.694157 1640.038452 \n",
+ "DD3S3_Cell_138970 14553.461914 DD3S3.csv 0.821441 1629.507690 \n",
+ "DD3S3_Cell_138971 14543.513672 DD3S3.csv 0.816589 1628.541626 \n",
+ "\n",
+ " ROI_index Cell_Size Nucleus_Size \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0 307 81 \n",
+ "DD3S2_Cell_1 0 159 47 \n",
+ "DD3S2_Cell_2 0 267 81 \n",
+ "DD3S2_Cell_3 0 293 68 \n",
+ "DD3S2_Cell_4 0 225 141 \n",
+ "... ... ... ... \n",
+ "DD3S3_Cell_138967 63 318 72 \n",
+ "DD3S3_Cell_138968 63 309 130 \n",
+ "DD3S3_Cell_138969 63 155 52 \n",
+ "DD3S3_Cell_138970 63 243 65 \n",
+ "DD3S3_Cell_138971 63 193 72 \n",
+ "\n",
+ " aSMA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 23.127993 \n",
+ "DD3S2_Cell_1 3.733333 \n",
+ "DD3S2_Cell_2 28.868405 \n",
+ "DD3S2_Cell_3 41.192237 \n",
+ "DD3S2_Cell_4 6.561389 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -2.829689 \n",
+ "DD3S3_Cell_138968 10.666499 \n",
+ "DD3S3_Cell_138969 8.390907 \n",
+ "DD3S3_Cell_138970 16.200505 \n",
+ "DD3S3_Cell_138971 13.525318 \n",
+ "\n",
+ " AXL_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.172625 \n",
+ "DD3S2_Cell_1 -0.104625 \n",
+ "DD3S2_Cell_2 -0.028749 \n",
+ "DD3S2_Cell_3 -0.145493 \n",
+ "DD3S2_Cell_4 -0.140294 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -0.316496 \n",
+ "DD3S3_Cell_138968 0.079829 \n",
+ "DD3S3_Cell_138969 0.051903 \n",
+ "DD3S3_Cell_138970 0.180491 \n",
+ "DD3S3_Cell_138971 0.097702 \n",
+ "\n",
+ " B7H4_Cell_Intensity_Average ... \\\n",
+ "ID ... \n",
+ "DD3S2_Cell_0 -0.007868 ... \n",
+ "DD3S2_Cell_1 0.078235 ... \n",
+ "DD3S2_Cell_2 0.040497 ... \n",
+ "DD3S2_Cell_3 -0.010307 ... \n",
+ "DD3S2_Cell_4 0.052735 ... \n",
+ "... ... ... \n",
+ "DD3S3_Cell_138967 -0.291786 ... \n",
+ "DD3S3_Cell_138968 0.158183 ... \n",
+ "DD3S3_Cell_138969 0.158396 ... \n",
+ "DD3S3_Cell_138970 0.051547 ... \n",
+ "DD3S3_Cell_138971 0.165548 ... \n",
+ "\n",
+ " Ki67_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.569737 \n",
+ "DD3S2_Cell_1 0.711191 \n",
+ "DD3S2_Cell_2 0.520292 \n",
+ "DD3S2_Cell_3 0.417573 \n",
+ "DD3S2_Cell_4 0.699875 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 0.802662 \n",
+ "DD3S3_Cell_138968 3.596646 \n",
+ "DD3S3_Cell_138969 3.006776 \n",
+ "DD3S3_Cell_138970 1.706959 \n",
+ "DD3S3_Cell_138971 5.402329 \n",
+ "\n",
+ " MMP9_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.054124 \n",
+ "DD3S2_Cell_1 0.031119 \n",
+ "DD3S2_Cell_2 0.013989 \n",
+ "DD3S2_Cell_3 -0.017410 \n",
+ "DD3S2_Cell_4 0.001389 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -0.068195 \n",
+ "DD3S3_Cell_138968 0.102268 \n",
+ "DD3S3_Cell_138969 0.098123 \n",
+ "DD3S3_Cell_138970 0.033674 \n",
+ "DD3S3_Cell_138971 0.085251 \n",
+ "\n",
+ " PD1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.042649 \n",
+ "DD3S2_Cell_1 0.024518 \n",
+ "DD3S2_Cell_2 0.010638 \n",
+ "DD3S2_Cell_3 -0.039049 \n",
+ "DD3S2_Cell_4 -0.003968 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -0.087062 \n",
+ "DD3S3_Cell_138968 0.131940 \n",
+ "DD3S3_Cell_138969 0.203340 \n",
+ "DD3S3_Cell_138970 0.068232 \n",
+ "DD3S3_Cell_138971 0.201504 \n",
+ "\n",
+ " PDGFR_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.225944 \n",
+ "DD3S2_Cell_1 0.101970 \n",
+ "DD3S2_Cell_2 0.466484 \n",
+ "DD3S2_Cell_3 0.318115 \n",
+ "DD3S2_Cell_4 0.161722 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -0.201317 \n",
+ "DD3S3_Cell_138968 0.800220 \n",
+ "DD3S3_Cell_138969 0.624563 \n",
+ "DD3S3_Cell_138970 0.742682 \n",
+ "DD3S3_Cell_138971 1.100634 \n",
+ "\n",
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.183086 \n",
+ "DD3S2_Cell_1 0.300446 \n",
+ "DD3S2_Cell_2 0.261423 \n",
+ "DD3S2_Cell_3 0.161573 \n",
+ "DD3S2_Cell_4 0.302397 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 0.114778 \n",
+ "DD3S3_Cell_138968 1.348149 \n",
+ "DD3S3_Cell_138969 1.102123 \n",
+ "DD3S3_Cell_138970 0.888573 \n",
+ "DD3S3_Cell_138971 1.284419 \n",
+ "\n",
+ " Sting_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 1.505413 \n",
+ "DD3S2_Cell_1 2.211345 \n",
+ "DD3S2_Cell_2 2.198314 \n",
+ "DD3S2_Cell_3 0.951068 \n",
+ "DD3S2_Cell_4 1.922095 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 0.673324 \n",
+ "DD3S3_Cell_138968 5.238821 \n",
+ "DD3S3_Cell_138969 5.399366 \n",
+ "DD3S3_Cell_138970 5.667290 \n",
+ "DD3S3_Cell_138971 4.288573 \n",
+ "\n",
+ " Vimentin_Cytoplasm_Intensity_Average cell_type \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 8.064129 none \n",
+ "DD3S2_Cell_1 0.133691 none \n",
+ "DD3S2_Cell_2 22.438442 none \n",
+ "DD3S2_Cell_3 7.536326 none \n",
+ "DD3S2_Cell_4 3.737342 none \n",
+ "... ... ... \n",
+ "DD3S3_Cell_138967 -3.891558 none \n",
+ "DD3S3_Cell_138968 22.863111 none \n",
+ "DD3S3_Cell_138969 26.146441 none \n",
+ "DD3S3_Cell_138970 33.745450 none \n",
+ "DD3S3_Cell_138971 14.974078 none \n",
+ "\n",
+ " cell_subtype immune_checkpoint \n",
+ "ID \n",
+ "DD3S2_Cell_0 none none \n",
+ "DD3S2_Cell_1 none none \n",
+ "DD3S2_Cell_2 none none \n",
+ "DD3S2_Cell_3 none none \n",
+ "DD3S2_Cell_4 none none \n",
+ "... ... ... \n",
+ "DD3S3_Cell_138967 none none \n",
+ "DD3S3_Cell_138968 none none \n",
+ "DD3S3_Cell_138969 none none \n",
+ "DD3S3_Cell_138970 none none \n",
+ "DD3S3_Cell_138971 none none \n",
+ "\n",
+ "[341938 rows x 37 columns]"
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_markers_not_intensities"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "45daa61f-0e4e-46eb-93d5-886ded05cb1e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(341938, 37)"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_markers_not_intensities.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "808eda4e-a18b-4d78-b6cc-9f9210faab82",
+ "metadata": {},
+ "source": [
+ "## III.5. NORMALISATION"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "id": "386ae099-83fd-47a6-b3ff-342fcf913d7f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[-0.9338211263020836,\n",
+ " -0.8475121256510417,\n",
+ " -0.5234746093749999,\n",
+ " -0.7297129720052083,\n",
+ " -1.2201360677083333,\n",
+ " -1.0585365397135418,\n",
+ " -0.7113063151041668,\n",
+ " -8.014408569335938,\n",
+ " -1.4501634114583335,\n",
+ " -0.910650634765625,\n",
+ " -1.238843587239583,\n",
+ " -0.0288550618489584,\n",
+ " -0.9764022623697918,\n",
+ " -0.1649319661458335,\n",
+ " -1.9483092447916663,\n",
+ " -0.2165327148437499,\n",
+ " -1.4945714518229165,\n",
+ " 0.0681667887369792,\n",
+ " -1.1650885416666663,\n",
+ " -12.347664388020831,\n",
+ " -0.7537534790039063,\n",
+ " -1.570408203125,\n",
+ " -10.08868896484375,\n",
+ " -0.2946448567708331,\n",
+ " -10.01797119140625,\n",
+ " -11.341695353190104,\n",
+ " -0.90746337890625]"
+ ]
+ },
+ "execution_count": 42,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_markers.min().tolist()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "id": "1a6e062c-b27a-4c16-b796-9e26c58a7ec7",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "df_marker.shape before normalisation: (341938, 27)\n",
+ "min value = -12.347664388020831\n",
+ "df_markers.shape after normalisation: (341938, 27)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "[12.413843261718748,\n",
+ " 12.50015226236979,\n",
+ " 12.824189778645831,\n",
+ " 12.617951416015623,\n",
+ " 12.127528320312498,\n",
+ " 12.28912784830729,\n",
+ " 12.636358072916664,\n",
+ " 5.3332558186848935,\n",
+ " 11.897500976562497,\n",
+ " 12.437013753255206,\n",
+ " 12.108820800781249,\n",
+ " 13.318809326171873,\n",
+ " 12.37126212565104,\n",
+ " 13.182732421874999,\n",
+ " 11.399355143229165,\n",
+ " 13.131131673177082,\n",
+ " 11.853092936197914,\n",
+ " 13.415831176757811,\n",
+ " 12.182575846354165,\n",
+ " 1.0,\n",
+ " 12.593910909016925,\n",
+ " 11.777256184895831,\n",
+ " 3.258975423177082,\n",
+ " 13.053019531249998,\n",
+ " 3.3296931966145813,\n",
+ " 2.005969034830727,\n",
+ " 12.440201009114581]"
+ ]
+ },
+ "execution_count": 43,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# LOG2 TRANFORMATION\n",
+ "#Values need to be higher than 0 for Log2 transformation.\n",
+ "\n",
+ "print(\"df_marker.shape before normalisation: \", df_markers.shape)\n",
+ "\n",
+ "# Option 1\n",
+ "# This step might not be the best approach because in creates pattern in the data.\n",
+ "# set anything that is below 0 to 0, so that we can do the log transform, +1 to all columns\n",
+ "#for f in df_markers.columns[~df_markers.columns.isin(not_intensities)]:\n",
+ " #df_markers.loc[df_markers[f] < 0,f] = 0\n",
+ " \n",
+ "\n",
+ "# Option 2\n",
+ "# Add the min from min values (from above) +1 to all columns\n",
+ "#df_markers.loc[:, ~df_markers.columns.isin(not_intensities)] = \\\n",
+ " #df_markers.loc[:,~df_markers.columns.isin(not_intensities)].copy() + 1 \n",
+ "# Add the minimum value + 1 to each column\n",
+ "# OR\n",
+ "min_value = df_markers.min().min()\n",
+ "print(\"min value = \", min_value)\n",
+ "df_markers = df_markers + (np.abs(min_value))\n",
+ "\n",
+ "\n",
+ "# +1\n",
+ "df_markers = df_markers + 1\n",
+ "print(\"df_markers.shape after normalisation: \", df_markers.shape)\n",
+ "df_markers.min().tolist()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "id": "25493174-665c-406c-acb2-cd27b9a4b025",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "log2 transform finished\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " CD11c_Cytoplasm_Intensity_Average \n",
+ " B7H4_Cell_Intensity_Average \n",
+ " CD68_Cytoplasm_Intensity_Average \n",
+ " CD4_Cytoplasm_Intensity_Average \n",
+ " CD44_Cytoplasm_Intensity_Average \n",
+ " PDGFR_Cytoplasm_Intensity_Average \n",
+ " aSMA_Cytoplasm_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " Fibronectin_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Ki67_Nucleus_Intensity_Average \n",
+ " Sting_Cytoplasm_Intensity_Average \n",
+ " Desmin_Cytoplasm_Intensity_Average \n",
+ " CD31_Cytoplasm_Intensity_Average \n",
+ " PD1_Cytoplasm_Intensity_Average \n",
+ " ColVI_Cytoplasm_Intensity_Average \n",
+ " GATA3_Nucleus_Intensity_Average \n",
+ " Vimentin_Cytoplasm_Intensity_Average \n",
+ " CKs_Cytoplasm_Intensity_Average \n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_0 \n",
+ " 3.758170 \n",
+ " 3.726615 \n",
+ " 3.737665 \n",
+ " 3.731945 \n",
+ " 3.757988 \n",
+ " 3.757782 \n",
+ " 3.762732 \n",
+ " 5.188862 \n",
+ " 3.736770 \n",
+ " 3.738262 \n",
+ " ... \n",
+ " 3.798818 \n",
+ " 3.892690 \n",
+ " 3.659606 \n",
+ " 3.745429 \n",
+ " 3.733898 \n",
+ " 3.707270 \n",
+ " 3.736736 \n",
+ " 4.420334 \n",
+ " 4.328008 \n",
+ " 3.719735 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_1 \n",
+ " 3.770629 \n",
+ " 3.788224 \n",
+ " 3.746947 \n",
+ " 3.740073 \n",
+ " 3.755463 \n",
+ " 3.746730 \n",
+ " 3.749495 \n",
+ " 4.094320 \n",
+ " 3.747230 \n",
+ " 3.760019 \n",
+ " ... \n",
+ " 3.813407 \n",
+ " 3.959678 \n",
+ " 3.710231 \n",
+ " 3.748789 \n",
+ " 3.741163 \n",
+ " 3.728855 \n",
+ " 3.755911 \n",
+ " 3.752894 \n",
+ " 4.690094 \n",
+ " 3.727162 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_2 \n",
+ " 3.766498 \n",
+ " 3.752550 \n",
+ " 3.742886 \n",
+ " 3.743947 \n",
+ " 3.779793 \n",
+ " 3.773698 \n",
+ " 3.788075 \n",
+ " 5.399720 \n",
+ " 3.746609 \n",
+ " 3.751351 \n",
+ " ... \n",
+ " 3.793683 \n",
+ " 3.958469 \n",
+ " 3.677928 \n",
+ " 3.757257 \n",
+ " 3.739665 \n",
+ " 3.756183 \n",
+ " 3.743379 \n",
+ " 5.161328 \n",
+ " 3.857956 \n",
+ " 3.735405 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_3 \n",
+ " 3.755874 \n",
+ " 3.745471 \n",
+ " 3.737401 \n",
+ " 3.738744 \n",
+ " 3.769026 \n",
+ " 3.769681 \n",
+ " 3.772496 \n",
+ " 5.769240 \n",
+ " 3.741989 \n",
+ " 3.745374 \n",
+ " ... \n",
+ " 3.782958 \n",
+ " 3.837815 \n",
+ " 3.647146 \n",
+ " 3.751278 \n",
+ " 3.734289 \n",
+ " 3.725000 \n",
+ " 3.737367 \n",
+ " 4.384325 \n",
+ " 3.952088 \n",
+ " 3.722703 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_4 \n",
+ " 3.770836 \n",
+ " 3.720928 \n",
+ " 3.744204 \n",
+ " 3.735192 \n",
+ " 3.754270 \n",
+ " 3.745287 \n",
+ " 3.755890 \n",
+ " 4.315353 \n",
+ " 3.743215 \n",
+ " 3.758664 \n",
+ " ... \n",
+ " 3.812246 \n",
+ " 3.932605 \n",
+ " 3.691211 \n",
+ " 3.746845 \n",
+ " 3.738086 \n",
+ " 3.721234 \n",
+ " 3.757734 \n",
+ " 4.094659 \n",
+ " 4.520797 \n",
+ " 3.723271 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138967 \n",
+ " 3.750868 \n",
+ " 3.707101 \n",
+ " 3.706628 \n",
+ " 3.710848 \n",
+ " 4.302837 \n",
+ " 3.743908 \n",
+ " 3.716590 \n",
+ " 3.394785 \n",
+ " 3.737397 \n",
+ " 3.733490 \n",
+ " ... \n",
+ " 3.822763 \n",
+ " 3.809516 \n",
+ " 3.104181 \n",
+ " 3.841043 \n",
+ " 3.729074 \n",
+ " 4.236746 \n",
+ " 3.760684 \n",
+ " 3.241246 \n",
+ " 3.210896 \n",
+ " 3.703895 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138968 \n",
+ " 3.877333 \n",
+ " 3.785992 \n",
+ " 3.755512 \n",
+ " 3.801541 \n",
+ " 3.920946 \n",
+ " 3.893987 \n",
+ " 3.822514 \n",
+ " 4.585814 \n",
+ " 3.871388 \n",
+ " 3.813215 \n",
+ " ... \n",
+ " 4.082729 \n",
+ " 4.216182 \n",
+ " 3.907466 \n",
+ " 3.794135 \n",
+ " 3.752706 \n",
+ " 3.730219 \n",
+ " 3.776056 \n",
+ " 5.178347 \n",
+ " 4.137659 \n",
+ " 3.747118 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138969 \n",
+ " 3.852976 \n",
+ " 3.783950 \n",
+ " 3.755535 \n",
+ " 3.809775 \n",
+ " 3.898005 \n",
+ " 3.802692 \n",
+ " 3.804490 \n",
+ " 4.442185 \n",
+ " 3.823960 \n",
+ " 3.811463 \n",
+ " ... \n",
+ " 4.031610 \n",
+ " 4.228590 \n",
+ " 3.874268 \n",
+ " 3.778591 \n",
+ " 3.760328 \n",
+ " 3.734028 \n",
+ " 3.780450 \n",
+ " 5.303565 \n",
+ " 4.063099 \n",
+ " 3.744115 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138970 \n",
+ " 3.831496 \n",
+ " 3.758385 \n",
+ " 3.744076 \n",
+ " 3.751376 \n",
+ " 3.871842 \n",
+ " 3.842041 \n",
+ " 3.816635 \n",
+ " 4.884997 \n",
+ " 3.785072 \n",
+ " 3.799217 \n",
+ " ... \n",
+ " 3.912135 \n",
+ " 4.249063 \n",
+ " 3.743587 \n",
+ " 3.939331 \n",
+ " 3.745872 \n",
+ " 3.857894 \n",
+ " 3.776723 \n",
+ " 5.557444 \n",
+ " 3.923955 \n",
+ " 3.757893 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138971 \n",
+ " 3.871063 \n",
+ " 3.786428 \n",
+ " 3.756299 \n",
+ " 3.774249 \n",
+ " 3.976772 \n",
+ " 3.927563 \n",
+ " 3.852828 \n",
+ " 4.748085 \n",
+ " 3.799142 \n",
+ " 3.836915 \n",
+ " ... \n",
+ " 4.228818 \n",
+ " 4.140471 \n",
+ " 3.917669 \n",
+ " 3.798172 \n",
+ " 3.760132 \n",
+ " 3.816358 \n",
+ " 3.800749 \n",
+ " 4.823838 \n",
+ " 4.040701 \n",
+ " 3.749037 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
341938 rows Ć 27 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.758170 \n",
+ "DD3S2_Cell_1 3.770629 \n",
+ "DD3S2_Cell_2 3.766498 \n",
+ "DD3S2_Cell_3 3.755874 \n",
+ "DD3S2_Cell_4 3.770836 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.750868 \n",
+ "DD3S3_Cell_138968 3.877333 \n",
+ "DD3S3_Cell_138969 3.852976 \n",
+ "DD3S3_Cell_138970 3.831496 \n",
+ "DD3S3_Cell_138971 3.871063 \n",
+ "\n",
+ " CD11c_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.726615 \n",
+ "DD3S2_Cell_1 3.788224 \n",
+ "DD3S2_Cell_2 3.752550 \n",
+ "DD3S2_Cell_3 3.745471 \n",
+ "DD3S2_Cell_4 3.720928 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.707101 \n",
+ "DD3S3_Cell_138968 3.785992 \n",
+ "DD3S3_Cell_138969 3.783950 \n",
+ "DD3S3_Cell_138970 3.758385 \n",
+ "DD3S3_Cell_138971 3.786428 \n",
+ "\n",
+ " B7H4_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.737665 \n",
+ "DD3S2_Cell_1 3.746947 \n",
+ "DD3S2_Cell_2 3.742886 \n",
+ "DD3S2_Cell_3 3.737401 \n",
+ "DD3S2_Cell_4 3.744204 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.706628 \n",
+ "DD3S3_Cell_138968 3.755512 \n",
+ "DD3S3_Cell_138969 3.755535 \n",
+ "DD3S3_Cell_138970 3.744076 \n",
+ "DD3S3_Cell_138971 3.756299 \n",
+ "\n",
+ " CD68_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.731945 \n",
+ "DD3S2_Cell_1 3.740073 \n",
+ "DD3S2_Cell_2 3.743947 \n",
+ "DD3S2_Cell_3 3.738744 \n",
+ "DD3S2_Cell_4 3.735192 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.710848 \n",
+ "DD3S3_Cell_138968 3.801541 \n",
+ "DD3S3_Cell_138969 3.809775 \n",
+ "DD3S3_Cell_138970 3.751376 \n",
+ "DD3S3_Cell_138971 3.774249 \n",
+ "\n",
+ " CD4_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.757988 \n",
+ "DD3S2_Cell_1 3.755463 \n",
+ "DD3S2_Cell_2 3.779793 \n",
+ "DD3S2_Cell_3 3.769026 \n",
+ "DD3S2_Cell_4 3.754270 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 4.302837 \n",
+ "DD3S3_Cell_138968 3.920946 \n",
+ "DD3S3_Cell_138969 3.898005 \n",
+ "DD3S3_Cell_138970 3.871842 \n",
+ "DD3S3_Cell_138971 3.976772 \n",
+ "\n",
+ " CD44_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.757782 \n",
+ "DD3S2_Cell_1 3.746730 \n",
+ "DD3S2_Cell_2 3.773698 \n",
+ "DD3S2_Cell_3 3.769681 \n",
+ "DD3S2_Cell_4 3.745287 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.743908 \n",
+ "DD3S3_Cell_138968 3.893987 \n",
+ "DD3S3_Cell_138969 3.802692 \n",
+ "DD3S3_Cell_138970 3.842041 \n",
+ "DD3S3_Cell_138971 3.927563 \n",
+ "\n",
+ " PDGFR_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.762732 \n",
+ "DD3S2_Cell_1 3.749495 \n",
+ "DD3S2_Cell_2 3.788075 \n",
+ "DD3S2_Cell_3 3.772496 \n",
+ "DD3S2_Cell_4 3.755890 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.716590 \n",
+ "DD3S3_Cell_138968 3.822514 \n",
+ "DD3S3_Cell_138969 3.804490 \n",
+ "DD3S3_Cell_138970 3.816635 \n",
+ "DD3S3_Cell_138971 3.852828 \n",
+ "\n",
+ " aSMA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 5.188862 \n",
+ "DD3S2_Cell_1 4.094320 \n",
+ "DD3S2_Cell_2 5.399720 \n",
+ "DD3S2_Cell_3 5.769240 \n",
+ "DD3S2_Cell_4 4.315353 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.394785 \n",
+ "DD3S3_Cell_138968 4.585814 \n",
+ "DD3S3_Cell_138969 4.442185 \n",
+ "DD3S3_Cell_138970 4.884997 \n",
+ "DD3S3_Cell_138971 4.748085 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.736770 \n",
+ "DD3S2_Cell_1 3.747230 \n",
+ "DD3S2_Cell_2 3.746609 \n",
+ "DD3S2_Cell_3 3.741989 \n",
+ "DD3S2_Cell_4 3.743215 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.737397 \n",
+ "DD3S3_Cell_138968 3.871388 \n",
+ "DD3S3_Cell_138969 3.823960 \n",
+ "DD3S3_Cell_138970 3.785072 \n",
+ "DD3S3_Cell_138971 3.799142 \n",
+ "\n",
+ " Fibronectin_Cytoplasm_Intensity_Average ... \\\n",
+ "ID ... \n",
+ "DD3S2_Cell_0 3.738262 ... \n",
+ "DD3S2_Cell_1 3.760019 ... \n",
+ "DD3S2_Cell_2 3.751351 ... \n",
+ "DD3S2_Cell_3 3.745374 ... \n",
+ "DD3S2_Cell_4 3.758664 ... \n",
+ "... ... ... \n",
+ "DD3S3_Cell_138967 3.733490 ... \n",
+ "DD3S3_Cell_138968 3.813215 ... \n",
+ "DD3S3_Cell_138969 3.811463 ... \n",
+ "DD3S3_Cell_138970 3.799217 ... \n",
+ "DD3S3_Cell_138971 3.836915 ... \n",
+ "\n",
+ " Ki67_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.798818 \n",
+ "DD3S2_Cell_1 3.813407 \n",
+ "DD3S2_Cell_2 3.793683 \n",
+ "DD3S2_Cell_3 3.782958 \n",
+ "DD3S2_Cell_4 3.812246 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.822763 \n",
+ "DD3S3_Cell_138968 4.082729 \n",
+ "DD3S3_Cell_138969 4.031610 \n",
+ "DD3S3_Cell_138970 3.912135 \n",
+ "DD3S3_Cell_138971 4.228818 \n",
+ "\n",
+ " Sting_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.892690 \n",
+ "DD3S2_Cell_1 3.959678 \n",
+ "DD3S2_Cell_2 3.958469 \n",
+ "DD3S2_Cell_3 3.837815 \n",
+ "DD3S2_Cell_4 3.932605 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.809516 \n",
+ "DD3S3_Cell_138968 4.216182 \n",
+ "DD3S3_Cell_138969 4.228590 \n",
+ "DD3S3_Cell_138970 4.249063 \n",
+ "DD3S3_Cell_138971 4.140471 \n",
+ "\n",
+ " Desmin_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.659606 \n",
+ "DD3S2_Cell_1 3.710231 \n",
+ "DD3S2_Cell_2 3.677928 \n",
+ "DD3S2_Cell_3 3.647146 \n",
+ "DD3S2_Cell_4 3.691211 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.104181 \n",
+ "DD3S3_Cell_138968 3.907466 \n",
+ "DD3S3_Cell_138969 3.874268 \n",
+ "DD3S3_Cell_138970 3.743587 \n",
+ "DD3S3_Cell_138971 3.917669 \n",
+ "\n",
+ " CD31_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.745429 \n",
+ "DD3S2_Cell_1 3.748789 \n",
+ "DD3S2_Cell_2 3.757257 \n",
+ "DD3S2_Cell_3 3.751278 \n",
+ "DD3S2_Cell_4 3.746845 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.841043 \n",
+ "DD3S3_Cell_138968 3.794135 \n",
+ "DD3S3_Cell_138969 3.778591 \n",
+ "DD3S3_Cell_138970 3.939331 \n",
+ "DD3S3_Cell_138971 3.798172 \n",
+ "\n",
+ " PD1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.733898 \n",
+ "DD3S2_Cell_1 3.741163 \n",
+ "DD3S2_Cell_2 3.739665 \n",
+ "DD3S2_Cell_3 3.734289 \n",
+ "DD3S2_Cell_4 3.738086 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.729074 \n",
+ "DD3S3_Cell_138968 3.752706 \n",
+ "DD3S3_Cell_138969 3.760328 \n",
+ "DD3S3_Cell_138970 3.745872 \n",
+ "DD3S3_Cell_138971 3.760132 \n",
+ "\n",
+ " ColVI_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.707270 \n",
+ "DD3S2_Cell_1 3.728855 \n",
+ "DD3S2_Cell_2 3.756183 \n",
+ "DD3S2_Cell_3 3.725000 \n",
+ "DD3S2_Cell_4 3.721234 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 4.236746 \n",
+ "DD3S3_Cell_138968 3.730219 \n",
+ "DD3S3_Cell_138969 3.734028 \n",
+ "DD3S3_Cell_138970 3.857894 \n",
+ "DD3S3_Cell_138971 3.816358 \n",
+ "\n",
+ " GATA3_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.736736 \n",
+ "DD3S2_Cell_1 3.755911 \n",
+ "DD3S2_Cell_2 3.743379 \n",
+ "DD3S2_Cell_3 3.737367 \n",
+ "DD3S2_Cell_4 3.757734 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.760684 \n",
+ "DD3S3_Cell_138968 3.776056 \n",
+ "DD3S3_Cell_138969 3.780450 \n",
+ "DD3S3_Cell_138970 3.776723 \n",
+ "DD3S3_Cell_138971 3.800749 \n",
+ "\n",
+ " Vimentin_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 4.420334 \n",
+ "DD3S2_Cell_1 3.752894 \n",
+ "DD3S2_Cell_2 5.161328 \n",
+ "DD3S2_Cell_3 4.384325 \n",
+ "DD3S2_Cell_4 4.094659 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.241246 \n",
+ "DD3S3_Cell_138968 5.178347 \n",
+ "DD3S3_Cell_138969 5.303565 \n",
+ "DD3S3_Cell_138970 5.557444 \n",
+ "DD3S3_Cell_138971 4.823838 \n",
+ "\n",
+ " CKs_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 4.328008 \n",
+ "DD3S2_Cell_1 4.690094 \n",
+ "DD3S2_Cell_2 3.857956 \n",
+ "DD3S2_Cell_3 3.952088 \n",
+ "DD3S2_Cell_4 4.520797 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.210896 \n",
+ "DD3S3_Cell_138968 4.137659 \n",
+ "DD3S3_Cell_138969 4.063099 \n",
+ "DD3S3_Cell_138970 3.923955 \n",
+ "DD3S3_Cell_138971 4.040701 \n",
+ "\n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ "ID \n",
+ "DD3S2_Cell_0 3.719735 \n",
+ "DD3S2_Cell_1 3.727162 \n",
+ "DD3S2_Cell_2 3.735405 \n",
+ "DD3S2_Cell_3 3.722703 \n",
+ "DD3S2_Cell_4 3.723271 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.703895 \n",
+ "DD3S3_Cell_138968 3.747118 \n",
+ "DD3S3_Cell_138969 3.744115 \n",
+ "DD3S3_Cell_138970 3.757893 \n",
+ "DD3S3_Cell_138971 3.749037 \n",
+ "\n",
+ "[341938 rows x 27 columns]"
+ ]
+ },
+ "execution_count": 44,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Apply log2\n",
+ "df_markers.loc[:,~df_markers.columns.isin(not_intensities)] = \\\n",
+ " np.log2(df_markers.loc[:, ~df_markers.columns.isin(not_intensities)])\n",
+ "print('log2 transform finished')\n",
+ "\n",
+ "df_markers"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "id": "c0019e7a-6dc7-4eab-b9b4-935deb5cb277",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['PDL1_Cytoplasm_Intensity_Average',\n",
+ " 'CD11c_Cytoplasm_Intensity_Average',\n",
+ " 'B7H4_Cell_Intensity_Average',\n",
+ " 'CD68_Cytoplasm_Intensity_Average',\n",
+ " 'CD4_Cytoplasm_Intensity_Average',\n",
+ " 'CD44_Cytoplasm_Intensity_Average',\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average',\n",
+ " 'aSMA_Cytoplasm_Intensity_Average',\n",
+ " 'CD163_Cytoplasm_Intensity_Average',\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average',\n",
+ " 'CD8_Cytoplasm_Intensity_Average',\n",
+ " 'Ecad_Cytoplasm_Intensity_Average',\n",
+ " 'FOXP3_Nucleus_Intensity_Average',\n",
+ " 'CD20_Cytoplasm_Intensity_Average',\n",
+ " 'HLA_Cytoplasm_Intensity_Average',\n",
+ " 'CD45_Cytoplasm_Intensity_Average',\n",
+ " 'MMP9_Cytoplasm_Intensity_Average',\n",
+ " 'Ki67_Nucleus_Intensity_Average',\n",
+ " 'Sting_Cytoplasm_Intensity_Average',\n",
+ " 'Desmin_Cytoplasm_Intensity_Average',\n",
+ " 'CD31_Cytoplasm_Intensity_Average',\n",
+ " 'PD1_Cytoplasm_Intensity_Average',\n",
+ " 'ColVI_Cytoplasm_Intensity_Average',\n",
+ " 'GATA3_Nucleus_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'CKs_Cytoplasm_Intensity_Average',\n",
+ " 'AXL_Cytoplasm_Intensity_Average']"
+ ]
+ },
+ "execution_count": 45,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_markers.columns.tolist()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "id": "f9d0b2c8-63ee-4d29-9af8-eb5ab2730908",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "0\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Check for NaN entries (should not be any unless columns do not align)\n",
+ "# False means no NaN entries \n",
+ "# True means NaN entries \n",
+ "df_markers.isnull().any().any()\n",
+ "\n",
+ "count_nan_in_df_markers = df_markers.isnull().sum().sum()\n",
+ "print(count_nan_in_df_markers)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9ad54027-9314-491e-b4b5-14e7fc6fb801",
+ "metadata": {},
+ "source": [
+ "## III.6. Z-SCORE TRANSFORMATION"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "id": "23b53d3b-2aaa-4497-ad41-6361a1593e26",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The following columns are not present in the DataFrame (10 columns missing): \n",
+ "['Cytoplasm_Size', 'Primary_chem(1)_vs_surg(0)', 'cluster', 'Unique_ROI_index', 'Nuc_Y', 'Nuc_X_Inv', 'Cell_ID', 'ID', 'Patient', 'replicate_ID']\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Nuc_X \n",
+ " cell_subtype \n",
+ " ROI_index \n",
+ " immune_checkpoint \n",
+ " Nuc_Y_Inv \n",
+ " Nucleus_Roundness \n",
+ " Cell_Size \n",
+ " Sample_ID \n",
+ " cell_type \n",
+ " Nucleus_Size \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_0 \n",
+ " 2033.197510 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15494.777344 \n",
+ " 0.792312 \n",
+ " 307 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 81 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_1 \n",
+ " 2101.638184 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15495.552734 \n",
+ " 0.749236 \n",
+ " 159 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 47 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_2 \n",
+ " 2008.148193 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15492.370117 \n",
+ " 0.835324 \n",
+ " 267 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 81 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_3 \n",
+ " 1992.441162 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15489.808594 \n",
+ " 0.671957 \n",
+ " 293 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 68 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_4 \n",
+ " 2092.007080 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15488.482422 \n",
+ " 0.710829 \n",
+ " 225 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 141 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138967 \n",
+ " 14827.791992 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1648.513916 \n",
+ " 0.921498 \n",
+ " 318 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 72 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138968 \n",
+ " 14520.892578 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1642.884644 \n",
+ " 0.740617 \n",
+ " 309 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 130 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138969 \n",
+ " 14528.000000 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1640.038452 \n",
+ " 0.694157 \n",
+ " 155 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 52 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138970 \n",
+ " 14553.461914 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1629.507690 \n",
+ " 0.821441 \n",
+ " 243 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 65 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138971 \n",
+ " 14543.513672 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1628.541626 \n",
+ " 0.816589 \n",
+ " 193 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 72 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
341938 rows Ć 10 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Nuc_X cell_subtype ROI_index immune_checkpoint \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 2033.197510 none 0 none \n",
+ "DD3S2_Cell_1 2101.638184 none 0 none \n",
+ "DD3S2_Cell_2 2008.148193 none 0 none \n",
+ "DD3S2_Cell_3 1992.441162 none 0 none \n",
+ "DD3S2_Cell_4 2092.007080 none 0 none \n",
+ "... ... ... ... ... \n",
+ "DD3S3_Cell_138967 14827.791992 none 63 none \n",
+ "DD3S3_Cell_138968 14520.892578 none 63 none \n",
+ "DD3S3_Cell_138969 14528.000000 none 63 none \n",
+ "DD3S3_Cell_138970 14553.461914 none 63 none \n",
+ "DD3S3_Cell_138971 14543.513672 none 63 none \n",
+ "\n",
+ " Nuc_Y_Inv Nucleus_Roundness Cell_Size Sample_ID \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 15494.777344 0.792312 307 DD3S2.csv \n",
+ "DD3S2_Cell_1 15495.552734 0.749236 159 DD3S2.csv \n",
+ "DD3S2_Cell_2 15492.370117 0.835324 267 DD3S2.csv \n",
+ "DD3S2_Cell_3 15489.808594 0.671957 293 DD3S2.csv \n",
+ "DD3S2_Cell_4 15488.482422 0.710829 225 DD3S2.csv \n",
+ "... ... ... ... ... \n",
+ "DD3S3_Cell_138967 1648.513916 0.921498 318 DD3S3.csv \n",
+ "DD3S3_Cell_138968 1642.884644 0.740617 309 DD3S3.csv \n",
+ "DD3S3_Cell_138969 1640.038452 0.694157 155 DD3S3.csv \n",
+ "DD3S3_Cell_138970 1629.507690 0.821441 243 DD3S3.csv \n",
+ "DD3S3_Cell_138971 1628.541626 0.816589 193 DD3S3.csv \n",
+ "\n",
+ " cell_type Nucleus_Size \n",
+ "ID \n",
+ "DD3S2_Cell_0 none 81 \n",
+ "DD3S2_Cell_1 none 47 \n",
+ "DD3S2_Cell_2 none 81 \n",
+ "DD3S2_Cell_3 none 68 \n",
+ "DD3S2_Cell_4 none 141 \n",
+ "... ... ... \n",
+ "DD3S3_Cell_138967 none 72 \n",
+ "DD3S3_Cell_138968 none 130 \n",
+ "DD3S3_Cell_138969 none 52 \n",
+ "DD3S3_Cell_138970 none 65 \n",
+ "DD3S3_Cell_138971 none 72 \n",
+ "\n",
+ "[341938 rows x 10 columns]"
+ ]
+ },
+ "execution_count": 47,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Filter the DataFrame df to keep only the columns specified in the not_intensities list\n",
+ "#df = df.loc[:, not_intensities]\n",
+ "#df\n",
+ "\n",
+ "# Check if all columns in the markers list are present in the DataFrame\n",
+ "missing_columns = [col for col in not_intensities if col not in df.columns]\n",
+ "if missing_columns:\n",
+ " print(f\"The following columns are not present in the DataFrame ({len(missing_columns)} columns missing): \\\n",
+ " \\n{missing_columns}\")\n",
+ " # Filter the DataFrame to keep only the columns that are in the markers list and also exist in the DataFrame\n",
+ " intersected_columns = list(set(not_intensities).intersection(df.columns))\n",
+ " df = df[intersected_columns]\n",
+ "else:\n",
+ " # Filter the DataFrame to keep only the columns in the markers list\n",
+ " df.loc[:, not_intensities]\n",
+ "\n",
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "id": "93744a35-1e3d-41ee-89d9-be8f7ca3c412",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " CD11c_Cytoplasm_Intensity_Average \n",
+ " B7H4_Cell_Intensity_Average \n",
+ " CD68_Cytoplasm_Intensity_Average \n",
+ " CD4_Cytoplasm_Intensity_Average \n",
+ " CD44_Cytoplasm_Intensity_Average \n",
+ " PDGFR_Cytoplasm_Intensity_Average \n",
+ " aSMA_Cytoplasm_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " Fibronectin_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nuc_X \n",
+ " cell_subtype \n",
+ " ROI_index \n",
+ " immune_checkpoint \n",
+ " Nuc_Y_Inv \n",
+ " Nucleus_Roundness \n",
+ " Cell_Size \n",
+ " Sample_ID \n",
+ " cell_type \n",
+ " Nucleus_Size \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_0 \n",
+ " 3.758170 \n",
+ " 3.726615 \n",
+ " 3.737665 \n",
+ " 3.731945 \n",
+ " 3.757988 \n",
+ " 3.757782 \n",
+ " 3.762732 \n",
+ " 5.188862 \n",
+ " 3.736770 \n",
+ " 3.738262 \n",
+ " ... \n",
+ " 2033.197510 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15494.777344 \n",
+ " 0.792312 \n",
+ " 307 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 81 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_1 \n",
+ " 3.770629 \n",
+ " 3.788224 \n",
+ " 3.746947 \n",
+ " 3.740073 \n",
+ " 3.755463 \n",
+ " 3.746730 \n",
+ " 3.749495 \n",
+ " 4.094320 \n",
+ " 3.747230 \n",
+ " 3.760019 \n",
+ " ... \n",
+ " 2101.638184 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15495.552734 \n",
+ " 0.749236 \n",
+ " 159 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 47 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_2 \n",
+ " 3.766498 \n",
+ " 3.752550 \n",
+ " 3.742886 \n",
+ " 3.743947 \n",
+ " 3.779793 \n",
+ " 3.773698 \n",
+ " 3.788075 \n",
+ " 5.399720 \n",
+ " 3.746609 \n",
+ " 3.751351 \n",
+ " ... \n",
+ " 2008.148193 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15492.370117 \n",
+ " 0.835324 \n",
+ " 267 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 81 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_3 \n",
+ " 3.755874 \n",
+ " 3.745471 \n",
+ " 3.737401 \n",
+ " 3.738744 \n",
+ " 3.769026 \n",
+ " 3.769681 \n",
+ " 3.772496 \n",
+ " 5.769240 \n",
+ " 3.741989 \n",
+ " 3.745374 \n",
+ " ... \n",
+ " 1992.441162 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15489.808594 \n",
+ " 0.671957 \n",
+ " 293 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 68 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_4 \n",
+ " 3.770836 \n",
+ " 3.720928 \n",
+ " 3.744204 \n",
+ " 3.735192 \n",
+ " 3.754270 \n",
+ " 3.745287 \n",
+ " 3.755890 \n",
+ " 4.315353 \n",
+ " 3.743215 \n",
+ " 3.758664 \n",
+ " ... \n",
+ " 2092.007080 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15488.482422 \n",
+ " 0.710829 \n",
+ " 225 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 141 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138967 \n",
+ " 3.750868 \n",
+ " 3.707101 \n",
+ " 3.706628 \n",
+ " 3.710848 \n",
+ " 4.302837 \n",
+ " 3.743908 \n",
+ " 3.716590 \n",
+ " 3.394785 \n",
+ " 3.737397 \n",
+ " 3.733490 \n",
+ " ... \n",
+ " 14827.791992 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1648.513916 \n",
+ " 0.921498 \n",
+ " 318 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 72 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138968 \n",
+ " 3.877333 \n",
+ " 3.785992 \n",
+ " 3.755512 \n",
+ " 3.801541 \n",
+ " 3.920946 \n",
+ " 3.893987 \n",
+ " 3.822514 \n",
+ " 4.585814 \n",
+ " 3.871388 \n",
+ " 3.813215 \n",
+ " ... \n",
+ " 14520.892578 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1642.884644 \n",
+ " 0.740617 \n",
+ " 309 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 130 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138969 \n",
+ " 3.852976 \n",
+ " 3.783950 \n",
+ " 3.755535 \n",
+ " 3.809775 \n",
+ " 3.898005 \n",
+ " 3.802692 \n",
+ " 3.804490 \n",
+ " 4.442185 \n",
+ " 3.823960 \n",
+ " 3.811463 \n",
+ " ... \n",
+ " 14528.000000 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1640.038452 \n",
+ " 0.694157 \n",
+ " 155 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 52 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138970 \n",
+ " 3.831496 \n",
+ " 3.758385 \n",
+ " 3.744076 \n",
+ " 3.751376 \n",
+ " 3.871842 \n",
+ " 3.842041 \n",
+ " 3.816635 \n",
+ " 4.884997 \n",
+ " 3.785072 \n",
+ " 3.799217 \n",
+ " ... \n",
+ " 14553.461914 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1629.507690 \n",
+ " 0.821441 \n",
+ " 243 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 65 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138971 \n",
+ " 3.871063 \n",
+ " 3.786428 \n",
+ " 3.756299 \n",
+ " 3.774249 \n",
+ " 3.976772 \n",
+ " 3.927563 \n",
+ " 3.852828 \n",
+ " 4.748085 \n",
+ " 3.799142 \n",
+ " 3.836915 \n",
+ " ... \n",
+ " 14543.513672 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1628.541626 \n",
+ " 0.816589 \n",
+ " 193 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 72 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
341938 rows Ć 37 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.758170 \n",
+ "DD3S2_Cell_1 3.770629 \n",
+ "DD3S2_Cell_2 3.766498 \n",
+ "DD3S2_Cell_3 3.755874 \n",
+ "DD3S2_Cell_4 3.770836 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.750868 \n",
+ "DD3S3_Cell_138968 3.877333 \n",
+ "DD3S3_Cell_138969 3.852976 \n",
+ "DD3S3_Cell_138970 3.831496 \n",
+ "DD3S3_Cell_138971 3.871063 \n",
+ "\n",
+ " CD11c_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.726615 \n",
+ "DD3S2_Cell_1 3.788224 \n",
+ "DD3S2_Cell_2 3.752550 \n",
+ "DD3S2_Cell_3 3.745471 \n",
+ "DD3S2_Cell_4 3.720928 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.707101 \n",
+ "DD3S3_Cell_138968 3.785992 \n",
+ "DD3S3_Cell_138969 3.783950 \n",
+ "DD3S3_Cell_138970 3.758385 \n",
+ "DD3S3_Cell_138971 3.786428 \n",
+ "\n",
+ " B7H4_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.737665 \n",
+ "DD3S2_Cell_1 3.746947 \n",
+ "DD3S2_Cell_2 3.742886 \n",
+ "DD3S2_Cell_3 3.737401 \n",
+ "DD3S2_Cell_4 3.744204 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.706628 \n",
+ "DD3S3_Cell_138968 3.755512 \n",
+ "DD3S3_Cell_138969 3.755535 \n",
+ "DD3S3_Cell_138970 3.744076 \n",
+ "DD3S3_Cell_138971 3.756299 \n",
+ "\n",
+ " CD68_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.731945 \n",
+ "DD3S2_Cell_1 3.740073 \n",
+ "DD3S2_Cell_2 3.743947 \n",
+ "DD3S2_Cell_3 3.738744 \n",
+ "DD3S2_Cell_4 3.735192 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.710848 \n",
+ "DD3S3_Cell_138968 3.801541 \n",
+ "DD3S3_Cell_138969 3.809775 \n",
+ "DD3S3_Cell_138970 3.751376 \n",
+ "DD3S3_Cell_138971 3.774249 \n",
+ "\n",
+ " CD4_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.757988 \n",
+ "DD3S2_Cell_1 3.755463 \n",
+ "DD3S2_Cell_2 3.779793 \n",
+ "DD3S2_Cell_3 3.769026 \n",
+ "DD3S2_Cell_4 3.754270 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 4.302837 \n",
+ "DD3S3_Cell_138968 3.920946 \n",
+ "DD3S3_Cell_138969 3.898005 \n",
+ "DD3S3_Cell_138970 3.871842 \n",
+ "DD3S3_Cell_138971 3.976772 \n",
+ "\n",
+ " CD44_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.757782 \n",
+ "DD3S2_Cell_1 3.746730 \n",
+ "DD3S2_Cell_2 3.773698 \n",
+ "DD3S2_Cell_3 3.769681 \n",
+ "DD3S2_Cell_4 3.745287 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.743908 \n",
+ "DD3S3_Cell_138968 3.893987 \n",
+ "DD3S3_Cell_138969 3.802692 \n",
+ "DD3S3_Cell_138970 3.842041 \n",
+ "DD3S3_Cell_138971 3.927563 \n",
+ "\n",
+ " PDGFR_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.762732 \n",
+ "DD3S2_Cell_1 3.749495 \n",
+ "DD3S2_Cell_2 3.788075 \n",
+ "DD3S2_Cell_3 3.772496 \n",
+ "DD3S2_Cell_4 3.755890 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.716590 \n",
+ "DD3S3_Cell_138968 3.822514 \n",
+ "DD3S3_Cell_138969 3.804490 \n",
+ "DD3S3_Cell_138970 3.816635 \n",
+ "DD3S3_Cell_138971 3.852828 \n",
+ "\n",
+ " aSMA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 5.188862 \n",
+ "DD3S2_Cell_1 4.094320 \n",
+ "DD3S2_Cell_2 5.399720 \n",
+ "DD3S2_Cell_3 5.769240 \n",
+ "DD3S2_Cell_4 4.315353 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.394785 \n",
+ "DD3S3_Cell_138968 4.585814 \n",
+ "DD3S3_Cell_138969 4.442185 \n",
+ "DD3S3_Cell_138970 4.884997 \n",
+ "DD3S3_Cell_138971 4.748085 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.736770 \n",
+ "DD3S2_Cell_1 3.747230 \n",
+ "DD3S2_Cell_2 3.746609 \n",
+ "DD3S2_Cell_3 3.741989 \n",
+ "DD3S2_Cell_4 3.743215 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 3.737397 \n",
+ "DD3S3_Cell_138968 3.871388 \n",
+ "DD3S3_Cell_138969 3.823960 \n",
+ "DD3S3_Cell_138970 3.785072 \n",
+ "DD3S3_Cell_138971 3.799142 \n",
+ "\n",
+ " Fibronectin_Cytoplasm_Intensity_Average ... Nuc_X \\\n",
+ "ID ... \n",
+ "DD3S2_Cell_0 3.738262 ... 2033.197510 \n",
+ "DD3S2_Cell_1 3.760019 ... 2101.638184 \n",
+ "DD3S2_Cell_2 3.751351 ... 2008.148193 \n",
+ "DD3S2_Cell_3 3.745374 ... 1992.441162 \n",
+ "DD3S2_Cell_4 3.758664 ... 2092.007080 \n",
+ "... ... ... ... \n",
+ "DD3S3_Cell_138967 3.733490 ... 14827.791992 \n",
+ "DD3S3_Cell_138968 3.813215 ... 14520.892578 \n",
+ "DD3S3_Cell_138969 3.811463 ... 14528.000000 \n",
+ "DD3S3_Cell_138970 3.799217 ... 14553.461914 \n",
+ "DD3S3_Cell_138971 3.836915 ... 14543.513672 \n",
+ "\n",
+ " cell_subtype ROI_index immune_checkpoint Nuc_Y_Inv \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 none 0 none 15494.777344 \n",
+ "DD3S2_Cell_1 none 0 none 15495.552734 \n",
+ "DD3S2_Cell_2 none 0 none 15492.370117 \n",
+ "DD3S2_Cell_3 none 0 none 15489.808594 \n",
+ "DD3S2_Cell_4 none 0 none 15488.482422 \n",
+ "... ... ... ... ... \n",
+ "DD3S3_Cell_138967 none 63 none 1648.513916 \n",
+ "DD3S3_Cell_138968 none 63 none 1642.884644 \n",
+ "DD3S3_Cell_138969 none 63 none 1640.038452 \n",
+ "DD3S3_Cell_138970 none 63 none 1629.507690 \n",
+ "DD3S3_Cell_138971 none 63 none 1628.541626 \n",
+ "\n",
+ " Nucleus_Roundness Cell_Size Sample_ID cell_type \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.792312 307 DD3S2.csv none \n",
+ "DD3S2_Cell_1 0.749236 159 DD3S2.csv none \n",
+ "DD3S2_Cell_2 0.835324 267 DD3S2.csv none \n",
+ "DD3S2_Cell_3 0.671957 293 DD3S2.csv none \n",
+ "DD3S2_Cell_4 0.710829 225 DD3S2.csv none \n",
+ "... ... ... ... ... \n",
+ "DD3S3_Cell_138967 0.921498 318 DD3S3.csv none \n",
+ "DD3S3_Cell_138968 0.740617 309 DD3S3.csv none \n",
+ "DD3S3_Cell_138969 0.694157 155 DD3S3.csv none \n",
+ "DD3S3_Cell_138970 0.821441 243 DD3S3.csv none \n",
+ "DD3S3_Cell_138971 0.816589 193 DD3S3.csv none \n",
+ "\n",
+ " Nucleus_Size \n",
+ "ID \n",
+ "DD3S2_Cell_0 81 \n",
+ "DD3S2_Cell_1 47 \n",
+ "DD3S2_Cell_2 81 \n",
+ "DD3S2_Cell_3 68 \n",
+ "DD3S2_Cell_4 141 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 72 \n",
+ "DD3S3_Cell_138968 130 \n",
+ "DD3S3_Cell_138969 52 \n",
+ "DD3S3_Cell_138970 65 \n",
+ "DD3S3_Cell_138971 72 \n",
+ "\n",
+ "[341938 rows x 37 columns]"
+ ]
+ },
+ "execution_count": 48,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_merged = df_markers.merge(df, left_index=True, right_on='ID', how='left')\n",
+ "df_merged"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "id": "69ac31a0-1f78-41d7-a8bd-e71e4e4277e0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Create a copy, just in case you need to restart the kernel\n",
+ "df_merged_copy = df_merged"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "id": "8ed2fbfe-4967-489d-924b-bf42e485a9bc",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " CD11c_Cytoplasm_Intensity_Average \n",
+ " B7H4_Cell_Intensity_Average \n",
+ " CD68_Cytoplasm_Intensity_Average \n",
+ " CD4_Cytoplasm_Intensity_Average \n",
+ " CD44_Cytoplasm_Intensity_Average \n",
+ " PDGFR_Cytoplasm_Intensity_Average \n",
+ " aSMA_Cytoplasm_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " Fibronectin_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nuc_X \n",
+ " cell_subtype \n",
+ " ROI_index \n",
+ " immune_checkpoint \n",
+ " Nuc_Y_Inv \n",
+ " Nucleus_Roundness \n",
+ " Cell_Size \n",
+ " Sample_ID \n",
+ " cell_type \n",
+ " Nucleus_Size \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " TMA_Cell_4 \n",
+ " 3.780812 \n",
+ " 3.749643 \n",
+ " 3.724881 \n",
+ " 3.730103 \n",
+ " 3.808783 \n",
+ " 3.772261 \n",
+ " 3.757757 \n",
+ " 4.359946 \n",
+ " 3.771580 \n",
+ " 3.736860 \n",
+ " ... \n",
+ " 1603.610596 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 12259.198242 \n",
+ " 0.639497 \n",
+ " 307 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 131 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_300 \n",
+ " 3.785247 \n",
+ " 3.750925 \n",
+ " 3.728579 \n",
+ " 3.740359 \n",
+ " 3.833438 \n",
+ " 3.964515 \n",
+ " 3.813220 \n",
+ " 5.277452 \n",
+ " 3.796030 \n",
+ " 3.752645 \n",
+ " ... \n",
+ " 1870.953491 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 12142.197266 \n",
+ " 0.557669 \n",
+ " 271 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 86 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_1231 \n",
+ " 3.774846 \n",
+ " 3.748975 \n",
+ " 3.722177 \n",
+ " 3.731672 \n",
+ " 3.836845 \n",
+ " 3.771828 \n",
+ " 3.732071 \n",
+ " 4.035427 \n",
+ " 3.764658 \n",
+ " 3.737986 \n",
+ " ... \n",
+ " 1076.486938 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 11927.400391 \n",
+ " 0.909491 \n",
+ " 215 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 115 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_1240 \n",
+ " 3.781590 \n",
+ " 3.724414 \n",
+ " 3.722949 \n",
+ " 3.737432 \n",
+ " 3.824108 \n",
+ " 3.846841 \n",
+ " 3.755064 \n",
+ " 5.029926 \n",
+ " 3.768938 \n",
+ " 3.740266 \n",
+ " ... \n",
+ " 1089.709717 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 11927.365234 \n",
+ " 0.945592 \n",
+ " 198 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 93 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_2107 \n",
+ " 3.795724 \n",
+ " 3.725851 \n",
+ " 3.725005 \n",
+ " 3.729301 \n",
+ " 3.859715 \n",
+ " 3.876810 \n",
+ " 3.889249 \n",
+ " 6.013026 \n",
+ " 3.782804 \n",
+ " 3.757063 \n",
+ " ... \n",
+ " 1375.939697 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 11758.577148 \n",
+ " 0.664589 \n",
+ " 167 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 116 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115755 \n",
+ " 3.821807 \n",
+ " 3.738845 \n",
+ " 3.739614 \n",
+ " 3.744093 \n",
+ " 3.780470 \n",
+ " 4.392201 \n",
+ " 3.738359 \n",
+ " 3.839200 \n",
+ " 3.755351 \n",
+ " 3.829806 \n",
+ " ... \n",
+ " 15564.458008 \n",
+ " none \n",
+ " 59 \n",
+ " none \n",
+ " 2663.253418 \n",
+ " 0.982196 \n",
+ " 386 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 142 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115756 \n",
+ " 3.828994 \n",
+ " 3.746076 \n",
+ " 3.742209 \n",
+ " 3.743732 \n",
+ " 3.771572 \n",
+ " 4.343234 \n",
+ " 3.743386 \n",
+ " 3.880995 \n",
+ " 3.766607 \n",
+ " 3.845841 \n",
+ " ... \n",
+ " 15629.680664 \n",
+ " none \n",
+ " 59 \n",
+ " none \n",
+ " 2661.765869 \n",
+ " 0.775977 \n",
+ " 270 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 47 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115757 \n",
+ " 3.805670 \n",
+ " 3.740683 \n",
+ " 3.738909 \n",
+ " 3.741262 \n",
+ " 3.764948 \n",
+ " 4.553124 \n",
+ " 3.739506 \n",
+ " 3.838884 \n",
+ " 3.749027 \n",
+ " 3.802058 \n",
+ " ... \n",
+ " 15518.421875 \n",
+ " none \n",
+ " 59 \n",
+ " none \n",
+ " 2657.015625 \n",
+ " 0.688747 \n",
+ " 202 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 64 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115758 \n",
+ " 3.794075 \n",
+ " 3.740020 \n",
+ " 3.739098 \n",
+ " 3.740781 \n",
+ " 3.763053 \n",
+ " 4.331289 \n",
+ " 3.738531 \n",
+ " 3.841646 \n",
+ " 3.749990 \n",
+ " 3.817734 \n",
+ " ... \n",
+ " 15539.275391 \n",
+ " none \n",
+ " 59 \n",
+ " none \n",
+ " 2660.258545 \n",
+ " 0.751402 \n",
+ " 182 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 58 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115760 \n",
+ " 3.841316 \n",
+ " 3.740180 \n",
+ " 3.740770 \n",
+ " 3.744660 \n",
+ " 3.783784 \n",
+ " 4.744351 \n",
+ " 3.745600 \n",
+ " 3.855980 \n",
+ " 3.758473 \n",
+ " 3.850599 \n",
+ " ... \n",
+ " 15542.961914 \n",
+ " none \n",
+ " 59 \n",
+ " none \n",
+ " 2654.292480 \n",
+ " 0.674126 \n",
+ " 295 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 106 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
94742 rows Ć 37 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 3.780812 \n",
+ "TMA_Cell_300 3.785247 \n",
+ "TMA_Cell_1231 3.774846 \n",
+ "TMA_Cell_1240 3.781590 \n",
+ "TMA_Cell_2107 3.795724 \n",
+ "... ... \n",
+ "TMA_Cell_115755 3.821807 \n",
+ "TMA_Cell_115756 3.828994 \n",
+ "TMA_Cell_115757 3.805670 \n",
+ "TMA_Cell_115758 3.794075 \n",
+ "TMA_Cell_115760 3.841316 \n",
+ "\n",
+ " CD11c_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 3.749643 \n",
+ "TMA_Cell_300 3.750925 \n",
+ "TMA_Cell_1231 3.748975 \n",
+ "TMA_Cell_1240 3.724414 \n",
+ "TMA_Cell_2107 3.725851 \n",
+ "... ... \n",
+ "TMA_Cell_115755 3.738845 \n",
+ "TMA_Cell_115756 3.746076 \n",
+ "TMA_Cell_115757 3.740683 \n",
+ "TMA_Cell_115758 3.740020 \n",
+ "TMA_Cell_115760 3.740180 \n",
+ "\n",
+ " B7H4_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 3.724881 \n",
+ "TMA_Cell_300 3.728579 \n",
+ "TMA_Cell_1231 3.722177 \n",
+ "TMA_Cell_1240 3.722949 \n",
+ "TMA_Cell_2107 3.725005 \n",
+ "... ... \n",
+ "TMA_Cell_115755 3.739614 \n",
+ "TMA_Cell_115756 3.742209 \n",
+ "TMA_Cell_115757 3.738909 \n",
+ "TMA_Cell_115758 3.739098 \n",
+ "TMA_Cell_115760 3.740770 \n",
+ "\n",
+ " CD68_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 3.730103 \n",
+ "TMA_Cell_300 3.740359 \n",
+ "TMA_Cell_1231 3.731672 \n",
+ "TMA_Cell_1240 3.737432 \n",
+ "TMA_Cell_2107 3.729301 \n",
+ "... ... \n",
+ "TMA_Cell_115755 3.744093 \n",
+ "TMA_Cell_115756 3.743732 \n",
+ "TMA_Cell_115757 3.741262 \n",
+ "TMA_Cell_115758 3.740781 \n",
+ "TMA_Cell_115760 3.744660 \n",
+ "\n",
+ " CD4_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 3.808783 \n",
+ "TMA_Cell_300 3.833438 \n",
+ "TMA_Cell_1231 3.836845 \n",
+ "TMA_Cell_1240 3.824108 \n",
+ "TMA_Cell_2107 3.859715 \n",
+ "... ... \n",
+ "TMA_Cell_115755 3.780470 \n",
+ "TMA_Cell_115756 3.771572 \n",
+ "TMA_Cell_115757 3.764948 \n",
+ "TMA_Cell_115758 3.763053 \n",
+ "TMA_Cell_115760 3.783784 \n",
+ "\n",
+ " CD44_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 3.772261 \n",
+ "TMA_Cell_300 3.964515 \n",
+ "TMA_Cell_1231 3.771828 \n",
+ "TMA_Cell_1240 3.846841 \n",
+ "TMA_Cell_2107 3.876810 \n",
+ "... ... \n",
+ "TMA_Cell_115755 4.392201 \n",
+ "TMA_Cell_115756 4.343234 \n",
+ "TMA_Cell_115757 4.553124 \n",
+ "TMA_Cell_115758 4.331289 \n",
+ "TMA_Cell_115760 4.744351 \n",
+ "\n",
+ " PDGFR_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 3.757757 \n",
+ "TMA_Cell_300 3.813220 \n",
+ "TMA_Cell_1231 3.732071 \n",
+ "TMA_Cell_1240 3.755064 \n",
+ "TMA_Cell_2107 3.889249 \n",
+ "... ... \n",
+ "TMA_Cell_115755 3.738359 \n",
+ "TMA_Cell_115756 3.743386 \n",
+ "TMA_Cell_115757 3.739506 \n",
+ "TMA_Cell_115758 3.738531 \n",
+ "TMA_Cell_115760 3.745600 \n",
+ "\n",
+ " aSMA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 4.359946 \n",
+ "TMA_Cell_300 5.277452 \n",
+ "TMA_Cell_1231 4.035427 \n",
+ "TMA_Cell_1240 5.029926 \n",
+ "TMA_Cell_2107 6.013026 \n",
+ "... ... \n",
+ "TMA_Cell_115755 3.839200 \n",
+ "TMA_Cell_115756 3.880995 \n",
+ "TMA_Cell_115757 3.838884 \n",
+ "TMA_Cell_115758 3.841646 \n",
+ "TMA_Cell_115760 3.855980 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 3.771580 \n",
+ "TMA_Cell_300 3.796030 \n",
+ "TMA_Cell_1231 3.764658 \n",
+ "TMA_Cell_1240 3.768938 \n",
+ "TMA_Cell_2107 3.782804 \n",
+ "... ... \n",
+ "TMA_Cell_115755 3.755351 \n",
+ "TMA_Cell_115756 3.766607 \n",
+ "TMA_Cell_115757 3.749027 \n",
+ "TMA_Cell_115758 3.749990 \n",
+ "TMA_Cell_115760 3.758473 \n",
+ "\n",
+ " Fibronectin_Cytoplasm_Intensity_Average ... Nuc_X \\\n",
+ "ID ... \n",
+ "TMA_Cell_4 3.736860 ... 1603.610596 \n",
+ "TMA_Cell_300 3.752645 ... 1870.953491 \n",
+ "TMA_Cell_1231 3.737986 ... 1076.486938 \n",
+ "TMA_Cell_1240 3.740266 ... 1089.709717 \n",
+ "TMA_Cell_2107 3.757063 ... 1375.939697 \n",
+ "... ... ... ... \n",
+ "TMA_Cell_115755 3.829806 ... 15564.458008 \n",
+ "TMA_Cell_115756 3.845841 ... 15629.680664 \n",
+ "TMA_Cell_115757 3.802058 ... 15518.421875 \n",
+ "TMA_Cell_115758 3.817734 ... 15539.275391 \n",
+ "TMA_Cell_115760 3.850599 ... 15542.961914 \n",
+ "\n",
+ " cell_subtype ROI_index immune_checkpoint Nuc_Y_Inv \\\n",
+ "ID \n",
+ "TMA_Cell_4 none 0 none 12259.198242 \n",
+ "TMA_Cell_300 none 0 none 12142.197266 \n",
+ "TMA_Cell_1231 none 0 none 11927.400391 \n",
+ "TMA_Cell_1240 none 0 none 11927.365234 \n",
+ "TMA_Cell_2107 none 0 none 11758.577148 \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 none 59 none 2663.253418 \n",
+ "TMA_Cell_115756 none 59 none 2661.765869 \n",
+ "TMA_Cell_115757 none 59 none 2657.015625 \n",
+ "TMA_Cell_115758 none 59 none 2660.258545 \n",
+ "TMA_Cell_115760 none 59 none 2654.292480 \n",
+ "\n",
+ " Nucleus_Roundness Cell_Size Sample_ID cell_type \\\n",
+ "ID \n",
+ "TMA_Cell_4 0.639497 307 TMA.csv none \n",
+ "TMA_Cell_300 0.557669 271 TMA.csv none \n",
+ "TMA_Cell_1231 0.909491 215 TMA.csv none \n",
+ "TMA_Cell_1240 0.945592 198 TMA.csv none \n",
+ "TMA_Cell_2107 0.664589 167 TMA.csv none \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 0.982196 386 TMA.csv none \n",
+ "TMA_Cell_115756 0.775977 270 TMA.csv none \n",
+ "TMA_Cell_115757 0.688747 202 TMA.csv none \n",
+ "TMA_Cell_115758 0.751402 182 TMA.csv none \n",
+ "TMA_Cell_115760 0.674126 295 TMA.csv none \n",
+ "\n",
+ " Nucleus_Size \n",
+ "ID \n",
+ "TMA_Cell_4 131 \n",
+ "TMA_Cell_300 86 \n",
+ "TMA_Cell_1231 115 \n",
+ "TMA_Cell_1240 93 \n",
+ "TMA_Cell_2107 116 \n",
+ "... ... \n",
+ "TMA_Cell_115755 142 \n",
+ "TMA_Cell_115756 47 \n",
+ "TMA_Cell_115757 64 \n",
+ "TMA_Cell_115758 58 \n",
+ "TMA_Cell_115760 106 \n",
+ "\n",
+ "[94742 rows x 37 columns]"
+ ]
+ },
+ "execution_count": 50,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Filters the rows of the DataFrame df_merged based on the values in the 'Sample_ID' column\n",
+ "# df_subset will contain a subset of rows from df_merged where the 'Sample_ID' matches the values in the list 'keep' ('TMA.csv' in this case)\n",
+ "keep = ['TMA.csv']\n",
+ "df_subset = df_merged.loc[df_merged['Sample_ID'].isin(keep),:].copy()\n",
+ "df_subset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "id": "b2260afd-7e3a-4c2a-9cfa-01eb16fb9474",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "zscore rows finished\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Z-score normalization\n",
+ "# Z-score the rows (apply() with axis = 1, only perform on intensity data)\n",
+ "\n",
+ "###############################\n",
+ "# !! This may take a while !! #\n",
+ "###############################\n",
+ "df_subset.loc[:,~df_subset.columns.isin(not_intensities)] = \\\n",
+ " df_subset.loc[:,~df_subset.columns.isin(not_intensities)].apply(\n",
+ " lambda row: (row - row.median())/(row.std(ddof=0)), axis = 1)\n",
+ "df_subset.dropna(how = 'all', inplace = True, axis = 1)\n",
+ "print('zscore rows finished')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "id": "204cff9e-4964-472b-8be9-12f33ed6b74b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " CD11c_Cytoplasm_Intensity_Average \n",
+ " B7H4_Cell_Intensity_Average \n",
+ " CD68_Cytoplasm_Intensity_Average \n",
+ " CD4_Cytoplasm_Intensity_Average \n",
+ " CD44_Cytoplasm_Intensity_Average \n",
+ " PDGFR_Cytoplasm_Intensity_Average \n",
+ " aSMA_Cytoplasm_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " Fibronectin_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nuc_X \n",
+ " cell_subtype \n",
+ " ROI_index \n",
+ " immune_checkpoint \n",
+ " Nuc_Y_Inv \n",
+ " Nucleus_Roundness \n",
+ " Cell_Size \n",
+ " Sample_ID \n",
+ " cell_type \n",
+ " Nucleus_Size \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " TMA_Cell_4 \n",
+ " 0.037975 \n",
+ " -0.090232 \n",
+ " -0.192088 \n",
+ " -0.170609 \n",
+ " 0.153029 \n",
+ " 0.002801 \n",
+ " -0.056857 \n",
+ " 2.420162 \n",
+ " 0.000000 \n",
+ " -0.142813 \n",
+ " ... \n",
+ " 1603.610596 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 12259.198242 \n",
+ " 0.639497 \n",
+ " 307 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 131 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_300 \n",
+ " -0.006220 \n",
+ " -0.092313 \n",
+ " -0.148365 \n",
+ " -0.118816 \n",
+ " 0.114663 \n",
+ " 0.443455 \n",
+ " 0.063947 \n",
+ " 3.736817 \n",
+ " 0.020830 \n",
+ " -0.087998 \n",
+ " ... \n",
+ " 1870.953491 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 12142.197266 \n",
+ " 0.557669 \n",
+ " 271 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 86 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_1231 \n",
+ " 0.061042 \n",
+ " -0.064835 \n",
+ " -0.195221 \n",
+ " -0.149023 \n",
+ " 0.362701 \n",
+ " 0.046357 \n",
+ " -0.147079 \n",
+ " 1.328911 \n",
+ " 0.011473 \n",
+ " -0.118299 \n",
+ " ... \n",
+ " 1076.486938 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 11927.400391 \n",
+ " 0.909491 \n",
+ " 215 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 115 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_1240 \n",
+ " 0.043759 \n",
+ " -0.153990 \n",
+ " -0.159056 \n",
+ " -0.108965 \n",
+ " 0.190813 \n",
+ " 0.269438 \n",
+ " -0.047983 \n",
+ " 4.361285 \n",
+ " 0.000000 \n",
+ " -0.099163 \n",
+ " ... \n",
+ " 1089.709717 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 11927.365234 \n",
+ " 0.945592 \n",
+ " 198 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 93 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_2107 \n",
+ " 0.000000 \n",
+ " -0.144613 \n",
+ " -0.146364 \n",
+ " -0.137474 \n",
+ " 0.132441 \n",
+ " 0.167821 \n",
+ " 0.193565 \n",
+ " 4.589084 \n",
+ " -0.026741 \n",
+ " -0.080016 \n",
+ " ... \n",
+ " 1375.939697 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 11758.577148 \n",
+ " 0.664589 \n",
+ " 167 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 116 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115755 \n",
+ " 0.167315 \n",
+ " -0.161220 \n",
+ " -0.158175 \n",
+ " -0.140436 \n",
+ " 0.003619 \n",
+ " 2.426113 \n",
+ " -0.163142 \n",
+ " 0.236192 \n",
+ " -0.095854 \n",
+ " 0.198991 \n",
+ " ... \n",
+ " 15564.458008 \n",
+ " none \n",
+ " 59 \n",
+ " none \n",
+ " 2663.253418 \n",
+ " 0.982196 \n",
+ " 386 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 142 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115756 \n",
+ " 0.168391 \n",
+ " -0.231211 \n",
+ " -0.249849 \n",
+ " -0.242510 \n",
+ " -0.108340 \n",
+ " 2.646651 \n",
+ " -0.244177 \n",
+ " 0.419000 \n",
+ " -0.132270 \n",
+ " 0.249579 \n",
+ " ... \n",
+ " 15629.680664 \n",
+ " none \n",
+ " 59 \n",
+ " none \n",
+ " 2661.765869 \n",
+ " 0.775977 \n",
+ " 270 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 47 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115757 \n",
+ " 0.140926 \n",
+ " -0.123519 \n",
+ " -0.130738 \n",
+ " -0.121163 \n",
+ " -0.024781 \n",
+ " 3.182450 \n",
+ " -0.128310 \n",
+ " 0.276081 \n",
+ " -0.089567 \n",
+ " 0.126228 \n",
+ " ... \n",
+ " 15518.421875 \n",
+ " none \n",
+ " 59 \n",
+ " none \n",
+ " 2657.015625 \n",
+ " 0.688747 \n",
+ " 202 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 64 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115758 \n",
+ " 0.072588 \n",
+ " -0.203340 \n",
+ " -0.208043 \n",
+ " -0.199453 \n",
+ " -0.085765 \n",
+ " 2.814824 \n",
+ " -0.210942 \n",
+ " 0.315417 \n",
+ " -0.152446 \n",
+ " 0.193357 \n",
+ " ... \n",
+ " 15539.275391 \n",
+ " none \n",
+ " 59 \n",
+ " none \n",
+ " 2660.258545 \n",
+ " 0.751402 \n",
+ " 182 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 58 \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115760 \n",
+ " 0.123770 \n",
+ " -0.187289 \n",
+ " -0.185475 \n",
+ " -0.173511 \n",
+ " -0.053176 \n",
+ " 2.901200 \n",
+ " -0.170618 \n",
+ " 0.168873 \n",
+ " -0.131025 \n",
+ " 0.152323 \n",
+ " ... \n",
+ " 15542.961914 \n",
+ " none \n",
+ " 59 \n",
+ " none \n",
+ " 2654.292480 \n",
+ " 0.674126 \n",
+ " 295 \n",
+ " TMA.csv \n",
+ " none \n",
+ " 106 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
94742 rows Ć 37 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 0.037975 \n",
+ "TMA_Cell_300 -0.006220 \n",
+ "TMA_Cell_1231 0.061042 \n",
+ "TMA_Cell_1240 0.043759 \n",
+ "TMA_Cell_2107 0.000000 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.167315 \n",
+ "TMA_Cell_115756 0.168391 \n",
+ "TMA_Cell_115757 0.140926 \n",
+ "TMA_Cell_115758 0.072588 \n",
+ "TMA_Cell_115760 0.123770 \n",
+ "\n",
+ " CD11c_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 -0.090232 \n",
+ "TMA_Cell_300 -0.092313 \n",
+ "TMA_Cell_1231 -0.064835 \n",
+ "TMA_Cell_1240 -0.153990 \n",
+ "TMA_Cell_2107 -0.144613 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.161220 \n",
+ "TMA_Cell_115756 -0.231211 \n",
+ "TMA_Cell_115757 -0.123519 \n",
+ "TMA_Cell_115758 -0.203340 \n",
+ "TMA_Cell_115760 -0.187289 \n",
+ "\n",
+ " B7H4_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 -0.192088 \n",
+ "TMA_Cell_300 -0.148365 \n",
+ "TMA_Cell_1231 -0.195221 \n",
+ "TMA_Cell_1240 -0.159056 \n",
+ "TMA_Cell_2107 -0.146364 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.158175 \n",
+ "TMA_Cell_115756 -0.249849 \n",
+ "TMA_Cell_115757 -0.130738 \n",
+ "TMA_Cell_115758 -0.208043 \n",
+ "TMA_Cell_115760 -0.185475 \n",
+ "\n",
+ " CD68_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 -0.170609 \n",
+ "TMA_Cell_300 -0.118816 \n",
+ "TMA_Cell_1231 -0.149023 \n",
+ "TMA_Cell_1240 -0.108965 \n",
+ "TMA_Cell_2107 -0.137474 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.140436 \n",
+ "TMA_Cell_115756 -0.242510 \n",
+ "TMA_Cell_115757 -0.121163 \n",
+ "TMA_Cell_115758 -0.199453 \n",
+ "TMA_Cell_115760 -0.173511 \n",
+ "\n",
+ " CD4_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 0.153029 \n",
+ "TMA_Cell_300 0.114663 \n",
+ "TMA_Cell_1231 0.362701 \n",
+ "TMA_Cell_1240 0.190813 \n",
+ "TMA_Cell_2107 0.132441 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.003619 \n",
+ "TMA_Cell_115756 -0.108340 \n",
+ "TMA_Cell_115757 -0.024781 \n",
+ "TMA_Cell_115758 -0.085765 \n",
+ "TMA_Cell_115760 -0.053176 \n",
+ "\n",
+ " CD44_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 0.002801 \n",
+ "TMA_Cell_300 0.443455 \n",
+ "TMA_Cell_1231 0.046357 \n",
+ "TMA_Cell_1240 0.269438 \n",
+ "TMA_Cell_2107 0.167821 \n",
+ "... ... \n",
+ "TMA_Cell_115755 2.426113 \n",
+ "TMA_Cell_115756 2.646651 \n",
+ "TMA_Cell_115757 3.182450 \n",
+ "TMA_Cell_115758 2.814824 \n",
+ "TMA_Cell_115760 2.901200 \n",
+ "\n",
+ " PDGFR_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 -0.056857 \n",
+ "TMA_Cell_300 0.063947 \n",
+ "TMA_Cell_1231 -0.147079 \n",
+ "TMA_Cell_1240 -0.047983 \n",
+ "TMA_Cell_2107 0.193565 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.163142 \n",
+ "TMA_Cell_115756 -0.244177 \n",
+ "TMA_Cell_115757 -0.128310 \n",
+ "TMA_Cell_115758 -0.210942 \n",
+ "TMA_Cell_115760 -0.170618 \n",
+ "\n",
+ " aSMA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 2.420162 \n",
+ "TMA_Cell_300 3.736817 \n",
+ "TMA_Cell_1231 1.328911 \n",
+ "TMA_Cell_1240 4.361285 \n",
+ "TMA_Cell_2107 4.589084 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.236192 \n",
+ "TMA_Cell_115756 0.419000 \n",
+ "TMA_Cell_115757 0.276081 \n",
+ "TMA_Cell_115758 0.315417 \n",
+ "TMA_Cell_115760 0.168873 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 0.000000 \n",
+ "TMA_Cell_300 0.020830 \n",
+ "TMA_Cell_1231 0.011473 \n",
+ "TMA_Cell_1240 0.000000 \n",
+ "TMA_Cell_2107 -0.026741 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.095854 \n",
+ "TMA_Cell_115756 -0.132270 \n",
+ "TMA_Cell_115757 -0.089567 \n",
+ "TMA_Cell_115758 -0.152446 \n",
+ "TMA_Cell_115760 -0.131025 \n",
+ "\n",
+ " Fibronectin_Cytoplasm_Intensity_Average ... Nuc_X \\\n",
+ "ID ... \n",
+ "TMA_Cell_4 -0.142813 ... 1603.610596 \n",
+ "TMA_Cell_300 -0.087998 ... 1870.953491 \n",
+ "TMA_Cell_1231 -0.118299 ... 1076.486938 \n",
+ "TMA_Cell_1240 -0.099163 ... 1089.709717 \n",
+ "TMA_Cell_2107 -0.080016 ... 1375.939697 \n",
+ "... ... ... ... \n",
+ "TMA_Cell_115755 0.198991 ... 15564.458008 \n",
+ "TMA_Cell_115756 0.249579 ... 15629.680664 \n",
+ "TMA_Cell_115757 0.126228 ... 15518.421875 \n",
+ "TMA_Cell_115758 0.193357 ... 15539.275391 \n",
+ "TMA_Cell_115760 0.152323 ... 15542.961914 \n",
+ "\n",
+ " cell_subtype ROI_index immune_checkpoint Nuc_Y_Inv \\\n",
+ "ID \n",
+ "TMA_Cell_4 none 0 none 12259.198242 \n",
+ "TMA_Cell_300 none 0 none 12142.197266 \n",
+ "TMA_Cell_1231 none 0 none 11927.400391 \n",
+ "TMA_Cell_1240 none 0 none 11927.365234 \n",
+ "TMA_Cell_2107 none 0 none 11758.577148 \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 none 59 none 2663.253418 \n",
+ "TMA_Cell_115756 none 59 none 2661.765869 \n",
+ "TMA_Cell_115757 none 59 none 2657.015625 \n",
+ "TMA_Cell_115758 none 59 none 2660.258545 \n",
+ "TMA_Cell_115760 none 59 none 2654.292480 \n",
+ "\n",
+ " Nucleus_Roundness Cell_Size Sample_ID cell_type \\\n",
+ "ID \n",
+ "TMA_Cell_4 0.639497 307 TMA.csv none \n",
+ "TMA_Cell_300 0.557669 271 TMA.csv none \n",
+ "TMA_Cell_1231 0.909491 215 TMA.csv none \n",
+ "TMA_Cell_1240 0.945592 198 TMA.csv none \n",
+ "TMA_Cell_2107 0.664589 167 TMA.csv none \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 0.982196 386 TMA.csv none \n",
+ "TMA_Cell_115756 0.775977 270 TMA.csv none \n",
+ "TMA_Cell_115757 0.688747 202 TMA.csv none \n",
+ "TMA_Cell_115758 0.751402 182 TMA.csv none \n",
+ "TMA_Cell_115760 0.674126 295 TMA.csv none \n",
+ "\n",
+ " Nucleus_Size \n",
+ "ID \n",
+ "TMA_Cell_4 131 \n",
+ "TMA_Cell_300 86 \n",
+ "TMA_Cell_1231 115 \n",
+ "TMA_Cell_1240 93 \n",
+ "TMA_Cell_2107 116 \n",
+ "... ... \n",
+ "TMA_Cell_115755 142 \n",
+ "TMA_Cell_115756 47 \n",
+ "TMA_Cell_115757 64 \n",
+ "TMA_Cell_115758 58 \n",
+ "TMA_Cell_115760 106 \n",
+ "\n",
+ "[94742 rows x 37 columns]"
+ ]
+ },
+ "execution_count": 52,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_subset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "id": "58d297e7-a9af-46b2-9912-b5d402102a4f",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "zscore rows finished\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Z-score the rows (apply() with axis = 1, only perform on intensity data)\n",
+ "\n",
+ "###############################\n",
+ "# !! This may take a while !! #\n",
+ "###############################\n",
+ "df_merged.loc[:,~df_merged.columns.isin(not_intensities)] = \\\n",
+ " df_merged.loc[:,~df_merged.columns.isin(not_intensities)].apply(\n",
+ " lambda row: (row - row.median())/(row.std(ddof=0)), axis = 1)\n",
+ "df_merged.dropna(how = 'all', inplace = True, axis = 1)\n",
+ "print('zscore rows finished')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "id": "d4de8037-34fb-4353-843b-cd5e616a20e0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " CD11c_Cytoplasm_Intensity_Average \n",
+ " B7H4_Cell_Intensity_Average \n",
+ " CD68_Cytoplasm_Intensity_Average \n",
+ " CD4_Cytoplasm_Intensity_Average \n",
+ " CD44_Cytoplasm_Intensity_Average \n",
+ " PDGFR_Cytoplasm_Intensity_Average \n",
+ " aSMA_Cytoplasm_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " Fibronectin_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nuc_X \n",
+ " cell_subtype \n",
+ " ROI_index \n",
+ " immune_checkpoint \n",
+ " Nuc_Y_Inv \n",
+ " Nucleus_Roundness \n",
+ " Cell_Size \n",
+ " Sample_ID \n",
+ " cell_type \n",
+ " Nucleus_Size \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_0 \n",
+ " 0.024960 \n",
+ " -0.075347 \n",
+ " -0.040222 \n",
+ " -0.058405 \n",
+ " 0.024381 \n",
+ " 0.023726 \n",
+ " 0.039464 \n",
+ " 4.572897 \n",
+ " -0.043068 \n",
+ " -0.038325 \n",
+ " ... \n",
+ " 2033.197510 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15494.777344 \n",
+ " 0.792312 \n",
+ " 307 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 81 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_1 \n",
+ " 0.075136 \n",
+ " 0.164953 \n",
+ " -0.045760 \n",
+ " -0.080848 \n",
+ " -0.002287 \n",
+ " -0.046869 \n",
+ " -0.032752 \n",
+ " 1.727537 \n",
+ " -0.044315 \n",
+ " 0.020972 \n",
+ " ... \n",
+ " 2101.638184 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15495.552734 \n",
+ " 0.749236 \n",
+ " 159 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 47 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_2 \n",
+ " 0.022444 \n",
+ " -0.011432 \n",
+ " -0.034903 \n",
+ " -0.032326 \n",
+ " 0.054732 \n",
+ " 0.039929 \n",
+ " 0.074845 \n",
+ " 3.988960 \n",
+ " -0.025861 \n",
+ " -0.014343 \n",
+ " ... \n",
+ " 2008.148193 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15492.370117 \n",
+ " 0.835324 \n",
+ " 267 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 81 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_3 \n",
+ " 0.011138 \n",
+ " -0.014071 \n",
+ " -0.033624 \n",
+ " -0.030370 \n",
+ " 0.043005 \n",
+ " 0.044592 \n",
+ " 0.051412 \n",
+ " 4.889609 \n",
+ " -0.022507 \n",
+ " -0.014305 \n",
+ " ... \n",
+ " 1992.441162 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15489.808594 \n",
+ " 0.671957 \n",
+ " 293 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 68 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_4 \n",
+ " 0.077567 \n",
+ " -0.181457 \n",
+ " -0.060652 \n",
+ " -0.107426 \n",
+ " -0.008411 \n",
+ " -0.055030 \n",
+ " 0.000000 \n",
+ " 2.903647 \n",
+ " -0.065787 \n",
+ " 0.014397 \n",
+ " ... \n",
+ " 2092.007080 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15488.482422 \n",
+ " 0.710829 \n",
+ " 225 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 141 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138967 \n",
+ " 0.069663 \n",
+ " -0.105790 \n",
+ " -0.107686 \n",
+ " -0.090768 \n",
+ " 2.282360 \n",
+ " 0.041760 \n",
+ " -0.067749 \n",
+ " -1.357780 \n",
+ " 0.015659 \n",
+ " 0.000000 \n",
+ " ... \n",
+ " 14827.791992 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1648.513916 \n",
+ " 0.921498 \n",
+ " 318 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 72 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138968 \n",
+ " 0.166680 \n",
+ " -0.111050 \n",
+ " -0.203723 \n",
+ " -0.063771 \n",
+ " 0.299286 \n",
+ " 0.217316 \n",
+ " 0.000000 \n",
+ " 2.320848 \n",
+ " 0.148603 \n",
+ " -0.028275 \n",
+ " ... \n",
+ " 14520.892578 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1642.884644 \n",
+ " 0.740617 \n",
+ " 309 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 130 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138969 \n",
+ " 0.128945 \n",
+ " -0.081516 \n",
+ " -0.168154 \n",
+ " -0.002777 \n",
+ " 0.266238 \n",
+ " -0.024371 \n",
+ " -0.018890 \n",
+ " 1.925448 \n",
+ " 0.040476 \n",
+ " 0.002371 \n",
+ " ... \n",
+ " 14528.000000 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1640.038452 \n",
+ " 0.694157 \n",
+ " 155 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 52 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138970 \n",
+ " 0.065912 \n",
+ " -0.120796 \n",
+ " -0.157338 \n",
+ " -0.138697 \n",
+ " 0.168946 \n",
+ " 0.092840 \n",
+ " 0.027960 \n",
+ " 2.756305 \n",
+ " -0.052645 \n",
+ " -0.016522 \n",
+ " ... \n",
+ " 14553.461914 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1629.507690 \n",
+ " 0.821441 \n",
+ " 243 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 65 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138971 \n",
+ " 0.121561 \n",
+ " -0.179724 \n",
+ " -0.286979 \n",
+ " -0.223079 \n",
+ " 0.497862 \n",
+ " 0.322688 \n",
+ " 0.056645 \n",
+ " 3.243583 \n",
+ " -0.134464 \n",
+ " 0.000000 \n",
+ " ... \n",
+ " 14543.513672 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1628.541626 \n",
+ " 0.816589 \n",
+ " 193 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 72 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
341938 rows Ć 37 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.024960 \n",
+ "DD3S2_Cell_1 0.075136 \n",
+ "DD3S2_Cell_2 0.022444 \n",
+ "DD3S2_Cell_3 0.011138 \n",
+ "DD3S2_Cell_4 0.077567 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 0.069663 \n",
+ "DD3S3_Cell_138968 0.166680 \n",
+ "DD3S3_Cell_138969 0.128945 \n",
+ "DD3S3_Cell_138970 0.065912 \n",
+ "DD3S3_Cell_138971 0.121561 \n",
+ "\n",
+ " CD11c_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.075347 \n",
+ "DD3S2_Cell_1 0.164953 \n",
+ "DD3S2_Cell_2 -0.011432 \n",
+ "DD3S2_Cell_3 -0.014071 \n",
+ "DD3S2_Cell_4 -0.181457 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -0.105790 \n",
+ "DD3S3_Cell_138968 -0.111050 \n",
+ "DD3S3_Cell_138969 -0.081516 \n",
+ "DD3S3_Cell_138970 -0.120796 \n",
+ "DD3S3_Cell_138971 -0.179724 \n",
+ "\n",
+ " B7H4_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.040222 \n",
+ "DD3S2_Cell_1 -0.045760 \n",
+ "DD3S2_Cell_2 -0.034903 \n",
+ "DD3S2_Cell_3 -0.033624 \n",
+ "DD3S2_Cell_4 -0.060652 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -0.107686 \n",
+ "DD3S3_Cell_138968 -0.203723 \n",
+ "DD3S3_Cell_138969 -0.168154 \n",
+ "DD3S3_Cell_138970 -0.157338 \n",
+ "DD3S3_Cell_138971 -0.286979 \n",
+ "\n",
+ " CD68_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.058405 \n",
+ "DD3S2_Cell_1 -0.080848 \n",
+ "DD3S2_Cell_2 -0.032326 \n",
+ "DD3S2_Cell_3 -0.030370 \n",
+ "DD3S2_Cell_4 -0.107426 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -0.090768 \n",
+ "DD3S3_Cell_138968 -0.063771 \n",
+ "DD3S3_Cell_138969 -0.002777 \n",
+ "DD3S3_Cell_138970 -0.138697 \n",
+ "DD3S3_Cell_138971 -0.223079 \n",
+ "\n",
+ " CD4_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.024381 \n",
+ "DD3S2_Cell_1 -0.002287 \n",
+ "DD3S2_Cell_2 0.054732 \n",
+ "DD3S2_Cell_3 0.043005 \n",
+ "DD3S2_Cell_4 -0.008411 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 2.282360 \n",
+ "DD3S3_Cell_138968 0.299286 \n",
+ "DD3S3_Cell_138969 0.266238 \n",
+ "DD3S3_Cell_138970 0.168946 \n",
+ "DD3S3_Cell_138971 0.497862 \n",
+ "\n",
+ " CD44_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.023726 \n",
+ "DD3S2_Cell_1 -0.046869 \n",
+ "DD3S2_Cell_2 0.039929 \n",
+ "DD3S2_Cell_3 0.044592 \n",
+ "DD3S2_Cell_4 -0.055030 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 0.041760 \n",
+ "DD3S3_Cell_138968 0.217316 \n",
+ "DD3S3_Cell_138969 -0.024371 \n",
+ "DD3S3_Cell_138970 0.092840 \n",
+ "DD3S3_Cell_138971 0.322688 \n",
+ "\n",
+ " PDGFR_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.039464 \n",
+ "DD3S2_Cell_1 -0.032752 \n",
+ "DD3S2_Cell_2 0.074845 \n",
+ "DD3S2_Cell_3 0.051412 \n",
+ "DD3S2_Cell_4 0.000000 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -0.067749 \n",
+ "DD3S3_Cell_138968 0.000000 \n",
+ "DD3S3_Cell_138969 -0.018890 \n",
+ "DD3S3_Cell_138970 0.027960 \n",
+ "DD3S3_Cell_138971 0.056645 \n",
+ "\n",
+ " aSMA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 4.572897 \n",
+ "DD3S2_Cell_1 1.727537 \n",
+ "DD3S2_Cell_2 3.988960 \n",
+ "DD3S2_Cell_3 4.889609 \n",
+ "DD3S2_Cell_4 2.903647 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -1.357780 \n",
+ "DD3S3_Cell_138968 2.320848 \n",
+ "DD3S3_Cell_138969 1.925448 \n",
+ "DD3S3_Cell_138970 2.756305 \n",
+ "DD3S3_Cell_138971 3.243583 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.043068 \n",
+ "DD3S2_Cell_1 -0.044315 \n",
+ "DD3S2_Cell_2 -0.025861 \n",
+ "DD3S2_Cell_3 -0.022507 \n",
+ "DD3S2_Cell_4 -0.065787 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 0.015659 \n",
+ "DD3S3_Cell_138968 0.148603 \n",
+ "DD3S3_Cell_138969 0.040476 \n",
+ "DD3S3_Cell_138970 -0.052645 \n",
+ "DD3S3_Cell_138971 -0.134464 \n",
+ "\n",
+ " Fibronectin_Cytoplasm_Intensity_Average ... Nuc_X \\\n",
+ "ID ... \n",
+ "DD3S2_Cell_0 -0.038325 ... 2033.197510 \n",
+ "DD3S2_Cell_1 0.020972 ... 2101.638184 \n",
+ "DD3S2_Cell_2 -0.014343 ... 2008.148193 \n",
+ "DD3S2_Cell_3 -0.014305 ... 1992.441162 \n",
+ "DD3S2_Cell_4 0.014397 ... 2092.007080 \n",
+ "... ... ... ... \n",
+ "DD3S3_Cell_138967 0.000000 ... 14827.791992 \n",
+ "DD3S3_Cell_138968 -0.028275 ... 14520.892578 \n",
+ "DD3S3_Cell_138969 0.002371 ... 14528.000000 \n",
+ "DD3S3_Cell_138970 -0.016522 ... 14553.461914 \n",
+ "DD3S3_Cell_138971 0.000000 ... 14543.513672 \n",
+ "\n",
+ " cell_subtype ROI_index immune_checkpoint Nuc_Y_Inv \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 none 0 none 15494.777344 \n",
+ "DD3S2_Cell_1 none 0 none 15495.552734 \n",
+ "DD3S2_Cell_2 none 0 none 15492.370117 \n",
+ "DD3S2_Cell_3 none 0 none 15489.808594 \n",
+ "DD3S2_Cell_4 none 0 none 15488.482422 \n",
+ "... ... ... ... ... \n",
+ "DD3S3_Cell_138967 none 63 none 1648.513916 \n",
+ "DD3S3_Cell_138968 none 63 none 1642.884644 \n",
+ "DD3S3_Cell_138969 none 63 none 1640.038452 \n",
+ "DD3S3_Cell_138970 none 63 none 1629.507690 \n",
+ "DD3S3_Cell_138971 none 63 none 1628.541626 \n",
+ "\n",
+ " Nucleus_Roundness Cell_Size Sample_ID cell_type \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.792312 307 DD3S2.csv none \n",
+ "DD3S2_Cell_1 0.749236 159 DD3S2.csv none \n",
+ "DD3S2_Cell_2 0.835324 267 DD3S2.csv none \n",
+ "DD3S2_Cell_3 0.671957 293 DD3S2.csv none \n",
+ "DD3S2_Cell_4 0.710829 225 DD3S2.csv none \n",
+ "... ... ... ... ... \n",
+ "DD3S3_Cell_138967 0.921498 318 DD3S3.csv none \n",
+ "DD3S3_Cell_138968 0.740617 309 DD3S3.csv none \n",
+ "DD3S3_Cell_138969 0.694157 155 DD3S3.csv none \n",
+ "DD3S3_Cell_138970 0.821441 243 DD3S3.csv none \n",
+ "DD3S3_Cell_138971 0.816589 193 DD3S3.csv none \n",
+ "\n",
+ " Nucleus_Size \n",
+ "ID \n",
+ "DD3S2_Cell_0 81 \n",
+ "DD3S2_Cell_1 47 \n",
+ "DD3S2_Cell_2 81 \n",
+ "DD3S2_Cell_3 68 \n",
+ "DD3S2_Cell_4 141 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 72 \n",
+ "DD3S3_Cell_138968 130 \n",
+ "DD3S3_Cell_138969 52 \n",
+ "DD3S3_Cell_138970 65 \n",
+ "DD3S3_Cell_138971 72 \n",
+ "\n",
+ "[341938 rows x 37 columns]"
+ ]
+ },
+ "execution_count": 54,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_merged"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "id": "f08ad579-6fb8-4f9d-a852-d155b0a267a3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " CD11c_Cytoplasm_Intensity_Average \n",
+ " B7H4_Cell_Intensity_Average \n",
+ " CD68_Cytoplasm_Intensity_Average \n",
+ " CD4_Cytoplasm_Intensity_Average \n",
+ " CD44_Cytoplasm_Intensity_Average \n",
+ " PDGFR_Cytoplasm_Intensity_Average \n",
+ " aSMA_Cytoplasm_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " Fibronectin_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nuc_X \n",
+ " cell_subtype \n",
+ " ROI_index \n",
+ " immune_checkpoint \n",
+ " Nuc_Y_Inv \n",
+ " Nucleus_Roundness \n",
+ " Cell_Size \n",
+ " Sample_ID \n",
+ " cell_type \n",
+ " Nucleus_Size \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_0 \n",
+ " -0.064917 \n",
+ " 0.076870 \n",
+ " 0.095181 \n",
+ " 0.111720 \n",
+ " 0.036713 \n",
+ " -0.140269 \n",
+ " 0.060348 \n",
+ " 3.032121 \n",
+ " 0.074029 \n",
+ " -0.142342 \n",
+ " ... \n",
+ " 2033.197510 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15494.777344 \n",
+ " 0.792312 \n",
+ " 307 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 81 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_1 \n",
+ " -0.014741 \n",
+ " 0.317169 \n",
+ " 0.089642 \n",
+ " 0.089277 \n",
+ " 0.010045 \n",
+ " -0.210864 \n",
+ " -0.011868 \n",
+ " 0.186760 \n",
+ " 0.072781 \n",
+ " -0.083045 \n",
+ " ... \n",
+ " 2101.638184 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15495.552734 \n",
+ " 0.749236 \n",
+ " 159 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 47 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_2 \n",
+ " -0.067434 \n",
+ " 0.140784 \n",
+ " 0.100500 \n",
+ " 0.137799 \n",
+ " 0.067064 \n",
+ " -0.124066 \n",
+ " 0.095729 \n",
+ " 2.448184 \n",
+ " 0.091235 \n",
+ " -0.118360 \n",
+ " ... \n",
+ " 2008.148193 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15492.370117 \n",
+ " 0.835324 \n",
+ " 267 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 81 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_3 \n",
+ " -0.078740 \n",
+ " 0.138145 \n",
+ " 0.101778 \n",
+ " 0.139755 \n",
+ " 0.055337 \n",
+ " -0.119403 \n",
+ " 0.072296 \n",
+ " 3.348832 \n",
+ " 0.094589 \n",
+ " -0.118322 \n",
+ " ... \n",
+ " 1992.441162 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15489.808594 \n",
+ " 0.671957 \n",
+ " 293 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 68 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_4 \n",
+ " -0.012311 \n",
+ " -0.029241 \n",
+ " 0.074751 \n",
+ " 0.062699 \n",
+ " 0.003921 \n",
+ " -0.219026 \n",
+ " 0.020884 \n",
+ " 1.362871 \n",
+ " 0.051309 \n",
+ " -0.089620 \n",
+ " ... \n",
+ " 2092.007080 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15488.482422 \n",
+ " 0.710829 \n",
+ " 225 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 141 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138967 \n",
+ " -0.020215 \n",
+ " 0.046427 \n",
+ " 0.027716 \n",
+ " 0.079357 \n",
+ " 2.294692 \n",
+ " -0.122235 \n",
+ " -0.046865 \n",
+ " -2.898557 \n",
+ " 0.132755 \n",
+ " -0.104017 \n",
+ " ... \n",
+ " 14827.791992 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1648.513916 \n",
+ " 0.921498 \n",
+ " 318 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 72 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138968 \n",
+ " 0.076802 \n",
+ " 0.041167 \n",
+ " -0.068320 \n",
+ " 0.106354 \n",
+ " 0.311618 \n",
+ " 0.053321 \n",
+ " 0.020884 \n",
+ " 0.780072 \n",
+ " 0.265699 \n",
+ " -0.132292 \n",
+ " ... \n",
+ " 14520.892578 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1642.884644 \n",
+ " 0.740617 \n",
+ " 309 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 130 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138969 \n",
+ " 0.039068 \n",
+ " 0.070701 \n",
+ " -0.032752 \n",
+ " 0.167348 \n",
+ " 0.278570 \n",
+ " -0.188367 \n",
+ " 0.001995 \n",
+ " 0.384672 \n",
+ " 0.157572 \n",
+ " -0.101646 \n",
+ " ... \n",
+ " 14528.000000 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1640.038452 \n",
+ " 0.694157 \n",
+ " 155 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 52 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138970 \n",
+ " -0.023966 \n",
+ " 0.031420 \n",
+ " -0.021935 \n",
+ " 0.031428 \n",
+ " 0.181278 \n",
+ " -0.071155 \n",
+ " 0.048845 \n",
+ " 1.215529 \n",
+ " 0.064451 \n",
+ " -0.120539 \n",
+ " ... \n",
+ " 14553.461914 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1629.507690 \n",
+ " 0.821441 \n",
+ " 243 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 65 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138971 \n",
+ " 0.031683 \n",
+ " -0.027507 \n",
+ " -0.151576 \n",
+ " -0.052954 \n",
+ " 0.510193 \n",
+ " 0.158693 \n",
+ " 0.077529 \n",
+ " 1.702806 \n",
+ " -0.017368 \n",
+ " -0.104017 \n",
+ " ... \n",
+ " 14543.513672 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1628.541626 \n",
+ " 0.816589 \n",
+ " 193 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 72 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
341938 rows Ć 37 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.064917 \n",
+ "DD3S2_Cell_1 -0.014741 \n",
+ "DD3S2_Cell_2 -0.067434 \n",
+ "DD3S2_Cell_3 -0.078740 \n",
+ "DD3S2_Cell_4 -0.012311 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -0.020215 \n",
+ "DD3S3_Cell_138968 0.076802 \n",
+ "DD3S3_Cell_138969 0.039068 \n",
+ "DD3S3_Cell_138970 -0.023966 \n",
+ "DD3S3_Cell_138971 0.031683 \n",
+ "\n",
+ " CD11c_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.076870 \n",
+ "DD3S2_Cell_1 0.317169 \n",
+ "DD3S2_Cell_2 0.140784 \n",
+ "DD3S2_Cell_3 0.138145 \n",
+ "DD3S2_Cell_4 -0.029241 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 0.046427 \n",
+ "DD3S3_Cell_138968 0.041167 \n",
+ "DD3S3_Cell_138969 0.070701 \n",
+ "DD3S3_Cell_138970 0.031420 \n",
+ "DD3S3_Cell_138971 -0.027507 \n",
+ "\n",
+ " B7H4_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.095181 \n",
+ "DD3S2_Cell_1 0.089642 \n",
+ "DD3S2_Cell_2 0.100500 \n",
+ "DD3S2_Cell_3 0.101778 \n",
+ "DD3S2_Cell_4 0.074751 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 0.027716 \n",
+ "DD3S3_Cell_138968 -0.068320 \n",
+ "DD3S3_Cell_138969 -0.032752 \n",
+ "DD3S3_Cell_138970 -0.021935 \n",
+ "DD3S3_Cell_138971 -0.151576 \n",
+ "\n",
+ " CD68_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.111720 \n",
+ "DD3S2_Cell_1 0.089277 \n",
+ "DD3S2_Cell_2 0.137799 \n",
+ "DD3S2_Cell_3 0.139755 \n",
+ "DD3S2_Cell_4 0.062699 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 0.079357 \n",
+ "DD3S3_Cell_138968 0.106354 \n",
+ "DD3S3_Cell_138969 0.167348 \n",
+ "DD3S3_Cell_138970 0.031428 \n",
+ "DD3S3_Cell_138971 -0.052954 \n",
+ "\n",
+ " CD4_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.036713 \n",
+ "DD3S2_Cell_1 0.010045 \n",
+ "DD3S2_Cell_2 0.067064 \n",
+ "DD3S2_Cell_3 0.055337 \n",
+ "DD3S2_Cell_4 0.003921 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 2.294692 \n",
+ "DD3S3_Cell_138968 0.311618 \n",
+ "DD3S3_Cell_138969 0.278570 \n",
+ "DD3S3_Cell_138970 0.181278 \n",
+ "DD3S3_Cell_138971 0.510193 \n",
+ "\n",
+ " CD44_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.140269 \n",
+ "DD3S2_Cell_1 -0.210864 \n",
+ "DD3S2_Cell_2 -0.124066 \n",
+ "DD3S2_Cell_3 -0.119403 \n",
+ "DD3S2_Cell_4 -0.219026 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -0.122235 \n",
+ "DD3S3_Cell_138968 0.053321 \n",
+ "DD3S3_Cell_138969 -0.188367 \n",
+ "DD3S3_Cell_138970 -0.071155 \n",
+ "DD3S3_Cell_138971 0.158693 \n",
+ "\n",
+ " PDGFR_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.060348 \n",
+ "DD3S2_Cell_1 -0.011868 \n",
+ "DD3S2_Cell_2 0.095729 \n",
+ "DD3S2_Cell_3 0.072296 \n",
+ "DD3S2_Cell_4 0.020884 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -0.046865 \n",
+ "DD3S3_Cell_138968 0.020884 \n",
+ "DD3S3_Cell_138969 0.001995 \n",
+ "DD3S3_Cell_138970 0.048845 \n",
+ "DD3S3_Cell_138971 0.077529 \n",
+ "\n",
+ " aSMA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 3.032121 \n",
+ "DD3S2_Cell_1 0.186760 \n",
+ "DD3S2_Cell_2 2.448184 \n",
+ "DD3S2_Cell_3 3.348832 \n",
+ "DD3S2_Cell_4 1.362871 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -2.898557 \n",
+ "DD3S3_Cell_138968 0.780072 \n",
+ "DD3S3_Cell_138969 0.384672 \n",
+ "DD3S3_Cell_138970 1.215529 \n",
+ "DD3S3_Cell_138971 1.702806 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.074029 \n",
+ "DD3S2_Cell_1 0.072781 \n",
+ "DD3S2_Cell_2 0.091235 \n",
+ "DD3S2_Cell_3 0.094589 \n",
+ "DD3S2_Cell_4 0.051309 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 0.132755 \n",
+ "DD3S3_Cell_138968 0.265699 \n",
+ "DD3S3_Cell_138969 0.157572 \n",
+ "DD3S3_Cell_138970 0.064451 \n",
+ "DD3S3_Cell_138971 -0.017368 \n",
+ "\n",
+ " Fibronectin_Cytoplasm_Intensity_Average ... Nuc_X \\\n",
+ "ID ... \n",
+ "DD3S2_Cell_0 -0.142342 ... 2033.197510 \n",
+ "DD3S2_Cell_1 -0.083045 ... 2101.638184 \n",
+ "DD3S2_Cell_2 -0.118360 ... 2008.148193 \n",
+ "DD3S2_Cell_3 -0.118322 ... 1992.441162 \n",
+ "DD3S2_Cell_4 -0.089620 ... 2092.007080 \n",
+ "... ... ... ... \n",
+ "DD3S3_Cell_138967 -0.104017 ... 14827.791992 \n",
+ "DD3S3_Cell_138968 -0.132292 ... 14520.892578 \n",
+ "DD3S3_Cell_138969 -0.101646 ... 14528.000000 \n",
+ "DD3S3_Cell_138970 -0.120539 ... 14553.461914 \n",
+ "DD3S3_Cell_138971 -0.104017 ... 14543.513672 \n",
+ "\n",
+ " cell_subtype ROI_index immune_checkpoint Nuc_Y_Inv \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 none 0 none 15494.777344 \n",
+ "DD3S2_Cell_1 none 0 none 15495.552734 \n",
+ "DD3S2_Cell_2 none 0 none 15492.370117 \n",
+ "DD3S2_Cell_3 none 0 none 15489.808594 \n",
+ "DD3S2_Cell_4 none 0 none 15488.482422 \n",
+ "... ... ... ... ... \n",
+ "DD3S3_Cell_138967 none 63 none 1648.513916 \n",
+ "DD3S3_Cell_138968 none 63 none 1642.884644 \n",
+ "DD3S3_Cell_138969 none 63 none 1640.038452 \n",
+ "DD3S3_Cell_138970 none 63 none 1629.507690 \n",
+ "DD3S3_Cell_138971 none 63 none 1628.541626 \n",
+ "\n",
+ " Nucleus_Roundness Cell_Size Sample_ID cell_type \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.792312 307 DD3S2.csv none \n",
+ "DD3S2_Cell_1 0.749236 159 DD3S2.csv none \n",
+ "DD3S2_Cell_2 0.835324 267 DD3S2.csv none \n",
+ "DD3S2_Cell_3 0.671957 293 DD3S2.csv none \n",
+ "DD3S2_Cell_4 0.710829 225 DD3S2.csv none \n",
+ "... ... ... ... ... \n",
+ "DD3S3_Cell_138967 0.921498 318 DD3S3.csv none \n",
+ "DD3S3_Cell_138968 0.740617 309 DD3S3.csv none \n",
+ "DD3S3_Cell_138969 0.694157 155 DD3S3.csv none \n",
+ "DD3S3_Cell_138970 0.821441 243 DD3S3.csv none \n",
+ "DD3S3_Cell_138971 0.816589 193 DD3S3.csv none \n",
+ "\n",
+ " Nucleus_Size \n",
+ "ID \n",
+ "DD3S2_Cell_0 81 \n",
+ "DD3S2_Cell_1 47 \n",
+ "DD3S2_Cell_2 81 \n",
+ "DD3S2_Cell_3 68 \n",
+ "DD3S2_Cell_4 141 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 72 \n",
+ "DD3S3_Cell_138968 130 \n",
+ "DD3S3_Cell_138969 52 \n",
+ "DD3S3_Cell_138970 65 \n",
+ "DD3S3_Cell_138971 72 \n",
+ "\n",
+ "[341938 rows x 37 columns]"
+ ]
+ },
+ "execution_count": 55,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Ensuring that the selected columns in df have been adjusted or normalized using the median values\n",
+ "df_merged.loc[:,~df_merged.columns.isin(not_intensities)] = \\\n",
+ " df_merged.loc[:,~df_merged.columns.isin(not_intensities)] - df_subset.loc[:,~df_subset.columns.isin(not_intensities)].median()\n",
+ "df_merged"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "id": "e98f6c1a-95f4-47bf-a6a6-b4372af40302",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " CD11c_Cytoplasm_Intensity_Average \n",
+ " B7H4_Cell_Intensity_Average \n",
+ " CD68_Cytoplasm_Intensity_Average \n",
+ " CD4_Cytoplasm_Intensity_Average \n",
+ " CD44_Cytoplasm_Intensity_Average \n",
+ " PDGFR_Cytoplasm_Intensity_Average \n",
+ " aSMA_Cytoplasm_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " Fibronectin_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nuc_X \n",
+ " cell_subtype \n",
+ " ROI_index \n",
+ " immune_checkpoint \n",
+ " Nuc_Y_Inv \n",
+ " Nucleus_Roundness \n",
+ " Cell_Size \n",
+ " Sample_ID \n",
+ " cell_type \n",
+ " Nucleus_Size \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_0 \n",
+ " -0.215233 \n",
+ " 0.590332 \n",
+ " 0.921484 \n",
+ " 0.836614 \n",
+ " 0.245243 \n",
+ " -0.130029 \n",
+ " 0.180935 \n",
+ " 1.830807 \n",
+ " 0.868011 \n",
+ " -0.355564 \n",
+ " ... \n",
+ " 2033.197510 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15494.777344 \n",
+ " 0.792312 \n",
+ " 307 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 81 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_1 \n",
+ " -0.048875 \n",
+ " 2.435750 \n",
+ " 0.867867 \n",
+ " 0.668550 \n",
+ " 0.067100 \n",
+ " -0.195470 \n",
+ " -0.035581 \n",
+ " 0.112767 \n",
+ " 0.853380 \n",
+ " -0.207442 \n",
+ " ... \n",
+ " 2101.638184 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15495.552734 \n",
+ " 0.749236 \n",
+ " 159 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 47 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_2 \n",
+ " -0.223577 \n",
+ " 1.081173 \n",
+ " 0.972982 \n",
+ " 1.031907 \n",
+ " 0.447987 \n",
+ " -0.115009 \n",
+ " 0.287015 \n",
+ " 1.478224 \n",
+ " 1.069760 \n",
+ " -0.295659 \n",
+ " ... \n",
+ " 2008.148193 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15492.370117 \n",
+ " 0.835324 \n",
+ " 267 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 81 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_3 \n",
+ " -0.261062 \n",
+ " 1.060907 \n",
+ " 0.985361 \n",
+ " 1.046554 \n",
+ " 0.369650 \n",
+ " -0.110687 \n",
+ " 0.216760 \n",
+ " 2.022039 \n",
+ " 1.109085 \n",
+ " -0.295563 \n",
+ " ... \n",
+ " 1992.441162 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15489.808594 \n",
+ " 0.671957 \n",
+ " 293 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 68 \n",
+ " \n",
+ " \n",
+ " DD3S2_Cell_4 \n",
+ " -0.040816 \n",
+ " -0.224558 \n",
+ " 0.723692 \n",
+ " 0.469517 \n",
+ " 0.026192 \n",
+ " -0.203036 \n",
+ " 0.062615 \n",
+ " 0.822907 \n",
+ " 0.601613 \n",
+ " -0.223867 \n",
+ " ... \n",
+ " 2092.007080 \n",
+ " none \n",
+ " 0 \n",
+ " none \n",
+ " 15488.482422 \n",
+ " 0.710829 \n",
+ " 225 \n",
+ " DD3S2.csv \n",
+ " none \n",
+ " 141 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138967 \n",
+ " -0.067022 \n",
+ " 0.356541 \n",
+ " 0.268335 \n",
+ " 0.594266 \n",
+ " 15.328433 \n",
+ " -0.113311 \n",
+ " -0.140511 \n",
+ " -1.750161 \n",
+ " 1.556596 \n",
+ " -0.259830 \n",
+ " ... \n",
+ " 14827.791992 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1648.513916 \n",
+ " 0.921498 \n",
+ " 318 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 72 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138968 \n",
+ " 0.254637 \n",
+ " 0.316147 \n",
+ " -0.661440 \n",
+ " 0.796430 \n",
+ " 2.081596 \n",
+ " 0.049428 \n",
+ " 0.062615 \n",
+ " 0.471011 \n",
+ " 3.115412 \n",
+ " -0.330460 \n",
+ " ... \n",
+ " 14520.892578 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1642.884644 \n",
+ " 0.740617 \n",
+ " 309 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 130 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138969 \n",
+ " 0.129529 \n",
+ " 0.542958 \n",
+ " -0.317083 \n",
+ " 1.253185 \n",
+ " 1.860832 \n",
+ " -0.174615 \n",
+ " 0.005980 \n",
+ " 0.232267 \n",
+ " 1.847584 \n",
+ " -0.253907 \n",
+ " ... \n",
+ " 14528.000000 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1640.038452 \n",
+ " 0.694157 \n",
+ " 155 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 52 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138970 \n",
+ " -0.079459 \n",
+ " 0.241296 \n",
+ " -0.212365 \n",
+ " 0.235347 \n",
+ " 1.210926 \n",
+ " -0.065961 \n",
+ " 0.146446 \n",
+ " 0.733941 \n",
+ " 0.755714 \n",
+ " -0.301101 \n",
+ " ... \n",
+ " 14553.461914 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1629.507690 \n",
+ " 0.821441 \n",
+ " 243 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 65 \n",
+ " \n",
+ " \n",
+ " DD3S3_Cell_138971 \n",
+ " 0.105045 \n",
+ " -0.211245 \n",
+ " -1.467472 \n",
+ " -0.396544 \n",
+ " 3.408068 \n",
+ " 0.147108 \n",
+ " 0.232450 \n",
+ " 1.028162 \n",
+ " -0.203649 \n",
+ " -0.259830 \n",
+ " ... \n",
+ " 14543.513672 \n",
+ " none \n",
+ " 63 \n",
+ " none \n",
+ " 1628.541626 \n",
+ " 0.816589 \n",
+ " 193 \n",
+ " DD3S3.csv \n",
+ " none \n",
+ " 72 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
341938 rows Ć 37 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.215233 \n",
+ "DD3S2_Cell_1 -0.048875 \n",
+ "DD3S2_Cell_2 -0.223577 \n",
+ "DD3S2_Cell_3 -0.261062 \n",
+ "DD3S2_Cell_4 -0.040816 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -0.067022 \n",
+ "DD3S3_Cell_138968 0.254637 \n",
+ "DD3S3_Cell_138969 0.129529 \n",
+ "DD3S3_Cell_138970 -0.079459 \n",
+ "DD3S3_Cell_138971 0.105045 \n",
+ "\n",
+ " CD11c_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.590332 \n",
+ "DD3S2_Cell_1 2.435750 \n",
+ "DD3S2_Cell_2 1.081173 \n",
+ "DD3S2_Cell_3 1.060907 \n",
+ "DD3S2_Cell_4 -0.224558 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 0.356541 \n",
+ "DD3S3_Cell_138968 0.316147 \n",
+ "DD3S3_Cell_138969 0.542958 \n",
+ "DD3S3_Cell_138970 0.241296 \n",
+ "DD3S3_Cell_138971 -0.211245 \n",
+ "\n",
+ " B7H4_Cell_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.921484 \n",
+ "DD3S2_Cell_1 0.867867 \n",
+ "DD3S2_Cell_2 0.972982 \n",
+ "DD3S2_Cell_3 0.985361 \n",
+ "DD3S2_Cell_4 0.723692 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 0.268335 \n",
+ "DD3S3_Cell_138968 -0.661440 \n",
+ "DD3S3_Cell_138969 -0.317083 \n",
+ "DD3S3_Cell_138970 -0.212365 \n",
+ "DD3S3_Cell_138971 -1.467472 \n",
+ "\n",
+ " CD68_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.836614 \n",
+ "DD3S2_Cell_1 0.668550 \n",
+ "DD3S2_Cell_2 1.031907 \n",
+ "DD3S2_Cell_3 1.046554 \n",
+ "DD3S2_Cell_4 0.469517 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 0.594266 \n",
+ "DD3S3_Cell_138968 0.796430 \n",
+ "DD3S3_Cell_138969 1.253185 \n",
+ "DD3S3_Cell_138970 0.235347 \n",
+ "DD3S3_Cell_138971 -0.396544 \n",
+ "\n",
+ " CD4_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.245243 \n",
+ "DD3S2_Cell_1 0.067100 \n",
+ "DD3S2_Cell_2 0.447987 \n",
+ "DD3S2_Cell_3 0.369650 \n",
+ "DD3S2_Cell_4 0.026192 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 15.328433 \n",
+ "DD3S3_Cell_138968 2.081596 \n",
+ "DD3S3_Cell_138969 1.860832 \n",
+ "DD3S3_Cell_138970 1.210926 \n",
+ "DD3S3_Cell_138971 3.408068 \n",
+ "\n",
+ " CD44_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 -0.130029 \n",
+ "DD3S2_Cell_1 -0.195470 \n",
+ "DD3S2_Cell_2 -0.115009 \n",
+ "DD3S2_Cell_3 -0.110687 \n",
+ "DD3S2_Cell_4 -0.203036 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -0.113311 \n",
+ "DD3S3_Cell_138968 0.049428 \n",
+ "DD3S3_Cell_138969 -0.174615 \n",
+ "DD3S3_Cell_138970 -0.065961 \n",
+ "DD3S3_Cell_138971 0.147108 \n",
+ "\n",
+ " PDGFR_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.180935 \n",
+ "DD3S2_Cell_1 -0.035581 \n",
+ "DD3S2_Cell_2 0.287015 \n",
+ "DD3S2_Cell_3 0.216760 \n",
+ "DD3S2_Cell_4 0.062615 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -0.140511 \n",
+ "DD3S3_Cell_138968 0.062615 \n",
+ "DD3S3_Cell_138969 0.005980 \n",
+ "DD3S3_Cell_138970 0.146446 \n",
+ "DD3S3_Cell_138971 0.232450 \n",
+ "\n",
+ " aSMA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 1.830807 \n",
+ "DD3S2_Cell_1 0.112767 \n",
+ "DD3S2_Cell_2 1.478224 \n",
+ "DD3S2_Cell_3 2.022039 \n",
+ "DD3S2_Cell_4 0.822907 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 -1.750161 \n",
+ "DD3S3_Cell_138968 0.471011 \n",
+ "DD3S3_Cell_138969 0.232267 \n",
+ "DD3S3_Cell_138970 0.733941 \n",
+ "DD3S3_Cell_138971 1.028162 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.868011 \n",
+ "DD3S2_Cell_1 0.853380 \n",
+ "DD3S2_Cell_2 1.069760 \n",
+ "DD3S2_Cell_3 1.109085 \n",
+ "DD3S2_Cell_4 0.601613 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 1.556596 \n",
+ "DD3S3_Cell_138968 3.115412 \n",
+ "DD3S3_Cell_138969 1.847584 \n",
+ "DD3S3_Cell_138970 0.755714 \n",
+ "DD3S3_Cell_138971 -0.203649 \n",
+ "\n",
+ " Fibronectin_Cytoplasm_Intensity_Average ... Nuc_X \\\n",
+ "ID ... \n",
+ "DD3S2_Cell_0 -0.355564 ... 2033.197510 \n",
+ "DD3S2_Cell_1 -0.207442 ... 2101.638184 \n",
+ "DD3S2_Cell_2 -0.295659 ... 2008.148193 \n",
+ "DD3S2_Cell_3 -0.295563 ... 1992.441162 \n",
+ "DD3S2_Cell_4 -0.223867 ... 2092.007080 \n",
+ "... ... ... ... \n",
+ "DD3S3_Cell_138967 -0.259830 ... 14827.791992 \n",
+ "DD3S3_Cell_138968 -0.330460 ... 14520.892578 \n",
+ "DD3S3_Cell_138969 -0.253907 ... 14528.000000 \n",
+ "DD3S3_Cell_138970 -0.301101 ... 14553.461914 \n",
+ "DD3S3_Cell_138971 -0.259830 ... 14543.513672 \n",
+ "\n",
+ " cell_subtype ROI_index immune_checkpoint Nuc_Y_Inv \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 none 0 none 15494.777344 \n",
+ "DD3S2_Cell_1 none 0 none 15495.552734 \n",
+ "DD3S2_Cell_2 none 0 none 15492.370117 \n",
+ "DD3S2_Cell_3 none 0 none 15489.808594 \n",
+ "DD3S2_Cell_4 none 0 none 15488.482422 \n",
+ "... ... ... ... ... \n",
+ "DD3S3_Cell_138967 none 63 none 1648.513916 \n",
+ "DD3S3_Cell_138968 none 63 none 1642.884644 \n",
+ "DD3S3_Cell_138969 none 63 none 1640.038452 \n",
+ "DD3S3_Cell_138970 none 63 none 1629.507690 \n",
+ "DD3S3_Cell_138971 none 63 none 1628.541626 \n",
+ "\n",
+ " Nucleus_Roundness Cell_Size Sample_ID cell_type \\\n",
+ "ID \n",
+ "DD3S2_Cell_0 0.792312 307 DD3S2.csv none \n",
+ "DD3S2_Cell_1 0.749236 159 DD3S2.csv none \n",
+ "DD3S2_Cell_2 0.835324 267 DD3S2.csv none \n",
+ "DD3S2_Cell_3 0.671957 293 DD3S2.csv none \n",
+ "DD3S2_Cell_4 0.710829 225 DD3S2.csv none \n",
+ "... ... ... ... ... \n",
+ "DD3S3_Cell_138967 0.921498 318 DD3S3.csv none \n",
+ "DD3S3_Cell_138968 0.740617 309 DD3S3.csv none \n",
+ "DD3S3_Cell_138969 0.694157 155 DD3S3.csv none \n",
+ "DD3S3_Cell_138970 0.821441 243 DD3S3.csv none \n",
+ "DD3S3_Cell_138971 0.816589 193 DD3S3.csv none \n",
+ "\n",
+ " Nucleus_Size \n",
+ "ID \n",
+ "DD3S2_Cell_0 81 \n",
+ "DD3S2_Cell_1 47 \n",
+ "DD3S2_Cell_2 81 \n",
+ "DD3S2_Cell_3 68 \n",
+ "DD3S2_Cell_4 141 \n",
+ "... ... \n",
+ "DD3S3_Cell_138967 72 \n",
+ "DD3S3_Cell_138968 130 \n",
+ "DD3S3_Cell_138969 52 \n",
+ "DD3S3_Cell_138970 65 \n",
+ "DD3S3_Cell_138971 72 \n",
+ "\n",
+ "[341938 rows x 37 columns]"
+ ]
+ },
+ "execution_count": 56,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_merged.loc[:,~df_merged.columns.isin(not_intensities)] = \\\n",
+ " df_merged.loc[:,~df_merged.columns.isin(not_intensities)] / df_subset.loc[:,~df_subset.columns.isin(not_intensities)].std(ddof=0)\n",
+ "df_merged"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "id": "a0f496dc-8108-4db1-b6be-beb6309a2120",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False"
+ ]
+ },
+ "execution_count": 58,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Check for NaN entries (should not be any unless columns do not align)\n",
+ "# False means no NaN entries \n",
+ "# True means NaN entries \n",
+ "df.isnull().any().any()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d7ecddf5-caea-4a82-95cc-b11e140255e8",
+ "metadata": {},
+ "source": [
+ "## III.7. SAVE"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "id": "1e9d7877-c96a-42de-8616-2468b9aeeeef",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "File /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S2_zscore.csv was created!\n",
+ "File /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_zscore/TMA_zscore.csv was created!\n",
+ "File /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S1_zscore.csv was created!\n",
+ "File /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S3_zscore.csv was created!\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Save the data by Sample_ID\n",
+ "# Check for the existence of the output file first\n",
+ "for sample in ls_samples:\n",
+ " sample_id = sample.split('_')[0]\n",
+ " filename = os.path.join(output_data_dir, sample_id + \"_\" + step_suffix + \".csv\")\n",
+ " if os.path.exists(filename):\n",
+ " print(\"File by name \"+filename+\" already exists.\")\n",
+ " else:\n",
+ " sample_id_csv = sample_id + '.csv'\n",
+ " df_save = df_merged.loc[df['Sample_ID'] == sample_id_csv, :]\n",
+ " #print(df_save)\n",
+ " filename = os.path.join(output_data_dir, sample_id + \"_\" + step_suffix + \".csv\")\n",
+ " df_save.to_csv(filename, index=True, index_label='ID') # Set index parameter to True to retain the index column\n",
+ " print(\"File \" + filename + \" was created!\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ad41ae17-9881-4d48-a782-f69e48c58a98",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b99ad434-28e1-487d-97c2-f25f1c52cfc1",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "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.11.7"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/wetransfer_data-zip_2024-05-17_1431/4_markers_tresholds.ipynb b/wetransfer_data-zip_2024-05-17_1431/4_markers_tresholds.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..f9450d3743921e95934104b01ccbf54d2648f1f0
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/4_markers_tresholds.ipynb
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:df84f15a0e72c1a84daae210d6334f49150c5d2aa03aae2688f1f839fdb1aeb1
+size 49760040
diff --git a/wetransfer_data-zip_2024-05-17_1431/5_cells_quant_class.ipynb b/wetransfer_data-zip_2024-05-17_1431/5_cells_quant_class.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..ca0d0d8bc993b8ad90dfe9f4e97b8a29b7d940ed
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/5_cells_quant_class.ipynb
@@ -0,0 +1,63574 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "d8258b09-f8c5-486c-8206-8ba8f475af5d",
+ "metadata": {},
+ "source": [
+ "# V. CELLS QUANTIFICATION AND CLASSIFICATION"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "7ce34589-aa00-4bd7-b047-49389c6b824a",
+ "metadata": {},
+ "source": [
+ "11/01/2024\n",
+ "Modifications by ZoƩ Gerber\n",
+ "from an original code from Marilyne Labrie"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "3e2a9466-d945-4f72-abdf-d442f5a37015",
+ "metadata": {},
+ "source": [
+ "V.1. PACKAGES IMPORT\n",
+ "V.2. DIRECTORIES\n",
+ "V.3. FILES\n",
+ " V.3.1. METADATA\n",
+ " V.3.2. NOT_INTENSITIES\n",
+ " V.3.3. FULL_TO_SHORT_COLUMN_NAMES\n",
+ " V.3.4. SHORT_TO_FULL_COLUMN_NAMES\n",
+ " V.3.5. SAMPLES COLORS\n",
+ " V.3.6. CHANNELS COLORS\n",
+ " V.3.7. ROUNDS COLORS\n",
+ " V.3.8. CELL TYPES COLORS\n",
+ " V.3.9. CELL SUBTYPES COLORS\n",
+ " V.3.10. IMMUNE CHECKPOINT COLORS\n",
+ " V.3.11. DATA\n",
+ " V.3.12. UNIQUE ROIs\n",
+ " V.3.13. NACT/NACT\n",
+ "V.4. COUNTS\n",
+ " V.4.1. CELL TYPES\n",
+ " V.4.2. CELL SUBTYPES\n",
+ " V.4.2.1. \n",
+ " \n",
+ " V.4.3. NACT\n",
+ "V.5. XY MAPS\n",
+ "V.6. CORRELATION PLOTS\n",
+ " V.6.1. OPTION 1\n",
+ " V.6.2. OPTION 2\n",
+ "V.7. PCA\n",
+ "V.8. KMEANS\n",
+ "V.9. T-SNE\n",
+ "V.10. SAVE"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f771a071-3f4c-4d05-954d-0c732ea5bf0e",
+ "metadata": {},
+ "source": [
+ "## V.1. PACKAGES IMPORT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "3c51f7fc-8851-48d5-b953-7a7e6a62baa7",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/5g/xq32h5h56rj2qzygbnhjg65h0000gn/T/ipykernel_22409/1860222382.py:13: DeprecationWarning: Please import `pearsonr` from the `scipy.stats` namespace; the `scipy.stats.stats` namespace is deprecated and will be removed in SciPy 2.0.0.\n",
+ " from scipy.stats.stats import pearsonr\n"
+ ]
+ }
+ ],
+ "source": [
+ "import os\n",
+ "import random\n",
+ "import re\n",
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import seaborn as sb\n",
+ "import matplotlib.pyplot as plt\n",
+ "import matplotlib.colors as mplc\n",
+ "import plotly.graph_objects as go\n",
+ "import warnings\n",
+ "import plotly.express as px\n",
+ "\n",
+ "from scipy.stats.stats import pearsonr\n",
+ "\n",
+ "from my_modules import *"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "4ccdde05-5c79-4b30-a0ff-d6347a96bed2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Silence FutureWarnings & UserWarnings\n",
+ "warnings.filterwarnings('ignore', category= FutureWarning)\n",
+ "warnings.filterwarnings('ignore', category= UserWarning)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f4234174-1a38-47f6-9a79-4902ef916c1d",
+ "metadata": {},
+ "source": [
+ "## V.2. *DIRECTORIES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "590d74b3-bfc9-418d-97b5-f1a9d0519e6e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Set base directory\n",
+ "\n",
+ "##### MAC WORKSTATION #####\n",
+ "#base_dir = r'/Volumes/LaboLabrie/Projets/OC_TMA_Pejovic/Temp/Zoe/CyCIF_pipeline/'\n",
+ "###########################\n",
+ "\n",
+ "##### WINDOWS WORKSTATION #####\n",
+ "#base_dir = r'C:\\Users\\LaboLabrie\\gerz2701\\Cyc-IF_pipeline\\Set_B'\n",
+ "###############################\n",
+ "\n",
+ "##### LOCAL WORKSTATION #####\n",
+ "base_dir = r'/Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431'\n",
+ "#############################\n",
+ "\n",
+ "#set_name = 'Set_A'\n",
+ "set_name = 'test'"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "4b322058-fc47-4933-a7ac-e811187e3c91",
+ "metadata": {},
+ "source": [
+ "The project is organized as :\n",
+ "main dir \n",
+ " code\n",
+ " proj_data > all csv files\n",
+ " proj_metadata > exposure time csv file, images dir,...\n",
+ " proj_qc_eda > csv after the QC/EDA step\n",
+ " proj_bs > csv after the BS step\n",
+ " proj_zscore > csv after the ZCORES step\n",
+ " proj_mt > csv after the MARKERS TRESHOLDS step\n",
+ " proj_cqc > csv after the CELLS QUANTICICATION AND CLASSIFICATION step"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "3629fde0-6ab2-41c2-b7d8-0d881b6d0311",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431 directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_mt directory already exists !\n",
+ "Creation of the /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_cqc directory...\n",
+ "Creation of the /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_cqc/images directory...\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata directory already exists !\n",
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/images directory already exists !\n"
+ ]
+ }
+ ],
+ "source": [
+ "project_name = set_name # Project name\n",
+ "step_suffix = 'cqc' # Curent part (here part V)\n",
+ "previous_step_suffix_long = \"_mt\" # Previous part (here MT NOTEBOOK)\n",
+ "\n",
+ "# Initial input data directory\n",
+ "input_data_dir = os.path.join(base_dir, project_name + previous_step_suffix_long) \n",
+ "\n",
+ "# BS output directories\n",
+ "output_data_dir = os.path.join(base_dir, project_name + \"_\" + step_suffix)\n",
+ "# BS images subdirectory\n",
+ "output_images_dir = os.path.join(output_data_dir,\"images\")\n",
+ "\n",
+ "# Data and Metadata directories\n",
+ "# Metadata directories\n",
+ "metadata_dir = os.path.join(base_dir, project_name + \"_metadata\")\n",
+ "# images subdirectory\n",
+ "metadata_images_dir = os.path.join(metadata_dir,\"images\")\n",
+ "\n",
+ "# Create directories if they don't already exist\n",
+ "for d in [base_dir, input_data_dir, output_data_dir, output_images_dir, metadata_dir, metadata_images_dir]:\n",
+ " if not os.path.exists(d):\n",
+ " print(\"Creation of the\" , d, \"directory...\")\n",
+ " os.makedirs(d)\n",
+ " else :\n",
+ " print(\"The\", d, \"directory already exists !\")\n",
+ "\n",
+ "os.chdir(input_data_dir)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "adc46cb2-a2c8-4ee6-ab2a-f2a69c907eef",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "base_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431\n",
+ "input_data_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_mt\n",
+ "output_data_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_cqc\n",
+ "output_images_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_cqc/images\n",
+ "metadata_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata\n",
+ "metadata_images_dir : /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/images\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Verify paths\n",
+ "print('base_dir :', base_dir)\n",
+ "print('input_data_dir :', input_data_dir)\n",
+ "print('output_data_dir :', output_data_dir)\n",
+ "print('output_images_dir :', output_images_dir)\n",
+ "print('metadata_dir :', metadata_dir)\n",
+ "print('metadata_images_dir :', metadata_images_dir)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bd22fe75-ff48-464b-8461-0ec543a7ed79",
+ "metadata": {},
+ "source": [
+ "## V.3. FILES"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "15862ca9-d6c2-4d7f-a90a-5b86990a4fd4",
+ "metadata": {},
+ "source": [
+ "### V.3.1. METADATA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "0863ca5e-11aa-4b4b-b87f-1a4a6d0f60ef",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/marker_intensity_metadata.csv file was imported for further analysis!\n",
+ "WARNING: 'Marker metadata file' has the following unexpected item(s): \n",
+ "['Exp']\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Round \n",
+ " Target \n",
+ " Exp \n",
+ " Channel \n",
+ " target_lower \n",
+ " full_column \n",
+ " marker \n",
+ " localisation \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cell_Intensity_Average \n",
+ " AF488 \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Cytoplasm_Intensity_Average \n",
+ " AF488 \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " R0 \n",
+ " AF488 \n",
+ " 300 \n",
+ " c2 \n",
+ " af488 \n",
+ " AF488_Nucleus_Intensity_Average \n",
+ " AF488 \n",
+ " nucleus \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cell_Intensity_Average \n",
+ " AF555 \n",
+ " cell \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " R0 \n",
+ " AF555 \n",
+ " 1500 \n",
+ " c3 \n",
+ " af555 \n",
+ " AF555_Cytoplasm_Intensity_Average \n",
+ " AF555 \n",
+ " cytoplasm \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Round Target Exp Channel target_lower full_column \\\n",
+ "0 R0 AF488 300 c2 af488 AF488_Cell_Intensity_Average \n",
+ "1 R0 AF488 300 c2 af488 AF488_Cytoplasm_Intensity_Average \n",
+ "2 R0 AF488 300 c2 af488 AF488_Nucleus_Intensity_Average \n",
+ "3 R0 AF555 1500 c3 af555 AF555_Cell_Intensity_Average \n",
+ "4 R0 AF555 1500 c3 af555 AF555_Cytoplasm_Intensity_Average \n",
+ "\n",
+ " marker localisation \n",
+ "0 AF488 cell \n",
+ "1 AF488 cytoplasm \n",
+ "2 AF488 nucleus \n",
+ "3 AF555 cell \n",
+ "4 AF555 cytoplasm "
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Import all metadata we need from the BS chapter\n",
+ "\n",
+ "filename = \"marker_intensity_metadata.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ "\n",
+ "# Open, read in information\n",
+ "metadata = pd.read_csv(filename)\n",
+ "\n",
+ "# Verify size with verify_line_no() function in my_modules.py\n",
+ "#verify_line_no(filename, metadata.shape[0] + 1)\n",
+ "\n",
+ "# Verify headers\n",
+ "exp_cols = ['Round','Target','Channel','target_lower','full_column','marker','localisation']\n",
+ "compare_headers(exp_cols, metadata.columns.values, \"Marker metadata file\")\n",
+ "\n",
+ "metadata = metadata.dropna()\n",
+ "metadata.head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "890f832b-ce09-4194-87d3-d71ca672bfbe",
+ "metadata": {},
+ "source": [
+ "### V.3.2. NOT_INTENSITIES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "f05a229d-756b-409b-9134-ed698e594a69",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/not_intensities.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "not_intensities =\n",
+ " ['Cytoplasm_Size', 'Nuc_X', 'Primary_chem(1)_vs_surg(0)', 'cluster', 'immune_checkpoint', 'Sample_ID', 'Nucleus_Roundness', 'Unique_ROI_index', 'Nuc_Y', 'Nuc_X_Inv', 'Cell_ID', 'cell_subtype', 'ID', 'Nuc_Y_Inv', 'Patient', 'replicate_ID', 'cell_type', 'ROI_index', 'Cell_Size', 'Nucleus_Size']\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"not_intensities.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "not_intensities = []\n",
+ "with open(filename, 'r') as fh:\n",
+ " not_intensities = fh.read().strip().split(\"\\n\")\n",
+ " # take str, strip whitespace, split on new line character\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, len(not_intensities))\n",
+ "\n",
+ "# Print to console\n",
+ "print(\"not_intensities =\\n\", not_intensities)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a8c13e7b-4a11-4375-93e5-a7550e986833",
+ "metadata": {},
+ "source": [
+ "### V.3.3. FULL_TO_SHORT_COLUMN_NAMES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "dbaa0a13-f499-41d5-abdc-a6f7be1f0600",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/full_to_short_column_names.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "full_to_short_names =\n",
+ " {'AF488_Cell_Intensity_Average': 'AF488_Cell', 'AF488_Cytoplasm_Intensity_Average': 'AF488_Cytoplasm', 'AF488_Nucleus_Intensity_Average': 'AF488_Nucleus', 'AF555_Cell_Intensity_Average': 'AF555_Cell', 'AF555_Cytoplasm_Intensity_Average': 'AF555_Cytoplasm', 'AF555_Nucleus_Intensity_Average': 'AF555_Nucleus', 'AF647_Cell_Intensity_Average': 'AF647_Cell', 'AF647_Cytoplasm_Intensity_Average': 'AF647_Cytoplasm', 'AF647_Nucleus_Intensity_Average': 'AF647_Nucleus', 'AF750_Cell_Intensity_Average': 'AF750_Cell', 'AF750_Cytoplasm_Intensity_Average': 'AF750_Cytoplasm', 'AF750_Nucleus_Intensity_Average': 'AF750_Nucleus', 'aSMA_Cell_Intensity_Average': 'aSMA_Cell', 'aSMA_Cytoplasm_Intensity_Average': 'aSMA_Cytoplasm', 'aSMA_Nucleus_Intensity_Average': 'aSMA_Nucleus', 'AXL_Cell_Intensity_Average': 'AXL_Cell', 'AXL_Cytoplasm_Intensity_Average': 'AXL_Cytoplasm', 'AXL_Nucleus_Intensity_Average': 'AXL_Nucleus', 'B7H4_Cell_Intensity_Average': 'B7H4_Cell', 'B7H4_Cytoplasm_Intensity_Average': 'B7H4_Cytoplasm', 'B7H4_Nucleus_Intensity_Average': 'B7H4_Nucleus', 'CA9_Cell_Intensity_Average': 'CA9_Cell', 'CA9_Cytoplasm_Intensity_Average': 'CA9_Cytoplasm', 'CA9_Nucleus_Intensity_Average': 'CA9_Nucleus', 'CD4_Cell_Intensity_Average': 'CD4_Cell', 'CD4_Cytoplasm_Intensity_Average': 'CD4_Cytoplasm', 'CD4_Nucleus_Intensity_Average': 'CD4_Nucleus', 'CD8_Cell_Intensity_Average': 'CD8_Cell', 'CD8_Cytoplasm_Intensity_Average': 'CD8_Cytoplasm', 'CD8_Nucleus_Intensity_Average': 'CD8_Nucleus', 'CD11b_Cell_Intensity_Average': 'CD11b_Cell', 'CD11b_Cytoplasm_Intensity_Average': 'CD11b_Cytoplasm', 'CD11b_Nucleus_Intensity_Average': 'CD11b_Nucleus', 'CD11c_Cell_Intensity_Average': 'CD11c_Cell', 'CD11c_Cytoplasm_Intensity_Average': 'CD11c_Cytoplasm', 'CD11c_Nucleus_Intensity_Average': 'CD11c_Nucleus', 'CD20_Cell_Intensity_Average': 'CD20_Cell', 'CD20_Cytoplasm_Intensity_Average': 'CD20_Cytoplasm', 'CD20_Nucleus_Intensity_Average': 'CD20_Nucleus', 'CD31_Cell_Intensity_Average': 'CD31_Cell', 'CD31_Cytoplasm_Intensity_Average': 'CD31_Cytoplasm', 'CD31_Nucleus_Intensity_Average': 'CD31_Nucleus', 'CD44_Cell_Intensity_Average': 'CD44_Cell', 'CD44_Cytoplasm_Intensity_Average': 'CD44_Cytoplasm', 'CD44_Nucleus_Intensity_Average': 'CD44_Nucleus', 'CD45_Cell_Intensity_Average': 'CD45_Cell', 'CD45_Cytoplasm_Intensity_Average': 'CD45_Cytoplasm', 'CD45_Nucleus_Intensity_Average': 'CD45_Nucleus', 'CD68_Cell_Intensity_Average': 'CD68_Cell', 'CD68_Cytoplasm_Intensity_Average': 'CD68_Cytoplasm', 'CD68_Nucleus_Intensity_Average': 'CD68_Nucleus', 'CD163_Cell_Intensity_Average': 'CD163_Cell', 'CD163_Cytoplasm_Intensity_Average': 'CD163_Cytoplasm', 'CD163_Nucleus_Intensity_Average': 'CD163_Nucleus', 'CKs_Cell_Intensity_Average': 'CKs_Cell', 'CKs_Cytoplasm_Intensity_Average': 'CKs_Cytoplasm', 'CKs_Nucleus_Intensity_Average': 'CKs_Nucleus', 'ColVI_Cell_Intensity_Average': 'ColVI_Cell', 'ColVI_Cytoplasm_Intensity_Average': 'ColVI_Cytoplasm', 'ColVI_Nucleus_Intensity_Average': 'ColVI_Nucleus', 'Desmin_Cell_Intensity_Average': 'Desmin_Cell', 'Desmin_Cytoplasm_Intensity_Average': 'Desmin_Cytoplasm', 'Desmin_Nucleus_Intensity_Average': 'Desmin_Nucleus', 'Ecad_Cell_Intensity_Average': 'Ecad_Cell', 'Ecad_Cytoplasm_Intensity_Average': 'Ecad_Cytoplasm', 'Ecad_Nucleus_Intensity_Average': 'Ecad_Nucleus', 'Fibronectin_Cell_Intensity_Average': 'Fibronectin_Cell', 'Fibronectin_Cytoplasm_Intensity_Average': 'Fibronectin_Cytoplasm', 'Fibronectin_Nucleus_Intensity_Average': 'Fibronectin_Nucleus', 'FOXP3_Cell_Intensity_Average': 'FOXP3_Cell', 'FOXP3_Cytoplasm_Intensity_Average': 'FOXP3_Cytoplasm', 'FOXP3_Nucleus_Intensity_Average': 'FOXP3_Nucleus', 'GATA3_Cell_Intensity_Average': 'GATA3_Cell', 'GATA3_Cytoplasm_Intensity_Average': 'GATA3_Cytoplasm', 'GATA3_Nucleus_Intensity_Average': 'GATA3_Nucleus', 'HLA_Cell_Intensity_Average': 'HLA_Cell', 'HLA_Cytoplasm_Intensity_Average': 'HLA_Cytoplasm', 'HLA_Nucleus_Intensity_Average': 'HLA_Nucleus', 'Ki67_Cell_Intensity_Average': 'Ki67_Cell', 'Ki67_Cytoplasm_Intensity_Average': 'Ki67_Cytoplasm', 'Ki67_Nucleus_Intensity_Average': 'Ki67_Nucleus', 'MMP9_Cell_Intensity_Average': 'MMP9_Cell', 'MMP9_Cytoplasm_Intensity_Average': 'MMP9_Cytoplasm', 'MMP9_Nucleus_Intensity_Average': 'MMP9_Nucleus', 'PD1_Cell_Intensity_Average': 'PD1_Cell', 'PD1_Cytoplasm_Intensity_Average': 'PD1_Cytoplasm', 'PD1_Nucleus_Intensity_Average': 'PD1_Nucleus', 'PDGFR_Cell_Intensity_Average': 'PDGFR_Cell', 'PDGFR_Cytoplasm_Intensity_Average': 'PDGFR_Cytoplasm', 'PDGFR_Nucleus_Intensity_Average': 'PDGFR_Nucleus', 'PDL1_Cell_Intensity_Average': 'PDL1_Cell', 'PDL1_Cytoplasm_Intensity_Average': 'PDL1_Cytoplasm', 'PDL1_Nucleus_Intensity_Average': 'PDL1_Nucleus', 'r5c2_Cell_Intensity_Average': 'r5c2_Cell', 'r5c2_Cytoplasm_Intensity_Average': 'r5c2_Cytoplasm', 'r5c2_Nucleus_Intensity_Average': 'r5c2_Nucleus', 'r7c2_Cell_Intensity_Average': 'r7c2_Cell', 'r7c2_Cytoplasm_Intensity_Average': 'r7c2_Cytoplasm', 'r7c2_Nucleus_Intensity_Average': 'r7c2_Nucleus', 'r8c2_Cell_Intensity_Average': 'r8c2_Cell', 'r8c2_Cytoplasm_Intensity_Average': 'r8c2_Cytoplasm', 'r8c2_Nucleus_Intensity_Average': 'r8c2_Nucleus', 'Sting_Cell_Intensity_Average': 'Sting_Cell', 'Sting_Cytoplasm_Intensity_Average': 'Sting_Cytoplasm', 'Sting_Nucleus_Intensity_Average': 'Sting_Nucleus', 'Vimentin_Cell_Intensity_Average': 'Vimentin_Cell', 'Vimentin_Cytoplasm_Intensity_Average': 'Vimentin_Cytoplasm', 'Vimentin_Nucleus_Intensity_Average': 'Vimentin_Nucleus'}\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"full_to_short_column_names.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \" + filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "full_to_short_names = df.set_index('full_name').T.to_dict('records')[0]\n",
+ "\n",
+ "# CD45 instead of CD45b\n",
+ "if project_name == 'Slide_A' :\n",
+ " full_to_short_names['CD45_Cytoplasm_Intensity_Average'] = full_to_short_names.pop('CD45b_Cytoplasm_Intensity_Average')\n",
+ " full_to_short_names['CD45_Cytoplasm_Intensity_Average'] = 'CD45_Cytoplasm'\n",
+ "\n",
+ "# Print information\n",
+ "print('full_to_short_names =\\n',full_to_short_names)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1a9431d5-a6a0-4fe0-bb58-97008c662a68",
+ "metadata": {},
+ "source": [
+ "### V.3.4. SHORT_TO_FULL_COLUMN_NAMES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "056adc64-1408-4f48-83d8-dec9f2f0e5cc",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/short_to_full_column_names.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "short_to_full_names =\n",
+ " {'AF488_Cell': 'AF488_Cell_Intensity_Average', 'AF488_Cytoplasm': 'AF488_Cytoplasm_Intensity_Average', 'AF488_Nucleus': 'AF488_Nucleus_Intensity_Average', 'AF555_Cell': 'AF555_Cell_Intensity_Average', 'AF555_Cytoplasm': 'AF555_Cytoplasm_Intensity_Average', 'AF555_Nucleus': 'AF555_Nucleus_Intensity_Average', 'AF647_Cell': 'AF647_Cell_Intensity_Average', 'AF647_Cytoplasm': 'AF647_Cytoplasm_Intensity_Average', 'AF647_Nucleus': 'AF647_Nucleus_Intensity_Average', 'AF750_Cell': 'AF750_Cell_Intensity_Average', 'AF750_Cytoplasm': 'AF750_Cytoplasm_Intensity_Average', 'AF750_Nucleus': 'AF750_Nucleus_Intensity_Average', 'aSMA_Cell': 'aSMA_Cell_Intensity_Average', 'aSMA_Cytoplasm': 'aSMA_Cytoplasm_Intensity_Average', 'aSMA_Nucleus': 'aSMA_Nucleus_Intensity_Average', 'AXL_Cell': 'AXL_Cell_Intensity_Average', 'AXL_Cytoplasm': 'AXL_Cytoplasm_Intensity_Average', 'AXL_Nucleus': 'AXL_Nucleus_Intensity_Average', 'B7H4_Cell': 'B7H4_Cell_Intensity_Average', 'B7H4_Cytoplasm': 'B7H4_Cytoplasm_Intensity_Average', 'B7H4_Nucleus': 'B7H4_Nucleus_Intensity_Average', 'CA9_Cell': 'CA9_Cell_Intensity_Average', 'CA9_Cytoplasm': 'CA9_Cytoplasm_Intensity_Average', 'CA9_Nucleus': 'CA9_Nucleus_Intensity_Average', 'CD4_Cell': 'CD4_Cell_Intensity_Average', 'CD4_Cytoplasm': 'CD4_Cytoplasm_Intensity_Average', 'CD4_Nucleus': 'CD4_Nucleus_Intensity_Average', 'CD8_Cell': 'CD8_Cell_Intensity_Average', 'CD8_Cytoplasm': 'CD8_Cytoplasm_Intensity_Average', 'CD8_Nucleus': 'CD8_Nucleus_Intensity_Average', 'CD11b_Cell': 'CD11b_Cell_Intensity_Average', 'CD11b_Cytoplasm': 'CD11b_Cytoplasm_Intensity_Average', 'CD11b_Nucleus': 'CD11b_Nucleus_Intensity_Average', 'CD11c_Cell': 'CD11c_Cell_Intensity_Average', 'CD11c_Cytoplasm': 'CD11c_Cytoplasm_Intensity_Average', 'CD11c_Nucleus': 'CD11c_Nucleus_Intensity_Average', 'CD20_Cell': 'CD20_Cell_Intensity_Average', 'CD20_Cytoplasm': 'CD20_Cytoplasm_Intensity_Average', 'CD20_Nucleus': 'CD20_Nucleus_Intensity_Average', 'CD31_Cell': 'CD31_Cell_Intensity_Average', 'CD31_Cytoplasm': 'CD31_Cytoplasm_Intensity_Average', 'CD31_Nucleus': 'CD31_Nucleus_Intensity_Average', 'CD44_Cell': 'CD44_Cell_Intensity_Average', 'CD44_Cytoplasm': 'CD44_Cytoplasm_Intensity_Average', 'CD44_Nucleus': 'CD44_Nucleus_Intensity_Average', 'CD45_Cell': 'CD45_Cell_Intensity_Average', 'CD45_Cytoplasm': 'CD45_Cytoplasm_Intensity_Average', 'CD45_Nucleus': 'CD45_Nucleus_Intensity_Average', 'CD68_Cell': 'CD68_Cell_Intensity_Average', 'CD68_Cytoplasm': 'CD68_Cytoplasm_Intensity_Average', 'CD68_Nucleus': 'CD68_Nucleus_Intensity_Average', 'CD163_Cell': 'CD163_Cell_Intensity_Average', 'CD163_Cytoplasm': 'CD163_Cytoplasm_Intensity_Average', 'CD163_Nucleus': 'CD163_Nucleus_Intensity_Average', 'CKs_Cell': 'CKs_Cell_Intensity_Average', 'CKs_Cytoplasm': 'CKs_Cytoplasm_Intensity_Average', 'CKs_Nucleus': 'CKs_Nucleus_Intensity_Average', 'ColVI_Cell': 'ColVI_Cell_Intensity_Average', 'ColVI_Cytoplasm': 'ColVI_Cytoplasm_Intensity_Average', 'ColVI_Nucleus': 'ColVI_Nucleus_Intensity_Average', 'Desmin_Cell': 'Desmin_Cell_Intensity_Average', 'Desmin_Cytoplasm': 'Desmin_Cytoplasm_Intensity_Average', 'Desmin_Nucleus': 'Desmin_Nucleus_Intensity_Average', 'Ecad_Cell': 'Ecad_Cell_Intensity_Average', 'Ecad_Cytoplasm': 'Ecad_Cytoplasm_Intensity_Average', 'Ecad_Nucleus': 'Ecad_Nucleus_Intensity_Average', 'Fibronectin_Cell': 'Fibronectin_Cell_Intensity_Average', 'Fibronectin_Cytoplasm': 'Fibronectin_Cytoplasm_Intensity_Average', 'Fibronectin_Nucleus': 'Fibronectin_Nucleus_Intensity_Average', 'FOXP3_Cell': 'FOXP3_Cell_Intensity_Average', 'FOXP3_Cytoplasm': 'FOXP3_Cytoplasm_Intensity_Average', 'FOXP3_Nucleus': 'FOXP3_Nucleus_Intensity_Average', 'GATA3_Cell': 'GATA3_Cell_Intensity_Average', 'GATA3_Cytoplasm': 'GATA3_Cytoplasm_Intensity_Average', 'GATA3_Nucleus': 'GATA3_Nucleus_Intensity_Average', 'HLA_Cell': 'HLA_Cell_Intensity_Average', 'HLA_Cytoplasm': 'HLA_Cytoplasm_Intensity_Average', 'HLA_Nucleus': 'HLA_Nucleus_Intensity_Average', 'Ki67_Cell': 'Ki67_Cell_Intensity_Average', 'Ki67_Cytoplasm': 'Ki67_Cytoplasm_Intensity_Average', 'Ki67_Nucleus': 'Ki67_Nucleus_Intensity_Average', 'MMP9_Cell': 'MMP9_Cell_Intensity_Average', 'MMP9_Cytoplasm': 'MMP9_Cytoplasm_Intensity_Average', 'MMP9_Nucleus': 'MMP9_Nucleus_Intensity_Average', 'PD1_Cell': 'PD1_Cell_Intensity_Average', 'PD1_Cytoplasm': 'PD1_Cytoplasm_Intensity_Average', 'PD1_Nucleus': 'PD1_Nucleus_Intensity_Average', 'PDGFR_Cell': 'PDGFR_Cell_Intensity_Average', 'PDGFR_Cytoplasm': 'PDGFR_Cytoplasm_Intensity_Average', 'PDGFR_Nucleus': 'PDGFR_Nucleus_Intensity_Average', 'PDL1_Cell': 'PDL1_Cell_Intensity_Average', 'PDL1_Cytoplasm': 'PDL1_Cytoplasm_Intensity_Average', 'PDL1_Nucleus': 'PDL1_Nucleus_Intensity_Average', 'r5c2_Cell': 'r5c2_Cell_Intensity_Average', 'r5c2_Cytoplasm': 'r5c2_Cytoplasm_Intensity_Average', 'r5c2_Nucleus': 'r5c2_Nucleus_Intensity_Average', 'r7c2_Cell': 'r7c2_Cell_Intensity_Average', 'r7c2_Cytoplasm': 'r7c2_Cytoplasm_Intensity_Average', 'r7c2_Nucleus': 'r7c2_Nucleus_Intensity_Average', 'r8c2_Cell': 'r8c2_Cell_Intensity_Average', 'r8c2_Cytoplasm': 'r8c2_Cytoplasm_Intensity_Average', 'r8c2_Nucleus': 'r8c2_Nucleus_Intensity_Average', 'Sting_Cell': 'Sting_Cell_Intensity_Average', 'Sting_Cytoplasm': 'Sting_Cytoplasm_Intensity_Average', 'Sting_Nucleus': 'Sting_Nucleus_Intensity_Average', 'Vimentin_Cell': 'Vimentin_Cell_Intensity_Average', 'Vimentin_Cytoplasm': 'Vimentin_Cytoplasm_Intensity_Average', 'Vimentin_Nucleus': 'Vimentin_Nucleus_Intensity_Average'}\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"short_to_full_column_names.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \" + filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "short_to_full_names = df.set_index('short_name').T.to_dict('records')[0]\n",
+ "\n",
+ "# CD45 instead of CD45b\n",
+ "if project_name == 'Slide_A' :\n",
+ " short_to_full_names['CD45_Cytoplasm'] = short_to_full_names.pop('CD45b_Cytoplasm')\n",
+ " short_to_full_names['CD45_Cytoplasm'] = 'CD45_Cytoplasm_Intensity_Average'\n",
+ "\n",
+ "# Print information\n",
+ "print('short_to_full_names =\\n',short_to_full_names)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7eda7993-e4e3-4a19-b1b0-24a5aa088a07",
+ "metadata": {},
+ "source": [
+ "### V.3.5. SAMPLES COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "bf3c90f9-c395-40a8-a2bd-2df946e2a05b",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "WARNING: Could not find desired file: /Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/sample_color_data.csv\n"
+ ]
+ },
+ {
+ "ename": "FileNotFoundError",
+ "evalue": "[Errno 2] No such file or directory: '/Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/sample_color_data.csv'",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[0;32mIn[12], line 11\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mThe\u001b[39m\u001b[38;5;124m\"\u001b[39m,filename,\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfile was imported for further analysis!\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m# Open, read in information\u001b[39;00m\n\u001b[0;32m---> 11\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mread_csv(filename, header \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m)\n\u001b[1;32m 12\u001b[0m df \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mdrop(columns \u001b[38;5;241m=\u001b[39m [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mhex\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m 14\u001b[0m \u001b[38;5;66;03m# our tuple of float values for rgb, (r, g, b) was read in \u001b[39;00m\n\u001b[1;32m 15\u001b[0m \u001b[38;5;66;03m# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\u001b[39;00m\n\u001b[1;32m 16\u001b[0m \u001b[38;5;66;03m# substrings and convert them back into floats\u001b[39;00m\n",
+ "File \u001b[0;32m/opt/anaconda3/envs/Cyc_If/lib/python3.11/site-packages/pandas/util/_decorators.py:211\u001b[0m, in \u001b[0;36mdeprecate_kwarg.._deprecate_kwarg..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 210\u001b[0m kwargs[new_arg_name] \u001b[38;5;241m=\u001b[39m new_arg_value\n\u001b[0;32m--> 211\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n",
+ "File \u001b[0;32m/opt/anaconda3/envs/Cyc_If/lib/python3.11/site-packages/pandas/util/_decorators.py:331\u001b[0m, in \u001b[0;36mdeprecate_nonkeyword_arguments..decorate..wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 325\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(args) \u001b[38;5;241m>\u001b[39m num_allow_args:\n\u001b[1;32m 326\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m 327\u001b[0m msg\u001b[38;5;241m.\u001b[39mformat(arguments\u001b[38;5;241m=\u001b[39m_format_argument_list(allow_args)),\n\u001b[1;32m 328\u001b[0m \u001b[38;5;167;01mFutureWarning\u001b[39;00m,\n\u001b[1;32m 329\u001b[0m stacklevel\u001b[38;5;241m=\u001b[39mfind_stack_level(),\n\u001b[1;32m 330\u001b[0m )\n\u001b[0;32m--> 331\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n",
+ "File \u001b[0;32m/opt/anaconda3/envs/Cyc_If/lib/python3.11/site-packages/pandas/io/parsers/readers.py:950\u001b[0m, in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, error_bad_lines, warn_bad_lines, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options)\u001b[0m\n\u001b[1;32m 935\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[1;32m 936\u001b[0m dialect,\n\u001b[1;32m 937\u001b[0m delimiter,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 946\u001b[0m defaults\u001b[38;5;241m=\u001b[39m{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelimiter\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m,\u001b[39m\u001b[38;5;124m\"\u001b[39m},\n\u001b[1;32m 947\u001b[0m )\n\u001b[1;32m 948\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[0;32m--> 950\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _read(filepath_or_buffer, kwds)\n",
+ "File \u001b[0;32m/opt/anaconda3/envs/Cyc_If/lib/python3.11/site-packages/pandas/io/parsers/readers.py:605\u001b[0m, in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 602\u001b[0m _validate_names(kwds\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[1;32m 604\u001b[0m \u001b[38;5;66;03m# Create the parser.\u001b[39;00m\n\u001b[0;32m--> 605\u001b[0m parser \u001b[38;5;241m=\u001b[39m TextFileReader(filepath_or_buffer, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwds)\n\u001b[1;32m 607\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chunksize \u001b[38;5;129;01mor\u001b[39;00m iterator:\n\u001b[1;32m 608\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parser\n",
+ "File \u001b[0;32m/opt/anaconda3/envs/Cyc_If/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1442\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 1439\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 1441\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles: IOHandles \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m-> 1442\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_make_engine(f, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mengine)\n",
+ "File \u001b[0;32m/opt/anaconda3/envs/Cyc_If/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1735\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[0;34m(self, f, engine)\u001b[0m\n\u001b[1;32m 1733\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m mode:\n\u001b[1;32m 1734\u001b[0m mode \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m-> 1735\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;241m=\u001b[39m get_handle(\n\u001b[1;32m 1736\u001b[0m f,\n\u001b[1;32m 1737\u001b[0m mode,\n\u001b[1;32m 1738\u001b[0m encoding\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mencoding\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[1;32m 1739\u001b[0m compression\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcompression\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[1;32m 1740\u001b[0m memory_map\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmemory_map\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mFalse\u001b[39;00m),\n\u001b[1;32m 1741\u001b[0m is_text\u001b[38;5;241m=\u001b[39mis_text,\n\u001b[1;32m 1742\u001b[0m errors\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mencoding_errors\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstrict\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[1;32m 1743\u001b[0m storage_options\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstorage_options\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[1;32m 1744\u001b[0m )\n\u001b[1;32m 1745\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 1746\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles\u001b[38;5;241m.\u001b[39mhandle\n",
+ "File \u001b[0;32m/opt/anaconda3/envs/Cyc_If/lib/python3.11/site-packages/pandas/io/common.py:856\u001b[0m, in \u001b[0;36mget_handle\u001b[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[1;32m 851\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(handle, \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m 852\u001b[0m \u001b[38;5;66;03m# Check whether the filename is to be opened in binary mode.\u001b[39;00m\n\u001b[1;32m 853\u001b[0m \u001b[38;5;66;03m# Binary mode does not support 'encoding' and 'newline'.\u001b[39;00m\n\u001b[1;32m 854\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mencoding \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mmode:\n\u001b[1;32m 855\u001b[0m \u001b[38;5;66;03m# Encoding\u001b[39;00m\n\u001b[0;32m--> 856\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(\n\u001b[1;32m 857\u001b[0m handle,\n\u001b[1;32m 858\u001b[0m ioargs\u001b[38;5;241m.\u001b[39mmode,\n\u001b[1;32m 859\u001b[0m encoding\u001b[38;5;241m=\u001b[39mioargs\u001b[38;5;241m.\u001b[39mencoding,\n\u001b[1;32m 860\u001b[0m errors\u001b[38;5;241m=\u001b[39merrors,\n\u001b[1;32m 861\u001b[0m newline\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 862\u001b[0m )\n\u001b[1;32m 863\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 864\u001b[0m \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[1;32m 865\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(handle, ioargs\u001b[38;5;241m.\u001b[39mmode)\n",
+ "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/Users/harshithakolipaka/Downloads/wetransfer_data-zip_2024-05-17_1431/test_metadata/sample_color_data.csv'"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"sample_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \" + filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "sample_color_dict = df.set_index('Sample_ID').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('sample_color_dict =\\n',sample_color_dict)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "27f77fc8-d11f-4598-b66b-436f45ea4be3",
+ "metadata": {},
+ "source": [
+ "### V.3.6. CHANNELS COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "50f9f41b-8c2a-4b1c-8787-a198c97ec606",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The C:\\Users\\zoege\\Documents\\Temp\\Cyc-IF_pipeline\\Set_B\\Set_B_metadata\\channel_color_data.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "channel_color_dict =\n",
+ " {'c2': (0.00784313725490196, 0.24313725490196078, 1.0), 'c3': (1.0, 0.48627450980392156, 0.0), 'c4': (0.10196078431372549, 0.788235294117647, 0.2196078431372549), 'c5': (0.9098039215686274, 0.0, 0.043137254901960784)}\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"channel_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "channel_color_dict = df.set_index('Channel').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('channel_color_dict =\\n',channel_color_dict)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "89fccf1f-692e-494e-b6db-208cbccc58d2",
+ "metadata": {},
+ "source": [
+ "### V.3.7. ROUNDS COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "b24c3fbf-c8ca-4b62-a1c0-b1b90ed67ac7",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The C:\\Users\\zoege\\Documents\\Temp\\Cyc-IF_pipeline\\Set_B\\Set_B_metadata\\round_color_data.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "round_color_dict =\n",
+ " {'R0': (0.28685356234627135, 0.13009829239513535, 0.23110332132624437), 'R1': (0.36541462435986094, 0.2025447048359916, 0.37693310021636883), 'R2': (0.40867533458903105, 0.2940761173840091, 0.5166711878800253), 'R3': (0.42890613750051265, 0.4082290173220481, 0.6335348887063806), 'R4': (0.4444462906865238, 0.5264664993764805, 0.7056321892616532), 'R5': (0.47707206309601013, 0.6427061780374552, 0.7418477948908153), 'R6': (0.5414454866716836, 0.7466759172596551, 0.7572905778378964), 'R7': (0.6414710091647722, 0.8321551072276492, 0.7746773027952071), 'R8': (0.7684256891219349, 0.8992667116749021, 0.8171383269422353)}\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"round_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "round_color_dict = df.set_index('Round').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('round_color_dict =\\n',round_color_dict)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "bca04ed4-76ce-47af-b922-769365c5eed9",
+ "metadata": {},
+ "source": [
+ "### V.3.8. CELL TYPES COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "9ddb549a-e104-42de-b8ed-a2e64cfe468a",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The C:\\Users\\zoege\\Documents\\Temp\\Cyc-IF_pipeline\\Set_B\\Set_B_metadata\\celltype_color_data.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "cell_type_color_dict =\n",
+ " {'CANCER': (0.1333, 0.5451, 0.1333), 'STROMA': (0.4, 0.4, 0.4), 'IMMUNE': (1.0, 1.0, 0.0), 'ENDOTHELIAL': (0.502, 0.0, 0.502)}\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"celltype_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "cell_type_color_dict = df.set_index('cell_type').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('cell_type_color_dict =\\n',cell_type_color_dict)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "691eef7d-175a-4d95-b0d5-6d07900e7ed3",
+ "metadata": {},
+ "source": [
+ "### V.3.9. CELL SUBTYPES COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "b2cc5232-8d4d-47fa-93a6-7b0520dc04e9",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The C:\\Users\\zoege\\Documents\\Temp\\Cyc-IF_pipeline\\Set_B\\Set_B_metadata\\cellsubtype_color_data.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "cell_subtype_color_dict =\n",
+ " {'DC': (0.6509803921568628, 0.807843137254902, 0.8901960784313725), 'B': (0.12156862745098039, 0.47058823529411764, 0.7058823529411765), 'TCD4': (0.6980392156862745, 0.8745098039215686, 0.5411764705882353), 'TCD8': (0.2, 0.6274509803921569, 0.17254901960784313), 'M1': (0.984313725490196, 0.6039215686274509, 0.6), 'M2': (0.8901960784313725, 0.10196078431372549, 0.10980392156862745), 'Treg': (0.9921568627450981, 0.7490196078431373, 0.43529411764705883), 'IMMUNE_OTHER': (1.0, 0.4980392156862745, 0.0), 'CANCER': (0.792156862745098, 0.6980392156862745, 0.8392156862745098), 'αSMA_myCAF': (0.41568627450980394, 0.23921568627450981, 0.6039215686274509), 'STROMA_OTHER': (1.0, 1.0, 0.6), 'ENDOTHELIAL': (0.6941176470588235, 0.34901960784313724, 0.1568627450980392)}\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"cellsubtype_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "cell_subtype_color_dict = df.set_index('cell_subtype').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('cell_subtype_color_dict =\\n',cell_subtype_color_dict) "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "40d4692c-fcf2-4663-b180-e6183bcbbe22",
+ "metadata": {},
+ "source": [
+ "### V.4.10. IMMUNE CHECKPOINT COLORS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "2da347b5-fa4d-40b4-b7f6-4f5c7d462f08",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The C:\\Users\\zoege\\Documents\\Temp\\Cyc-IF_pipeline\\Set_B\\Set_B_metadata\\immunecheckpoint_color_data.csv file was imported for further analysis!\n",
+ "Verifying data read from file is the correct length...\n",
+ "\n",
+ "immune_checkpoint_color_dict =\n",
+ " {'B7H4': (0.9677975592919913, 0.44127456009157356, 0.5358103155058701), 'PDL1': (0.3126890019504329, 0.6928754610296064, 0.1923704830330379), 'PD1': (0.23299120924703914, 0.639586552066035, 0.9260706093977744), 'B7H4_PDL1': (0.6402432806212122, 0.56707501056059, 0.36409039926945397), 'B7H4_PD1': (0.6003943842695152, 0.5404305560788043, 0.7309404624518223), 'PDL1_PD1': (0.27284010559873606, 0.6662310065478207, 0.5592205462154062), 'B7H4_PDL1_PD1': (0.5044925901631545, 0.5912455243957383, 0.5514171359788941), 'None': (0.8, 0.8, 0.8)}\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"immunecheckpoint_color_data.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \"+filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")\n",
+ " \n",
+ "# Open, read in information\n",
+ "df = pd.read_csv(filename, header = 0)\n",
+ "df = df.drop(columns = ['hex'])\n",
+ "\n",
+ "# our tuple of float values for rgb, (r, g, b) was read in \n",
+ "# as a string '(r, g, b)'. We need to extract the r-, g-, and b-\n",
+ "# substrings and convert them back into floats\n",
+ "df['rgb'] = df.apply(lambda row: rgb_tuple_from_str(row['rgb']), axis = 1)\n",
+ "\n",
+ "# Verify size\n",
+ "print(\"Verifying data read from file is the correct length...\\n\")\n",
+ "#verify_line_no(filename, df.shape[0] + 1)\n",
+ "\n",
+ "# Turn into dictionary\n",
+ "immune_checkpoint_color_dict = df.set_index('immune_checkpoint').T.to_dict('rgb')[0]\n",
+ "\n",
+ "# Print information\n",
+ "print('immune_checkpoint_color_dict =\\n',immune_checkpoint_color_dict)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5ba6cad2-ed2d-4fa7-afa5-6122bfdef493",
+ "metadata": {},
+ "source": [
+ "### V.3.11. DATA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "1ae727be-989a-4618-9c21-d741a6e862cc",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The following CSV files were detected:\n",
+ "['DD3S1_mt.csv', 'DD3S2_mt.csv', 'DD3S3_mt.csv', 'DD4S1_mt.csv', 'DD4S2_mt.csv', 'DD4S3_mt.csv', 'DD5S1_mt.csv', 'DD5S2_mt.csv', 'DD5S3_mt.csv', 'TMA_mt.csv']\n"
+ ]
+ }
+ ],
+ "source": [
+ "# DATA\n",
+ "# List files in the directory\n",
+ "# Check if the directory exists\n",
+ "if os.path.exists(input_data_dir):\n",
+ " # List files in the directory\n",
+ " ls_samples = [sample for sample in os.listdir(input_data_dir) if sample.endswith(\"_mt.csv\")]\n",
+ " print(\"The following CSV files were detected:\")\n",
+ " print([sample for sample in ls_samples])\n",
+ "else:\n",
+ " print(f\"The directory {input_data_dir} does not exist.\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "18a34f42-7d39-4177-b932-8dbb918732b1",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['PDL1_Cytoplasm_Intensity_Average' 'HLA_Cytoplasm_Intensity_Average'\n",
+ " 'CKs_Cytoplasm_Intensity_Average' 'Ki67_Nucleus_Intensity_Average'\n",
+ " 'CD163_Cytoplasm_Intensity_Average' 'ColVI_Cytoplasm_Intensity_Average'\n",
+ " 'CD20_Cytoplasm_Intensity_Average' 'PD1_Cytoplasm_Intensity_Average'\n",
+ " 'AXL_Cytoplasm_Intensity_Average' 'CD31_Cytoplasm_Intensity_Average'\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average'\n",
+ " 'CD45_Cytoplasm_Intensity_Average' 'Ecad_Cytoplasm_Intensity_Average'\n",
+ " 'CD8_Cytoplasm_Intensity_Average' 'GATA3_Nucleus_Intensity_Average'\n",
+ " 'Sting_Cytoplasm_Intensity_Average' 'aSMA_Cytoplasm_Intensity_Average'\n",
+ " 'FOXP3_Nucleus_Intensity_Average' 'CD11c_Cytoplasm_Intensity_Average'\n",
+ " 'CD4_Cytoplasm_Intensity_Average' 'Vimentin_Cytoplasm_Intensity_Average'\n",
+ " 'CD44_Cytoplasm_Intensity_Average' 'CD68_Cytoplasm_Intensity_Average'\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average' 'B7H4_Cell_Intensity_Average'\n",
+ " 'MMP9_Cytoplasm_Intensity_Average' 'Desmin_Cytoplasm_Intensity_Average'\n",
+ " 'cell_subtype' 'cell_type' 'Nuc_Y_Inv' 'Nucleus_Roundness' 'Nuc_X'\n",
+ " 'ROI_index' 'Nucleus_Size' 'Sample_ID' 'immune_checkpoint' 'Cell_Size']\n",
+ "DD3S1_mt.csv file is processed !\n",
+ "\n",
+ "DD3S2_mt.csv file is processed !\n",
+ "\n",
+ "DD3S3_mt.csv file is processed !\n",
+ "\n",
+ "DD4S1_mt.csv file is processed !\n",
+ "\n",
+ "DD4S2_mt.csv file is processed !\n",
+ "\n",
+ "DD4S3_mt.csv file is processed !\n",
+ "\n",
+ "DD5S1_mt.csv file is processed !\n",
+ "\n",
+ "DD5S2_mt.csv file is processed !\n",
+ "\n",
+ "DD5S3_mt.csv file is processed !\n",
+ "\n",
+ "TMA_mt.csv file is processed !\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Import all the others files\n",
+ "dfs = {}\n",
+ "\n",
+ "# Set variable to hold default header values\n",
+ "# First gather information on expected headers using first file in ls_samples\n",
+ "# Read in the first row of the file corresponding to the first sample (index = 0) in ls_samples\n",
+ "df = pd.read_csv(os.path.join(input_data_dir, ls_samples[0]) , index_col = 0, nrows = 1)\n",
+ "expected_headers = df.columns.values\n",
+ "print(expected_headers)\n",
+ "\n",
+ "###############################\n",
+ "# !! This may take a while !! #\n",
+ "###############################\n",
+ "for sample in ls_samples:\n",
+ " file_path = os.path.join(input_data_dir,sample)\n",
+ " \n",
+ " try:\n",
+ " # Read the CSV file\n",
+ " df = pd.read_csv(file_path, index_col=0)\n",
+ " # Check if the DataFrame is empty, if so, don't continue trying to process df and remove it\n",
+ " \n",
+ " if not df.empty:\n",
+ " # Reorder the columns to match the expected headers list\n",
+ " df = df.reindex(columns=expected_headers)\n",
+ " print(sample, \"file is processed !\\n\")\n",
+ " #print(df) \n",
+ " \n",
+ " except pd.errors.EmptyDataError:\n",
+ " print(f'\\nEmpty data error in {sample} file. Removing from analysis...')\n",
+ " ls_samples.remove(sample) \n",
+ " \n",
+ " # Add df to dfs \n",
+ " dfs[sample] = df\n",
+ "\n",
+ "#print(dfs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "id": "6b4c0b53-1c7f-43d7-8adc-f3f0750dc7c3",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.677863 \n",
+ "DD3S1_Cell_1 -0.677863 \n",
+ "DD3S1_Cell_2 -0.677863 \n",
+ "DD3S1_Cell_3 -0.741282 \n",
+ "DD3S1_Cell_6 -0.621521 \n",
+ "\n",
+ " HLA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.417494 \n",
+ "DD3S1_Cell_1 -0.516487 \n",
+ "DD3S1_Cell_2 -0.141921 \n",
+ "DD3S1_Cell_3 -0.460472 \n",
+ "DD3S1_Cell_6 -0.247254 \n",
+ "\n",
+ " CKs_Cytoplasm_Intensity_Average Ki67_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.912537 -0.817876 \n",
+ "DD3S1_Cell_1 -0.838037 -0.869685 \n",
+ "DD3S1_Cell_2 -1.016023 -0.755879 \n",
+ "DD3S1_Cell_3 -0.491711 -0.818084 \n",
+ "DD3S1_Cell_6 -0.867127 -0.742544 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.930099 \n",
+ "DD3S1_Cell_1 1.114924 \n",
+ "DD3S1_Cell_2 0.834577 \n",
+ "DD3S1_Cell_3 0.648200 \n",
+ "DD3S1_Cell_6 0.810579 \n",
+ "\n",
+ " ColVI_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.232078 \n",
+ "DD3S1_Cell_1 0.301333 \n",
+ "DD3S1_Cell_2 0.259216 \n",
+ "DD3S1_Cell_3 0.107027 \n",
+ "DD3S1_Cell_6 0.272128 \n",
+ "\n",
+ " CD20_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.483158 \n",
+ "DD3S1_Cell_1 -0.344770 \n",
+ "DD3S1_Cell_2 -0.438292 \n",
+ "DD3S1_Cell_3 -0.444889 \n",
+ "DD3S1_Cell_6 -0.507117 \n",
+ "\n",
+ " PD1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 1.535604 \n",
+ "DD3S1_Cell_1 1.668368 \n",
+ "DD3S1_Cell_2 1.336308 \n",
+ "DD3S1_Cell_3 1.249805 \n",
+ "DD3S1_Cell_6 1.251434 \n",
+ "\n",
+ " AXL_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.807339 \n",
+ "DD3S1_Cell_1 0.875455 \n",
+ "DD3S1_Cell_2 0.705088 \n",
+ "DD3S1_Cell_3 0.660707 \n",
+ "DD3S1_Cell_6 0.947172 \n",
+ "\n",
+ " CD31_Cytoplasm_Intensity_Average ... cell_subtype \\\n",
+ "ID ... \n",
+ "DD3S1_Cell_0 1.167755 ... αSMA_myCAF \n",
+ "DD3S1_Cell_1 1.643023 ... αSMA_myCAF \n",
+ "DD3S1_Cell_2 1.053636 ... αSMA_myCAF \n",
+ "DD3S1_Cell_3 1.165861 ... αSMA_myCAF \n",
+ "DD3S1_Cell_6 2.545301 ... ENDOTHELIAL \n",
+ "\n",
+ " cell_type Nuc_Y_Inv Nucleus_Roundness Nuc_X \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 STROMA 16632.205078 0.955040 1484.771729 \n",
+ "DD3S1_Cell_1 STROMA 16627.384766 0.966643 1426.250000 \n",
+ "DD3S1_Cell_2 STROMA 16622.238281 0.721534 1531.110474 \n",
+ "DD3S1_Cell_3 STROMA 16623.007812 0.587196 1518.907593 \n",
+ "DD3S1_Cell_6 ENDOTHELIAL 16619.978516 0.935716 1471.914917 \n",
+ "\n",
+ " ROI_index Nucleus_Size Sample_ID immune_checkpoint Cell_Size \n",
+ "ID \n",
+ "DD3S1_Cell_0 0 127 DD3S1.csv None 339 \n",
+ "DD3S1_Cell_1 0 112 DD3S1.csv None 344 \n",
+ "DD3S1_Cell_2 0 181 DD3S1.csv None 422 \n",
+ "DD3S1_Cell_3 0 119 DD3S1.csv None 278 \n",
+ "DD3S1_Cell_6 0 47 DD3S1.csv None 204 \n",
+ "\n",
+ "[5 rows x 37 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Merge dfs into one df\n",
+ "df = pd.concat(dfs.values(), ignore_index=False , sort = False)\n",
+ "del dfs\n",
+ "\n",
+ "print(df.head())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "id": "dfc864d5-5dfd-4b0d-827d-1ac4c7726099",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(704629, 37)"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "id": "66c3ad6e-af2d-40c5-9a14-dad5d9c180dc",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Index(['DD3S1_Cell_0', 'DD3S1_Cell_1', 'DD3S1_Cell_2', 'DD3S1_Cell_3',\n",
+ " 'DD3S1_Cell_6', 'DD3S1_Cell_7', 'DD3S1_Cell_8', 'DD3S1_Cell_10',\n",
+ " 'DD3S1_Cell_11', 'DD3S1_Cell_12',\n",
+ " ...\n",
+ " 'TMA_Cell_115750', 'TMA_Cell_115751', 'TMA_Cell_115752',\n",
+ " 'TMA_Cell_115753', 'TMA_Cell_115754', 'TMA_Cell_115755',\n",
+ " 'TMA_Cell_115756', 'TMA_Cell_115757', 'TMA_Cell_115758',\n",
+ " 'TMA_Cell_115760'],\n",
+ " dtype='object', name='ID', length=704629)"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.index "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "id": "4c918ffc-d7ac-463e-a6a4-785a72cf1066",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['PDL1_Cytoplasm_Intensity_Average',\n",
+ " 'HLA_Cytoplasm_Intensity_Average',\n",
+ " 'CKs_Cytoplasm_Intensity_Average',\n",
+ " 'Ki67_Nucleus_Intensity_Average',\n",
+ " 'CD163_Cytoplasm_Intensity_Average',\n",
+ " 'ColVI_Cytoplasm_Intensity_Average',\n",
+ " 'CD20_Cytoplasm_Intensity_Average',\n",
+ " 'PD1_Cytoplasm_Intensity_Average',\n",
+ " 'AXL_Cytoplasm_Intensity_Average',\n",
+ " 'CD31_Cytoplasm_Intensity_Average',\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average',\n",
+ " 'CD45_Cytoplasm_Intensity_Average',\n",
+ " 'Ecad_Cytoplasm_Intensity_Average',\n",
+ " 'CD8_Cytoplasm_Intensity_Average',\n",
+ " 'GATA3_Nucleus_Intensity_Average',\n",
+ " 'Sting_Cytoplasm_Intensity_Average',\n",
+ " 'aSMA_Cytoplasm_Intensity_Average',\n",
+ " 'FOXP3_Nucleus_Intensity_Average',\n",
+ " 'CD11c_Cytoplasm_Intensity_Average',\n",
+ " 'CD4_Cytoplasm_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'CD44_Cytoplasm_Intensity_Average',\n",
+ " 'CD68_Cytoplasm_Intensity_Average',\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average', 'B7H4_Cell_Intensity_Average',\n",
+ " 'MMP9_Cytoplasm_Intensity_Average',\n",
+ " 'Desmin_Cytoplasm_Intensity_Average', 'cell_subtype', 'cell_type',\n",
+ " 'Nuc_Y_Inv', 'Nucleus_Roundness', 'Nuc_X', 'ROI_index',\n",
+ " 'Nucleus_Size', 'Sample_ID', 'immune_checkpoint', 'Cell_Size'],\n",
+ " dtype=object)"
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.columns.values"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "id": "e4dc2462-3461-4a46-a131-561ebe444263",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Check for NaN entries (should not be any unless columns do not align)\n",
+ "# False means no NaN entries \n",
+ "# True means NaN entries \n",
+ "df.isnull().any().any()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c0829945-2326-4919-994d-9813663ba668",
+ "metadata": {},
+ "source": [
+ "### V.3.12. UNIQUE ROIs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "80525ae8-cb95-48d8-875e-5c0d2a35f102",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The C:\\Users\\zoege\\Documents\\Temp\\Cyc-IF_pipeline\\Set_B\\Set_B_metadata\\Set_B_unique_ROIs.csv file was imported for further analysis!\n"
+ ]
+ }
+ ],
+ "source": [
+ "# UNIQUE ROIs\n",
+ "filename = f'{project_name}_unique_ROIs.csv'\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \" + filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "b6bd5d54-85de-4acf-bc75-47b4b44ff1cb",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Sample_ID \n",
+ " ROI_index \n",
+ " Patient \n",
+ " Unique_ROI_index \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " DD3S1.csv \n",
+ " 0 \n",
+ " 61 \n",
+ " 61a \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " DD3S1.csv \n",
+ " 1 \n",
+ " 62 \n",
+ " 62a \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " DD3S1.csv \n",
+ " 2 \n",
+ " 63 \n",
+ " 63a \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " DD3S1.csv \n",
+ " 3 \n",
+ " 59 \n",
+ " 59a \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " DD3S1.csv \n",
+ " 4 \n",
+ " 60 \n",
+ " 60a \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 462 \n",
+ " TMA.csv \n",
+ " 55 \n",
+ " c55 \n",
+ " c55a \n",
+ " \n",
+ " \n",
+ " 463 \n",
+ " TMA.csv \n",
+ " 56 \n",
+ " c56 \n",
+ " c56a \n",
+ " \n",
+ " \n",
+ " 464 \n",
+ " TMA.csv \n",
+ " 57 \n",
+ " c57 \n",
+ " c57a \n",
+ " \n",
+ " \n",
+ " 465 \n",
+ " TMA.csv \n",
+ " 58 \n",
+ " c58 \n",
+ " c58a \n",
+ " \n",
+ " \n",
+ " 466 \n",
+ " TMA.csv \n",
+ " 59 \n",
+ " c59 \n",
+ " c59a \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
467 rows Ć 4 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Sample_ID ROI_index Patient Unique_ROI_index\n",
+ "0 DD3S1.csv 0 61 61a\n",
+ "1 DD3S1.csv 1 62 62a\n",
+ "2 DD3S1.csv 2 63 63a\n",
+ "3 DD3S1.csv 3 59 59a\n",
+ "4 DD3S1.csv 4 60 60a\n",
+ ".. ... ... ... ...\n",
+ "462 TMA.csv 55 c55 c55a\n",
+ "463 TMA.csv 56 c56 c56a\n",
+ "464 TMA.csv 57 c57 c57a\n",
+ "465 TMA.csv 58 c58 c58a\n",
+ "466 TMA.csv 59 c59 c59a\n",
+ "\n",
+ "[467 rows x 4 columns]"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Open, read in information\n",
+ "Unique_ROIs = pd.read_csv(filename,delimiter=';')\n",
+ "\n",
+ "# Verify headers\n",
+ "exp_cols = ['Sample_ID', 'ROI_index','Patient','Unique_ROI_index']\n",
+ "compare_headers(exp_cols, Unique_ROIs.columns.values, \"Unique_ROIs file\")\n",
+ "\n",
+ "Unique_ROIs = Unique_ROIs.dropna()\n",
+ "Unique_ROIs"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "id": "e5fff391-c158-4213-8fd4-7807d0158bdf",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " HLA_Cytoplasm_Intensity_Average \n",
+ " CKs_Cytoplasm_Intensity_Average \n",
+ " Ki67_Nucleus_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " ColVI_Cytoplasm_Intensity_Average \n",
+ " CD20_Cytoplasm_Intensity_Average \n",
+ " PD1_Cytoplasm_Intensity_Average \n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ " CD31_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nuc_Y_Inv \n",
+ " Nucleus_Roundness \n",
+ " Nuc_X \n",
+ " ROI_index \n",
+ " Nucleus_Size \n",
+ " Sample_ID \n",
+ " immune_checkpoint \n",
+ " Cell_Size \n",
+ " Patient \n",
+ " Unique_ROI_index \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_0 \n",
+ " -0.677863 \n",
+ " -0.417494 \n",
+ " -0.912537 \n",
+ " -0.817876 \n",
+ " 0.930099 \n",
+ " 0.232078 \n",
+ " -0.483158 \n",
+ " 1.535604 \n",
+ " 0.807339 \n",
+ " 1.167755 \n",
+ " ... \n",
+ " 16632.205078 \n",
+ " 0.955040 \n",
+ " 1484.771729 \n",
+ " 0 \n",
+ " 127 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 339 \n",
+ " 61 \n",
+ " 61a \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_1 \n",
+ " -0.677863 \n",
+ " -0.516487 \n",
+ " -0.838037 \n",
+ " -0.869685 \n",
+ " 1.114924 \n",
+ " 0.301333 \n",
+ " -0.344770 \n",
+ " 1.668368 \n",
+ " 0.875455 \n",
+ " 1.643023 \n",
+ " ... \n",
+ " 16627.384766 \n",
+ " 0.966643 \n",
+ " 1426.250000 \n",
+ " 0 \n",
+ " 112 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 344 \n",
+ " 61 \n",
+ " 61a \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_2 \n",
+ " -0.677863 \n",
+ " -0.141921 \n",
+ " -1.016023 \n",
+ " -0.755879 \n",
+ " 0.834577 \n",
+ " 0.259216 \n",
+ " -0.438292 \n",
+ " 1.336308 \n",
+ " 0.705088 \n",
+ " 1.053636 \n",
+ " ... \n",
+ " 16622.238281 \n",
+ " 0.721534 \n",
+ " 1531.110474 \n",
+ " 0 \n",
+ " 181 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 422 \n",
+ " 61 \n",
+ " 61a \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_3 \n",
+ " -0.741282 \n",
+ " -0.460472 \n",
+ " -0.491711 \n",
+ " -0.818084 \n",
+ " 0.648200 \n",
+ " 0.107027 \n",
+ " -0.444889 \n",
+ " 1.249805 \n",
+ " 0.660707 \n",
+ " 1.165861 \n",
+ " ... \n",
+ " 16623.007812 \n",
+ " 0.587196 \n",
+ " 1518.907593 \n",
+ " 0 \n",
+ " 119 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 278 \n",
+ " 61 \n",
+ " 61a \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_6 \n",
+ " -0.621521 \n",
+ " -0.247254 \n",
+ " -0.867127 \n",
+ " -0.742544 \n",
+ " 0.810579 \n",
+ " 0.272128 \n",
+ " -0.507117 \n",
+ " 1.251434 \n",
+ " 0.947172 \n",
+ " 2.545301 \n",
+ " ... \n",
+ " 16619.978516 \n",
+ " 0.935716 \n",
+ " 1471.914917 \n",
+ " 0 \n",
+ " 47 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 204 \n",
+ " 61 \n",
+ " 61a \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115755 \n",
+ " 0.478275 \n",
+ " 0.558670 \n",
+ " -0.962840 \n",
+ " 1.732291 \n",
+ " 0.507434 \n",
+ " -0.912641 \n",
+ " 0.311322 \n",
+ " 0.816068 \n",
+ " 0.596520 \n",
+ " 0.090397 \n",
+ " ... \n",
+ " 2663.253418 \n",
+ " 0.982196 \n",
+ " 15564.458008 \n",
+ " 59 \n",
+ " 142 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 386 \n",
+ " c59 \n",
+ " c59a \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115756 \n",
+ " 0.297418 \n",
+ " 0.420594 \n",
+ " -0.971632 \n",
+ " 1.966955 \n",
+ " 0.304365 \n",
+ " -1.164112 \n",
+ " 0.866636 \n",
+ " -0.092857 \n",
+ " -0.241830 \n",
+ " -0.617835 \n",
+ " ... \n",
+ " 2661.765869 \n",
+ " 0.775977 \n",
+ " 15629.680664 \n",
+ " 59 \n",
+ " 47 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 270 \n",
+ " c59 \n",
+ " c59a \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115757 \n",
+ " 0.346950 \n",
+ " 0.453951 \n",
+ " -0.602893 \n",
+ " 1.338956 \n",
+ " 0.559435 \n",
+ " -0.801333 \n",
+ " 0.447061 \n",
+ " 0.988156 \n",
+ " 1.567869 \n",
+ " 0.403878 \n",
+ " ... \n",
+ " 2657.015625 \n",
+ " 0.688747 \n",
+ " 15518.421875 \n",
+ " 59 \n",
+ " 64 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 202 \n",
+ " c59 \n",
+ " c59a \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115758 \n",
+ " -0.189415 \n",
+ " 0.508840 \n",
+ " -0.886041 \n",
+ " 0.647980 \n",
+ " -0.227224 \n",
+ " -1.022549 \n",
+ " -0.099256 \n",
+ " 0.219755 \n",
+ " 0.603715 \n",
+ " -0.219145 \n",
+ " ... \n",
+ " 2660.258545 \n",
+ " 0.751402 \n",
+ " 15539.275391 \n",
+ " 59 \n",
+ " 58 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 182 \n",
+ " c59 \n",
+ " c59a \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115760 \n",
+ " 0.245777 \n",
+ " 0.460219 \n",
+ " -1.003840 \n",
+ " 0.191158 \n",
+ " -0.313127 \n",
+ " -1.120675 \n",
+ " 0.004962 \n",
+ " -0.316199 \n",
+ " 1.727776 \n",
+ " -0.495501 \n",
+ " ... \n",
+ " 2654.292480 \n",
+ " 0.674126 \n",
+ " 15542.961914 \n",
+ " 59 \n",
+ " 106 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 295 \n",
+ " c59 \n",
+ " c59a \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
704629 rows Ć 39 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.677863 \n",
+ "DD3S1_Cell_1 -0.677863 \n",
+ "DD3S1_Cell_2 -0.677863 \n",
+ "DD3S1_Cell_3 -0.741282 \n",
+ "DD3S1_Cell_6 -0.621521 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.478275 \n",
+ "TMA_Cell_115756 0.297418 \n",
+ "TMA_Cell_115757 0.346950 \n",
+ "TMA_Cell_115758 -0.189415 \n",
+ "TMA_Cell_115760 0.245777 \n",
+ "\n",
+ " HLA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.417494 \n",
+ "DD3S1_Cell_1 -0.516487 \n",
+ "DD3S1_Cell_2 -0.141921 \n",
+ "DD3S1_Cell_3 -0.460472 \n",
+ "DD3S1_Cell_6 -0.247254 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.558670 \n",
+ "TMA_Cell_115756 0.420594 \n",
+ "TMA_Cell_115757 0.453951 \n",
+ "TMA_Cell_115758 0.508840 \n",
+ "TMA_Cell_115760 0.460219 \n",
+ "\n",
+ " CKs_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.912537 \n",
+ "DD3S1_Cell_1 -0.838037 \n",
+ "DD3S1_Cell_2 -1.016023 \n",
+ "DD3S1_Cell_3 -0.491711 \n",
+ "DD3S1_Cell_6 -0.867127 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.962840 \n",
+ "TMA_Cell_115756 -0.971632 \n",
+ "TMA_Cell_115757 -0.602893 \n",
+ "TMA_Cell_115758 -0.886041 \n",
+ "TMA_Cell_115760 -1.003840 \n",
+ "\n",
+ " Ki67_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.817876 \n",
+ "DD3S1_Cell_1 -0.869685 \n",
+ "DD3S1_Cell_2 -0.755879 \n",
+ "DD3S1_Cell_3 -0.818084 \n",
+ "DD3S1_Cell_6 -0.742544 \n",
+ "... ... \n",
+ "TMA_Cell_115755 1.732291 \n",
+ "TMA_Cell_115756 1.966955 \n",
+ "TMA_Cell_115757 1.338956 \n",
+ "TMA_Cell_115758 0.647980 \n",
+ "TMA_Cell_115760 0.191158 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.930099 \n",
+ "DD3S1_Cell_1 1.114924 \n",
+ "DD3S1_Cell_2 0.834577 \n",
+ "DD3S1_Cell_3 0.648200 \n",
+ "DD3S1_Cell_6 0.810579 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.507434 \n",
+ "TMA_Cell_115756 0.304365 \n",
+ "TMA_Cell_115757 0.559435 \n",
+ "TMA_Cell_115758 -0.227224 \n",
+ "TMA_Cell_115760 -0.313127 \n",
+ "\n",
+ " ColVI_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.232078 \n",
+ "DD3S1_Cell_1 0.301333 \n",
+ "DD3S1_Cell_2 0.259216 \n",
+ "DD3S1_Cell_3 0.107027 \n",
+ "DD3S1_Cell_6 0.272128 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.912641 \n",
+ "TMA_Cell_115756 -1.164112 \n",
+ "TMA_Cell_115757 -0.801333 \n",
+ "TMA_Cell_115758 -1.022549 \n",
+ "TMA_Cell_115760 -1.120675 \n",
+ "\n",
+ " CD20_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.483158 \n",
+ "DD3S1_Cell_1 -0.344770 \n",
+ "DD3S1_Cell_2 -0.438292 \n",
+ "DD3S1_Cell_3 -0.444889 \n",
+ "DD3S1_Cell_6 -0.507117 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.311322 \n",
+ "TMA_Cell_115756 0.866636 \n",
+ "TMA_Cell_115757 0.447061 \n",
+ "TMA_Cell_115758 -0.099256 \n",
+ "TMA_Cell_115760 0.004962 \n",
+ "\n",
+ " PD1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 1.535604 \n",
+ "DD3S1_Cell_1 1.668368 \n",
+ "DD3S1_Cell_2 1.336308 \n",
+ "DD3S1_Cell_3 1.249805 \n",
+ "DD3S1_Cell_6 1.251434 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.816068 \n",
+ "TMA_Cell_115756 -0.092857 \n",
+ "TMA_Cell_115757 0.988156 \n",
+ "TMA_Cell_115758 0.219755 \n",
+ "TMA_Cell_115760 -0.316199 \n",
+ "\n",
+ " AXL_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.807339 \n",
+ "DD3S1_Cell_1 0.875455 \n",
+ "DD3S1_Cell_2 0.705088 \n",
+ "DD3S1_Cell_3 0.660707 \n",
+ "DD3S1_Cell_6 0.947172 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.596520 \n",
+ "TMA_Cell_115756 -0.241830 \n",
+ "TMA_Cell_115757 1.567869 \n",
+ "TMA_Cell_115758 0.603715 \n",
+ "TMA_Cell_115760 1.727776 \n",
+ "\n",
+ " CD31_Cytoplasm_Intensity_Average ... Nuc_Y_Inv \\\n",
+ "ID ... \n",
+ "DD3S1_Cell_0 1.167755 ... 16632.205078 \n",
+ "DD3S1_Cell_1 1.643023 ... 16627.384766 \n",
+ "DD3S1_Cell_2 1.053636 ... 16622.238281 \n",
+ "DD3S1_Cell_3 1.165861 ... 16623.007812 \n",
+ "DD3S1_Cell_6 2.545301 ... 16619.978516 \n",
+ "... ... ... ... \n",
+ "TMA_Cell_115755 0.090397 ... 2663.253418 \n",
+ "TMA_Cell_115756 -0.617835 ... 2661.765869 \n",
+ "TMA_Cell_115757 0.403878 ... 2657.015625 \n",
+ "TMA_Cell_115758 -0.219145 ... 2660.258545 \n",
+ "TMA_Cell_115760 -0.495501 ... 2654.292480 \n",
+ "\n",
+ " Nucleus_Roundness Nuc_X ROI_index Nucleus_Size \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.955040 1484.771729 0 127 \n",
+ "DD3S1_Cell_1 0.966643 1426.250000 0 112 \n",
+ "DD3S1_Cell_2 0.721534 1531.110474 0 181 \n",
+ "DD3S1_Cell_3 0.587196 1518.907593 0 119 \n",
+ "DD3S1_Cell_6 0.935716 1471.914917 0 47 \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 0.982196 15564.458008 59 142 \n",
+ "TMA_Cell_115756 0.775977 15629.680664 59 47 \n",
+ "TMA_Cell_115757 0.688747 15518.421875 59 64 \n",
+ "TMA_Cell_115758 0.751402 15539.275391 59 58 \n",
+ "TMA_Cell_115760 0.674126 15542.961914 59 106 \n",
+ "\n",
+ " Sample_ID immune_checkpoint Cell_Size Patient \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 DD3S1.csv None 339 61 \n",
+ "DD3S1_Cell_1 DD3S1.csv None 344 61 \n",
+ "DD3S1_Cell_2 DD3S1.csv None 422 61 \n",
+ "DD3S1_Cell_3 DD3S1.csv None 278 61 \n",
+ "DD3S1_Cell_6 DD3S1.csv None 204 61 \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 TMA.csv None 386 c59 \n",
+ "TMA_Cell_115756 TMA.csv None 270 c59 \n",
+ "TMA_Cell_115757 TMA.csv None 202 c59 \n",
+ "TMA_Cell_115758 TMA.csv None 182 c59 \n",
+ "TMA_Cell_115760 TMA.csv None 295 c59 \n",
+ "\n",
+ " Unique_ROI_index \n",
+ "ID \n",
+ "DD3S1_Cell_0 61a \n",
+ "DD3S1_Cell_1 61a \n",
+ "DD3S1_Cell_2 61a \n",
+ "DD3S1_Cell_3 61a \n",
+ "DD3S1_Cell_6 61a \n",
+ "... ... \n",
+ "TMA_Cell_115755 c59a \n",
+ "TMA_Cell_115756 c59a \n",
+ "TMA_Cell_115757 c59a \n",
+ "TMA_Cell_115758 c59a \n",
+ "TMA_Cell_115760 c59a \n",
+ "\n",
+ "[704629 rows x 39 columns]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Jointure des deux dataframes sur la colonne 'Unique_ROI_index'\n",
+ "df1 = df.merge(Unique_ROIs[['Sample_ID', 'ROI_index', 'Patient', 'Unique_ROI_index']], on=['Sample_ID', 'ROI_index'], how='left')\n",
+ "\n",
+ "# Set the index of df1 to be the same as the index of df\n",
+ "df1.set_index(df.index, inplace=True)\n",
+ "\n",
+ "# VƩrification du nouveau dataframe\n",
+ "display(df1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "id": "de6d2be6-a650-44ce-9393-5b765cc5854e",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "No duplicates found.\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Resetting the index temporarily for checking for duplicates\n",
+ "# ID + Unique_ROI_index should not return any duplicate\n",
+ "df_temp = df1.copy()\n",
+ "df_temp.reset_index(inplace=True)\n",
+ "df_temp.rename(columns={'index': 'old_index'}, inplace=True)\n",
+ "\n",
+ "# Check for duplicates\n",
+ "duplicates = df_temp[df_temp.duplicated(['ID', 'Unique_ROI_index'], keep=False)]\n",
+ "if not duplicates.empty:\n",
+ " print(\"Duplicates found:\")\n",
+ " print(duplicates)\n",
+ "else:\n",
+ " print(\"No duplicates found.\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a2e1548c-1b97-4353-92b7-f002d571a751",
+ "metadata": {},
+ "source": [
+ "### V.3.13. NACT/ACT"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "c4cff1cb-d829-4651-9074-634be1b84fc5",
+ "metadata": {},
+ "source": [
+ "145 patients HGSC > 33 recieved NACT (23%)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "id": "16310c91-3a80-47ed-adac-8b8a55183b46",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The C:\\Users\\zoege\\Documents\\Temp\\Cyc-IF_pipeline\\Set_B\\Set_B_metadata\\TMA_Clinical_Data_187-OC.csv file was imported for further analysis!\n"
+ ]
+ }
+ ],
+ "source": [
+ "filename = \"TMA_Clinical_Data_187-OC.csv\"\n",
+ "filename = os.path.join(metadata_dir, filename)\n",
+ "\n",
+ "# Check file exists\n",
+ "if not os.path.exists(filename):\n",
+ " print(\"WARNING: Could not find desired file: \" + filename)\n",
+ "else :\n",
+ " print(\"The\",filename,\"file was imported for further analysis!\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "id": "668392ed-10dd-405d-8761-e9f5c1c8268a",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Patient \n",
+ " %_tumor \n",
+ " %_necrosis \n",
+ " Age_Diagnosis \n",
+ " BMI \n",
+ " CA125 \n",
+ " Race \n",
+ " Other_Cancers \n",
+ " BRCAStatus \n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ " ... \n",
+ " Histo_Type \n",
+ " Optimal_Debulking \n",
+ " Residual_Disease \n",
+ " Platinum_sensitive \n",
+ " Days_surgery_to_recurrence \n",
+ " Avastin \n",
+ " Disease_Stat \n",
+ " Days_from_surgery_to_last_contact_or_death \n",
+ " Recurrence \n",
+ " Vital_Status \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 1 \n",
+ " 80 \n",
+ " 5 \n",
+ " 72.0 \n",
+ " 35.0 \n",
+ " NaN \n",
+ " C \n",
+ " breast \n",
+ " 0 \n",
+ " 0 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 506.0 \n",
+ " 1.0 \n",
+ " DOD \n",
+ " 1776 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 2 \n",
+ " 50 \n",
+ " 0 \n",
+ " 36.0 \n",
+ " 24.0 \n",
+ " NaN \n",
+ " C \n",
+ " breast \n",
+ " 1 \n",
+ " 0 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 669.0 \n",
+ " 1.0 \n",
+ " DOD \n",
+ " 2223 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 3 \n",
+ " 80 \n",
+ " 5 \n",
+ " 55.0 \n",
+ " 45.0 \n",
+ " 944.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 0 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 596.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 1355 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 4 \n",
+ " 80 \n",
+ " 5 \n",
+ " 59.0 \n",
+ " 26.0 \n",
+ " 50.0 \n",
+ " C \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " ... \n",
+ " HGtubal \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " 1783 \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 5 \n",
+ " 50 \n",
+ " 0 \n",
+ " 70.0 \n",
+ " 32.0 \n",
+ " 1426.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " CCC \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 377.0 \n",
+ " 1.0 \n",
+ " DOD \n",
+ " 977 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 182 \n",
+ " 183 \n",
+ " 70 \n",
+ " 5 \n",
+ " 72.0 \n",
+ " 22.0 \n",
+ " 597.0 \n",
+ " C \n",
+ " breast \n",
+ " 0 \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " DOD \n",
+ " 1036 \n",
+ " NaN \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 183 \n",
+ " 184 \n",
+ " 90 \n",
+ " 0 \n",
+ " 72.0 \n",
+ " 26.0 \n",
+ " 3788.0 \n",
+ " C \n",
+ " breast \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 282.0 \n",
+ " 0.0 \n",
+ " NaN \n",
+ " 468 \n",
+ " 1.0 \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 184 \n",
+ " 185 \n",
+ " 90 \n",
+ " 0 \n",
+ " 70.0 \n",
+ " 29.0 \n",
+ " 1330.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 0 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " DOD \n",
+ " 1020 \n",
+ " NaN \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 185 \n",
+ " 186 \n",
+ " 80 \n",
+ " 0 \n",
+ " 84.0 \n",
+ " 17.0 \n",
+ " 564.0 \n",
+ " C \n",
+ " squamouscellcarcinoma \n",
+ " NaN \n",
+ " 0 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " NaN \n",
+ " DOC \n",
+ " 1869 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 186 \n",
+ " 187 \n",
+ " 80 \n",
+ " 0 \n",
+ " 27.0 \n",
+ " 22.0 \n",
+ " 922.0 \n",
+ " C \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " ... \n",
+ " serousprimarilylowgradewfociofhighgrade \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 540.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 1279 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
187 rows Ć 23 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Patient %_tumor %_necrosis Age_Diagnosis BMI CA125 Race \\\n",
+ "0 1 80 5 72.0 35.0 NaN C \n",
+ "1 2 50 0 36.0 24.0 NaN C \n",
+ "2 3 80 5 55.0 45.0 944.0 C \n",
+ "3 4 80 5 59.0 26.0 50.0 C \n",
+ "4 5 50 0 70.0 32.0 1426.0 C \n",
+ ".. ... ... ... ... ... ... ... \n",
+ "182 183 70 5 72.0 22.0 597.0 C \n",
+ "183 184 90 0 72.0 26.0 3788.0 C \n",
+ "184 185 90 0 70.0 29.0 1330.0 C \n",
+ "185 186 80 0 84.0 17.0 564.0 C \n",
+ "186 187 80 0 27.0 22.0 922.0 C \n",
+ "\n",
+ " Other_Cancers BRCAStatus Primary_chem(1)_vs_surg(0) ... \\\n",
+ "0 breast 0 0 ... \n",
+ "1 breast 1 0 ... \n",
+ "2 0 NaN 0 ... \n",
+ "3 0 0 0 ... \n",
+ "4 0 NaN 1 ... \n",
+ ".. ... ... ... ... \n",
+ "182 breast 0 1 ... \n",
+ "183 breast NaN 1 ... \n",
+ "184 0 NaN 0 ... \n",
+ "185 squamouscellcarcinoma NaN 0 ... \n",
+ "186 0 0 1 ... \n",
+ "\n",
+ " Histo_Type Optimal_Debulking \\\n",
+ "0 HGSOC 0.0 \n",
+ "1 HGSOC 1.0 \n",
+ "2 HGSOC 1.0 \n",
+ "3 HGtubal 1.0 \n",
+ "4 CCC NaN \n",
+ ".. ... ... \n",
+ "182 HGSOC 1.0 \n",
+ "183 HGSOC 1.0 \n",
+ "184 HGSOC 1.0 \n",
+ "185 HGSOC 1.0 \n",
+ "186 serousprimarilylowgradewfociofhighgrade 1.0 \n",
+ "\n",
+ " Residual_Disease Platinum_sensitive Days_surgery_to_recurrence Avastin \\\n",
+ "0 1.0 1.0 506.0 1.0 \n",
+ "1 0.0 1.0 669.0 1.0 \n",
+ "2 0.0 1.0 596.0 0.0 \n",
+ "3 0.0 NaN NaN NaN \n",
+ "4 0.0 1.0 377.0 1.0 \n",
+ ".. ... ... ... ... \n",
+ "182 0.0 1.0 NaN NaN \n",
+ "183 0.0 1.0 282.0 0.0 \n",
+ "184 0.0 NaN NaN NaN \n",
+ "185 0.0 NaN NaN NaN \n",
+ "186 1.0 1.0 540.0 0.0 \n",
+ "\n",
+ " Disease_Stat Days_from_surgery_to_last_contact_or_death Recurrence \\\n",
+ "0 DOD 1776 1.0 \n",
+ "1 DOD 2223 1.0 \n",
+ "2 DOD 1355 1.0 \n",
+ "3 NaN 1783 NaN \n",
+ "4 DOD 977 1.0 \n",
+ ".. ... ... ... \n",
+ "182 DOD 1036 NaN \n",
+ "183 NaN 468 1.0 \n",
+ "184 DOD 1020 NaN \n",
+ "185 DOC 1869 0.0 \n",
+ "186 DOD 1279 1.0 \n",
+ "\n",
+ " Vital_Status \n",
+ "0 1.0 \n",
+ "1 1.0 \n",
+ "2 1.0 \n",
+ "3 NaN \n",
+ "4 1.0 \n",
+ ".. ... \n",
+ "182 1.0 \n",
+ "183 NaN \n",
+ "184 1.0 \n",
+ "185 1.0 \n",
+ "186 1.0 \n",
+ "\n",
+ "[187 rows x 23 columns]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Open, read in information\n",
+ "clinical_data = pd.read_csv(filename,delimiter=',')\n",
+ "\n",
+ "# Renaming columns using the `rename` function\n",
+ "clinical_data = clinical_data.rename(columns={'ID': 'Patient'})\n",
+ "clinical_data['Patient'] = clinical_data['Patient'].astype(str)\n",
+ "df1['Patient'] = df1['Patient'].astype(str)\n",
+ "\n",
+ "# Display the first few rows to check the DataFrame\n",
+ "display(clinical_data)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "id": "ec19d762-81ad-4373-a67b-508775277930",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Index(['Patient', '%_tumor', '%_necrosis', 'Age_Diagnosis', 'BMI', 'CA125',\n",
+ " 'Race', 'Other_Cancers', 'BRCAStatus', 'Primary_chem(1)_vs_surg(0)',\n",
+ " 'Diagnosis_to_Start_Chemo', 'Diagnosis_to_surgery', 'Stage',\n",
+ " 'Histo_Type', 'Optimal_Debulking', 'Residual_Disease',\n",
+ " 'Platinum_sensitive', 'Days_surgery_to_recurrence', 'Avastin',\n",
+ " 'Disease_Stat', 'Days_from_surgery_to_last_contact_or_death',\n",
+ " 'Recurrence', 'Vital_Status'],\n",
+ " dtype='object')\n",
+ "(187, 23)\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(clinical_data.columns)\n",
+ "print(clinical_data.shape)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "id": "54ec5556-4b1e-43bf-ad0e-2f587eae3f9c",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Index(['PDL1_Cytoplasm_Intensity_Average', 'HLA_Cytoplasm_Intensity_Average',\n",
+ " 'CKs_Cytoplasm_Intensity_Average', 'Ki67_Nucleus_Intensity_Average',\n",
+ " 'CD163_Cytoplasm_Intensity_Average',\n",
+ " 'ColVI_Cytoplasm_Intensity_Average', 'CD20_Cytoplasm_Intensity_Average',\n",
+ " 'PD1_Cytoplasm_Intensity_Average', 'AXL_Cytoplasm_Intensity_Average',\n",
+ " 'CD31_Cytoplasm_Intensity_Average',\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average',\n",
+ " 'CD45_Cytoplasm_Intensity_Average', 'Ecad_Cytoplasm_Intensity_Average',\n",
+ " 'CD8_Cytoplasm_Intensity_Average', 'GATA3_Nucleus_Intensity_Average',\n",
+ " 'Sting_Cytoplasm_Intensity_Average', 'aSMA_Cytoplasm_Intensity_Average',\n",
+ " 'FOXP3_Nucleus_Intensity_Average', 'CD11c_Cytoplasm_Intensity_Average',\n",
+ " 'CD4_Cytoplasm_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'CD44_Cytoplasm_Intensity_Average', 'CD68_Cytoplasm_Intensity_Average',\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average', 'B7H4_Cell_Intensity_Average',\n",
+ " 'MMP9_Cytoplasm_Intensity_Average',\n",
+ " 'Desmin_Cytoplasm_Intensity_Average', 'cell_subtype', 'cell_type',\n",
+ " 'Nuc_Y_Inv', 'Nucleus_Roundness', 'Nuc_X', 'ROI_index', 'Nucleus_Size',\n",
+ " 'Sample_ID', 'immune_checkpoint', 'Cell_Size', 'Patient',\n",
+ " 'Unique_ROI_index'],\n",
+ " dtype='object')\n",
+ "(704629, 39)\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(df1.columns)\n",
+ "print(df1.shape)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "id": "41ddb21b-569c-4e65-8b8e-d3b1b1189246",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "PDL1_Cytoplasm_Intensity_Average float64\n",
+ "HLA_Cytoplasm_Intensity_Average float64\n",
+ "CKs_Cytoplasm_Intensity_Average float64\n",
+ "Ki67_Nucleus_Intensity_Average float64\n",
+ "CD163_Cytoplasm_Intensity_Average float64\n",
+ "ColVI_Cytoplasm_Intensity_Average float64\n",
+ "CD20_Cytoplasm_Intensity_Average float64\n",
+ "PD1_Cytoplasm_Intensity_Average float64\n",
+ "AXL_Cytoplasm_Intensity_Average float64\n",
+ "CD31_Cytoplasm_Intensity_Average float64\n",
+ "Fibronectin_Cytoplasm_Intensity_Average float64\n",
+ "CD45_Cytoplasm_Intensity_Average float64\n",
+ "Ecad_Cytoplasm_Intensity_Average float64\n",
+ "CD8_Cytoplasm_Intensity_Average float64\n",
+ "GATA3_Nucleus_Intensity_Average float64\n",
+ "Sting_Cytoplasm_Intensity_Average float64\n",
+ "aSMA_Cytoplasm_Intensity_Average float64\n",
+ "FOXP3_Nucleus_Intensity_Average float64\n",
+ "CD11c_Cytoplasm_Intensity_Average float64\n",
+ "CD4_Cytoplasm_Intensity_Average float64\n",
+ "Vimentin_Cytoplasm_Intensity_Average float64\n",
+ "CD44_Cytoplasm_Intensity_Average float64\n",
+ "CD68_Cytoplasm_Intensity_Average float64\n",
+ "PDGFR_Cytoplasm_Intensity_Average float64\n",
+ "B7H4_Cell_Intensity_Average float64\n",
+ "MMP9_Cytoplasm_Intensity_Average float64\n",
+ "Desmin_Cytoplasm_Intensity_Average float64\n",
+ "cell_subtype object\n",
+ "cell_type object\n",
+ "Nuc_Y_Inv float64\n",
+ "Nucleus_Roundness float64\n",
+ "Nuc_X float64\n",
+ "ROI_index int64\n",
+ "Nucleus_Size int64\n",
+ "Sample_ID object\n",
+ "immune_checkpoint object\n",
+ "Cell_Size int64\n",
+ "Patient object\n",
+ "Unique_ROI_index object\n",
+ "dtype: object\n",
+ "\n",
+ "Patient object\n",
+ "%_tumor int64\n",
+ "%_necrosis int64\n",
+ "Age_Diagnosis float64\n",
+ "BMI float64\n",
+ "CA125 float64\n",
+ "Race object\n",
+ "Other_Cancers object\n",
+ "BRCAStatus object\n",
+ "Primary_chem(1)_vs_surg(0) int64\n",
+ "Diagnosis_to_Start_Chemo float64\n",
+ "Diagnosis_to_surgery int64\n",
+ "Stage object\n",
+ "Histo_Type object\n",
+ "Optimal_Debulking float64\n",
+ "Residual_Disease float64\n",
+ "Platinum_sensitive float64\n",
+ "Days_surgery_to_recurrence float64\n",
+ "Avastin float64\n",
+ "Disease_Stat object\n",
+ "Days_from_surgery_to_last_contact_or_death int64\n",
+ "Recurrence float64\n",
+ "Vital_Status float64\n",
+ "dtype: object\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Display data types of columns in df1 and NACT\n",
+ "print(df1.dtypes)\n",
+ "print('')\n",
+ "print(clinical_data.dtypes)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "id": "39ed5f55-ac13-4702-9686-dc642853e20a",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Patients uniques dans df1 mais absents dans clinical_data:\n",
+ "{'c37', 'c50', 'c38', 'c6', 'c52', 'c55', 'c13', 'c0', 'c25', 'c51', 'c19', 'c42', 'c57', 'c41', 'c56', 'c40', 'c18', 'c21', 'c48', 'c49', 'c1', 'c26', 'c23', 'c39', 'c15', 'c45', 'c34', 'c58', 'c43', 'c32', 'c8', 'c9', 'c4', 'c35', 'c14', 'c27', 'c7', 'c20', 'c2', 'c12', 'c16', 'c46', 'c3', 'c31', 'c28', 'c53', 'c24', 'c59', 'c5', 'c22', 'c11', 'c54', 'c44', 'c17', 'c30', 'c29', 'c10', 'c47', 'c33', 'c36'}\n",
+ "\n",
+ "Patients uniques dans clinical_data mais absents dans df1:\n",
+ "{'138', '2', '93', '151', '31', '145', '163', '1', '118', '76'}\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Liste des valeurs uniques dans la colonne 'Patient' de chaque DataFrame\n",
+ "patients_df1 = set(df1['Patient'].unique())\n",
+ "patients_clinical_data = set(clinical_data['Patient'].unique())\n",
+ "\n",
+ "# Patients prƩsents dans df1 mais absents dans clinical_data\n",
+ "patients_unique_to_df1 = patients_df1 - patients_clinical_data\n",
+ "\n",
+ "# Patients prƩsents dans NACT mais absents dans df1\n",
+ "patients_unique_to_clinical_data = patients_clinical_data - patients_df1\n",
+ "\n",
+ "# Affichage des patients uniques dans chaque DataFrame\n",
+ "print(\"Patients uniques dans df1 mais absents dans clinical_data:\")\n",
+ "print(patients_unique_to_df1)\n",
+ "\n",
+ "# no segmented cores?\n",
+ "print(\"\\nPatients uniques dans clinical_data mais absents dans df1:\")\n",
+ "print(patients_unique_to_clinical_data)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "id": "14078e4d-2be6-4564-9fd0-6f28362a07c5",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Index(['PDL1_Cytoplasm_Intensity_Average', 'HLA_Cytoplasm_Intensity_Average',\n",
+ " 'CKs_Cytoplasm_Intensity_Average', 'Ki67_Nucleus_Intensity_Average',\n",
+ " 'CD163_Cytoplasm_Intensity_Average',\n",
+ " 'ColVI_Cytoplasm_Intensity_Average', 'CD20_Cytoplasm_Intensity_Average',\n",
+ " 'PD1_Cytoplasm_Intensity_Average', 'AXL_Cytoplasm_Intensity_Average',\n",
+ " 'CD31_Cytoplasm_Intensity_Average',\n",
+ " 'Fibronectin_Cytoplasm_Intensity_Average',\n",
+ " 'CD45_Cytoplasm_Intensity_Average', 'Ecad_Cytoplasm_Intensity_Average',\n",
+ " 'CD8_Cytoplasm_Intensity_Average', 'GATA3_Nucleus_Intensity_Average',\n",
+ " 'Sting_Cytoplasm_Intensity_Average', 'aSMA_Cytoplasm_Intensity_Average',\n",
+ " 'FOXP3_Nucleus_Intensity_Average', 'CD11c_Cytoplasm_Intensity_Average',\n",
+ " 'CD4_Cytoplasm_Intensity_Average',\n",
+ " 'Vimentin_Cytoplasm_Intensity_Average',\n",
+ " 'CD44_Cytoplasm_Intensity_Average', 'CD68_Cytoplasm_Intensity_Average',\n",
+ " 'PDGFR_Cytoplasm_Intensity_Average', 'B7H4_Cell_Intensity_Average',\n",
+ " 'MMP9_Cytoplasm_Intensity_Average',\n",
+ " 'Desmin_Cytoplasm_Intensity_Average', 'cell_subtype', 'cell_type',\n",
+ " 'Nuc_Y_Inv', 'Nucleus_Roundness', 'Nuc_X', 'ROI_index', 'Nucleus_Size',\n",
+ " 'Sample_ID', 'immune_checkpoint', 'Cell_Size', 'Patient',\n",
+ " 'Unique_ROI_index', 'Primary_chem(1)_vs_surg(0)'],\n",
+ " dtype='object')\n",
+ "(704629, 40)\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " HLA_Cytoplasm_Intensity_Average \n",
+ " CKs_Cytoplasm_Intensity_Average \n",
+ " Ki67_Nucleus_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " ColVI_Cytoplasm_Intensity_Average \n",
+ " CD20_Cytoplasm_Intensity_Average \n",
+ " PD1_Cytoplasm_Intensity_Average \n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ " CD31_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nucleus_Roundness \n",
+ " Nuc_X \n",
+ " ROI_index \n",
+ " Nucleus_Size \n",
+ " Sample_ID \n",
+ " immune_checkpoint \n",
+ " Cell_Size \n",
+ " Patient \n",
+ " Unique_ROI_index \n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_0 \n",
+ " -0.677863 \n",
+ " -0.417494 \n",
+ " -0.912537 \n",
+ " -0.817876 \n",
+ " 0.930099 \n",
+ " 0.232078 \n",
+ " -0.483158 \n",
+ " 1.535604 \n",
+ " 0.807339 \n",
+ " 1.167755 \n",
+ " ... \n",
+ " 0.955040 \n",
+ " 1484.771729 \n",
+ " 0 \n",
+ " 127 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 339 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_1 \n",
+ " -0.677863 \n",
+ " -0.516487 \n",
+ " -0.838037 \n",
+ " -0.869685 \n",
+ " 1.114924 \n",
+ " 0.301333 \n",
+ " -0.344770 \n",
+ " 1.668368 \n",
+ " 0.875455 \n",
+ " 1.643023 \n",
+ " ... \n",
+ " 0.966643 \n",
+ " 1426.250000 \n",
+ " 0 \n",
+ " 112 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 344 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_2 \n",
+ " -0.677863 \n",
+ " -0.141921 \n",
+ " -1.016023 \n",
+ " -0.755879 \n",
+ " 0.834577 \n",
+ " 0.259216 \n",
+ " -0.438292 \n",
+ " 1.336308 \n",
+ " 0.705088 \n",
+ " 1.053636 \n",
+ " ... \n",
+ " 0.721534 \n",
+ " 1531.110474 \n",
+ " 0 \n",
+ " 181 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 422 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_3 \n",
+ " -0.741282 \n",
+ " -0.460472 \n",
+ " -0.491711 \n",
+ " -0.818084 \n",
+ " 0.648200 \n",
+ " 0.107027 \n",
+ " -0.444889 \n",
+ " 1.249805 \n",
+ " 0.660707 \n",
+ " 1.165861 \n",
+ " ... \n",
+ " 0.587196 \n",
+ " 1518.907593 \n",
+ " 0 \n",
+ " 119 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 278 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_6 \n",
+ " -0.621521 \n",
+ " -0.247254 \n",
+ " -0.867127 \n",
+ " -0.742544 \n",
+ " 0.810579 \n",
+ " 0.272128 \n",
+ " -0.507117 \n",
+ " 1.251434 \n",
+ " 0.947172 \n",
+ " 2.545301 \n",
+ " ... \n",
+ " 0.935716 \n",
+ " 1471.914917 \n",
+ " 0 \n",
+ " 47 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 204 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115755 \n",
+ " 0.478275 \n",
+ " 0.558670 \n",
+ " -0.962840 \n",
+ " 1.732291 \n",
+ " 0.507434 \n",
+ " -0.912641 \n",
+ " 0.311322 \n",
+ " 0.816068 \n",
+ " 0.596520 \n",
+ " 0.090397 \n",
+ " ... \n",
+ " 0.982196 \n",
+ " 15564.458008 \n",
+ " 59 \n",
+ " 142 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 386 \n",
+ " c59 \n",
+ " c59a \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115756 \n",
+ " 0.297418 \n",
+ " 0.420594 \n",
+ " -0.971632 \n",
+ " 1.966955 \n",
+ " 0.304365 \n",
+ " -1.164112 \n",
+ " 0.866636 \n",
+ " -0.092857 \n",
+ " -0.241830 \n",
+ " -0.617835 \n",
+ " ... \n",
+ " 0.775977 \n",
+ " 15629.680664 \n",
+ " 59 \n",
+ " 47 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 270 \n",
+ " c59 \n",
+ " c59a \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115757 \n",
+ " 0.346950 \n",
+ " 0.453951 \n",
+ " -0.602893 \n",
+ " 1.338956 \n",
+ " 0.559435 \n",
+ " -0.801333 \n",
+ " 0.447061 \n",
+ " 0.988156 \n",
+ " 1.567869 \n",
+ " 0.403878 \n",
+ " ... \n",
+ " 0.688747 \n",
+ " 15518.421875 \n",
+ " 59 \n",
+ " 64 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 202 \n",
+ " c59 \n",
+ " c59a \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115758 \n",
+ " -0.189415 \n",
+ " 0.508840 \n",
+ " -0.886041 \n",
+ " 0.647980 \n",
+ " -0.227224 \n",
+ " -1.022549 \n",
+ " -0.099256 \n",
+ " 0.219755 \n",
+ " 0.603715 \n",
+ " -0.219145 \n",
+ " ... \n",
+ " 0.751402 \n",
+ " 15539.275391 \n",
+ " 59 \n",
+ " 58 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 182 \n",
+ " c59 \n",
+ " c59a \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115760 \n",
+ " 0.245777 \n",
+ " 0.460219 \n",
+ " -1.003840 \n",
+ " 0.191158 \n",
+ " -0.313127 \n",
+ " -1.120675 \n",
+ " 0.004962 \n",
+ " -0.316199 \n",
+ " 1.727776 \n",
+ " -0.495501 \n",
+ " ... \n",
+ " 0.674126 \n",
+ " 15542.961914 \n",
+ " 59 \n",
+ " 106 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 295 \n",
+ " c59 \n",
+ " c59a \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
704629 rows Ć 40 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.677863 \n",
+ "DD3S1_Cell_1 -0.677863 \n",
+ "DD3S1_Cell_2 -0.677863 \n",
+ "DD3S1_Cell_3 -0.741282 \n",
+ "DD3S1_Cell_6 -0.621521 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.478275 \n",
+ "TMA_Cell_115756 0.297418 \n",
+ "TMA_Cell_115757 0.346950 \n",
+ "TMA_Cell_115758 -0.189415 \n",
+ "TMA_Cell_115760 0.245777 \n",
+ "\n",
+ " HLA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.417494 \n",
+ "DD3S1_Cell_1 -0.516487 \n",
+ "DD3S1_Cell_2 -0.141921 \n",
+ "DD3S1_Cell_3 -0.460472 \n",
+ "DD3S1_Cell_6 -0.247254 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.558670 \n",
+ "TMA_Cell_115756 0.420594 \n",
+ "TMA_Cell_115757 0.453951 \n",
+ "TMA_Cell_115758 0.508840 \n",
+ "TMA_Cell_115760 0.460219 \n",
+ "\n",
+ " CKs_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.912537 \n",
+ "DD3S1_Cell_1 -0.838037 \n",
+ "DD3S1_Cell_2 -1.016023 \n",
+ "DD3S1_Cell_3 -0.491711 \n",
+ "DD3S1_Cell_6 -0.867127 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.962840 \n",
+ "TMA_Cell_115756 -0.971632 \n",
+ "TMA_Cell_115757 -0.602893 \n",
+ "TMA_Cell_115758 -0.886041 \n",
+ "TMA_Cell_115760 -1.003840 \n",
+ "\n",
+ " Ki67_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.817876 \n",
+ "DD3S1_Cell_1 -0.869685 \n",
+ "DD3S1_Cell_2 -0.755879 \n",
+ "DD3S1_Cell_3 -0.818084 \n",
+ "DD3S1_Cell_6 -0.742544 \n",
+ "... ... \n",
+ "TMA_Cell_115755 1.732291 \n",
+ "TMA_Cell_115756 1.966955 \n",
+ "TMA_Cell_115757 1.338956 \n",
+ "TMA_Cell_115758 0.647980 \n",
+ "TMA_Cell_115760 0.191158 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.930099 \n",
+ "DD3S1_Cell_1 1.114924 \n",
+ "DD3S1_Cell_2 0.834577 \n",
+ "DD3S1_Cell_3 0.648200 \n",
+ "DD3S1_Cell_6 0.810579 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.507434 \n",
+ "TMA_Cell_115756 0.304365 \n",
+ "TMA_Cell_115757 0.559435 \n",
+ "TMA_Cell_115758 -0.227224 \n",
+ "TMA_Cell_115760 -0.313127 \n",
+ "\n",
+ " ColVI_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.232078 \n",
+ "DD3S1_Cell_1 0.301333 \n",
+ "DD3S1_Cell_2 0.259216 \n",
+ "DD3S1_Cell_3 0.107027 \n",
+ "DD3S1_Cell_6 0.272128 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.912641 \n",
+ "TMA_Cell_115756 -1.164112 \n",
+ "TMA_Cell_115757 -0.801333 \n",
+ "TMA_Cell_115758 -1.022549 \n",
+ "TMA_Cell_115760 -1.120675 \n",
+ "\n",
+ " CD20_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.483158 \n",
+ "DD3S1_Cell_1 -0.344770 \n",
+ "DD3S1_Cell_2 -0.438292 \n",
+ "DD3S1_Cell_3 -0.444889 \n",
+ "DD3S1_Cell_6 -0.507117 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.311322 \n",
+ "TMA_Cell_115756 0.866636 \n",
+ "TMA_Cell_115757 0.447061 \n",
+ "TMA_Cell_115758 -0.099256 \n",
+ "TMA_Cell_115760 0.004962 \n",
+ "\n",
+ " PD1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 1.535604 \n",
+ "DD3S1_Cell_1 1.668368 \n",
+ "DD3S1_Cell_2 1.336308 \n",
+ "DD3S1_Cell_3 1.249805 \n",
+ "DD3S1_Cell_6 1.251434 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.816068 \n",
+ "TMA_Cell_115756 -0.092857 \n",
+ "TMA_Cell_115757 0.988156 \n",
+ "TMA_Cell_115758 0.219755 \n",
+ "TMA_Cell_115760 -0.316199 \n",
+ "\n",
+ " AXL_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.807339 \n",
+ "DD3S1_Cell_1 0.875455 \n",
+ "DD3S1_Cell_2 0.705088 \n",
+ "DD3S1_Cell_3 0.660707 \n",
+ "DD3S1_Cell_6 0.947172 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.596520 \n",
+ "TMA_Cell_115756 -0.241830 \n",
+ "TMA_Cell_115757 1.567869 \n",
+ "TMA_Cell_115758 0.603715 \n",
+ "TMA_Cell_115760 1.727776 \n",
+ "\n",
+ " CD31_Cytoplasm_Intensity_Average ... Nucleus_Roundness \\\n",
+ "ID ... \n",
+ "DD3S1_Cell_0 1.167755 ... 0.955040 \n",
+ "DD3S1_Cell_1 1.643023 ... 0.966643 \n",
+ "DD3S1_Cell_2 1.053636 ... 0.721534 \n",
+ "DD3S1_Cell_3 1.165861 ... 0.587196 \n",
+ "DD3S1_Cell_6 2.545301 ... 0.935716 \n",
+ "... ... ... ... \n",
+ "TMA_Cell_115755 0.090397 ... 0.982196 \n",
+ "TMA_Cell_115756 -0.617835 ... 0.775977 \n",
+ "TMA_Cell_115757 0.403878 ... 0.688747 \n",
+ "TMA_Cell_115758 -0.219145 ... 0.751402 \n",
+ "TMA_Cell_115760 -0.495501 ... 0.674126 \n",
+ "\n",
+ " Nuc_X ROI_index Nucleus_Size Sample_ID \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 1484.771729 0 127 DD3S1.csv \n",
+ "DD3S1_Cell_1 1426.250000 0 112 DD3S1.csv \n",
+ "DD3S1_Cell_2 1531.110474 0 181 DD3S1.csv \n",
+ "DD3S1_Cell_3 1518.907593 0 119 DD3S1.csv \n",
+ "DD3S1_Cell_6 1471.914917 0 47 DD3S1.csv \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 15564.458008 59 142 TMA.csv \n",
+ "TMA_Cell_115756 15629.680664 59 47 TMA.csv \n",
+ "TMA_Cell_115757 15518.421875 59 64 TMA.csv \n",
+ "TMA_Cell_115758 15539.275391 59 58 TMA.csv \n",
+ "TMA_Cell_115760 15542.961914 59 106 TMA.csv \n",
+ "\n",
+ " immune_checkpoint Cell_Size Patient Unique_ROI_index \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 None 339 61 61a \n",
+ "DD3S1_Cell_1 None 344 61 61a \n",
+ "DD3S1_Cell_2 None 422 61 61a \n",
+ "DD3S1_Cell_3 None 278 61 61a \n",
+ "DD3S1_Cell_6 None 204 61 61a \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 None 386 c59 c59a \n",
+ "TMA_Cell_115756 None 270 c59 c59a \n",
+ "TMA_Cell_115757 None 202 c59 c59a \n",
+ "TMA_Cell_115758 None 182 c59 c59a \n",
+ "TMA_Cell_115760 None 295 c59 c59a \n",
+ "\n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ "ID \n",
+ "DD3S1_Cell_0 1.0 \n",
+ "DD3S1_Cell_1 1.0 \n",
+ "DD3S1_Cell_2 1.0 \n",
+ "DD3S1_Cell_3 1.0 \n",
+ "DD3S1_Cell_6 1.0 \n",
+ "... ... \n",
+ "TMA_Cell_115755 NaN \n",
+ "TMA_Cell_115756 NaN \n",
+ "TMA_Cell_115757 NaN \n",
+ "TMA_Cell_115758 NaN \n",
+ "TMA_Cell_115760 NaN \n",
+ "\n",
+ "[704629 rows x 40 columns]"
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# DataFrames fuson based on 'Patient' col\n",
+ "df2 = pd.merge(df1, clinical_data[['Patient', 'Primary_chem(1)_vs_surg(0)']], on='Patient', how='left')\n",
+ "\n",
+ "# Set the index of df1 to be the same as the index of df\n",
+ "df2.set_index(df.index, inplace=True)\n",
+ "\n",
+ "print(df2.columns)\n",
+ "print(df2.shape)\n",
+ "df2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "id": "57d022c0-3a43-4c3c-a7e9-54d9f98e1b1a",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " Patient \n",
+ " %_tumor \n",
+ " %_necrosis \n",
+ " Age_Diagnosis \n",
+ " BMI \n",
+ " CA125 \n",
+ " Race \n",
+ " Other_Cancers \n",
+ " BRCAStatus \n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ " ... \n",
+ " Histo_Type \n",
+ " Optimal_Debulking \n",
+ " Residual_Disease \n",
+ " Platinum_sensitive \n",
+ " Days_surgery_to_recurrence \n",
+ " Avastin \n",
+ " Disease_Stat \n",
+ " Days_from_surgery_to_last_contact_or_death \n",
+ " Recurrence \n",
+ " Vital_Status \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 5 \n",
+ " 50 \n",
+ " 0 \n",
+ " 70.0 \n",
+ " 32.0 \n",
+ " 1426.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " CCC \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 377.0 \n",
+ " 1.0 \n",
+ " DOD \n",
+ " 977 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 7 \n",
+ " 80 \n",
+ " 5 \n",
+ " 63.0 \n",
+ " 29.0 \n",
+ " 10965.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 516.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 814 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 11 \n",
+ " 90 \n",
+ " 0 \n",
+ " 58.0 \n",
+ " 20.0 \n",
+ " 72.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " Signetringcell \n",
+ " NaN \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 203.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 263 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 15 \n",
+ " 60 \n",
+ " 0 \n",
+ " 77.0 \n",
+ " 35.0 \n",
+ " 183.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 460.0 \n",
+ " 0.0 \n",
+ " NED \n",
+ " 2585 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 18 \n",
+ " 90 \n",
+ " 0 \n",
+ " 75.0 \n",
+ " 25.0 \n",
+ " 55.0 \n",
+ " C \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 359.0 \n",
+ " 1.0 \n",
+ " DOD \n",
+ " 439 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 25 \n",
+ " 26 \n",
+ " 80 \n",
+ " 0 \n",
+ " 69.0 \n",
+ " 29.0 \n",
+ " 1907.0 \n",
+ " C \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " NaN \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 1085 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 30 \n",
+ " 31 \n",
+ " 70 \n",
+ " 0 \n",
+ " 62.0 \n",
+ " 26.0 \n",
+ " 11785.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " NaN \n",
+ " 1.0 \n",
+ " DOD \n",
+ " 328 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 31 \n",
+ " 32 \n",
+ " 90 \n",
+ " 5 \n",
+ " 75.0 \n",
+ " 41.0 \n",
+ " 4532.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 1157.0 \n",
+ " 0.0 \n",
+ " AWD \n",
+ " 1864 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 39 \n",
+ " 40 \n",
+ " 70 \n",
+ " 5 \n",
+ " 64.0 \n",
+ " NaN \n",
+ " 8393.0 \n",
+ " C \n",
+ " NaN \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " NaN \n",
+ " 0.0 \n",
+ " NaN \n",
+ " 131 \n",
+ " 0.0 \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 50 \n",
+ " 51 \n",
+ " 90 \n",
+ " 0 \n",
+ " 55.0 \n",
+ " 33.0 \n",
+ " 1000.0 \n",
+ " C \n",
+ " renalcell \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 2103.0 \n",
+ " 0.0 \n",
+ " NaN \n",
+ " 2124 \n",
+ " 1.0 \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 60 \n",
+ " 61 \n",
+ " 60 \n",
+ " 10 \n",
+ " 65.0 \n",
+ " 23.0 \n",
+ " 281.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " metastaticadenocarcinoma \n",
+ " NaN \n",
+ " NaN \n",
+ " 1.0 \n",
+ " NaN \n",
+ " 0.0 \n",
+ " NaN \n",
+ " 23 \n",
+ " 0.0 \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 84 \n",
+ " 85 \n",
+ " 90 \n",
+ " 0 \n",
+ " 61.0 \n",
+ " 30.0 \n",
+ " 116.0 \n",
+ " hispanic \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 572.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 600 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 88 \n",
+ " 89 \n",
+ " 90 \n",
+ " 0 \n",
+ " 64.0 \n",
+ " 28.0 \n",
+ " 855.0 \n",
+ " C \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 540.0 \n",
+ " 1.0 \n",
+ " DOD \n",
+ " 1820 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 94 \n",
+ " 95 \n",
+ " 80 \n",
+ " 5 \n",
+ " 80.0 \n",
+ " 24.0 \n",
+ " 2799.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " NaN \n",
+ " 96 \n",
+ " 0.0 \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 97 \n",
+ " 98 \n",
+ " 70 \n",
+ " 0 \n",
+ " 79.0 \n",
+ " 26.0 \n",
+ " 2461.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 343.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 923 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " 104 \n",
+ " 90 \n",
+ " 0 \n",
+ " 60.0 \n",
+ " 29.0 \n",
+ " 63.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 335.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 351 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 110 \n",
+ " 111 \n",
+ " 90 \n",
+ " 5 \n",
+ " 50.0 \n",
+ " 32.0 \n",
+ " 1960.0 \n",
+ " C \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 533.0 \n",
+ " 1.0 \n",
+ " DOD \n",
+ " 1888 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 115 \n",
+ " 116 \n",
+ " 80 \n",
+ " 0 \n",
+ " 76.0 \n",
+ " 34.0 \n",
+ " 7453.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " NaN \n",
+ " 0.0 \n",
+ " NaN \n",
+ " 478 \n",
+ " 0.0 \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 118 \n",
+ " 119 \n",
+ " 90 \n",
+ " 0 \n",
+ " 57.0 \n",
+ " 17.0 \n",
+ " 16234.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 655.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 374 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 120 \n",
+ " 121 \n",
+ " 90 \n",
+ " 5 \n",
+ " 64.0 \n",
+ " 38.0 \n",
+ " 2207.0 \n",
+ " C \n",
+ " melanoma \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 1.0 \n",
+ " DOD \n",
+ " 2445 \n",
+ " NaN \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 136 \n",
+ " 137 \n",
+ " 90 \n",
+ " 0 \n",
+ " 54.0 \n",
+ " 19.0 \n",
+ " 2964.0 \n",
+ " C \n",
+ " neurofibromatosisremotebreast \n",
+ " 1 \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 575.0 \n",
+ " 1.0 \n",
+ " DOD \n",
+ " 1330 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 137 \n",
+ " 138 \n",
+ " 70 \n",
+ " 5 \n",
+ " 70.0 \n",
+ " 26.0 \n",
+ " 1210.0 \n",
+ " Asian \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 268.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 471 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 139 \n",
+ " 140 \n",
+ " 70 \n",
+ " 5 \n",
+ " 71.0 \n",
+ " 21.0 \n",
+ " 1046.0 \n",
+ " C \n",
+ " skincancer \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " 0.0 \n",
+ " NaN \n",
+ " 206 \n",
+ " NaN \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 140 \n",
+ " 141 \n",
+ " 70 \n",
+ " 5 \n",
+ " 31.0 \n",
+ " 31.0 \n",
+ " 575.0 \n",
+ " C \n",
+ " 0 \n",
+ " 1 \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 613.0 \n",
+ " 1.0 \n",
+ " DOD \n",
+ " 1628 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 145 \n",
+ " 146 \n",
+ " 70 \n",
+ " 0 \n",
+ " 71.0 \n",
+ " 21.0 \n",
+ " 10824.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 263.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 352 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 148 \n",
+ " 149 \n",
+ " 70 \n",
+ " 0 \n",
+ " 52.0 \n",
+ " 26.0 \n",
+ " 7363.0 \n",
+ " C \n",
+ " papillarythyroid \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " NaN \n",
+ " 0.0 \n",
+ " NED \n",
+ " 2706 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " 152 \n",
+ " 153 \n",
+ " 80 \n",
+ " 5 \n",
+ " 64.0 \n",
+ " 23.0 \n",
+ " 968.0 \n",
+ " C \n",
+ " othermalignantneoplasmsitenotspecified \n",
+ " 2 \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 361.0 \n",
+ " 1.0 \n",
+ " DOD \n",
+ " 2336 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 156 \n",
+ " 157 \n",
+ " 80 \n",
+ " 5 \n",
+ " 56.0 \n",
+ " 36.0 \n",
+ " 1971.0 \n",
+ " C \n",
+ " 0 \n",
+ " 2 \n",
+ " 1 \n",
+ " ... \n",
+ " ENDOOV \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " NaN \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 1667 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 159 \n",
+ " 160 \n",
+ " 90 \n",
+ " 5 \n",
+ " 59.0 \n",
+ " 27.0 \n",
+ " 89.0 \n",
+ " C \n",
+ " breast \n",
+ " 0 \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 160.0 \n",
+ " 1.0 \n",
+ " DOD \n",
+ " 328 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 161 \n",
+ " 162 \n",
+ " 80 \n",
+ " 0 \n",
+ " 75.0 \n",
+ " 20.0 \n",
+ " 7482.0 \n",
+ " C \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " ... \n",
+ " serousofMullerianorigin \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 536.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 2353 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 168 \n",
+ " 169 \n",
+ " 80 \n",
+ " 5 \n",
+ " 75.0 \n",
+ " 35.0 \n",
+ " 245.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 1003.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 1442 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 170 \n",
+ " 171 \n",
+ " 80 \n",
+ " 5 \n",
+ " 60.0 \n",
+ " 34.0 \n",
+ " 500.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 302.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 456 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 173 \n",
+ " 174 \n",
+ " 50 \n",
+ " 0 \n",
+ " 54.0 \n",
+ " 36.0 \n",
+ " 8529.0 \n",
+ " C \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " ... \n",
+ " HGSPC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 387.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 660 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 176 \n",
+ " 177 \n",
+ " 90 \n",
+ " 0 \n",
+ " 60.0 \n",
+ " 32.0 \n",
+ " 919.0 \n",
+ " C \n",
+ " colon \n",
+ " 0 \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 450.0 \n",
+ " 1.0 \n",
+ " DOD \n",
+ " 1743 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 177 \n",
+ " 178 \n",
+ " 80 \n",
+ " 0 \n",
+ " 67.0 \n",
+ " 27.0 \n",
+ " 107.0 \n",
+ " C \n",
+ " basalcellcarcinoma \n",
+ " 0 \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 416.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 977 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 178 \n",
+ " 179 \n",
+ " 80 \n",
+ " 0 \n",
+ " 83.0 \n",
+ " 25.0 \n",
+ " NaN \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " DOD \n",
+ " 1070 \n",
+ " NaN \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 181 \n",
+ " 182 \n",
+ " 80 \n",
+ " 0 \n",
+ " 81.0 \n",
+ " 28.0 \n",
+ " 990.0 \n",
+ " C \n",
+ " 0 \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 381.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 1552 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 182 \n",
+ " 183 \n",
+ " 70 \n",
+ " 5 \n",
+ " 72.0 \n",
+ " 22.0 \n",
+ " 597.0 \n",
+ " C \n",
+ " breast \n",
+ " 0 \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " NaN \n",
+ " NaN \n",
+ " DOD \n",
+ " 1036 \n",
+ " NaN \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 183 \n",
+ " 184 \n",
+ " 90 \n",
+ " 0 \n",
+ " 72.0 \n",
+ " 26.0 \n",
+ " 3788.0 \n",
+ " C \n",
+ " breast \n",
+ " NaN \n",
+ " 1 \n",
+ " ... \n",
+ " HGSOC \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 282.0 \n",
+ " 0.0 \n",
+ " NaN \n",
+ " 468 \n",
+ " 1.0 \n",
+ " NaN \n",
+ " \n",
+ " \n",
+ " 186 \n",
+ " 187 \n",
+ " 80 \n",
+ " 0 \n",
+ " 27.0 \n",
+ " 22.0 \n",
+ " 922.0 \n",
+ " C \n",
+ " 0 \n",
+ " 0 \n",
+ " 1 \n",
+ " ... \n",
+ " serousprimarilylowgradewfociofhighgrade \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 540.0 \n",
+ " 0.0 \n",
+ " DOD \n",
+ " 1279 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
40 rows Ć 23 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Patient %_tumor %_necrosis Age_Diagnosis BMI CA125 Race \\\n",
+ "4 5 50 0 70.0 32.0 1426.0 C \n",
+ "6 7 80 5 63.0 29.0 10965.0 C \n",
+ "10 11 90 0 58.0 20.0 72.0 C \n",
+ "14 15 60 0 77.0 35.0 183.0 C \n",
+ "17 18 90 0 75.0 25.0 55.0 C \n",
+ "25 26 80 0 69.0 29.0 1907.0 C \n",
+ "30 31 70 0 62.0 26.0 11785.0 C \n",
+ "31 32 90 5 75.0 41.0 4532.0 C \n",
+ "39 40 70 5 64.0 NaN 8393.0 C \n",
+ "50 51 90 0 55.0 33.0 1000.0 C \n",
+ "60 61 60 10 65.0 23.0 281.0 C \n",
+ "84 85 90 0 61.0 30.0 116.0 hispanic \n",
+ "88 89 90 0 64.0 28.0 855.0 C \n",
+ "94 95 80 5 80.0 24.0 2799.0 C \n",
+ "97 98 70 0 79.0 26.0 2461.0 C \n",
+ "103 104 90 0 60.0 29.0 63.0 C \n",
+ "110 111 90 5 50.0 32.0 1960.0 C \n",
+ "115 116 80 0 76.0 34.0 7453.0 C \n",
+ "118 119 90 0 57.0 17.0 16234.0 C \n",
+ "120 121 90 5 64.0 38.0 2207.0 C \n",
+ "136 137 90 0 54.0 19.0 2964.0 C \n",
+ "137 138 70 5 70.0 26.0 1210.0 Asian \n",
+ "139 140 70 5 71.0 21.0 1046.0 C \n",
+ "140 141 70 5 31.0 31.0 575.0 C \n",
+ "145 146 70 0 71.0 21.0 10824.0 C \n",
+ "148 149 70 0 52.0 26.0 7363.0 C \n",
+ "152 153 80 5 64.0 23.0 968.0 C \n",
+ "156 157 80 5 56.0 36.0 1971.0 C \n",
+ "159 160 90 5 59.0 27.0 89.0 C \n",
+ "161 162 80 0 75.0 20.0 7482.0 C \n",
+ "168 169 80 5 75.0 35.0 245.0 C \n",
+ "170 171 80 5 60.0 34.0 500.0 C \n",
+ "173 174 50 0 54.0 36.0 8529.0 C \n",
+ "176 177 90 0 60.0 32.0 919.0 C \n",
+ "177 178 80 0 67.0 27.0 107.0 C \n",
+ "178 179 80 0 83.0 25.0 NaN C \n",
+ "181 182 80 0 81.0 28.0 990.0 C \n",
+ "182 183 70 5 72.0 22.0 597.0 C \n",
+ "183 184 90 0 72.0 26.0 3788.0 C \n",
+ "186 187 80 0 27.0 22.0 922.0 C \n",
+ "\n",
+ " Other_Cancers BRCAStatus \\\n",
+ "4 0 NaN \n",
+ "6 0 NaN \n",
+ "10 0 NaN \n",
+ "14 0 NaN \n",
+ "17 0 0 \n",
+ "25 0 0 \n",
+ "30 0 NaN \n",
+ "31 0 NaN \n",
+ "39 NaN NaN \n",
+ "50 renalcell NaN \n",
+ "60 0 NaN \n",
+ "84 0 NaN \n",
+ "88 0 0 \n",
+ "94 0 NaN \n",
+ "97 0 NaN \n",
+ "103 0 NaN \n",
+ "110 0 0 \n",
+ "115 0 NaN \n",
+ "118 0 NaN \n",
+ "120 melanoma NaN \n",
+ "136 neurofibromatosisremotebreast 1 \n",
+ "137 0 NaN \n",
+ "139 skincancer NaN \n",
+ "140 0 1 \n",
+ "145 0 NaN \n",
+ "148 papillarythyroid NaN \n",
+ "152 othermalignantneoplasmsitenotspecified 2 \n",
+ "156 0 2 \n",
+ "159 breast 0 \n",
+ "161 0 0 \n",
+ "168 0 NaN \n",
+ "170 0 NaN \n",
+ "173 0 0 \n",
+ "176 colon 0 \n",
+ "177 basalcellcarcinoma 0 \n",
+ "178 0 NaN \n",
+ "181 0 NaN \n",
+ "182 breast 0 \n",
+ "183 breast NaN \n",
+ "186 0 0 \n",
+ "\n",
+ " Primary_chem(1)_vs_surg(0) ... Histo_Type \\\n",
+ "4 1 ... CCC \n",
+ "6 1 ... HGSOC \n",
+ "10 1 ... Signetringcell \n",
+ "14 1 ... HGSOC \n",
+ "17 1 ... HGSOC \n",
+ "25 1 ... HGSOC \n",
+ "30 1 ... HGSOC \n",
+ "31 1 ... HGSOC \n",
+ "39 1 ... HGSOC \n",
+ "50 1 ... HGSOC \n",
+ "60 1 ... metastaticadenocarcinoma \n",
+ "84 1 ... HGSOC \n",
+ "88 1 ... HGSOC \n",
+ "94 1 ... HGSOC \n",
+ "97 1 ... HGSOC \n",
+ "103 1 ... HGSOC \n",
+ "110 1 ... HGSOC \n",
+ "115 1 ... HGSOC \n",
+ "118 1 ... HGSOC \n",
+ "120 1 ... HGSOC \n",
+ "136 1 ... HGSOC \n",
+ "137 1 ... HGSOC \n",
+ "139 1 ... HGSOC \n",
+ "140 1 ... HGSOC \n",
+ "145 1 ... HGSOC \n",
+ "148 1 ... HGSOC \n",
+ "152 1 ... HGSOC \n",
+ "156 1 ... ENDOOV \n",
+ "159 1 ... HGSOC \n",
+ "161 1 ... serousofMullerianorigin \n",
+ "168 1 ... HGSOC \n",
+ "170 1 ... HGSOC \n",
+ "173 1 ... HGSPC \n",
+ "176 1 ... HGSOC \n",
+ "177 1 ... HGSOC \n",
+ "178 1 ... HGSOC \n",
+ "181 1 ... HGSOC \n",
+ "182 1 ... HGSOC \n",
+ "183 1 ... HGSOC \n",
+ "186 1 ... serousprimarilylowgradewfociofhighgrade \n",
+ "\n",
+ " Optimal_Debulking Residual_Disease Platinum_sensitive \\\n",
+ "4 NaN 0.0 1.0 \n",
+ "6 NaN 0.0 0.0 \n",
+ "10 NaN 0.0 0.0 \n",
+ "14 1.0 0.0 1.0 \n",
+ "17 1.0 0.0 1.0 \n",
+ "25 1.0 0.0 1.0 \n",
+ "30 1.0 0.0 1.0 \n",
+ "31 1.0 0.0 1.0 \n",
+ "39 1.0 0.0 1.0 \n",
+ "50 1.0 0.0 1.0 \n",
+ "60 NaN NaN 1.0 \n",
+ "84 1.0 0.0 1.0 \n",
+ "88 1.0 0.0 1.0 \n",
+ "94 1.0 0.0 NaN \n",
+ "97 1.0 0.0 1.0 \n",
+ "103 1.0 0.0 1.0 \n",
+ "110 1.0 0.0 1.0 \n",
+ "115 1.0 0.0 1.0 \n",
+ "118 0.0 1.0 1.0 \n",
+ "120 1.0 0.0 NaN \n",
+ "136 1.0 0.0 1.0 \n",
+ "137 1.0 0.0 0.0 \n",
+ "139 1.0 0.0 NaN \n",
+ "140 1.0 0.0 1.0 \n",
+ "145 1.0 0.0 0.0 \n",
+ "148 1.0 0.0 1.0 \n",
+ "152 1.0 0.0 1.0 \n",
+ "156 1.0 0.0 1.0 \n",
+ "159 0.0 1.0 1.0 \n",
+ "161 1.0 0.0 1.0 \n",
+ "168 1.0 0.0 1.0 \n",
+ "170 1.0 0.0 1.0 \n",
+ "173 1.0 0.0 1.0 \n",
+ "176 1.0 0.0 1.0 \n",
+ "177 0.0 1.0 1.0 \n",
+ "178 1.0 0.0 1.0 \n",
+ "181 1.0 0.0 0.0 \n",
+ "182 1.0 0.0 1.0 \n",
+ "183 1.0 0.0 1.0 \n",
+ "186 1.0 1.0 1.0 \n",
+ "\n",
+ " Days_surgery_to_recurrence Avastin Disease_Stat \\\n",
+ "4 377.0 1.0 DOD \n",
+ "6 516.0 0.0 DOD \n",
+ "10 203.0 0.0 DOD \n",
+ "14 460.0 0.0 NED \n",
+ "17 359.0 1.0 DOD \n",
+ "25 NaN 0.0 DOD \n",
+ "30 NaN 1.0 DOD \n",
+ "31 1157.0 0.0 AWD \n",
+ "39 NaN 0.0 NaN \n",
+ "50 2103.0 0.0 NaN \n",
+ "60 NaN 0.0 NaN \n",
+ "84 572.0 0.0 DOD \n",
+ "88 540.0 1.0 DOD \n",
+ "94 NaN 0.0 NaN \n",
+ "97 343.0 0.0 DOD \n",
+ "103 335.0 0.0 DOD \n",
+ "110 533.0 1.0 DOD \n",
+ "115 NaN 0.0 NaN \n",
+ "118 655.0 0.0 DOD \n",
+ "120 NaN 1.0 DOD \n",
+ "136 575.0 1.0 DOD \n",
+ "137 268.0 0.0 DOD \n",
+ "139 NaN 0.0 NaN \n",
+ "140 613.0 1.0 DOD \n",
+ "145 263.0 0.0 DOD \n",
+ "148 NaN 0.0 NED \n",
+ "152 361.0 1.0 DOD \n",
+ "156 NaN 0.0 DOD \n",
+ "159 160.0 1.0 DOD \n",
+ "161 536.0 0.0 DOD \n",
+ "168 1003.0 0.0 DOD \n",
+ "170 302.0 0.0 DOD \n",
+ "173 387.0 0.0 DOD \n",
+ "176 450.0 1.0 DOD \n",
+ "177 416.0 0.0 DOD \n",
+ "178 NaN NaN DOD \n",
+ "181 381.0 0.0 DOD \n",
+ "182 NaN NaN DOD \n",
+ "183 282.0 0.0 NaN \n",
+ "186 540.0 0.0 DOD \n",
+ "\n",
+ " Days_from_surgery_to_last_contact_or_death Recurrence Vital_Status \n",
+ "4 977 1.0 1.0 \n",
+ "6 814 1.0 1.0 \n",
+ "10 263 1.0 1.0 \n",
+ "14 2585 1.0 0.0 \n",
+ "17 439 1.0 1.0 \n",
+ "25 1085 0.0 1.0 \n",
+ "30 328 0.0 1.0 \n",
+ "31 1864 1.0 0.0 \n",
+ "39 131 0.0 NaN \n",
+ "50 2124 1.0 NaN \n",
+ "60 23 0.0 NaN \n",
+ "84 600 1.0 1.0 \n",
+ "88 1820 1.0 1.0 \n",
+ "94 96 0.0 NaN \n",
+ "97 923 1.0 1.0 \n",
+ "103 351 1.0 1.0 \n",
+ "110 1888 1.0 1.0 \n",
+ "115 478 0.0 NaN \n",
+ "118 374 1.0 1.0 \n",
+ "120 2445 NaN 1.0 \n",
+ "136 1330 1.0 1.0 \n",
+ "137 471 1.0 1.0 \n",
+ "139 206 NaN NaN \n",
+ "140 1628 1.0 1.0 \n",
+ "145 352 1.0 1.0 \n",
+ "148 2706 0.0 0.0 \n",
+ "152 2336 1.0 1.0 \n",
+ "156 1667 0.0 1.0 \n",
+ "159 328 1.0 1.0 \n",
+ "161 2353 1.0 1.0 \n",
+ "168 1442 1.0 1.0 \n",
+ "170 456 1.0 1.0 \n",
+ "173 660 1.0 1.0 \n",
+ "176 1743 1.0 1.0 \n",
+ "177 977 1.0 1.0 \n",
+ "178 1070 NaN 1.0 \n",
+ "181 1552 1.0 1.0 \n",
+ "182 1036 NaN 1.0 \n",
+ "183 468 1.0 NaN \n",
+ "186 1279 1.0 1.0 \n",
+ "\n",
+ "[40 rows x 23 columns]"
+ ]
+ },
+ "execution_count": 35,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "#NACT rows\n",
+ "clinical_data[clinical_data['Primary_chem(1)_vs_surg(0)'] == 1]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "id": "86cbf508-e723-4993-99d0-d41347a97246",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " HLA_Cytoplasm_Intensity_Average \n",
+ " CKs_Cytoplasm_Intensity_Average \n",
+ " Ki67_Nucleus_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " ColVI_Cytoplasm_Intensity_Average \n",
+ " CD20_Cytoplasm_Intensity_Average \n",
+ " PD1_Cytoplasm_Intensity_Average \n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ " CD31_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nucleus_Roundness \n",
+ " Nuc_X \n",
+ " ROI_index \n",
+ " Nucleus_Size \n",
+ " Sample_ID \n",
+ " immune_checkpoint \n",
+ " Cell_Size \n",
+ " Patient \n",
+ " Unique_ROI_index \n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_0 \n",
+ " -0.677863 \n",
+ " -0.417494 \n",
+ " -0.912537 \n",
+ " -0.817876 \n",
+ " 0.930099 \n",
+ " 0.232078 \n",
+ " -0.483158 \n",
+ " 1.535604 \n",
+ " 0.807339 \n",
+ " 1.167755 \n",
+ " ... \n",
+ " 0.955040 \n",
+ " 1484.771729 \n",
+ " 0 \n",
+ " 127 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 339 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_1 \n",
+ " -0.677863 \n",
+ " -0.516487 \n",
+ " -0.838037 \n",
+ " -0.869685 \n",
+ " 1.114924 \n",
+ " 0.301333 \n",
+ " -0.344770 \n",
+ " 1.668368 \n",
+ " 0.875455 \n",
+ " 1.643023 \n",
+ " ... \n",
+ " 0.966643 \n",
+ " 1426.250000 \n",
+ " 0 \n",
+ " 112 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 344 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_2 \n",
+ " -0.677863 \n",
+ " -0.141921 \n",
+ " -1.016023 \n",
+ " -0.755879 \n",
+ " 0.834577 \n",
+ " 0.259216 \n",
+ " -0.438292 \n",
+ " 1.336308 \n",
+ " 0.705088 \n",
+ " 1.053636 \n",
+ " ... \n",
+ " 0.721534 \n",
+ " 1531.110474 \n",
+ " 0 \n",
+ " 181 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 422 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_3 \n",
+ " -0.741282 \n",
+ " -0.460472 \n",
+ " -0.491711 \n",
+ " -0.818084 \n",
+ " 0.648200 \n",
+ " 0.107027 \n",
+ " -0.444889 \n",
+ " 1.249805 \n",
+ " 0.660707 \n",
+ " 1.165861 \n",
+ " ... \n",
+ " 0.587196 \n",
+ " 1518.907593 \n",
+ " 0 \n",
+ " 119 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 278 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_6 \n",
+ " -0.621521 \n",
+ " -0.247254 \n",
+ " -0.867127 \n",
+ " -0.742544 \n",
+ " 0.810579 \n",
+ " 0.272128 \n",
+ " -0.507117 \n",
+ " 1.251434 \n",
+ " 0.947172 \n",
+ " 2.545301 \n",
+ " ... \n",
+ " 0.935716 \n",
+ " 1471.914917 \n",
+ " 0 \n",
+ " 47 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 204 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115755 \n",
+ " 0.478275 \n",
+ " 0.558670 \n",
+ " -0.962840 \n",
+ " 1.732291 \n",
+ " 0.507434 \n",
+ " -0.912641 \n",
+ " 0.311322 \n",
+ " 0.816068 \n",
+ " 0.596520 \n",
+ " 0.090397 \n",
+ " ... \n",
+ " 0.982196 \n",
+ " 15564.458008 \n",
+ " 59 \n",
+ " 142 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 386 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115756 \n",
+ " 0.297418 \n",
+ " 0.420594 \n",
+ " -0.971632 \n",
+ " 1.966955 \n",
+ " 0.304365 \n",
+ " -1.164112 \n",
+ " 0.866636 \n",
+ " -0.092857 \n",
+ " -0.241830 \n",
+ " -0.617835 \n",
+ " ... \n",
+ " 0.775977 \n",
+ " 15629.680664 \n",
+ " 59 \n",
+ " 47 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 270 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115757 \n",
+ " 0.346950 \n",
+ " 0.453951 \n",
+ " -0.602893 \n",
+ " 1.338956 \n",
+ " 0.559435 \n",
+ " -0.801333 \n",
+ " 0.447061 \n",
+ " 0.988156 \n",
+ " 1.567869 \n",
+ " 0.403878 \n",
+ " ... \n",
+ " 0.688747 \n",
+ " 15518.421875 \n",
+ " 59 \n",
+ " 64 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 202 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115758 \n",
+ " -0.189415 \n",
+ " 0.508840 \n",
+ " -0.886041 \n",
+ " 0.647980 \n",
+ " -0.227224 \n",
+ " -1.022549 \n",
+ " -0.099256 \n",
+ " 0.219755 \n",
+ " 0.603715 \n",
+ " -0.219145 \n",
+ " ... \n",
+ " 0.751402 \n",
+ " 15539.275391 \n",
+ " 59 \n",
+ " 58 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 182 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115760 \n",
+ " 0.245777 \n",
+ " 0.460219 \n",
+ " -1.003840 \n",
+ " 0.191158 \n",
+ " -0.313127 \n",
+ " -1.120675 \n",
+ " 0.004962 \n",
+ " -0.316199 \n",
+ " 1.727776 \n",
+ " -0.495501 \n",
+ " ... \n",
+ " 0.674126 \n",
+ " 15542.961914 \n",
+ " 59 \n",
+ " 106 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 295 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
704629 rows Ć 40 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.677863 \n",
+ "DD3S1_Cell_1 -0.677863 \n",
+ "DD3S1_Cell_2 -0.677863 \n",
+ "DD3S1_Cell_3 -0.741282 \n",
+ "DD3S1_Cell_6 -0.621521 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.478275 \n",
+ "TMA_Cell_115756 0.297418 \n",
+ "TMA_Cell_115757 0.346950 \n",
+ "TMA_Cell_115758 -0.189415 \n",
+ "TMA_Cell_115760 0.245777 \n",
+ "\n",
+ " HLA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.417494 \n",
+ "DD3S1_Cell_1 -0.516487 \n",
+ "DD3S1_Cell_2 -0.141921 \n",
+ "DD3S1_Cell_3 -0.460472 \n",
+ "DD3S1_Cell_6 -0.247254 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.558670 \n",
+ "TMA_Cell_115756 0.420594 \n",
+ "TMA_Cell_115757 0.453951 \n",
+ "TMA_Cell_115758 0.508840 \n",
+ "TMA_Cell_115760 0.460219 \n",
+ "\n",
+ " CKs_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.912537 \n",
+ "DD3S1_Cell_1 -0.838037 \n",
+ "DD3S1_Cell_2 -1.016023 \n",
+ "DD3S1_Cell_3 -0.491711 \n",
+ "DD3S1_Cell_6 -0.867127 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.962840 \n",
+ "TMA_Cell_115756 -0.971632 \n",
+ "TMA_Cell_115757 -0.602893 \n",
+ "TMA_Cell_115758 -0.886041 \n",
+ "TMA_Cell_115760 -1.003840 \n",
+ "\n",
+ " Ki67_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.817876 \n",
+ "DD3S1_Cell_1 -0.869685 \n",
+ "DD3S1_Cell_2 -0.755879 \n",
+ "DD3S1_Cell_3 -0.818084 \n",
+ "DD3S1_Cell_6 -0.742544 \n",
+ "... ... \n",
+ "TMA_Cell_115755 1.732291 \n",
+ "TMA_Cell_115756 1.966955 \n",
+ "TMA_Cell_115757 1.338956 \n",
+ "TMA_Cell_115758 0.647980 \n",
+ "TMA_Cell_115760 0.191158 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.930099 \n",
+ "DD3S1_Cell_1 1.114924 \n",
+ "DD3S1_Cell_2 0.834577 \n",
+ "DD3S1_Cell_3 0.648200 \n",
+ "DD3S1_Cell_6 0.810579 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.507434 \n",
+ "TMA_Cell_115756 0.304365 \n",
+ "TMA_Cell_115757 0.559435 \n",
+ "TMA_Cell_115758 -0.227224 \n",
+ "TMA_Cell_115760 -0.313127 \n",
+ "\n",
+ " ColVI_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.232078 \n",
+ "DD3S1_Cell_1 0.301333 \n",
+ "DD3S1_Cell_2 0.259216 \n",
+ "DD3S1_Cell_3 0.107027 \n",
+ "DD3S1_Cell_6 0.272128 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.912641 \n",
+ "TMA_Cell_115756 -1.164112 \n",
+ "TMA_Cell_115757 -0.801333 \n",
+ "TMA_Cell_115758 -1.022549 \n",
+ "TMA_Cell_115760 -1.120675 \n",
+ "\n",
+ " CD20_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.483158 \n",
+ "DD3S1_Cell_1 -0.344770 \n",
+ "DD3S1_Cell_2 -0.438292 \n",
+ "DD3S1_Cell_3 -0.444889 \n",
+ "DD3S1_Cell_6 -0.507117 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.311322 \n",
+ "TMA_Cell_115756 0.866636 \n",
+ "TMA_Cell_115757 0.447061 \n",
+ "TMA_Cell_115758 -0.099256 \n",
+ "TMA_Cell_115760 0.004962 \n",
+ "\n",
+ " PD1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 1.535604 \n",
+ "DD3S1_Cell_1 1.668368 \n",
+ "DD3S1_Cell_2 1.336308 \n",
+ "DD3S1_Cell_3 1.249805 \n",
+ "DD3S1_Cell_6 1.251434 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.816068 \n",
+ "TMA_Cell_115756 -0.092857 \n",
+ "TMA_Cell_115757 0.988156 \n",
+ "TMA_Cell_115758 0.219755 \n",
+ "TMA_Cell_115760 -0.316199 \n",
+ "\n",
+ " AXL_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.807339 \n",
+ "DD3S1_Cell_1 0.875455 \n",
+ "DD3S1_Cell_2 0.705088 \n",
+ "DD3S1_Cell_3 0.660707 \n",
+ "DD3S1_Cell_6 0.947172 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.596520 \n",
+ "TMA_Cell_115756 -0.241830 \n",
+ "TMA_Cell_115757 1.567869 \n",
+ "TMA_Cell_115758 0.603715 \n",
+ "TMA_Cell_115760 1.727776 \n",
+ "\n",
+ " CD31_Cytoplasm_Intensity_Average ... Nucleus_Roundness \\\n",
+ "ID ... \n",
+ "DD3S1_Cell_0 1.167755 ... 0.955040 \n",
+ "DD3S1_Cell_1 1.643023 ... 0.966643 \n",
+ "DD3S1_Cell_2 1.053636 ... 0.721534 \n",
+ "DD3S1_Cell_3 1.165861 ... 0.587196 \n",
+ "DD3S1_Cell_6 2.545301 ... 0.935716 \n",
+ "... ... ... ... \n",
+ "TMA_Cell_115755 0.090397 ... 0.982196 \n",
+ "TMA_Cell_115756 -0.617835 ... 0.775977 \n",
+ "TMA_Cell_115757 0.403878 ... 0.688747 \n",
+ "TMA_Cell_115758 -0.219145 ... 0.751402 \n",
+ "TMA_Cell_115760 -0.495501 ... 0.674126 \n",
+ "\n",
+ " Nuc_X ROI_index Nucleus_Size Sample_ID \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 1484.771729 0 127 DD3S1.csv \n",
+ "DD3S1_Cell_1 1426.250000 0 112 DD3S1.csv \n",
+ "DD3S1_Cell_2 1531.110474 0 181 DD3S1.csv \n",
+ "DD3S1_Cell_3 1518.907593 0 119 DD3S1.csv \n",
+ "DD3S1_Cell_6 1471.914917 0 47 DD3S1.csv \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 15564.458008 59 142 TMA.csv \n",
+ "TMA_Cell_115756 15629.680664 59 47 TMA.csv \n",
+ "TMA_Cell_115757 15518.421875 59 64 TMA.csv \n",
+ "TMA_Cell_115758 15539.275391 59 58 TMA.csv \n",
+ "TMA_Cell_115760 15542.961914 59 106 TMA.csv \n",
+ "\n",
+ " immune_checkpoint Cell_Size Patient Unique_ROI_index \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 None 339 61 61a \n",
+ "DD3S1_Cell_1 None 344 61 61a \n",
+ "DD3S1_Cell_2 None 422 61 61a \n",
+ "DD3S1_Cell_3 None 278 61 61a \n",
+ "DD3S1_Cell_6 None 204 61 61a \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 None 386 c59 c59a \n",
+ "TMA_Cell_115756 None 270 c59 c59a \n",
+ "TMA_Cell_115757 None 202 c59 c59a \n",
+ "TMA_Cell_115758 None 182 c59 c59a \n",
+ "TMA_Cell_115760 None 295 c59 c59a \n",
+ "\n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ "ID \n",
+ "DD3S1_Cell_0 1.0 \n",
+ "DD3S1_Cell_1 1.0 \n",
+ "DD3S1_Cell_2 1.0 \n",
+ "DD3S1_Cell_3 1.0 \n",
+ "DD3S1_Cell_6 1.0 \n",
+ "... ... \n",
+ "TMA_Cell_115755 CONTROL \n",
+ "TMA_Cell_115756 CONTROL \n",
+ "TMA_Cell_115757 CONTROL \n",
+ "TMA_Cell_115758 CONTROL \n",
+ "TMA_Cell_115760 CONTROL \n",
+ "\n",
+ "[704629 rows x 40 columns]"
+ ]
+ },
+ "execution_count": 36,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Go through 'Primary_chem(1)_vs_surg(0)' col to replace NaN values by 'CONTROL' if 'c' in 'Patient' col\n",
+ "df2.loc[(df2['Primary_chem(1)_vs_surg(0)'].isnull()) & (df2['Patient'].astype(str).str.contains('c|^c')), 'Primary_chem(1)_vs_surg(0)'] = 'CONTROL'\n",
+ "\n",
+ "df2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "id": "a3987559-aa7d-4638-bafb-096adcbd7e36",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " HLA_Cytoplasm_Intensity_Average \n",
+ " CKs_Cytoplasm_Intensity_Average \n",
+ " Ki67_Nucleus_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " ColVI_Cytoplasm_Intensity_Average \n",
+ " CD20_Cytoplasm_Intensity_Average \n",
+ " PD1_Cytoplasm_Intensity_Average \n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ " CD31_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nucleus_Roundness \n",
+ " Nuc_X \n",
+ " ROI_index \n",
+ " Nucleus_Size \n",
+ " Sample_ID \n",
+ " immune_checkpoint \n",
+ " Cell_Size \n",
+ " Patient \n",
+ " Unique_ROI_index \n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
0 rows Ć 40 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ "Empty DataFrame\n",
+ "Columns: [PDL1_Cytoplasm_Intensity_Average, HLA_Cytoplasm_Intensity_Average, CKs_Cytoplasm_Intensity_Average, Ki67_Nucleus_Intensity_Average, CD163_Cytoplasm_Intensity_Average, ColVI_Cytoplasm_Intensity_Average, CD20_Cytoplasm_Intensity_Average, PD1_Cytoplasm_Intensity_Average, AXL_Cytoplasm_Intensity_Average, CD31_Cytoplasm_Intensity_Average, Fibronectin_Cytoplasm_Intensity_Average, CD45_Cytoplasm_Intensity_Average, Ecad_Cytoplasm_Intensity_Average, CD8_Cytoplasm_Intensity_Average, GATA3_Nucleus_Intensity_Average, Sting_Cytoplasm_Intensity_Average, aSMA_Cytoplasm_Intensity_Average, FOXP3_Nucleus_Intensity_Average, CD11c_Cytoplasm_Intensity_Average, CD4_Cytoplasm_Intensity_Average, Vimentin_Cytoplasm_Intensity_Average, CD44_Cytoplasm_Intensity_Average, CD68_Cytoplasm_Intensity_Average, PDGFR_Cytoplasm_Intensity_Average, B7H4_Cell_Intensity_Average, MMP9_Cytoplasm_Intensity_Average, Desmin_Cytoplasm_Intensity_Average, cell_subtype, cell_type, Nuc_Y_Inv, Nucleus_Roundness, Nuc_X, ROI_index, Nucleus_Size, Sample_ID, immune_checkpoint, Cell_Size, Patient, Unique_ROI_index, Primary_chem(1)_vs_surg(0)]\n",
+ "Index: []\n",
+ "\n",
+ "[0 rows x 40 columns]"
+ ]
+ },
+ "execution_count": 37,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# supposed empty\n",
+ "df2[df2['Primary_chem(1)_vs_surg(0)'].isna()]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "id": "5d8089d6-1ca5-4890-abae-20947e1b4941",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "# CrƩation de trois DataFrames en fonction des valeurs dans 'Primary_chem(1)_vs_surg(0)'\n",
+ "df_NACT = df2[df2['Primary_chem(1)_vs_surg(0)'] == 1]\n",
+ "df_ACT = df2[df2['Primary_chem(1)_vs_surg(0)'] == 0]\n",
+ "df_control = df2[df2['Primary_chem(1)_vs_surg(0)'] == 'CONTROL']\n",
+ "\n",
+ "filename_NACT = os.path.join(output_data_dir, 'df_NACT.csv')\n",
+ "filename_ACT = os.path.join(output_data_dir, 'df_ACT.csv')\n",
+ "filename_control = os.path.join(output_data_dir, 'df_control.csv')\n",
+ "\n",
+ "# Enregistrement des DataFrames dans des fichiers CSV dans le rƩpertoire output_data_dir\n",
+ "df_NACT.to_csv(filename_NACT, index=False)\n",
+ "df_ACT.to_csv(filename_ACT, index=False)\n",
+ "df_control.to_csv(filename_control, index=False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 39,
+ "id": "d4038385-3463-487b-8e80-c561adf6249a",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " HLA_Cytoplasm_Intensity_Average \n",
+ " CKs_Cytoplasm_Intensity_Average \n",
+ " Ki67_Nucleus_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " ColVI_Cytoplasm_Intensity_Average \n",
+ " CD20_Cytoplasm_Intensity_Average \n",
+ " PD1_Cytoplasm_Intensity_Average \n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ " CD31_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nucleus_Roundness \n",
+ " Nuc_X \n",
+ " ROI_index \n",
+ " Nucleus_Size \n",
+ " Sample_ID \n",
+ " immune_checkpoint \n",
+ " Cell_Size \n",
+ " Patient \n",
+ " Unique_ROI_index \n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_0 \n",
+ " -0.677863 \n",
+ " -0.417494 \n",
+ " -0.912537 \n",
+ " -0.817876 \n",
+ " 0.930099 \n",
+ " 0.232078 \n",
+ " -0.483158 \n",
+ " 1.535604 \n",
+ " 0.807339 \n",
+ " 1.167755 \n",
+ " ... \n",
+ " 0.955040 \n",
+ " 1484.771729 \n",
+ " 0 \n",
+ " 127 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 339 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_1 \n",
+ " -0.677863 \n",
+ " -0.516487 \n",
+ " -0.838037 \n",
+ " -0.869685 \n",
+ " 1.114924 \n",
+ " 0.301333 \n",
+ " -0.344770 \n",
+ " 1.668368 \n",
+ " 0.875455 \n",
+ " 1.643023 \n",
+ " ... \n",
+ " 0.966643 \n",
+ " 1426.250000 \n",
+ " 0 \n",
+ " 112 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 344 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_2 \n",
+ " -0.677863 \n",
+ " -0.141921 \n",
+ " -1.016023 \n",
+ " -0.755879 \n",
+ " 0.834577 \n",
+ " 0.259216 \n",
+ " -0.438292 \n",
+ " 1.336308 \n",
+ " 0.705088 \n",
+ " 1.053636 \n",
+ " ... \n",
+ " 0.721534 \n",
+ " 1531.110474 \n",
+ " 0 \n",
+ " 181 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 422 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_3 \n",
+ " -0.741282 \n",
+ " -0.460472 \n",
+ " -0.491711 \n",
+ " -0.818084 \n",
+ " 0.648200 \n",
+ " 0.107027 \n",
+ " -0.444889 \n",
+ " 1.249805 \n",
+ " 0.660707 \n",
+ " 1.165861 \n",
+ " ... \n",
+ " 0.587196 \n",
+ " 1518.907593 \n",
+ " 0 \n",
+ " 119 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 278 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_6 \n",
+ " -0.621521 \n",
+ " -0.247254 \n",
+ " -0.867127 \n",
+ " -0.742544 \n",
+ " 0.810579 \n",
+ " 0.272128 \n",
+ " -0.507117 \n",
+ " 1.251434 \n",
+ " 0.947172 \n",
+ " 2.545301 \n",
+ " ... \n",
+ " 0.935716 \n",
+ " 1471.914917 \n",
+ " 0 \n",
+ " 47 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 204 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_62826 \n",
+ " -0.446025 \n",
+ " 0.480212 \n",
+ " 1.195440 \n",
+ " -0.081463 \n",
+ " -0.634343 \n",
+ " -0.883815 \n",
+ " 1.050928 \n",
+ " 0.164709 \n",
+ " 0.103986 \n",
+ " 0.171579 \n",
+ " ... \n",
+ " 0.609764 \n",
+ " 13449.426758 \n",
+ " 34 \n",
+ " 103 \n",
+ " DD5S3.csv \n",
+ " None \n",
+ " 237 \n",
+ " 187 \n",
+ " 187c \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_62828 \n",
+ " -0.414440 \n",
+ " 0.416668 \n",
+ " 1.542926 \n",
+ " -0.203248 \n",
+ " -0.076555 \n",
+ " -0.783759 \n",
+ " 0.423346 \n",
+ " 0.638305 \n",
+ " 0.346970 \n",
+ " 0.453372 \n",
+ " ... \n",
+ " 0.736844 \n",
+ " 13469.353516 \n",
+ " 34 \n",
+ " 65 \n",
+ " DD5S3.csv \n",
+ " None \n",
+ " 231 \n",
+ " 187 \n",
+ " 187c \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_62829 \n",
+ " -0.720569 \n",
+ " 0.072144 \n",
+ " -0.311962 \n",
+ " -0.481442 \n",
+ " 1.236053 \n",
+ " -0.468813 \n",
+ " 0.252353 \n",
+ " 2.129042 \n",
+ " 1.111809 \n",
+ " 1.340371 \n",
+ " ... \n",
+ " 0.691315 \n",
+ " 13390.447266 \n",
+ " 34 \n",
+ " 85 \n",
+ " DD5S3.csv \n",
+ " None \n",
+ " 224 \n",
+ " 187 \n",
+ " 187c \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_62830 \n",
+ " -0.442500 \n",
+ " 0.368654 \n",
+ " -1.491754 \n",
+ " -0.316270 \n",
+ " 0.029502 \n",
+ " -0.736522 \n",
+ " 0.390883 \n",
+ " 0.861894 \n",
+ " 0.461685 \n",
+ " 0.586409 \n",
+ " ... \n",
+ " 0.892707 \n",
+ " 13430.178711 \n",
+ " 34 \n",
+ " 56 \n",
+ " DD5S3.csv \n",
+ " None \n",
+ " 139 \n",
+ " 187 \n",
+ " 187c \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_62831 \n",
+ " 0.040892 \n",
+ " 1.166606 \n",
+ " -1.676753 \n",
+ " 0.249586 \n",
+ " -1.486438 \n",
+ " -1.072878 \n",
+ " 2.024627 \n",
+ " -0.730182 \n",
+ " -0.355148 \n",
+ " -0.360887 \n",
+ " ... \n",
+ " 0.676388 \n",
+ " 13445.479492 \n",
+ " 34 \n",
+ " 48 \n",
+ " DD5S3.csv \n",
+ " None \n",
+ " 183 \n",
+ " 187 \n",
+ " 187c \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
113959 rows Ć 40 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.677863 \n",
+ "DD3S1_Cell_1 -0.677863 \n",
+ "DD3S1_Cell_2 -0.677863 \n",
+ "DD3S1_Cell_3 -0.741282 \n",
+ "DD3S1_Cell_6 -0.621521 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 -0.446025 \n",
+ "DD5S3_Cell_62828 -0.414440 \n",
+ "DD5S3_Cell_62829 -0.720569 \n",
+ "DD5S3_Cell_62830 -0.442500 \n",
+ "DD5S3_Cell_62831 0.040892 \n",
+ "\n",
+ " HLA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.417494 \n",
+ "DD3S1_Cell_1 -0.516487 \n",
+ "DD3S1_Cell_2 -0.141921 \n",
+ "DD3S1_Cell_3 -0.460472 \n",
+ "DD3S1_Cell_6 -0.247254 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 0.480212 \n",
+ "DD5S3_Cell_62828 0.416668 \n",
+ "DD5S3_Cell_62829 0.072144 \n",
+ "DD5S3_Cell_62830 0.368654 \n",
+ "DD5S3_Cell_62831 1.166606 \n",
+ "\n",
+ " CKs_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.912537 \n",
+ "DD3S1_Cell_1 -0.838037 \n",
+ "DD3S1_Cell_2 -1.016023 \n",
+ "DD3S1_Cell_3 -0.491711 \n",
+ "DD3S1_Cell_6 -0.867127 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 1.195440 \n",
+ "DD5S3_Cell_62828 1.542926 \n",
+ "DD5S3_Cell_62829 -0.311962 \n",
+ "DD5S3_Cell_62830 -1.491754 \n",
+ "DD5S3_Cell_62831 -1.676753 \n",
+ "\n",
+ " Ki67_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.817876 \n",
+ "DD3S1_Cell_1 -0.869685 \n",
+ "DD3S1_Cell_2 -0.755879 \n",
+ "DD3S1_Cell_3 -0.818084 \n",
+ "DD3S1_Cell_6 -0.742544 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 -0.081463 \n",
+ "DD5S3_Cell_62828 -0.203248 \n",
+ "DD5S3_Cell_62829 -0.481442 \n",
+ "DD5S3_Cell_62830 -0.316270 \n",
+ "DD5S3_Cell_62831 0.249586 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.930099 \n",
+ "DD3S1_Cell_1 1.114924 \n",
+ "DD3S1_Cell_2 0.834577 \n",
+ "DD3S1_Cell_3 0.648200 \n",
+ "DD3S1_Cell_6 0.810579 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 -0.634343 \n",
+ "DD5S3_Cell_62828 -0.076555 \n",
+ "DD5S3_Cell_62829 1.236053 \n",
+ "DD5S3_Cell_62830 0.029502 \n",
+ "DD5S3_Cell_62831 -1.486438 \n",
+ "\n",
+ " ColVI_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.232078 \n",
+ "DD3S1_Cell_1 0.301333 \n",
+ "DD3S1_Cell_2 0.259216 \n",
+ "DD3S1_Cell_3 0.107027 \n",
+ "DD3S1_Cell_6 0.272128 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 -0.883815 \n",
+ "DD5S3_Cell_62828 -0.783759 \n",
+ "DD5S3_Cell_62829 -0.468813 \n",
+ "DD5S3_Cell_62830 -0.736522 \n",
+ "DD5S3_Cell_62831 -1.072878 \n",
+ "\n",
+ " CD20_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.483158 \n",
+ "DD3S1_Cell_1 -0.344770 \n",
+ "DD3S1_Cell_2 -0.438292 \n",
+ "DD3S1_Cell_3 -0.444889 \n",
+ "DD3S1_Cell_6 -0.507117 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 1.050928 \n",
+ "DD5S3_Cell_62828 0.423346 \n",
+ "DD5S3_Cell_62829 0.252353 \n",
+ "DD5S3_Cell_62830 0.390883 \n",
+ "DD5S3_Cell_62831 2.024627 \n",
+ "\n",
+ " PD1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 1.535604 \n",
+ "DD3S1_Cell_1 1.668368 \n",
+ "DD3S1_Cell_2 1.336308 \n",
+ "DD3S1_Cell_3 1.249805 \n",
+ "DD3S1_Cell_6 1.251434 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 0.164709 \n",
+ "DD5S3_Cell_62828 0.638305 \n",
+ "DD5S3_Cell_62829 2.129042 \n",
+ "DD5S3_Cell_62830 0.861894 \n",
+ "DD5S3_Cell_62831 -0.730182 \n",
+ "\n",
+ " AXL_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.807339 \n",
+ "DD3S1_Cell_1 0.875455 \n",
+ "DD3S1_Cell_2 0.705088 \n",
+ "DD3S1_Cell_3 0.660707 \n",
+ "DD3S1_Cell_6 0.947172 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 0.103986 \n",
+ "DD5S3_Cell_62828 0.346970 \n",
+ "DD5S3_Cell_62829 1.111809 \n",
+ "DD5S3_Cell_62830 0.461685 \n",
+ "DD5S3_Cell_62831 -0.355148 \n",
+ "\n",
+ " CD31_Cytoplasm_Intensity_Average ... Nucleus_Roundness \\\n",
+ "ID ... \n",
+ "DD3S1_Cell_0 1.167755 ... 0.955040 \n",
+ "DD3S1_Cell_1 1.643023 ... 0.966643 \n",
+ "DD3S1_Cell_2 1.053636 ... 0.721534 \n",
+ "DD3S1_Cell_3 1.165861 ... 0.587196 \n",
+ "DD3S1_Cell_6 2.545301 ... 0.935716 \n",
+ "... ... ... ... \n",
+ "DD5S3_Cell_62826 0.171579 ... 0.609764 \n",
+ "DD5S3_Cell_62828 0.453372 ... 0.736844 \n",
+ "DD5S3_Cell_62829 1.340371 ... 0.691315 \n",
+ "DD5S3_Cell_62830 0.586409 ... 0.892707 \n",
+ "DD5S3_Cell_62831 -0.360887 ... 0.676388 \n",
+ "\n",
+ " Nuc_X ROI_index Nucleus_Size Sample_ID \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 1484.771729 0 127 DD3S1.csv \n",
+ "DD3S1_Cell_1 1426.250000 0 112 DD3S1.csv \n",
+ "DD3S1_Cell_2 1531.110474 0 181 DD3S1.csv \n",
+ "DD3S1_Cell_3 1518.907593 0 119 DD3S1.csv \n",
+ "DD3S1_Cell_6 1471.914917 0 47 DD3S1.csv \n",
+ "... ... ... ... ... \n",
+ "DD5S3_Cell_62826 13449.426758 34 103 DD5S3.csv \n",
+ "DD5S3_Cell_62828 13469.353516 34 65 DD5S3.csv \n",
+ "DD5S3_Cell_62829 13390.447266 34 85 DD5S3.csv \n",
+ "DD5S3_Cell_62830 13430.178711 34 56 DD5S3.csv \n",
+ "DD5S3_Cell_62831 13445.479492 34 48 DD5S3.csv \n",
+ "\n",
+ " immune_checkpoint Cell_Size Patient Unique_ROI_index \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 None 339 61 61a \n",
+ "DD3S1_Cell_1 None 344 61 61a \n",
+ "DD3S1_Cell_2 None 422 61 61a \n",
+ "DD3S1_Cell_3 None 278 61 61a \n",
+ "DD3S1_Cell_6 None 204 61 61a \n",
+ "... ... ... ... ... \n",
+ "DD5S3_Cell_62826 None 237 187 187c \n",
+ "DD5S3_Cell_62828 None 231 187 187c \n",
+ "DD5S3_Cell_62829 None 224 187 187c \n",
+ "DD5S3_Cell_62830 None 139 187 187c \n",
+ "DD5S3_Cell_62831 None 183 187 187c \n",
+ "\n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ "ID \n",
+ "DD3S1_Cell_0 1.0 \n",
+ "DD3S1_Cell_1 1.0 \n",
+ "DD3S1_Cell_2 1.0 \n",
+ "DD3S1_Cell_3 1.0 \n",
+ "DD3S1_Cell_6 1.0 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 1.0 \n",
+ "DD5S3_Cell_62828 1.0 \n",
+ "DD5S3_Cell_62829 1.0 \n",
+ "DD5S3_Cell_62830 1.0 \n",
+ "DD5S3_Cell_62831 1.0 \n",
+ "\n",
+ "[113959 rows x 40 columns]"
+ ]
+ },
+ "execution_count": 39,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_NACT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "id": "1af784e7-585e-4973-8012-c00627d5a685",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " HLA_Cytoplasm_Intensity_Average \n",
+ " CKs_Cytoplasm_Intensity_Average \n",
+ " Ki67_Nucleus_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " ColVI_Cytoplasm_Intensity_Average \n",
+ " CD20_Cytoplasm_Intensity_Average \n",
+ " PD1_Cytoplasm_Intensity_Average \n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ " CD31_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nucleus_Roundness \n",
+ " Nuc_X \n",
+ " ROI_index \n",
+ " Nucleus_Size \n",
+ " Sample_ID \n",
+ " immune_checkpoint \n",
+ " Cell_Size \n",
+ " Patient \n",
+ " Unique_ROI_index \n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_1910 \n",
+ " -1.137775 \n",
+ " -0.495306 \n",
+ " -1.178944 \n",
+ " -0.832994 \n",
+ " 1.067765 \n",
+ " 1.432729 \n",
+ " -0.220835 \n",
+ " 1.952302 \n",
+ " 1.021130 \n",
+ " 1.235209 \n",
+ " ... \n",
+ " 0.873320 \n",
+ " 1143.897461 \n",
+ " 1 \n",
+ " 78 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 265 \n",
+ " 62 \n",
+ " 62a \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_1911 \n",
+ " -1.399789 \n",
+ " 0.791106 \n",
+ " 0.567668 \n",
+ " 0.215155 \n",
+ " 0.518692 \n",
+ " -0.627981 \n",
+ " -0.000923 \n",
+ " 1.375652 \n",
+ " 0.725274 \n",
+ " 0.945061 \n",
+ " ... \n",
+ " 0.566933 \n",
+ " 1396.333252 \n",
+ " 1 \n",
+ " 93 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 210 \n",
+ " 62 \n",
+ " 62a \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_1922 \n",
+ " -1.186023 \n",
+ " -0.520883 \n",
+ " -1.104365 \n",
+ " -0.894190 \n",
+ " 0.988875 \n",
+ " 1.417141 \n",
+ " -0.328588 \n",
+ " 1.869449 \n",
+ " 0.978622 \n",
+ " 1.185912 \n",
+ " ... \n",
+ " 0.886386 \n",
+ " 1148.870972 \n",
+ " 1 \n",
+ " 62 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 196 \n",
+ " 62 \n",
+ " 62a \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_1928 \n",
+ " -0.329397 \n",
+ " 0.396547 \n",
+ " 1.746212 \n",
+ " 1.313160 \n",
+ " 1.139536 \n",
+ " -0.546020 \n",
+ " 1.586974 \n",
+ " 1.763598 \n",
+ " 0.924314 \n",
+ " 1.122929 \n",
+ " ... \n",
+ " 0.738159 \n",
+ " 1097.823486 \n",
+ " 1 \n",
+ " 51 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 159 \n",
+ " 62 \n",
+ " 62a \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_1942 \n",
+ " -0.970875 \n",
+ " -0.126315 \n",
+ " 1.072148 \n",
+ " 0.178276 \n",
+ " 1.103388 \n",
+ " -0.498249 \n",
+ " -0.026061 \n",
+ " 1.989714 \n",
+ " 1.040325 \n",
+ " 1.257470 \n",
+ " ... \n",
+ " 0.890113 \n",
+ " 1402.000000 \n",
+ " 1 \n",
+ " 114 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 205 \n",
+ " 62 \n",
+ " 62a \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_64060 \n",
+ " -0.677863 \n",
+ " 0.887158 \n",
+ " -0.528183 \n",
+ " 0.525142 \n",
+ " 5.217188 \n",
+ " -1.300569 \n",
+ " -0.775098 \n",
+ " -1.455787 \n",
+ " -0.908090 \n",
+ " -0.862636 \n",
+ " ... \n",
+ " 0.830379 \n",
+ " 13503.915039 \n",
+ " 35 \n",
+ " 106 \n",
+ " DD5S3.csv \n",
+ " None \n",
+ " 378 \n",
+ " 186 \n",
+ " 186a \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_64061 \n",
+ " 0.479994 \n",
+ " 0.415456 \n",
+ " 0.819658 \n",
+ " 0.623611 \n",
+ " 2.082444 \n",
+ " -1.053888 \n",
+ " 1.671235 \n",
+ " 0.310590 \n",
+ " -0.309031 \n",
+ " -0.235059 \n",
+ " ... \n",
+ " 0.646098 \n",
+ " 13254.210938 \n",
+ " 35 \n",
+ " 90 \n",
+ " DD5S3.csv \n",
+ " None \n",
+ " 151 \n",
+ " 186 \n",
+ " 186a \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_64062 \n",
+ " 0.660736 \n",
+ " 0.440965 \n",
+ " 1.409010 \n",
+ " 0.406828 \n",
+ " 2.082444 \n",
+ " -0.849359 \n",
+ " 1.622354 \n",
+ " 1.128603 \n",
+ " 0.187663 \n",
+ " 0.290273 \n",
+ " ... \n",
+ " 0.566233 \n",
+ " 13260.901367 \n",
+ " 35 \n",
+ " 61 \n",
+ " DD5S3.csv \n",
+ " None \n",
+ " 146 \n",
+ " 186 \n",
+ " 186a \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_64063 \n",
+ " 0.232880 \n",
+ " 0.505008 \n",
+ " 0.798055 \n",
+ " 1.721604 \n",
+ " 0.625211 \n",
+ " -1.022122 \n",
+ " 0.833309 \n",
+ " -0.489938 \n",
+ " -0.231888 \n",
+ " -0.208742 \n",
+ " ... \n",
+ " 0.788226 \n",
+ " 13292.144531 \n",
+ " 35 \n",
+ " 76 \n",
+ " DD5S3.csv \n",
+ " None \n",
+ " 326 \n",
+ " 186 \n",
+ " 186a \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_64066 \n",
+ " -0.166463 \n",
+ " 0.896852 \n",
+ " -1.903397 \n",
+ " 3.436984 \n",
+ " 1.873290 \n",
+ " -0.673352 \n",
+ " 2.613096 \n",
+ " 1.160896 \n",
+ " 0.615091 \n",
+ " 0.764317 \n",
+ " ... \n",
+ " 0.791907 \n",
+ " 13420.065430 \n",
+ " 35 \n",
+ " 46 \n",
+ " DD5S3.csv \n",
+ " B7H4 \n",
+ " 232 \n",
+ " 186 \n",
+ " 186a \n",
+ " 0.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
495928 rows Ć 40 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_1910 -1.137775 \n",
+ "DD3S1_Cell_1911 -1.399789 \n",
+ "DD3S1_Cell_1922 -1.186023 \n",
+ "DD3S1_Cell_1928 -0.329397 \n",
+ "DD3S1_Cell_1942 -0.970875 \n",
+ "... ... \n",
+ "DD5S3_Cell_64060 -0.677863 \n",
+ "DD5S3_Cell_64061 0.479994 \n",
+ "DD5S3_Cell_64062 0.660736 \n",
+ "DD5S3_Cell_64063 0.232880 \n",
+ "DD5S3_Cell_64066 -0.166463 \n",
+ "\n",
+ " HLA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_1910 -0.495306 \n",
+ "DD3S1_Cell_1911 0.791106 \n",
+ "DD3S1_Cell_1922 -0.520883 \n",
+ "DD3S1_Cell_1928 0.396547 \n",
+ "DD3S1_Cell_1942 -0.126315 \n",
+ "... ... \n",
+ "DD5S3_Cell_64060 0.887158 \n",
+ "DD5S3_Cell_64061 0.415456 \n",
+ "DD5S3_Cell_64062 0.440965 \n",
+ "DD5S3_Cell_64063 0.505008 \n",
+ "DD5S3_Cell_64066 0.896852 \n",
+ "\n",
+ " CKs_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_1910 -1.178944 \n",
+ "DD3S1_Cell_1911 0.567668 \n",
+ "DD3S1_Cell_1922 -1.104365 \n",
+ "DD3S1_Cell_1928 1.746212 \n",
+ "DD3S1_Cell_1942 1.072148 \n",
+ "... ... \n",
+ "DD5S3_Cell_64060 -0.528183 \n",
+ "DD5S3_Cell_64061 0.819658 \n",
+ "DD5S3_Cell_64062 1.409010 \n",
+ "DD5S3_Cell_64063 0.798055 \n",
+ "DD5S3_Cell_64066 -1.903397 \n",
+ "\n",
+ " Ki67_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_1910 -0.832994 \n",
+ "DD3S1_Cell_1911 0.215155 \n",
+ "DD3S1_Cell_1922 -0.894190 \n",
+ "DD3S1_Cell_1928 1.313160 \n",
+ "DD3S1_Cell_1942 0.178276 \n",
+ "... ... \n",
+ "DD5S3_Cell_64060 0.525142 \n",
+ "DD5S3_Cell_64061 0.623611 \n",
+ "DD5S3_Cell_64062 0.406828 \n",
+ "DD5S3_Cell_64063 1.721604 \n",
+ "DD5S3_Cell_64066 3.436984 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_1910 1.067765 \n",
+ "DD3S1_Cell_1911 0.518692 \n",
+ "DD3S1_Cell_1922 0.988875 \n",
+ "DD3S1_Cell_1928 1.139536 \n",
+ "DD3S1_Cell_1942 1.103388 \n",
+ "... ... \n",
+ "DD5S3_Cell_64060 5.217188 \n",
+ "DD5S3_Cell_64061 2.082444 \n",
+ "DD5S3_Cell_64062 2.082444 \n",
+ "DD5S3_Cell_64063 0.625211 \n",
+ "DD5S3_Cell_64066 1.873290 \n",
+ "\n",
+ " ColVI_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_1910 1.432729 \n",
+ "DD3S1_Cell_1911 -0.627981 \n",
+ "DD3S1_Cell_1922 1.417141 \n",
+ "DD3S1_Cell_1928 -0.546020 \n",
+ "DD3S1_Cell_1942 -0.498249 \n",
+ "... ... \n",
+ "DD5S3_Cell_64060 -1.300569 \n",
+ "DD5S3_Cell_64061 -1.053888 \n",
+ "DD5S3_Cell_64062 -0.849359 \n",
+ "DD5S3_Cell_64063 -1.022122 \n",
+ "DD5S3_Cell_64066 -0.673352 \n",
+ "\n",
+ " CD20_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_1910 -0.220835 \n",
+ "DD3S1_Cell_1911 -0.000923 \n",
+ "DD3S1_Cell_1922 -0.328588 \n",
+ "DD3S1_Cell_1928 1.586974 \n",
+ "DD3S1_Cell_1942 -0.026061 \n",
+ "... ... \n",
+ "DD5S3_Cell_64060 -0.775098 \n",
+ "DD5S3_Cell_64061 1.671235 \n",
+ "DD5S3_Cell_64062 1.622354 \n",
+ "DD5S3_Cell_64063 0.833309 \n",
+ "DD5S3_Cell_64066 2.613096 \n",
+ "\n",
+ " PD1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_1910 1.952302 \n",
+ "DD3S1_Cell_1911 1.375652 \n",
+ "DD3S1_Cell_1922 1.869449 \n",
+ "DD3S1_Cell_1928 1.763598 \n",
+ "DD3S1_Cell_1942 1.989714 \n",
+ "... ... \n",
+ "DD5S3_Cell_64060 -1.455787 \n",
+ "DD5S3_Cell_64061 0.310590 \n",
+ "DD5S3_Cell_64062 1.128603 \n",
+ "DD5S3_Cell_64063 -0.489938 \n",
+ "DD5S3_Cell_64066 1.160896 \n",
+ "\n",
+ " AXL_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_1910 1.021130 \n",
+ "DD3S1_Cell_1911 0.725274 \n",
+ "DD3S1_Cell_1922 0.978622 \n",
+ "DD3S1_Cell_1928 0.924314 \n",
+ "DD3S1_Cell_1942 1.040325 \n",
+ "... ... \n",
+ "DD5S3_Cell_64060 -0.908090 \n",
+ "DD5S3_Cell_64061 -0.309031 \n",
+ "DD5S3_Cell_64062 0.187663 \n",
+ "DD5S3_Cell_64063 -0.231888 \n",
+ "DD5S3_Cell_64066 0.615091 \n",
+ "\n",
+ " CD31_Cytoplasm_Intensity_Average ... Nucleus_Roundness \\\n",
+ "ID ... \n",
+ "DD3S1_Cell_1910 1.235209 ... 0.873320 \n",
+ "DD3S1_Cell_1911 0.945061 ... 0.566933 \n",
+ "DD3S1_Cell_1922 1.185912 ... 0.886386 \n",
+ "DD3S1_Cell_1928 1.122929 ... 0.738159 \n",
+ "DD3S1_Cell_1942 1.257470 ... 0.890113 \n",
+ "... ... ... ... \n",
+ "DD5S3_Cell_64060 -0.862636 ... 0.830379 \n",
+ "DD5S3_Cell_64061 -0.235059 ... 0.646098 \n",
+ "DD5S3_Cell_64062 0.290273 ... 0.566233 \n",
+ "DD5S3_Cell_64063 -0.208742 ... 0.788226 \n",
+ "DD5S3_Cell_64066 0.764317 ... 0.791907 \n",
+ "\n",
+ " Nuc_X ROI_index Nucleus_Size Sample_ID \\\n",
+ "ID \n",
+ "DD3S1_Cell_1910 1143.897461 1 78 DD3S1.csv \n",
+ "DD3S1_Cell_1911 1396.333252 1 93 DD3S1.csv \n",
+ "DD3S1_Cell_1922 1148.870972 1 62 DD3S1.csv \n",
+ "DD3S1_Cell_1928 1097.823486 1 51 DD3S1.csv \n",
+ "DD3S1_Cell_1942 1402.000000 1 114 DD3S1.csv \n",
+ "... ... ... ... ... \n",
+ "DD5S3_Cell_64060 13503.915039 35 106 DD5S3.csv \n",
+ "DD5S3_Cell_64061 13254.210938 35 90 DD5S3.csv \n",
+ "DD5S3_Cell_64062 13260.901367 35 61 DD5S3.csv \n",
+ "DD5S3_Cell_64063 13292.144531 35 76 DD5S3.csv \n",
+ "DD5S3_Cell_64066 13420.065430 35 46 DD5S3.csv \n",
+ "\n",
+ " immune_checkpoint Cell_Size Patient Unique_ROI_index \\\n",
+ "ID \n",
+ "DD3S1_Cell_1910 None 265 62 62a \n",
+ "DD3S1_Cell_1911 None 210 62 62a \n",
+ "DD3S1_Cell_1922 None 196 62 62a \n",
+ "DD3S1_Cell_1928 None 159 62 62a \n",
+ "DD3S1_Cell_1942 None 205 62 62a \n",
+ "... ... ... ... ... \n",
+ "DD5S3_Cell_64060 None 378 186 186a \n",
+ "DD5S3_Cell_64061 None 151 186 186a \n",
+ "DD5S3_Cell_64062 None 146 186 186a \n",
+ "DD5S3_Cell_64063 None 326 186 186a \n",
+ "DD5S3_Cell_64066 B7H4 232 186 186a \n",
+ "\n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ "ID \n",
+ "DD3S1_Cell_1910 0.0 \n",
+ "DD3S1_Cell_1911 0.0 \n",
+ "DD3S1_Cell_1922 0.0 \n",
+ "DD3S1_Cell_1928 0.0 \n",
+ "DD3S1_Cell_1942 0.0 \n",
+ "... ... \n",
+ "DD5S3_Cell_64060 0.0 \n",
+ "DD5S3_Cell_64061 0.0 \n",
+ "DD5S3_Cell_64062 0.0 \n",
+ "DD5S3_Cell_64063 0.0 \n",
+ "DD5S3_Cell_64066 0.0 \n",
+ "\n",
+ "[495928 rows x 40 columns]"
+ ]
+ },
+ "execution_count": 40,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_ACT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "id": "24481cf9-57bd-4879-b4ad-2e9073dc9993",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " HLA_Cytoplasm_Intensity_Average \n",
+ " CKs_Cytoplasm_Intensity_Average \n",
+ " Ki67_Nucleus_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " ColVI_Cytoplasm_Intensity_Average \n",
+ " CD20_Cytoplasm_Intensity_Average \n",
+ " PD1_Cytoplasm_Intensity_Average \n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ " CD31_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nucleus_Roundness \n",
+ " Nuc_X \n",
+ " ROI_index \n",
+ " Nucleus_Size \n",
+ " Sample_ID \n",
+ " immune_checkpoint \n",
+ " Cell_Size \n",
+ " Patient \n",
+ " Unique_ROI_index \n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " TMA_Cell_4 \n",
+ " -0.367050 \n",
+ " 3.386458 \n",
+ " -2.000166 \n",
+ " -0.459972 \n",
+ " 2.082444 \n",
+ " -0.331127 \n",
+ " 0.074576 \n",
+ " 0.367998 \n",
+ " 0.208285 \n",
+ " 2.426724 \n",
+ " ... \n",
+ " 0.639497 \n",
+ " 1603.610596 \n",
+ " 0 \n",
+ " 131 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 307 \n",
+ " c0 \n",
+ " c0a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_300 \n",
+ " -0.738040 \n",
+ " 2.894731 \n",
+ " -2.027276 \n",
+ " -0.536334 \n",
+ " 2.463664 \n",
+ " 0.615413 \n",
+ " 0.434008 \n",
+ " 0.145870 \n",
+ " 0.094320 \n",
+ " 0.796244 \n",
+ " ... \n",
+ " 0.557669 \n",
+ " 1870.953491 \n",
+ " 0 \n",
+ " 86 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 271 \n",
+ " c0 \n",
+ " c0a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_1231 \n",
+ " -0.166333 \n",
+ " 3.870697 \n",
+ " -1.953719 \n",
+ " -0.289915 \n",
+ " 2.276577 \n",
+ " -0.760463 \n",
+ " 0.856060 \n",
+ " 0.748574 \n",
+ " 0.403544 \n",
+ " 1.869273 \n",
+ " ... \n",
+ " 0.909491 \n",
+ " 1076.486938 \n",
+ " 0 \n",
+ " 115 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 215 \n",
+ " c0 \n",
+ " c0a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_1240 \n",
+ " -0.293766 \n",
+ " 2.246166 \n",
+ " -1.945873 \n",
+ " -0.607328 \n",
+ " 2.082444 \n",
+ " -0.615345 \n",
+ " 0.243531 \n",
+ " 0.812863 \n",
+ " 0.436529 \n",
+ " 2.194035 \n",
+ " ... \n",
+ " 0.945592 \n",
+ " 1089.709717 \n",
+ " 0 \n",
+ " 93 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 198 \n",
+ " c0 \n",
+ " c0a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_2107 \n",
+ " -0.677863 \n",
+ " 2.130819 \n",
+ " -2.035940 \n",
+ " -0.746582 \n",
+ " 1.538367 \n",
+ " 1.246304 \n",
+ " 0.179943 \n",
+ " 0.074879 \n",
+ " 0.057898 \n",
+ " 0.966884 \n",
+ " ... \n",
+ " 0.664589 \n",
+ " 1375.939697 \n",
+ " 0 \n",
+ " 116 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 167 \n",
+ " c0 \n",
+ " c0a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115755 \n",
+ " 0.478275 \n",
+ " 0.558670 \n",
+ " -0.962840 \n",
+ " 1.732291 \n",
+ " 0.507434 \n",
+ " -0.912641 \n",
+ " 0.311322 \n",
+ " 0.816068 \n",
+ " 0.596520 \n",
+ " 0.090397 \n",
+ " ... \n",
+ " 0.982196 \n",
+ " 15564.458008 \n",
+ " 59 \n",
+ " 142 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 386 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115756 \n",
+ " 0.297418 \n",
+ " 0.420594 \n",
+ " -0.971632 \n",
+ " 1.966955 \n",
+ " 0.304365 \n",
+ " -1.164112 \n",
+ " 0.866636 \n",
+ " -0.092857 \n",
+ " -0.241830 \n",
+ " -0.617835 \n",
+ " ... \n",
+ " 0.775977 \n",
+ " 15629.680664 \n",
+ " 59 \n",
+ " 47 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 270 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115757 \n",
+ " 0.346950 \n",
+ " 0.453951 \n",
+ " -0.602893 \n",
+ " 1.338956 \n",
+ " 0.559435 \n",
+ " -0.801333 \n",
+ " 0.447061 \n",
+ " 0.988156 \n",
+ " 1.567869 \n",
+ " 0.403878 \n",
+ " ... \n",
+ " 0.688747 \n",
+ " 15518.421875 \n",
+ " 59 \n",
+ " 64 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 202 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115758 \n",
+ " -0.189415 \n",
+ " 0.508840 \n",
+ " -0.886041 \n",
+ " 0.647980 \n",
+ " -0.227224 \n",
+ " -1.022549 \n",
+ " -0.099256 \n",
+ " 0.219755 \n",
+ " 0.603715 \n",
+ " -0.219145 \n",
+ " ... \n",
+ " 0.751402 \n",
+ " 15539.275391 \n",
+ " 59 \n",
+ " 58 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 182 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115760 \n",
+ " 0.245777 \n",
+ " 0.460219 \n",
+ " -1.003840 \n",
+ " 0.191158 \n",
+ " -0.313127 \n",
+ " -1.120675 \n",
+ " 0.004962 \n",
+ " -0.316199 \n",
+ " 1.727776 \n",
+ " -0.495501 \n",
+ " ... \n",
+ " 0.674126 \n",
+ " 15542.961914 \n",
+ " 59 \n",
+ " 106 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 295 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
94742 rows Ć 40 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 -0.367050 \n",
+ "TMA_Cell_300 -0.738040 \n",
+ "TMA_Cell_1231 -0.166333 \n",
+ "TMA_Cell_1240 -0.293766 \n",
+ "TMA_Cell_2107 -0.677863 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.478275 \n",
+ "TMA_Cell_115756 0.297418 \n",
+ "TMA_Cell_115757 0.346950 \n",
+ "TMA_Cell_115758 -0.189415 \n",
+ "TMA_Cell_115760 0.245777 \n",
+ "\n",
+ " HLA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 3.386458 \n",
+ "TMA_Cell_300 2.894731 \n",
+ "TMA_Cell_1231 3.870697 \n",
+ "TMA_Cell_1240 2.246166 \n",
+ "TMA_Cell_2107 2.130819 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.558670 \n",
+ "TMA_Cell_115756 0.420594 \n",
+ "TMA_Cell_115757 0.453951 \n",
+ "TMA_Cell_115758 0.508840 \n",
+ "TMA_Cell_115760 0.460219 \n",
+ "\n",
+ " CKs_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 -2.000166 \n",
+ "TMA_Cell_300 -2.027276 \n",
+ "TMA_Cell_1231 -1.953719 \n",
+ "TMA_Cell_1240 -1.945873 \n",
+ "TMA_Cell_2107 -2.035940 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.962840 \n",
+ "TMA_Cell_115756 -0.971632 \n",
+ "TMA_Cell_115757 -0.602893 \n",
+ "TMA_Cell_115758 -0.886041 \n",
+ "TMA_Cell_115760 -1.003840 \n",
+ "\n",
+ " Ki67_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 -0.459972 \n",
+ "TMA_Cell_300 -0.536334 \n",
+ "TMA_Cell_1231 -0.289915 \n",
+ "TMA_Cell_1240 -0.607328 \n",
+ "TMA_Cell_2107 -0.746582 \n",
+ "... ... \n",
+ "TMA_Cell_115755 1.732291 \n",
+ "TMA_Cell_115756 1.966955 \n",
+ "TMA_Cell_115757 1.338956 \n",
+ "TMA_Cell_115758 0.647980 \n",
+ "TMA_Cell_115760 0.191158 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 2.082444 \n",
+ "TMA_Cell_300 2.463664 \n",
+ "TMA_Cell_1231 2.276577 \n",
+ "TMA_Cell_1240 2.082444 \n",
+ "TMA_Cell_2107 1.538367 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.507434 \n",
+ "TMA_Cell_115756 0.304365 \n",
+ "TMA_Cell_115757 0.559435 \n",
+ "TMA_Cell_115758 -0.227224 \n",
+ "TMA_Cell_115760 -0.313127 \n",
+ "\n",
+ " ColVI_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 -0.331127 \n",
+ "TMA_Cell_300 0.615413 \n",
+ "TMA_Cell_1231 -0.760463 \n",
+ "TMA_Cell_1240 -0.615345 \n",
+ "TMA_Cell_2107 1.246304 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.912641 \n",
+ "TMA_Cell_115756 -1.164112 \n",
+ "TMA_Cell_115757 -0.801333 \n",
+ "TMA_Cell_115758 -1.022549 \n",
+ "TMA_Cell_115760 -1.120675 \n",
+ "\n",
+ " CD20_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 0.074576 \n",
+ "TMA_Cell_300 0.434008 \n",
+ "TMA_Cell_1231 0.856060 \n",
+ "TMA_Cell_1240 0.243531 \n",
+ "TMA_Cell_2107 0.179943 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.311322 \n",
+ "TMA_Cell_115756 0.866636 \n",
+ "TMA_Cell_115757 0.447061 \n",
+ "TMA_Cell_115758 -0.099256 \n",
+ "TMA_Cell_115760 0.004962 \n",
+ "\n",
+ " PD1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 0.367998 \n",
+ "TMA_Cell_300 0.145870 \n",
+ "TMA_Cell_1231 0.748574 \n",
+ "TMA_Cell_1240 0.812863 \n",
+ "TMA_Cell_2107 0.074879 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.816068 \n",
+ "TMA_Cell_115756 -0.092857 \n",
+ "TMA_Cell_115757 0.988156 \n",
+ "TMA_Cell_115758 0.219755 \n",
+ "TMA_Cell_115760 -0.316199 \n",
+ "\n",
+ " AXL_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "TMA_Cell_4 0.208285 \n",
+ "TMA_Cell_300 0.094320 \n",
+ "TMA_Cell_1231 0.403544 \n",
+ "TMA_Cell_1240 0.436529 \n",
+ "TMA_Cell_2107 0.057898 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.596520 \n",
+ "TMA_Cell_115756 -0.241830 \n",
+ "TMA_Cell_115757 1.567869 \n",
+ "TMA_Cell_115758 0.603715 \n",
+ "TMA_Cell_115760 1.727776 \n",
+ "\n",
+ " CD31_Cytoplasm_Intensity_Average ... Nucleus_Roundness \\\n",
+ "ID ... \n",
+ "TMA_Cell_4 2.426724 ... 0.639497 \n",
+ "TMA_Cell_300 0.796244 ... 0.557669 \n",
+ "TMA_Cell_1231 1.869273 ... 0.909491 \n",
+ "TMA_Cell_1240 2.194035 ... 0.945592 \n",
+ "TMA_Cell_2107 0.966884 ... 0.664589 \n",
+ "... ... ... ... \n",
+ "TMA_Cell_115755 0.090397 ... 0.982196 \n",
+ "TMA_Cell_115756 -0.617835 ... 0.775977 \n",
+ "TMA_Cell_115757 0.403878 ... 0.688747 \n",
+ "TMA_Cell_115758 -0.219145 ... 0.751402 \n",
+ "TMA_Cell_115760 -0.495501 ... 0.674126 \n",
+ "\n",
+ " Nuc_X ROI_index Nucleus_Size Sample_ID \\\n",
+ "ID \n",
+ "TMA_Cell_4 1603.610596 0 131 TMA.csv \n",
+ "TMA_Cell_300 1870.953491 0 86 TMA.csv \n",
+ "TMA_Cell_1231 1076.486938 0 115 TMA.csv \n",
+ "TMA_Cell_1240 1089.709717 0 93 TMA.csv \n",
+ "TMA_Cell_2107 1375.939697 0 116 TMA.csv \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 15564.458008 59 142 TMA.csv \n",
+ "TMA_Cell_115756 15629.680664 59 47 TMA.csv \n",
+ "TMA_Cell_115757 15518.421875 59 64 TMA.csv \n",
+ "TMA_Cell_115758 15539.275391 59 58 TMA.csv \n",
+ "TMA_Cell_115760 15542.961914 59 106 TMA.csv \n",
+ "\n",
+ " immune_checkpoint Cell_Size Patient Unique_ROI_index \\\n",
+ "ID \n",
+ "TMA_Cell_4 None 307 c0 c0a \n",
+ "TMA_Cell_300 None 271 c0 c0a \n",
+ "TMA_Cell_1231 None 215 c0 c0a \n",
+ "TMA_Cell_1240 None 198 c0 c0a \n",
+ "TMA_Cell_2107 None 167 c0 c0a \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 None 386 c59 c59a \n",
+ "TMA_Cell_115756 None 270 c59 c59a \n",
+ "TMA_Cell_115757 None 202 c59 c59a \n",
+ "TMA_Cell_115758 None 182 c59 c59a \n",
+ "TMA_Cell_115760 None 295 c59 c59a \n",
+ "\n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ "ID \n",
+ "TMA_Cell_4 CONTROL \n",
+ "TMA_Cell_300 CONTROL \n",
+ "TMA_Cell_1231 CONTROL \n",
+ "TMA_Cell_1240 CONTROL \n",
+ "TMA_Cell_2107 CONTROL \n",
+ "... ... \n",
+ "TMA_Cell_115755 CONTROL \n",
+ "TMA_Cell_115756 CONTROL \n",
+ "TMA_Cell_115757 CONTROL \n",
+ "TMA_Cell_115758 CONTROL \n",
+ "TMA_Cell_115760 CONTROL \n",
+ "\n",
+ "[94742 rows x 40 columns]"
+ ]
+ },
+ "execution_count": 41,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_control"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "c43a8fb1-7366-4e96-864d-3ca0b699319e",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "## V.4. COUNTS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "id": "2c36d567-801d-4bac-b6b7-bf8759ab6ce3",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "df = df2.copy()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "id": "89ab1bd6-d58c-4c33-9e1a-5a841d5271c9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " counts \n",
+ " Sample_ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1.csv \n",
+ " 68697 \n",
+ " DD3S1.csv \n",
+ " \n",
+ " \n",
+ " DD3S2.csv \n",
+ " 70850 \n",
+ " DD3S2.csv \n",
+ " \n",
+ " \n",
+ " DD3S3.csv \n",
+ " 116265 \n",
+ " DD3S3.csv \n",
+ " \n",
+ " \n",
+ " DD4S1.csv \n",
+ " 70748 \n",
+ " DD4S1.csv \n",
+ " \n",
+ " \n",
+ " DD4S2.csv \n",
+ " 51745 \n",
+ " DD4S2.csv \n",
+ " \n",
+ " \n",
+ " DD4S3.csv \n",
+ " 70818 \n",
+ " DD4S3.csv \n",
+ " \n",
+ " \n",
+ " DD5S1.csv \n",
+ " 69463 \n",
+ " DD5S1.csv \n",
+ " \n",
+ " \n",
+ " DD5S2.csv \n",
+ " 45403 \n",
+ " DD5S2.csv \n",
+ " \n",
+ " \n",
+ " DD5S3.csv \n",
+ " 45898 \n",
+ " DD5S3.csv \n",
+ " \n",
+ " \n",
+ " TMA.csv \n",
+ " 94742 \n",
+ " TMA.csv \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " counts Sample_ID\n",
+ "DD3S1.csv 68697 DD3S1.csv\n",
+ "DD3S2.csv 70850 DD3S2.csv\n",
+ "DD3S3.csv 116265 DD3S3.csv\n",
+ "DD4S1.csv 70748 DD4S1.csv\n",
+ "DD4S2.csv 51745 DD4S2.csv\n",
+ "DD4S3.csv 70818 DD4S3.csv\n",
+ "DD5S1.csv 69463 DD5S1.csv\n",
+ "DD5S2.csv 45403 DD5S2.csv\n",
+ "DD5S3.csv 45898 DD5S3.csv\n",
+ "TMA.csv 94742 TMA.csv"
+ ]
+ },
+ "execution_count": 43,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Get counts for each Sample_ID, sorted by Sample_ID\n",
+ "sample_counts = pd.DataFrame(df.Sample_ID.value_counts()).sort_index()\n",
+ "sample_counts = sample_counts.rename(columns = {'Sample_ID':'counts'})\n",
+ "sample_counts['Sample_ID'] = sample_counts.index\n",
+ "#counts['color'] = counts.apply(lambda row: color_dict[row['Sample_ID']], axis = 1)\n",
+ "sample_counts"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "963c7e14-a084-4665-8fa9-def1227ec306",
+ "metadata": {},
+ "source": [
+ "### V.4.1. CELL TYPES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "id": "38a3ca09-85f1-4fca-b769-11eb506b03fa",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " counts Sample_ID stroma cancer immune endothelial\n",
+ "DD3S1.csv 68697 DD3S1.csv 10690 48981 7360 1666\n",
+ "DD3S2.csv 70850 DD3S2.csv 12064 51059 5977 1750\n",
+ "DD3S3.csv 116265 DD3S3.csv 23412 77000 13075 2778\n",
+ "DD4S1.csv 70748 DD4S1.csv 7249 54013 7433 2053\n",
+ "DD4S2.csv 51745 DD4S2.csv 6193 39470 4850 1232\n",
+ "DD4S3.csv 70818 DD4S3.csv 8516 50598 10331 1373\n",
+ "DD5S1.csv 69463 DD5S1.csv 17067 43723 5878 2795\n",
+ "DD5S2.csv 45403 DD5S2.csv 11098 30839 2131 1335\n",
+ "DD5S3.csv 45898 DD5S3.csv 9018 30060 5656 1164\n",
+ "TMA.csv 94742 TMA.csv 23121 59978 9356 2287\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Count by cell type\n",
+ "stroma_counts = pd.DataFrame({'stroma':\n",
+ " df.loc[\n",
+ " df['cell_type'] == 'STROMA',:].Sample_ID.value_counts()}).sort_index()\n",
+ "\n",
+ "immune_counts = pd.DataFrame({'immune':\n",
+ " df.loc[\n",
+ " df['cell_type'] == 'IMMUNE',:].Sample_ID.value_counts()}).sort_index()\n",
+ "\n",
+ "cancer_counts = pd.DataFrame({'cancer':\n",
+ " df.loc[\n",
+ " df['cell_type'] == 'CANCER',:].Sample_ID.value_counts()}).sort_index()\n",
+ "\n",
+ "endothelial_counts = pd.DataFrame({'endothelial':\n",
+ " df.loc[\n",
+ " df['cell_type'] == 'ENDOTHELIAL',:].Sample_ID.value_counts()}).sort_index()\n",
+ "\n",
+ "counts = pd.concat([sample_counts, stroma_counts,cancer_counts,immune_counts,endothelial_counts], \n",
+ " axis = 1, sort = False)\n",
+ "\n",
+ "counts = counts.fillna(0)\n",
+ "print(counts)\n",
+ "\n",
+ "filename = os.path.join(output_data_dir , project_name + \"_cell_types_number.csv\")\n",
+ "counts.to_csv(filename, index = False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "id": "b19b0d76-0f17-4ed2-a41d-1e14d08d60ff",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " counts \n",
+ " Sample_ID \n",
+ " stroma \n",
+ " cancer \n",
+ " immune \n",
+ " endothelial \n",
+ " stroma_perc \n",
+ " immune_perc \n",
+ " cancer_perc \n",
+ " endothelial_perc \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1.csv \n",
+ " 68697 \n",
+ " DD3S1.csv \n",
+ " 10690 \n",
+ " 48981 \n",
+ " 7360 \n",
+ " 1666 \n",
+ " 15.6 \n",
+ " 10.7 \n",
+ " 71.3 \n",
+ " 2.4 \n",
+ " \n",
+ " \n",
+ " DD3S2.csv \n",
+ " 70850 \n",
+ " DD3S2.csv \n",
+ " 12064 \n",
+ " 51059 \n",
+ " 5977 \n",
+ " 1750 \n",
+ " 17.0 \n",
+ " 8.4 \n",
+ " 72.1 \n",
+ " 2.5 \n",
+ " \n",
+ " \n",
+ " DD3S3.csv \n",
+ " 116265 \n",
+ " DD3S3.csv \n",
+ " 23412 \n",
+ " 77000 \n",
+ " 13075 \n",
+ " 2778 \n",
+ " 20.1 \n",
+ " 11.2 \n",
+ " 66.2 \n",
+ " 2.4 \n",
+ " \n",
+ " \n",
+ " DD4S1.csv \n",
+ " 70748 \n",
+ " DD4S1.csv \n",
+ " 7249 \n",
+ " 54013 \n",
+ " 7433 \n",
+ " 2053 \n",
+ " 10.2 \n",
+ " 10.5 \n",
+ " 76.3 \n",
+ " 2.9 \n",
+ " \n",
+ " \n",
+ " DD4S2.csv \n",
+ " 51745 \n",
+ " DD4S2.csv \n",
+ " 6193 \n",
+ " 39470 \n",
+ " 4850 \n",
+ " 1232 \n",
+ " 12.0 \n",
+ " 9.4 \n",
+ " 76.3 \n",
+ " 2.4 \n",
+ " \n",
+ " \n",
+ " DD4S3.csv \n",
+ " 70818 \n",
+ " DD4S3.csv \n",
+ " 8516 \n",
+ " 50598 \n",
+ " 10331 \n",
+ " 1373 \n",
+ " 12.0 \n",
+ " 14.6 \n",
+ " 71.4 \n",
+ " 1.9 \n",
+ " \n",
+ " \n",
+ " DD5S1.csv \n",
+ " 69463 \n",
+ " DD5S1.csv \n",
+ " 17067 \n",
+ " 43723 \n",
+ " 5878 \n",
+ " 2795 \n",
+ " 24.6 \n",
+ " 8.5 \n",
+ " 62.9 \n",
+ " 4.0 \n",
+ " \n",
+ " \n",
+ " DD5S2.csv \n",
+ " 45403 \n",
+ " DD5S2.csv \n",
+ " 11098 \n",
+ " 30839 \n",
+ " 2131 \n",
+ " 1335 \n",
+ " 24.4 \n",
+ " 4.7 \n",
+ " 67.9 \n",
+ " 2.9 \n",
+ " \n",
+ " \n",
+ " DD5S3.csv \n",
+ " 45898 \n",
+ " DD5S3.csv \n",
+ " 9018 \n",
+ " 30060 \n",
+ " 5656 \n",
+ " 1164 \n",
+ " 19.6 \n",
+ " 12.3 \n",
+ " 65.5 \n",
+ " 2.5 \n",
+ " \n",
+ " \n",
+ " TMA.csv \n",
+ " 94742 \n",
+ " TMA.csv \n",
+ " 23121 \n",
+ " 59978 \n",
+ " 9356 \n",
+ " 2287 \n",
+ " 24.4 \n",
+ " 9.9 \n",
+ " 63.3 \n",
+ " 2.4 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " counts Sample_ID stroma cancer immune endothelial \\\n",
+ "DD3S1.csv 68697 DD3S1.csv 10690 48981 7360 1666 \n",
+ "DD3S2.csv 70850 DD3S2.csv 12064 51059 5977 1750 \n",
+ "DD3S3.csv 116265 DD3S3.csv 23412 77000 13075 2778 \n",
+ "DD4S1.csv 70748 DD4S1.csv 7249 54013 7433 2053 \n",
+ "DD4S2.csv 51745 DD4S2.csv 6193 39470 4850 1232 \n",
+ "DD4S3.csv 70818 DD4S3.csv 8516 50598 10331 1373 \n",
+ "DD5S1.csv 69463 DD5S1.csv 17067 43723 5878 2795 \n",
+ "DD5S2.csv 45403 DD5S2.csv 11098 30839 2131 1335 \n",
+ "DD5S3.csv 45898 DD5S3.csv 9018 30060 5656 1164 \n",
+ "TMA.csv 94742 TMA.csv 23121 59978 9356 2287 \n",
+ "\n",
+ " stroma_perc immune_perc cancer_perc endothelial_perc \n",
+ "DD3S1.csv 15.6 10.7 71.3 2.4 \n",
+ "DD3S2.csv 17.0 8.4 72.1 2.5 \n",
+ "DD3S3.csv 20.1 11.2 66.2 2.4 \n",
+ "DD4S1.csv 10.2 10.5 76.3 2.9 \n",
+ "DD4S2.csv 12.0 9.4 76.3 2.4 \n",
+ "DD4S3.csv 12.0 14.6 71.4 1.9 \n",
+ "DD5S1.csv 24.6 8.5 62.9 4.0 \n",
+ "DD5S2.csv 24.4 4.7 67.9 2.9 \n",
+ "DD5S3.csv 19.6 12.3 65.5 2.5 \n",
+ "TMA.csv 24.4 9.9 63.3 2.4 "
+ ]
+ },
+ "execution_count": 45,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Compute %\n",
+ "# get_perc() function in my_modules.py\n",
+ "\n",
+ "counts['stroma_perc'] = counts.apply(lambda row: get_perc(row, 'stroma'), axis = 1)\n",
+ "counts['immune_perc'] = counts.apply(lambda row: get_perc(row, 'immune'), axis = 1)\n",
+ "counts['cancer_perc'] = counts.apply(lambda row: get_perc(row, 'cancer'), axis = 1)\n",
+ "counts['endothelial_perc'] = counts.apply(lambda row: get_perc(row, 'endothelial'), axis = 1)\n",
+ "\n",
+ "counts"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "id": "facd7887-3b7b-44f9-b65f-185963a415de",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "fig = go.Figure()\n",
+ "title = 'Cell proportions by Sample ID and tissue type'\n",
+ "\n",
+ "fig = go.Figure(data=[\n",
+ " go.Bar(name='Stroma', x=counts['Sample_ID'], y=counts['stroma_perc'], \n",
+ " text = counts['stroma_perc'], textposition='auto',\n",
+ " marker_color = 'rgb' + str(cell_type_color_dict['STROMA'])),\n",
+ " go.Bar(name='Immune', x=counts['Sample_ID'], y=counts['immune_perc'], \n",
+ " text = counts['immune_perc'], textposition='auto',\n",
+ " marker_color = 'rgb' + str(cell_type_color_dict['IMMUNE'])),\n",
+ " go.Bar(name='Cancer',x=counts['Sample_ID'], y=counts['cancer_perc'], \n",
+ " text = counts['cancer_perc'], textposition='auto', \n",
+ " marker_color = 'rgb' + str(cell_type_color_dict['CANCER'])),\n",
+ " go.Bar(name='Endothelial',x=counts['Sample_ID'], y=counts['endothelial_perc'], \n",
+ " text = counts['endothelial_perc'], textposition='auto', \n",
+ " marker_color = 'rgb' + str(cell_type_color_dict['ENDOTHELIAL']))\n",
+ "])\n",
+ " \n",
+ "fig.update_layout( plot_bgcolor = 'white',barmode ='stack')#title = title,\n",
+ "fig.update_xaxes( linecolor = 'black')#title = \"Sample\",\n",
+ "fig.update_yaxes(title = \"Cell count (%)\", linecolor = 'black')\n",
+ "plot(fig)\n",
+ "#fig.write_image(output_images_dir + \"/\" + title.replace(\" \",\"_\") + \".png\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ee1c2bd3-633d-4bcb-a40e-064d90ebd713",
+ "metadata": {},
+ "source": [
+ "### V.4.2. CELL SUBTYPES"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "70721a22-5cc7-464e-81c3-e1766f943fe2",
+ "metadata": {},
+ "source": [
+ "#### V.4.2.1 BY SCENES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "id": "56f79b66-9d56-4678-bb21-e59a8e3c34f5",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " dc \n",
+ " b \n",
+ " tcd4 \n",
+ " tcd8 \n",
+ " m1 \n",
+ " m2 \n",
+ " treg \n",
+ " immune_other \n",
+ " cancer \n",
+ " αsma_mycaf \n",
+ " stroma_other \n",
+ " endothelial \n",
+ " total_cells \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1.csv \n",
+ " 81 \n",
+ " 0.0 \n",
+ " 2991 \n",
+ " 2849 \n",
+ " 310 \n",
+ " 129 \n",
+ " 6 \n",
+ " 994 \n",
+ " 48981 \n",
+ " 3967 \n",
+ " 6723 \n",
+ " 1666 \n",
+ " 68697.0 \n",
+ " \n",
+ " \n",
+ " DD3S2.csv \n",
+ " 294 \n",
+ " 0.0 \n",
+ " 1915 \n",
+ " 2350 \n",
+ " 94 \n",
+ " 25 \n",
+ " 38 \n",
+ " 1261 \n",
+ " 51059 \n",
+ " 4789 \n",
+ " 7275 \n",
+ " 1750 \n",
+ " 70850.0 \n",
+ " \n",
+ " \n",
+ " DD3S3.csv \n",
+ " 280 \n",
+ " 138.0 \n",
+ " 6857 \n",
+ " 3550 \n",
+ " 252 \n",
+ " 96 \n",
+ " 28 \n",
+ " 1874 \n",
+ " 77000 \n",
+ " 7424 \n",
+ " 15988 \n",
+ " 2778 \n",
+ " 116265.0 \n",
+ " \n",
+ " \n",
+ " DD4S1.csv \n",
+ " 272 \n",
+ " 29.0 \n",
+ " 2667 \n",
+ " 1950 \n",
+ " 76 \n",
+ " 38 \n",
+ " 12 \n",
+ " 2389 \n",
+ " 54013 \n",
+ " 3106 \n",
+ " 4143 \n",
+ " 2053 \n",
+ " 70748.0 \n",
+ " \n",
+ " \n",
+ " DD4S2.csv \n",
+ " 130 \n",
+ " 14.0 \n",
+ " 1938 \n",
+ " 1694 \n",
+ " 112 \n",
+ " 102 \n",
+ " 19 \n",
+ " 841 \n",
+ " 39470 \n",
+ " 1664 \n",
+ " 4529 \n",
+ " 1232 \n",
+ " 51745.0 \n",
+ " \n",
+ " \n",
+ " DD4S3.csv \n",
+ " 1150 \n",
+ " 31.0 \n",
+ " 2353 \n",
+ " 2940 \n",
+ " 155 \n",
+ " 328 \n",
+ " 38 \n",
+ " 3336 \n",
+ " 50598 \n",
+ " 3686 \n",
+ " 4830 \n",
+ " 1373 \n",
+ " 70818.0 \n",
+ " \n",
+ " \n",
+ " DD5S1.csv \n",
+ " 583 \n",
+ " 139.0 \n",
+ " 2840 \n",
+ " 536 \n",
+ " 504 \n",
+ " 28 \n",
+ " 28 \n",
+ " 1220 \n",
+ " 43723 \n",
+ " 6976 \n",
+ " 10091 \n",
+ " 2795 \n",
+ " 69463.0 \n",
+ " \n",
+ " \n",
+ " DD5S2.csv \n",
+ " 160 \n",
+ " 16.0 \n",
+ " 1135 \n",
+ " 145 \n",
+ " 131 \n",
+ " 63 \n",
+ " 14 \n",
+ " 467 \n",
+ " 30839 \n",
+ " 3876 \n",
+ " 7222 \n",
+ " 1335 \n",
+ " 45403.0 \n",
+ " \n",
+ " \n",
+ " DD5S3.csv \n",
+ " 1467 \n",
+ " 35.0 \n",
+ " 2000 \n",
+ " 687 \n",
+ " 479 \n",
+ " 110 \n",
+ " 13 \n",
+ " 865 \n",
+ " 30060 \n",
+ " 4831 \n",
+ " 4187 \n",
+ " 1164 \n",
+ " 45898.0 \n",
+ " \n",
+ " \n",
+ " TMA.csv \n",
+ " 132 \n",
+ " 2309.0 \n",
+ " 5027 \n",
+ " 952 \n",
+ " 109 \n",
+ " 11 \n",
+ " 209 \n",
+ " 607 \n",
+ " 59978 \n",
+ " 4875 \n",
+ " 18246 \n",
+ " 2287 \n",
+ " 94742.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " dc b tcd4 tcd8 m1 m2 treg immune_other cancer \\\n",
+ "DD3S1.csv 81 0.0 2991 2849 310 129 6 994 48981 \n",
+ "DD3S2.csv 294 0.0 1915 2350 94 25 38 1261 51059 \n",
+ "DD3S3.csv 280 138.0 6857 3550 252 96 28 1874 77000 \n",
+ "DD4S1.csv 272 29.0 2667 1950 76 38 12 2389 54013 \n",
+ "DD4S2.csv 130 14.0 1938 1694 112 102 19 841 39470 \n",
+ "DD4S3.csv 1150 31.0 2353 2940 155 328 38 3336 50598 \n",
+ "DD5S1.csv 583 139.0 2840 536 504 28 28 1220 43723 \n",
+ "DD5S2.csv 160 16.0 1135 145 131 63 14 467 30839 \n",
+ "DD5S3.csv 1467 35.0 2000 687 479 110 13 865 30060 \n",
+ "TMA.csv 132 2309.0 5027 952 109 11 209 607 59978 \n",
+ "\n",
+ " αsma_mycaf stroma_other endothelial total_cells \n",
+ "DD3S1.csv 3967 6723 1666 68697.0 \n",
+ "DD3S2.csv 4789 7275 1750 70850.0 \n",
+ "DD3S3.csv 7424 15988 2778 116265.0 \n",
+ "DD4S1.csv 3106 4143 2053 70748.0 \n",
+ "DD4S2.csv 1664 4529 1232 51745.0 \n",
+ "DD4S3.csv 3686 4830 1373 70818.0 \n",
+ "DD5S1.csv 6976 10091 2795 69463.0 \n",
+ "DD5S2.csv 3876 7222 1335 45403.0 \n",
+ "DD5S3.csv 4831 4187 1164 45898.0 \n",
+ "TMA.csv 4875 18246 2287 94742.0 "
+ ]
+ },
+ "execution_count": 47,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Count by cell SUBtype\n",
+ "cell_subtypes = ['DC', 'B', 'TCD4', 'TCD8', 'M1', 'M2', 'Treg', \\\n",
+ " 'IMMUNE_OTHER', 'CANCER', 'αSMA_myCAF', 'STROMA_OTHER', 'ENDOTHELIAL']\n",
+ "# Initialisation d'un dictionnaire pour stocker les counts des sous-types de cellules\n",
+ "subtype_counts = {}\n",
+ "\n",
+ "# Boucle sur les sous-types de cellules pour compter les Ʃchantillons correspondants\n",
+ "for subtype in cell_subtypes:\n",
+ " subtype_counts[subtype.lower()] = pd.DataFrame({subtype.lower():\n",
+ " df.loc[\n",
+ " df['cell_subtype'] == subtype, 'Sample_ID'].value_counts()\n",
+ " }).sort_index()\n",
+ "\n",
+ "# ConcatƩnation des counts des sous-types de cellules en un seul DataFrame\n",
+ "counts_subtypes = pd.concat([pd.DataFrame(v) for v in subtype_counts.values()], axis=1, sort=False)\n",
+ "counts_subtypes = counts_subtypes.fillna(0)\n",
+ "\n",
+ "# Ajouter une colonne pour le compte total de cellules par ligne\n",
+ "counts_subtypes['total_cells'] = counts_subtypes.sum(axis=1)\n",
+ "\n",
+ "# Enregistrement des counts des sous-types de cellules dans un fichier CSV\n",
+ "filename_subtypes = os.path.join(output_data_dir, project_name + \"_cell_subtypes_number_by_scenes.csv\")\n",
+ "counts_subtypes.to_csv(filename_subtypes, index=False)\n",
+ "counts_subtypes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "id": "46678224-e49f-4ce1-baef-f6757b27c6b7",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " dc \n",
+ " b \n",
+ " tcd4 \n",
+ " tcd8 \n",
+ " m1 \n",
+ " m2 \n",
+ " treg \n",
+ " immune_other \n",
+ " cancer \n",
+ " αsma_mycaf \n",
+ " ... \n",
+ " tcd8_perc \n",
+ " m1_perc \n",
+ " m2_perc \n",
+ " treg_perc \n",
+ " immune_other_perc \n",
+ " cancer_perc \n",
+ " αsma_mycaf_perc \n",
+ " stroma_other_perc \n",
+ " endothelial_perc \n",
+ " Sample_ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1.csv \n",
+ " 81 \n",
+ " 0.0 \n",
+ " 2991 \n",
+ " 2849 \n",
+ " 310 \n",
+ " 129 \n",
+ " 6 \n",
+ " 994 \n",
+ " 48981 \n",
+ " 3967 \n",
+ " ... \n",
+ " 4.147197 \n",
+ " 0.451257 \n",
+ " 0.187781 \n",
+ " 0.008734 \n",
+ " 1.446934 \n",
+ " 71.300057 \n",
+ " 5.774634 \n",
+ " 9.786454 \n",
+ " 2.425142 \n",
+ " DD3S1.csv \n",
+ " \n",
+ " \n",
+ " DD3S2.csv \n",
+ " 294 \n",
+ " 0.0 \n",
+ " 1915 \n",
+ " 2350 \n",
+ " 94 \n",
+ " 25 \n",
+ " 38 \n",
+ " 1261 \n",
+ " 51059 \n",
+ " 4789 \n",
+ " ... \n",
+ " 3.316867 \n",
+ " 0.132675 \n",
+ " 0.035286 \n",
+ " 0.053634 \n",
+ " 1.779817 \n",
+ " 72.066337 \n",
+ " 6.759351 \n",
+ " 10.268172 \n",
+ " 2.470007 \n",
+ " DD3S2.csv \n",
+ " \n",
+ " \n",
+ " DD3S3.csv \n",
+ " 280 \n",
+ " 138.0 \n",
+ " 6857 \n",
+ " 3550 \n",
+ " 252 \n",
+ " 96 \n",
+ " 28 \n",
+ " 1874 \n",
+ " 77000 \n",
+ " 7424 \n",
+ " ... \n",
+ " 3.053369 \n",
+ " 0.216746 \n",
+ " 0.082570 \n",
+ " 0.024083 \n",
+ " 1.611835 \n",
+ " 66.228014 \n",
+ " 6.385413 \n",
+ " 13.751344 \n",
+ " 2.389369 \n",
+ " DD3S3.csv \n",
+ " \n",
+ " \n",
+ " DD4S1.csv \n",
+ " 272 \n",
+ " 29.0 \n",
+ " 2667 \n",
+ " 1950 \n",
+ " 76 \n",
+ " 38 \n",
+ " 12 \n",
+ " 2389 \n",
+ " 54013 \n",
+ " 3106 \n",
+ " ... \n",
+ " 2.756262 \n",
+ " 0.107424 \n",
+ " 0.053712 \n",
+ " 0.016962 \n",
+ " 3.376774 \n",
+ " 76.345621 \n",
+ " 4.390230 \n",
+ " 5.855996 \n",
+ " 2.901849 \n",
+ " DD4S1.csv \n",
+ " \n",
+ " \n",
+ " DD4S2.csv \n",
+ " 130 \n",
+ " 14.0 \n",
+ " 1938 \n",
+ " 1694 \n",
+ " 112 \n",
+ " 102 \n",
+ " 19 \n",
+ " 841 \n",
+ " 39470 \n",
+ " 1664 \n",
+ " ... \n",
+ " 3.273746 \n",
+ " 0.216446 \n",
+ " 0.197120 \n",
+ " 0.036719 \n",
+ " 1.625278 \n",
+ " 76.277901 \n",
+ " 3.215770 \n",
+ " 8.752536 \n",
+ " 2.380906 \n",
+ " DD4S2.csv \n",
+ " \n",
+ " \n",
+ " DD4S3.csv \n",
+ " 1150 \n",
+ " 31.0 \n",
+ " 2353 \n",
+ " 2940 \n",
+ " 155 \n",
+ " 328 \n",
+ " 38 \n",
+ " 3336 \n",
+ " 50598 \n",
+ " 3686 \n",
+ " ... \n",
+ " 4.151487 \n",
+ " 0.218871 \n",
+ " 0.463159 \n",
+ " 0.053659 \n",
+ " 4.710667 \n",
+ " 71.447937 \n",
+ " 5.204891 \n",
+ " 6.820300 \n",
+ " 1.938773 \n",
+ " DD4S3.csv \n",
+ " \n",
+ " \n",
+ " DD5S1.csv \n",
+ " 583 \n",
+ " 139.0 \n",
+ " 2840 \n",
+ " 536 \n",
+ " 504 \n",
+ " 28 \n",
+ " 28 \n",
+ " 1220 \n",
+ " 43723 \n",
+ " 6976 \n",
+ " ... \n",
+ " 0.771634 \n",
+ " 0.725566 \n",
+ " 0.040309 \n",
+ " 0.040309 \n",
+ " 1.756331 \n",
+ " 62.944301 \n",
+ " 10.042757 \n",
+ " 14.527158 \n",
+ " 4.023725 \n",
+ " DD5S1.csv \n",
+ " \n",
+ " \n",
+ " DD5S2.csv \n",
+ " 160 \n",
+ " 16.0 \n",
+ " 1135 \n",
+ " 145 \n",
+ " 131 \n",
+ " 63 \n",
+ " 14 \n",
+ " 467 \n",
+ " 30839 \n",
+ " 3876 \n",
+ " ... \n",
+ " 0.319362 \n",
+ " 0.288527 \n",
+ " 0.138757 \n",
+ " 0.030835 \n",
+ " 1.028566 \n",
+ " 67.922824 \n",
+ " 8.536881 \n",
+ " 15.906438 \n",
+ " 2.940334 \n",
+ " DD5S2.csv \n",
+ " \n",
+ " \n",
+ " DD5S3.csv \n",
+ " 1467 \n",
+ " 35.0 \n",
+ " 2000 \n",
+ " 687 \n",
+ " 479 \n",
+ " 110 \n",
+ " 13 \n",
+ " 865 \n",
+ " 30060 \n",
+ " 4831 \n",
+ " ... \n",
+ " 1.496797 \n",
+ " 1.043618 \n",
+ " 0.239662 \n",
+ " 0.028324 \n",
+ " 1.884614 \n",
+ " 65.493050 \n",
+ " 10.525513 \n",
+ " 9.122402 \n",
+ " 2.536058 \n",
+ " DD5S3.csv \n",
+ " \n",
+ " \n",
+ " TMA.csv \n",
+ " 132 \n",
+ " 2309.0 \n",
+ " 5027 \n",
+ " 952 \n",
+ " 109 \n",
+ " 11 \n",
+ " 209 \n",
+ " 607 \n",
+ " 59978 \n",
+ " 4875 \n",
+ " ... \n",
+ " 1.004834 \n",
+ " 0.115049 \n",
+ " 0.011610 \n",
+ " 0.220599 \n",
+ " 0.640687 \n",
+ " 63.306664 \n",
+ " 5.145553 \n",
+ " 19.258618 \n",
+ " 2.413924 \n",
+ " TMA.csv \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
10 rows Ć 26 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " dc b tcd4 tcd8 m1 m2 treg immune_other cancer \\\n",
+ "DD3S1.csv 81 0.0 2991 2849 310 129 6 994 48981 \n",
+ "DD3S2.csv 294 0.0 1915 2350 94 25 38 1261 51059 \n",
+ "DD3S3.csv 280 138.0 6857 3550 252 96 28 1874 77000 \n",
+ "DD4S1.csv 272 29.0 2667 1950 76 38 12 2389 54013 \n",
+ "DD4S2.csv 130 14.0 1938 1694 112 102 19 841 39470 \n",
+ "DD4S3.csv 1150 31.0 2353 2940 155 328 38 3336 50598 \n",
+ "DD5S1.csv 583 139.0 2840 536 504 28 28 1220 43723 \n",
+ "DD5S2.csv 160 16.0 1135 145 131 63 14 467 30839 \n",
+ "DD5S3.csv 1467 35.0 2000 687 479 110 13 865 30060 \n",
+ "TMA.csv 132 2309.0 5027 952 109 11 209 607 59978 \n",
+ "\n",
+ " αsma_mycaf ... tcd8_perc m1_perc m2_perc treg_perc \\\n",
+ "DD3S1.csv 3967 ... 4.147197 0.451257 0.187781 0.008734 \n",
+ "DD3S2.csv 4789 ... 3.316867 0.132675 0.035286 0.053634 \n",
+ "DD3S3.csv 7424 ... 3.053369 0.216746 0.082570 0.024083 \n",
+ "DD4S1.csv 3106 ... 2.756262 0.107424 0.053712 0.016962 \n",
+ "DD4S2.csv 1664 ... 3.273746 0.216446 0.197120 0.036719 \n",
+ "DD4S3.csv 3686 ... 4.151487 0.218871 0.463159 0.053659 \n",
+ "DD5S1.csv 6976 ... 0.771634 0.725566 0.040309 0.040309 \n",
+ "DD5S2.csv 3876 ... 0.319362 0.288527 0.138757 0.030835 \n",
+ "DD5S3.csv 4831 ... 1.496797 1.043618 0.239662 0.028324 \n",
+ "TMA.csv 4875 ... 1.004834 0.115049 0.011610 0.220599 \n",
+ "\n",
+ " immune_other_perc cancer_perc αsma_mycaf_perc stroma_other_perc \\\n",
+ "DD3S1.csv 1.446934 71.300057 5.774634 9.786454 \n",
+ "DD3S2.csv 1.779817 72.066337 6.759351 10.268172 \n",
+ "DD3S3.csv 1.611835 66.228014 6.385413 13.751344 \n",
+ "DD4S1.csv 3.376774 76.345621 4.390230 5.855996 \n",
+ "DD4S2.csv 1.625278 76.277901 3.215770 8.752536 \n",
+ "DD4S3.csv 4.710667 71.447937 5.204891 6.820300 \n",
+ "DD5S1.csv 1.756331 62.944301 10.042757 14.527158 \n",
+ "DD5S2.csv 1.028566 67.922824 8.536881 15.906438 \n",
+ "DD5S3.csv 1.884614 65.493050 10.525513 9.122402 \n",
+ "TMA.csv 0.640687 63.306664 5.145553 19.258618 \n",
+ "\n",
+ " endothelial_perc Sample_ID \n",
+ "DD3S1.csv 2.425142 DD3S1.csv \n",
+ "DD3S2.csv 2.470007 DD3S2.csv \n",
+ "DD3S3.csv 2.389369 DD3S3.csv \n",
+ "DD4S1.csv 2.901849 DD4S1.csv \n",
+ "DD4S2.csv 2.380906 DD4S2.csv \n",
+ "DD4S3.csv 1.938773 DD4S3.csv \n",
+ "DD5S1.csv 4.023725 DD5S1.csv \n",
+ "DD5S2.csv 2.940334 DD5S2.csv \n",
+ "DD5S3.csv 2.536058 DD5S3.csv \n",
+ "TMA.csv 2.413924 TMA.csv \n",
+ "\n",
+ "[10 rows x 26 columns]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Ajout des colonnes de pourcentages pour chaque sous-type de cellules\n",
+ "counts_perc = counts_subtypes.copy()\n",
+ "\n",
+ "# Calcul des pourcentages pour chaque sous-type de cellules, en excluant la colonne 'total_cells'\n",
+ "for col in counts_subtypes.columns:\n",
+ " if col != 'total_cells':\n",
+ " counts_perc[col + '_perc'] = (counts_perc[col] / counts_perc['total_cells']) * 100\n",
+ "\n",
+ "# Affichage des pourcentages des sous-types de cellules\n",
+ "\n",
+ "counts_perc['Sample_ID'] = counts_perc.index\n",
+ "counts_perc.columns.values\n",
+ "display(counts_perc)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "id": "415c17ec-5449-47e6-add5-8d7eef72c3a7",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "marker": {
+ "color": "rgb(166, 206, 227)"
+ },
+ "name": "DC",
+ "text": [
+ 0.11790907899908293,
+ 0.4149611856033874,
+ 0.24082914032597943,
+ 0.3844631650364675,
+ 0.2512320030920862,
+ 1.6238809342257619,
+ 0.8392957401782244,
+ 0.35239962117040724,
+ 3.1962177001176517,
+ 0.13932574782039645
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "TMA.csv"
+ ],
+ "y": [
+ 0.11790907899908293,
+ 0.4149611856033874,
+ 0.24082914032597943,
+ 0.3844631650364675,
+ 0.2512320030920862,
+ 1.6238809342257619,
+ 0.8392957401782244,
+ 0.35239962117040724,
+ 3.1962177001176517,
+ 0.13932574782039645
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(31, 120, 180)"
+ },
+ "name": "B",
+ "text": [
+ 0,
+ 0,
+ 0.11869436201780414,
+ 0.040990558036976314,
+ 0.027055754179147747,
+ 0.043774181705216186,
+ 0.2001065315347739,
+ 0.035239962117040724,
+ 0.0762560460150769,
+ 2.437145088767389
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "TMA.csv"
+ ],
+ "y": [
+ 0,
+ 0,
+ 0.11869436201780414,
+ 0.040990558036976314,
+ 0.027055754179147747,
+ 0.043774181705216186,
+ 0.2001065315347739,
+ 0.035239962117040724,
+ 0.0762560460150769,
+ 2.437145088767389
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(178, 223, 138)"
+ },
+ "name": "TCD4",
+ "text": [
+ 4.3539019171142845,
+ 2.7028934368383912,
+ 5.897733625768718,
+ 3.7697178718833038,
+ 3.7452893999420236,
+ 3.3226015984636676,
+ 4.088507550782431,
+ 2.4998348126775762,
+ 4.35748834371868,
+ 5.305988896160098
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "TMA.csv"
+ ],
+ "y": [
+ 4.3539019171142845,
+ 2.7028934368383912,
+ 5.897733625768718,
+ 3.7697178718833038,
+ 3.7452893999420236,
+ 3.3226015984636676,
+ 4.088507550782431,
+ 2.4998348126775762,
+ 4.35748834371868,
+ 5.305988896160098
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(51, 160, 44)"
+ },
+ "name": "TCD8",
+ "text": [
+ 4.147197111955398,
+ 3.3168666196189136,
+ 3.0533694577043824,
+ 2.756261661107028,
+ 3.273746255676877,
+ 4.1514869101076,
+ 0.7716338194434448,
+ 0.3193621566856816,
+ 1.4967972460673666,
+ 1.0048341812501318
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "TMA.csv"
+ ],
+ "y": [
+ 4.147197111955398,
+ 3.3168666196189136,
+ 3.0533694577043824,
+ 2.756261661107028,
+ 3.273746255676877,
+ 4.1514869101076,
+ 0.7716338194434448,
+ 0.3193621566856816,
+ 1.4967972460673666,
+ 1.0048341812501318
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(251, 154, 153)"
+ },
+ "name": "M1",
+ "text": [
+ 0.4512569690088359,
+ 0.13267466478475654,
+ 0.2167462262933815,
+ 0.10742353140724827,
+ 0.21644603343318197,
+ 0.21887090852608093,
+ 0.7255661287304033,
+ 0.28852718983327097,
+ 1.043618458320624,
+ 0.11504929176078191
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "TMA.csv"
+ ],
+ "y": [
+ 0.4512569690088359,
+ 0.13267466478475654,
+ 0.2167462262933815,
+ 0.10742353140724827,
+ 0.21644603343318197,
+ 0.21887090852608093,
+ 0.7255661287304033,
+ 0.28852718983327097,
+ 1.043618458320624,
+ 0.11504929176078191
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(227, 26, 28)"
+ },
+ "name": "M2",
+ "text": [
+ 0.1877811258133543,
+ 0.035285815102328866,
+ 0.08256999096890724,
+ 0.05371176570362413,
+ 0.19712049473379073,
+ 0.46315908384873905,
+ 0.04030922937391129,
+ 0.13875735083584786,
+ 0.23966185890452746,
+ 0.011610478985033038
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "TMA.csv"
+ ],
+ "y": [
+ 0.1877811258133543,
+ 0.035285815102328866,
+ 0.08256999096890724,
+ 0.05371176570362413,
+ 0.19712049473379073,
+ 0.46315908384873905,
+ 0.04030922937391129,
+ 0.13875735083584786,
+ 0.23966185890452746,
+ 0.011610478985033038
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(253, 191, 111)"
+ },
+ "name": "Treg",
+ "text": [
+ 0.00873400585178392,
+ 0.05363443895553987,
+ 0.024082914032597946,
+ 0.016961610222197096,
+ 0.03671852352884337,
+ 0.05365867434832952,
+ 0.04030922937391129,
+ 0.030834966852410634,
+ 0.028323674234171422,
+ 0.2205991007156277
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "TMA.csv"
+ ],
+ "y": [
+ 0.00873400585178392,
+ 0.05363443895553987,
+ 0.024082914032597946,
+ 0.016961610222197096,
+ 0.03671852352884337,
+ 0.05365867434832952,
+ 0.04030922937391129,
+ 0.030834966852410634,
+ 0.028323674234171422,
+ 0.2205991007156277
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(1.0, 0.4980392156862745, 0.0)"
+ },
+ "name": "IMMUNE_OTHER",
+ "text": [
+ 1.446933636112203,
+ 1.7798165137614679,
+ 1.6118350320388768,
+ 3.3767739017357385,
+ 1.625277804618804,
+ 4.710666779632297,
+ 1.7563307084347062,
+ 1.028566394291126,
+ 1.8846137086583294,
+ 0.640687340355914
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "TMA.csv"
+ ],
+ "y": [
+ 1.446933636112203,
+ 1.7798165137614679,
+ 1.6118350320388768,
+ 3.3767739017357385,
+ 1.625277804618804,
+ 4.710666779632297,
+ 1.7563307084347062,
+ 1.028566394291126,
+ 1.8846137086583294,
+ 0.640687340355914
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(202, 178, 214)"
+ },
+ "name": "CANCER",
+ "text": [
+ 71.30005677103803,
+ 72.06633733239238,
+ 66.22801358964435,
+ 76.34562107762764,
+ 76.27790124649725,
+ 71.44793696517834,
+ 62.94430128269727,
+ 67.92282448296369,
+ 65.49304980609176,
+ 63.30666441493741
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "TMA.csv"
+ ],
+ "y": [
+ 71.30005677103803,
+ 72.06633733239238,
+ 66.22801358964435,
+ 76.34562107762764,
+ 76.27790124649725,
+ 71.44793696517834,
+ 62.94430128269727,
+ 67.92282448296369,
+ 65.49304980609176,
+ 63.30666441493741
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(106, 61, 154)"
+ },
+ "name": "αSMA_myCAF",
+ "text": [
+ 5.774633535671136,
+ 6.759350741002117,
+ 6.3854126349288265,
+ 4.390230112512015,
+ 3.2157696395787037,
+ 5.204891411787964,
+ 10.042756575443041,
+ 8.536880822853115,
+ 10.525513094252473,
+ 5.1455531865487325
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "TMA.csv"
+ ],
+ "y": [
+ 5.774633535671136,
+ 6.759350741002117,
+ 6.3854126349288265,
+ 4.390230112512015,
+ 3.2157696395787037,
+ 5.204891411787964,
+ 10.042756575443041,
+ 8.536880822853115,
+ 10.525513094252473,
+ 5.1455531865487325
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(1.0, 1.0, 0.6)"
+ },
+ "name": "STROMA_OTHER",
+ "text": [
+ 9.786453556923883,
+ 10.2681721947777,
+ 13.751343912613425,
+ 5.855995929213546,
+ 8.752536476954296,
+ 6.820299923748199,
+ 14.527158343290672,
+ 15.906437900579256,
+ 9.122401847575059,
+ 19.258618141901163
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "TMA.csv"
+ ],
+ "y": [
+ 9.786453556923883,
+ 10.2681721947777,
+ 13.751343912613425,
+ 5.855995929213546,
+ 8.752536476954296,
+ 6.820299923748199,
+ 14.527158343290672,
+ 15.906437900579256,
+ 9.122401847575059,
+ 19.258618141901163
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(177, 89, 40)"
+ },
+ "name": "ENDOTHELIAL",
+ "text": [
+ 2.425142291512002,
+ 2.470007057163021,
+ 2.389369113662753,
+ 2.9018488155142195,
+ 2.3809063677650015,
+ 1.9387726284278008,
+ 4.023724860717216,
+ 2.9403343391405854,
+ 2.536058216044272,
+ 2.4139241307973234
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "TMA.csv"
+ ],
+ "y": [
+ 2.425142291512002,
+ 2.470007057163021,
+ 2.389369113662753,
+ 2.9018488155142195,
+ 2.3809063677650015,
+ 1.9387726284278008,
+ 4.023724860717216,
+ 2.9403343391405854,
+ 2.536058216044272,
+ 2.4139241307973234
+ ]
+ }
+ ],
+ "layout": {
+ "barmode": "stack",
+ "plot_bgcolor": "white",
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "Cell subtypes proportions by Sample ID and tissue type"
+ },
+ "xaxis": {
+ "autorange": true,
+ "linecolor": "black",
+ "range": [
+ -0.5,
+ 9.5
+ ],
+ "type": "category"
+ },
+ "yaxis": {
+ "autorange": true,
+ "linecolor": "black",
+ "range": [
+ 0,
+ 105.26315789473685
+ ],
+ "title": {
+ "text": "Cell count (%)"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 49,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "fig = go.Figure()\n",
+ "title = 'Cell subtypes proportions by Sample ID and tissue type'\n",
+ "\n",
+ "for cell_subtype in cell_subtypes:\n",
+ " fig.add_trace(\n",
+ " go.Bar(\n",
+ " name=cell_subtype,\n",
+ " x=counts_perc['Sample_ID'],\n",
+ " y=counts_perc[f'{cell_subtype.lower()}_perc'],\n",
+ " text=counts_perc[f'{cell_subtype.lower()}_perc'],\n",
+ " textposition='auto',\n",
+ " marker_color='rgb' + str(cell_subtype_color_dict[cell_subtype])))\n",
+ "\n",
+ "fig.update_layout(\n",
+ " plot_bgcolor='white',\n",
+ " barmode='stack',\n",
+ " title=title,\n",
+ " xaxis=dict(linecolor='black'),\n",
+ " yaxis=dict(title='Cell count (%)', linecolor='black')\n",
+ ")\n",
+ "\n",
+ "# Enregistrer l'image\n",
+ "output_filename = title.replace(\" \", \"_\") + \".png\"\n",
+ "#fig.write_image(output_images_dir + \"/\" + output_filename, scale=1000)\n",
+ "\n",
+ "# Afficher le graphique\n",
+ "fig.show()\n",
+ "plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "53d9fea4-07b2-4a2f-9a61-068160198147",
+ "metadata": {},
+ "source": [
+ "#### V.4.2.2 BY PATIENTS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "id": "db7b6ff6-ac31-4dc2-91a6-fbeb10c428c8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " HLA_Cytoplasm_Intensity_Average \n",
+ " CKs_Cytoplasm_Intensity_Average \n",
+ " Ki67_Nucleus_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " ColVI_Cytoplasm_Intensity_Average \n",
+ " CD20_Cytoplasm_Intensity_Average \n",
+ " PD1_Cytoplasm_Intensity_Average \n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ " CD31_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nucleus_Roundness \n",
+ " Nuc_X \n",
+ " ROI_index \n",
+ " Nucleus_Size \n",
+ " Sample_ID \n",
+ " immune_checkpoint \n",
+ " Cell_Size \n",
+ " Patient \n",
+ " Unique_ROI_index \n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_0 \n",
+ " -0.677863 \n",
+ " -0.417494 \n",
+ " -0.912537 \n",
+ " -0.817876 \n",
+ " 0.930099 \n",
+ " 0.232078 \n",
+ " -0.483158 \n",
+ " 1.535604 \n",
+ " 0.807339 \n",
+ " 1.167755 \n",
+ " ... \n",
+ " 0.955040 \n",
+ " 1484.771729 \n",
+ " 0 \n",
+ " 127 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 339 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_1 \n",
+ " -0.677863 \n",
+ " -0.516487 \n",
+ " -0.838037 \n",
+ " -0.869685 \n",
+ " 1.114924 \n",
+ " 0.301333 \n",
+ " -0.344770 \n",
+ " 1.668368 \n",
+ " 0.875455 \n",
+ " 1.643023 \n",
+ " ... \n",
+ " 0.966643 \n",
+ " 1426.250000 \n",
+ " 0 \n",
+ " 112 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 344 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_2 \n",
+ " -0.677863 \n",
+ " -0.141921 \n",
+ " -1.016023 \n",
+ " -0.755879 \n",
+ " 0.834577 \n",
+ " 0.259216 \n",
+ " -0.438292 \n",
+ " 1.336308 \n",
+ " 0.705088 \n",
+ " 1.053636 \n",
+ " ... \n",
+ " 0.721534 \n",
+ " 1531.110474 \n",
+ " 0 \n",
+ " 181 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 422 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_3 \n",
+ " -0.741282 \n",
+ " -0.460472 \n",
+ " -0.491711 \n",
+ " -0.818084 \n",
+ " 0.648200 \n",
+ " 0.107027 \n",
+ " -0.444889 \n",
+ " 1.249805 \n",
+ " 0.660707 \n",
+ " 1.165861 \n",
+ " ... \n",
+ " 0.587196 \n",
+ " 1518.907593 \n",
+ " 0 \n",
+ " 119 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 278 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_6 \n",
+ " -0.621521 \n",
+ " -0.247254 \n",
+ " -0.867127 \n",
+ " -0.742544 \n",
+ " 0.810579 \n",
+ " 0.272128 \n",
+ " -0.507117 \n",
+ " 1.251434 \n",
+ " 0.947172 \n",
+ " 2.545301 \n",
+ " ... \n",
+ " 0.935716 \n",
+ " 1471.914917 \n",
+ " 0 \n",
+ " 47 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 204 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115755 \n",
+ " 0.478275 \n",
+ " 0.558670 \n",
+ " -0.962840 \n",
+ " 1.732291 \n",
+ " 0.507434 \n",
+ " -0.912641 \n",
+ " 0.311322 \n",
+ " 0.816068 \n",
+ " 0.596520 \n",
+ " 0.090397 \n",
+ " ... \n",
+ " 0.982196 \n",
+ " 15564.458008 \n",
+ " 59 \n",
+ " 142 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 386 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115756 \n",
+ " 0.297418 \n",
+ " 0.420594 \n",
+ " -0.971632 \n",
+ " 1.966955 \n",
+ " 0.304365 \n",
+ " -1.164112 \n",
+ " 0.866636 \n",
+ " -0.092857 \n",
+ " -0.241830 \n",
+ " -0.617835 \n",
+ " ... \n",
+ " 0.775977 \n",
+ " 15629.680664 \n",
+ " 59 \n",
+ " 47 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 270 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115757 \n",
+ " 0.346950 \n",
+ " 0.453951 \n",
+ " -0.602893 \n",
+ " 1.338956 \n",
+ " 0.559435 \n",
+ " -0.801333 \n",
+ " 0.447061 \n",
+ " 0.988156 \n",
+ " 1.567869 \n",
+ " 0.403878 \n",
+ " ... \n",
+ " 0.688747 \n",
+ " 15518.421875 \n",
+ " 59 \n",
+ " 64 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 202 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115758 \n",
+ " -0.189415 \n",
+ " 0.508840 \n",
+ " -0.886041 \n",
+ " 0.647980 \n",
+ " -0.227224 \n",
+ " -1.022549 \n",
+ " -0.099256 \n",
+ " 0.219755 \n",
+ " 0.603715 \n",
+ " -0.219145 \n",
+ " ... \n",
+ " 0.751402 \n",
+ " 15539.275391 \n",
+ " 59 \n",
+ " 58 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 182 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115760 \n",
+ " 0.245777 \n",
+ " 0.460219 \n",
+ " -1.003840 \n",
+ " 0.191158 \n",
+ " -0.313127 \n",
+ " -1.120675 \n",
+ " 0.004962 \n",
+ " -0.316199 \n",
+ " 1.727776 \n",
+ " -0.495501 \n",
+ " ... \n",
+ " 0.674126 \n",
+ " 15542.961914 \n",
+ " 59 \n",
+ " 106 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 295 \n",
+ " c59 \n",
+ " c59a \n",
+ " CONTROL \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
704629 rows Ć 40 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.677863 \n",
+ "DD3S1_Cell_1 -0.677863 \n",
+ "DD3S1_Cell_2 -0.677863 \n",
+ "DD3S1_Cell_3 -0.741282 \n",
+ "DD3S1_Cell_6 -0.621521 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.478275 \n",
+ "TMA_Cell_115756 0.297418 \n",
+ "TMA_Cell_115757 0.346950 \n",
+ "TMA_Cell_115758 -0.189415 \n",
+ "TMA_Cell_115760 0.245777 \n",
+ "\n",
+ " HLA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.417494 \n",
+ "DD3S1_Cell_1 -0.516487 \n",
+ "DD3S1_Cell_2 -0.141921 \n",
+ "DD3S1_Cell_3 -0.460472 \n",
+ "DD3S1_Cell_6 -0.247254 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.558670 \n",
+ "TMA_Cell_115756 0.420594 \n",
+ "TMA_Cell_115757 0.453951 \n",
+ "TMA_Cell_115758 0.508840 \n",
+ "TMA_Cell_115760 0.460219 \n",
+ "\n",
+ " CKs_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.912537 \n",
+ "DD3S1_Cell_1 -0.838037 \n",
+ "DD3S1_Cell_2 -1.016023 \n",
+ "DD3S1_Cell_3 -0.491711 \n",
+ "DD3S1_Cell_6 -0.867127 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.962840 \n",
+ "TMA_Cell_115756 -0.971632 \n",
+ "TMA_Cell_115757 -0.602893 \n",
+ "TMA_Cell_115758 -0.886041 \n",
+ "TMA_Cell_115760 -1.003840 \n",
+ "\n",
+ " Ki67_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.817876 \n",
+ "DD3S1_Cell_1 -0.869685 \n",
+ "DD3S1_Cell_2 -0.755879 \n",
+ "DD3S1_Cell_3 -0.818084 \n",
+ "DD3S1_Cell_6 -0.742544 \n",
+ "... ... \n",
+ "TMA_Cell_115755 1.732291 \n",
+ "TMA_Cell_115756 1.966955 \n",
+ "TMA_Cell_115757 1.338956 \n",
+ "TMA_Cell_115758 0.647980 \n",
+ "TMA_Cell_115760 0.191158 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.930099 \n",
+ "DD3S1_Cell_1 1.114924 \n",
+ "DD3S1_Cell_2 0.834577 \n",
+ "DD3S1_Cell_3 0.648200 \n",
+ "DD3S1_Cell_6 0.810579 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.507434 \n",
+ "TMA_Cell_115756 0.304365 \n",
+ "TMA_Cell_115757 0.559435 \n",
+ "TMA_Cell_115758 -0.227224 \n",
+ "TMA_Cell_115760 -0.313127 \n",
+ "\n",
+ " ColVI_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.232078 \n",
+ "DD3S1_Cell_1 0.301333 \n",
+ "DD3S1_Cell_2 0.259216 \n",
+ "DD3S1_Cell_3 0.107027 \n",
+ "DD3S1_Cell_6 0.272128 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.912641 \n",
+ "TMA_Cell_115756 -1.164112 \n",
+ "TMA_Cell_115757 -0.801333 \n",
+ "TMA_Cell_115758 -1.022549 \n",
+ "TMA_Cell_115760 -1.120675 \n",
+ "\n",
+ " CD20_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.483158 \n",
+ "DD3S1_Cell_1 -0.344770 \n",
+ "DD3S1_Cell_2 -0.438292 \n",
+ "DD3S1_Cell_3 -0.444889 \n",
+ "DD3S1_Cell_6 -0.507117 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.311322 \n",
+ "TMA_Cell_115756 0.866636 \n",
+ "TMA_Cell_115757 0.447061 \n",
+ "TMA_Cell_115758 -0.099256 \n",
+ "TMA_Cell_115760 0.004962 \n",
+ "\n",
+ " PD1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 1.535604 \n",
+ "DD3S1_Cell_1 1.668368 \n",
+ "DD3S1_Cell_2 1.336308 \n",
+ "DD3S1_Cell_3 1.249805 \n",
+ "DD3S1_Cell_6 1.251434 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.816068 \n",
+ "TMA_Cell_115756 -0.092857 \n",
+ "TMA_Cell_115757 0.988156 \n",
+ "TMA_Cell_115758 0.219755 \n",
+ "TMA_Cell_115760 -0.316199 \n",
+ "\n",
+ " AXL_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.807339 \n",
+ "DD3S1_Cell_1 0.875455 \n",
+ "DD3S1_Cell_2 0.705088 \n",
+ "DD3S1_Cell_3 0.660707 \n",
+ "DD3S1_Cell_6 0.947172 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.596520 \n",
+ "TMA_Cell_115756 -0.241830 \n",
+ "TMA_Cell_115757 1.567869 \n",
+ "TMA_Cell_115758 0.603715 \n",
+ "TMA_Cell_115760 1.727776 \n",
+ "\n",
+ " CD31_Cytoplasm_Intensity_Average ... Nucleus_Roundness \\\n",
+ "ID ... \n",
+ "DD3S1_Cell_0 1.167755 ... 0.955040 \n",
+ "DD3S1_Cell_1 1.643023 ... 0.966643 \n",
+ "DD3S1_Cell_2 1.053636 ... 0.721534 \n",
+ "DD3S1_Cell_3 1.165861 ... 0.587196 \n",
+ "DD3S1_Cell_6 2.545301 ... 0.935716 \n",
+ "... ... ... ... \n",
+ "TMA_Cell_115755 0.090397 ... 0.982196 \n",
+ "TMA_Cell_115756 -0.617835 ... 0.775977 \n",
+ "TMA_Cell_115757 0.403878 ... 0.688747 \n",
+ "TMA_Cell_115758 -0.219145 ... 0.751402 \n",
+ "TMA_Cell_115760 -0.495501 ... 0.674126 \n",
+ "\n",
+ " Nuc_X ROI_index Nucleus_Size Sample_ID \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 1484.771729 0 127 DD3S1.csv \n",
+ "DD3S1_Cell_1 1426.250000 0 112 DD3S1.csv \n",
+ "DD3S1_Cell_2 1531.110474 0 181 DD3S1.csv \n",
+ "DD3S1_Cell_3 1518.907593 0 119 DD3S1.csv \n",
+ "DD3S1_Cell_6 1471.914917 0 47 DD3S1.csv \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 15564.458008 59 142 TMA.csv \n",
+ "TMA_Cell_115756 15629.680664 59 47 TMA.csv \n",
+ "TMA_Cell_115757 15518.421875 59 64 TMA.csv \n",
+ "TMA_Cell_115758 15539.275391 59 58 TMA.csv \n",
+ "TMA_Cell_115760 15542.961914 59 106 TMA.csv \n",
+ "\n",
+ " immune_checkpoint Cell_Size Patient Unique_ROI_index \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 None 339 61 61a \n",
+ "DD3S1_Cell_1 None 344 61 61a \n",
+ "DD3S1_Cell_2 None 422 61 61a \n",
+ "DD3S1_Cell_3 None 278 61 61a \n",
+ "DD3S1_Cell_6 None 204 61 61a \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 None 386 c59 c59a \n",
+ "TMA_Cell_115756 None 270 c59 c59a \n",
+ "TMA_Cell_115757 None 202 c59 c59a \n",
+ "TMA_Cell_115758 None 182 c59 c59a \n",
+ "TMA_Cell_115760 None 295 c59 c59a \n",
+ "\n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ "ID \n",
+ "DD3S1_Cell_0 1.0 \n",
+ "DD3S1_Cell_1 1.0 \n",
+ "DD3S1_Cell_2 1.0 \n",
+ "DD3S1_Cell_3 1.0 \n",
+ "DD3S1_Cell_6 1.0 \n",
+ "... ... \n",
+ "TMA_Cell_115755 CONTROL \n",
+ "TMA_Cell_115756 CONTROL \n",
+ "TMA_Cell_115757 CONTROL \n",
+ "TMA_Cell_115758 CONTROL \n",
+ "TMA_Cell_115760 CONTROL \n",
+ "\n",
+ "[704629 rows x 40 columns]"
+ ]
+ },
+ "execution_count": 50,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "id": "d2681077-1a50-441b-8a56-231f9b09a20a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " dc \n",
+ " b \n",
+ " tcd4 \n",
+ " tcd8 \n",
+ " m1 \n",
+ " m2 \n",
+ " treg \n",
+ " immune_other \n",
+ " cancer \n",
+ " αsma_mycaf \n",
+ " stroma_other \n",
+ " endothelial \n",
+ " Total_cells \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 900.0 \n",
+ " 24.0 \n",
+ " 167.0 \n",
+ " 100.0 \n",
+ " 5.0 \n",
+ " 28.0 \n",
+ " 3981.0 \n",
+ " 388.0 \n",
+ " 530.0 \n",
+ " 335.0 \n",
+ " 6460.0 \n",
+ " \n",
+ " \n",
+ " 100 \n",
+ " 21.0 \n",
+ " 0.0 \n",
+ " 92.0 \n",
+ " 46.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 30.0 \n",
+ " 1449.0 \n",
+ " 30.0 \n",
+ " 73.0 \n",
+ " 131.0 \n",
+ " 1876.0 \n",
+ " \n",
+ " \n",
+ " 101 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 20.0 \n",
+ " 15.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 24.0 \n",
+ " 1896.0 \n",
+ " 81.0 \n",
+ " 173.0 \n",
+ " 60.0 \n",
+ " 2275.0 \n",
+ " \n",
+ " \n",
+ " 102 \n",
+ " 1.0 \n",
+ " 2.0 \n",
+ " 45.0 \n",
+ " 24.0 \n",
+ " 5.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 38.0 \n",
+ " 3564.0 \n",
+ " 18.0 \n",
+ " 91.0 \n",
+ " 16.0 \n",
+ " 3805.0 \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " 57.0 \n",
+ " 0.0 \n",
+ " 72.0 \n",
+ " 555.0 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 78.0 \n",
+ " 2157.0 \n",
+ " 17.0 \n",
+ " 131.0 \n",
+ " 117.0 \n",
+ " 3192.0 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 92 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 11.0 \n",
+ " 990.0 \n",
+ " 3.0 \n",
+ " 25.0 \n",
+ " 1.0 \n",
+ " 184.0 \n",
+ " 424.0 \n",
+ " 140.0 \n",
+ " 22.0 \n",
+ " 15.0 \n",
+ " 1815.0 \n",
+ " \n",
+ " \n",
+ " 96 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 76.0 \n",
+ " 2.0 \n",
+ " 2.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 1854.0 \n",
+ " 1.0 \n",
+ " 16.0 \n",
+ " 3.0 \n",
+ " 1959.0 \n",
+ " \n",
+ " \n",
+ " 97 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 174.0 \n",
+ " 38.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 56.0 \n",
+ " 2193.0 \n",
+ " 28.0 \n",
+ " 163.0 \n",
+ " 102.0 \n",
+ " 2755.0 \n",
+ " \n",
+ " \n",
+ " 60 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 107.0 \n",
+ " 9.0 \n",
+ " 16.0 \n",
+ " 1.0 \n",
+ " 57.0 \n",
+ " 1979.0 \n",
+ " 107.0 \n",
+ " 1.0 \n",
+ " 32.0 \n",
+ " 2309.0 \n",
+ " \n",
+ " \n",
+ " 62 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 23.0 \n",
+ " 3.0 \n",
+ " 15.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 151.0 \n",
+ " 91.0 \n",
+ " 20.0 \n",
+ " 3.0 \n",
+ " 310.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
177 rows Ć 13 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " dc b tcd4 tcd8 m1 m2 treg immune_other cancer \\\n",
+ "10 2.0 0.0 900.0 24.0 167.0 100.0 5.0 28.0 3981.0 \n",
+ "100 21.0 0.0 92.0 46.0 0.0 3.0 1.0 30.0 1449.0 \n",
+ "101 2.0 0.0 20.0 15.0 3.0 1.0 0.0 24.0 1896.0 \n",
+ "102 1.0 2.0 45.0 24.0 5.0 1.0 0.0 38.0 3564.0 \n",
+ "103 57.0 0.0 72.0 555.0 7.0 0.0 1.0 78.0 2157.0 \n",
+ ".. ... ... ... ... ... ... ... ... ... \n",
+ "92 0.0 0.0 11.0 990.0 3.0 25.0 1.0 184.0 424.0 \n",
+ "96 0.0 0.0 76.0 2.0 2.0 1.0 0.0 4.0 1854.0 \n",
+ "97 0.0 0.0 174.0 38.0 0.0 0.0 1.0 56.0 2193.0 \n",
+ "60 0.0 0.0 0.0 107.0 9.0 16.0 1.0 57.0 1979.0 \n",
+ "62 0.0 0.0 0.0 23.0 3.0 15.0 0.0 4.0 151.0 \n",
+ "\n",
+ " αsma_mycaf stroma_other endothelial Total_cells \n",
+ "10 388.0 530.0 335.0 6460.0 \n",
+ "100 30.0 73.0 131.0 1876.0 \n",
+ "101 81.0 173.0 60.0 2275.0 \n",
+ "102 18.0 91.0 16.0 3805.0 \n",
+ "103 17.0 131.0 117.0 3192.0 \n",
+ ".. ... ... ... ... \n",
+ "92 140.0 22.0 15.0 1815.0 \n",
+ "96 1.0 16.0 3.0 1959.0 \n",
+ "97 28.0 163.0 102.0 2755.0 \n",
+ "60 107.0 1.0 32.0 2309.0 \n",
+ "62 91.0 20.0 3.0 310.0 \n",
+ "\n",
+ "[177 rows x 13 columns]"
+ ]
+ },
+ "execution_count": 51,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Compter par numƩro de patiente\n",
+ "patient_counts = {}\n",
+ "\n",
+ "# Boucle sur les sous-types de cellules pour compter les Ʃchantillons correspondants par patient\n",
+ "for subtype in cell_subtypes:\n",
+ " patient_counts[subtype.lower()] = pd.DataFrame({subtype.lower():\n",
+ " df.loc[\n",
+ " df['cell_subtype'] == subtype, 'Patient'].value_counts()\n",
+ " }).sort_index()\n",
+ "\n",
+ "# ConcatƩnation des counts des sous-types de cellules en un seul DataFrame\n",
+ "counts_patients = pd.concat([pd.DataFrame(v) for v in patient_counts.values()], axis=1, sort=False)\n",
+ "counts_patients = counts_patients.fillna(0)\n",
+ "\n",
+ "# Ajout de la colonne de total de cellules comptƩes par patientes\n",
+ "counts_patients['Total_cells'] = counts_patients.sum(axis=1)\n",
+ "counts_patients = counts_patients[~counts_patients.index.str.startswith('c')]\n",
+ "\n",
+ "# Enregistrement des counts des sous-types de cellules par patient dans un fichier CSV\n",
+ "filename_patients = os.path.join(output_data_dir, project_name + \"_cell_subtypes_number_by_patient.csv\")\n",
+ "counts_patients.to_csv(filename_patients, index=False)\n",
+ "counts_patients"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "id": "f95053da-c3ae-46c1-93c4-a6b052887bf3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " dc \n",
+ " b \n",
+ " tcd4 \n",
+ " tcd8 \n",
+ " m1 \n",
+ " m2 \n",
+ " treg \n",
+ " immune_other \n",
+ " cancer \n",
+ " αsma_mycaf \n",
+ " ... \n",
+ " tcd8_perc \n",
+ " m1_perc \n",
+ " m2_perc \n",
+ " treg_perc \n",
+ " immune_other_perc \n",
+ " cancer_perc \n",
+ " αsma_mycaf_perc \n",
+ " stroma_other_perc \n",
+ " endothelial_perc \n",
+ " Patient \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 900.0 \n",
+ " 24.0 \n",
+ " 167.0 \n",
+ " 100.0 \n",
+ " 5.0 \n",
+ " 28.0 \n",
+ " 3981.0 \n",
+ " 388.0 \n",
+ " ... \n",
+ " 0.371517 \n",
+ " 2.585139 \n",
+ " 1.547988 \n",
+ " 0.077399 \n",
+ " 0.433437 \n",
+ " 61.625387 \n",
+ " 6.006192 \n",
+ " 8.204334 \n",
+ " 5.185759 \n",
+ " 10 \n",
+ " \n",
+ " \n",
+ " 100 \n",
+ " 21.0 \n",
+ " 0.0 \n",
+ " 92.0 \n",
+ " 46.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 30.0 \n",
+ " 1449.0 \n",
+ " 30.0 \n",
+ " ... \n",
+ " 2.452026 \n",
+ " 0.000000 \n",
+ " 0.159915 \n",
+ " 0.053305 \n",
+ " 1.599147 \n",
+ " 77.238806 \n",
+ " 1.599147 \n",
+ " 3.891258 \n",
+ " 6.982942 \n",
+ " 100 \n",
+ " \n",
+ " \n",
+ " 101 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 20.0 \n",
+ " 15.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 24.0 \n",
+ " 1896.0 \n",
+ " 81.0 \n",
+ " ... \n",
+ " 0.659341 \n",
+ " 0.131868 \n",
+ " 0.043956 \n",
+ " 0.000000 \n",
+ " 1.054945 \n",
+ " 83.340659 \n",
+ " 3.560440 \n",
+ " 7.604396 \n",
+ " 2.637363 \n",
+ " 101 \n",
+ " \n",
+ " \n",
+ " 102 \n",
+ " 1.0 \n",
+ " 2.0 \n",
+ " 45.0 \n",
+ " 24.0 \n",
+ " 5.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 38.0 \n",
+ " 3564.0 \n",
+ " 18.0 \n",
+ " ... \n",
+ " 0.630749 \n",
+ " 0.131406 \n",
+ " 0.026281 \n",
+ " 0.000000 \n",
+ " 0.998686 \n",
+ " 93.666229 \n",
+ " 0.473062 \n",
+ " 2.391590 \n",
+ " 0.420499 \n",
+ " 102 \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " 57.0 \n",
+ " 0.0 \n",
+ " 72.0 \n",
+ " 555.0 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 78.0 \n",
+ " 2157.0 \n",
+ " 17.0 \n",
+ " ... \n",
+ " 17.387218 \n",
+ " 0.219298 \n",
+ " 0.000000 \n",
+ " 0.031328 \n",
+ " 2.443609 \n",
+ " 67.575188 \n",
+ " 0.532581 \n",
+ " 4.104010 \n",
+ " 3.665414 \n",
+ " 103 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 92 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 11.0 \n",
+ " 990.0 \n",
+ " 3.0 \n",
+ " 25.0 \n",
+ " 1.0 \n",
+ " 184.0 \n",
+ " 424.0 \n",
+ " 140.0 \n",
+ " ... \n",
+ " 54.545455 \n",
+ " 0.165289 \n",
+ " 1.377410 \n",
+ " 0.055096 \n",
+ " 10.137741 \n",
+ " 23.360882 \n",
+ " 7.713499 \n",
+ " 1.212121 \n",
+ " 0.826446 \n",
+ " 92 \n",
+ " \n",
+ " \n",
+ " 96 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 76.0 \n",
+ " 2.0 \n",
+ " 2.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 1854.0 \n",
+ " 1.0 \n",
+ " ... \n",
+ " 0.102093 \n",
+ " 0.102093 \n",
+ " 0.051046 \n",
+ " 0.000000 \n",
+ " 0.204186 \n",
+ " 94.640123 \n",
+ " 0.051046 \n",
+ " 0.816743 \n",
+ " 0.153139 \n",
+ " 96 \n",
+ " \n",
+ " \n",
+ " 97 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 174.0 \n",
+ " 38.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 56.0 \n",
+ " 2193.0 \n",
+ " 28.0 \n",
+ " ... \n",
+ " 1.379310 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.036298 \n",
+ " 2.032668 \n",
+ " 79.600726 \n",
+ " 1.016334 \n",
+ " 5.916515 \n",
+ " 3.702359 \n",
+ " 97 \n",
+ " \n",
+ " \n",
+ " 60 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 107.0 \n",
+ " 9.0 \n",
+ " 16.0 \n",
+ " 1.0 \n",
+ " 57.0 \n",
+ " 1979.0 \n",
+ " 107.0 \n",
+ " ... \n",
+ " 4.634041 \n",
+ " 0.389779 \n",
+ " 0.692941 \n",
+ " 0.043309 \n",
+ " 2.468601 \n",
+ " 85.708099 \n",
+ " 4.634041 \n",
+ " 0.043309 \n",
+ " 1.385881 \n",
+ " 60 \n",
+ " \n",
+ " \n",
+ " 62 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 23.0 \n",
+ " 3.0 \n",
+ " 15.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 151.0 \n",
+ " 91.0 \n",
+ " ... \n",
+ " 7.419355 \n",
+ " 0.967742 \n",
+ " 4.838710 \n",
+ " 0.000000 \n",
+ " 1.290323 \n",
+ " 48.709677 \n",
+ " 29.354839 \n",
+ " 6.451613 \n",
+ " 0.967742 \n",
+ " 62 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
177 rows Ć 26 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " dc b tcd4 tcd8 m1 m2 treg immune_other cancer \\\n",
+ "10 2.0 0.0 900.0 24.0 167.0 100.0 5.0 28.0 3981.0 \n",
+ "100 21.0 0.0 92.0 46.0 0.0 3.0 1.0 30.0 1449.0 \n",
+ "101 2.0 0.0 20.0 15.0 3.0 1.0 0.0 24.0 1896.0 \n",
+ "102 1.0 2.0 45.0 24.0 5.0 1.0 0.0 38.0 3564.0 \n",
+ "103 57.0 0.0 72.0 555.0 7.0 0.0 1.0 78.0 2157.0 \n",
+ ".. ... ... ... ... ... ... ... ... ... \n",
+ "92 0.0 0.0 11.0 990.0 3.0 25.0 1.0 184.0 424.0 \n",
+ "96 0.0 0.0 76.0 2.0 2.0 1.0 0.0 4.0 1854.0 \n",
+ "97 0.0 0.0 174.0 38.0 0.0 0.0 1.0 56.0 2193.0 \n",
+ "60 0.0 0.0 0.0 107.0 9.0 16.0 1.0 57.0 1979.0 \n",
+ "62 0.0 0.0 0.0 23.0 3.0 15.0 0.0 4.0 151.0 \n",
+ "\n",
+ " αsma_mycaf ... tcd8_perc m1_perc m2_perc treg_perc \\\n",
+ "10 388.0 ... 0.371517 2.585139 1.547988 0.077399 \n",
+ "100 30.0 ... 2.452026 0.000000 0.159915 0.053305 \n",
+ "101 81.0 ... 0.659341 0.131868 0.043956 0.000000 \n",
+ "102 18.0 ... 0.630749 0.131406 0.026281 0.000000 \n",
+ "103 17.0 ... 17.387218 0.219298 0.000000 0.031328 \n",
+ ".. ... ... ... ... ... ... \n",
+ "92 140.0 ... 54.545455 0.165289 1.377410 0.055096 \n",
+ "96 1.0 ... 0.102093 0.102093 0.051046 0.000000 \n",
+ "97 28.0 ... 1.379310 0.000000 0.000000 0.036298 \n",
+ "60 107.0 ... 4.634041 0.389779 0.692941 0.043309 \n",
+ "62 91.0 ... 7.419355 0.967742 4.838710 0.000000 \n",
+ "\n",
+ " immune_other_perc cancer_perc αsma_mycaf_perc stroma_other_perc \\\n",
+ "10 0.433437 61.625387 6.006192 8.204334 \n",
+ "100 1.599147 77.238806 1.599147 3.891258 \n",
+ "101 1.054945 83.340659 3.560440 7.604396 \n",
+ "102 0.998686 93.666229 0.473062 2.391590 \n",
+ "103 2.443609 67.575188 0.532581 4.104010 \n",
+ ".. ... ... ... ... \n",
+ "92 10.137741 23.360882 7.713499 1.212121 \n",
+ "96 0.204186 94.640123 0.051046 0.816743 \n",
+ "97 2.032668 79.600726 1.016334 5.916515 \n",
+ "60 2.468601 85.708099 4.634041 0.043309 \n",
+ "62 1.290323 48.709677 29.354839 6.451613 \n",
+ "\n",
+ " endothelial_perc Patient \n",
+ "10 5.185759 10 \n",
+ "100 6.982942 100 \n",
+ "101 2.637363 101 \n",
+ "102 0.420499 102 \n",
+ "103 3.665414 103 \n",
+ ".. ... ... \n",
+ "92 0.826446 92 \n",
+ "96 0.153139 96 \n",
+ "97 3.702359 97 \n",
+ "60 1.385881 60 \n",
+ "62 0.967742 62 \n",
+ "\n",
+ "[177 rows x 26 columns]"
+ ]
+ },
+ "execution_count": 52,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Ajout des colonnes de pourcentages pour chaque sous-type de cellules par patient\n",
+ "counts_perc_patients = counts_patients.copy()\n",
+ "\n",
+ "# Calcul des pourcentages pour chaque sous-type de cellules, en excluant la colonne 'total_cells'\n",
+ "for col in counts_perc_patients.columns:\n",
+ " if col != 'Total_cells':\n",
+ " counts_perc_patients[col + '_perc'] = (counts_perc_patients[col] / counts_perc_patients['Total_cells']) * 100\n",
+ "\n",
+ "\n",
+ "# Affichage des pourcentages des sous-types de cellules par patient\n",
+ "counts_perc_patients['Patient'] = counts_perc_patients.index\n",
+ "counts_perc_patients.columns.values\n",
+ "counts_perc_patients = counts_perc_patients[~counts_perc_patients.index.str.startswith('c')]\n",
+ "counts_perc_patients"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "id": "d0c8f835-c414-4247-a701-5ed00ffcdef8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "marker": {
+ "color": "rgb(166, 206, 227)"
+ },
+ "name": "DC",
+ "text": [
+ 0.030959752321981428,
+ 1.1194029850746268,
+ 0.0879120879120879,
+ 0.026281208935611037,
+ 1.7857142857142856,
+ 0.16251354279523295,
+ 0.01915341888527102,
+ 1.8001800180018002,
+ 0.01614465611882467,
+ 0.27932960893854747,
+ 2.631578947368421,
+ 0.07040600797934757,
+ 0.03170577045022194,
+ 0.6369426751592357,
+ 0.19162332329592116,
+ 1.5151515151515151,
+ 0.022060445621001543,
+ 0.044444444444444446,
+ 0.25911210917256866,
+ 0.19485580670303976,
+ 0.1509813789632612,
+ 0.6265664160401002,
+ 1.3333333333333335,
+ 1.8334606569900689,
+ 0.48543689320388345,
+ 0.10482180293501049,
+ 0.4731488052992667,
+ 0.38910505836575876,
+ 1.3261210957948002,
+ 11.179606797734088,
+ 0.16381933068102036,
+ 0.09564801530368246,
+ 0.15408320493066258,
+ 0.012711325791280032,
+ 25.251256281407038,
+ 3.75,
+ 0.130718954248366,
+ 1.6082294986960302,
+ 0.38022813688212925,
+ 0.025412960609911054,
+ 0.250678922080635,
+ 0.5918910920390648,
+ 0.1352265043948614,
+ 0.2883762200532387,
+ 0.8665511265164645,
+ 0.0485319097306479,
+ 0.5867396831605711,
+ 0.01882530120481928,
+ 0.40417649040080833,
+ 0.07336757153338225,
+ 0.8547008547008548,
+ 3.489499192245557,
+ 0.13761467889908258,
+ 22.03856749311295,
+ 0.10086746015735323,
+ 0.10156408693885843,
+ 0.25597269624573377,
+ 2.3359670216420474,
+ 0.1310615989515072,
+ 0.054945054945054944,
+ 0.21253985122210414,
+ 0.6975392365820577,
+ 0.052083333333333336,
+ 2.3801760678187156,
+ 0.0643915003219575,
+ 0.5820721769499418,
+ 0.3232758620689655,
+ 2.07667731629393,
+ 0.09737098344693282,
+ 0.1146131805157593,
+ 0.5830009205277692,
+ 0.01889287738522577,
+ 0.029498525073746312,
+ 1.3999164229001253,
+ 0.026954177897574125,
+ 0.07777259293824856,
+ 0.03567606136282554,
+ 0.13120899718837864,
+ 0.33504578959124415,
+ 0.6089604175728578,
+ 0.836635843240863,
+ 1.0788381742738589,
+ 2.1150424985174934,
+ 0.04315925766076824,
+ 0.07789678675754626,
+ 0.2491506228765572,
+ 0.8224993366940834,
+ 0.7874015748031495,
+ 0.9978048293753742,
+ 0.5996002664890073,
+ 0.29505778214900413,
+ 0.14691478942213515,
+ 0.3534956794972506,
+ 0.037678975131876416,
+ 0.03664345914254306,
+ 0.5344503827820309,
+ 3.1978680879413726,
+ 0.044007627988851404,
+ 0.09629272989889263,
+ 0.1779359430604982,
+ 0.045187528242205156,
+ 0.09206407659731174,
+ 0.7308467741935484,
+ 0.04962779156327543,
+ 0.8764940239043826,
+ 0.17491254372813594,
+ 0.02337540906965872,
+ 1.1464968152866242,
+ 0.06357279084551812,
+ 12.654392915404333,
+ 0.1128668171557562,
+ 6.478624944909652,
+ 0.14516421702050444,
+ 0.028477858465043433,
+ 1.9297036526533424,
+ 0.01858736059479554,
+ 0.05564830272676684,
+ 0.2434705621956618,
+ 0.6076718571971136,
+ 0.03254678600488201,
+ 0.034916201117318434,
+ 0.49532195927352773,
+ 0.12903225806451613,
+ 0.14248397055331277,
+ 0.6134969325153374,
+ 1.0619977037887485,
+ 0.6738544474393532,
+ 0.23715415019762848,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "11",
+ "110",
+ "111",
+ "112",
+ "113",
+ "114",
+ "115",
+ "116",
+ "119",
+ "120",
+ "121",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "137",
+ "139",
+ "14",
+ "140",
+ "141",
+ "143",
+ "144",
+ "146",
+ "147",
+ "148",
+ "149",
+ "15",
+ "150",
+ "152",
+ "153",
+ "154",
+ "155",
+ "157",
+ "158",
+ "159",
+ "161",
+ "162",
+ "164",
+ "165",
+ "166",
+ "168",
+ "169",
+ "170",
+ "174",
+ "175",
+ "176",
+ "177",
+ "180",
+ "181",
+ "182",
+ "183",
+ "184",
+ "186",
+ "187",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "7",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "85",
+ "87",
+ "88",
+ "89",
+ "90",
+ "91",
+ "94",
+ "95",
+ "98",
+ "99",
+ "104",
+ "108",
+ "135",
+ "18",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "160",
+ "167",
+ "17",
+ "171",
+ "172",
+ "173",
+ "178",
+ "179",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0.030959752321981428,
+ 1.1194029850746268,
+ 0.0879120879120879,
+ 0.026281208935611037,
+ 1.7857142857142856,
+ 0.16251354279523295,
+ 0.01915341888527102,
+ 1.8001800180018002,
+ 0.01614465611882467,
+ 0.27932960893854747,
+ 2.631578947368421,
+ 0.07040600797934757,
+ 0.03170577045022194,
+ 0.6369426751592357,
+ 0.19162332329592116,
+ 1.5151515151515151,
+ 0.022060445621001543,
+ 0.044444444444444446,
+ 0.25911210917256866,
+ 0.19485580670303976,
+ 0.1509813789632612,
+ 0.6265664160401002,
+ 1.3333333333333335,
+ 1.8334606569900689,
+ 0.48543689320388345,
+ 0.10482180293501049,
+ 0.4731488052992667,
+ 0.38910505836575876,
+ 1.3261210957948002,
+ 11.179606797734088,
+ 0.16381933068102036,
+ 0.09564801530368246,
+ 0.15408320493066258,
+ 0.012711325791280032,
+ 25.251256281407038,
+ 3.75,
+ 0.130718954248366,
+ 1.6082294986960302,
+ 0.38022813688212925,
+ 0.025412960609911054,
+ 0.250678922080635,
+ 0.5918910920390648,
+ 0.1352265043948614,
+ 0.2883762200532387,
+ 0.8665511265164645,
+ 0.0485319097306479,
+ 0.5867396831605711,
+ 0.01882530120481928,
+ 0.40417649040080833,
+ 0.07336757153338225,
+ 0.8547008547008548,
+ 3.489499192245557,
+ 0.13761467889908258,
+ 22.03856749311295,
+ 0.10086746015735323,
+ 0.10156408693885843,
+ 0.25597269624573377,
+ 2.3359670216420474,
+ 0.1310615989515072,
+ 0.054945054945054944,
+ 0.21253985122210414,
+ 0.6975392365820577,
+ 0.052083333333333336,
+ 2.3801760678187156,
+ 0.0643915003219575,
+ 0.5820721769499418,
+ 0.3232758620689655,
+ 2.07667731629393,
+ 0.09737098344693282,
+ 0.1146131805157593,
+ 0.5830009205277692,
+ 0.01889287738522577,
+ 0.029498525073746312,
+ 1.3999164229001253,
+ 0.026954177897574125,
+ 0.07777259293824856,
+ 0.03567606136282554,
+ 0.13120899718837864,
+ 0.33504578959124415,
+ 0.6089604175728578,
+ 0.836635843240863,
+ 1.0788381742738589,
+ 2.1150424985174934,
+ 0.04315925766076824,
+ 0.07789678675754626,
+ 0.2491506228765572,
+ 0.8224993366940834,
+ 0.7874015748031495,
+ 0.9978048293753742,
+ 0.5996002664890073,
+ 0.29505778214900413,
+ 0.14691478942213515,
+ 0.3534956794972506,
+ 0.037678975131876416,
+ 0.03664345914254306,
+ 0.5344503827820309,
+ 3.1978680879413726,
+ 0.044007627988851404,
+ 0.09629272989889263,
+ 0.1779359430604982,
+ 0.045187528242205156,
+ 0.09206407659731174,
+ 0.7308467741935484,
+ 0.04962779156327543,
+ 0.8764940239043826,
+ 0.17491254372813594,
+ 0.02337540906965872,
+ 1.1464968152866242,
+ 0.06357279084551812,
+ 12.654392915404333,
+ 0.1128668171557562,
+ 6.478624944909652,
+ 0.14516421702050444,
+ 0.028477858465043433,
+ 1.9297036526533424,
+ 0.01858736059479554,
+ 0.05564830272676684,
+ 0.2434705621956618,
+ 0.6076718571971136,
+ 0.03254678600488201,
+ 0.034916201117318434,
+ 0.49532195927352773,
+ 0.12903225806451613,
+ 0.14248397055331277,
+ 0.6134969325153374,
+ 1.0619977037887485,
+ 0.6738544474393532,
+ 0.23715415019762848,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(31, 120, 180)"
+ },
+ "name": "B",
+ "text": [
+ 0,
+ 0,
+ 0,
+ 0.052562417871222074,
+ 0,
+ 0,
+ 0.15322735108216817,
+ 0,
+ 0,
+ 0,
+ 0.09746588693957114,
+ 0,
+ 0,
+ 0.03352329869259135,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.03454828122300915,
+ 0,
+ 0,
+ 0.011392116655274549,
+ 0.3660130718954248,
+ 0.03819709702062643,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.7407407407407408,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.02426595486532395,
+ 0,
+ 0.03765060240963856,
+ 0.033681374200067365,
+ 0,
+ 0,
+ 0.06462035541195477,
+ 0.022935779816513763,
+ 0,
+ 0.0403469840629413,
+ 0.14218972171440178,
+ 0,
+ 0,
+ 0.5242463958060288,
+ 0,
+ 0,
+ 0.019376089905057157,
+ 0,
+ 0,
+ 0,
+ 0.11641443538998836,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2.47787610619469,
+ 0.020894274968658588,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.17869108778199688,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.019474196689386564,
+ 0,
+ 0.05306447333510214,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.037678975131876416,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.0398406374501992,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.02821670428893905,
+ 0,
+ 0,
+ 0,
+ 0.02297266253158741,
+ 0.5204460966542751,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.02870264064293915,
+ 0,
+ 0,
+ 0.04014452027298274,
+ 0.06901311249137336,
+ 3.28416365154467,
+ 0.2795320426545191,
+ 0.7992007992007992,
+ 0.04482294935006724,
+ 0.06188118811881188,
+ 0.14691478942213515,
+ 0.6885998469778117,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "11",
+ "110",
+ "111",
+ "112",
+ "113",
+ "114",
+ "115",
+ "116",
+ "119",
+ "120",
+ "121",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "137",
+ "139",
+ "14",
+ "140",
+ "141",
+ "143",
+ "144",
+ "146",
+ "147",
+ "148",
+ "149",
+ "15",
+ "150",
+ "152",
+ "153",
+ "154",
+ "155",
+ "157",
+ "158",
+ "159",
+ "161",
+ "162",
+ "164",
+ "165",
+ "166",
+ "168",
+ "169",
+ "170",
+ "174",
+ "175",
+ "176",
+ "177",
+ "180",
+ "181",
+ "182",
+ "183",
+ "184",
+ "186",
+ "187",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "7",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "85",
+ "87",
+ "88",
+ "89",
+ "90",
+ "91",
+ "94",
+ "95",
+ "98",
+ "99",
+ "104",
+ "108",
+ "135",
+ "18",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "160",
+ "167",
+ "17",
+ "171",
+ "172",
+ "173",
+ "178",
+ "179",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0,
+ 0,
+ 0,
+ 0.052562417871222074,
+ 0,
+ 0,
+ 0.15322735108216817,
+ 0,
+ 0,
+ 0,
+ 0.09746588693957114,
+ 0,
+ 0,
+ 0.03352329869259135,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.03454828122300915,
+ 0,
+ 0,
+ 0.011392116655274549,
+ 0.3660130718954248,
+ 0.03819709702062643,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.7407407407407408,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.02426595486532395,
+ 0,
+ 0.03765060240963856,
+ 0.033681374200067365,
+ 0,
+ 0,
+ 0.06462035541195477,
+ 0.022935779816513763,
+ 0,
+ 0.0403469840629413,
+ 0.14218972171440178,
+ 0,
+ 0,
+ 0.5242463958060288,
+ 0,
+ 0,
+ 0.019376089905057157,
+ 0,
+ 0,
+ 0,
+ 0.11641443538998836,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2.47787610619469,
+ 0.020894274968658588,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.17869108778199688,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.019474196689386564,
+ 0,
+ 0.05306447333510214,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.037678975131876416,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.0398406374501992,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.02821670428893905,
+ 0,
+ 0,
+ 0,
+ 0.02297266253158741,
+ 0.5204460966542751,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.02870264064293915,
+ 0,
+ 0,
+ 0.04014452027298274,
+ 0.06901311249137336,
+ 3.28416365154467,
+ 0.2795320426545191,
+ 0.7992007992007992,
+ 0.04482294935006724,
+ 0.06188118811881188,
+ 0.14691478942213515,
+ 0.6885998469778117,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(178, 223, 138)"
+ },
+ "name": "TCD4",
+ "text": [
+ 13.93188854489164,
+ 4.904051172707889,
+ 0.8791208791208791,
+ 1.1826544021024967,
+ 2.2556390977443606,
+ 0.3250270855904659,
+ 1.991955564068186,
+ 0.7200720072007201,
+ 0.11301259283177267,
+ 3.35195530726257,
+ 0.1949317738791423,
+ 3.9192677775170144,
+ 1.077996195307546,
+ 1.6426416359369762,
+ 6.131946345469477,
+ 2.0202020202020203,
+ 1.3236267372600927,
+ 1.1111111111111112,
+ 12.160994990499223,
+ 9.353078721745907,
+ 2.7176648213387016,
+ 1.1278195488721803,
+ 14.143790849673202,
+ 3.7815126050420167,
+ 10.922330097087379,
+ 6.184486373165619,
+ 1.0172699313934233,
+ 14.184648036788113,
+ 3.78642470772989,
+ 13.595468177274242,
+ 0.5850690381465012,
+ 1.0043041606886656,
+ 2.6964560862865947,
+ 2.4151519003432056,
+ 24.183417085427138,
+ 14.107142857142858,
+ 0.34858387799564267,
+ 0.7099391480730223,
+ 5.069708491761723,
+ 2.9987293519695046,
+ 0.50135784416127,
+ 7.990529742527375,
+ 1.0818120351588911,
+ 6.521739130434782,
+ 1.6464471403812824,
+ 13.758796408638679,
+ 5.671816937218853,
+ 0.5271084337349398,
+ 0.5389019872010778,
+ 0.9537784299339692,
+ 3.9316239316239314,
+ 3.5541195476575123,
+ 1.743119266055046,
+ 1.9283746556473829,
+ 7.625579987895905,
+ 1.360958764980703,
+ 6.228668941979522,
+ 6.9391961525249055,
+ 0.655307994757536,
+ 1.3186813186813187,
+ 0.3188097768331562,
+ 0.8331718659174578,
+ 6.822916666666666,
+ 1.3694163677861102,
+ 0.901481004507405,
+ 1.7462165308498252,
+ 2.478448275862069,
+ 2.4494142705005326,
+ 2.044790652385589,
+ 0.7736389684813754,
+ 15.081313286284137,
+ 0.49121481201587003,
+ 0.14749262536873156,
+ 4.9937317175094025,
+ 4.285714285714286,
+ 0.6999533364442371,
+ 0.9275775954334641,
+ 18.481724461105905,
+ 12.698235425508154,
+ 2.7838190517616357,
+ 1.4971378247468077,
+ 0.16597510373443983,
+ 1.344139157936351,
+ 0.02157962883038412,
+ 0.3894839337877313,
+ 5.458663646659117,
+ 45.900769434863356,
+ 60.23622047244095,
+ 14.887248054280583,
+ 2.9313790806129245,
+ 1.1802311285960165,
+ 4.521710741103494,
+ 1.4532600157109192,
+ 2.4868123587038435,
+ 2.381824844265299,
+ 1.314459049544995,
+ 0.39973351099267157,
+ 0.029338418659234266,
+ 1.1073663938372653,
+ 3.0249110320284696,
+ 5.309534568459105,
+ 2.1542993923770943,
+ 1.7389112903225805,
+ 0.5955334987593052,
+ 0.6772908366533864,
+ 5.022488755622189,
+ 0.4908835904628331,
+ 0.7825295723384895,
+ 11.697393515575333,
+ 3.6588207876951757,
+ 2.3702031602708806,
+ 3.1511679153812255,
+ 0.32661948829613496,
+ 10.024206179695287,
+ 1.6540317022742934,
+ 0.2788104089219331,
+ 0,
+ 2.058432934926959,
+ 4.101785036080517,
+ 7.518307567127747,
+ 0.6983240223463687,
+ 6.962025316455696,
+ 7.677419354838709,
+ 15.696984089289955,
+ 0.2044989775051125,
+ 1.9804822043628014,
+ 21.293800539083556,
+ 7.114624505928854,
+ 6.784423926134083,
+ 0.2070393374741201,
+ 2.9223490119677153,
+ 3.3957966663215657,
+ 0.07492507492507493,
+ 0.22411474675033619,
+ 3.248762376237624,
+ 0.2938295788442703,
+ 0.07651109410864575,
+ 0.45126353790613716,
+ 0.17538731365097923,
+ 3.5419915348629982,
+ 1.8327067669172932,
+ 0.6085192697768762,
+ 0.12626262626262627,
+ 2.686428902269569,
+ 0.37735849056603776,
+ 0.639749786750071,
+ 0.35816618911174786,
+ 0.09342883836810963,
+ 3.3608310418576233,
+ 5.575117370892019,
+ 0.033681374200067365,
+ 1.9677996422182469,
+ 0.051150895140664954,
+ 1.3948497854077253,
+ 2.814191220685508,
+ 0.47095761381475665,
+ 0.25688930406352173,
+ 0.43464762496119214,
+ 1.2394366197183098,
+ 0.26752273943285176,
+ 9.090909090909092,
+ 0.10162601626016261,
+ 0.026048450117218028,
+ 0.39913520705138866,
+ 4.226859283039058,
+ 0.5095541401273885,
+ 0.18885741265344666,
+ 0.8818342151675485,
+ 0.14958863126402394,
+ 2.552048354600403,
+ 0.0992063492063492,
+ 6.718682271348071,
+ 0.6060606060606061,
+ 3.8795303726391013,
+ 6.315789473684211,
+ 0,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "11",
+ "110",
+ "111",
+ "112",
+ "113",
+ "114",
+ "115",
+ "116",
+ "119",
+ "120",
+ "121",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "137",
+ "139",
+ "14",
+ "140",
+ "141",
+ "143",
+ "144",
+ "146",
+ "147",
+ "148",
+ "149",
+ "15",
+ "150",
+ "152",
+ "153",
+ "154",
+ "155",
+ "157",
+ "158",
+ "159",
+ "161",
+ "162",
+ "164",
+ "165",
+ "166",
+ "168",
+ "169",
+ "170",
+ "174",
+ "175",
+ "176",
+ "177",
+ "180",
+ "181",
+ "182",
+ "183",
+ "184",
+ "186",
+ "187",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "7",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "85",
+ "87",
+ "88",
+ "89",
+ "90",
+ "91",
+ "94",
+ "95",
+ "98",
+ "99",
+ "104",
+ "108",
+ "135",
+ "18",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "160",
+ "167",
+ "17",
+ "171",
+ "172",
+ "173",
+ "178",
+ "179",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 13.93188854489164,
+ 4.904051172707889,
+ 0.8791208791208791,
+ 1.1826544021024967,
+ 2.2556390977443606,
+ 0.3250270855904659,
+ 1.991955564068186,
+ 0.7200720072007201,
+ 0.11301259283177267,
+ 3.35195530726257,
+ 0.1949317738791423,
+ 3.9192677775170144,
+ 1.077996195307546,
+ 1.6426416359369762,
+ 6.131946345469477,
+ 2.0202020202020203,
+ 1.3236267372600927,
+ 1.1111111111111112,
+ 12.160994990499223,
+ 9.353078721745907,
+ 2.7176648213387016,
+ 1.1278195488721803,
+ 14.143790849673202,
+ 3.7815126050420167,
+ 10.922330097087379,
+ 6.184486373165619,
+ 1.0172699313934233,
+ 14.184648036788113,
+ 3.78642470772989,
+ 13.595468177274242,
+ 0.5850690381465012,
+ 1.0043041606886656,
+ 2.6964560862865947,
+ 2.4151519003432056,
+ 24.183417085427138,
+ 14.107142857142858,
+ 0.34858387799564267,
+ 0.7099391480730223,
+ 5.069708491761723,
+ 2.9987293519695046,
+ 0.50135784416127,
+ 7.990529742527375,
+ 1.0818120351588911,
+ 6.521739130434782,
+ 1.6464471403812824,
+ 13.758796408638679,
+ 5.671816937218853,
+ 0.5271084337349398,
+ 0.5389019872010778,
+ 0.9537784299339692,
+ 3.9316239316239314,
+ 3.5541195476575123,
+ 1.743119266055046,
+ 1.9283746556473829,
+ 7.625579987895905,
+ 1.360958764980703,
+ 6.228668941979522,
+ 6.9391961525249055,
+ 0.655307994757536,
+ 1.3186813186813187,
+ 0.3188097768331562,
+ 0.8331718659174578,
+ 6.822916666666666,
+ 1.3694163677861102,
+ 0.901481004507405,
+ 1.7462165308498252,
+ 2.478448275862069,
+ 2.4494142705005326,
+ 2.044790652385589,
+ 0.7736389684813754,
+ 15.081313286284137,
+ 0.49121481201587003,
+ 0.14749262536873156,
+ 4.9937317175094025,
+ 4.285714285714286,
+ 0.6999533364442371,
+ 0.9275775954334641,
+ 18.481724461105905,
+ 12.698235425508154,
+ 2.7838190517616357,
+ 1.4971378247468077,
+ 0.16597510373443983,
+ 1.344139157936351,
+ 0.02157962883038412,
+ 0.3894839337877313,
+ 5.458663646659117,
+ 45.900769434863356,
+ 60.23622047244095,
+ 14.887248054280583,
+ 2.9313790806129245,
+ 1.1802311285960165,
+ 4.521710741103494,
+ 1.4532600157109192,
+ 2.4868123587038435,
+ 2.381824844265299,
+ 1.314459049544995,
+ 0.39973351099267157,
+ 0.029338418659234266,
+ 1.1073663938372653,
+ 3.0249110320284696,
+ 5.309534568459105,
+ 2.1542993923770943,
+ 1.7389112903225805,
+ 0.5955334987593052,
+ 0.6772908366533864,
+ 5.022488755622189,
+ 0.4908835904628331,
+ 0.7825295723384895,
+ 11.697393515575333,
+ 3.6588207876951757,
+ 2.3702031602708806,
+ 3.1511679153812255,
+ 0.32661948829613496,
+ 10.024206179695287,
+ 1.6540317022742934,
+ 0.2788104089219331,
+ 0,
+ 2.058432934926959,
+ 4.101785036080517,
+ 7.518307567127747,
+ 0.6983240223463687,
+ 6.962025316455696,
+ 7.677419354838709,
+ 15.696984089289955,
+ 0.2044989775051125,
+ 1.9804822043628014,
+ 21.293800539083556,
+ 7.114624505928854,
+ 6.784423926134083,
+ 0.2070393374741201,
+ 2.9223490119677153,
+ 3.3957966663215657,
+ 0.07492507492507493,
+ 0.22411474675033619,
+ 3.248762376237624,
+ 0.2938295788442703,
+ 0.07651109410864575,
+ 0.45126353790613716,
+ 0.17538731365097923,
+ 3.5419915348629982,
+ 1.8327067669172932,
+ 0.6085192697768762,
+ 0.12626262626262627,
+ 2.686428902269569,
+ 0.37735849056603776,
+ 0.639749786750071,
+ 0.35816618911174786,
+ 0.09342883836810963,
+ 3.3608310418576233,
+ 5.575117370892019,
+ 0.033681374200067365,
+ 1.9677996422182469,
+ 0.051150895140664954,
+ 1.3948497854077253,
+ 2.814191220685508,
+ 0.47095761381475665,
+ 0.25688930406352173,
+ 0.43464762496119214,
+ 1.2394366197183098,
+ 0.26752273943285176,
+ 9.090909090909092,
+ 0.10162601626016261,
+ 0.026048450117218028,
+ 0.39913520705138866,
+ 4.226859283039058,
+ 0.5095541401273885,
+ 0.18885741265344666,
+ 0.8818342151675485,
+ 0.14958863126402394,
+ 2.552048354600403,
+ 0.0992063492063492,
+ 6.718682271348071,
+ 0.6060606060606061,
+ 3.8795303726391013,
+ 6.315789473684211,
+ 0,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(51, 160, 44)"
+ },
+ "name": "TCD8",
+ "text": [
+ 0.37151702786377705,
+ 2.4520255863539444,
+ 0.6593406593406593,
+ 0.6307490144546649,
+ 17.387218045112782,
+ 6.121343445287107,
+ 1.762114537444934,
+ 29.072907290729074,
+ 0.08072328059412334,
+ 3.55147645650439,
+ 2.923976608187134,
+ 0.21121802393804273,
+ 0.03170577045022194,
+ 17.063359034528997,
+ 0.3011223651793047,
+ 1.0101010101010102,
+ 0.1985440105890139,
+ 0.26666666666666666,
+ 0.9328035930212472,
+ 0.03897116134060795,
+ 0.20130850528434827,
+ 1.948051948051948,
+ 1.1764705882352942,
+ 0.2291825821237586,
+ 0.24271844660194172,
+ 1.1530398322851152,
+ 1.230186893778093,
+ 0.21223912274495935,
+ 0.24428546501483162,
+ 0.4998333888703766,
+ 0,
+ 1.0521281683405068,
+ 0.23112480739599386,
+ 0.07626795474768018,
+ 0.37688442211055273,
+ 1.875,
+ 7.363834422657953,
+ 0.3911909591422776,
+ 0.19011406844106463,
+ 0.20330368487928843,
+ 0.9609358679757677,
+ 0.739863865048831,
+ 0.23664638269100743,
+ 1.4640638864241349,
+ 0.6932409012131715,
+ 0.5823829167677749,
+ 0.8214355564247995,
+ 0.1694277108433735,
+ 5.826877736611654,
+ 0,
+ 0.927960927960928,
+ 3.1825525040387723,
+ 0.06880733944954129,
+ 11.937557392102846,
+ 0.0403469840629413,
+ 0.28437944342880356,
+ 0.6825938566552902,
+ 0.7214015802129852,
+ 0.1310615989515072,
+ 0.21978021978021978,
+ 0.10626992561105207,
+ 0.019376089905057157,
+ 0,
+ 2.41278121943267,
+ 0.19317450096587252,
+ 0.46565774155995343,
+ 0.16163793103448276,
+ 0.05324813631522897,
+ 0.9737098344693282,
+ 0.6017191977077364,
+ 3.958269407793802,
+ 0.4345361798601928,
+ 12.271386430678465,
+ 15.670706226493941,
+ 0.4582210242587601,
+ 0,
+ 0.8205494113449875,
+ 2.7741330834114337,
+ 7.013625195443378,
+ 1.4354066985645932,
+ 19.154557463672393,
+ 71.45228215767635,
+ 25.677011267048822,
+ 1.294777729823047,
+ 0.4089581304771178,
+ 0.7927519818799547,
+ 0.02653223666755107,
+ 2.3622047244094486,
+ 9.5988824585911,
+ 0.6662225183211192,
+ 0.34423407917383825,
+ 0.3917727717923604,
+ 0.864100549882168,
+ 1.5071590052750565,
+ 1.667277390985709,
+ 0.10111223458038424,
+ 1.4434821230290917,
+ 16.62021417045621,
+ 0.9950248756218906,
+ 6.93950177935943,
+ 0.11296882060551287,
+ 1.8228687166267723,
+ 1.033266129032258,
+ 7.626137303556659,
+ 0.5179282868525896,
+ 1.5492253873063468,
+ 0.02337540906965872,
+ 1.4194722474977253,
+ 1.9707565162110616,
+ 4.474481472850152,
+ 3.470654627539503,
+ 12.5605993829881,
+ 2.558519324986391,
+ 0.25630072618539085,
+ 4.387778543533195,
+ 2.5650557620817844,
+ 26.26599888703395,
+ 0.15493581230633025,
+ 0.41777440182301556,
+ 0.32546786004882017,
+ 0.13966480446927373,
+ 0.4678040726472207,
+ 0.25806451612903225,
+ 2.3509855141296603,
+ 10.429447852760736,
+ 4.7646383467278985,
+ 1.940700808625337,
+ 1.8181818181818181,
+ 1.204335608189482,
+ 0,
+ 0.11132758140829391,
+ 4.089450253649446,
+ 0.12487512487512488,
+ 2.3756163155535632,
+ 0.8353960396039605,
+ 0.3428011753183154,
+ 0,
+ 27.707581227436823,
+ 1.929260450160772,
+ 0.06683002895967921,
+ 1.3157894736842104,
+ 0,
+ 0.5050505050505051,
+ 0,
+ 0.25157232704402516,
+ 0.5828831390389536,
+ 0.14326647564469913,
+ 0.21800062285892244,
+ 0.5346776657500764,
+ 1.643192488262911,
+ 0,
+ 0.17889087656529518,
+ 0,
+ 0.1072961373390558,
+ 1.0944076969332532,
+ 7.064364207221351,
+ 0.14012143858010276,
+ 0.3104625892579944,
+ 2.873239436619718,
+ 11.021936864633494,
+ 2.272727272727273,
+ 5.7926829268292686,
+ 0.3125814014066163,
+ 1.1308830866456012,
+ 7.704654895666131,
+ 0.12738853503184713,
+ 0.09442870632672333,
+ 0.5291005291005291,
+ 1.6828721017202692,
+ 0.1343183344526528,
+ 0,
+ 1.1847998844097674,
+ 54.54545454545454,
+ 0.10209290454313426,
+ 1.3793103448275863,
+ 4.634040710264184,
+ 7.419354838709677
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "11",
+ "110",
+ "111",
+ "112",
+ "113",
+ "114",
+ "115",
+ "116",
+ "119",
+ "120",
+ "121",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "137",
+ "139",
+ "14",
+ "140",
+ "141",
+ "143",
+ "144",
+ "146",
+ "147",
+ "148",
+ "149",
+ "15",
+ "150",
+ "152",
+ "153",
+ "154",
+ "155",
+ "157",
+ "158",
+ "159",
+ "161",
+ "162",
+ "164",
+ "165",
+ "166",
+ "168",
+ "169",
+ "170",
+ "174",
+ "175",
+ "176",
+ "177",
+ "180",
+ "181",
+ "182",
+ "183",
+ "184",
+ "186",
+ "187",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "7",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "85",
+ "87",
+ "88",
+ "89",
+ "90",
+ "91",
+ "94",
+ "95",
+ "98",
+ "99",
+ "104",
+ "108",
+ "135",
+ "18",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "160",
+ "167",
+ "17",
+ "171",
+ "172",
+ "173",
+ "178",
+ "179",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0.37151702786377705,
+ 2.4520255863539444,
+ 0.6593406593406593,
+ 0.6307490144546649,
+ 17.387218045112782,
+ 6.121343445287107,
+ 1.762114537444934,
+ 29.072907290729074,
+ 0.08072328059412334,
+ 3.55147645650439,
+ 2.923976608187134,
+ 0.21121802393804273,
+ 0.03170577045022194,
+ 17.063359034528997,
+ 0.3011223651793047,
+ 1.0101010101010102,
+ 0.1985440105890139,
+ 0.26666666666666666,
+ 0.9328035930212472,
+ 0.03897116134060795,
+ 0.20130850528434827,
+ 1.948051948051948,
+ 1.1764705882352942,
+ 0.2291825821237586,
+ 0.24271844660194172,
+ 1.1530398322851152,
+ 1.230186893778093,
+ 0.21223912274495935,
+ 0.24428546501483162,
+ 0.4998333888703766,
+ 0,
+ 1.0521281683405068,
+ 0.23112480739599386,
+ 0.07626795474768018,
+ 0.37688442211055273,
+ 1.875,
+ 7.363834422657953,
+ 0.3911909591422776,
+ 0.19011406844106463,
+ 0.20330368487928843,
+ 0.9609358679757677,
+ 0.739863865048831,
+ 0.23664638269100743,
+ 1.4640638864241349,
+ 0.6932409012131715,
+ 0.5823829167677749,
+ 0.8214355564247995,
+ 0.1694277108433735,
+ 5.826877736611654,
+ 0,
+ 0.927960927960928,
+ 3.1825525040387723,
+ 0.06880733944954129,
+ 11.937557392102846,
+ 0.0403469840629413,
+ 0.28437944342880356,
+ 0.6825938566552902,
+ 0.7214015802129852,
+ 0.1310615989515072,
+ 0.21978021978021978,
+ 0.10626992561105207,
+ 0.019376089905057157,
+ 0,
+ 2.41278121943267,
+ 0.19317450096587252,
+ 0.46565774155995343,
+ 0.16163793103448276,
+ 0.05324813631522897,
+ 0.9737098344693282,
+ 0.6017191977077364,
+ 3.958269407793802,
+ 0.4345361798601928,
+ 12.271386430678465,
+ 15.670706226493941,
+ 0.4582210242587601,
+ 0,
+ 0.8205494113449875,
+ 2.7741330834114337,
+ 7.013625195443378,
+ 1.4354066985645932,
+ 19.154557463672393,
+ 71.45228215767635,
+ 25.677011267048822,
+ 1.294777729823047,
+ 0.4089581304771178,
+ 0.7927519818799547,
+ 0.02653223666755107,
+ 2.3622047244094486,
+ 9.5988824585911,
+ 0.6662225183211192,
+ 0.34423407917383825,
+ 0.3917727717923604,
+ 0.864100549882168,
+ 1.5071590052750565,
+ 1.667277390985709,
+ 0.10111223458038424,
+ 1.4434821230290917,
+ 16.62021417045621,
+ 0.9950248756218906,
+ 6.93950177935943,
+ 0.11296882060551287,
+ 1.8228687166267723,
+ 1.033266129032258,
+ 7.626137303556659,
+ 0.5179282868525896,
+ 1.5492253873063468,
+ 0.02337540906965872,
+ 1.4194722474977253,
+ 1.9707565162110616,
+ 4.474481472850152,
+ 3.470654627539503,
+ 12.5605993829881,
+ 2.558519324986391,
+ 0.25630072618539085,
+ 4.387778543533195,
+ 2.5650557620817844,
+ 26.26599888703395,
+ 0.15493581230633025,
+ 0.41777440182301556,
+ 0.32546786004882017,
+ 0.13966480446927373,
+ 0.4678040726472207,
+ 0.25806451612903225,
+ 2.3509855141296603,
+ 10.429447852760736,
+ 4.7646383467278985,
+ 1.940700808625337,
+ 1.8181818181818181,
+ 1.204335608189482,
+ 0,
+ 0.11132758140829391,
+ 4.089450253649446,
+ 0.12487512487512488,
+ 2.3756163155535632,
+ 0.8353960396039605,
+ 0.3428011753183154,
+ 0,
+ 27.707581227436823,
+ 1.929260450160772,
+ 0.06683002895967921,
+ 1.3157894736842104,
+ 0,
+ 0.5050505050505051,
+ 0,
+ 0.25157232704402516,
+ 0.5828831390389536,
+ 0.14326647564469913,
+ 0.21800062285892244,
+ 0.5346776657500764,
+ 1.643192488262911,
+ 0,
+ 0.17889087656529518,
+ 0,
+ 0.1072961373390558,
+ 1.0944076969332532,
+ 7.064364207221351,
+ 0.14012143858010276,
+ 0.3104625892579944,
+ 2.873239436619718,
+ 11.021936864633494,
+ 2.272727272727273,
+ 5.7926829268292686,
+ 0.3125814014066163,
+ 1.1308830866456012,
+ 7.704654895666131,
+ 0.12738853503184713,
+ 0.09442870632672333,
+ 0.5291005291005291,
+ 1.6828721017202692,
+ 0.1343183344526528,
+ 0,
+ 1.1847998844097674,
+ 54.54545454545454,
+ 0.10209290454313426,
+ 1.3793103448275863,
+ 4.634040710264184,
+ 7.419354838709677
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(251, 154, 153)"
+ },
+ "name": "M1",
+ "text": [
+ 2.5851393188854486,
+ 0,
+ 0.13186813186813187,
+ 0.1314060446780552,
+ 0.21929824561403508,
+ 0.16251354279523295,
+ 0.03830683777054204,
+ 0.6300630063006301,
+ 0,
+ 0.03990422984836393,
+ 0.9746588693957114,
+ 0,
+ 0.07926442612555486,
+ 0,
+ 0.32849712565015055,
+ 0,
+ 0.06618133686300463,
+ 0,
+ 0.0690965624460183,
+ 0,
+ 0.050327126321087066,
+ 0.011392116655274549,
+ 0.052287581699346414,
+ 0,
+ 0,
+ 0,
+ 0.02365744026496333,
+ 0.035373187124159884,
+ 0.034897923573547374,
+ 3.9986671109630127,
+ 0,
+ 0.04782400765184123,
+ 0.07704160246533129,
+ 0.025422651582560064,
+ 19.28391959798995,
+ 0.8928571428571428,
+ 0.261437908496732,
+ 0,
+ 0.06337135614702154,
+ 0,
+ 0.020889910173386254,
+ 8.13850251553714,
+ 0.23664638269100743,
+ 0.4658385093167702,
+ 0,
+ 1.480223246784761,
+ 0.019557989438685704,
+ 0,
+ 0.06736274840013473,
+ 0,
+ 0,
+ 0.12924071082390953,
+ 0.022935779816513763,
+ 0,
+ 0.0806939681258826,
+ 0.14218972171440178,
+ 0,
+ 0.034352456200618345,
+ 0,
+ 0.054945054945054944,
+ 0,
+ 0.27126525867080026,
+ 0.052083333333333336,
+ 0.39126181936746,
+ 0.128783000643915,
+ 0,
+ 0,
+ 0.6922257720979765,
+ 1.7526777020447908,
+ 0.05730659025787965,
+ 0.04602638846271863,
+ 0,
+ 2.0648967551622417,
+ 0,
+ 0,
+ 0.04666355576294914,
+ 0.03567606136282554,
+ 0.056232427366447985,
+ 0.5807460352914898,
+ 0,
+ 0,
+ 2.1576763485477177,
+ 0.0197667523225934,
+ 0,
+ 0.07789678675754626,
+ 0,
+ 0.02653223666755107,
+ 0,
+ 0.9978048293753742,
+ 0,
+ 0,
+ 0,
+ 0.1178318931657502,
+ 2.93896006028636,
+ 0.09160864785635764,
+ 0.36111512350137226,
+ 0,
+ 0.044007627988851404,
+ 0,
+ 0,
+ 0.022593764121102578,
+ 0.055238445958387034,
+ 0.12600806451612903,
+ 0.016542597187758478,
+ 0,
+ 0.29985007496251875,
+ 0.04675081813931744,
+ 0.07279344858962694,
+ 0,
+ 0.3262642740619902,
+ 0,
+ 0.3085059497576025,
+ 0.07258210851025222,
+ 0,
+ 0.13783597518952445,
+ 0.5390334572490706,
+ 0.1669449081803005,
+ 0.04426737494466578,
+ 0.7785795670338017,
+ 0.09764035801464606,
+ 0.034916201117318434,
+ 0.6053935057787562,
+ 0.25806451612903225,
+ 0.04749465685110425,
+ 0,
+ 0.14351320321469577,
+ 1.9676549865229112,
+ 0.3952569169960474,
+ 0.04014452027298274,
+ 0.06901311249137336,
+ 0,
+ 0.01035303861683404,
+ 0,
+ 0,
+ 3.125,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.022276676319893073,
+ 0,
+ 0.10141987829614604,
+ 0.06313131313131314,
+ 0.09263547938860583,
+ 0,
+ 0,
+ 0,
+ 0.06228589224540642,
+ 0.030553009471432937,
+ 1.4671361502347418,
+ 0,
+ 6.350626118067979,
+ 0,
+ 0,
+ 0,
+ 0.15698587127158556,
+ 0.023353573096683792,
+ 0.03104625892579944,
+ 0,
+ 0,
+ 2.272727272727273,
+ 0.1524390243902439,
+ 0.052096900234436055,
+ 0.2827207716614003,
+ 0.2140181915462814,
+ 0,
+ 0.09442870632672333,
+ 0,
+ 0.1869857890800299,
+ 0.2686366689053056,
+ 0,
+ 0,
+ 0.1652892561983471,
+ 0.10209290454313426,
+ 0,
+ 0.3897791251624079,
+ 0.967741935483871
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "11",
+ "110",
+ "111",
+ "112",
+ "113",
+ "114",
+ "115",
+ "116",
+ "119",
+ "120",
+ "121",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "137",
+ "139",
+ "14",
+ "140",
+ "141",
+ "143",
+ "144",
+ "146",
+ "147",
+ "148",
+ "149",
+ "15",
+ "150",
+ "152",
+ "153",
+ "154",
+ "155",
+ "157",
+ "158",
+ "159",
+ "161",
+ "162",
+ "164",
+ "165",
+ "166",
+ "168",
+ "169",
+ "170",
+ "174",
+ "175",
+ "176",
+ "177",
+ "180",
+ "181",
+ "182",
+ "183",
+ "184",
+ "186",
+ "187",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "7",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "85",
+ "87",
+ "88",
+ "89",
+ "90",
+ "91",
+ "94",
+ "95",
+ "98",
+ "99",
+ "104",
+ "108",
+ "135",
+ "18",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "160",
+ "167",
+ "17",
+ "171",
+ "172",
+ "173",
+ "178",
+ "179",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 2.5851393188854486,
+ 0,
+ 0.13186813186813187,
+ 0.1314060446780552,
+ 0.21929824561403508,
+ 0.16251354279523295,
+ 0.03830683777054204,
+ 0.6300630063006301,
+ 0,
+ 0.03990422984836393,
+ 0.9746588693957114,
+ 0,
+ 0.07926442612555486,
+ 0,
+ 0.32849712565015055,
+ 0,
+ 0.06618133686300463,
+ 0,
+ 0.0690965624460183,
+ 0,
+ 0.050327126321087066,
+ 0.011392116655274549,
+ 0.052287581699346414,
+ 0,
+ 0,
+ 0,
+ 0.02365744026496333,
+ 0.035373187124159884,
+ 0.034897923573547374,
+ 3.9986671109630127,
+ 0,
+ 0.04782400765184123,
+ 0.07704160246533129,
+ 0.025422651582560064,
+ 19.28391959798995,
+ 0.8928571428571428,
+ 0.261437908496732,
+ 0,
+ 0.06337135614702154,
+ 0,
+ 0.020889910173386254,
+ 8.13850251553714,
+ 0.23664638269100743,
+ 0.4658385093167702,
+ 0,
+ 1.480223246784761,
+ 0.019557989438685704,
+ 0,
+ 0.06736274840013473,
+ 0,
+ 0,
+ 0.12924071082390953,
+ 0.022935779816513763,
+ 0,
+ 0.0806939681258826,
+ 0.14218972171440178,
+ 0,
+ 0.034352456200618345,
+ 0,
+ 0.054945054945054944,
+ 0,
+ 0.27126525867080026,
+ 0.052083333333333336,
+ 0.39126181936746,
+ 0.128783000643915,
+ 0,
+ 0,
+ 0.6922257720979765,
+ 1.7526777020447908,
+ 0.05730659025787965,
+ 0.04602638846271863,
+ 0,
+ 2.0648967551622417,
+ 0,
+ 0,
+ 0.04666355576294914,
+ 0.03567606136282554,
+ 0.056232427366447985,
+ 0.5807460352914898,
+ 0,
+ 0,
+ 2.1576763485477177,
+ 0.0197667523225934,
+ 0,
+ 0.07789678675754626,
+ 0,
+ 0.02653223666755107,
+ 0,
+ 0.9978048293753742,
+ 0,
+ 0,
+ 0,
+ 0.1178318931657502,
+ 2.93896006028636,
+ 0.09160864785635764,
+ 0.36111512350137226,
+ 0,
+ 0.044007627988851404,
+ 0,
+ 0,
+ 0.022593764121102578,
+ 0.055238445958387034,
+ 0.12600806451612903,
+ 0.016542597187758478,
+ 0,
+ 0.29985007496251875,
+ 0.04675081813931744,
+ 0.07279344858962694,
+ 0,
+ 0.3262642740619902,
+ 0,
+ 0.3085059497576025,
+ 0.07258210851025222,
+ 0,
+ 0.13783597518952445,
+ 0.5390334572490706,
+ 0.1669449081803005,
+ 0.04426737494466578,
+ 0.7785795670338017,
+ 0.09764035801464606,
+ 0.034916201117318434,
+ 0.6053935057787562,
+ 0.25806451612903225,
+ 0.04749465685110425,
+ 0,
+ 0.14351320321469577,
+ 1.9676549865229112,
+ 0.3952569169960474,
+ 0.04014452027298274,
+ 0.06901311249137336,
+ 0,
+ 0.01035303861683404,
+ 0,
+ 0,
+ 3.125,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.022276676319893073,
+ 0,
+ 0.10141987829614604,
+ 0.06313131313131314,
+ 0.09263547938860583,
+ 0,
+ 0,
+ 0,
+ 0.06228589224540642,
+ 0.030553009471432937,
+ 1.4671361502347418,
+ 0,
+ 6.350626118067979,
+ 0,
+ 0,
+ 0,
+ 0.15698587127158556,
+ 0.023353573096683792,
+ 0.03104625892579944,
+ 0,
+ 0,
+ 2.272727272727273,
+ 0.1524390243902439,
+ 0.052096900234436055,
+ 0.2827207716614003,
+ 0.2140181915462814,
+ 0,
+ 0.09442870632672333,
+ 0,
+ 0.1869857890800299,
+ 0.2686366689053056,
+ 0,
+ 0,
+ 0.1652892561983471,
+ 0.10209290454313426,
+ 0,
+ 0.3897791251624079,
+ 0.967741935483871
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(227, 26, 28)"
+ },
+ "name": "M2",
+ "text": [
+ 1.5479876160990713,
+ 0.15991471215351813,
+ 0.04395604395604395,
+ 0.026281208935611037,
+ 0,
+ 0.16251354279523295,
+ 0,
+ 1.4401440144014401,
+ 0,
+ 0.11971268954509177,
+ 0.29239766081871343,
+ 0,
+ 0.03170577045022194,
+ 0,
+ 0.08212428141253764,
+ 0,
+ 0,
+ 0.044444444444444446,
+ 0,
+ 0.03897116134060795,
+ 0,
+ 0.03417634996582365,
+ 0.0784313725490196,
+ 0.03819709702062643,
+ 0,
+ 0,
+ 0,
+ 0.035373187124159884,
+ 0.034897923573547374,
+ 0.049983338887037654,
+ 0,
+ 0.04782400765184123,
+ 0.30816640986132515,
+ 0.012711325791280032,
+ 2.386934673366834,
+ 0.08928571428571429,
+ 0.08714596949891067,
+ 0,
+ 0.12674271229404308,
+ 0,
+ 0.04177982034677251,
+ 0.08878366380585972,
+ 0.03380662609871535,
+ 0.022182786157941437,
+ 0,
+ 0.3397233681145353,
+ 0,
+ 0.01882530120481928,
+ 0.23576961940047153,
+ 0,
+ 0,
+ 0.08077544426494346,
+ 0,
+ 0,
+ 0.0403469840629413,
+ 0,
+ 0.3412969283276451,
+ 0,
+ 0.655307994757536,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2.184545158134985,
+ 0,
+ 0.3492433061699651,
+ 0.05387931034482758,
+ 0.5857294994675186,
+ 0.4868549172346641,
+ 0.2292263610315186,
+ 0,
+ 0,
+ 0.029498525073746312,
+ 0.06268282490597576,
+ 0,
+ 0.031109037175299427,
+ 0,
+ 0,
+ 0.16752289479562207,
+ 0.04349717268377556,
+ 0.08806693086745927,
+ 1.0788381742738589,
+ 0,
+ 0,
+ 0.07789678675754626,
+ 0,
+ 0.10612894667020428,
+ 0,
+ 0.23947315905008978,
+ 0,
+ 0,
+ 0.04897159647404505,
+ 0,
+ 0.22607385079125847,
+ 0,
+ 0.01444460494005489,
+ 0,
+ 0.029338418659234266,
+ 0,
+ 0,
+ 0.11296882060551287,
+ 0.018412815319462345,
+ 0,
+ 0.5128205128205128,
+ 0,
+ 0.12493753123438281,
+ 0,
+ 0.03639672429481347,
+ 0,
+ 0.745746912141692,
+ 0.4514672686230248,
+ 0.37461436756280303,
+ 0.07258210851025222,
+ 0,
+ 0.1837813002526993,
+ 0.966542750929368,
+ 0.4451864218141347,
+ 0.02213368747233289,
+ 0.3038359285985568,
+ 0.5044751830756713,
+ 0.10474860335195531,
+ 0.2201430930104568,
+ 0.8387096774193548,
+ 0.5224412253621468,
+ 0,
+ 1.2629161882893225,
+ 1.8867924528301887,
+ 0.3952569169960474,
+ 0.08028904054596547,
+ 0,
+ 0,
+ 0,
+ 0.04995004995004995,
+ 0.08964589870013448,
+ 0.09282178217821782,
+ 0,
+ 0,
+ 0,
+ 0.029231218941829874,
+ 0,
+ 0.046992481203007516,
+ 0.3042596348884381,
+ 0,
+ 0,
+ 0,
+ 0.04264998578333807,
+ 0,
+ 0.03114294612270321,
+ 0,
+ 0.05868544600938967,
+ 0,
+ 0.08944543828264759,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.35569105691056907,
+ 0,
+ 0.09978380176284717,
+ 1.0165864098448367,
+ 0.06369426751592357,
+ 0.3777148253068933,
+ 0,
+ 0.037397157816005985,
+ 0.0671591672263264,
+ 0,
+ 0.014448779078167894,
+ 1.3774104683195594,
+ 0.05104645227156713,
+ 0,
+ 0.6929406669553919,
+ 4.838709677419355
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "11",
+ "110",
+ "111",
+ "112",
+ "113",
+ "114",
+ "115",
+ "116",
+ "119",
+ "120",
+ "121",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "137",
+ "139",
+ "14",
+ "140",
+ "141",
+ "143",
+ "144",
+ "146",
+ "147",
+ "148",
+ "149",
+ "15",
+ "150",
+ "152",
+ "153",
+ "154",
+ "155",
+ "157",
+ "158",
+ "159",
+ "161",
+ "162",
+ "164",
+ "165",
+ "166",
+ "168",
+ "169",
+ "170",
+ "174",
+ "175",
+ "176",
+ "177",
+ "180",
+ "181",
+ "182",
+ "183",
+ "184",
+ "186",
+ "187",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "7",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "85",
+ "87",
+ "88",
+ "89",
+ "90",
+ "91",
+ "94",
+ "95",
+ "98",
+ "99",
+ "104",
+ "108",
+ "135",
+ "18",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "160",
+ "167",
+ "17",
+ "171",
+ "172",
+ "173",
+ "178",
+ "179",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 1.5479876160990713,
+ 0.15991471215351813,
+ 0.04395604395604395,
+ 0.026281208935611037,
+ 0,
+ 0.16251354279523295,
+ 0,
+ 1.4401440144014401,
+ 0,
+ 0.11971268954509177,
+ 0.29239766081871343,
+ 0,
+ 0.03170577045022194,
+ 0,
+ 0.08212428141253764,
+ 0,
+ 0,
+ 0.044444444444444446,
+ 0,
+ 0.03897116134060795,
+ 0,
+ 0.03417634996582365,
+ 0.0784313725490196,
+ 0.03819709702062643,
+ 0,
+ 0,
+ 0,
+ 0.035373187124159884,
+ 0.034897923573547374,
+ 0.049983338887037654,
+ 0,
+ 0.04782400765184123,
+ 0.30816640986132515,
+ 0.012711325791280032,
+ 2.386934673366834,
+ 0.08928571428571429,
+ 0.08714596949891067,
+ 0,
+ 0.12674271229404308,
+ 0,
+ 0.04177982034677251,
+ 0.08878366380585972,
+ 0.03380662609871535,
+ 0.022182786157941437,
+ 0,
+ 0.3397233681145353,
+ 0,
+ 0.01882530120481928,
+ 0.23576961940047153,
+ 0,
+ 0,
+ 0.08077544426494346,
+ 0,
+ 0,
+ 0.0403469840629413,
+ 0,
+ 0.3412969283276451,
+ 0,
+ 0.655307994757536,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2.184545158134985,
+ 0,
+ 0.3492433061699651,
+ 0.05387931034482758,
+ 0.5857294994675186,
+ 0.4868549172346641,
+ 0.2292263610315186,
+ 0,
+ 0,
+ 0.029498525073746312,
+ 0.06268282490597576,
+ 0,
+ 0.031109037175299427,
+ 0,
+ 0,
+ 0.16752289479562207,
+ 0.04349717268377556,
+ 0.08806693086745927,
+ 1.0788381742738589,
+ 0,
+ 0,
+ 0.07789678675754626,
+ 0,
+ 0.10612894667020428,
+ 0,
+ 0.23947315905008978,
+ 0,
+ 0,
+ 0.04897159647404505,
+ 0,
+ 0.22607385079125847,
+ 0,
+ 0.01444460494005489,
+ 0,
+ 0.029338418659234266,
+ 0,
+ 0,
+ 0.11296882060551287,
+ 0.018412815319462345,
+ 0,
+ 0.5128205128205128,
+ 0,
+ 0.12493753123438281,
+ 0,
+ 0.03639672429481347,
+ 0,
+ 0.745746912141692,
+ 0.4514672686230248,
+ 0.37461436756280303,
+ 0.07258210851025222,
+ 0,
+ 0.1837813002526993,
+ 0.966542750929368,
+ 0.4451864218141347,
+ 0.02213368747233289,
+ 0.3038359285985568,
+ 0.5044751830756713,
+ 0.10474860335195531,
+ 0.2201430930104568,
+ 0.8387096774193548,
+ 0.5224412253621468,
+ 0,
+ 1.2629161882893225,
+ 1.8867924528301887,
+ 0.3952569169960474,
+ 0.08028904054596547,
+ 0,
+ 0,
+ 0,
+ 0.04995004995004995,
+ 0.08964589870013448,
+ 0.09282178217821782,
+ 0,
+ 0,
+ 0,
+ 0.029231218941829874,
+ 0,
+ 0.046992481203007516,
+ 0.3042596348884381,
+ 0,
+ 0,
+ 0,
+ 0.04264998578333807,
+ 0,
+ 0.03114294612270321,
+ 0,
+ 0.05868544600938967,
+ 0,
+ 0.08944543828264759,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.35569105691056907,
+ 0,
+ 0.09978380176284717,
+ 1.0165864098448367,
+ 0.06369426751592357,
+ 0.3777148253068933,
+ 0,
+ 0.037397157816005985,
+ 0.0671591672263264,
+ 0,
+ 0.014448779078167894,
+ 1.3774104683195594,
+ 0.05104645227156713,
+ 0,
+ 0.6929406669553919,
+ 4.838709677419355
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(253, 191, 111)"
+ },
+ "name": "Treg",
+ "text": [
+ 0.07739938080495357,
+ 0.053304904051172705,
+ 0,
+ 0,
+ 0.03132832080200501,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.03990422984836393,
+ 0.09746588693957114,
+ 0.16428068528514433,
+ 0,
+ 0.1340931947703654,
+ 0.027374760470845878,
+ 0,
+ 0,
+ 0,
+ 0.03454828122300915,
+ 0,
+ 0.10065425264217413,
+ 0,
+ 0.026143790849673207,
+ 0,
+ 0.08090614886731393,
+ 0,
+ 0.02365744026496333,
+ 0.14149274849663954,
+ 0,
+ 0.049983338887037654,
+ 0,
+ 0.09564801530368246,
+ 0.15408320493066258,
+ 0,
+ 0.18844221105527637,
+ 0,
+ 0.17429193899782133,
+ 0,
+ 0,
+ 0.20330368487928843,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.07279786459597186,
+ 0,
+ 0.01882530120481928,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.022935779816513763,
+ 0,
+ 0.0403469840629413,
+ 0.020312817387771683,
+ 0.3412969283276451,
+ 0.034352456200618345,
+ 0.2621231979030144,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.21551724137931033,
+ 0.05324813631522897,
+ 0,
+ 0.05730659025787965,
+ 0.0613685179502915,
+ 0,
+ 0,
+ 0.020894274968658588,
+ 0.026954177897574125,
+ 0,
+ 0,
+ 0.09372071227741331,
+ 0,
+ 0.04349717268377556,
+ 0,
+ 0.08298755186721991,
+ 0,
+ 0,
+ 0.03894839337877313,
+ 0,
+ 0.02653223666755107,
+ 0.7874015748031495,
+ 0.6385950908002395,
+ 0.06662225183211193,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.01832172957127153,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.1779359430604982,
+ 0,
+ 0,
+ 0,
+ 0.033085194375516956,
+ 0.0398406374501992,
+ 0,
+ 0.02337540906965872,
+ 0,
+ 0,
+ 0.04660918200885575,
+ 0.02821670428893905,
+ 0.4627589246364037,
+ 0,
+ 0.056955716930086865,
+ 0,
+ 0.01858736059479554,
+ 0,
+ 0.02213368747233289,
+ 0,
+ 0,
+ 0,
+ 0.13758943313153552,
+ 0.12903225806451613,
+ 0.04749465685110425,
+ 0,
+ 0.02870264064293915,
+ 0.05390835579514825,
+ 0,
+ 0.12043356081894822,
+ 0,
+ 0,
+ 0.02070607723366808,
+ 0.04995004995004995,
+ 0,
+ 0.03094059405940594,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.022276676319893073,
+ 0,
+ 0.10141987829614604,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.015276504735716468,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.2145922746781116,
+ 0,
+ 0,
+ 0,
+ 0.03104625892579944,
+ 0,
+ 0,
+ 2.272727272727273,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.037397157816005985,
+ 0,
+ 0,
+ 0.014448779078167894,
+ 0.055096418732782364,
+ 0,
+ 0.03629764065335753,
+ 0.043308791684711995,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "11",
+ "110",
+ "111",
+ "112",
+ "113",
+ "114",
+ "115",
+ "116",
+ "119",
+ "120",
+ "121",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "137",
+ "139",
+ "14",
+ "140",
+ "141",
+ "143",
+ "144",
+ "146",
+ "147",
+ "148",
+ "149",
+ "15",
+ "150",
+ "152",
+ "153",
+ "154",
+ "155",
+ "157",
+ "158",
+ "159",
+ "161",
+ "162",
+ "164",
+ "165",
+ "166",
+ "168",
+ "169",
+ "170",
+ "174",
+ "175",
+ "176",
+ "177",
+ "180",
+ "181",
+ "182",
+ "183",
+ "184",
+ "186",
+ "187",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "7",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "85",
+ "87",
+ "88",
+ "89",
+ "90",
+ "91",
+ "94",
+ "95",
+ "98",
+ "99",
+ "104",
+ "108",
+ "135",
+ "18",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "160",
+ "167",
+ "17",
+ "171",
+ "172",
+ "173",
+ "178",
+ "179",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0.07739938080495357,
+ 0.053304904051172705,
+ 0,
+ 0,
+ 0.03132832080200501,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.03990422984836393,
+ 0.09746588693957114,
+ 0.16428068528514433,
+ 0,
+ 0.1340931947703654,
+ 0.027374760470845878,
+ 0,
+ 0,
+ 0,
+ 0.03454828122300915,
+ 0,
+ 0.10065425264217413,
+ 0,
+ 0.026143790849673207,
+ 0,
+ 0.08090614886731393,
+ 0,
+ 0.02365744026496333,
+ 0.14149274849663954,
+ 0,
+ 0.049983338887037654,
+ 0,
+ 0.09564801530368246,
+ 0.15408320493066258,
+ 0,
+ 0.18844221105527637,
+ 0,
+ 0.17429193899782133,
+ 0,
+ 0,
+ 0.20330368487928843,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.07279786459597186,
+ 0,
+ 0.01882530120481928,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.022935779816513763,
+ 0,
+ 0.0403469840629413,
+ 0.020312817387771683,
+ 0.3412969283276451,
+ 0.034352456200618345,
+ 0.2621231979030144,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.21551724137931033,
+ 0.05324813631522897,
+ 0,
+ 0.05730659025787965,
+ 0.0613685179502915,
+ 0,
+ 0,
+ 0.020894274968658588,
+ 0.026954177897574125,
+ 0,
+ 0,
+ 0.09372071227741331,
+ 0,
+ 0.04349717268377556,
+ 0,
+ 0.08298755186721991,
+ 0,
+ 0,
+ 0.03894839337877313,
+ 0,
+ 0.02653223666755107,
+ 0.7874015748031495,
+ 0.6385950908002395,
+ 0.06662225183211193,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.01832172957127153,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.1779359430604982,
+ 0,
+ 0,
+ 0,
+ 0.033085194375516956,
+ 0.0398406374501992,
+ 0,
+ 0.02337540906965872,
+ 0,
+ 0,
+ 0.04660918200885575,
+ 0.02821670428893905,
+ 0.4627589246364037,
+ 0,
+ 0.056955716930086865,
+ 0,
+ 0.01858736059479554,
+ 0,
+ 0.02213368747233289,
+ 0,
+ 0,
+ 0,
+ 0.13758943313153552,
+ 0.12903225806451613,
+ 0.04749465685110425,
+ 0,
+ 0.02870264064293915,
+ 0.05390835579514825,
+ 0,
+ 0.12043356081894822,
+ 0,
+ 0,
+ 0.02070607723366808,
+ 0.04995004995004995,
+ 0,
+ 0.03094059405940594,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.022276676319893073,
+ 0,
+ 0.10141987829614604,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.015276504735716468,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.2145922746781116,
+ 0,
+ 0,
+ 0,
+ 0.03104625892579944,
+ 0,
+ 0,
+ 2.272727272727273,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.037397157816005985,
+ 0,
+ 0,
+ 0.014448779078167894,
+ 0.055096418732782364,
+ 0,
+ 0.03629764065335753,
+ 0.043308791684711995,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(1.0, 0.4980392156862745, 0.0)"
+ },
+ "name": "IMMUNE_OTHER",
+ "text": [
+ 0.43343653250773995,
+ 1.5991471215351813,
+ 1.054945054945055,
+ 0.9986859395532195,
+ 2.443609022556391,
+ 2.654387865655471,
+ 1.742961118559663,
+ 7.380738073807381,
+ 0.4197610590894414,
+ 1.5163607342378291,
+ 3.8011695906432745,
+ 2.1825862473597746,
+ 0.30120481927710846,
+ 4.793831713040563,
+ 0.6022447303586094,
+ 0.5050505050505051,
+ 0.37502757555702626,
+ 1.2,
+ 6.045949214026603,
+ 1.0522213561964147,
+ 0.9562154001006542,
+ 1.9366598313966734,
+ 6.431372549019608,
+ 2.2536287242169597,
+ 1.132686084142395,
+ 2.515723270440252,
+ 0.63875088715401,
+ 0.3537318712415989,
+ 0.9596928982725527,
+ 0.733088970343219,
+ 1.8956236835946643,
+ 1.3390722142515543,
+ 0.3852080123266564,
+ 0.6737002669378416,
+ 0.37688442211055273,
+ 2.232142857142857,
+ 4.488017429193899,
+ 0.275282526803825,
+ 3.2953105196451205,
+ 0.8640406607369758,
+ 0.6893670357217464,
+ 7.8425569695176085,
+ 0.6423258958755916,
+ 2.085181898846495,
+ 4.419410745233969,
+ 6.867265226886678,
+ 1.388617250146685,
+ 1.8072289156626504,
+ 2.9976423038059954,
+ 0,
+ 1.05006105006105,
+ 2.245557350565428,
+ 0.7110091743119267,
+ 4.40771349862259,
+ 0.685898729070002,
+ 0.7312614259597806,
+ 0.6825938566552902,
+ 0.5839917554105118,
+ 0.1310615989515072,
+ 2.5274725274725274,
+ 0.5313496280552604,
+ 0.019376089905057157,
+ 1.4583333333333333,
+ 2.4779915226605804,
+ 0.7726980038634901,
+ 9.31315483119907,
+ 0.43103448275862066,
+ 0.05324813631522897,
+ 1.7526777020447908,
+ 1.2893982808022924,
+ 0.981896287204664,
+ 2.871717362554317,
+ 1.6814159292035398,
+ 3.238612620142081,
+ 0.40431266846361186,
+ 0.15554518587649713,
+ 3.2108455226542985,
+ 1.3870665417057169,
+ 1.3625195443377263,
+ 1.1309264897781643,
+ 9.64332892998679,
+ 5.892116182572614,
+ 7.96600118600514,
+ 1.7911091929218816,
+ 0.7984420642648491,
+ 1.0192525481313703,
+ 0.6102414433536747,
+ 0.7874015748031495,
+ 4.170824186789064,
+ 0.4663557628247834,
+ 0.09835259404966806,
+ 1.305909239307868,
+ 0.3534956794972506,
+ 2.0723436322532027,
+ 1.2092341517039207,
+ 2.5278058645096055,
+ 1.6655562958027983,
+ 4.987531172069826,
+ 0.6900978976087305,
+ 1.0676156583629894,
+ 1.6041572525982828,
+ 1.067943288528816,
+ 4.057459677419355,
+ 3.391232423490488,
+ 6.135458167330677,
+ 1.9740129935032484,
+ 0.23375409069658717,
+ 4.112829845313922,
+ 0.6993006993006993,
+ 6.688417618270799,
+ 2.5677200902934536,
+ 11.943587483472895,
+ 2.7399745962620217,
+ 0.39869001851060804,
+ 2.3661842407535034,
+ 7.862453531598514,
+ 10.684474123539232,
+ 1.1730854360336431,
+ 5.867831371059628,
+ 3.254678600488202,
+ 1.291899441340782,
+ 5.338470005503577,
+ 0.25806451612903225,
+ 2.7546900973640467,
+ 6.5439672801636,
+ 15.757749712973594,
+ 2.183288409703504,
+ 0.9486166007905139,
+ 2.769971898835809,
+ 0.4830917874396135,
+ 1.057612023378792,
+ 0.8593022051972253,
+ 1.4735264735264737,
+ 1.8825638727028238,
+ 1.8254950495049505,
+ 0.832517140058766,
+ 6.809487375669472,
+ 3.8808664259927803,
+ 1.4907921660333234,
+ 1.70416573847182,
+ 0.9868421052631579,
+ 1.1156186612576064,
+ 1.6203703703703702,
+ 0.7874015748031495,
+ 1.509433962264151,
+ 1.6917827694057437,
+ 2.148997134670487,
+ 0.9342883836810962,
+ 0.4277421326000611,
+ 3.931924882629108,
+ 0.40417649040080833,
+ 0.9838998211091234,
+ 0.1534526854219949,
+ 0.3218884120171674,
+ 2.1286831028262174,
+ 4.23861852433281,
+ 0.39701074264362446,
+ 0.37255510710959333,
+ 0.7887323943661971,
+ 4.5478865703584805,
+ 0,
+ 2.9471544715447155,
+ 0.5209690023443605,
+ 0.7982704141027773,
+ 1.9796682718031033,
+ 0.1910828025477707,
+ 1.2275731822474032,
+ 1.9400352733686066,
+ 4.18848167539267,
+ 0.5372733378106112,
+ 1.3888888888888888,
+ 0.5201560468140443,
+ 10.137741046831957,
+ 0.20418580908626852,
+ 2.0326678765880217,
+ 2.468601126028584,
+ 1.2903225806451613
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "11",
+ "110",
+ "111",
+ "112",
+ "113",
+ "114",
+ "115",
+ "116",
+ "119",
+ "120",
+ "121",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "137",
+ "139",
+ "14",
+ "140",
+ "141",
+ "143",
+ "144",
+ "146",
+ "147",
+ "148",
+ "149",
+ "15",
+ "150",
+ "152",
+ "153",
+ "154",
+ "155",
+ "157",
+ "158",
+ "159",
+ "161",
+ "162",
+ "164",
+ "165",
+ "166",
+ "168",
+ "169",
+ "170",
+ "174",
+ "175",
+ "176",
+ "177",
+ "180",
+ "181",
+ "182",
+ "183",
+ "184",
+ "186",
+ "187",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "7",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "85",
+ "87",
+ "88",
+ "89",
+ "90",
+ "91",
+ "94",
+ "95",
+ "98",
+ "99",
+ "104",
+ "108",
+ "135",
+ "18",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "160",
+ "167",
+ "17",
+ "171",
+ "172",
+ "173",
+ "178",
+ "179",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0.43343653250773995,
+ 1.5991471215351813,
+ 1.054945054945055,
+ 0.9986859395532195,
+ 2.443609022556391,
+ 2.654387865655471,
+ 1.742961118559663,
+ 7.380738073807381,
+ 0.4197610590894414,
+ 1.5163607342378291,
+ 3.8011695906432745,
+ 2.1825862473597746,
+ 0.30120481927710846,
+ 4.793831713040563,
+ 0.6022447303586094,
+ 0.5050505050505051,
+ 0.37502757555702626,
+ 1.2,
+ 6.045949214026603,
+ 1.0522213561964147,
+ 0.9562154001006542,
+ 1.9366598313966734,
+ 6.431372549019608,
+ 2.2536287242169597,
+ 1.132686084142395,
+ 2.515723270440252,
+ 0.63875088715401,
+ 0.3537318712415989,
+ 0.9596928982725527,
+ 0.733088970343219,
+ 1.8956236835946643,
+ 1.3390722142515543,
+ 0.3852080123266564,
+ 0.6737002669378416,
+ 0.37688442211055273,
+ 2.232142857142857,
+ 4.488017429193899,
+ 0.275282526803825,
+ 3.2953105196451205,
+ 0.8640406607369758,
+ 0.6893670357217464,
+ 7.8425569695176085,
+ 0.6423258958755916,
+ 2.085181898846495,
+ 4.419410745233969,
+ 6.867265226886678,
+ 1.388617250146685,
+ 1.8072289156626504,
+ 2.9976423038059954,
+ 0,
+ 1.05006105006105,
+ 2.245557350565428,
+ 0.7110091743119267,
+ 4.40771349862259,
+ 0.685898729070002,
+ 0.7312614259597806,
+ 0.6825938566552902,
+ 0.5839917554105118,
+ 0.1310615989515072,
+ 2.5274725274725274,
+ 0.5313496280552604,
+ 0.019376089905057157,
+ 1.4583333333333333,
+ 2.4779915226605804,
+ 0.7726980038634901,
+ 9.31315483119907,
+ 0.43103448275862066,
+ 0.05324813631522897,
+ 1.7526777020447908,
+ 1.2893982808022924,
+ 0.981896287204664,
+ 2.871717362554317,
+ 1.6814159292035398,
+ 3.238612620142081,
+ 0.40431266846361186,
+ 0.15554518587649713,
+ 3.2108455226542985,
+ 1.3870665417057169,
+ 1.3625195443377263,
+ 1.1309264897781643,
+ 9.64332892998679,
+ 5.892116182572614,
+ 7.96600118600514,
+ 1.7911091929218816,
+ 0.7984420642648491,
+ 1.0192525481313703,
+ 0.6102414433536747,
+ 0.7874015748031495,
+ 4.170824186789064,
+ 0.4663557628247834,
+ 0.09835259404966806,
+ 1.305909239307868,
+ 0.3534956794972506,
+ 2.0723436322532027,
+ 1.2092341517039207,
+ 2.5278058645096055,
+ 1.6655562958027983,
+ 4.987531172069826,
+ 0.6900978976087305,
+ 1.0676156583629894,
+ 1.6041572525982828,
+ 1.067943288528816,
+ 4.057459677419355,
+ 3.391232423490488,
+ 6.135458167330677,
+ 1.9740129935032484,
+ 0.23375409069658717,
+ 4.112829845313922,
+ 0.6993006993006993,
+ 6.688417618270799,
+ 2.5677200902934536,
+ 11.943587483472895,
+ 2.7399745962620217,
+ 0.39869001851060804,
+ 2.3661842407535034,
+ 7.862453531598514,
+ 10.684474123539232,
+ 1.1730854360336431,
+ 5.867831371059628,
+ 3.254678600488202,
+ 1.291899441340782,
+ 5.338470005503577,
+ 0.25806451612903225,
+ 2.7546900973640467,
+ 6.5439672801636,
+ 15.757749712973594,
+ 2.183288409703504,
+ 0.9486166007905139,
+ 2.769971898835809,
+ 0.4830917874396135,
+ 1.057612023378792,
+ 0.8593022051972253,
+ 1.4735264735264737,
+ 1.8825638727028238,
+ 1.8254950495049505,
+ 0.832517140058766,
+ 6.809487375669472,
+ 3.8808664259927803,
+ 1.4907921660333234,
+ 1.70416573847182,
+ 0.9868421052631579,
+ 1.1156186612576064,
+ 1.6203703703703702,
+ 0.7874015748031495,
+ 1.509433962264151,
+ 1.6917827694057437,
+ 2.148997134670487,
+ 0.9342883836810962,
+ 0.4277421326000611,
+ 3.931924882629108,
+ 0.40417649040080833,
+ 0.9838998211091234,
+ 0.1534526854219949,
+ 0.3218884120171674,
+ 2.1286831028262174,
+ 4.23861852433281,
+ 0.39701074264362446,
+ 0.37255510710959333,
+ 0.7887323943661971,
+ 4.5478865703584805,
+ 0,
+ 2.9471544715447155,
+ 0.5209690023443605,
+ 0.7982704141027773,
+ 1.9796682718031033,
+ 0.1910828025477707,
+ 1.2275731822474032,
+ 1.9400352733686066,
+ 4.18848167539267,
+ 0.5372733378106112,
+ 1.3888888888888888,
+ 0.5201560468140443,
+ 10.137741046831957,
+ 0.20418580908626852,
+ 2.0326678765880217,
+ 2.468601126028584,
+ 1.2903225806451613
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(202, 178, 214)"
+ },
+ "name": "CANCER",
+ "text": [
+ 61.62538699690403,
+ 77.23880597014924,
+ 83.34065934065934,
+ 93.66622864651774,
+ 67.57518796992481,
+ 31.79848320693391,
+ 68.22447806933538,
+ 41.4041404140414,
+ 8.976428802066517,
+ 65.0438946528332,
+ 87.62183235867447,
+ 87.23304388641165,
+ 96.92454026632848,
+ 55.17934964800536,
+ 78.0454421023816,
+ 63.13131313131313,
+ 94.61725126847563,
+ 95.82222222222222,
+ 63.085161513214715,
+ 76.34450506625097,
+ 54.10166079516859,
+ 88.12941444520392,
+ 68.99346405228758,
+ 76.54698242933537,
+ 30.663430420711972,
+ 56.49895178197065,
+ 84.50437662644902,
+ 62.7874071453838,
+ 82.0275693596231,
+ 38.97034321892702,
+ 36.438099695764095,
+ 62.26685796269727,
+ 11.864406779661017,
+ 90.78428880132198,
+ 2.198492462311558,
+ 6.3392857142857135,
+ 82.35294117647058,
+ 77.20950449145175,
+ 58.04816223067174,
+ 62.10927573062261,
+ 88.17631084186338,
+ 21.751997632435632,
+ 61.629479377958084,
+ 57.298136645962735,
+ 17.76429809358752,
+ 38.34020868721184,
+ 70.38920398982984,
+ 79.96987951807229,
+ 82.95722465476591,
+ 34.62949376375642,
+ 85.61660561660561,
+ 72.60096930533118,
+ 53.23394495412844,
+ 34.067952249770435,
+ 88.5212830340932,
+ 75.42149096079626,
+ 76.36518771331058,
+ 53.72724149776709,
+ 84.40366972477065,
+ 16.208791208791208,
+ 98.61849096705633,
+ 87.21178066266228,
+ 13.489583333333332,
+ 48.64688620802087,
+ 92.33741146168705,
+ 71.0128055878929,
+ 30.010775862068968,
+ 90.94781682641107,
+ 89.87341772151899,
+ 74.46991404011462,
+ 35.624424670144215,
+ 81.56055167201964,
+ 72.18289085545723,
+ 70.41370664437943,
+ 79.51482479784366,
+ 70.33753305335199,
+ 35.06956831965751,
+ 26.316776007497655,
+ 70.66115702479338,
+ 51.63114397564158,
+ 62.79172170849846,
+ 15.684647302904564,
+ 55.44574026487447,
+ 94.00086318515322,
+ 93.59298928919182,
+ 88.08607021517554,
+ 38.657468824621915,
+ 27.95275590551181,
+ 59.229694671722214,
+ 65.48967355096602,
+ 89.08286206048685,
+ 71.12308194580477,
+ 89.59151610369207,
+ 14.80783722682743,
+ 57.80505679736167,
+ 52.809475660840675,
+ 68.37663779702422,
+ 69.15065277981518,
+ 92.52126464451933,
+ 23.843416370106763,
+ 73.99457749661093,
+ 85.2329221137912,
+ 80.49395161290323,
+ 78.85856079404466,
+ 81.63346613545816,
+ 81.6591704147926,
+ 92.56661991584852,
+ 65.44131028207461,
+ 49.01462174189447,
+ 63.41179212304824,
+ 72.65801354401806,
+ 52.53415601586602,
+ 88.78606423516602,
+ 64.27452655560302,
+ 82.97725706409372,
+ 54.62825278810409,
+ 60.82359488035615,
+ 75.27667109340416,
+ 81.14318268135207,
+ 72.70951993490642,
+ 86.90642458100558,
+ 68.51953769950467,
+ 72.3225806451613,
+ 59.677036333412495,
+ 79.34560327198365,
+ 53.12858783008036,
+ 58.11320754716981,
+ 34.30830039525692,
+ 64.23123243677237,
+ 93.5127674258109,
+ 70.52602282215419,
+ 86.66528626151776,
+ 85.3896103896104,
+ 82.65351860152398,
+ 75.74257425742574,
+ 50.783545543584715,
+ 55.54705432287682,
+ 64.71119133574007,
+ 94.9137679041216,
+ 82.9583426152818,
+ 87.59398496240601,
+ 31.237322515212984,
+ 84.4486531986532,
+ 91.29226493747105,
+ 94.0880503144654,
+ 80.56582314472563,
+ 80.30085959885386,
+ 71.87791965119901,
+ 63.0766880537733,
+ 30.6924882629108,
+ 43.078477601886156,
+ 86.6726296958855,
+ 82.50639386189258,
+ 33.47639484978541,
+ 88.43054720384846,
+ 72.68445839874411,
+ 53.10602522185894,
+ 85.06674945669047,
+ 70.53521126760563,
+ 69.55591225254146,
+ 25,
+ 74.13617886178862,
+ 90.70070330815317,
+ 90.63695326791951,
+ 51.2573568753344,
+ 96.11464968152866,
+ 64.30594900849859,
+ 84.65608465608466,
+ 90.42632759910246,
+ 75.55406312961719,
+ 82.49007936507937,
+ 68.38607137696864,
+ 23.360881542699723,
+ 94.64012251148544,
+ 79.60072595281306,
+ 85.70809874404503,
+ 48.70967741935484
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "11",
+ "110",
+ "111",
+ "112",
+ "113",
+ "114",
+ "115",
+ "116",
+ "119",
+ "120",
+ "121",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "137",
+ "139",
+ "14",
+ "140",
+ "141",
+ "143",
+ "144",
+ "146",
+ "147",
+ "148",
+ "149",
+ "15",
+ "150",
+ "152",
+ "153",
+ "154",
+ "155",
+ "157",
+ "158",
+ "159",
+ "161",
+ "162",
+ "164",
+ "165",
+ "166",
+ "168",
+ "169",
+ "170",
+ "174",
+ "175",
+ "176",
+ "177",
+ "180",
+ "181",
+ "182",
+ "183",
+ "184",
+ "186",
+ "187",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "7",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "85",
+ "87",
+ "88",
+ "89",
+ "90",
+ "91",
+ "94",
+ "95",
+ "98",
+ "99",
+ "104",
+ "108",
+ "135",
+ "18",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "160",
+ "167",
+ "17",
+ "171",
+ "172",
+ "173",
+ "178",
+ "179",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 61.62538699690403,
+ 77.23880597014924,
+ 83.34065934065934,
+ 93.66622864651774,
+ 67.57518796992481,
+ 31.79848320693391,
+ 68.22447806933538,
+ 41.4041404140414,
+ 8.976428802066517,
+ 65.0438946528332,
+ 87.62183235867447,
+ 87.23304388641165,
+ 96.92454026632848,
+ 55.17934964800536,
+ 78.0454421023816,
+ 63.13131313131313,
+ 94.61725126847563,
+ 95.82222222222222,
+ 63.085161513214715,
+ 76.34450506625097,
+ 54.10166079516859,
+ 88.12941444520392,
+ 68.99346405228758,
+ 76.54698242933537,
+ 30.663430420711972,
+ 56.49895178197065,
+ 84.50437662644902,
+ 62.7874071453838,
+ 82.0275693596231,
+ 38.97034321892702,
+ 36.438099695764095,
+ 62.26685796269727,
+ 11.864406779661017,
+ 90.78428880132198,
+ 2.198492462311558,
+ 6.3392857142857135,
+ 82.35294117647058,
+ 77.20950449145175,
+ 58.04816223067174,
+ 62.10927573062261,
+ 88.17631084186338,
+ 21.751997632435632,
+ 61.629479377958084,
+ 57.298136645962735,
+ 17.76429809358752,
+ 38.34020868721184,
+ 70.38920398982984,
+ 79.96987951807229,
+ 82.95722465476591,
+ 34.62949376375642,
+ 85.61660561660561,
+ 72.60096930533118,
+ 53.23394495412844,
+ 34.067952249770435,
+ 88.5212830340932,
+ 75.42149096079626,
+ 76.36518771331058,
+ 53.72724149776709,
+ 84.40366972477065,
+ 16.208791208791208,
+ 98.61849096705633,
+ 87.21178066266228,
+ 13.489583333333332,
+ 48.64688620802087,
+ 92.33741146168705,
+ 71.0128055878929,
+ 30.010775862068968,
+ 90.94781682641107,
+ 89.87341772151899,
+ 74.46991404011462,
+ 35.624424670144215,
+ 81.56055167201964,
+ 72.18289085545723,
+ 70.41370664437943,
+ 79.51482479784366,
+ 70.33753305335199,
+ 35.06956831965751,
+ 26.316776007497655,
+ 70.66115702479338,
+ 51.63114397564158,
+ 62.79172170849846,
+ 15.684647302904564,
+ 55.44574026487447,
+ 94.00086318515322,
+ 93.59298928919182,
+ 88.08607021517554,
+ 38.657468824621915,
+ 27.95275590551181,
+ 59.229694671722214,
+ 65.48967355096602,
+ 89.08286206048685,
+ 71.12308194580477,
+ 89.59151610369207,
+ 14.80783722682743,
+ 57.80505679736167,
+ 52.809475660840675,
+ 68.37663779702422,
+ 69.15065277981518,
+ 92.52126464451933,
+ 23.843416370106763,
+ 73.99457749661093,
+ 85.2329221137912,
+ 80.49395161290323,
+ 78.85856079404466,
+ 81.63346613545816,
+ 81.6591704147926,
+ 92.56661991584852,
+ 65.44131028207461,
+ 49.01462174189447,
+ 63.41179212304824,
+ 72.65801354401806,
+ 52.53415601586602,
+ 88.78606423516602,
+ 64.27452655560302,
+ 82.97725706409372,
+ 54.62825278810409,
+ 60.82359488035615,
+ 75.27667109340416,
+ 81.14318268135207,
+ 72.70951993490642,
+ 86.90642458100558,
+ 68.51953769950467,
+ 72.3225806451613,
+ 59.677036333412495,
+ 79.34560327198365,
+ 53.12858783008036,
+ 58.11320754716981,
+ 34.30830039525692,
+ 64.23123243677237,
+ 93.5127674258109,
+ 70.52602282215419,
+ 86.66528626151776,
+ 85.3896103896104,
+ 82.65351860152398,
+ 75.74257425742574,
+ 50.783545543584715,
+ 55.54705432287682,
+ 64.71119133574007,
+ 94.9137679041216,
+ 82.9583426152818,
+ 87.59398496240601,
+ 31.237322515212984,
+ 84.4486531986532,
+ 91.29226493747105,
+ 94.0880503144654,
+ 80.56582314472563,
+ 80.30085959885386,
+ 71.87791965119901,
+ 63.0766880537733,
+ 30.6924882629108,
+ 43.078477601886156,
+ 86.6726296958855,
+ 82.50639386189258,
+ 33.47639484978541,
+ 88.43054720384846,
+ 72.68445839874411,
+ 53.10602522185894,
+ 85.06674945669047,
+ 70.53521126760563,
+ 69.55591225254146,
+ 25,
+ 74.13617886178862,
+ 90.70070330815317,
+ 90.63695326791951,
+ 51.2573568753344,
+ 96.11464968152866,
+ 64.30594900849859,
+ 84.65608465608466,
+ 90.42632759910246,
+ 75.55406312961719,
+ 82.49007936507937,
+ 68.38607137696864,
+ 23.360881542699723,
+ 94.64012251148544,
+ 79.60072595281306,
+ 85.70809874404503,
+ 48.70967741935484
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(106, 61, 154)"
+ },
+ "name": "αSMA_myCAF",
+ "text": [
+ 6.006191950464396,
+ 1.5991471215351813,
+ 3.5604395604395607,
+ 0.47306176084099866,
+ 0.5325814536340852,
+ 8.992416034669557,
+ 3.466768818234055,
+ 9.27092709270927,
+ 6.603164352599291,
+ 8.419792498004789,
+ 0.09746588693957114,
+ 0.49284205585543295,
+ 0.15852885225110971,
+ 0.10056989607777406,
+ 6.925814399124007,
+ 2.0202020202020203,
+ 0.3529671299360247,
+ 0,
+ 3.161167731905338,
+ 1.3250194855806703,
+ 22.496225465525917,
+ 0.37593984962406013,
+ 0.8627450980392156,
+ 1.2605042016806722,
+ 16.50485436893204,
+ 14.884696016771489,
+ 2.389401466761296,
+ 12.203749557835161,
+ 0.17448961786773687,
+ 2.149283572142619,
+ 18.207348467119118,
+ 19.56001912960306,
+ 55.007704160246526,
+ 1.271132579128003,
+ 4.1457286432160805,
+ 50.44642857142857,
+ 2.6143790849673203,
+ 9.171254708780063,
+ 5.640050697084917,
+ 11.130876747141041,
+ 2.3605598495926468,
+ 36.99319325244155,
+ 25.25354969574036,
+ 2.1960958296362025,
+ 9.272097053726169,
+ 10.070371269109438,
+ 15.822413455896733,
+ 5.779367469879518,
+ 4.445941394408893,
+ 16.654438738077772,
+ 0.2442002442002442,
+ 0.5008077544426494,
+ 13.96788990825688,
+ 10.1010101010101,
+ 0.1613879362517652,
+ 12.512695510867358,
+ 0.3412969283276451,
+ 7.626245276537272,
+ 1.7038007863695939,
+ 66.0989010989011,
+ 0,
+ 1.9182329006006589,
+ 40,
+ 23.214867949135964,
+ 0.7726980038634901,
+ 0.23282887077997672,
+ 0.646551724137931,
+ 0.26624068157614483,
+ 0.2921129503407984,
+ 20.515759312320917,
+ 23.672905799324948,
+ 0.7557150954090308,
+ 2.5958702064896757,
+ 0.25073129962390306,
+ 1.3207547169811322,
+ 0.21776326022709597,
+ 25.615412058508742,
+ 19.66260543580131,
+ 0.05584096493187402,
+ 17.31187472814267,
+ 3.742844561867019,
+ 0.16597510373443983,
+ 1.838307966001186,
+ 0.7768666378938283,
+ 1.8500486854917235,
+ 0.4983012457531144,
+ 0.29185460334306185,
+ 1.574803149606299,
+ 0.15964877270005987,
+ 0.9993337774816788,
+ 0.3688222276862552,
+ 7.280444009141365,
+ 0.8248232521602514,
+ 69.51770911831197,
+ 16.049835104433857,
+ 9.648996099956667,
+ 3.7530535198756385,
+ 1.3495672583247762,
+ 0.4814636494944632,
+ 21.70818505338078,
+ 2.914595571622232,
+ 7.1625851592708525,
+ 3.7298387096774195,
+ 3.854425144747725,
+ 2.8685258964143427,
+ 3.4482758620689653,
+ 0.6778868630201029,
+ 10.191082802547772,
+ 1.5257469802924348,
+ 2.6800279655092054,
+ 7.900677200902935,
+ 3.239312472454826,
+ 0.7439666122300853,
+ 3.3461483696426026,
+ 1.0797151389846085,
+ 24.423791821561338,
+ 0.5564830272676683,
+ 6.219566179725542,
+ 0.7216103304215724,
+ 2.196908055329536,
+ 4.504189944134078,
+ 0.1651073197578426,
+ 8.580645161290322,
+ 7.1954405129422945,
+ 0,
+ 2.3823191733639493,
+ 0.6738544474393532,
+ 31.067193675889328,
+ 11.60176635889201,
+ 0.06901311249137336,
+ 16.587809629835792,
+ 0.2381198881871829,
+ 6.8431568431568435,
+ 0.9861048857014791,
+ 0.8663366336633664,
+ 0.3428011753183154,
+ 16.985462892119358,
+ 0,
+ 0.08769365682548962,
+ 0.08910670527957229,
+ 0,
+ 49.59432048681541,
+ 6.228956228956229,
+ 0.18527095877721167,
+ 0.8805031446540881,
+ 3.4119988626670454,
+ 2.3638968481375358,
+ 13.79632513235752,
+ 21.387106630003057,
+ 6.924882629107981,
+ 5.4563826204109125,
+ 0.5366726296958855,
+ 11.253196930946292,
+ 29.184549356223176,
+ 1.2988574864702345,
+ 1.4128728414442702,
+ 36.47828117702009,
+ 7.295870847562869,
+ 17.464788732394364,
+ 6.046013911182451,
+ 2.272727272727273,
+ 0.1524390243902439,
+ 5.183641573326387,
+ 4.656577415599535,
+ 20.064205457463885,
+ 0.7006369426751593,
+ 24.45703493862134,
+ 9.347442680776014,
+ 1.2341062079281975,
+ 7.118871725990597,
+ 9.1765873015873,
+ 0.9680681982372489,
+ 7.7134986225895315,
+ 0.05104645227156713,
+ 1.0163339382940109,
+ 4.634040710264184,
+ 29.354838709677416
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "11",
+ "110",
+ "111",
+ "112",
+ "113",
+ "114",
+ "115",
+ "116",
+ "119",
+ "120",
+ "121",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "137",
+ "139",
+ "14",
+ "140",
+ "141",
+ "143",
+ "144",
+ "146",
+ "147",
+ "148",
+ "149",
+ "15",
+ "150",
+ "152",
+ "153",
+ "154",
+ "155",
+ "157",
+ "158",
+ "159",
+ "161",
+ "162",
+ "164",
+ "165",
+ "166",
+ "168",
+ "169",
+ "170",
+ "174",
+ "175",
+ "176",
+ "177",
+ "180",
+ "181",
+ "182",
+ "183",
+ "184",
+ "186",
+ "187",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "7",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "85",
+ "87",
+ "88",
+ "89",
+ "90",
+ "91",
+ "94",
+ "95",
+ "98",
+ "99",
+ "104",
+ "108",
+ "135",
+ "18",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "160",
+ "167",
+ "17",
+ "171",
+ "172",
+ "173",
+ "178",
+ "179",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 6.006191950464396,
+ 1.5991471215351813,
+ 3.5604395604395607,
+ 0.47306176084099866,
+ 0.5325814536340852,
+ 8.992416034669557,
+ 3.466768818234055,
+ 9.27092709270927,
+ 6.603164352599291,
+ 8.419792498004789,
+ 0.09746588693957114,
+ 0.49284205585543295,
+ 0.15852885225110971,
+ 0.10056989607777406,
+ 6.925814399124007,
+ 2.0202020202020203,
+ 0.3529671299360247,
+ 0,
+ 3.161167731905338,
+ 1.3250194855806703,
+ 22.496225465525917,
+ 0.37593984962406013,
+ 0.8627450980392156,
+ 1.2605042016806722,
+ 16.50485436893204,
+ 14.884696016771489,
+ 2.389401466761296,
+ 12.203749557835161,
+ 0.17448961786773687,
+ 2.149283572142619,
+ 18.207348467119118,
+ 19.56001912960306,
+ 55.007704160246526,
+ 1.271132579128003,
+ 4.1457286432160805,
+ 50.44642857142857,
+ 2.6143790849673203,
+ 9.171254708780063,
+ 5.640050697084917,
+ 11.130876747141041,
+ 2.3605598495926468,
+ 36.99319325244155,
+ 25.25354969574036,
+ 2.1960958296362025,
+ 9.272097053726169,
+ 10.070371269109438,
+ 15.822413455896733,
+ 5.779367469879518,
+ 4.445941394408893,
+ 16.654438738077772,
+ 0.2442002442002442,
+ 0.5008077544426494,
+ 13.96788990825688,
+ 10.1010101010101,
+ 0.1613879362517652,
+ 12.512695510867358,
+ 0.3412969283276451,
+ 7.626245276537272,
+ 1.7038007863695939,
+ 66.0989010989011,
+ 0,
+ 1.9182329006006589,
+ 40,
+ 23.214867949135964,
+ 0.7726980038634901,
+ 0.23282887077997672,
+ 0.646551724137931,
+ 0.26624068157614483,
+ 0.2921129503407984,
+ 20.515759312320917,
+ 23.672905799324948,
+ 0.7557150954090308,
+ 2.5958702064896757,
+ 0.25073129962390306,
+ 1.3207547169811322,
+ 0.21776326022709597,
+ 25.615412058508742,
+ 19.66260543580131,
+ 0.05584096493187402,
+ 17.31187472814267,
+ 3.742844561867019,
+ 0.16597510373443983,
+ 1.838307966001186,
+ 0.7768666378938283,
+ 1.8500486854917235,
+ 0.4983012457531144,
+ 0.29185460334306185,
+ 1.574803149606299,
+ 0.15964877270005987,
+ 0.9993337774816788,
+ 0.3688222276862552,
+ 7.280444009141365,
+ 0.8248232521602514,
+ 69.51770911831197,
+ 16.049835104433857,
+ 9.648996099956667,
+ 3.7530535198756385,
+ 1.3495672583247762,
+ 0.4814636494944632,
+ 21.70818505338078,
+ 2.914595571622232,
+ 7.1625851592708525,
+ 3.7298387096774195,
+ 3.854425144747725,
+ 2.8685258964143427,
+ 3.4482758620689653,
+ 0.6778868630201029,
+ 10.191082802547772,
+ 1.5257469802924348,
+ 2.6800279655092054,
+ 7.900677200902935,
+ 3.239312472454826,
+ 0.7439666122300853,
+ 3.3461483696426026,
+ 1.0797151389846085,
+ 24.423791821561338,
+ 0.5564830272676683,
+ 6.219566179725542,
+ 0.7216103304215724,
+ 2.196908055329536,
+ 4.504189944134078,
+ 0.1651073197578426,
+ 8.580645161290322,
+ 7.1954405129422945,
+ 0,
+ 2.3823191733639493,
+ 0.6738544474393532,
+ 31.067193675889328,
+ 11.60176635889201,
+ 0.06901311249137336,
+ 16.587809629835792,
+ 0.2381198881871829,
+ 6.8431568431568435,
+ 0.9861048857014791,
+ 0.8663366336633664,
+ 0.3428011753183154,
+ 16.985462892119358,
+ 0,
+ 0.08769365682548962,
+ 0.08910670527957229,
+ 0,
+ 49.59432048681541,
+ 6.228956228956229,
+ 0.18527095877721167,
+ 0.8805031446540881,
+ 3.4119988626670454,
+ 2.3638968481375358,
+ 13.79632513235752,
+ 21.387106630003057,
+ 6.924882629107981,
+ 5.4563826204109125,
+ 0.5366726296958855,
+ 11.253196930946292,
+ 29.184549356223176,
+ 1.2988574864702345,
+ 1.4128728414442702,
+ 36.47828117702009,
+ 7.295870847562869,
+ 17.464788732394364,
+ 6.046013911182451,
+ 2.272727272727273,
+ 0.1524390243902439,
+ 5.183641573326387,
+ 4.656577415599535,
+ 20.064205457463885,
+ 0.7006369426751593,
+ 24.45703493862134,
+ 9.347442680776014,
+ 1.2341062079281975,
+ 7.118871725990597,
+ 9.1765873015873,
+ 0.9680681982372489,
+ 7.7134986225895315,
+ 0.05104645227156713,
+ 1.0163339382940109,
+ 4.634040710264184,
+ 29.354838709677416
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(1.0, 1.0, 0.6)"
+ },
+ "name": "STROMA_OTHER",
+ "text": [
+ 8.204334365325078,
+ 3.8912579957356077,
+ 7.604395604395604,
+ 2.3915900131406045,
+ 4.1040100250626566,
+ 47.724810400866744,
+ 18.904424439762497,
+ 7.110711071107111,
+ 82.3861801743623,
+ 15.283320031923383,
+ 0.29239766081871343,
+ 3.9427364468434636,
+ 0.6024096385542169,
+ 18.739523969158565,
+ 4.51683547768957,
+ 28.28282828282828,
+ 2.294286344584161,
+ 1.1111111111111112,
+ 4.076697184315081,
+ 10.366328916601715,
+ 13.38701560140916,
+ 3.30371383002962,
+ 4.4183006535947715,
+ 9.511077158135981,
+ 29.773462783171524,
+ 15.40880503144654,
+ 8.493021055121835,
+ 7.7467279801910145,
+ 8.131216192636538,
+ 23.60879706764412,
+ 39.316639363444885,
+ 9.660449545671927,
+ 24.65331278890601,
+ 4.004067624253209,
+ 18.40452261306533,
+ 13.750000000000002,
+ 0.4357298474945534,
+ 9.330628803245435,
+ 20.975918884664132,
+ 22.13468869123253,
+ 5.765615207854606,
+ 12.577685705830127,
+ 7.8431372549019605,
+ 12.999112688553682,
+ 60.65857885615251,
+ 19.97088085416161,
+ 3.2270682573831406,
+ 10.466867469879517,
+ 1.5156618390030314,
+ 45.8547322083639,
+ 6.349206349206349,
+ 13.021001615508885,
+ 22.889908256880734,
+ 14.784205693296604,
+ 1.9164817429897114,
+ 6.581352833638025,
+ 9.556313993174061,
+ 20.405358983167297,
+ 9.305373525557012,
+ 12.307692307692308,
+ 0.10626992561105207,
+ 6.878511916295292,
+ 14.322916666666666,
+ 15.128790348875123,
+ 4.443013522215067,
+ 11.874272409778813,
+ 56.35775862068966,
+ 2.1299254526091587,
+ 1.557935735150925,
+ 1.489971346704871,
+ 16.49278919914084,
+ 12.091441526544493,
+ 4.808259587020649,
+ 2.632678646050982,
+ 12.722371967654986,
+ 26.52045419194276,
+ 32.28683553335712,
+ 25.43580131208997,
+ 6.85727049363413,
+ 11.43975641583297,
+ 1.9815059445178336,
+ 0.16597510373443983,
+ 4.605653291164262,
+ 0.49633146309883475,
+ 1.6942551119766307,
+ 3.2842582106455263,
+ 11.223136110374105,
+ 3.149606299212598,
+ 5.807224106964678,
+ 24.117255163224517,
+ 7.892795672485862,
+ 11.68788769180542,
+ 6.009426551453259,
+ 4.672192916352675,
+ 12.678636863319898,
+ 30.680340892676583,
+ 20.00888296691095,
+ 5.867683731846853,
+ 3.1134649333975286,
+ 16.90391459074733,
+ 13.985539990962495,
+ 1.067943288528816,
+ 6.628024193548388,
+ 3.6228287841191067,
+ 6.414342629482071,
+ 5.072463768115942,
+ 4.417952314165498,
+ 13.757961783439491,
+ 33.75715193897012,
+ 3.0062922395711955,
+ 8.154627539503386,
+ 7.073600705156456,
+ 3.411359099981855,
+ 18.4251744268831,
+ 3.3769813921433496,
+ 5.037174721189591,
+ 0.5008347245409015,
+ 12.107127047366092,
+ 4.69046714774022,
+ 10.398698128559806,
+ 4.888268156424581,
+ 13.401210787011559,
+ 8.193548387096774,
+ 8.287817620517691,
+ 2.8629856850715747,
+ 15.355912743972445,
+ 8.679245283018867,
+ 21.027667984189723,
+ 7.226013649136894,
+ 5.106970324361629,
+ 3.9521291399944336,
+ 1.9877834144321358,
+ 2.5474525474525476,
+ 9.816225907664725,
+ 9.498762376237623,
+ 44.0254652301665,
+ 19.204284621270084,
+ 1.7148014440433215,
+ 0.233849751534639,
+ 7.329026509244821,
+ 7.471804511278196,
+ 16.227180527383368,
+ 6.123737373737374,
+ 0.2779064381658175,
+ 2.515723270440252,
+ 11.415979528006824,
+ 13.46704871060172,
+ 11.398318280909374,
+ 8.218759547815461,
+ 41.31455399061033,
+ 49.882115190299764,
+ 2.5044722719141324,
+ 4.143222506393862,
+ 34.12017167381974,
+ 3.2471437161755863,
+ 12.71585557299843,
+ 7.26296123306866,
+ 5.867742936976095,
+ 4.563380281690141,
+ 1.5516318887105405,
+ 13.636363636363635,
+ 14.329268292682926,
+ 1.8233915082052619,
+ 0.6485947114585066,
+ 9.523809523809524,
+ 1.9745222929936306,
+ 6.326723323890462,
+ 0.7936507936507936,
+ 1.5706806282722512,
+ 12.088650100738752,
+ 4.761904761904762,
+ 18.971246929634447,
+ 1.2121212121212122,
+ 0.8167432363450741,
+ 5.916515426497278,
+ 0.043308791684711995,
+ 6.451612903225806
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "11",
+ "110",
+ "111",
+ "112",
+ "113",
+ "114",
+ "115",
+ "116",
+ "119",
+ "120",
+ "121",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "137",
+ "139",
+ "14",
+ "140",
+ "141",
+ "143",
+ "144",
+ "146",
+ "147",
+ "148",
+ "149",
+ "15",
+ "150",
+ "152",
+ "153",
+ "154",
+ "155",
+ "157",
+ "158",
+ "159",
+ "161",
+ "162",
+ "164",
+ "165",
+ "166",
+ "168",
+ "169",
+ "170",
+ "174",
+ "175",
+ "176",
+ "177",
+ "180",
+ "181",
+ "182",
+ "183",
+ "184",
+ "186",
+ "187",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "7",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "85",
+ "87",
+ "88",
+ "89",
+ "90",
+ "91",
+ "94",
+ "95",
+ "98",
+ "99",
+ "104",
+ "108",
+ "135",
+ "18",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "160",
+ "167",
+ "17",
+ "171",
+ "172",
+ "173",
+ "178",
+ "179",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 8.204334365325078,
+ 3.8912579957356077,
+ 7.604395604395604,
+ 2.3915900131406045,
+ 4.1040100250626566,
+ 47.724810400866744,
+ 18.904424439762497,
+ 7.110711071107111,
+ 82.3861801743623,
+ 15.283320031923383,
+ 0.29239766081871343,
+ 3.9427364468434636,
+ 0.6024096385542169,
+ 18.739523969158565,
+ 4.51683547768957,
+ 28.28282828282828,
+ 2.294286344584161,
+ 1.1111111111111112,
+ 4.076697184315081,
+ 10.366328916601715,
+ 13.38701560140916,
+ 3.30371383002962,
+ 4.4183006535947715,
+ 9.511077158135981,
+ 29.773462783171524,
+ 15.40880503144654,
+ 8.493021055121835,
+ 7.7467279801910145,
+ 8.131216192636538,
+ 23.60879706764412,
+ 39.316639363444885,
+ 9.660449545671927,
+ 24.65331278890601,
+ 4.004067624253209,
+ 18.40452261306533,
+ 13.750000000000002,
+ 0.4357298474945534,
+ 9.330628803245435,
+ 20.975918884664132,
+ 22.13468869123253,
+ 5.765615207854606,
+ 12.577685705830127,
+ 7.8431372549019605,
+ 12.999112688553682,
+ 60.65857885615251,
+ 19.97088085416161,
+ 3.2270682573831406,
+ 10.466867469879517,
+ 1.5156618390030314,
+ 45.8547322083639,
+ 6.349206349206349,
+ 13.021001615508885,
+ 22.889908256880734,
+ 14.784205693296604,
+ 1.9164817429897114,
+ 6.581352833638025,
+ 9.556313993174061,
+ 20.405358983167297,
+ 9.305373525557012,
+ 12.307692307692308,
+ 0.10626992561105207,
+ 6.878511916295292,
+ 14.322916666666666,
+ 15.128790348875123,
+ 4.443013522215067,
+ 11.874272409778813,
+ 56.35775862068966,
+ 2.1299254526091587,
+ 1.557935735150925,
+ 1.489971346704871,
+ 16.49278919914084,
+ 12.091441526544493,
+ 4.808259587020649,
+ 2.632678646050982,
+ 12.722371967654986,
+ 26.52045419194276,
+ 32.28683553335712,
+ 25.43580131208997,
+ 6.85727049363413,
+ 11.43975641583297,
+ 1.9815059445178336,
+ 0.16597510373443983,
+ 4.605653291164262,
+ 0.49633146309883475,
+ 1.6942551119766307,
+ 3.2842582106455263,
+ 11.223136110374105,
+ 3.149606299212598,
+ 5.807224106964678,
+ 24.117255163224517,
+ 7.892795672485862,
+ 11.68788769180542,
+ 6.009426551453259,
+ 4.672192916352675,
+ 12.678636863319898,
+ 30.680340892676583,
+ 20.00888296691095,
+ 5.867683731846853,
+ 3.1134649333975286,
+ 16.90391459074733,
+ 13.985539990962495,
+ 1.067943288528816,
+ 6.628024193548388,
+ 3.6228287841191067,
+ 6.414342629482071,
+ 5.072463768115942,
+ 4.417952314165498,
+ 13.757961783439491,
+ 33.75715193897012,
+ 3.0062922395711955,
+ 8.154627539503386,
+ 7.073600705156456,
+ 3.411359099981855,
+ 18.4251744268831,
+ 3.3769813921433496,
+ 5.037174721189591,
+ 0.5008347245409015,
+ 12.107127047366092,
+ 4.69046714774022,
+ 10.398698128559806,
+ 4.888268156424581,
+ 13.401210787011559,
+ 8.193548387096774,
+ 8.287817620517691,
+ 2.8629856850715747,
+ 15.355912743972445,
+ 8.679245283018867,
+ 21.027667984189723,
+ 7.226013649136894,
+ 5.106970324361629,
+ 3.9521291399944336,
+ 1.9877834144321358,
+ 2.5474525474525476,
+ 9.816225907664725,
+ 9.498762376237623,
+ 44.0254652301665,
+ 19.204284621270084,
+ 1.7148014440433215,
+ 0.233849751534639,
+ 7.329026509244821,
+ 7.471804511278196,
+ 16.227180527383368,
+ 6.123737373737374,
+ 0.2779064381658175,
+ 2.515723270440252,
+ 11.415979528006824,
+ 13.46704871060172,
+ 11.398318280909374,
+ 8.218759547815461,
+ 41.31455399061033,
+ 49.882115190299764,
+ 2.5044722719141324,
+ 4.143222506393862,
+ 34.12017167381974,
+ 3.2471437161755863,
+ 12.71585557299843,
+ 7.26296123306866,
+ 5.867742936976095,
+ 4.563380281690141,
+ 1.5516318887105405,
+ 13.636363636363635,
+ 14.329268292682926,
+ 1.8233915082052619,
+ 0.6485947114585066,
+ 9.523809523809524,
+ 1.9745222929936306,
+ 6.326723323890462,
+ 0.7936507936507936,
+ 1.5706806282722512,
+ 12.088650100738752,
+ 4.761904761904762,
+ 18.971246929634447,
+ 1.2121212121212122,
+ 0.8167432363450741,
+ 5.916515426497278,
+ 0.043308791684711995,
+ 6.451612903225806
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(177, 89, 40)"
+ },
+ "name": "ENDOTHELIAL",
+ "text": [
+ 5.185758513931889,
+ 6.982942430703624,
+ 2.6373626373626373,
+ 0.4204993429697766,
+ 3.6654135338345863,
+ 1.895991332611051,
+ 3.6966098448573073,
+ 1.17011701170117,
+ 1.4045850823377461,
+ 2.3543495610534717,
+ 0.9746588693957114,
+ 1.7836188688101384,
+ 0.7609384908053266,
+ 1.6761649346295675,
+ 2.8469750889679712,
+ 1.5151515151515151,
+ 0.7500551511140525,
+ 0.4,
+ 10.139920538953188,
+ 1.2860483242400622,
+ 5.8379466532460995,
+ 2.4948735475051267,
+ 2.1176470588235294,
+ 4.507257448433919,
+ 10.194174757281553,
+ 3.2494758909853245,
+ 1.20652945351313,
+ 1.910152104704634,
+ 3.2804048159134536,
+ 5.1649450183272245,
+ 3.3934004212497073,
+ 4.8302247728359635,
+ 4.468412942989214,
+ 0.7245455701029617,
+ 3.2035175879396984,
+ 6.517857142857143,
+ 1.0021786492374727,
+ 1.303969863807592,
+ 6.2103929024081115,
+ 0.3303684879288437,
+ 1.2325047002297889,
+ 3.2849955608168098,
+ 2.9073698444895197,
+ 16.65927240461402,
+ 4.679376083188909,
+ 8.444552293132734,
+ 2.0731468805006847,
+ 1.1859939759036144,
+ 0.9767598518019536,
+ 1.834189288334556,
+ 1.0256410256410255,
+ 1.1308562197092082,
+ 7.178899082568807,
+ 0.7346189164370982,
+ 0.746419205164414,
+ 2.701604712573634,
+ 5.2047781569965865,
+ 7.591892820336654,
+ 2.0969855832241153,
+ 1.208791208791209,
+ 0.10626992561105207,
+ 2.1313698895562876,
+ 23.802083333333332,
+ 1.793283338767525,
+ 0.38634900193174504,
+ 4.307334109429569,
+ 9.321120689655173,
+ 0.6922257720979765,
+ 1.1684518013631937,
+ 0.40114613180515757,
+ 3.4980055231666154,
+ 1.7759304742112223,
+ 1.710914454277286,
+ 1.2954450480568325,
+ 1.2398921832884098,
+ 1.9132057862809144,
+ 1.9978594363182305,
+ 5.660731021555764,
+ 0.08934554389099844,
+ 13.571117877337974,
+ 0.26420079260237783,
+ 2.0746887966804977,
+ 0.98833761612967,
+ 1.5753129046180405,
+ 0.9737098344693282,
+ 0.6115515288788221,
+ 2.255240116741841,
+ 2.3622047244094486,
+ 3.2727998403512273,
+ 4.663557628247834,
+ 0.7376444553725104,
+ 3.493307215148547,
+ 0.432050274941084,
+ 1.6955538809344386,
+ 8.061561011359473,
+ 2.0078000866676295,
+ 1.1547856984232734,
+ 1.877658794190993,
+ 0.9950248756218906,
+ 26.156583629893237,
+ 1.8978761861726163,
+ 1.325722703001289,
+ 1.4616935483870968,
+ 1.4392059553349876,
+ 0.796812749003984,
+ 0.6746626686656672,
+ 1.496026180458158,
+ 3.0391264786169248,
+ 1.2714558169103625,
+ 2.307154509438359,
+ 2.2573363431151243,
+ 1.8730718378140152,
+ 1.1431682090364725,
+ 3.1895201480848643,
+ 1.8837583275901677,
+ 3.141263940520446,
+ 0.5008347245409015,
+ 2.6781761841522798,
+ 1.3672616786935055,
+ 2.9617575264442633,
+ 1.3966480446927374,
+ 3.6873968079251513,
+ 1.3548387096774193,
+ 3.2771313227261936,
+ 0,
+ 4.104477611940299,
+ 2.533692722371968,
+ 2.6877470355731226,
+ 5.9012444801284625,
+ 0.4830917874396135,
+ 1.5585861397161147,
+ 2.4536701521896678,
+ 2.647352647352647,
+ 1.9273868220528911,
+ 4.672029702970297,
+ 3.232125367286973,
+ 0.6885998469778117,
+ 1.5342960288808665,
+ 1.140017538731365,
+ 4.265983515259523,
+ 0.7518796992481203,
+ 0.7099391480730223,
+ 0.8838383838383838,
+ 4.678091709124595,
+ 0.37735849056603776,
+ 1.6491327836224055,
+ 1.2177650429799427,
+ 1.5882902522578637,
+ 2.9483654139932782,
+ 8.392018779342724,
+ 1.1451667228022904,
+ 0.7155635062611807,
+ 1.8925831202046037,
+ 1.1802575107296138,
+ 0.9861695730607337,
+ 1.2558869701726845,
+ 2.335357309668379,
+ 0.5898789195901893,
+ 2.535211267605634,
+ 7.009095773140716,
+ 43.18181818181818,
+ 2.0325203252032518,
+ 1.3805678562125552,
+ 1.3470813237984367,
+ 4.012841091492777,
+ 0.3184713375796179,
+ 2.927289896128423,
+ 1.8518518518518516,
+ 0.48616305160807777,
+ 1.6789791806581598,
+ 2.083333333333333,
+ 3.22207773443144,
+ 0.8264462809917356,
+ 0.1531393568147014,
+ 3.7023593466424685,
+ 1.3858813339107838,
+ 0.967741935483871
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "11",
+ "110",
+ "111",
+ "112",
+ "113",
+ "114",
+ "115",
+ "116",
+ "119",
+ "120",
+ "121",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "137",
+ "139",
+ "14",
+ "140",
+ "141",
+ "143",
+ "144",
+ "146",
+ "147",
+ "148",
+ "149",
+ "15",
+ "150",
+ "152",
+ "153",
+ "154",
+ "155",
+ "157",
+ "158",
+ "159",
+ "161",
+ "162",
+ "164",
+ "165",
+ "166",
+ "168",
+ "169",
+ "170",
+ "174",
+ "175",
+ "176",
+ "177",
+ "180",
+ "181",
+ "182",
+ "183",
+ "184",
+ "186",
+ "187",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "7",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "85",
+ "87",
+ "88",
+ "89",
+ "90",
+ "91",
+ "94",
+ "95",
+ "98",
+ "99",
+ "104",
+ "108",
+ "135",
+ "18",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "160",
+ "167",
+ "17",
+ "171",
+ "172",
+ "173",
+ "178",
+ "179",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 5.185758513931889,
+ 6.982942430703624,
+ 2.6373626373626373,
+ 0.4204993429697766,
+ 3.6654135338345863,
+ 1.895991332611051,
+ 3.6966098448573073,
+ 1.17011701170117,
+ 1.4045850823377461,
+ 2.3543495610534717,
+ 0.9746588693957114,
+ 1.7836188688101384,
+ 0.7609384908053266,
+ 1.6761649346295675,
+ 2.8469750889679712,
+ 1.5151515151515151,
+ 0.7500551511140525,
+ 0.4,
+ 10.139920538953188,
+ 1.2860483242400622,
+ 5.8379466532460995,
+ 2.4948735475051267,
+ 2.1176470588235294,
+ 4.507257448433919,
+ 10.194174757281553,
+ 3.2494758909853245,
+ 1.20652945351313,
+ 1.910152104704634,
+ 3.2804048159134536,
+ 5.1649450183272245,
+ 3.3934004212497073,
+ 4.8302247728359635,
+ 4.468412942989214,
+ 0.7245455701029617,
+ 3.2035175879396984,
+ 6.517857142857143,
+ 1.0021786492374727,
+ 1.303969863807592,
+ 6.2103929024081115,
+ 0.3303684879288437,
+ 1.2325047002297889,
+ 3.2849955608168098,
+ 2.9073698444895197,
+ 16.65927240461402,
+ 4.679376083188909,
+ 8.444552293132734,
+ 2.0731468805006847,
+ 1.1859939759036144,
+ 0.9767598518019536,
+ 1.834189288334556,
+ 1.0256410256410255,
+ 1.1308562197092082,
+ 7.178899082568807,
+ 0.7346189164370982,
+ 0.746419205164414,
+ 2.701604712573634,
+ 5.2047781569965865,
+ 7.591892820336654,
+ 2.0969855832241153,
+ 1.208791208791209,
+ 0.10626992561105207,
+ 2.1313698895562876,
+ 23.802083333333332,
+ 1.793283338767525,
+ 0.38634900193174504,
+ 4.307334109429569,
+ 9.321120689655173,
+ 0.6922257720979765,
+ 1.1684518013631937,
+ 0.40114613180515757,
+ 3.4980055231666154,
+ 1.7759304742112223,
+ 1.710914454277286,
+ 1.2954450480568325,
+ 1.2398921832884098,
+ 1.9132057862809144,
+ 1.9978594363182305,
+ 5.660731021555764,
+ 0.08934554389099844,
+ 13.571117877337974,
+ 0.26420079260237783,
+ 2.0746887966804977,
+ 0.98833761612967,
+ 1.5753129046180405,
+ 0.9737098344693282,
+ 0.6115515288788221,
+ 2.255240116741841,
+ 2.3622047244094486,
+ 3.2727998403512273,
+ 4.663557628247834,
+ 0.7376444553725104,
+ 3.493307215148547,
+ 0.432050274941084,
+ 1.6955538809344386,
+ 8.061561011359473,
+ 2.0078000866676295,
+ 1.1547856984232734,
+ 1.877658794190993,
+ 0.9950248756218906,
+ 26.156583629893237,
+ 1.8978761861726163,
+ 1.325722703001289,
+ 1.4616935483870968,
+ 1.4392059553349876,
+ 0.796812749003984,
+ 0.6746626686656672,
+ 1.496026180458158,
+ 3.0391264786169248,
+ 1.2714558169103625,
+ 2.307154509438359,
+ 2.2573363431151243,
+ 1.8730718378140152,
+ 1.1431682090364725,
+ 3.1895201480848643,
+ 1.8837583275901677,
+ 3.141263940520446,
+ 0.5008347245409015,
+ 2.6781761841522798,
+ 1.3672616786935055,
+ 2.9617575264442633,
+ 1.3966480446927374,
+ 3.6873968079251513,
+ 1.3548387096774193,
+ 3.2771313227261936,
+ 0,
+ 4.104477611940299,
+ 2.533692722371968,
+ 2.6877470355731226,
+ 5.9012444801284625,
+ 0.4830917874396135,
+ 1.5585861397161147,
+ 2.4536701521896678,
+ 2.647352647352647,
+ 1.9273868220528911,
+ 4.672029702970297,
+ 3.232125367286973,
+ 0.6885998469778117,
+ 1.5342960288808665,
+ 1.140017538731365,
+ 4.265983515259523,
+ 0.7518796992481203,
+ 0.7099391480730223,
+ 0.8838383838383838,
+ 4.678091709124595,
+ 0.37735849056603776,
+ 1.6491327836224055,
+ 1.2177650429799427,
+ 1.5882902522578637,
+ 2.9483654139932782,
+ 8.392018779342724,
+ 1.1451667228022904,
+ 0.7155635062611807,
+ 1.8925831202046037,
+ 1.1802575107296138,
+ 0.9861695730607337,
+ 1.2558869701726845,
+ 2.335357309668379,
+ 0.5898789195901893,
+ 2.535211267605634,
+ 7.009095773140716,
+ 43.18181818181818,
+ 2.0325203252032518,
+ 1.3805678562125552,
+ 1.3470813237984367,
+ 4.012841091492777,
+ 0.3184713375796179,
+ 2.927289896128423,
+ 1.8518518518518516,
+ 0.48616305160807777,
+ 1.6789791806581598,
+ 2.083333333333333,
+ 3.22207773443144,
+ 0.8264462809917356,
+ 0.1531393568147014,
+ 3.7023593466424685,
+ 1.3858813339107838,
+ 0.967741935483871
+ ]
+ }
+ ],
+ "layout": {
+ "barmode": "stack",
+ "plot_bgcolor": "white",
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "Cell subtypes proportions by Patient and tissue type"
+ },
+ "xaxis": {
+ "autorange": true,
+ "linecolor": "black",
+ "range": [
+ -0.5,
+ 176.5
+ ],
+ "type": "category"
+ },
+ "yaxis": {
+ "autorange": true,
+ "linecolor": "black",
+ "range": [
+ 0,
+ 105.26315789473688
+ ],
+ "title": {
+ "text": "Cell count (%)"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 53,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "fig = go.Figure()\n",
+ "title = 'Cell subtypes proportions by Patient and tissue type'\n",
+ "\n",
+ "for cell_subtype in cell_subtypes:\n",
+ " fig.add_trace(\n",
+ " go.Bar(\n",
+ " name=cell_subtype,\n",
+ " x=counts_perc_patients['Patient'],\n",
+ " y=counts_perc_patients[f'{cell_subtype.lower()}_perc'],\n",
+ " text=counts_perc_patients[f'{cell_subtype.lower()}_perc'],\n",
+ " textposition='auto',\n",
+ " marker_color='rgb' + str(cell_subtype_color_dict[cell_subtype])))\n",
+ "\n",
+ "fig.update_layout(\n",
+ " plot_bgcolor='white',\n",
+ " barmode='stack',\n",
+ " title=title,\n",
+ " xaxis=dict(linecolor='black'),\n",
+ " yaxis=dict(title='Cell count (%)', linecolor='black'))\n",
+ "\n",
+ "output_filename = title.replace(\" \", \"_\") + \".png\"\n",
+ "#fig.write_image(output_images_dir + \"/\" + output_filename, scale=1000)\n",
+ "\n",
+ "fig.show()\n",
+ "plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "45841125-32c5-4996-bc6f-3440dc74bcc2",
+ "metadata": {},
+ "source": [
+ "#### V.4.2.3 BY SCENES AND PATIENTS"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "5eb16728-1a84-4624-b2d0-d954667d77cf",
+ "metadata": {},
+ "source": [
+ "!!!!! DD3 !!!!!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "id": "6acfff96-5194-4b24-8ac1-d7ce34f2354c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " dc \n",
+ " b \n",
+ " tcd4 \n",
+ " tcd8 \n",
+ " m1 \n",
+ " m2 \n",
+ " treg \n",
+ " immune_other \n",
+ " cancer \n",
+ " αsma_mycaf \n",
+ " stroma_other \n",
+ " endothelial \n",
+ " Total_cells \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 900.0 \n",
+ " 24.0 \n",
+ " 167.0 \n",
+ " 100.0 \n",
+ " 5.0 \n",
+ " 28.0 \n",
+ " 3981 \n",
+ " 388.0 \n",
+ " 530 \n",
+ " 335 \n",
+ " 6460.0 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 7.0 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 26.0 \n",
+ " 556 \n",
+ " 409.0 \n",
+ " 5103 \n",
+ " 87 \n",
+ " 6194.0 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 190.0 \n",
+ " 6.0 \n",
+ " 2.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 53.0 \n",
+ " 7142 \n",
+ " 100.0 \n",
+ " 315 \n",
+ " 57 \n",
+ " 7867.0 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 4.0 \n",
+ " 0.0 \n",
+ " 32.0 \n",
+ " 7.0 \n",
+ " 7.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 19.0 \n",
+ " 1823 \n",
+ " 747.0 \n",
+ " 232 \n",
+ " 86 \n",
+ " 2958.0 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 38.0 \n",
+ " 0.0 \n",
+ " 983.0 \n",
+ " 258.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 64.0 \n",
+ " 2322 \n",
+ " 1543.0 \n",
+ " 1075 \n",
+ " 228 \n",
+ " 6518.0 \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 26.0 \n",
+ " 23.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 152.0 \n",
+ " 4317 \n",
+ " 40.0 \n",
+ " 640 \n",
+ " 94 \n",
+ " 5293.0 \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " 1.0 \n",
+ " 84.0 \n",
+ " 5.0 \n",
+ " 416.0 \n",
+ " 70.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 57.0 \n",
+ " 2447 \n",
+ " 88.0 \n",
+ " 163 \n",
+ " 58 \n",
+ " 3390.0 \n",
+ " \n",
+ " \n",
+ " 23 \n",
+ " 67.0 \n",
+ " 1.0 \n",
+ " 239.0 \n",
+ " 750.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 155.0 \n",
+ " 3370 \n",
+ " 12.0 \n",
+ " 126 \n",
+ " 62 \n",
+ " 4786.0 \n",
+ " \n",
+ " \n",
+ " 26 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 159.0 \n",
+ " 17.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 15.0 \n",
+ " 2950 \n",
+ " 49.0 \n",
+ " 472 \n",
+ " 46 \n",
+ " 3710.0 \n",
+ " \n",
+ " \n",
+ " 27 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 45.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 10.0 \n",
+ " 4522 \n",
+ " 14.0 \n",
+ " 1705 \n",
+ " 123 \n",
+ " 6429.0 \n",
+ " \n",
+ " \n",
+ " 28 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 26.0 \n",
+ " 23.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 90.0 \n",
+ " 983 \n",
+ " 718.0 \n",
+ " 905 \n",
+ " 56 \n",
+ " 2803.0 \n",
+ " \n",
+ " \n",
+ " 30 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 986.0 \n",
+ " 148.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 5.0 \n",
+ " 74.0 \n",
+ " 1404 \n",
+ " 1049.0 \n",
+ " 1357 \n",
+ " 302 \n",
+ " 5335.0 \n",
+ " \n",
+ " \n",
+ " 32 \n",
+ " 30.0 \n",
+ " 16.0 \n",
+ " 1137.0 \n",
+ " 628.0 \n",
+ " 52.0 \n",
+ " 15.0 \n",
+ " 0.0 \n",
+ " 122.0 \n",
+ " 6327 \n",
+ " 5.0 \n",
+ " 614 \n",
+ " 8 \n",
+ " 8954.0 \n",
+ " \n",
+ " \n",
+ " 33 \n",
+ " 14.0 \n",
+ " 0.0 \n",
+ " 64.0 \n",
+ " 33.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 26.0 \n",
+ " 1187 \n",
+ " 398.0 \n",
+ " 263 \n",
+ " 312 \n",
+ " 2299.0 \n",
+ " \n",
+ " \n",
+ " 34 \n",
+ " 19.0 \n",
+ " 0.0 \n",
+ " 34.0 \n",
+ " 435.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 219.0 \n",
+ " 1426 \n",
+ " 85.0 \n",
+ " 45 \n",
+ " 6 \n",
+ " 2271.0 \n",
+ " \n",
+ " \n",
+ " 35 \n",
+ " 13.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 861.0 \n",
+ " 26.0 \n",
+ " 13.0 \n",
+ " 1.0 \n",
+ " 71.0 \n",
+ " 189 \n",
+ " 2.0 \n",
+ " 2 \n",
+ " 25 \n",
+ " 1205.0 \n",
+ " \n",
+ " \n",
+ " 36 \n",
+ " 107.0 \n",
+ " 0.0 \n",
+ " 68.0 \n",
+ " 1299.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 403.0 \n",
+ " 2805 \n",
+ " 93.0 \n",
+ " 233 \n",
+ " 50 \n",
+ " 5059.0 \n",
+ " \n",
+ " \n",
+ " 37 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 60.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 83.0 \n",
+ " 4356 \n",
+ " 36.0 \n",
+ " 23 \n",
+ " 73 \n",
+ " 4634.0 \n",
+ " \n",
+ " \n",
+ " 38 \n",
+ " 4.0 \n",
+ " 1.0 \n",
+ " 20.0 \n",
+ " 21.0 \n",
+ " 4.0 \n",
+ " 4.0 \n",
+ " 2.0 \n",
+ " 41.0 \n",
+ " 4806 \n",
+ " 95.0 \n",
+ " 87 \n",
+ " 50 \n",
+ " 5135.0 \n",
+ " \n",
+ " \n",
+ " 39 \n",
+ " 11.0 \n",
+ " 0.0 \n",
+ " 241.0 \n",
+ " 35.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 45.0 \n",
+ " 3889 \n",
+ " 22.0 \n",
+ " 145 \n",
+ " 27 \n",
+ " 4415.0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 31.0 \n",
+ " 2.0 \n",
+ " 1730.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 4.0 \n",
+ " 1.0 \n",
+ " 23.0 \n",
+ " 1457 \n",
+ " 11.0 \n",
+ " 423 \n",
+ " 85 \n",
+ " 3769.0 \n",
+ " \n",
+ " \n",
+ " 41 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 153.0 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 2.0 \n",
+ " 71 \n",
+ " 4.0 \n",
+ " 8 \n",
+ " 6 \n",
+ " 254.0 \n",
+ " \n",
+ " \n",
+ " 42 \n",
+ " 50.0 \n",
+ " 0.0 \n",
+ " 746.0 \n",
+ " 481.0 \n",
+ " 50.0 \n",
+ " 12.0 \n",
+ " 32.0 \n",
+ " 209.0 \n",
+ " 2968 \n",
+ " 8.0 \n",
+ " 291 \n",
+ " 164 \n",
+ " 5011.0 \n",
+ " \n",
+ " \n",
+ " 43 \n",
+ " 9.0 \n",
+ " 0.0 \n",
+ " 44.0 \n",
+ " 10.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 7.0 \n",
+ " 983 \n",
+ " 15.0 \n",
+ " 362 \n",
+ " 70 \n",
+ " 1501.0 \n",
+ " \n",
+ " \n",
+ " 44 \n",
+ " 12.0 \n",
+ " 0.0 \n",
+ " 48.0 \n",
+ " 14.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 3623 \n",
+ " 15.0 \n",
+ " 321 \n",
+ " 30 \n",
+ " 4067.0 \n",
+ " \n",
+ " \n",
+ " 45 \n",
+ " 9.0 \n",
+ " 0.0 \n",
+ " 277.0 \n",
+ " 24.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 80.0 \n",
+ " 4357 \n",
+ " 446.0 \n",
+ " 716 \n",
+ " 214 \n",
+ " 6126.0 \n",
+ " \n",
+ " \n",
+ " 46 \n",
+ " 9.0 \n",
+ " 0.0 \n",
+ " 37.0 \n",
+ " 22.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 9.0 \n",
+ " 2281 \n",
+ " 21.0 \n",
+ " 153 \n",
+ " 11 \n",
+ " 2546.0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 66.0 \n",
+ " 40.0 \n",
+ " 78.0 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 55.0 \n",
+ " 393 \n",
+ " 1845.0 \n",
+ " 124 \n",
+ " 45 \n",
+ " 2654.0 \n",
+ " \n",
+ " \n",
+ " 50 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 130.0 \n",
+ " 91.0 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 66.0 \n",
+ " 3155 \n",
+ " 876.0 \n",
+ " 692 \n",
+ " 440 \n",
+ " 5458.0 \n",
+ " \n",
+ " \n",
+ " 52 \n",
+ " 37.0 \n",
+ " 0.0 \n",
+ " 91.0 \n",
+ " 7.0 \n",
+ " 25.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 175.0 \n",
+ " 3656 \n",
+ " 668.0 \n",
+ " 2124 \n",
+ " 139 \n",
+ " 6923.0 \n",
+ " \n",
+ " \n",
+ " 53 \n",
+ " 144.0 \n",
+ " 0.0 \n",
+ " 18.0 \n",
+ " 65.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 75.0 \n",
+ " 3079 \n",
+ " 169.0 \n",
+ " 901 \n",
+ " 52 \n",
+ " 4503.0 \n",
+ " \n",
+ " \n",
+ " 54 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 1133.0 \n",
+ " 3.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 340.0 \n",
+ " 4714 \n",
+ " 92.0 \n",
+ " 400 \n",
+ " 128 \n",
+ " 6817.0 \n",
+ " \n",
+ " \n",
+ " 57 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 69.0 \n",
+ " 62.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 43.0 \n",
+ " 5765 \n",
+ " 30.0 \n",
+ " 194 \n",
+ " 62 \n",
+ " 6231.0 \n",
+ " \n",
+ " \n",
+ " 58 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 17.0 \n",
+ " 39.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 6.0 \n",
+ " 134 \n",
+ " 122.0 \n",
+ " 95 \n",
+ " 147 \n",
+ " 562.0 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 235.0 \n",
+ " 5.0 \n",
+ " 1.0 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 71.0 \n",
+ " 3275 \n",
+ " 129.0 \n",
+ " 619 \n",
+ " 84 \n",
+ " 4426.0 \n",
+ " \n",
+ " \n",
+ " 63 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 117.0 \n",
+ " 99.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 58.0 \n",
+ " 4629 \n",
+ " 389.0 \n",
+ " 58 \n",
+ " 72 \n",
+ " 5431.0 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 184.0 \n",
+ " 31.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 11.0 \n",
+ " 771 \n",
+ " 24.0 \n",
+ " 531 \n",
+ " 20 \n",
+ " 1573.0 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 704.0 \n",
+ " 18.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 28.0 \n",
+ " 4514 \n",
+ " 235.0 \n",
+ " 1294 \n",
+ " 224 \n",
+ " 7023.0 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 0.0 \n",
+ " 27.0 \n",
+ " 328.0 \n",
+ " 395.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 83.0 \n",
+ " 8371 \n",
+ " 23.0 \n",
+ " 192 \n",
+ " 237 \n",
+ " 9659.0 \n",
+ " \n",
+ " \n",
+ " 25 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 5.0 \n",
+ " 53.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 42.0 \n",
+ " 1844 \n",
+ " 22.0 \n",
+ " 219 \n",
+ " 43 \n",
+ " 2231.0 \n",
+ " \n",
+ " \n",
+ " 29 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 105.0 \n",
+ " 27.0 \n",
+ " 101.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 59.0 \n",
+ " 2448 \n",
+ " 28.0 \n",
+ " 307 \n",
+ " 151 \n",
+ " 3232.0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 6.0 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 17.0 \n",
+ " 1037 \n",
+ " 7.0 \n",
+ " 899 \n",
+ " 66 \n",
+ " 2042.0 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 318.0 \n",
+ " 6.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 153.0 \n",
+ " 7448 \n",
+ " 8.0 \n",
+ " 658 \n",
+ " 383 \n",
+ " 8978.0 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 39.0 \n",
+ " 28.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 21.0 \n",
+ " 1864 \n",
+ " 0.0 \n",
+ " 159 \n",
+ " 16 \n",
+ " 2128.0 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 45.0 \n",
+ " 41.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 119.0 \n",
+ " 5667 \n",
+ " 240.0 \n",
+ " 803 \n",
+ " 116 \n",
+ " 7034.0 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 220.0 \n",
+ " 35.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 28.0 \n",
+ " 4129 \n",
+ " 1400.0 \n",
+ " 538 \n",
+ " 193 \n",
+ " 6546.0 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 234.0 \n",
+ " 91.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 177.0 \n",
+ " 7353 \n",
+ " 108.0 \n",
+ " 270 \n",
+ " 82 \n",
+ " 8315.0 \n",
+ " \n",
+ " \n",
+ " 24 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 45.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 27.0 \n",
+ " 463 \n",
+ " 9.0 \n",
+ " 81 \n",
+ " 8 \n",
+ " 637.0 \n",
+ " \n",
+ " \n",
+ " 40 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 11.0 \n",
+ " 6.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 17.0 \n",
+ " 2274 \n",
+ " 1562.0 \n",
+ " 311 \n",
+ " 100 \n",
+ " 4282.0 \n",
+ " \n",
+ " \n",
+ " 47 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 14.0 \n",
+ " 10.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 12.0 \n",
+ " 2740 \n",
+ " 235.0 \n",
+ " 189 \n",
+ " 19 \n",
+ " 3221.0 \n",
+ " \n",
+ " \n",
+ " 48 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 22.0 \n",
+ " 51.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 14.0 \n",
+ " 1252 \n",
+ " 310.0 \n",
+ " 81 \n",
+ " 45 \n",
+ " 1775.0 \n",
+ " \n",
+ " \n",
+ " 49 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 5.0 \n",
+ " 206.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 85.0 \n",
+ " 1300 \n",
+ " 113.0 \n",
+ " 29 \n",
+ " 131 \n",
+ " 1869.0 \n",
+ " \n",
+ " \n",
+ " 51 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 11 \n",
+ " 1.0 \n",
+ " 6 \n",
+ " 19 \n",
+ " 44.0 \n",
+ " \n",
+ " \n",
+ " 55 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 114.0 \n",
+ " 3.0 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 58.0 \n",
+ " 1459 \n",
+ " 3.0 \n",
+ " 282 \n",
+ " 40 \n",
+ " 1968.0 \n",
+ " \n",
+ " \n",
+ " 56 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 12.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 20.0 \n",
+ " 3482 \n",
+ " 199.0 \n",
+ " 70 \n",
+ " 53 \n",
+ " 3839.0 \n",
+ " \n",
+ " \n",
+ " 59 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 24.0 \n",
+ " 68.0 \n",
+ " 17.0 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 48.0 \n",
+ " 5450 \n",
+ " 280.0 \n",
+ " 39 \n",
+ " 81 \n",
+ " 6013.0 \n",
+ " \n",
+ " \n",
+ " 61 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 79.0 \n",
+ " 144.0 \n",
+ " 4.0 \n",
+ " 19.0 \n",
+ " 0.0 \n",
+ " 37.0 \n",
+ " 958 \n",
+ " 375.0 \n",
+ " 178 \n",
+ " 75 \n",
+ " 1869.0 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 465.0 \n",
+ " 82.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 36.0 \n",
+ " 4733 \n",
+ " 67.0 \n",
+ " 1313 \n",
+ " 223 \n",
+ " 6921.0 \n",
+ " \n",
+ " \n",
+ " 60 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 107.0 \n",
+ " 9.0 \n",
+ " 16.0 \n",
+ " 1.0 \n",
+ " 57.0 \n",
+ " 1979 \n",
+ " 107.0 \n",
+ " 1 \n",
+ " 32 \n",
+ " 2309.0 \n",
+ " \n",
+ " \n",
+ " 62 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 23.0 \n",
+ " 3.0 \n",
+ " 15.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 151 \n",
+ " 91.0 \n",
+ " 20 \n",
+ " 3 \n",
+ " 310.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " dc b tcd4 tcd8 m1 m2 treg immune_other cancer \\\n",
+ "10 2.0 0.0 900.0 24.0 167.0 100.0 5.0 28.0 3981 \n",
+ "11 1.0 0.0 7.0 5.0 0.0 0.0 0.0 26.0 556 \n",
+ "14 1.0 0.0 190.0 6.0 2.0 1.0 0.0 53.0 7142 \n",
+ "15 4.0 0.0 32.0 7.0 7.0 1.0 0.0 19.0 1823 \n",
+ "19 38.0 0.0 983.0 258.0 3.0 0.0 4.0 64.0 2322 \n",
+ "20 1.0 0.0 26.0 23.0 0.0 0.0 0.0 152.0 4317 \n",
+ "22 1.0 84.0 5.0 416.0 70.0 1.0 0.0 57.0 2447 \n",
+ "23 67.0 1.0 239.0 750.0 0.0 3.0 1.0 155.0 3370 \n",
+ "26 1.0 0.0 159.0 17.0 0.0 0.0 1.0 15.0 2950 \n",
+ "27 5.0 0.0 45.0 0.0 3.0 2.0 0.0 10.0 4522 \n",
+ "28 1.0 0.0 26.0 23.0 1.0 0.0 0.0 90.0 983 \n",
+ "30 7.0 0.0 986.0 148.0 3.0 0.0 5.0 74.0 1404 \n",
+ "32 30.0 16.0 1137.0 628.0 52.0 15.0 0.0 122.0 6327 \n",
+ "33 14.0 0.0 64.0 33.0 0.0 1.0 1.0 26.0 1187 \n",
+ "34 19.0 0.0 34.0 435.0 0.0 2.0 0.0 219.0 1426 \n",
+ "35 13.0 0.0 2.0 861.0 26.0 13.0 1.0 71.0 189 \n",
+ "36 107.0 0.0 68.0 1299.0 1.0 0.0 0.0 403.0 2805 \n",
+ "37 2.0 0.0 1.0 60.0 0.0 0.0 0.0 83.0 4356 \n",
+ "38 4.0 1.0 20.0 21.0 4.0 4.0 2.0 41.0 4806 \n",
+ "39 11.0 0.0 241.0 35.0 0.0 0.0 0.0 45.0 3889 \n",
+ "4 31.0 2.0 1730.0 1.0 1.0 4.0 1.0 23.0 1457 \n",
+ "41 2.0 0.0 153.0 6.0 0.0 0.0 2.0 2.0 71 \n",
+ "42 50.0 0.0 746.0 481.0 50.0 12.0 32.0 209.0 2968 \n",
+ "43 9.0 0.0 44.0 10.0 0.0 0.0 1.0 7.0 983 \n",
+ "44 12.0 0.0 48.0 14.0 0.0 0.0 0.0 4.0 3623 \n",
+ "45 9.0 0.0 277.0 24.0 0.0 3.0 0.0 80.0 4357 \n",
+ "46 9.0 0.0 37.0 22.0 3.0 0.0 0.0 9.0 2281 \n",
+ "5 1.0 1.0 66.0 40.0 78.0 6.0 0.0 55.0 393 \n",
+ "50 2.0 0.0 130.0 91.0 5.0 0.0 1.0 66.0 3155 \n",
+ "52 37.0 0.0 91.0 7.0 25.0 1.0 0.0 175.0 3656 \n",
+ "53 144.0 0.0 18.0 65.0 0.0 0.0 0.0 75.0 3079 \n",
+ "54 3.0 0.0 2.0 1133.0 3.0 2.0 0.0 340.0 4714 \n",
+ "57 6.0 0.0 69.0 62.0 0.0 0.0 0.0 43.0 5765 \n",
+ "58 1.0 0.0 17.0 39.0 0.0 0.0 1.0 6.0 134 \n",
+ "6 2.0 0.0 235.0 5.0 1.0 5.0 0.0 71.0 3275 \n",
+ "63 5.0 0.0 117.0 99.0 3.0 1.0 0.0 58.0 4629 \n",
+ "7 1.0 0.0 184.0 31.0 0.0 0.0 0.0 11.0 771 \n",
+ "8 2.0 0.0 704.0 18.0 0.0 0.0 4.0 28.0 4514 \n",
+ "18 0.0 27.0 328.0 395.0 1.0 0.0 2.0 83.0 8371 \n",
+ "25 0.0 1.0 5.0 53.0 0.0 2.0 0.0 42.0 1844 \n",
+ "29 0.0 2.0 105.0 27.0 101.0 3.0 1.0 59.0 2448 \n",
+ "3 0.0 3.0 6.0 7.0 0.0 0.0 0.0 17.0 1037 \n",
+ "12 0.0 0.0 318.0 6.0 2.0 0.0 2.0 153.0 7448 \n",
+ "13 0.0 0.0 39.0 28.0 0.0 1.0 0.0 21.0 1864 \n",
+ "16 0.0 0.0 45.0 41.0 0.0 3.0 0.0 119.0 5667 \n",
+ "17 0.0 0.0 220.0 35.0 2.0 0.0 1.0 28.0 4129 \n",
+ "21 0.0 0.0 234.0 91.0 0.0 0.0 0.0 177.0 7353 \n",
+ "24 0.0 0.0 3.0 45.0 1.0 0.0 0.0 27.0 463 \n",
+ "40 0.0 0.0 11.0 6.0 1.0 0.0 0.0 17.0 2274 \n",
+ "47 0.0 0.0 14.0 10.0 1.0 0.0 1.0 12.0 2740 \n",
+ "48 0.0 0.0 22.0 51.0 0.0 0.0 0.0 14.0 1252 \n",
+ "49 0.0 0.0 5.0 206.0 0.0 0.0 0.0 85.0 1300 \n",
+ "51 0.0 0.0 4.0 1.0 1.0 0.0 1.0 0.0 11 \n",
+ "55 0.0 0.0 2.0 114.0 3.0 7.0 0.0 58.0 1459 \n",
+ "56 0.0 0.0 1.0 12.0 2.0 0.0 0.0 20.0 3482 \n",
+ "59 0.0 0.0 24.0 68.0 17.0 6.0 0.0 48.0 5450 \n",
+ "61 0.0 0.0 79.0 144.0 4.0 19.0 0.0 37.0 958 \n",
+ "9 0.0 0.0 465.0 82.0 0.0 1.0 1.0 36.0 4733 \n",
+ "60 0.0 0.0 0.0 107.0 9.0 16.0 1.0 57.0 1979 \n",
+ "62 0.0 0.0 0.0 23.0 3.0 15.0 0.0 4.0 151 \n",
+ "\n",
+ " αsma_mycaf stroma_other endothelial Total_cells \n",
+ "10 388.0 530 335 6460.0 \n",
+ "11 409.0 5103 87 6194.0 \n",
+ "14 100.0 315 57 7867.0 \n",
+ "15 747.0 232 86 2958.0 \n",
+ "19 1543.0 1075 228 6518.0 \n",
+ "20 40.0 640 94 5293.0 \n",
+ "22 88.0 163 58 3390.0 \n",
+ "23 12.0 126 62 4786.0 \n",
+ "26 49.0 472 46 3710.0 \n",
+ "27 14.0 1705 123 6429.0 \n",
+ "28 718.0 905 56 2803.0 \n",
+ "30 1049.0 1357 302 5335.0 \n",
+ "32 5.0 614 8 8954.0 \n",
+ "33 398.0 263 312 2299.0 \n",
+ "34 85.0 45 6 2271.0 \n",
+ "35 2.0 2 25 1205.0 \n",
+ "36 93.0 233 50 5059.0 \n",
+ "37 36.0 23 73 4634.0 \n",
+ "38 95.0 87 50 5135.0 \n",
+ "39 22.0 145 27 4415.0 \n",
+ "4 11.0 423 85 3769.0 \n",
+ "41 4.0 8 6 254.0 \n",
+ "42 8.0 291 164 5011.0 \n",
+ "43 15.0 362 70 1501.0 \n",
+ "44 15.0 321 30 4067.0 \n",
+ "45 446.0 716 214 6126.0 \n",
+ "46 21.0 153 11 2546.0 \n",
+ "5 1845.0 124 45 2654.0 \n",
+ "50 876.0 692 440 5458.0 \n",
+ "52 668.0 2124 139 6923.0 \n",
+ "53 169.0 901 52 4503.0 \n",
+ "54 92.0 400 128 6817.0 \n",
+ "57 30.0 194 62 6231.0 \n",
+ "58 122.0 95 147 562.0 \n",
+ "6 129.0 619 84 4426.0 \n",
+ "63 389.0 58 72 5431.0 \n",
+ "7 24.0 531 20 1573.0 \n",
+ "8 235.0 1294 224 7023.0 \n",
+ "18 23.0 192 237 9659.0 \n",
+ "25 22.0 219 43 2231.0 \n",
+ "29 28.0 307 151 3232.0 \n",
+ "3 7.0 899 66 2042.0 \n",
+ "12 8.0 658 383 8978.0 \n",
+ "13 0.0 159 16 2128.0 \n",
+ "16 240.0 803 116 7034.0 \n",
+ "17 1400.0 538 193 6546.0 \n",
+ "21 108.0 270 82 8315.0 \n",
+ "24 9.0 81 8 637.0 \n",
+ "40 1562.0 311 100 4282.0 \n",
+ "47 235.0 189 19 3221.0 \n",
+ "48 310.0 81 45 1775.0 \n",
+ "49 113.0 29 131 1869.0 \n",
+ "51 1.0 6 19 44.0 \n",
+ "55 3.0 282 40 1968.0 \n",
+ "56 199.0 70 53 3839.0 \n",
+ "59 280.0 39 81 6013.0 \n",
+ "61 375.0 178 75 1869.0 \n",
+ "9 67.0 1313 223 6921.0 \n",
+ "60 107.0 1 32 2309.0 \n",
+ "62 91.0 20 3 310.0 "
+ ]
+ },
+ "execution_count": 54,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# SƩlectionner les valeurs de 'Sample_ID' spƩcifiƩes\n",
+ "allowed_sample_ids = ['DD3S1.csv', 'DD3S2.csv', 'DD3S3.csv']\n",
+ "\n",
+ "df_filtered = df[df['Sample_ID'].isin(allowed_sample_ids)]\n",
+ "df_filtered\n",
+ "\n",
+ "# Compter par numƩro de patiente\n",
+ "patient_counts = {}\n",
+ "\n",
+ "# Boucle sur les sous-types de cellules pour compter les Ʃchantillons correspondants par patient\n",
+ "for subtype in cell_subtypes:\n",
+ " patient_counts[subtype.lower()] = pd.DataFrame({subtype.lower():\n",
+ " df_filtered.loc[\n",
+ " df_filtered['cell_subtype'] == subtype, 'Patient'].value_counts()\n",
+ " }).sort_index()\n",
+ "\n",
+ "# ConcatƩnation des counts des sous-types de cellules en un seul DataFrame\n",
+ "counts_patients = pd.concat([pd.DataFrame(v) for v in patient_counts.values()], axis=1, sort=False)\n",
+ "counts_patients = counts_patients.fillna(0)\n",
+ "\n",
+ "# Ajout de la colonne de total de cellules comptƩes par patientes\n",
+ "counts_patients['Total_cells'] = counts_patients.sum(axis=1)\n",
+ "\n",
+ "\n",
+ "counts_patients"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "id": "7d05c34a-6c74-45dc-863d-e7eeba61a679",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " dc \n",
+ " b \n",
+ " tcd4 \n",
+ " tcd8 \n",
+ " m1 \n",
+ " m2 \n",
+ " treg \n",
+ " immune_other \n",
+ " cancer \n",
+ " αsma_mycaf \n",
+ " ... \n",
+ " tcd8_perc \n",
+ " m1_perc \n",
+ " m2_perc \n",
+ " treg_perc \n",
+ " immune_other_perc \n",
+ " cancer_perc \n",
+ " αsma_mycaf_perc \n",
+ " stroma_other_perc \n",
+ " endothelial_perc \n",
+ " Patient \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 900.0 \n",
+ " 24.0 \n",
+ " 167.0 \n",
+ " 100.0 \n",
+ " 5.0 \n",
+ " 28.0 \n",
+ " 3981 \n",
+ " 388.0 \n",
+ " ... \n",
+ " 0.371517 \n",
+ " 2.585139 \n",
+ " 1.547988 \n",
+ " 0.077399 \n",
+ " 0.433437 \n",
+ " 61.625387 \n",
+ " 6.006192 \n",
+ " 8.204334 \n",
+ " 5.185759 \n",
+ " 10 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 7.0 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 26.0 \n",
+ " 556 \n",
+ " 409.0 \n",
+ " ... \n",
+ " 0.080723 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.419761 \n",
+ " 8.976429 \n",
+ " 6.603164 \n",
+ " 82.386180 \n",
+ " 1.404585 \n",
+ " 11 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 190.0 \n",
+ " 6.0 \n",
+ " 2.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 53.0 \n",
+ " 7142 \n",
+ " 100.0 \n",
+ " ... \n",
+ " 0.076268 \n",
+ " 0.025423 \n",
+ " 0.012711 \n",
+ " 0.000000 \n",
+ " 0.673700 \n",
+ " 90.784289 \n",
+ " 1.271133 \n",
+ " 4.004068 \n",
+ " 0.724546 \n",
+ " 14 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 4.0 \n",
+ " 0.0 \n",
+ " 32.0 \n",
+ " 7.0 \n",
+ " 7.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 19.0 \n",
+ " 1823 \n",
+ " 747.0 \n",
+ " ... \n",
+ " 0.236646 \n",
+ " 0.236646 \n",
+ " 0.033807 \n",
+ " 0.000000 \n",
+ " 0.642326 \n",
+ " 61.629479 \n",
+ " 25.253550 \n",
+ " 7.843137 \n",
+ " 2.907370 \n",
+ " 15 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 38.0 \n",
+ " 0.0 \n",
+ " 983.0 \n",
+ " 258.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 64.0 \n",
+ " 2322 \n",
+ " 1543.0 \n",
+ " ... \n",
+ " 3.958269 \n",
+ " 0.046026 \n",
+ " 0.000000 \n",
+ " 0.061369 \n",
+ " 0.981896 \n",
+ " 35.624425 \n",
+ " 23.672906 \n",
+ " 16.492789 \n",
+ " 3.498006 \n",
+ " 19 \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 26.0 \n",
+ " 23.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 152.0 \n",
+ " 4317 \n",
+ " 40.0 \n",
+ " ... \n",
+ " 0.434536 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 2.871717 \n",
+ " 81.560552 \n",
+ " 0.755715 \n",
+ " 12.091442 \n",
+ " 1.775930 \n",
+ " 20 \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " 1.0 \n",
+ " 84.0 \n",
+ " 5.0 \n",
+ " 416.0 \n",
+ " 70.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 57.0 \n",
+ " 2447 \n",
+ " 88.0 \n",
+ " ... \n",
+ " 12.271386 \n",
+ " 2.064897 \n",
+ " 0.029499 \n",
+ " 0.000000 \n",
+ " 1.681416 \n",
+ " 72.182891 \n",
+ " 2.595870 \n",
+ " 4.808260 \n",
+ " 1.710914 \n",
+ " 22 \n",
+ " \n",
+ " \n",
+ " 23 \n",
+ " 67.0 \n",
+ " 1.0 \n",
+ " 239.0 \n",
+ " 750.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 155.0 \n",
+ " 3370 \n",
+ " 12.0 \n",
+ " ... \n",
+ " 15.670706 \n",
+ " 0.000000 \n",
+ " 0.062683 \n",
+ " 0.020894 \n",
+ " 3.238613 \n",
+ " 70.413707 \n",
+ " 0.250731 \n",
+ " 2.632679 \n",
+ " 1.295445 \n",
+ " 23 \n",
+ " \n",
+ " \n",
+ " 26 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 159.0 \n",
+ " 17.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 15.0 \n",
+ " 2950 \n",
+ " 49.0 \n",
+ " ... \n",
+ " 0.458221 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.026954 \n",
+ " 0.404313 \n",
+ " 79.514825 \n",
+ " 1.320755 \n",
+ " 12.722372 \n",
+ " 1.239892 \n",
+ " 26 \n",
+ " \n",
+ " \n",
+ " 27 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 45.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 10.0 \n",
+ " 4522 \n",
+ " 14.0 \n",
+ " ... \n",
+ " 0.000000 \n",
+ " 0.046664 \n",
+ " 0.031109 \n",
+ " 0.000000 \n",
+ " 0.155545 \n",
+ " 70.337533 \n",
+ " 0.217763 \n",
+ " 26.520454 \n",
+ " 1.913206 \n",
+ " 27 \n",
+ " \n",
+ " \n",
+ " 28 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 26.0 \n",
+ " 23.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 90.0 \n",
+ " 983 \n",
+ " 718.0 \n",
+ " ... \n",
+ " 0.820549 \n",
+ " 0.035676 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 3.210846 \n",
+ " 35.069568 \n",
+ " 25.615412 \n",
+ " 32.286836 \n",
+ " 1.997859 \n",
+ " 28 \n",
+ " \n",
+ " \n",
+ " 30 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 986.0 \n",
+ " 148.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 5.0 \n",
+ " 74.0 \n",
+ " 1404 \n",
+ " 1049.0 \n",
+ " ... \n",
+ " 2.774133 \n",
+ " 0.056232 \n",
+ " 0.000000 \n",
+ " 0.093721 \n",
+ " 1.387067 \n",
+ " 26.316776 \n",
+ " 19.662605 \n",
+ " 25.435801 \n",
+ " 5.660731 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 32 \n",
+ " 30.0 \n",
+ " 16.0 \n",
+ " 1137.0 \n",
+ " 628.0 \n",
+ " 52.0 \n",
+ " 15.0 \n",
+ " 0.0 \n",
+ " 122.0 \n",
+ " 6327 \n",
+ " 5.0 \n",
+ " ... \n",
+ " 7.013625 \n",
+ " 0.580746 \n",
+ " 0.167523 \n",
+ " 0.000000 \n",
+ " 1.362520 \n",
+ " 70.661157 \n",
+ " 0.055841 \n",
+ " 6.857270 \n",
+ " 0.089346 \n",
+ " 32 \n",
+ " \n",
+ " \n",
+ " 33 \n",
+ " 14.0 \n",
+ " 0.0 \n",
+ " 64.0 \n",
+ " 33.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 26.0 \n",
+ " 1187 \n",
+ " 398.0 \n",
+ " ... \n",
+ " 1.435407 \n",
+ " 0.000000 \n",
+ " 0.043497 \n",
+ " 0.043497 \n",
+ " 1.130926 \n",
+ " 51.631144 \n",
+ " 17.311875 \n",
+ " 11.439756 \n",
+ " 13.571118 \n",
+ " 33 \n",
+ " \n",
+ " \n",
+ " 34 \n",
+ " 19.0 \n",
+ " 0.0 \n",
+ " 34.0 \n",
+ " 435.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 219.0 \n",
+ " 1426 \n",
+ " 85.0 \n",
+ " ... \n",
+ " 19.154557 \n",
+ " 0.000000 \n",
+ " 0.088067 \n",
+ " 0.000000 \n",
+ " 9.643329 \n",
+ " 62.791722 \n",
+ " 3.742845 \n",
+ " 1.981506 \n",
+ " 0.264201 \n",
+ " 34 \n",
+ " \n",
+ " \n",
+ " 35 \n",
+ " 13.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 861.0 \n",
+ " 26.0 \n",
+ " 13.0 \n",
+ " 1.0 \n",
+ " 71.0 \n",
+ " 189 \n",
+ " 2.0 \n",
+ " ... \n",
+ " 71.452282 \n",
+ " 2.157676 \n",
+ " 1.078838 \n",
+ " 0.082988 \n",
+ " 5.892116 \n",
+ " 15.684647 \n",
+ " 0.165975 \n",
+ " 0.165975 \n",
+ " 2.074689 \n",
+ " 35 \n",
+ " \n",
+ " \n",
+ " 36 \n",
+ " 107.0 \n",
+ " 0.0 \n",
+ " 68.0 \n",
+ " 1299.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 403.0 \n",
+ " 2805 \n",
+ " 93.0 \n",
+ " ... \n",
+ " 25.677011 \n",
+ " 0.019767 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 7.966001 \n",
+ " 55.445740 \n",
+ " 1.838308 \n",
+ " 4.605653 \n",
+ " 0.988338 \n",
+ " 36 \n",
+ " \n",
+ " \n",
+ " 37 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 60.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 83.0 \n",
+ " 4356 \n",
+ " 36.0 \n",
+ " ... \n",
+ " 1.294778 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 1.791109 \n",
+ " 94.000863 \n",
+ " 0.776867 \n",
+ " 0.496331 \n",
+ " 1.575313 \n",
+ " 37 \n",
+ " \n",
+ " \n",
+ " 38 \n",
+ " 4.0 \n",
+ " 1.0 \n",
+ " 20.0 \n",
+ " 21.0 \n",
+ " 4.0 \n",
+ " 4.0 \n",
+ " 2.0 \n",
+ " 41.0 \n",
+ " 4806 \n",
+ " 95.0 \n",
+ " ... \n",
+ " 0.408958 \n",
+ " 0.077897 \n",
+ " 0.077897 \n",
+ " 0.038948 \n",
+ " 0.798442 \n",
+ " 93.592989 \n",
+ " 1.850049 \n",
+ " 1.694255 \n",
+ " 0.973710 \n",
+ " 38 \n",
+ " \n",
+ " \n",
+ " 39 \n",
+ " 11.0 \n",
+ " 0.0 \n",
+ " 241.0 \n",
+ " 35.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 45.0 \n",
+ " 3889 \n",
+ " 22.0 \n",
+ " ... \n",
+ " 0.792752 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 1.019253 \n",
+ " 88.086070 \n",
+ " 0.498301 \n",
+ " 3.284258 \n",
+ " 0.611552 \n",
+ " 39 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 31.0 \n",
+ " 2.0 \n",
+ " 1730.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 4.0 \n",
+ " 1.0 \n",
+ " 23.0 \n",
+ " 1457 \n",
+ " 11.0 \n",
+ " ... \n",
+ " 0.026532 \n",
+ " 0.026532 \n",
+ " 0.106129 \n",
+ " 0.026532 \n",
+ " 0.610241 \n",
+ " 38.657469 \n",
+ " 0.291855 \n",
+ " 11.223136 \n",
+ " 2.255240 \n",
+ " 4 \n",
+ " \n",
+ " \n",
+ " 41 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 153.0 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 2.0 \n",
+ " 71 \n",
+ " 4.0 \n",
+ " ... \n",
+ " 2.362205 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.787402 \n",
+ " 0.787402 \n",
+ " 27.952756 \n",
+ " 1.574803 \n",
+ " 3.149606 \n",
+ " 2.362205 \n",
+ " 41 \n",
+ " \n",
+ " \n",
+ " 42 \n",
+ " 50.0 \n",
+ " 0.0 \n",
+ " 746.0 \n",
+ " 481.0 \n",
+ " 50.0 \n",
+ " 12.0 \n",
+ " 32.0 \n",
+ " 209.0 \n",
+ " 2968 \n",
+ " 8.0 \n",
+ " ... \n",
+ " 9.598882 \n",
+ " 0.997805 \n",
+ " 0.239473 \n",
+ " 0.638595 \n",
+ " 4.170824 \n",
+ " 59.229695 \n",
+ " 0.159649 \n",
+ " 5.807224 \n",
+ " 3.272800 \n",
+ " 42 \n",
+ " \n",
+ " \n",
+ " 43 \n",
+ " 9.0 \n",
+ " 0.0 \n",
+ " 44.0 \n",
+ " 10.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 7.0 \n",
+ " 983 \n",
+ " 15.0 \n",
+ " ... \n",
+ " 0.666223 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.066622 \n",
+ " 0.466356 \n",
+ " 65.489674 \n",
+ " 0.999334 \n",
+ " 24.117255 \n",
+ " 4.663558 \n",
+ " 43 \n",
+ " \n",
+ " \n",
+ " 44 \n",
+ " 12.0 \n",
+ " 0.0 \n",
+ " 48.0 \n",
+ " 14.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 3623 \n",
+ " 15.0 \n",
+ " ... \n",
+ " 0.344234 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.098353 \n",
+ " 89.082862 \n",
+ " 0.368822 \n",
+ " 7.892796 \n",
+ " 0.737644 \n",
+ " 44 \n",
+ " \n",
+ " \n",
+ " 45 \n",
+ " 9.0 \n",
+ " 0.0 \n",
+ " 277.0 \n",
+ " 24.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 80.0 \n",
+ " 4357 \n",
+ " 446.0 \n",
+ " ... \n",
+ " 0.391773 \n",
+ " 0.000000 \n",
+ " 0.048972 \n",
+ " 0.000000 \n",
+ " 1.305909 \n",
+ " 71.123082 \n",
+ " 7.280444 \n",
+ " 11.687888 \n",
+ " 3.493307 \n",
+ " 45 \n",
+ " \n",
+ " \n",
+ " 46 \n",
+ " 9.0 \n",
+ " 0.0 \n",
+ " 37.0 \n",
+ " 22.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 9.0 \n",
+ " 2281 \n",
+ " 21.0 \n",
+ " ... \n",
+ " 0.864101 \n",
+ " 0.117832 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.353496 \n",
+ " 89.591516 \n",
+ " 0.824823 \n",
+ " 6.009427 \n",
+ " 0.432050 \n",
+ " 46 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 66.0 \n",
+ " 40.0 \n",
+ " 78.0 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 55.0 \n",
+ " 393 \n",
+ " 1845.0 \n",
+ " ... \n",
+ " 1.507159 \n",
+ " 2.938960 \n",
+ " 0.226074 \n",
+ " 0.000000 \n",
+ " 2.072344 \n",
+ " 14.807837 \n",
+ " 69.517709 \n",
+ " 4.672193 \n",
+ " 1.695554 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ " 50 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 130.0 \n",
+ " 91.0 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 66.0 \n",
+ " 3155 \n",
+ " 876.0 \n",
+ " ... \n",
+ " 1.667277 \n",
+ " 0.091609 \n",
+ " 0.000000 \n",
+ " 0.018322 \n",
+ " 1.209234 \n",
+ " 57.805057 \n",
+ " 16.049835 \n",
+ " 12.678637 \n",
+ " 8.061561 \n",
+ " 50 \n",
+ " \n",
+ " \n",
+ " 52 \n",
+ " 37.0 \n",
+ " 0.0 \n",
+ " 91.0 \n",
+ " 7.0 \n",
+ " 25.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 175.0 \n",
+ " 3656 \n",
+ " 668.0 \n",
+ " ... \n",
+ " 0.101112 \n",
+ " 0.361115 \n",
+ " 0.014445 \n",
+ " 0.000000 \n",
+ " 2.527806 \n",
+ " 52.809476 \n",
+ " 9.648996 \n",
+ " 30.680341 \n",
+ " 2.007800 \n",
+ " 52 \n",
+ " \n",
+ " \n",
+ " 53 \n",
+ " 144.0 \n",
+ " 0.0 \n",
+ " 18.0 \n",
+ " 65.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 75.0 \n",
+ " 3079 \n",
+ " 169.0 \n",
+ " ... \n",
+ " 1.443482 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 1.665556 \n",
+ " 68.376638 \n",
+ " 3.753054 \n",
+ " 20.008883 \n",
+ " 1.154786 \n",
+ " 53 \n",
+ " \n",
+ " \n",
+ " 54 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 1133.0 \n",
+ " 3.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 340.0 \n",
+ " 4714 \n",
+ " 92.0 \n",
+ " ... \n",
+ " 16.620214 \n",
+ " 0.044008 \n",
+ " 0.029338 \n",
+ " 0.000000 \n",
+ " 4.987531 \n",
+ " 69.150653 \n",
+ " 1.349567 \n",
+ " 5.867684 \n",
+ " 1.877659 \n",
+ " 54 \n",
+ " \n",
+ " \n",
+ " 57 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 69.0 \n",
+ " 62.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 43.0 \n",
+ " 5765 \n",
+ " 30.0 \n",
+ " ... \n",
+ " 0.995025 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.690098 \n",
+ " 92.521265 \n",
+ " 0.481464 \n",
+ " 3.113465 \n",
+ " 0.995025 \n",
+ " 57 \n",
+ " \n",
+ " \n",
+ " 58 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 17.0 \n",
+ " 39.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 6.0 \n",
+ " 134 \n",
+ " 122.0 \n",
+ " ... \n",
+ " 6.939502 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.177936 \n",
+ " 1.067616 \n",
+ " 23.843416 \n",
+ " 21.708185 \n",
+ " 16.903915 \n",
+ " 26.156584 \n",
+ " 58 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 235.0 \n",
+ " 5.0 \n",
+ " 1.0 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 71.0 \n",
+ " 3275 \n",
+ " 129.0 \n",
+ " ... \n",
+ " 0.112969 \n",
+ " 0.022594 \n",
+ " 0.112969 \n",
+ " 0.000000 \n",
+ " 1.604157 \n",
+ " 73.994577 \n",
+ " 2.914596 \n",
+ " 13.985540 \n",
+ " 1.897876 \n",
+ " 6 \n",
+ " \n",
+ " \n",
+ " 63 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 117.0 \n",
+ " 99.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 58.0 \n",
+ " 4629 \n",
+ " 389.0 \n",
+ " ... \n",
+ " 1.822869 \n",
+ " 0.055238 \n",
+ " 0.018413 \n",
+ " 0.000000 \n",
+ " 1.067943 \n",
+ " 85.232922 \n",
+ " 7.162585 \n",
+ " 1.067943 \n",
+ " 1.325723 \n",
+ " 63 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 184.0 \n",
+ " 31.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 11.0 \n",
+ " 771 \n",
+ " 24.0 \n",
+ " ... \n",
+ " 1.970757 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.699301 \n",
+ " 49.014622 \n",
+ " 1.525747 \n",
+ " 33.757152 \n",
+ " 1.271456 \n",
+ " 7 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 704.0 \n",
+ " 18.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 28.0 \n",
+ " 4514 \n",
+ " 235.0 \n",
+ " ... \n",
+ " 0.256301 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.056956 \n",
+ " 0.398690 \n",
+ " 64.274527 \n",
+ " 3.346148 \n",
+ " 18.425174 \n",
+ " 3.189520 \n",
+ " 8 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 0.0 \n",
+ " 27.0 \n",
+ " 328.0 \n",
+ " 395.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 83.0 \n",
+ " 8371 \n",
+ " 23.0 \n",
+ " ... \n",
+ " 4.089450 \n",
+ " 0.010353 \n",
+ " 0.000000 \n",
+ " 0.020706 \n",
+ " 0.859302 \n",
+ " 86.665286 \n",
+ " 0.238120 \n",
+ " 1.987783 \n",
+ " 2.453670 \n",
+ " 18 \n",
+ " \n",
+ " \n",
+ " 25 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 5.0 \n",
+ " 53.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 42.0 \n",
+ " 1844 \n",
+ " 22.0 \n",
+ " ... \n",
+ " 2.375616 \n",
+ " 0.000000 \n",
+ " 0.089646 \n",
+ " 0.000000 \n",
+ " 1.882564 \n",
+ " 82.653519 \n",
+ " 0.986105 \n",
+ " 9.816226 \n",
+ " 1.927387 \n",
+ " 25 \n",
+ " \n",
+ " \n",
+ " 29 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 105.0 \n",
+ " 27.0 \n",
+ " 101.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 59.0 \n",
+ " 2448 \n",
+ " 28.0 \n",
+ " ... \n",
+ " 0.835396 \n",
+ " 3.125000 \n",
+ " 0.092822 \n",
+ " 0.030941 \n",
+ " 1.825495 \n",
+ " 75.742574 \n",
+ " 0.866337 \n",
+ " 9.498762 \n",
+ " 4.672030 \n",
+ " 29 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 6.0 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 17.0 \n",
+ " 1037 \n",
+ " 7.0 \n",
+ " ... \n",
+ " 0.342801 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.832517 \n",
+ " 50.783546 \n",
+ " 0.342801 \n",
+ " 44.025465 \n",
+ " 3.232125 \n",
+ " 3 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 318.0 \n",
+ " 6.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 153.0 \n",
+ " 7448 \n",
+ " 8.0 \n",
+ " ... \n",
+ " 0.066830 \n",
+ " 0.022277 \n",
+ " 0.000000 \n",
+ " 0.022277 \n",
+ " 1.704166 \n",
+ " 82.958343 \n",
+ " 0.089107 \n",
+ " 7.329027 \n",
+ " 4.265984 \n",
+ " 12 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 39.0 \n",
+ " 28.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 21.0 \n",
+ " 1864 \n",
+ " 0.0 \n",
+ " ... \n",
+ " 1.315789 \n",
+ " 0.000000 \n",
+ " 0.046992 \n",
+ " 0.000000 \n",
+ " 0.986842 \n",
+ " 87.593985 \n",
+ " 0.000000 \n",
+ " 7.471805 \n",
+ " 0.751880 \n",
+ " 13 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 45.0 \n",
+ " 41.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 119.0 \n",
+ " 5667 \n",
+ " 240.0 \n",
+ " ... \n",
+ " 0.582883 \n",
+ " 0.000000 \n",
+ " 0.042650 \n",
+ " 0.000000 \n",
+ " 1.691783 \n",
+ " 80.565823 \n",
+ " 3.411999 \n",
+ " 11.415980 \n",
+ " 1.649133 \n",
+ " 16 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 220.0 \n",
+ " 35.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 28.0 \n",
+ " 4129 \n",
+ " 1400.0 \n",
+ " ... \n",
+ " 0.534678 \n",
+ " 0.030553 \n",
+ " 0.000000 \n",
+ " 0.015277 \n",
+ " 0.427742 \n",
+ " 63.076688 \n",
+ " 21.387107 \n",
+ " 8.218760 \n",
+ " 2.948365 \n",
+ " 17 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 234.0 \n",
+ " 91.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 177.0 \n",
+ " 7353 \n",
+ " 108.0 \n",
+ " ... \n",
+ " 1.094408 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 2.128683 \n",
+ " 88.430547 \n",
+ " 1.298857 \n",
+ " 3.247144 \n",
+ " 0.986170 \n",
+ " 21 \n",
+ " \n",
+ " \n",
+ " 24 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 45.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 27.0 \n",
+ " 463 \n",
+ " 9.0 \n",
+ " ... \n",
+ " 7.064364 \n",
+ " 0.156986 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 4.238619 \n",
+ " 72.684458 \n",
+ " 1.412873 \n",
+ " 12.715856 \n",
+ " 1.255887 \n",
+ " 24 \n",
+ " \n",
+ " \n",
+ " 40 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 11.0 \n",
+ " 6.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 17.0 \n",
+ " 2274 \n",
+ " 1562.0 \n",
+ " ... \n",
+ " 0.140121 \n",
+ " 0.023354 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.397011 \n",
+ " 53.106025 \n",
+ " 36.478281 \n",
+ " 7.262961 \n",
+ " 2.335357 \n",
+ " 40 \n",
+ " \n",
+ " \n",
+ " 47 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 14.0 \n",
+ " 10.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 12.0 \n",
+ " 2740 \n",
+ " 235.0 \n",
+ " ... \n",
+ " 0.310463 \n",
+ " 0.031046 \n",
+ " 0.000000 \n",
+ " 0.031046 \n",
+ " 0.372555 \n",
+ " 85.066749 \n",
+ " 7.295871 \n",
+ " 5.867743 \n",
+ " 0.589879 \n",
+ " 47 \n",
+ " \n",
+ " \n",
+ " 48 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 22.0 \n",
+ " 51.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 14.0 \n",
+ " 1252 \n",
+ " 310.0 \n",
+ " ... \n",
+ " 2.873239 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.788732 \n",
+ " 70.535211 \n",
+ " 17.464789 \n",
+ " 4.563380 \n",
+ " 2.535211 \n",
+ " 48 \n",
+ " \n",
+ " \n",
+ " 49 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 5.0 \n",
+ " 206.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 85.0 \n",
+ " 1300 \n",
+ " 113.0 \n",
+ " ... \n",
+ " 11.021937 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 4.547887 \n",
+ " 69.555912 \n",
+ " 6.046014 \n",
+ " 1.551632 \n",
+ " 7.009096 \n",
+ " 49 \n",
+ " \n",
+ " \n",
+ " 51 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 11 \n",
+ " 1.0 \n",
+ " ... \n",
+ " 2.272727 \n",
+ " 2.272727 \n",
+ " 0.000000 \n",
+ " 2.272727 \n",
+ " 0.000000 \n",
+ " 25.000000 \n",
+ " 2.272727 \n",
+ " 13.636364 \n",
+ " 43.181818 \n",
+ " 51 \n",
+ " \n",
+ " \n",
+ " 55 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 114.0 \n",
+ " 3.0 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 58.0 \n",
+ " 1459 \n",
+ " 3.0 \n",
+ " ... \n",
+ " 5.792683 \n",
+ " 0.152439 \n",
+ " 0.355691 \n",
+ " 0.000000 \n",
+ " 2.947154 \n",
+ " 74.136179 \n",
+ " 0.152439 \n",
+ " 14.329268 \n",
+ " 2.032520 \n",
+ " 55 \n",
+ " \n",
+ " \n",
+ " 56 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 12.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 20.0 \n",
+ " 3482 \n",
+ " 199.0 \n",
+ " ... \n",
+ " 0.312581 \n",
+ " 0.052097 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.520969 \n",
+ " 90.700703 \n",
+ " 5.183642 \n",
+ " 1.823392 \n",
+ " 1.380568 \n",
+ " 56 \n",
+ " \n",
+ " \n",
+ " 59 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 24.0 \n",
+ " 68.0 \n",
+ " 17.0 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 48.0 \n",
+ " 5450 \n",
+ " 280.0 \n",
+ " ... \n",
+ " 1.130883 \n",
+ " 0.282721 \n",
+ " 0.099784 \n",
+ " 0.000000 \n",
+ " 0.798270 \n",
+ " 90.636953 \n",
+ " 4.656577 \n",
+ " 0.648595 \n",
+ " 1.347081 \n",
+ " 59 \n",
+ " \n",
+ " \n",
+ " 61 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 79.0 \n",
+ " 144.0 \n",
+ " 4.0 \n",
+ " 19.0 \n",
+ " 0.0 \n",
+ " 37.0 \n",
+ " 958 \n",
+ " 375.0 \n",
+ " ... \n",
+ " 7.704655 \n",
+ " 0.214018 \n",
+ " 1.016586 \n",
+ " 0.000000 \n",
+ " 1.979668 \n",
+ " 51.257357 \n",
+ " 20.064205 \n",
+ " 9.523810 \n",
+ " 4.012841 \n",
+ " 61 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 465.0 \n",
+ " 82.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 36.0 \n",
+ " 4733 \n",
+ " 67.0 \n",
+ " ... \n",
+ " 1.184800 \n",
+ " 0.000000 \n",
+ " 0.014449 \n",
+ " 0.014449 \n",
+ " 0.520156 \n",
+ " 68.386071 \n",
+ " 0.968068 \n",
+ " 18.971247 \n",
+ " 3.222078 \n",
+ " 9 \n",
+ " \n",
+ " \n",
+ " 60 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 107.0 \n",
+ " 9.0 \n",
+ " 16.0 \n",
+ " 1.0 \n",
+ " 57.0 \n",
+ " 1979 \n",
+ " 107.0 \n",
+ " ... \n",
+ " 4.634041 \n",
+ " 0.389779 \n",
+ " 0.692941 \n",
+ " 0.043309 \n",
+ " 2.468601 \n",
+ " 85.708099 \n",
+ " 4.634041 \n",
+ " 0.043309 \n",
+ " 1.385881 \n",
+ " 60 \n",
+ " \n",
+ " \n",
+ " 62 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 23.0 \n",
+ " 3.0 \n",
+ " 15.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 151 \n",
+ " 91.0 \n",
+ " ... \n",
+ " 7.419355 \n",
+ " 0.967742 \n",
+ " 4.838710 \n",
+ " 0.000000 \n",
+ " 1.290323 \n",
+ " 48.709677 \n",
+ " 29.354839 \n",
+ " 6.451613 \n",
+ " 0.967742 \n",
+ " 62 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
60 rows Ć 26 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " dc b tcd4 tcd8 m1 m2 treg immune_other cancer \\\n",
+ "10 2.0 0.0 900.0 24.0 167.0 100.0 5.0 28.0 3981 \n",
+ "11 1.0 0.0 7.0 5.0 0.0 0.0 0.0 26.0 556 \n",
+ "14 1.0 0.0 190.0 6.0 2.0 1.0 0.0 53.0 7142 \n",
+ "15 4.0 0.0 32.0 7.0 7.0 1.0 0.0 19.0 1823 \n",
+ "19 38.0 0.0 983.0 258.0 3.0 0.0 4.0 64.0 2322 \n",
+ "20 1.0 0.0 26.0 23.0 0.0 0.0 0.0 152.0 4317 \n",
+ "22 1.0 84.0 5.0 416.0 70.0 1.0 0.0 57.0 2447 \n",
+ "23 67.0 1.0 239.0 750.0 0.0 3.0 1.0 155.0 3370 \n",
+ "26 1.0 0.0 159.0 17.0 0.0 0.0 1.0 15.0 2950 \n",
+ "27 5.0 0.0 45.0 0.0 3.0 2.0 0.0 10.0 4522 \n",
+ "28 1.0 0.0 26.0 23.0 1.0 0.0 0.0 90.0 983 \n",
+ "30 7.0 0.0 986.0 148.0 3.0 0.0 5.0 74.0 1404 \n",
+ "32 30.0 16.0 1137.0 628.0 52.0 15.0 0.0 122.0 6327 \n",
+ "33 14.0 0.0 64.0 33.0 0.0 1.0 1.0 26.0 1187 \n",
+ "34 19.0 0.0 34.0 435.0 0.0 2.0 0.0 219.0 1426 \n",
+ "35 13.0 0.0 2.0 861.0 26.0 13.0 1.0 71.0 189 \n",
+ "36 107.0 0.0 68.0 1299.0 1.0 0.0 0.0 403.0 2805 \n",
+ "37 2.0 0.0 1.0 60.0 0.0 0.0 0.0 83.0 4356 \n",
+ "38 4.0 1.0 20.0 21.0 4.0 4.0 2.0 41.0 4806 \n",
+ "39 11.0 0.0 241.0 35.0 0.0 0.0 0.0 45.0 3889 \n",
+ "4 31.0 2.0 1730.0 1.0 1.0 4.0 1.0 23.0 1457 \n",
+ "41 2.0 0.0 153.0 6.0 0.0 0.0 2.0 2.0 71 \n",
+ "42 50.0 0.0 746.0 481.0 50.0 12.0 32.0 209.0 2968 \n",
+ "43 9.0 0.0 44.0 10.0 0.0 0.0 1.0 7.0 983 \n",
+ "44 12.0 0.0 48.0 14.0 0.0 0.0 0.0 4.0 3623 \n",
+ "45 9.0 0.0 277.0 24.0 0.0 3.0 0.0 80.0 4357 \n",
+ "46 9.0 0.0 37.0 22.0 3.0 0.0 0.0 9.0 2281 \n",
+ "5 1.0 1.0 66.0 40.0 78.0 6.0 0.0 55.0 393 \n",
+ "50 2.0 0.0 130.0 91.0 5.0 0.0 1.0 66.0 3155 \n",
+ "52 37.0 0.0 91.0 7.0 25.0 1.0 0.0 175.0 3656 \n",
+ "53 144.0 0.0 18.0 65.0 0.0 0.0 0.0 75.0 3079 \n",
+ "54 3.0 0.0 2.0 1133.0 3.0 2.0 0.0 340.0 4714 \n",
+ "57 6.0 0.0 69.0 62.0 0.0 0.0 0.0 43.0 5765 \n",
+ "58 1.0 0.0 17.0 39.0 0.0 0.0 1.0 6.0 134 \n",
+ "6 2.0 0.0 235.0 5.0 1.0 5.0 0.0 71.0 3275 \n",
+ "63 5.0 0.0 117.0 99.0 3.0 1.0 0.0 58.0 4629 \n",
+ "7 1.0 0.0 184.0 31.0 0.0 0.0 0.0 11.0 771 \n",
+ "8 2.0 0.0 704.0 18.0 0.0 0.0 4.0 28.0 4514 \n",
+ "18 0.0 27.0 328.0 395.0 1.0 0.0 2.0 83.0 8371 \n",
+ "25 0.0 1.0 5.0 53.0 0.0 2.0 0.0 42.0 1844 \n",
+ "29 0.0 2.0 105.0 27.0 101.0 3.0 1.0 59.0 2448 \n",
+ "3 0.0 3.0 6.0 7.0 0.0 0.0 0.0 17.0 1037 \n",
+ "12 0.0 0.0 318.0 6.0 2.0 0.0 2.0 153.0 7448 \n",
+ "13 0.0 0.0 39.0 28.0 0.0 1.0 0.0 21.0 1864 \n",
+ "16 0.0 0.0 45.0 41.0 0.0 3.0 0.0 119.0 5667 \n",
+ "17 0.0 0.0 220.0 35.0 2.0 0.0 1.0 28.0 4129 \n",
+ "21 0.0 0.0 234.0 91.0 0.0 0.0 0.0 177.0 7353 \n",
+ "24 0.0 0.0 3.0 45.0 1.0 0.0 0.0 27.0 463 \n",
+ "40 0.0 0.0 11.0 6.0 1.0 0.0 0.0 17.0 2274 \n",
+ "47 0.0 0.0 14.0 10.0 1.0 0.0 1.0 12.0 2740 \n",
+ "48 0.0 0.0 22.0 51.0 0.0 0.0 0.0 14.0 1252 \n",
+ "49 0.0 0.0 5.0 206.0 0.0 0.0 0.0 85.0 1300 \n",
+ "51 0.0 0.0 4.0 1.0 1.0 0.0 1.0 0.0 11 \n",
+ "55 0.0 0.0 2.0 114.0 3.0 7.0 0.0 58.0 1459 \n",
+ "56 0.0 0.0 1.0 12.0 2.0 0.0 0.0 20.0 3482 \n",
+ "59 0.0 0.0 24.0 68.0 17.0 6.0 0.0 48.0 5450 \n",
+ "61 0.0 0.0 79.0 144.0 4.0 19.0 0.0 37.0 958 \n",
+ "9 0.0 0.0 465.0 82.0 0.0 1.0 1.0 36.0 4733 \n",
+ "60 0.0 0.0 0.0 107.0 9.0 16.0 1.0 57.0 1979 \n",
+ "62 0.0 0.0 0.0 23.0 3.0 15.0 0.0 4.0 151 \n",
+ "\n",
+ " αsma_mycaf ... tcd8_perc m1_perc m2_perc treg_perc \\\n",
+ "10 388.0 ... 0.371517 2.585139 1.547988 0.077399 \n",
+ "11 409.0 ... 0.080723 0.000000 0.000000 0.000000 \n",
+ "14 100.0 ... 0.076268 0.025423 0.012711 0.000000 \n",
+ "15 747.0 ... 0.236646 0.236646 0.033807 0.000000 \n",
+ "19 1543.0 ... 3.958269 0.046026 0.000000 0.061369 \n",
+ "20 40.0 ... 0.434536 0.000000 0.000000 0.000000 \n",
+ "22 88.0 ... 12.271386 2.064897 0.029499 0.000000 \n",
+ "23 12.0 ... 15.670706 0.000000 0.062683 0.020894 \n",
+ "26 49.0 ... 0.458221 0.000000 0.000000 0.026954 \n",
+ "27 14.0 ... 0.000000 0.046664 0.031109 0.000000 \n",
+ "28 718.0 ... 0.820549 0.035676 0.000000 0.000000 \n",
+ "30 1049.0 ... 2.774133 0.056232 0.000000 0.093721 \n",
+ "32 5.0 ... 7.013625 0.580746 0.167523 0.000000 \n",
+ "33 398.0 ... 1.435407 0.000000 0.043497 0.043497 \n",
+ "34 85.0 ... 19.154557 0.000000 0.088067 0.000000 \n",
+ "35 2.0 ... 71.452282 2.157676 1.078838 0.082988 \n",
+ "36 93.0 ... 25.677011 0.019767 0.000000 0.000000 \n",
+ "37 36.0 ... 1.294778 0.000000 0.000000 0.000000 \n",
+ "38 95.0 ... 0.408958 0.077897 0.077897 0.038948 \n",
+ "39 22.0 ... 0.792752 0.000000 0.000000 0.000000 \n",
+ "4 11.0 ... 0.026532 0.026532 0.106129 0.026532 \n",
+ "41 4.0 ... 2.362205 0.000000 0.000000 0.787402 \n",
+ "42 8.0 ... 9.598882 0.997805 0.239473 0.638595 \n",
+ "43 15.0 ... 0.666223 0.000000 0.000000 0.066622 \n",
+ "44 15.0 ... 0.344234 0.000000 0.000000 0.000000 \n",
+ "45 446.0 ... 0.391773 0.000000 0.048972 0.000000 \n",
+ "46 21.0 ... 0.864101 0.117832 0.000000 0.000000 \n",
+ "5 1845.0 ... 1.507159 2.938960 0.226074 0.000000 \n",
+ "50 876.0 ... 1.667277 0.091609 0.000000 0.018322 \n",
+ "52 668.0 ... 0.101112 0.361115 0.014445 0.000000 \n",
+ "53 169.0 ... 1.443482 0.000000 0.000000 0.000000 \n",
+ "54 92.0 ... 16.620214 0.044008 0.029338 0.000000 \n",
+ "57 30.0 ... 0.995025 0.000000 0.000000 0.000000 \n",
+ "58 122.0 ... 6.939502 0.000000 0.000000 0.177936 \n",
+ "6 129.0 ... 0.112969 0.022594 0.112969 0.000000 \n",
+ "63 389.0 ... 1.822869 0.055238 0.018413 0.000000 \n",
+ "7 24.0 ... 1.970757 0.000000 0.000000 0.000000 \n",
+ "8 235.0 ... 0.256301 0.000000 0.000000 0.056956 \n",
+ "18 23.0 ... 4.089450 0.010353 0.000000 0.020706 \n",
+ "25 22.0 ... 2.375616 0.000000 0.089646 0.000000 \n",
+ "29 28.0 ... 0.835396 3.125000 0.092822 0.030941 \n",
+ "3 7.0 ... 0.342801 0.000000 0.000000 0.000000 \n",
+ "12 8.0 ... 0.066830 0.022277 0.000000 0.022277 \n",
+ "13 0.0 ... 1.315789 0.000000 0.046992 0.000000 \n",
+ "16 240.0 ... 0.582883 0.000000 0.042650 0.000000 \n",
+ "17 1400.0 ... 0.534678 0.030553 0.000000 0.015277 \n",
+ "21 108.0 ... 1.094408 0.000000 0.000000 0.000000 \n",
+ "24 9.0 ... 7.064364 0.156986 0.000000 0.000000 \n",
+ "40 1562.0 ... 0.140121 0.023354 0.000000 0.000000 \n",
+ "47 235.0 ... 0.310463 0.031046 0.000000 0.031046 \n",
+ "48 310.0 ... 2.873239 0.000000 0.000000 0.000000 \n",
+ "49 113.0 ... 11.021937 0.000000 0.000000 0.000000 \n",
+ "51 1.0 ... 2.272727 2.272727 0.000000 2.272727 \n",
+ "55 3.0 ... 5.792683 0.152439 0.355691 0.000000 \n",
+ "56 199.0 ... 0.312581 0.052097 0.000000 0.000000 \n",
+ "59 280.0 ... 1.130883 0.282721 0.099784 0.000000 \n",
+ "61 375.0 ... 7.704655 0.214018 1.016586 0.000000 \n",
+ "9 67.0 ... 1.184800 0.000000 0.014449 0.014449 \n",
+ "60 107.0 ... 4.634041 0.389779 0.692941 0.043309 \n",
+ "62 91.0 ... 7.419355 0.967742 4.838710 0.000000 \n",
+ "\n",
+ " immune_other_perc cancer_perc αsma_mycaf_perc stroma_other_perc \\\n",
+ "10 0.433437 61.625387 6.006192 8.204334 \n",
+ "11 0.419761 8.976429 6.603164 82.386180 \n",
+ "14 0.673700 90.784289 1.271133 4.004068 \n",
+ "15 0.642326 61.629479 25.253550 7.843137 \n",
+ "19 0.981896 35.624425 23.672906 16.492789 \n",
+ "20 2.871717 81.560552 0.755715 12.091442 \n",
+ "22 1.681416 72.182891 2.595870 4.808260 \n",
+ "23 3.238613 70.413707 0.250731 2.632679 \n",
+ "26 0.404313 79.514825 1.320755 12.722372 \n",
+ "27 0.155545 70.337533 0.217763 26.520454 \n",
+ "28 3.210846 35.069568 25.615412 32.286836 \n",
+ "30 1.387067 26.316776 19.662605 25.435801 \n",
+ "32 1.362520 70.661157 0.055841 6.857270 \n",
+ "33 1.130926 51.631144 17.311875 11.439756 \n",
+ "34 9.643329 62.791722 3.742845 1.981506 \n",
+ "35 5.892116 15.684647 0.165975 0.165975 \n",
+ "36 7.966001 55.445740 1.838308 4.605653 \n",
+ "37 1.791109 94.000863 0.776867 0.496331 \n",
+ "38 0.798442 93.592989 1.850049 1.694255 \n",
+ "39 1.019253 88.086070 0.498301 3.284258 \n",
+ "4 0.610241 38.657469 0.291855 11.223136 \n",
+ "41 0.787402 27.952756 1.574803 3.149606 \n",
+ "42 4.170824 59.229695 0.159649 5.807224 \n",
+ "43 0.466356 65.489674 0.999334 24.117255 \n",
+ "44 0.098353 89.082862 0.368822 7.892796 \n",
+ "45 1.305909 71.123082 7.280444 11.687888 \n",
+ "46 0.353496 89.591516 0.824823 6.009427 \n",
+ "5 2.072344 14.807837 69.517709 4.672193 \n",
+ "50 1.209234 57.805057 16.049835 12.678637 \n",
+ "52 2.527806 52.809476 9.648996 30.680341 \n",
+ "53 1.665556 68.376638 3.753054 20.008883 \n",
+ "54 4.987531 69.150653 1.349567 5.867684 \n",
+ "57 0.690098 92.521265 0.481464 3.113465 \n",
+ "58 1.067616 23.843416 21.708185 16.903915 \n",
+ "6 1.604157 73.994577 2.914596 13.985540 \n",
+ "63 1.067943 85.232922 7.162585 1.067943 \n",
+ "7 0.699301 49.014622 1.525747 33.757152 \n",
+ "8 0.398690 64.274527 3.346148 18.425174 \n",
+ "18 0.859302 86.665286 0.238120 1.987783 \n",
+ "25 1.882564 82.653519 0.986105 9.816226 \n",
+ "29 1.825495 75.742574 0.866337 9.498762 \n",
+ "3 0.832517 50.783546 0.342801 44.025465 \n",
+ "12 1.704166 82.958343 0.089107 7.329027 \n",
+ "13 0.986842 87.593985 0.000000 7.471805 \n",
+ "16 1.691783 80.565823 3.411999 11.415980 \n",
+ "17 0.427742 63.076688 21.387107 8.218760 \n",
+ "21 2.128683 88.430547 1.298857 3.247144 \n",
+ "24 4.238619 72.684458 1.412873 12.715856 \n",
+ "40 0.397011 53.106025 36.478281 7.262961 \n",
+ "47 0.372555 85.066749 7.295871 5.867743 \n",
+ "48 0.788732 70.535211 17.464789 4.563380 \n",
+ "49 4.547887 69.555912 6.046014 1.551632 \n",
+ "51 0.000000 25.000000 2.272727 13.636364 \n",
+ "55 2.947154 74.136179 0.152439 14.329268 \n",
+ "56 0.520969 90.700703 5.183642 1.823392 \n",
+ "59 0.798270 90.636953 4.656577 0.648595 \n",
+ "61 1.979668 51.257357 20.064205 9.523810 \n",
+ "9 0.520156 68.386071 0.968068 18.971247 \n",
+ "60 2.468601 85.708099 4.634041 0.043309 \n",
+ "62 1.290323 48.709677 29.354839 6.451613 \n",
+ "\n",
+ " endothelial_perc Patient \n",
+ "10 5.185759 10 \n",
+ "11 1.404585 11 \n",
+ "14 0.724546 14 \n",
+ "15 2.907370 15 \n",
+ "19 3.498006 19 \n",
+ "20 1.775930 20 \n",
+ "22 1.710914 22 \n",
+ "23 1.295445 23 \n",
+ "26 1.239892 26 \n",
+ "27 1.913206 27 \n",
+ "28 1.997859 28 \n",
+ "30 5.660731 30 \n",
+ "32 0.089346 32 \n",
+ "33 13.571118 33 \n",
+ "34 0.264201 34 \n",
+ "35 2.074689 35 \n",
+ "36 0.988338 36 \n",
+ "37 1.575313 37 \n",
+ "38 0.973710 38 \n",
+ "39 0.611552 39 \n",
+ "4 2.255240 4 \n",
+ "41 2.362205 41 \n",
+ "42 3.272800 42 \n",
+ "43 4.663558 43 \n",
+ "44 0.737644 44 \n",
+ "45 3.493307 45 \n",
+ "46 0.432050 46 \n",
+ "5 1.695554 5 \n",
+ "50 8.061561 50 \n",
+ "52 2.007800 52 \n",
+ "53 1.154786 53 \n",
+ "54 1.877659 54 \n",
+ "57 0.995025 57 \n",
+ "58 26.156584 58 \n",
+ "6 1.897876 6 \n",
+ "63 1.325723 63 \n",
+ "7 1.271456 7 \n",
+ "8 3.189520 8 \n",
+ "18 2.453670 18 \n",
+ "25 1.927387 25 \n",
+ "29 4.672030 29 \n",
+ "3 3.232125 3 \n",
+ "12 4.265984 12 \n",
+ "13 0.751880 13 \n",
+ "16 1.649133 16 \n",
+ "17 2.948365 17 \n",
+ "21 0.986170 21 \n",
+ "24 1.255887 24 \n",
+ "40 2.335357 40 \n",
+ "47 0.589879 47 \n",
+ "48 2.535211 48 \n",
+ "49 7.009096 49 \n",
+ "51 43.181818 51 \n",
+ "55 2.032520 55 \n",
+ "56 1.380568 56 \n",
+ "59 1.347081 59 \n",
+ "61 4.012841 61 \n",
+ "9 3.222078 9 \n",
+ "60 1.385881 60 \n",
+ "62 0.967742 62 \n",
+ "\n",
+ "[60 rows x 26 columns]"
+ ]
+ },
+ "execution_count": 55,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Filtrer counts_patients pour ne conserver que les lignes avec 'Sample_ID' égal à 'DD3S1.csv', 'DD3S2.csv' ou 'DD3S3.csv'\n",
+ "counts_patients_filtered = counts_patients[counts_patients.index.isin(df_filtered['Patient'])]\n",
+ "\n",
+ "# Ajout des colonnes de pourcentages pour chaque sous-type de cellules par patient\n",
+ "counts_perc_patients = counts_patients_filtered.copy()\n",
+ "\n",
+ "# Calcul des pourcentages pour chaque sous-type de cellules, en excluant la colonne 'total_cells'\n",
+ "for col in counts_perc_patients.columns:\n",
+ " if col != 'Total_cells':\n",
+ " counts_perc_patients[col + '_perc'] = (counts_perc_patients[col] / counts_perc_patients['Total_cells']) * 100\n",
+ "\n",
+ "\n",
+ "# Affichage des pourcentages des sous-types de cellules par patient\n",
+ "counts_perc_patients['Patient'] = counts_perc_patients.index\n",
+ "counts_perc_patients.columns.values\n",
+ "counts_perc_patients"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "id": "1f30ab7d-fa1e-4914-a575-da752330c1ea",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "marker": {
+ "color": "rgb(166, 206, 227)"
+ },
+ "name": "DC",
+ "text": [
+ 0.030959752321981428,
+ 0.01614465611882467,
+ 0.012711325791280032,
+ 0.1352265043948614,
+ 0.5830009205277692,
+ 0.01889287738522577,
+ 0.029498525073746312,
+ 1.3999164229001253,
+ 0.026954177897574125,
+ 0.07777259293824856,
+ 0.03567606136282554,
+ 0.13120899718837864,
+ 0.33504578959124415,
+ 0.6089604175728578,
+ 0.836635843240863,
+ 1.0788381742738589,
+ 2.1150424985174934,
+ 0.04315925766076824,
+ 0.07789678675754626,
+ 0.2491506228765572,
+ 0.8224993366940834,
+ 0.7874015748031495,
+ 0.9978048293753742,
+ 0.5996002664890073,
+ 0.29505778214900413,
+ 0.14691478942213515,
+ 0.3534956794972506,
+ 0.037678975131876416,
+ 0.03664345914254306,
+ 0.5344503827820309,
+ 3.1978680879413726,
+ 0.044007627988851404,
+ 0.09629272989889263,
+ 0.1779359430604982,
+ 0.045187528242205156,
+ 0.09206407659731174,
+ 0.06357279084551812,
+ 0.028477858465043433,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "11",
+ "14",
+ "15",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "7",
+ "8",
+ "18",
+ "25",
+ "29",
+ "3",
+ "12",
+ "13",
+ "16",
+ "17",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "9",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0.030959752321981428,
+ 0.01614465611882467,
+ 0.012711325791280032,
+ 0.1352265043948614,
+ 0.5830009205277692,
+ 0.01889287738522577,
+ 0.029498525073746312,
+ 1.3999164229001253,
+ 0.026954177897574125,
+ 0.07777259293824856,
+ 0.03567606136282554,
+ 0.13120899718837864,
+ 0.33504578959124415,
+ 0.6089604175728578,
+ 0.836635843240863,
+ 1.0788381742738589,
+ 2.1150424985174934,
+ 0.04315925766076824,
+ 0.07789678675754626,
+ 0.2491506228765572,
+ 0.8224993366940834,
+ 0.7874015748031495,
+ 0.9978048293753742,
+ 0.5996002664890073,
+ 0.29505778214900413,
+ 0.14691478942213515,
+ 0.3534956794972506,
+ 0.037678975131876416,
+ 0.03664345914254306,
+ 0.5344503827820309,
+ 3.1978680879413726,
+ 0.044007627988851404,
+ 0.09629272989889263,
+ 0.1779359430604982,
+ 0.045187528242205156,
+ 0.09206407659731174,
+ 0.06357279084551812,
+ 0.028477858465043433,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(31, 120, 180)"
+ },
+ "name": "B",
+ "text": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2.47787610619469,
+ 0.020894274968658588,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.17869108778199688,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.019474196689386564,
+ 0,
+ 0.05306447333510214,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.037678975131876416,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.2795320426545191,
+ 0.04482294935006724,
+ 0.06188118811881188,
+ 0.14691478942213515,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "11",
+ "14",
+ "15",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "7",
+ "8",
+ "18",
+ "25",
+ "29",
+ "3",
+ "12",
+ "13",
+ "16",
+ "17",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "9",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2.47787610619469,
+ 0.020894274968658588,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.17869108778199688,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.019474196689386564,
+ 0,
+ 0.05306447333510214,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.037678975131876416,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.2795320426545191,
+ 0.04482294935006724,
+ 0.06188118811881188,
+ 0.14691478942213515,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(178, 223, 138)"
+ },
+ "name": "TCD4",
+ "text": [
+ 13.93188854489164,
+ 0.11301259283177267,
+ 2.4151519003432056,
+ 1.0818120351588911,
+ 15.081313286284137,
+ 0.49121481201587003,
+ 0.14749262536873156,
+ 4.9937317175094025,
+ 4.285714285714286,
+ 0.6999533364442371,
+ 0.9275775954334641,
+ 18.481724461105905,
+ 12.698235425508154,
+ 2.7838190517616357,
+ 1.4971378247468077,
+ 0.16597510373443983,
+ 1.344139157936351,
+ 0.02157962883038412,
+ 0.3894839337877313,
+ 5.458663646659117,
+ 45.900769434863356,
+ 60.23622047244095,
+ 14.887248054280583,
+ 2.9313790806129245,
+ 1.1802311285960165,
+ 4.521710741103494,
+ 1.4532600157109192,
+ 2.4868123587038435,
+ 2.381824844265299,
+ 1.314459049544995,
+ 0.39973351099267157,
+ 0.029338418659234266,
+ 1.1073663938372653,
+ 3.0249110320284696,
+ 5.309534568459105,
+ 2.1542993923770943,
+ 11.697393515575333,
+ 10.024206179695287,
+ 3.3957966663215657,
+ 0.22411474675033619,
+ 3.248762376237624,
+ 0.2938295788442703,
+ 3.5419915348629982,
+ 1.8327067669172932,
+ 0.639749786750071,
+ 3.3608310418576233,
+ 2.814191220685508,
+ 0.47095761381475665,
+ 0.25688930406352173,
+ 0.43464762496119214,
+ 1.2394366197183098,
+ 0.26752273943285176,
+ 9.090909090909092,
+ 0.10162601626016261,
+ 0.026048450117218028,
+ 0.39913520705138866,
+ 4.226859283039058,
+ 6.718682271348071,
+ 0,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "11",
+ "14",
+ "15",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "7",
+ "8",
+ "18",
+ "25",
+ "29",
+ "3",
+ "12",
+ "13",
+ "16",
+ "17",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "9",
+ "60",
+ "62"
+ ],
+ "y": [
+ 13.93188854489164,
+ 0.11301259283177267,
+ 2.4151519003432056,
+ 1.0818120351588911,
+ 15.081313286284137,
+ 0.49121481201587003,
+ 0.14749262536873156,
+ 4.9937317175094025,
+ 4.285714285714286,
+ 0.6999533364442371,
+ 0.9275775954334641,
+ 18.481724461105905,
+ 12.698235425508154,
+ 2.7838190517616357,
+ 1.4971378247468077,
+ 0.16597510373443983,
+ 1.344139157936351,
+ 0.02157962883038412,
+ 0.3894839337877313,
+ 5.458663646659117,
+ 45.900769434863356,
+ 60.23622047244095,
+ 14.887248054280583,
+ 2.9313790806129245,
+ 1.1802311285960165,
+ 4.521710741103494,
+ 1.4532600157109192,
+ 2.4868123587038435,
+ 2.381824844265299,
+ 1.314459049544995,
+ 0.39973351099267157,
+ 0.029338418659234266,
+ 1.1073663938372653,
+ 3.0249110320284696,
+ 5.309534568459105,
+ 2.1542993923770943,
+ 11.697393515575333,
+ 10.024206179695287,
+ 3.3957966663215657,
+ 0.22411474675033619,
+ 3.248762376237624,
+ 0.2938295788442703,
+ 3.5419915348629982,
+ 1.8327067669172932,
+ 0.639749786750071,
+ 3.3608310418576233,
+ 2.814191220685508,
+ 0.47095761381475665,
+ 0.25688930406352173,
+ 0.43464762496119214,
+ 1.2394366197183098,
+ 0.26752273943285176,
+ 9.090909090909092,
+ 0.10162601626016261,
+ 0.026048450117218028,
+ 0.39913520705138866,
+ 4.226859283039058,
+ 6.718682271348071,
+ 0,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(51, 160, 44)"
+ },
+ "name": "TCD8",
+ "text": [
+ 0.37151702786377705,
+ 0.08072328059412334,
+ 0.07626795474768018,
+ 0.23664638269100743,
+ 3.958269407793802,
+ 0.4345361798601928,
+ 12.271386430678465,
+ 15.670706226493941,
+ 0.4582210242587601,
+ 0,
+ 0.8205494113449875,
+ 2.7741330834114337,
+ 7.013625195443378,
+ 1.4354066985645932,
+ 19.154557463672393,
+ 71.45228215767635,
+ 25.677011267048822,
+ 1.294777729823047,
+ 0.4089581304771178,
+ 0.7927519818799547,
+ 0.02653223666755107,
+ 2.3622047244094486,
+ 9.5988824585911,
+ 0.6662225183211192,
+ 0.34423407917383825,
+ 0.3917727717923604,
+ 0.864100549882168,
+ 1.5071590052750565,
+ 1.667277390985709,
+ 0.10111223458038424,
+ 1.4434821230290917,
+ 16.62021417045621,
+ 0.9950248756218906,
+ 6.93950177935943,
+ 0.11296882060551287,
+ 1.8228687166267723,
+ 1.9707565162110616,
+ 0.25630072618539085,
+ 4.089450253649446,
+ 2.3756163155535632,
+ 0.8353960396039605,
+ 0.3428011753183154,
+ 0.06683002895967921,
+ 1.3157894736842104,
+ 0.5828831390389536,
+ 0.5346776657500764,
+ 1.0944076969332532,
+ 7.064364207221351,
+ 0.14012143858010276,
+ 0.3104625892579944,
+ 2.873239436619718,
+ 11.021936864633494,
+ 2.272727272727273,
+ 5.7926829268292686,
+ 0.3125814014066163,
+ 1.1308830866456012,
+ 7.704654895666131,
+ 1.1847998844097674,
+ 4.634040710264184,
+ 7.419354838709677
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "11",
+ "14",
+ "15",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "7",
+ "8",
+ "18",
+ "25",
+ "29",
+ "3",
+ "12",
+ "13",
+ "16",
+ "17",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "9",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0.37151702786377705,
+ 0.08072328059412334,
+ 0.07626795474768018,
+ 0.23664638269100743,
+ 3.958269407793802,
+ 0.4345361798601928,
+ 12.271386430678465,
+ 15.670706226493941,
+ 0.4582210242587601,
+ 0,
+ 0.8205494113449875,
+ 2.7741330834114337,
+ 7.013625195443378,
+ 1.4354066985645932,
+ 19.154557463672393,
+ 71.45228215767635,
+ 25.677011267048822,
+ 1.294777729823047,
+ 0.4089581304771178,
+ 0.7927519818799547,
+ 0.02653223666755107,
+ 2.3622047244094486,
+ 9.5988824585911,
+ 0.6662225183211192,
+ 0.34423407917383825,
+ 0.3917727717923604,
+ 0.864100549882168,
+ 1.5071590052750565,
+ 1.667277390985709,
+ 0.10111223458038424,
+ 1.4434821230290917,
+ 16.62021417045621,
+ 0.9950248756218906,
+ 6.93950177935943,
+ 0.11296882060551287,
+ 1.8228687166267723,
+ 1.9707565162110616,
+ 0.25630072618539085,
+ 4.089450253649446,
+ 2.3756163155535632,
+ 0.8353960396039605,
+ 0.3428011753183154,
+ 0.06683002895967921,
+ 1.3157894736842104,
+ 0.5828831390389536,
+ 0.5346776657500764,
+ 1.0944076969332532,
+ 7.064364207221351,
+ 0.14012143858010276,
+ 0.3104625892579944,
+ 2.873239436619718,
+ 11.021936864633494,
+ 2.272727272727273,
+ 5.7926829268292686,
+ 0.3125814014066163,
+ 1.1308830866456012,
+ 7.704654895666131,
+ 1.1847998844097674,
+ 4.634040710264184,
+ 7.419354838709677
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(251, 154, 153)"
+ },
+ "name": "M1",
+ "text": [
+ 2.5851393188854486,
+ 0,
+ 0.025422651582560064,
+ 0.23664638269100743,
+ 0.04602638846271863,
+ 0,
+ 2.0648967551622417,
+ 0,
+ 0,
+ 0.04666355576294914,
+ 0.03567606136282554,
+ 0.056232427366447985,
+ 0.5807460352914898,
+ 0,
+ 0,
+ 2.1576763485477177,
+ 0.0197667523225934,
+ 0,
+ 0.07789678675754626,
+ 0,
+ 0.02653223666755107,
+ 0,
+ 0.9978048293753742,
+ 0,
+ 0,
+ 0,
+ 0.1178318931657502,
+ 2.93896006028636,
+ 0.09160864785635764,
+ 0.36111512350137226,
+ 0,
+ 0.044007627988851404,
+ 0,
+ 0,
+ 0.022593764121102578,
+ 0.055238445958387034,
+ 0,
+ 0,
+ 0.01035303861683404,
+ 0,
+ 3.125,
+ 0,
+ 0.022276676319893073,
+ 0,
+ 0,
+ 0.030553009471432937,
+ 0,
+ 0.15698587127158556,
+ 0.023353573096683792,
+ 0.03104625892579944,
+ 0,
+ 0,
+ 2.272727272727273,
+ 0.1524390243902439,
+ 0.052096900234436055,
+ 0.2827207716614003,
+ 0.2140181915462814,
+ 0,
+ 0.3897791251624079,
+ 0.967741935483871
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "11",
+ "14",
+ "15",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "7",
+ "8",
+ "18",
+ "25",
+ "29",
+ "3",
+ "12",
+ "13",
+ "16",
+ "17",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "9",
+ "60",
+ "62"
+ ],
+ "y": [
+ 2.5851393188854486,
+ 0,
+ 0.025422651582560064,
+ 0.23664638269100743,
+ 0.04602638846271863,
+ 0,
+ 2.0648967551622417,
+ 0,
+ 0,
+ 0.04666355576294914,
+ 0.03567606136282554,
+ 0.056232427366447985,
+ 0.5807460352914898,
+ 0,
+ 0,
+ 2.1576763485477177,
+ 0.0197667523225934,
+ 0,
+ 0.07789678675754626,
+ 0,
+ 0.02653223666755107,
+ 0,
+ 0.9978048293753742,
+ 0,
+ 0,
+ 0,
+ 0.1178318931657502,
+ 2.93896006028636,
+ 0.09160864785635764,
+ 0.36111512350137226,
+ 0,
+ 0.044007627988851404,
+ 0,
+ 0,
+ 0.022593764121102578,
+ 0.055238445958387034,
+ 0,
+ 0,
+ 0.01035303861683404,
+ 0,
+ 3.125,
+ 0,
+ 0.022276676319893073,
+ 0,
+ 0,
+ 0.030553009471432937,
+ 0,
+ 0.15698587127158556,
+ 0.023353573096683792,
+ 0.03104625892579944,
+ 0,
+ 0,
+ 2.272727272727273,
+ 0.1524390243902439,
+ 0.052096900234436055,
+ 0.2827207716614003,
+ 0.2140181915462814,
+ 0,
+ 0.3897791251624079,
+ 0.967741935483871
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(227, 26, 28)"
+ },
+ "name": "M2",
+ "text": [
+ 1.5479876160990713,
+ 0,
+ 0.012711325791280032,
+ 0.03380662609871535,
+ 0,
+ 0,
+ 0.029498525073746312,
+ 0.06268282490597576,
+ 0,
+ 0.031109037175299427,
+ 0,
+ 0,
+ 0.16752289479562207,
+ 0.04349717268377556,
+ 0.08806693086745927,
+ 1.0788381742738589,
+ 0,
+ 0,
+ 0.07789678675754626,
+ 0,
+ 0.10612894667020428,
+ 0,
+ 0.23947315905008978,
+ 0,
+ 0,
+ 0.04897159647404505,
+ 0,
+ 0.22607385079125847,
+ 0,
+ 0.01444460494005489,
+ 0,
+ 0.029338418659234266,
+ 0,
+ 0,
+ 0.11296882060551287,
+ 0.018412815319462345,
+ 0,
+ 0,
+ 0,
+ 0.08964589870013448,
+ 0.09282178217821782,
+ 0,
+ 0,
+ 0.046992481203007516,
+ 0.04264998578333807,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.35569105691056907,
+ 0,
+ 0.09978380176284717,
+ 1.0165864098448367,
+ 0.014448779078167894,
+ 0.6929406669553919,
+ 4.838709677419355
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "11",
+ "14",
+ "15",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "7",
+ "8",
+ "18",
+ "25",
+ "29",
+ "3",
+ "12",
+ "13",
+ "16",
+ "17",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "9",
+ "60",
+ "62"
+ ],
+ "y": [
+ 1.5479876160990713,
+ 0,
+ 0.012711325791280032,
+ 0.03380662609871535,
+ 0,
+ 0,
+ 0.029498525073746312,
+ 0.06268282490597576,
+ 0,
+ 0.031109037175299427,
+ 0,
+ 0,
+ 0.16752289479562207,
+ 0.04349717268377556,
+ 0.08806693086745927,
+ 1.0788381742738589,
+ 0,
+ 0,
+ 0.07789678675754626,
+ 0,
+ 0.10612894667020428,
+ 0,
+ 0.23947315905008978,
+ 0,
+ 0,
+ 0.04897159647404505,
+ 0,
+ 0.22607385079125847,
+ 0,
+ 0.01444460494005489,
+ 0,
+ 0.029338418659234266,
+ 0,
+ 0,
+ 0.11296882060551287,
+ 0.018412815319462345,
+ 0,
+ 0,
+ 0,
+ 0.08964589870013448,
+ 0.09282178217821782,
+ 0,
+ 0,
+ 0.046992481203007516,
+ 0.04264998578333807,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.35569105691056907,
+ 0,
+ 0.09978380176284717,
+ 1.0165864098448367,
+ 0.014448779078167894,
+ 0.6929406669553919,
+ 4.838709677419355
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(253, 191, 111)"
+ },
+ "name": "Treg",
+ "text": [
+ 0.07739938080495357,
+ 0,
+ 0,
+ 0,
+ 0.0613685179502915,
+ 0,
+ 0,
+ 0.020894274968658588,
+ 0.026954177897574125,
+ 0,
+ 0,
+ 0.09372071227741331,
+ 0,
+ 0.04349717268377556,
+ 0,
+ 0.08298755186721991,
+ 0,
+ 0,
+ 0.03894839337877313,
+ 0,
+ 0.02653223666755107,
+ 0.7874015748031495,
+ 0.6385950908002395,
+ 0.06662225183211193,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.01832172957127153,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.1779359430604982,
+ 0,
+ 0,
+ 0,
+ 0.056955716930086865,
+ 0.02070607723366808,
+ 0,
+ 0.03094059405940594,
+ 0,
+ 0.022276676319893073,
+ 0,
+ 0,
+ 0.015276504735716468,
+ 0,
+ 0,
+ 0,
+ 0.03104625892579944,
+ 0,
+ 0,
+ 2.272727272727273,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.014448779078167894,
+ 0.043308791684711995,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "11",
+ "14",
+ "15",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "7",
+ "8",
+ "18",
+ "25",
+ "29",
+ "3",
+ "12",
+ "13",
+ "16",
+ "17",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "9",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0.07739938080495357,
+ 0,
+ 0,
+ 0,
+ 0.0613685179502915,
+ 0,
+ 0,
+ 0.020894274968658588,
+ 0.026954177897574125,
+ 0,
+ 0,
+ 0.09372071227741331,
+ 0,
+ 0.04349717268377556,
+ 0,
+ 0.08298755186721991,
+ 0,
+ 0,
+ 0.03894839337877313,
+ 0,
+ 0.02653223666755107,
+ 0.7874015748031495,
+ 0.6385950908002395,
+ 0.06662225183211193,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.01832172957127153,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.1779359430604982,
+ 0,
+ 0,
+ 0,
+ 0.056955716930086865,
+ 0.02070607723366808,
+ 0,
+ 0.03094059405940594,
+ 0,
+ 0.022276676319893073,
+ 0,
+ 0,
+ 0.015276504735716468,
+ 0,
+ 0,
+ 0,
+ 0.03104625892579944,
+ 0,
+ 0,
+ 2.272727272727273,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.014448779078167894,
+ 0.043308791684711995,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(1.0, 0.4980392156862745, 0.0)"
+ },
+ "name": "IMMUNE_OTHER",
+ "text": [
+ 0.43343653250773995,
+ 0.4197610590894414,
+ 0.6737002669378416,
+ 0.6423258958755916,
+ 0.981896287204664,
+ 2.871717362554317,
+ 1.6814159292035398,
+ 3.238612620142081,
+ 0.40431266846361186,
+ 0.15554518587649713,
+ 3.2108455226542985,
+ 1.3870665417057169,
+ 1.3625195443377263,
+ 1.1309264897781643,
+ 9.64332892998679,
+ 5.892116182572614,
+ 7.96600118600514,
+ 1.7911091929218816,
+ 0.7984420642648491,
+ 1.0192525481313703,
+ 0.6102414433536747,
+ 0.7874015748031495,
+ 4.170824186789064,
+ 0.4663557628247834,
+ 0.09835259404966806,
+ 1.305909239307868,
+ 0.3534956794972506,
+ 2.0723436322532027,
+ 1.2092341517039207,
+ 2.5278058645096055,
+ 1.6655562958027983,
+ 4.987531172069826,
+ 0.6900978976087305,
+ 1.0676156583629894,
+ 1.6041572525982828,
+ 1.067943288528816,
+ 0.6993006993006993,
+ 0.39869001851060804,
+ 0.8593022051972253,
+ 1.8825638727028238,
+ 1.8254950495049505,
+ 0.832517140058766,
+ 1.70416573847182,
+ 0.9868421052631579,
+ 1.6917827694057437,
+ 0.4277421326000611,
+ 2.1286831028262174,
+ 4.23861852433281,
+ 0.39701074264362446,
+ 0.37255510710959333,
+ 0.7887323943661971,
+ 4.5478865703584805,
+ 0,
+ 2.9471544715447155,
+ 0.5209690023443605,
+ 0.7982704141027773,
+ 1.9796682718031033,
+ 0.5201560468140443,
+ 2.468601126028584,
+ 1.2903225806451613
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "11",
+ "14",
+ "15",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "7",
+ "8",
+ "18",
+ "25",
+ "29",
+ "3",
+ "12",
+ "13",
+ "16",
+ "17",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "9",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0.43343653250773995,
+ 0.4197610590894414,
+ 0.6737002669378416,
+ 0.6423258958755916,
+ 0.981896287204664,
+ 2.871717362554317,
+ 1.6814159292035398,
+ 3.238612620142081,
+ 0.40431266846361186,
+ 0.15554518587649713,
+ 3.2108455226542985,
+ 1.3870665417057169,
+ 1.3625195443377263,
+ 1.1309264897781643,
+ 9.64332892998679,
+ 5.892116182572614,
+ 7.96600118600514,
+ 1.7911091929218816,
+ 0.7984420642648491,
+ 1.0192525481313703,
+ 0.6102414433536747,
+ 0.7874015748031495,
+ 4.170824186789064,
+ 0.4663557628247834,
+ 0.09835259404966806,
+ 1.305909239307868,
+ 0.3534956794972506,
+ 2.0723436322532027,
+ 1.2092341517039207,
+ 2.5278058645096055,
+ 1.6655562958027983,
+ 4.987531172069826,
+ 0.6900978976087305,
+ 1.0676156583629894,
+ 1.6041572525982828,
+ 1.067943288528816,
+ 0.6993006993006993,
+ 0.39869001851060804,
+ 0.8593022051972253,
+ 1.8825638727028238,
+ 1.8254950495049505,
+ 0.832517140058766,
+ 1.70416573847182,
+ 0.9868421052631579,
+ 1.6917827694057437,
+ 0.4277421326000611,
+ 2.1286831028262174,
+ 4.23861852433281,
+ 0.39701074264362446,
+ 0.37255510710959333,
+ 0.7887323943661971,
+ 4.5478865703584805,
+ 0,
+ 2.9471544715447155,
+ 0.5209690023443605,
+ 0.7982704141027773,
+ 1.9796682718031033,
+ 0.5201560468140443,
+ 2.468601126028584,
+ 1.2903225806451613
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(202, 178, 214)"
+ },
+ "name": "CANCER",
+ "text": [
+ 61.62538699690403,
+ 8.976428802066517,
+ 90.78428880132198,
+ 61.629479377958084,
+ 35.624424670144215,
+ 81.56055167201964,
+ 72.18289085545723,
+ 70.41370664437943,
+ 79.51482479784366,
+ 70.33753305335199,
+ 35.06956831965751,
+ 26.316776007497655,
+ 70.66115702479338,
+ 51.63114397564158,
+ 62.79172170849846,
+ 15.684647302904564,
+ 55.44574026487447,
+ 94.00086318515322,
+ 93.59298928919182,
+ 88.08607021517554,
+ 38.657468824621915,
+ 27.95275590551181,
+ 59.229694671722214,
+ 65.48967355096602,
+ 89.08286206048685,
+ 71.12308194580477,
+ 89.59151610369207,
+ 14.80783722682743,
+ 57.80505679736167,
+ 52.809475660840675,
+ 68.37663779702422,
+ 69.15065277981518,
+ 92.52126464451933,
+ 23.843416370106763,
+ 73.99457749661093,
+ 85.2329221137912,
+ 49.01462174189447,
+ 64.27452655560302,
+ 86.66528626151776,
+ 82.65351860152398,
+ 75.74257425742574,
+ 50.783545543584715,
+ 82.9583426152818,
+ 87.59398496240601,
+ 80.56582314472563,
+ 63.0766880537733,
+ 88.43054720384846,
+ 72.68445839874411,
+ 53.10602522185894,
+ 85.06674945669047,
+ 70.53521126760563,
+ 69.55591225254146,
+ 25,
+ 74.13617886178862,
+ 90.70070330815317,
+ 90.63695326791951,
+ 51.2573568753344,
+ 68.38607137696864,
+ 85.70809874404503,
+ 48.70967741935484
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "11",
+ "14",
+ "15",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "7",
+ "8",
+ "18",
+ "25",
+ "29",
+ "3",
+ "12",
+ "13",
+ "16",
+ "17",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "9",
+ "60",
+ "62"
+ ],
+ "y": [
+ 61.62538699690403,
+ 8.976428802066517,
+ 90.78428880132198,
+ 61.629479377958084,
+ 35.624424670144215,
+ 81.56055167201964,
+ 72.18289085545723,
+ 70.41370664437943,
+ 79.51482479784366,
+ 70.33753305335199,
+ 35.06956831965751,
+ 26.316776007497655,
+ 70.66115702479338,
+ 51.63114397564158,
+ 62.79172170849846,
+ 15.684647302904564,
+ 55.44574026487447,
+ 94.00086318515322,
+ 93.59298928919182,
+ 88.08607021517554,
+ 38.657468824621915,
+ 27.95275590551181,
+ 59.229694671722214,
+ 65.48967355096602,
+ 89.08286206048685,
+ 71.12308194580477,
+ 89.59151610369207,
+ 14.80783722682743,
+ 57.80505679736167,
+ 52.809475660840675,
+ 68.37663779702422,
+ 69.15065277981518,
+ 92.52126464451933,
+ 23.843416370106763,
+ 73.99457749661093,
+ 85.2329221137912,
+ 49.01462174189447,
+ 64.27452655560302,
+ 86.66528626151776,
+ 82.65351860152398,
+ 75.74257425742574,
+ 50.783545543584715,
+ 82.9583426152818,
+ 87.59398496240601,
+ 80.56582314472563,
+ 63.0766880537733,
+ 88.43054720384846,
+ 72.68445839874411,
+ 53.10602522185894,
+ 85.06674945669047,
+ 70.53521126760563,
+ 69.55591225254146,
+ 25,
+ 74.13617886178862,
+ 90.70070330815317,
+ 90.63695326791951,
+ 51.2573568753344,
+ 68.38607137696864,
+ 85.70809874404503,
+ 48.70967741935484
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(106, 61, 154)"
+ },
+ "name": "αSMA_myCAF",
+ "text": [
+ 6.006191950464396,
+ 6.603164352599291,
+ 1.271132579128003,
+ 25.25354969574036,
+ 23.672905799324948,
+ 0.7557150954090308,
+ 2.5958702064896757,
+ 0.25073129962390306,
+ 1.3207547169811322,
+ 0.21776326022709597,
+ 25.615412058508742,
+ 19.66260543580131,
+ 0.05584096493187402,
+ 17.31187472814267,
+ 3.742844561867019,
+ 0.16597510373443983,
+ 1.838307966001186,
+ 0.7768666378938283,
+ 1.8500486854917235,
+ 0.4983012457531144,
+ 0.29185460334306185,
+ 1.574803149606299,
+ 0.15964877270005987,
+ 0.9993337774816788,
+ 0.3688222276862552,
+ 7.280444009141365,
+ 0.8248232521602514,
+ 69.51770911831197,
+ 16.049835104433857,
+ 9.648996099956667,
+ 3.7530535198756385,
+ 1.3495672583247762,
+ 0.4814636494944632,
+ 21.70818505338078,
+ 2.914595571622232,
+ 7.1625851592708525,
+ 1.5257469802924348,
+ 3.3461483696426026,
+ 0.2381198881871829,
+ 0.9861048857014791,
+ 0.8663366336633664,
+ 0.3428011753183154,
+ 0.08910670527957229,
+ 0,
+ 3.4119988626670454,
+ 21.387106630003057,
+ 1.2988574864702345,
+ 1.4128728414442702,
+ 36.47828117702009,
+ 7.295870847562869,
+ 17.464788732394364,
+ 6.046013911182451,
+ 2.272727272727273,
+ 0.1524390243902439,
+ 5.183641573326387,
+ 4.656577415599535,
+ 20.064205457463885,
+ 0.9680681982372489,
+ 4.634040710264184,
+ 29.354838709677416
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "11",
+ "14",
+ "15",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "7",
+ "8",
+ "18",
+ "25",
+ "29",
+ "3",
+ "12",
+ "13",
+ "16",
+ "17",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "9",
+ "60",
+ "62"
+ ],
+ "y": [
+ 6.006191950464396,
+ 6.603164352599291,
+ 1.271132579128003,
+ 25.25354969574036,
+ 23.672905799324948,
+ 0.7557150954090308,
+ 2.5958702064896757,
+ 0.25073129962390306,
+ 1.3207547169811322,
+ 0.21776326022709597,
+ 25.615412058508742,
+ 19.66260543580131,
+ 0.05584096493187402,
+ 17.31187472814267,
+ 3.742844561867019,
+ 0.16597510373443983,
+ 1.838307966001186,
+ 0.7768666378938283,
+ 1.8500486854917235,
+ 0.4983012457531144,
+ 0.29185460334306185,
+ 1.574803149606299,
+ 0.15964877270005987,
+ 0.9993337774816788,
+ 0.3688222276862552,
+ 7.280444009141365,
+ 0.8248232521602514,
+ 69.51770911831197,
+ 16.049835104433857,
+ 9.648996099956667,
+ 3.7530535198756385,
+ 1.3495672583247762,
+ 0.4814636494944632,
+ 21.70818505338078,
+ 2.914595571622232,
+ 7.1625851592708525,
+ 1.5257469802924348,
+ 3.3461483696426026,
+ 0.2381198881871829,
+ 0.9861048857014791,
+ 0.8663366336633664,
+ 0.3428011753183154,
+ 0.08910670527957229,
+ 0,
+ 3.4119988626670454,
+ 21.387106630003057,
+ 1.2988574864702345,
+ 1.4128728414442702,
+ 36.47828117702009,
+ 7.295870847562869,
+ 17.464788732394364,
+ 6.046013911182451,
+ 2.272727272727273,
+ 0.1524390243902439,
+ 5.183641573326387,
+ 4.656577415599535,
+ 20.064205457463885,
+ 0.9680681982372489,
+ 4.634040710264184,
+ 29.354838709677416
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(1.0, 1.0, 0.6)"
+ },
+ "name": "STROMA_OTHER",
+ "text": [
+ 8.204334365325078,
+ 82.3861801743623,
+ 4.004067624253209,
+ 7.8431372549019605,
+ 16.49278919914084,
+ 12.091441526544493,
+ 4.808259587020649,
+ 2.632678646050982,
+ 12.722371967654986,
+ 26.52045419194276,
+ 32.28683553335712,
+ 25.43580131208997,
+ 6.85727049363413,
+ 11.43975641583297,
+ 1.9815059445178336,
+ 0.16597510373443983,
+ 4.605653291164262,
+ 0.49633146309883475,
+ 1.6942551119766307,
+ 3.2842582106455263,
+ 11.223136110374105,
+ 3.149606299212598,
+ 5.807224106964678,
+ 24.117255163224517,
+ 7.892795672485862,
+ 11.68788769180542,
+ 6.009426551453259,
+ 4.672192916352675,
+ 12.678636863319898,
+ 30.680340892676583,
+ 20.00888296691095,
+ 5.867683731846853,
+ 3.1134649333975286,
+ 16.90391459074733,
+ 13.985539990962495,
+ 1.067943288528816,
+ 33.75715193897012,
+ 18.4251744268831,
+ 1.9877834144321358,
+ 9.816225907664725,
+ 9.498762376237623,
+ 44.0254652301665,
+ 7.329026509244821,
+ 7.471804511278196,
+ 11.415979528006824,
+ 8.218759547815461,
+ 3.2471437161755863,
+ 12.71585557299843,
+ 7.26296123306866,
+ 5.867742936976095,
+ 4.563380281690141,
+ 1.5516318887105405,
+ 13.636363636363635,
+ 14.329268292682926,
+ 1.8233915082052619,
+ 0.6485947114585066,
+ 9.523809523809524,
+ 18.971246929634447,
+ 0.043308791684711995,
+ 6.451612903225806
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "11",
+ "14",
+ "15",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "7",
+ "8",
+ "18",
+ "25",
+ "29",
+ "3",
+ "12",
+ "13",
+ "16",
+ "17",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "9",
+ "60",
+ "62"
+ ],
+ "y": [
+ 8.204334365325078,
+ 82.3861801743623,
+ 4.004067624253209,
+ 7.8431372549019605,
+ 16.49278919914084,
+ 12.091441526544493,
+ 4.808259587020649,
+ 2.632678646050982,
+ 12.722371967654986,
+ 26.52045419194276,
+ 32.28683553335712,
+ 25.43580131208997,
+ 6.85727049363413,
+ 11.43975641583297,
+ 1.9815059445178336,
+ 0.16597510373443983,
+ 4.605653291164262,
+ 0.49633146309883475,
+ 1.6942551119766307,
+ 3.2842582106455263,
+ 11.223136110374105,
+ 3.149606299212598,
+ 5.807224106964678,
+ 24.117255163224517,
+ 7.892795672485862,
+ 11.68788769180542,
+ 6.009426551453259,
+ 4.672192916352675,
+ 12.678636863319898,
+ 30.680340892676583,
+ 20.00888296691095,
+ 5.867683731846853,
+ 3.1134649333975286,
+ 16.90391459074733,
+ 13.985539990962495,
+ 1.067943288528816,
+ 33.75715193897012,
+ 18.4251744268831,
+ 1.9877834144321358,
+ 9.816225907664725,
+ 9.498762376237623,
+ 44.0254652301665,
+ 7.329026509244821,
+ 7.471804511278196,
+ 11.415979528006824,
+ 8.218759547815461,
+ 3.2471437161755863,
+ 12.71585557299843,
+ 7.26296123306866,
+ 5.867742936976095,
+ 4.563380281690141,
+ 1.5516318887105405,
+ 13.636363636363635,
+ 14.329268292682926,
+ 1.8233915082052619,
+ 0.6485947114585066,
+ 9.523809523809524,
+ 18.971246929634447,
+ 0.043308791684711995,
+ 6.451612903225806
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(177, 89, 40)"
+ },
+ "name": "ENDOTHELIAL",
+ "text": [
+ 5.185758513931889,
+ 1.4045850823377461,
+ 0.7245455701029617,
+ 2.9073698444895197,
+ 3.4980055231666154,
+ 1.7759304742112223,
+ 1.710914454277286,
+ 1.2954450480568325,
+ 1.2398921832884098,
+ 1.9132057862809144,
+ 1.9978594363182305,
+ 5.660731021555764,
+ 0.08934554389099844,
+ 13.571117877337974,
+ 0.26420079260237783,
+ 2.0746887966804977,
+ 0.98833761612967,
+ 1.5753129046180405,
+ 0.9737098344693282,
+ 0.6115515288788221,
+ 2.255240116741841,
+ 2.3622047244094486,
+ 3.2727998403512273,
+ 4.663557628247834,
+ 0.7376444553725104,
+ 3.493307215148547,
+ 0.432050274941084,
+ 1.6955538809344386,
+ 8.061561011359473,
+ 2.0078000866676295,
+ 1.1547856984232734,
+ 1.877658794190993,
+ 0.9950248756218906,
+ 26.156583629893237,
+ 1.8978761861726163,
+ 1.325722703001289,
+ 1.2714558169103625,
+ 3.1895201480848643,
+ 2.4536701521896678,
+ 1.9273868220528911,
+ 4.672029702970297,
+ 3.232125367286973,
+ 4.265983515259523,
+ 0.7518796992481203,
+ 1.6491327836224055,
+ 2.9483654139932782,
+ 0.9861695730607337,
+ 1.2558869701726845,
+ 2.335357309668379,
+ 0.5898789195901893,
+ 2.535211267605634,
+ 7.009095773140716,
+ 43.18181818181818,
+ 2.0325203252032518,
+ 1.3805678562125552,
+ 1.3470813237984367,
+ 4.012841091492777,
+ 3.22207773443144,
+ 1.3858813339107838,
+ 0.967741935483871
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "11",
+ "14",
+ "15",
+ "19",
+ "20",
+ "22",
+ "23",
+ "26",
+ "27",
+ "28",
+ "30",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "5",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "7",
+ "8",
+ "18",
+ "25",
+ "29",
+ "3",
+ "12",
+ "13",
+ "16",
+ "17",
+ "21",
+ "24",
+ "40",
+ "47",
+ "48",
+ "49",
+ "51",
+ "55",
+ "56",
+ "59",
+ "61",
+ "9",
+ "60",
+ "62"
+ ],
+ "y": [
+ 5.185758513931889,
+ 1.4045850823377461,
+ 0.7245455701029617,
+ 2.9073698444895197,
+ 3.4980055231666154,
+ 1.7759304742112223,
+ 1.710914454277286,
+ 1.2954450480568325,
+ 1.2398921832884098,
+ 1.9132057862809144,
+ 1.9978594363182305,
+ 5.660731021555764,
+ 0.08934554389099844,
+ 13.571117877337974,
+ 0.26420079260237783,
+ 2.0746887966804977,
+ 0.98833761612967,
+ 1.5753129046180405,
+ 0.9737098344693282,
+ 0.6115515288788221,
+ 2.255240116741841,
+ 2.3622047244094486,
+ 3.2727998403512273,
+ 4.663557628247834,
+ 0.7376444553725104,
+ 3.493307215148547,
+ 0.432050274941084,
+ 1.6955538809344386,
+ 8.061561011359473,
+ 2.0078000866676295,
+ 1.1547856984232734,
+ 1.877658794190993,
+ 0.9950248756218906,
+ 26.156583629893237,
+ 1.8978761861726163,
+ 1.325722703001289,
+ 1.2714558169103625,
+ 3.1895201480848643,
+ 2.4536701521896678,
+ 1.9273868220528911,
+ 4.672029702970297,
+ 3.232125367286973,
+ 4.265983515259523,
+ 0.7518796992481203,
+ 1.6491327836224055,
+ 2.9483654139932782,
+ 0.9861695730607337,
+ 1.2558869701726845,
+ 2.335357309668379,
+ 0.5898789195901893,
+ 2.535211267605634,
+ 7.009095773140716,
+ 43.18181818181818,
+ 2.0325203252032518,
+ 1.3805678562125552,
+ 1.3470813237984367,
+ 4.012841091492777,
+ 3.22207773443144,
+ 1.3858813339107838,
+ 0.967741935483871
+ ]
+ }
+ ],
+ "layout": {
+ "barmode": "stack",
+ "plot_bgcolor": "white",
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "Cell subtypes proportions by Patient and tissue type DD3"
+ },
+ "xaxis": {
+ "autorange": true,
+ "linecolor": "black",
+ "range": [
+ -0.5,
+ 59.5
+ ],
+ "type": "category"
+ },
+ "yaxis": {
+ "autorange": true,
+ "linecolor": "black",
+ "range": [
+ 0,
+ 105.26315789473685
+ ],
+ "title": {
+ "text": "Cell count (%)"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 56,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "fig = go.Figure()\n",
+ "title = 'Cell subtypes proportions by Patient and tissue type DD3'\n",
+ "\n",
+ "for cell_subtype in cell_subtypes:\n",
+ " fig.add_trace(\n",
+ " go.Bar(\n",
+ " name=cell_subtype,\n",
+ " x=counts_perc_patients['Patient'],\n",
+ " y=counts_perc_patients[f'{cell_subtype.lower()}_perc'],\n",
+ " text=counts_perc_patients[f'{cell_subtype.lower()}_perc'],\n",
+ " textposition='auto',\n",
+ " marker_color='rgb' + str(cell_subtype_color_dict[cell_subtype])))\n",
+ "\n",
+ "fig.update_layout(\n",
+ " plot_bgcolor='white',\n",
+ " barmode='stack',\n",
+ " title=title,\n",
+ " xaxis=dict(linecolor='black'),\n",
+ " yaxis=dict(title='Cell count (%)', linecolor='black'))\n",
+ "\n",
+ "output_filename = title.replace(\" \", \"_\") + \".png\"\n",
+ "#fig.write_image(output_images_dir + \"/\" + output_filename, scale=1000)\n",
+ "\n",
+ "fig.show()\n",
+ "plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ff541bd3-236a-4418-90a2-99d44e6ef5a0",
+ "metadata": {},
+ "source": [
+ "#### V.4.3.4 BY TREATMENT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "id": "eaaf663e-446c-4ee8-bb50-89ed23d9359e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " HLA_Cytoplasm_Intensity_Average \n",
+ " CKs_Cytoplasm_Intensity_Average \n",
+ " Ki67_Nucleus_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " ColVI_Cytoplasm_Intensity_Average \n",
+ " CD20_Cytoplasm_Intensity_Average \n",
+ " PD1_Cytoplasm_Intensity_Average \n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ " CD31_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nucleus_Roundness \n",
+ " Nuc_X \n",
+ " ROI_index \n",
+ " Nucleus_Size \n",
+ " Sample_ID \n",
+ " immune_checkpoint \n",
+ " Cell_Size \n",
+ " Patient \n",
+ " Unique_ROI_index \n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_0 \n",
+ " -0.677863 \n",
+ " -0.417494 \n",
+ " -0.912537 \n",
+ " -0.817876 \n",
+ " 0.930099 \n",
+ " 0.232078 \n",
+ " -0.483158 \n",
+ " 1.535604 \n",
+ " 0.807339 \n",
+ " 1.167755 \n",
+ " ... \n",
+ " 0.955040 \n",
+ " 1484.771729 \n",
+ " 0 \n",
+ " 127 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 339 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_1 \n",
+ " -0.677863 \n",
+ " -0.516487 \n",
+ " -0.838037 \n",
+ " -0.869685 \n",
+ " 1.114924 \n",
+ " 0.301333 \n",
+ " -0.344770 \n",
+ " 1.668368 \n",
+ " 0.875455 \n",
+ " 1.643023 \n",
+ " ... \n",
+ " 0.966643 \n",
+ " 1426.250000 \n",
+ " 0 \n",
+ " 112 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 344 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_2 \n",
+ " -0.677863 \n",
+ " -0.141921 \n",
+ " -1.016023 \n",
+ " -0.755879 \n",
+ " 0.834577 \n",
+ " 0.259216 \n",
+ " -0.438292 \n",
+ " 1.336308 \n",
+ " 0.705088 \n",
+ " 1.053636 \n",
+ " ... \n",
+ " 0.721534 \n",
+ " 1531.110474 \n",
+ " 0 \n",
+ " 181 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 422 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_3 \n",
+ " -0.741282 \n",
+ " -0.460472 \n",
+ " -0.491711 \n",
+ " -0.818084 \n",
+ " 0.648200 \n",
+ " 0.107027 \n",
+ " -0.444889 \n",
+ " 1.249805 \n",
+ " 0.660707 \n",
+ " 1.165861 \n",
+ " ... \n",
+ " 0.587196 \n",
+ " 1518.907593 \n",
+ " 0 \n",
+ " 119 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 278 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_6 \n",
+ " -0.621521 \n",
+ " -0.247254 \n",
+ " -0.867127 \n",
+ " -0.742544 \n",
+ " 0.810579 \n",
+ " 0.272128 \n",
+ " -0.507117 \n",
+ " 1.251434 \n",
+ " 0.947172 \n",
+ " 2.545301 \n",
+ " ... \n",
+ " 0.935716 \n",
+ " 1471.914917 \n",
+ " 0 \n",
+ " 47 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 204 \n",
+ " 61 \n",
+ " 61a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_62826 \n",
+ " -0.446025 \n",
+ " 0.480212 \n",
+ " 1.195440 \n",
+ " -0.081463 \n",
+ " -0.634343 \n",
+ " -0.883815 \n",
+ " 1.050928 \n",
+ " 0.164709 \n",
+ " 0.103986 \n",
+ " 0.171579 \n",
+ " ... \n",
+ " 0.609764 \n",
+ " 13449.426758 \n",
+ " 34 \n",
+ " 103 \n",
+ " DD5S3.csv \n",
+ " None \n",
+ " 237 \n",
+ " 187 \n",
+ " 187c \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_62828 \n",
+ " -0.414440 \n",
+ " 0.416668 \n",
+ " 1.542926 \n",
+ " -0.203248 \n",
+ " -0.076555 \n",
+ " -0.783759 \n",
+ " 0.423346 \n",
+ " 0.638305 \n",
+ " 0.346970 \n",
+ " 0.453372 \n",
+ " ... \n",
+ " 0.736844 \n",
+ " 13469.353516 \n",
+ " 34 \n",
+ " 65 \n",
+ " DD5S3.csv \n",
+ " None \n",
+ " 231 \n",
+ " 187 \n",
+ " 187c \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_62829 \n",
+ " -0.720569 \n",
+ " 0.072144 \n",
+ " -0.311962 \n",
+ " -0.481442 \n",
+ " 1.236053 \n",
+ " -0.468813 \n",
+ " 0.252353 \n",
+ " 2.129042 \n",
+ " 1.111809 \n",
+ " 1.340371 \n",
+ " ... \n",
+ " 0.691315 \n",
+ " 13390.447266 \n",
+ " 34 \n",
+ " 85 \n",
+ " DD5S3.csv \n",
+ " None \n",
+ " 224 \n",
+ " 187 \n",
+ " 187c \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_62830 \n",
+ " -0.442500 \n",
+ " 0.368654 \n",
+ " -1.491754 \n",
+ " -0.316270 \n",
+ " 0.029502 \n",
+ " -0.736522 \n",
+ " 0.390883 \n",
+ " 0.861894 \n",
+ " 0.461685 \n",
+ " 0.586409 \n",
+ " ... \n",
+ " 0.892707 \n",
+ " 13430.178711 \n",
+ " 34 \n",
+ " 56 \n",
+ " DD5S3.csv \n",
+ " None \n",
+ " 139 \n",
+ " 187 \n",
+ " 187c \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD5S3_Cell_62831 \n",
+ " 0.040892 \n",
+ " 1.166606 \n",
+ " -1.676753 \n",
+ " 0.249586 \n",
+ " -1.486438 \n",
+ " -1.072878 \n",
+ " 2.024627 \n",
+ " -0.730182 \n",
+ " -0.355148 \n",
+ " -0.360887 \n",
+ " ... \n",
+ " 0.676388 \n",
+ " 13445.479492 \n",
+ " 34 \n",
+ " 48 \n",
+ " DD5S3.csv \n",
+ " None \n",
+ " 183 \n",
+ " 187 \n",
+ " 187c \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
113959 rows Ć 40 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.677863 \n",
+ "DD3S1_Cell_1 -0.677863 \n",
+ "DD3S1_Cell_2 -0.677863 \n",
+ "DD3S1_Cell_3 -0.741282 \n",
+ "DD3S1_Cell_6 -0.621521 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 -0.446025 \n",
+ "DD5S3_Cell_62828 -0.414440 \n",
+ "DD5S3_Cell_62829 -0.720569 \n",
+ "DD5S3_Cell_62830 -0.442500 \n",
+ "DD5S3_Cell_62831 0.040892 \n",
+ "\n",
+ " HLA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.417494 \n",
+ "DD3S1_Cell_1 -0.516487 \n",
+ "DD3S1_Cell_2 -0.141921 \n",
+ "DD3S1_Cell_3 -0.460472 \n",
+ "DD3S1_Cell_6 -0.247254 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 0.480212 \n",
+ "DD5S3_Cell_62828 0.416668 \n",
+ "DD5S3_Cell_62829 0.072144 \n",
+ "DD5S3_Cell_62830 0.368654 \n",
+ "DD5S3_Cell_62831 1.166606 \n",
+ "\n",
+ " CKs_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.912537 \n",
+ "DD3S1_Cell_1 -0.838037 \n",
+ "DD3S1_Cell_2 -1.016023 \n",
+ "DD3S1_Cell_3 -0.491711 \n",
+ "DD3S1_Cell_6 -0.867127 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 1.195440 \n",
+ "DD5S3_Cell_62828 1.542926 \n",
+ "DD5S3_Cell_62829 -0.311962 \n",
+ "DD5S3_Cell_62830 -1.491754 \n",
+ "DD5S3_Cell_62831 -1.676753 \n",
+ "\n",
+ " Ki67_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.817876 \n",
+ "DD3S1_Cell_1 -0.869685 \n",
+ "DD3S1_Cell_2 -0.755879 \n",
+ "DD3S1_Cell_3 -0.818084 \n",
+ "DD3S1_Cell_6 -0.742544 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 -0.081463 \n",
+ "DD5S3_Cell_62828 -0.203248 \n",
+ "DD5S3_Cell_62829 -0.481442 \n",
+ "DD5S3_Cell_62830 -0.316270 \n",
+ "DD5S3_Cell_62831 0.249586 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.930099 \n",
+ "DD3S1_Cell_1 1.114924 \n",
+ "DD3S1_Cell_2 0.834577 \n",
+ "DD3S1_Cell_3 0.648200 \n",
+ "DD3S1_Cell_6 0.810579 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 -0.634343 \n",
+ "DD5S3_Cell_62828 -0.076555 \n",
+ "DD5S3_Cell_62829 1.236053 \n",
+ "DD5S3_Cell_62830 0.029502 \n",
+ "DD5S3_Cell_62831 -1.486438 \n",
+ "\n",
+ " ColVI_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.232078 \n",
+ "DD3S1_Cell_1 0.301333 \n",
+ "DD3S1_Cell_2 0.259216 \n",
+ "DD3S1_Cell_3 0.107027 \n",
+ "DD3S1_Cell_6 0.272128 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 -0.883815 \n",
+ "DD5S3_Cell_62828 -0.783759 \n",
+ "DD5S3_Cell_62829 -0.468813 \n",
+ "DD5S3_Cell_62830 -0.736522 \n",
+ "DD5S3_Cell_62831 -1.072878 \n",
+ "\n",
+ " CD20_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.483158 \n",
+ "DD3S1_Cell_1 -0.344770 \n",
+ "DD3S1_Cell_2 -0.438292 \n",
+ "DD3S1_Cell_3 -0.444889 \n",
+ "DD3S1_Cell_6 -0.507117 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 1.050928 \n",
+ "DD5S3_Cell_62828 0.423346 \n",
+ "DD5S3_Cell_62829 0.252353 \n",
+ "DD5S3_Cell_62830 0.390883 \n",
+ "DD5S3_Cell_62831 2.024627 \n",
+ "\n",
+ " PD1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 1.535604 \n",
+ "DD3S1_Cell_1 1.668368 \n",
+ "DD3S1_Cell_2 1.336308 \n",
+ "DD3S1_Cell_3 1.249805 \n",
+ "DD3S1_Cell_6 1.251434 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 0.164709 \n",
+ "DD5S3_Cell_62828 0.638305 \n",
+ "DD5S3_Cell_62829 2.129042 \n",
+ "DD5S3_Cell_62830 0.861894 \n",
+ "DD5S3_Cell_62831 -0.730182 \n",
+ "\n",
+ " AXL_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.807339 \n",
+ "DD3S1_Cell_1 0.875455 \n",
+ "DD3S1_Cell_2 0.705088 \n",
+ "DD3S1_Cell_3 0.660707 \n",
+ "DD3S1_Cell_6 0.947172 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 0.103986 \n",
+ "DD5S3_Cell_62828 0.346970 \n",
+ "DD5S3_Cell_62829 1.111809 \n",
+ "DD5S3_Cell_62830 0.461685 \n",
+ "DD5S3_Cell_62831 -0.355148 \n",
+ "\n",
+ " CD31_Cytoplasm_Intensity_Average ... Nucleus_Roundness \\\n",
+ "ID ... \n",
+ "DD3S1_Cell_0 1.167755 ... 0.955040 \n",
+ "DD3S1_Cell_1 1.643023 ... 0.966643 \n",
+ "DD3S1_Cell_2 1.053636 ... 0.721534 \n",
+ "DD3S1_Cell_3 1.165861 ... 0.587196 \n",
+ "DD3S1_Cell_6 2.545301 ... 0.935716 \n",
+ "... ... ... ... \n",
+ "DD5S3_Cell_62826 0.171579 ... 0.609764 \n",
+ "DD5S3_Cell_62828 0.453372 ... 0.736844 \n",
+ "DD5S3_Cell_62829 1.340371 ... 0.691315 \n",
+ "DD5S3_Cell_62830 0.586409 ... 0.892707 \n",
+ "DD5S3_Cell_62831 -0.360887 ... 0.676388 \n",
+ "\n",
+ " Nuc_X ROI_index Nucleus_Size Sample_ID \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 1484.771729 0 127 DD3S1.csv \n",
+ "DD3S1_Cell_1 1426.250000 0 112 DD3S1.csv \n",
+ "DD3S1_Cell_2 1531.110474 0 181 DD3S1.csv \n",
+ "DD3S1_Cell_3 1518.907593 0 119 DD3S1.csv \n",
+ "DD3S1_Cell_6 1471.914917 0 47 DD3S1.csv \n",
+ "... ... ... ... ... \n",
+ "DD5S3_Cell_62826 13449.426758 34 103 DD5S3.csv \n",
+ "DD5S3_Cell_62828 13469.353516 34 65 DD5S3.csv \n",
+ "DD5S3_Cell_62829 13390.447266 34 85 DD5S3.csv \n",
+ "DD5S3_Cell_62830 13430.178711 34 56 DD5S3.csv \n",
+ "DD5S3_Cell_62831 13445.479492 34 48 DD5S3.csv \n",
+ "\n",
+ " immune_checkpoint Cell_Size Patient Unique_ROI_index \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 None 339 61 61a \n",
+ "DD3S1_Cell_1 None 344 61 61a \n",
+ "DD3S1_Cell_2 None 422 61 61a \n",
+ "DD3S1_Cell_3 None 278 61 61a \n",
+ "DD3S1_Cell_6 None 204 61 61a \n",
+ "... ... ... ... ... \n",
+ "DD5S3_Cell_62826 None 237 187 187c \n",
+ "DD5S3_Cell_62828 None 231 187 187c \n",
+ "DD5S3_Cell_62829 None 224 187 187c \n",
+ "DD5S3_Cell_62830 None 139 187 187c \n",
+ "DD5S3_Cell_62831 None 183 187 187c \n",
+ "\n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ "ID \n",
+ "DD3S1_Cell_0 1.0 \n",
+ "DD3S1_Cell_1 1.0 \n",
+ "DD3S1_Cell_2 1.0 \n",
+ "DD3S1_Cell_3 1.0 \n",
+ "DD3S1_Cell_6 1.0 \n",
+ "... ... \n",
+ "DD5S3_Cell_62826 1.0 \n",
+ "DD5S3_Cell_62828 1.0 \n",
+ "DD5S3_Cell_62829 1.0 \n",
+ "DD5S3_Cell_62830 1.0 \n",
+ "DD5S3_Cell_62831 1.0 \n",
+ "\n",
+ "[113959 rows x 40 columns]"
+ ]
+ },
+ "execution_count": 57,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_NACT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "id": "4fad07ba-a1f7-4ea7-a9d2-54b18a2082ae",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['61' '32' '26' '15' '18' '11' '5' '51' '40' '7' '95' '121' '85' '111'\n",
+ " '116' '98' '119' '104' '89' '140' '137' '153' '149' '146' '162' '160'\n",
+ " '157' '171' '169' '183' '182' '179' '177' '174' '178' '187' '184' '141']\n",
+ "['62' '63' '59' '60' '33' '35' '36' '37' '38' '30' '25' '27' '29' '20'\n",
+ " '21' '22' '23' '24' '14' '16' '17' '19' '12' '8' '9' '10' '4' '52' '53'\n",
+ " '54' '55' '56' '57' '50' '42' '43' '44' '45' '47' '39' '41' '49' '46'\n",
+ " '48' '58' '28' '13' '6' '34' '3' '122' '125' '124' '94' '101' '86' '84'\n",
+ " '83' '91' '88' '87' '75' '74' '82' '81' '80' '79' '67' '66' '65' '64'\n",
+ " '73' '71' '69' '68' '123' '115' '114' '113' '120' '117' '126' '105' '103'\n",
+ " '102' '110' '109' '106' '166' '112' '108' '107' '97' '96' '100' '78' '77'\n",
+ " '70' '72' '99' '92' '90' '136' '135' '134' '133' '132' '131' '130' '129'\n",
+ " '144' '143' '155' '154' '150' '148' '147' '164' '161' '159' '128' '127'\n",
+ " '142' '139' '152' '158' '156' '172' '170' '168' '167' '165' '181' '180'\n",
+ " '176' '173' '175' '185' '186']\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Extraire les valeurs uniques de la colonne 'Patient'\n",
+ "num_NACT_patients = df_NACT['Patient'].unique()\n",
+ "num_ACT_patients = df_ACT['Patient'].unique()\n",
+ "\n",
+ "# NumƩros des patientes qui ont reƧu le traitement\n",
+ "print(num_NACT_patients)\n",
+ "print(num_ACT_patients)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "55464196-3344-4586-8ab1-1284941a070a",
+ "metadata": {},
+ "source": [
+ "##### V.4.3.4.1 NACT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "id": "387289e7-0272-4a45-ab3d-ea076210cbb2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " dc \n",
+ " b \n",
+ " tcd4 \n",
+ " tcd8 \n",
+ " m1 \n",
+ " m2 \n",
+ " treg \n",
+ " immune_other \n",
+ " cancer \n",
+ " αsma_mycaf \n",
+ " stroma_other \n",
+ " endothelial \n",
+ " Total_cells \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 7 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 26.0 \n",
+ " 556 \n",
+ " 409 \n",
+ " 5103 \n",
+ " 87 \n",
+ " 6194.0 \n",
+ " \n",
+ " \n",
+ " 111 \n",
+ " 27.0 \n",
+ " 1.0 \n",
+ " 2 \n",
+ " 30.0 \n",
+ " 10.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 39.0 \n",
+ " 899 \n",
+ " 1 \n",
+ " 3 \n",
+ " 10 \n",
+ " 1026.0 \n",
+ " \n",
+ " \n",
+ " 116 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 4 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 125 \n",
+ " 4 \n",
+ " 56 \n",
+ " 3 \n",
+ " 198.0 \n",
+ " \n",
+ " \n",
+ " 119 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 60 \n",
+ " 9.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 17.0 \n",
+ " 4289 \n",
+ " 16 \n",
+ " 104 \n",
+ " 34 \n",
+ " 4533.0 \n",
+ " \n",
+ " \n",
+ " 121 \n",
+ " 15.0 \n",
+ " 2.0 \n",
+ " 704 \n",
+ " 54.0 \n",
+ " 4.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 350.0 \n",
+ " 3652 \n",
+ " 183 \n",
+ " 236 \n",
+ " 587 \n",
+ " 5789.0 \n",
+ " \n",
+ " \n",
+ " 137 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 21 \n",
+ " 22.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 2.0 \n",
+ " 28.0 \n",
+ " 1302 \n",
+ " 409 \n",
+ " 202 \n",
+ " 101 \n",
+ " 2091.0 \n",
+ " \n",
+ " \n",
+ " 140 \n",
+ " 402.0 \n",
+ " 0.0 \n",
+ " 385 \n",
+ " 6.0 \n",
+ " 307.0 \n",
+ " 38.0 \n",
+ " 3.0 \n",
+ " 6.0 \n",
+ " 35 \n",
+ " 66 \n",
+ " 293 \n",
+ " 51 \n",
+ " 1592.0 \n",
+ " \n",
+ " \n",
+ " 141 \n",
+ " 42.0 \n",
+ " 0.0 \n",
+ " 158 \n",
+ " 21.0 \n",
+ " 10.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 25.0 \n",
+ " 71 \n",
+ " 565 \n",
+ " 154 \n",
+ " 73 \n",
+ " 1120.0 \n",
+ " \n",
+ " \n",
+ " 146 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 80 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 52.0 \n",
+ " 916 \n",
+ " 89 \n",
+ " 331 \n",
+ " 98 \n",
+ " 1578.0 \n",
+ " \n",
+ " \n",
+ " 149 \n",
+ " 20.0 \n",
+ " 0.0 \n",
+ " 270 \n",
+ " 25.0 \n",
+ " 275.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 265.0 \n",
+ " 735 \n",
+ " 1250 \n",
+ " 425 \n",
+ " 111 \n",
+ " 3379.0 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 4.0 \n",
+ " 0.0 \n",
+ " 32 \n",
+ " 7.0 \n",
+ " 7.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 19.0 \n",
+ " 1823 \n",
+ " 747 \n",
+ " 232 \n",
+ " 86 \n",
+ " 2958.0 \n",
+ " \n",
+ " \n",
+ " 153 \n",
+ " 2.0 \n",
+ " 1.0 \n",
+ " 567 \n",
+ " 24.0 \n",
+ " 61.0 \n",
+ " 14.0 \n",
+ " 3.0 \n",
+ " 283.0 \n",
+ " 1580 \n",
+ " 415 \n",
+ " 823 \n",
+ " 348 \n",
+ " 4121.0 \n",
+ " \n",
+ " \n",
+ " 157 \n",
+ " 12.0 \n",
+ " 1.0 \n",
+ " 16 \n",
+ " 173.0 \n",
+ " 2.0 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 89.0 \n",
+ " 2463 \n",
+ " 132 \n",
+ " 45 \n",
+ " 29 \n",
+ " 2969.0 \n",
+ " \n",
+ " \n",
+ " 162 \n",
+ " 6.0 \n",
+ " 1.0 \n",
+ " 76 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 31.0 \n",
+ " 2321 \n",
+ " 609 \n",
+ " 998 \n",
+ " 313 \n",
+ " 4360.0 \n",
+ " \n",
+ " \n",
+ " 169 \n",
+ " 68.0 \n",
+ " 0.0 \n",
+ " 202 \n",
+ " 21.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 17.0 \n",
+ " 1564 \n",
+ " 222 \n",
+ " 594 \n",
+ " 221 \n",
+ " 2911.0 \n",
+ " \n",
+ " \n",
+ " 174 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 24 \n",
+ " 4.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 46.0 \n",
+ " 295 \n",
+ " 1203 \n",
+ " 224 \n",
+ " 22 \n",
+ " 1820.0 \n",
+ " \n",
+ " \n",
+ " 177 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 131 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 28.0 \n",
+ " 259 \n",
+ " 768 \n",
+ " 275 \n",
+ " 457 \n",
+ " 1920.0 \n",
+ " \n",
+ " \n",
+ " 182 \n",
+ " 5.0 \n",
+ " 1.0 \n",
+ " 15 \n",
+ " 4.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 80.0 \n",
+ " 610 \n",
+ " 2 \n",
+ " 102 \n",
+ " 37 \n",
+ " 859.0 \n",
+ " \n",
+ " \n",
+ " 183 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 46 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 4.0 \n",
+ " 8.0 \n",
+ " 557 \n",
+ " 12 \n",
+ " 1046 \n",
+ " 173 \n",
+ " 1856.0 \n",
+ " \n",
+ " \n",
+ " 184 \n",
+ " 39.0 \n",
+ " 0.0 \n",
+ " 46 \n",
+ " 1.0 \n",
+ " 13.0 \n",
+ " 11.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 1708 \n",
+ " 5 \n",
+ " 40 \n",
+ " 13 \n",
+ " 1878.0 \n",
+ " \n",
+ " \n",
+ " 187 \n",
+ " 4.0 \n",
+ " 0.0 \n",
+ " 27 \n",
+ " 21.0 \n",
+ " 2.0 \n",
+ " 8.0 \n",
+ " 2.0 \n",
+ " 45.0 \n",
+ " 2599 \n",
+ " 716 \n",
+ " 52 \n",
+ " 14 \n",
+ " 3490.0 \n",
+ " \n",
+ " \n",
+ " 26 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 159 \n",
+ " 17.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 15.0 \n",
+ " 2950 \n",
+ " 49 \n",
+ " 472 \n",
+ " 46 \n",
+ " 3710.0 \n",
+ " \n",
+ " \n",
+ " 32 \n",
+ " 30.0 \n",
+ " 16.0 \n",
+ " 1137 \n",
+ " 628.0 \n",
+ " 52.0 \n",
+ " 15.0 \n",
+ " 0.0 \n",
+ " 122.0 \n",
+ " 6327 \n",
+ " 5 \n",
+ " 614 \n",
+ " 8 \n",
+ " 8954.0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 66 \n",
+ " 40.0 \n",
+ " 78.0 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 55.0 \n",
+ " 393 \n",
+ " 1845 \n",
+ " 124 \n",
+ " 45 \n",
+ " 2654.0 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 184 \n",
+ " 31.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 11.0 \n",
+ " 771 \n",
+ " 24 \n",
+ " 531 \n",
+ " 20 \n",
+ " 1573.0 \n",
+ " \n",
+ " \n",
+ " 85 \n",
+ " 32.0 \n",
+ " 0.0 \n",
+ " 216 \n",
+ " 22.0 \n",
+ " 41.0 \n",
+ " 16.0 \n",
+ " 0.0 \n",
+ " 309.0 \n",
+ " 4273 \n",
+ " 38 \n",
+ " 247 \n",
+ " 72 \n",
+ " 5266.0 \n",
+ " \n",
+ " \n",
+ " 89 \n",
+ " 18.0 \n",
+ " 0.0 \n",
+ " 253 \n",
+ " 17.0 \n",
+ " 22.0 \n",
+ " 8.0 \n",
+ " 5.0 \n",
+ " 194.0 \n",
+ " 2490 \n",
+ " 6 \n",
+ " 487 \n",
+ " 134 \n",
+ " 3634.0 \n",
+ " \n",
+ " \n",
+ " 95 \n",
+ " 37.0 \n",
+ " 1.0 \n",
+ " 69 \n",
+ " 166.0 \n",
+ " 5.0 \n",
+ " 44.0 \n",
+ " 1.0 \n",
+ " 549.0 \n",
+ " 1851 \n",
+ " 83 \n",
+ " 535 \n",
+ " 143 \n",
+ " 3484.0 \n",
+ " \n",
+ " \n",
+ " 98 \n",
+ " 25.0 \n",
+ " 0.0 \n",
+ " 790 \n",
+ " 72.0 \n",
+ " 73.0 \n",
+ " 70.0 \n",
+ " 2.0 \n",
+ " 81.0 \n",
+ " 2156 \n",
+ " 25 \n",
+ " 322 \n",
+ " 94 \n",
+ " 3710.0 \n",
+ " \n",
+ " \n",
+ " 104 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 169 \n",
+ " 30.0 \n",
+ " 1.0 \n",
+ " 2.0 \n",
+ " 3.0 \n",
+ " 69.0 \n",
+ " 1600 \n",
+ " 289 \n",
+ " 180 \n",
+ " 147 \n",
+ " 2491.0 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 0.0 \n",
+ " 27.0 \n",
+ " 328 \n",
+ " 395.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 83.0 \n",
+ " 8371 \n",
+ " 23 \n",
+ " 192 \n",
+ " 237 \n",
+ " 9659.0 \n",
+ " \n",
+ " \n",
+ " 160 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 5 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 30.0 \n",
+ " 1121 \n",
+ " 33 \n",
+ " 188 \n",
+ " 17 \n",
+ " 1396.0 \n",
+ " \n",
+ " \n",
+ " 171 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 95 \n",
+ " 28.0 \n",
+ " 25.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 67.0 \n",
+ " 523 \n",
+ " 118 \n",
+ " 704 \n",
+ " 143 \n",
+ " 1704.0 \n",
+ " \n",
+ " \n",
+ " 178 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 1613 \n",
+ " 220 \n",
+ " 81 \n",
+ " 37 \n",
+ " 1955.0 \n",
+ " \n",
+ " \n",
+ " 179 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 13 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 3.0 \n",
+ " 312 \n",
+ " 272 \n",
+ " 318 \n",
+ " 11 \n",
+ " 932.0 \n",
+ " \n",
+ " \n",
+ " 40 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 11 \n",
+ " 6.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 17.0 \n",
+ " 2274 \n",
+ " 1562 \n",
+ " 311 \n",
+ " 100 \n",
+ " 4282.0 \n",
+ " \n",
+ " \n",
+ " 51 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 4 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 11 \n",
+ " 1 \n",
+ " 6 \n",
+ " 19 \n",
+ " 44.0 \n",
+ " \n",
+ " \n",
+ " 61 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 79 \n",
+ " 144.0 \n",
+ " 4.0 \n",
+ " 19.0 \n",
+ " 0.0 \n",
+ " 37.0 \n",
+ " 958 \n",
+ " 375 \n",
+ " 178 \n",
+ " 75 \n",
+ " 1869.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " dc b tcd4 tcd8 m1 m2 treg immune_other cancer \\\n",
+ "11 1.0 0.0 7 5.0 0.0 0.0 0.0 26.0 556 \n",
+ "111 27.0 1.0 2 30.0 10.0 3.0 1.0 39.0 899 \n",
+ "116 3.0 0.0 4 2.0 0.0 0.0 0.0 1.0 125 \n",
+ "119 1.0 0.0 60 9.0 3.0 0.0 0.0 17.0 4289 \n",
+ "121 15.0 2.0 704 54.0 4.0 0.0 2.0 350.0 3652 \n",
+ "137 2.0 0.0 21 22.0 1.0 1.0 2.0 28.0 1302 \n",
+ "140 402.0 0.0 385 6.0 307.0 38.0 3.0 6.0 35 \n",
+ "141 42.0 0.0 158 21.0 10.0 1.0 0.0 25.0 71 \n",
+ "146 6.0 0.0 80 3.0 1.0 2.0 0.0 52.0 916 \n",
+ "149 20.0 0.0 270 25.0 275.0 3.0 0.0 265.0 735 \n",
+ "15 4.0 0.0 32 7.0 7.0 1.0 0.0 19.0 1823 \n",
+ "153 2.0 1.0 567 24.0 61.0 14.0 3.0 283.0 1580 \n",
+ "157 12.0 1.0 16 173.0 2.0 7.0 0.0 89.0 2463 \n",
+ "162 6.0 1.0 76 3.0 1.0 0.0 1.0 31.0 2321 \n",
+ "169 68.0 0.0 202 21.0 1.0 0.0 1.0 17.0 1564 \n",
+ "174 1.0 0.0 24 4.0 1.0 0.0 0.0 46.0 295 \n",
+ "177 1.0 0.0 131 0.0 1.0 0.0 0.0 28.0 259 \n",
+ "182 5.0 1.0 15 4.0 0.0 3.0 0.0 80.0 610 \n",
+ "183 6.0 0.0 46 3.0 0.0 1.0 4.0 8.0 557 \n",
+ "184 39.0 0.0 46 1.0 13.0 11.0 1.0 1.0 1708 \n",
+ "187 4.0 0.0 27 21.0 2.0 8.0 2.0 45.0 2599 \n",
+ "26 1.0 0.0 159 17.0 0.0 0.0 1.0 15.0 2950 \n",
+ "32 30.0 16.0 1137 628.0 52.0 15.0 0.0 122.0 6327 \n",
+ "5 1.0 1.0 66 40.0 78.0 6.0 0.0 55.0 393 \n",
+ "7 1.0 0.0 184 31.0 0.0 0.0 0.0 11.0 771 \n",
+ "85 32.0 0.0 216 22.0 41.0 16.0 0.0 309.0 4273 \n",
+ "89 18.0 0.0 253 17.0 22.0 8.0 5.0 194.0 2490 \n",
+ "95 37.0 1.0 69 166.0 5.0 44.0 1.0 549.0 1851 \n",
+ "98 25.0 0.0 790 72.0 73.0 70.0 2.0 81.0 2156 \n",
+ "104 0.0 1.0 169 30.0 1.0 2.0 3.0 69.0 1600 \n",
+ "18 0.0 27.0 328 395.0 1.0 0.0 2.0 83.0 8371 \n",
+ "160 0.0 0.0 5 2.0 0.0 0.0 0.0 30.0 1121 \n",
+ "171 0.0 0.0 95 28.0 25.0 1.0 0.0 67.0 523 \n",
+ "178 0.0 0.0 1 0.0 0.0 0.0 0.0 3.0 1613 \n",
+ "179 0.0 0.0 13 1.0 0.0 0.0 2.0 3.0 312 \n",
+ "40 0.0 0.0 11 6.0 1.0 0.0 0.0 17.0 2274 \n",
+ "51 0.0 0.0 4 1.0 1.0 0.0 1.0 0.0 11 \n",
+ "61 0.0 0.0 79 144.0 4.0 19.0 0.0 37.0 958 \n",
+ "\n",
+ " αsma_mycaf stroma_other endothelial Total_cells \n",
+ "11 409 5103 87 6194.0 \n",
+ "111 1 3 10 1026.0 \n",
+ "116 4 56 3 198.0 \n",
+ "119 16 104 34 4533.0 \n",
+ "121 183 236 587 5789.0 \n",
+ "137 409 202 101 2091.0 \n",
+ "140 66 293 51 1592.0 \n",
+ "141 565 154 73 1120.0 \n",
+ "146 89 331 98 1578.0 \n",
+ "149 1250 425 111 3379.0 \n",
+ "15 747 232 86 2958.0 \n",
+ "153 415 823 348 4121.0 \n",
+ "157 132 45 29 2969.0 \n",
+ "162 609 998 313 4360.0 \n",
+ "169 222 594 221 2911.0 \n",
+ "174 1203 224 22 1820.0 \n",
+ "177 768 275 457 1920.0 \n",
+ "182 2 102 37 859.0 \n",
+ "183 12 1046 173 1856.0 \n",
+ "184 5 40 13 1878.0 \n",
+ "187 716 52 14 3490.0 \n",
+ "26 49 472 46 3710.0 \n",
+ "32 5 614 8 8954.0 \n",
+ "5 1845 124 45 2654.0 \n",
+ "7 24 531 20 1573.0 \n",
+ "85 38 247 72 5266.0 \n",
+ "89 6 487 134 3634.0 \n",
+ "95 83 535 143 3484.0 \n",
+ "98 25 322 94 3710.0 \n",
+ "104 289 180 147 2491.0 \n",
+ "18 23 192 237 9659.0 \n",
+ "160 33 188 17 1396.0 \n",
+ "171 118 704 143 1704.0 \n",
+ "178 220 81 37 1955.0 \n",
+ "179 272 318 11 932.0 \n",
+ "40 1562 311 100 4282.0 \n",
+ "51 1 6 19 44.0 \n",
+ "61 375 178 75 1869.0 "
+ ]
+ },
+ "execution_count": 59,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Compter par numƩro de patiente pour les patientes NACT uniquement\n",
+ "patient_counts = {}\n",
+ "\n",
+ "# Boucle sur les sous-types de cellules pour compter les Ʃchantillons correspondants par patient\n",
+ "for subtype in cell_subtypes:\n",
+ " patient_counts[subtype.lower()] = pd.DataFrame({subtype.lower():\n",
+ " df.loc[\n",
+ " (df['cell_subtype'] == subtype) & (df['Patient'].isin(num_NACT_patients)), 'Patient'].value_counts()\n",
+ " }).sort_index()\n",
+ "\n",
+ "# ConcatƩnation des counts des sous-types de cellules en un seul DataFrame\n",
+ "counts_patients = pd.concat([pd.DataFrame(v) for v in patient_counts.values()], axis=1, sort=False)\n",
+ "counts_patients = counts_patients.fillna(0)\n",
+ "\n",
+ "# Ajout de la colonne de total de cellules comptƩes par patientes\n",
+ "counts_patients['Total_cells'] = counts_patients.sum(axis=1)\n",
+ "\n",
+ "# Enregistrement des counts des sous-types de cellules par patient dans un fichier CSV\n",
+ "filename_patients = os.path.join(output_data_dir, project_name + \"_cell_subtypes_number_by_patient_NACT.csv\")\n",
+ "counts_patients.to_csv(filename_patients, index=False)\n",
+ "counts_patients\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "id": "1745b771-5dbd-4ee7-8f82-d1e308a96eb4",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " dc \n",
+ " b \n",
+ " tcd4 \n",
+ " tcd8 \n",
+ " m1 \n",
+ " m2 \n",
+ " treg \n",
+ " immune_other \n",
+ " cancer \n",
+ " αsma_mycaf \n",
+ " ... \n",
+ " tcd8_perc \n",
+ " m1_perc \n",
+ " m2_perc \n",
+ " treg_perc \n",
+ " immune_other_perc \n",
+ " cancer_perc \n",
+ " αsma_mycaf_perc \n",
+ " stroma_other_perc \n",
+ " endothelial_perc \n",
+ " Patient \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 7 \n",
+ " 5.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 26.0 \n",
+ " 556 \n",
+ " 409 \n",
+ " ... \n",
+ " 0.080723 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.419761 \n",
+ " 8.976429 \n",
+ " 6.603164 \n",
+ " 82.386180 \n",
+ " 1.404585 \n",
+ " 11 \n",
+ " \n",
+ " \n",
+ " 111 \n",
+ " 27.0 \n",
+ " 1.0 \n",
+ " 2 \n",
+ " 30.0 \n",
+ " 10.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 39.0 \n",
+ " 899 \n",
+ " 1 \n",
+ " ... \n",
+ " 2.923977 \n",
+ " 0.974659 \n",
+ " 0.292398 \n",
+ " 0.097466 \n",
+ " 3.801170 \n",
+ " 87.621832 \n",
+ " 0.097466 \n",
+ " 0.292398 \n",
+ " 0.974659 \n",
+ " 111 \n",
+ " \n",
+ " \n",
+ " 116 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 4 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 125 \n",
+ " 4 \n",
+ " ... \n",
+ " 1.010101 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.505051 \n",
+ " 63.131313 \n",
+ " 2.020202 \n",
+ " 28.282828 \n",
+ " 1.515152 \n",
+ " 116 \n",
+ " \n",
+ " \n",
+ " 119 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 60 \n",
+ " 9.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 17.0 \n",
+ " 4289 \n",
+ " 16 \n",
+ " ... \n",
+ " 0.198544 \n",
+ " 0.066181 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.375028 \n",
+ " 94.617251 \n",
+ " 0.352967 \n",
+ " 2.294286 \n",
+ " 0.750055 \n",
+ " 119 \n",
+ " \n",
+ " \n",
+ " 121 \n",
+ " 15.0 \n",
+ " 2.0 \n",
+ " 704 \n",
+ " 54.0 \n",
+ " 4.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 350.0 \n",
+ " 3652 \n",
+ " 183 \n",
+ " ... \n",
+ " 0.932804 \n",
+ " 0.069097 \n",
+ " 0.000000 \n",
+ " 0.034548 \n",
+ " 6.045949 \n",
+ " 63.085162 \n",
+ " 3.161168 \n",
+ " 4.076697 \n",
+ " 10.139921 \n",
+ " 121 \n",
+ " \n",
+ " \n",
+ " 137 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 21 \n",
+ " 22.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 2.0 \n",
+ " 28.0 \n",
+ " 1302 \n",
+ " 409 \n",
+ " ... \n",
+ " 1.052128 \n",
+ " 0.047824 \n",
+ " 0.047824 \n",
+ " 0.095648 \n",
+ " 1.339072 \n",
+ " 62.266858 \n",
+ " 19.560019 \n",
+ " 9.660450 \n",
+ " 4.830225 \n",
+ " 137 \n",
+ " \n",
+ " \n",
+ " 140 \n",
+ " 402.0 \n",
+ " 0.0 \n",
+ " 385 \n",
+ " 6.0 \n",
+ " 307.0 \n",
+ " 38.0 \n",
+ " 3.0 \n",
+ " 6.0 \n",
+ " 35 \n",
+ " 66 \n",
+ " ... \n",
+ " 0.376884 \n",
+ " 19.283920 \n",
+ " 2.386935 \n",
+ " 0.188442 \n",
+ " 0.376884 \n",
+ " 2.198492 \n",
+ " 4.145729 \n",
+ " 18.404523 \n",
+ " 3.203518 \n",
+ " 140 \n",
+ " \n",
+ " \n",
+ " 141 \n",
+ " 42.0 \n",
+ " 0.0 \n",
+ " 158 \n",
+ " 21.0 \n",
+ " 10.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 25.0 \n",
+ " 71 \n",
+ " 565 \n",
+ " ... \n",
+ " 1.875000 \n",
+ " 0.892857 \n",
+ " 0.089286 \n",
+ " 0.000000 \n",
+ " 2.232143 \n",
+ " 6.339286 \n",
+ " 50.446429 \n",
+ " 13.750000 \n",
+ " 6.517857 \n",
+ " 141 \n",
+ " \n",
+ " \n",
+ " 146 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 80 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 52.0 \n",
+ " 916 \n",
+ " 89 \n",
+ " ... \n",
+ " 0.190114 \n",
+ " 0.063371 \n",
+ " 0.126743 \n",
+ " 0.000000 \n",
+ " 3.295311 \n",
+ " 58.048162 \n",
+ " 5.640051 \n",
+ " 20.975919 \n",
+ " 6.210393 \n",
+ " 146 \n",
+ " \n",
+ " \n",
+ " 149 \n",
+ " 20.0 \n",
+ " 0.0 \n",
+ " 270 \n",
+ " 25.0 \n",
+ " 275.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 265.0 \n",
+ " 735 \n",
+ " 1250 \n",
+ " ... \n",
+ " 0.739864 \n",
+ " 8.138503 \n",
+ " 0.088784 \n",
+ " 0.000000 \n",
+ " 7.842557 \n",
+ " 21.751998 \n",
+ " 36.993193 \n",
+ " 12.577686 \n",
+ " 3.284996 \n",
+ " 149 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 4.0 \n",
+ " 0.0 \n",
+ " 32 \n",
+ " 7.0 \n",
+ " 7.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 19.0 \n",
+ " 1823 \n",
+ " 747 \n",
+ " ... \n",
+ " 0.236646 \n",
+ " 0.236646 \n",
+ " 0.033807 \n",
+ " 0.000000 \n",
+ " 0.642326 \n",
+ " 61.629479 \n",
+ " 25.253550 \n",
+ " 7.843137 \n",
+ " 2.907370 \n",
+ " 15 \n",
+ " \n",
+ " \n",
+ " 153 \n",
+ " 2.0 \n",
+ " 1.0 \n",
+ " 567 \n",
+ " 24.0 \n",
+ " 61.0 \n",
+ " 14.0 \n",
+ " 3.0 \n",
+ " 283.0 \n",
+ " 1580 \n",
+ " 415 \n",
+ " ... \n",
+ " 0.582383 \n",
+ " 1.480223 \n",
+ " 0.339723 \n",
+ " 0.072798 \n",
+ " 6.867265 \n",
+ " 38.340209 \n",
+ " 10.070371 \n",
+ " 19.970881 \n",
+ " 8.444552 \n",
+ " 153 \n",
+ " \n",
+ " \n",
+ " 157 \n",
+ " 12.0 \n",
+ " 1.0 \n",
+ " 16 \n",
+ " 173.0 \n",
+ " 2.0 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 89.0 \n",
+ " 2463 \n",
+ " 132 \n",
+ " ... \n",
+ " 5.826878 \n",
+ " 0.067363 \n",
+ " 0.235770 \n",
+ " 0.000000 \n",
+ " 2.997642 \n",
+ " 82.957225 \n",
+ " 4.445941 \n",
+ " 1.515662 \n",
+ " 0.976760 \n",
+ " 157 \n",
+ " \n",
+ " \n",
+ " 162 \n",
+ " 6.0 \n",
+ " 1.0 \n",
+ " 76 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 31.0 \n",
+ " 2321 \n",
+ " 609 \n",
+ " ... \n",
+ " 0.068807 \n",
+ " 0.022936 \n",
+ " 0.000000 \n",
+ " 0.022936 \n",
+ " 0.711009 \n",
+ " 53.233945 \n",
+ " 13.967890 \n",
+ " 22.889908 \n",
+ " 7.178899 \n",
+ " 162 \n",
+ " \n",
+ " \n",
+ " 169 \n",
+ " 68.0 \n",
+ " 0.0 \n",
+ " 202 \n",
+ " 21.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 17.0 \n",
+ " 1564 \n",
+ " 222 \n",
+ " ... \n",
+ " 0.721402 \n",
+ " 0.034352 \n",
+ " 0.000000 \n",
+ " 0.034352 \n",
+ " 0.583992 \n",
+ " 53.727241 \n",
+ " 7.626245 \n",
+ " 20.405359 \n",
+ " 7.591893 \n",
+ " 169 \n",
+ " \n",
+ " \n",
+ " 174 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 24 \n",
+ " 4.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 46.0 \n",
+ " 295 \n",
+ " 1203 \n",
+ " ... \n",
+ " 0.219780 \n",
+ " 0.054945 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 2.527473 \n",
+ " 16.208791 \n",
+ " 66.098901 \n",
+ " 12.307692 \n",
+ " 1.208791 \n",
+ " 174 \n",
+ " \n",
+ " \n",
+ " 177 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 131 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 28.0 \n",
+ " 259 \n",
+ " 768 \n",
+ " ... \n",
+ " 0.000000 \n",
+ " 0.052083 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 1.458333 \n",
+ " 13.489583 \n",
+ " 40.000000 \n",
+ " 14.322917 \n",
+ " 23.802083 \n",
+ " 177 \n",
+ " \n",
+ " \n",
+ " 182 \n",
+ " 5.0 \n",
+ " 1.0 \n",
+ " 15 \n",
+ " 4.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 80.0 \n",
+ " 610 \n",
+ " 2 \n",
+ " ... \n",
+ " 0.465658 \n",
+ " 0.000000 \n",
+ " 0.349243 \n",
+ " 0.000000 \n",
+ " 9.313155 \n",
+ " 71.012806 \n",
+ " 0.232829 \n",
+ " 11.874272 \n",
+ " 4.307334 \n",
+ " 182 \n",
+ " \n",
+ " \n",
+ " 183 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 46 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 4.0 \n",
+ " 8.0 \n",
+ " 557 \n",
+ " 12 \n",
+ " ... \n",
+ " 0.161638 \n",
+ " 0.000000 \n",
+ " 0.053879 \n",
+ " 0.215517 \n",
+ " 0.431034 \n",
+ " 30.010776 \n",
+ " 0.646552 \n",
+ " 56.357759 \n",
+ " 9.321121 \n",
+ " 183 \n",
+ " \n",
+ " \n",
+ " 184 \n",
+ " 39.0 \n",
+ " 0.0 \n",
+ " 46 \n",
+ " 1.0 \n",
+ " 13.0 \n",
+ " 11.0 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 1708 \n",
+ " 5 \n",
+ " ... \n",
+ " 0.053248 \n",
+ " 0.692226 \n",
+ " 0.585729 \n",
+ " 0.053248 \n",
+ " 0.053248 \n",
+ " 90.947817 \n",
+ " 0.266241 \n",
+ " 2.129925 \n",
+ " 0.692226 \n",
+ " 184 \n",
+ " \n",
+ " \n",
+ " 187 \n",
+ " 4.0 \n",
+ " 0.0 \n",
+ " 27 \n",
+ " 21.0 \n",
+ " 2.0 \n",
+ " 8.0 \n",
+ " 2.0 \n",
+ " 45.0 \n",
+ " 2599 \n",
+ " 716 \n",
+ " ... \n",
+ " 0.601719 \n",
+ " 0.057307 \n",
+ " 0.229226 \n",
+ " 0.057307 \n",
+ " 1.289398 \n",
+ " 74.469914 \n",
+ " 20.515759 \n",
+ " 1.489971 \n",
+ " 0.401146 \n",
+ " 187 \n",
+ " \n",
+ " \n",
+ " 26 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 159 \n",
+ " 17.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 15.0 \n",
+ " 2950 \n",
+ " 49 \n",
+ " ... \n",
+ " 0.458221 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.026954 \n",
+ " 0.404313 \n",
+ " 79.514825 \n",
+ " 1.320755 \n",
+ " 12.722372 \n",
+ " 1.239892 \n",
+ " 26 \n",
+ " \n",
+ " \n",
+ " 32 \n",
+ " 30.0 \n",
+ " 16.0 \n",
+ " 1137 \n",
+ " 628.0 \n",
+ " 52.0 \n",
+ " 15.0 \n",
+ " 0.0 \n",
+ " 122.0 \n",
+ " 6327 \n",
+ " 5 \n",
+ " ... \n",
+ " 7.013625 \n",
+ " 0.580746 \n",
+ " 0.167523 \n",
+ " 0.000000 \n",
+ " 1.362520 \n",
+ " 70.661157 \n",
+ " 0.055841 \n",
+ " 6.857270 \n",
+ " 0.089346 \n",
+ " 32 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 66 \n",
+ " 40.0 \n",
+ " 78.0 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 55.0 \n",
+ " 393 \n",
+ " 1845 \n",
+ " ... \n",
+ " 1.507159 \n",
+ " 2.938960 \n",
+ " 0.226074 \n",
+ " 0.000000 \n",
+ " 2.072344 \n",
+ " 14.807837 \n",
+ " 69.517709 \n",
+ " 4.672193 \n",
+ " 1.695554 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 184 \n",
+ " 31.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 11.0 \n",
+ " 771 \n",
+ " 24 \n",
+ " ... \n",
+ " 1.970757 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.699301 \n",
+ " 49.014622 \n",
+ " 1.525747 \n",
+ " 33.757152 \n",
+ " 1.271456 \n",
+ " 7 \n",
+ " \n",
+ " \n",
+ " 85 \n",
+ " 32.0 \n",
+ " 0.0 \n",
+ " 216 \n",
+ " 22.0 \n",
+ " 41.0 \n",
+ " 16.0 \n",
+ " 0.0 \n",
+ " 309.0 \n",
+ " 4273 \n",
+ " 38 \n",
+ " ... \n",
+ " 0.417774 \n",
+ " 0.778580 \n",
+ " 0.303836 \n",
+ " 0.000000 \n",
+ " 5.867831 \n",
+ " 81.143183 \n",
+ " 0.721610 \n",
+ " 4.690467 \n",
+ " 1.367262 \n",
+ " 85 \n",
+ " \n",
+ " \n",
+ " 89 \n",
+ " 18.0 \n",
+ " 0.0 \n",
+ " 253 \n",
+ " 17.0 \n",
+ " 22.0 \n",
+ " 8.0 \n",
+ " 5.0 \n",
+ " 194.0 \n",
+ " 2490 \n",
+ " 6 \n",
+ " ... \n",
+ " 0.467804 \n",
+ " 0.605394 \n",
+ " 0.220143 \n",
+ " 0.137589 \n",
+ " 5.338470 \n",
+ " 68.519538 \n",
+ " 0.165107 \n",
+ " 13.401211 \n",
+ " 3.687397 \n",
+ " 89 \n",
+ " \n",
+ " \n",
+ " 95 \n",
+ " 37.0 \n",
+ " 1.0 \n",
+ " 69 \n",
+ " 166.0 \n",
+ " 5.0 \n",
+ " 44.0 \n",
+ " 1.0 \n",
+ " 549.0 \n",
+ " 1851 \n",
+ " 83 \n",
+ " ... \n",
+ " 4.764638 \n",
+ " 0.143513 \n",
+ " 1.262916 \n",
+ " 0.028703 \n",
+ " 15.757750 \n",
+ " 53.128588 \n",
+ " 2.382319 \n",
+ " 15.355913 \n",
+ " 4.104478 \n",
+ " 95 \n",
+ " \n",
+ " \n",
+ " 98 \n",
+ " 25.0 \n",
+ " 0.0 \n",
+ " 790 \n",
+ " 72.0 \n",
+ " 73.0 \n",
+ " 70.0 \n",
+ " 2.0 \n",
+ " 81.0 \n",
+ " 2156 \n",
+ " 25 \n",
+ " ... \n",
+ " 1.940701 \n",
+ " 1.967655 \n",
+ " 1.886792 \n",
+ " 0.053908 \n",
+ " 2.183288 \n",
+ " 58.113208 \n",
+ " 0.673854 \n",
+ " 8.679245 \n",
+ " 2.533693 \n",
+ " 98 \n",
+ " \n",
+ " \n",
+ " 104 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 169 \n",
+ " 30.0 \n",
+ " 1.0 \n",
+ " 2.0 \n",
+ " 3.0 \n",
+ " 69.0 \n",
+ " 1600 \n",
+ " 289 \n",
+ " ... \n",
+ " 1.204336 \n",
+ " 0.040145 \n",
+ " 0.080289 \n",
+ " 0.120434 \n",
+ " 2.769972 \n",
+ " 64.231232 \n",
+ " 11.601766 \n",
+ " 7.226014 \n",
+ " 5.901244 \n",
+ " 104 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 0.0 \n",
+ " 27.0 \n",
+ " 328 \n",
+ " 395.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 83.0 \n",
+ " 8371 \n",
+ " 23 \n",
+ " ... \n",
+ " 4.089450 \n",
+ " 0.010353 \n",
+ " 0.000000 \n",
+ " 0.020706 \n",
+ " 0.859302 \n",
+ " 86.665286 \n",
+ " 0.238120 \n",
+ " 1.987783 \n",
+ " 2.453670 \n",
+ " 18 \n",
+ " \n",
+ " \n",
+ " 160 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 5 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 30.0 \n",
+ " 1121 \n",
+ " 33 \n",
+ " ... \n",
+ " 0.143266 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 2.148997 \n",
+ " 80.300860 \n",
+ " 2.363897 \n",
+ " 13.467049 \n",
+ " 1.217765 \n",
+ " 160 \n",
+ " \n",
+ " \n",
+ " 171 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 95 \n",
+ " 28.0 \n",
+ " 25.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 67.0 \n",
+ " 523 \n",
+ " 118 \n",
+ " ... \n",
+ " 1.643192 \n",
+ " 1.467136 \n",
+ " 0.058685 \n",
+ " 0.000000 \n",
+ " 3.931925 \n",
+ " 30.692488 \n",
+ " 6.924883 \n",
+ " 41.314554 \n",
+ " 8.392019 \n",
+ " 171 \n",
+ " \n",
+ " \n",
+ " 178 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 1613 \n",
+ " 220 \n",
+ " ... \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.153453 \n",
+ " 82.506394 \n",
+ " 11.253197 \n",
+ " 4.143223 \n",
+ " 1.892583 \n",
+ " 178 \n",
+ " \n",
+ " \n",
+ " 179 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 13 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 3.0 \n",
+ " 312 \n",
+ " 272 \n",
+ " ... \n",
+ " 0.107296 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.214592 \n",
+ " 0.321888 \n",
+ " 33.476395 \n",
+ " 29.184549 \n",
+ " 34.120172 \n",
+ " 1.180258 \n",
+ " 179 \n",
+ " \n",
+ " \n",
+ " 40 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 11 \n",
+ " 6.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 17.0 \n",
+ " 2274 \n",
+ " 1562 \n",
+ " ... \n",
+ " 0.140121 \n",
+ " 0.023354 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.397011 \n",
+ " 53.106025 \n",
+ " 36.478281 \n",
+ " 7.262961 \n",
+ " 2.335357 \n",
+ " 40 \n",
+ " \n",
+ " \n",
+ " 51 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 4 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 11 \n",
+ " 1 \n",
+ " ... \n",
+ " 2.272727 \n",
+ " 2.272727 \n",
+ " 0.000000 \n",
+ " 2.272727 \n",
+ " 0.000000 \n",
+ " 25.000000 \n",
+ " 2.272727 \n",
+ " 13.636364 \n",
+ " 43.181818 \n",
+ " 51 \n",
+ " \n",
+ " \n",
+ " 61 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 79 \n",
+ " 144.0 \n",
+ " 4.0 \n",
+ " 19.0 \n",
+ " 0.0 \n",
+ " 37.0 \n",
+ " 958 \n",
+ " 375 \n",
+ " ... \n",
+ " 7.704655 \n",
+ " 0.214018 \n",
+ " 1.016586 \n",
+ " 0.000000 \n",
+ " 1.979668 \n",
+ " 51.257357 \n",
+ " 20.064205 \n",
+ " 9.523810 \n",
+ " 4.012841 \n",
+ " 61 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
38 rows Ć 26 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " dc b tcd4 tcd8 m1 m2 treg immune_other cancer \\\n",
+ "11 1.0 0.0 7 5.0 0.0 0.0 0.0 26.0 556 \n",
+ "111 27.0 1.0 2 30.0 10.0 3.0 1.0 39.0 899 \n",
+ "116 3.0 0.0 4 2.0 0.0 0.0 0.0 1.0 125 \n",
+ "119 1.0 0.0 60 9.0 3.0 0.0 0.0 17.0 4289 \n",
+ "121 15.0 2.0 704 54.0 4.0 0.0 2.0 350.0 3652 \n",
+ "137 2.0 0.0 21 22.0 1.0 1.0 2.0 28.0 1302 \n",
+ "140 402.0 0.0 385 6.0 307.0 38.0 3.0 6.0 35 \n",
+ "141 42.0 0.0 158 21.0 10.0 1.0 0.0 25.0 71 \n",
+ "146 6.0 0.0 80 3.0 1.0 2.0 0.0 52.0 916 \n",
+ "149 20.0 0.0 270 25.0 275.0 3.0 0.0 265.0 735 \n",
+ "15 4.0 0.0 32 7.0 7.0 1.0 0.0 19.0 1823 \n",
+ "153 2.0 1.0 567 24.0 61.0 14.0 3.0 283.0 1580 \n",
+ "157 12.0 1.0 16 173.0 2.0 7.0 0.0 89.0 2463 \n",
+ "162 6.0 1.0 76 3.0 1.0 0.0 1.0 31.0 2321 \n",
+ "169 68.0 0.0 202 21.0 1.0 0.0 1.0 17.0 1564 \n",
+ "174 1.0 0.0 24 4.0 1.0 0.0 0.0 46.0 295 \n",
+ "177 1.0 0.0 131 0.0 1.0 0.0 0.0 28.0 259 \n",
+ "182 5.0 1.0 15 4.0 0.0 3.0 0.0 80.0 610 \n",
+ "183 6.0 0.0 46 3.0 0.0 1.0 4.0 8.0 557 \n",
+ "184 39.0 0.0 46 1.0 13.0 11.0 1.0 1.0 1708 \n",
+ "187 4.0 0.0 27 21.0 2.0 8.0 2.0 45.0 2599 \n",
+ "26 1.0 0.0 159 17.0 0.0 0.0 1.0 15.0 2950 \n",
+ "32 30.0 16.0 1137 628.0 52.0 15.0 0.0 122.0 6327 \n",
+ "5 1.0 1.0 66 40.0 78.0 6.0 0.0 55.0 393 \n",
+ "7 1.0 0.0 184 31.0 0.0 0.0 0.0 11.0 771 \n",
+ "85 32.0 0.0 216 22.0 41.0 16.0 0.0 309.0 4273 \n",
+ "89 18.0 0.0 253 17.0 22.0 8.0 5.0 194.0 2490 \n",
+ "95 37.0 1.0 69 166.0 5.0 44.0 1.0 549.0 1851 \n",
+ "98 25.0 0.0 790 72.0 73.0 70.0 2.0 81.0 2156 \n",
+ "104 0.0 1.0 169 30.0 1.0 2.0 3.0 69.0 1600 \n",
+ "18 0.0 27.0 328 395.0 1.0 0.0 2.0 83.0 8371 \n",
+ "160 0.0 0.0 5 2.0 0.0 0.0 0.0 30.0 1121 \n",
+ "171 0.0 0.0 95 28.0 25.0 1.0 0.0 67.0 523 \n",
+ "178 0.0 0.0 1 0.0 0.0 0.0 0.0 3.0 1613 \n",
+ "179 0.0 0.0 13 1.0 0.0 0.0 2.0 3.0 312 \n",
+ "40 0.0 0.0 11 6.0 1.0 0.0 0.0 17.0 2274 \n",
+ "51 0.0 0.0 4 1.0 1.0 0.0 1.0 0.0 11 \n",
+ "61 0.0 0.0 79 144.0 4.0 19.0 0.0 37.0 958 \n",
+ "\n",
+ " αsma_mycaf ... tcd8_perc m1_perc m2_perc treg_perc \\\n",
+ "11 409 ... 0.080723 0.000000 0.000000 0.000000 \n",
+ "111 1 ... 2.923977 0.974659 0.292398 0.097466 \n",
+ "116 4 ... 1.010101 0.000000 0.000000 0.000000 \n",
+ "119 16 ... 0.198544 0.066181 0.000000 0.000000 \n",
+ "121 183 ... 0.932804 0.069097 0.000000 0.034548 \n",
+ "137 409 ... 1.052128 0.047824 0.047824 0.095648 \n",
+ "140 66 ... 0.376884 19.283920 2.386935 0.188442 \n",
+ "141 565 ... 1.875000 0.892857 0.089286 0.000000 \n",
+ "146 89 ... 0.190114 0.063371 0.126743 0.000000 \n",
+ "149 1250 ... 0.739864 8.138503 0.088784 0.000000 \n",
+ "15 747 ... 0.236646 0.236646 0.033807 0.000000 \n",
+ "153 415 ... 0.582383 1.480223 0.339723 0.072798 \n",
+ "157 132 ... 5.826878 0.067363 0.235770 0.000000 \n",
+ "162 609 ... 0.068807 0.022936 0.000000 0.022936 \n",
+ "169 222 ... 0.721402 0.034352 0.000000 0.034352 \n",
+ "174 1203 ... 0.219780 0.054945 0.000000 0.000000 \n",
+ "177 768 ... 0.000000 0.052083 0.000000 0.000000 \n",
+ "182 2 ... 0.465658 0.000000 0.349243 0.000000 \n",
+ "183 12 ... 0.161638 0.000000 0.053879 0.215517 \n",
+ "184 5 ... 0.053248 0.692226 0.585729 0.053248 \n",
+ "187 716 ... 0.601719 0.057307 0.229226 0.057307 \n",
+ "26 49 ... 0.458221 0.000000 0.000000 0.026954 \n",
+ "32 5 ... 7.013625 0.580746 0.167523 0.000000 \n",
+ "5 1845 ... 1.507159 2.938960 0.226074 0.000000 \n",
+ "7 24 ... 1.970757 0.000000 0.000000 0.000000 \n",
+ "85 38 ... 0.417774 0.778580 0.303836 0.000000 \n",
+ "89 6 ... 0.467804 0.605394 0.220143 0.137589 \n",
+ "95 83 ... 4.764638 0.143513 1.262916 0.028703 \n",
+ "98 25 ... 1.940701 1.967655 1.886792 0.053908 \n",
+ "104 289 ... 1.204336 0.040145 0.080289 0.120434 \n",
+ "18 23 ... 4.089450 0.010353 0.000000 0.020706 \n",
+ "160 33 ... 0.143266 0.000000 0.000000 0.000000 \n",
+ "171 118 ... 1.643192 1.467136 0.058685 0.000000 \n",
+ "178 220 ... 0.000000 0.000000 0.000000 0.000000 \n",
+ "179 272 ... 0.107296 0.000000 0.000000 0.214592 \n",
+ "40 1562 ... 0.140121 0.023354 0.000000 0.000000 \n",
+ "51 1 ... 2.272727 2.272727 0.000000 2.272727 \n",
+ "61 375 ... 7.704655 0.214018 1.016586 0.000000 \n",
+ "\n",
+ " immune_other_perc cancer_perc αsma_mycaf_perc stroma_other_perc \\\n",
+ "11 0.419761 8.976429 6.603164 82.386180 \n",
+ "111 3.801170 87.621832 0.097466 0.292398 \n",
+ "116 0.505051 63.131313 2.020202 28.282828 \n",
+ "119 0.375028 94.617251 0.352967 2.294286 \n",
+ "121 6.045949 63.085162 3.161168 4.076697 \n",
+ "137 1.339072 62.266858 19.560019 9.660450 \n",
+ "140 0.376884 2.198492 4.145729 18.404523 \n",
+ "141 2.232143 6.339286 50.446429 13.750000 \n",
+ "146 3.295311 58.048162 5.640051 20.975919 \n",
+ "149 7.842557 21.751998 36.993193 12.577686 \n",
+ "15 0.642326 61.629479 25.253550 7.843137 \n",
+ "153 6.867265 38.340209 10.070371 19.970881 \n",
+ "157 2.997642 82.957225 4.445941 1.515662 \n",
+ "162 0.711009 53.233945 13.967890 22.889908 \n",
+ "169 0.583992 53.727241 7.626245 20.405359 \n",
+ "174 2.527473 16.208791 66.098901 12.307692 \n",
+ "177 1.458333 13.489583 40.000000 14.322917 \n",
+ "182 9.313155 71.012806 0.232829 11.874272 \n",
+ "183 0.431034 30.010776 0.646552 56.357759 \n",
+ "184 0.053248 90.947817 0.266241 2.129925 \n",
+ "187 1.289398 74.469914 20.515759 1.489971 \n",
+ "26 0.404313 79.514825 1.320755 12.722372 \n",
+ "32 1.362520 70.661157 0.055841 6.857270 \n",
+ "5 2.072344 14.807837 69.517709 4.672193 \n",
+ "7 0.699301 49.014622 1.525747 33.757152 \n",
+ "85 5.867831 81.143183 0.721610 4.690467 \n",
+ "89 5.338470 68.519538 0.165107 13.401211 \n",
+ "95 15.757750 53.128588 2.382319 15.355913 \n",
+ "98 2.183288 58.113208 0.673854 8.679245 \n",
+ "104 2.769972 64.231232 11.601766 7.226014 \n",
+ "18 0.859302 86.665286 0.238120 1.987783 \n",
+ "160 2.148997 80.300860 2.363897 13.467049 \n",
+ "171 3.931925 30.692488 6.924883 41.314554 \n",
+ "178 0.153453 82.506394 11.253197 4.143223 \n",
+ "179 0.321888 33.476395 29.184549 34.120172 \n",
+ "40 0.397011 53.106025 36.478281 7.262961 \n",
+ "51 0.000000 25.000000 2.272727 13.636364 \n",
+ "61 1.979668 51.257357 20.064205 9.523810 \n",
+ "\n",
+ " endothelial_perc Patient \n",
+ "11 1.404585 11 \n",
+ "111 0.974659 111 \n",
+ "116 1.515152 116 \n",
+ "119 0.750055 119 \n",
+ "121 10.139921 121 \n",
+ "137 4.830225 137 \n",
+ "140 3.203518 140 \n",
+ "141 6.517857 141 \n",
+ "146 6.210393 146 \n",
+ "149 3.284996 149 \n",
+ "15 2.907370 15 \n",
+ "153 8.444552 153 \n",
+ "157 0.976760 157 \n",
+ "162 7.178899 162 \n",
+ "169 7.591893 169 \n",
+ "174 1.208791 174 \n",
+ "177 23.802083 177 \n",
+ "182 4.307334 182 \n",
+ "183 9.321121 183 \n",
+ "184 0.692226 184 \n",
+ "187 0.401146 187 \n",
+ "26 1.239892 26 \n",
+ "32 0.089346 32 \n",
+ "5 1.695554 5 \n",
+ "7 1.271456 7 \n",
+ "85 1.367262 85 \n",
+ "89 3.687397 89 \n",
+ "95 4.104478 95 \n",
+ "98 2.533693 98 \n",
+ "104 5.901244 104 \n",
+ "18 2.453670 18 \n",
+ "160 1.217765 160 \n",
+ "171 8.392019 171 \n",
+ "178 1.892583 178 \n",
+ "179 1.180258 179 \n",
+ "40 2.335357 40 \n",
+ "51 43.181818 51 \n",
+ "61 4.012841 61 \n",
+ "\n",
+ "[38 rows x 26 columns]"
+ ]
+ },
+ "execution_count": 60,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Ajout des colonnes de pourcentages pour chaque sous-type de cellules par patient\n",
+ "counts_perc_patients = counts_patients.copy()\n",
+ "\n",
+ "# Calcul des pourcentages pour chaque sous-type de cellules, en excluant la colonne 'total_cells'\n",
+ "for col in counts_perc_patients.columns:\n",
+ " if col != 'Total_cells':\n",
+ " counts_perc_patients[col + '_perc'] = (counts_perc_patients[col] / counts_perc_patients['Total_cells']) * 100\n",
+ "\n",
+ "\n",
+ "# Affichage des pourcentages des sous-types de cellules par patient\n",
+ "counts_perc_patients['Patient'] = counts_perc_patients.index\n",
+ "counts_perc_patients.columns.values\n",
+ "counts_perc_patients\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "id": "76a3f907-6618-4032-8e47-8cd428531604",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "counts_perc_patients_NACT = counts_perc_patients"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "id": "49f6c28f-c371-4817-9e70-1b2c1411f061",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "marker": {
+ "color": "rgb(166, 206, 227)"
+ },
+ "name": "DC",
+ "text": [
+ 0.01614465611882467,
+ 2.631578947368421,
+ 1.5151515151515151,
+ 0.022060445621001543,
+ 0.25911210917256866,
+ 0.09564801530368246,
+ 25.251256281407038,
+ 3.75,
+ 0.38022813688212925,
+ 0.5918910920390648,
+ 0.1352265043948614,
+ 0.0485319097306479,
+ 0.40417649040080833,
+ 0.13761467889908258,
+ 2.3359670216420474,
+ 0.054945054945054944,
+ 0.052083333333333336,
+ 0.5820721769499418,
+ 0.3232758620689655,
+ 2.07667731629393,
+ 0.1146131805157593,
+ 0.026954177897574125,
+ 0.33504578959124415,
+ 0.037678975131876416,
+ 0.06357279084551812,
+ 0.6076718571971136,
+ 0.49532195927352773,
+ 1.0619977037887485,
+ 0.6738544474393532,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "11",
+ "111",
+ "116",
+ "119",
+ "121",
+ "137",
+ "140",
+ "141",
+ "146",
+ "149",
+ "15",
+ "153",
+ "157",
+ "162",
+ "169",
+ "174",
+ "177",
+ "182",
+ "183",
+ "184",
+ "187",
+ "26",
+ "32",
+ "5",
+ "7",
+ "85",
+ "89",
+ "95",
+ "98",
+ "104",
+ "18",
+ "160",
+ "171",
+ "178",
+ "179",
+ "40",
+ "51",
+ "61"
+ ],
+ "y": [
+ 0.01614465611882467,
+ 2.631578947368421,
+ 1.5151515151515151,
+ 0.022060445621001543,
+ 0.25911210917256866,
+ 0.09564801530368246,
+ 25.251256281407038,
+ 3.75,
+ 0.38022813688212925,
+ 0.5918910920390648,
+ 0.1352265043948614,
+ 0.0485319097306479,
+ 0.40417649040080833,
+ 0.13761467889908258,
+ 2.3359670216420474,
+ 0.054945054945054944,
+ 0.052083333333333336,
+ 0.5820721769499418,
+ 0.3232758620689655,
+ 2.07667731629393,
+ 0.1146131805157593,
+ 0.026954177897574125,
+ 0.33504578959124415,
+ 0.037678975131876416,
+ 0.06357279084551812,
+ 0.6076718571971136,
+ 0.49532195927352773,
+ 1.0619977037887485,
+ 0.6738544474393532,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(31, 120, 180)"
+ },
+ "name": "B",
+ "text": [
+ 0,
+ 0.09746588693957114,
+ 0,
+ 0,
+ 0.03454828122300915,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.02426595486532395,
+ 0.033681374200067365,
+ 0.022935779816513763,
+ 0,
+ 0,
+ 0,
+ 0.11641443538998836,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.17869108778199688,
+ 0.037678975131876416,
+ 0,
+ 0,
+ 0,
+ 0.02870264064293915,
+ 0,
+ 0.04014452027298274,
+ 0.2795320426545191,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "11",
+ "111",
+ "116",
+ "119",
+ "121",
+ "137",
+ "140",
+ "141",
+ "146",
+ "149",
+ "15",
+ "153",
+ "157",
+ "162",
+ "169",
+ "174",
+ "177",
+ "182",
+ "183",
+ "184",
+ "187",
+ "26",
+ "32",
+ "5",
+ "7",
+ "85",
+ "89",
+ "95",
+ "98",
+ "104",
+ "18",
+ "160",
+ "171",
+ "178",
+ "179",
+ "40",
+ "51",
+ "61"
+ ],
+ "y": [
+ 0,
+ 0.09746588693957114,
+ 0,
+ 0,
+ 0.03454828122300915,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.02426595486532395,
+ 0.033681374200067365,
+ 0.022935779816513763,
+ 0,
+ 0,
+ 0,
+ 0.11641443538998836,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.17869108778199688,
+ 0.037678975131876416,
+ 0,
+ 0,
+ 0,
+ 0.02870264064293915,
+ 0,
+ 0.04014452027298274,
+ 0.2795320426545191,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(178, 223, 138)"
+ },
+ "name": "TCD4",
+ "text": [
+ 0.11301259283177267,
+ 0.1949317738791423,
+ 2.0202020202020203,
+ 1.3236267372600927,
+ 12.160994990499223,
+ 1.0043041606886656,
+ 24.183417085427138,
+ 14.107142857142858,
+ 5.069708491761723,
+ 7.990529742527375,
+ 1.0818120351588911,
+ 13.758796408638679,
+ 0.5389019872010778,
+ 1.743119266055046,
+ 6.9391961525249055,
+ 1.3186813186813187,
+ 6.822916666666666,
+ 1.7462165308498252,
+ 2.478448275862069,
+ 2.4494142705005326,
+ 0.7736389684813754,
+ 4.285714285714286,
+ 12.698235425508154,
+ 2.4868123587038435,
+ 11.697393515575333,
+ 4.101785036080517,
+ 6.962025316455696,
+ 1.9804822043628014,
+ 21.293800539083556,
+ 6.784423926134083,
+ 3.3957966663215657,
+ 0.35816618911174786,
+ 5.575117370892019,
+ 0.051150895140664954,
+ 1.3948497854077253,
+ 0.25688930406352173,
+ 9.090909090909092,
+ 4.226859283039058
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "11",
+ "111",
+ "116",
+ "119",
+ "121",
+ "137",
+ "140",
+ "141",
+ "146",
+ "149",
+ "15",
+ "153",
+ "157",
+ "162",
+ "169",
+ "174",
+ "177",
+ "182",
+ "183",
+ "184",
+ "187",
+ "26",
+ "32",
+ "5",
+ "7",
+ "85",
+ "89",
+ "95",
+ "98",
+ "104",
+ "18",
+ "160",
+ "171",
+ "178",
+ "179",
+ "40",
+ "51",
+ "61"
+ ],
+ "y": [
+ 0.11301259283177267,
+ 0.1949317738791423,
+ 2.0202020202020203,
+ 1.3236267372600927,
+ 12.160994990499223,
+ 1.0043041606886656,
+ 24.183417085427138,
+ 14.107142857142858,
+ 5.069708491761723,
+ 7.990529742527375,
+ 1.0818120351588911,
+ 13.758796408638679,
+ 0.5389019872010778,
+ 1.743119266055046,
+ 6.9391961525249055,
+ 1.3186813186813187,
+ 6.822916666666666,
+ 1.7462165308498252,
+ 2.478448275862069,
+ 2.4494142705005326,
+ 0.7736389684813754,
+ 4.285714285714286,
+ 12.698235425508154,
+ 2.4868123587038435,
+ 11.697393515575333,
+ 4.101785036080517,
+ 6.962025316455696,
+ 1.9804822043628014,
+ 21.293800539083556,
+ 6.784423926134083,
+ 3.3957966663215657,
+ 0.35816618911174786,
+ 5.575117370892019,
+ 0.051150895140664954,
+ 1.3948497854077253,
+ 0.25688930406352173,
+ 9.090909090909092,
+ 4.226859283039058
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(51, 160, 44)"
+ },
+ "name": "TCD8",
+ "text": [
+ 0.08072328059412334,
+ 2.923976608187134,
+ 1.0101010101010102,
+ 0.1985440105890139,
+ 0.9328035930212472,
+ 1.0521281683405068,
+ 0.37688442211055273,
+ 1.875,
+ 0.19011406844106463,
+ 0.739863865048831,
+ 0.23664638269100743,
+ 0.5823829167677749,
+ 5.826877736611654,
+ 0.06880733944954129,
+ 0.7214015802129852,
+ 0.21978021978021978,
+ 0,
+ 0.46565774155995343,
+ 0.16163793103448276,
+ 0.05324813631522897,
+ 0.6017191977077364,
+ 0.4582210242587601,
+ 7.013625195443378,
+ 1.5071590052750565,
+ 1.9707565162110616,
+ 0.41777440182301556,
+ 0.4678040726472207,
+ 4.7646383467278985,
+ 1.940700808625337,
+ 1.204335608189482,
+ 4.089450253649446,
+ 0.14326647564469913,
+ 1.643192488262911,
+ 0,
+ 0.1072961373390558,
+ 0.14012143858010276,
+ 2.272727272727273,
+ 7.704654895666131
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "11",
+ "111",
+ "116",
+ "119",
+ "121",
+ "137",
+ "140",
+ "141",
+ "146",
+ "149",
+ "15",
+ "153",
+ "157",
+ "162",
+ "169",
+ "174",
+ "177",
+ "182",
+ "183",
+ "184",
+ "187",
+ "26",
+ "32",
+ "5",
+ "7",
+ "85",
+ "89",
+ "95",
+ "98",
+ "104",
+ "18",
+ "160",
+ "171",
+ "178",
+ "179",
+ "40",
+ "51",
+ "61"
+ ],
+ "y": [
+ 0.08072328059412334,
+ 2.923976608187134,
+ 1.0101010101010102,
+ 0.1985440105890139,
+ 0.9328035930212472,
+ 1.0521281683405068,
+ 0.37688442211055273,
+ 1.875,
+ 0.19011406844106463,
+ 0.739863865048831,
+ 0.23664638269100743,
+ 0.5823829167677749,
+ 5.826877736611654,
+ 0.06880733944954129,
+ 0.7214015802129852,
+ 0.21978021978021978,
+ 0,
+ 0.46565774155995343,
+ 0.16163793103448276,
+ 0.05324813631522897,
+ 0.6017191977077364,
+ 0.4582210242587601,
+ 7.013625195443378,
+ 1.5071590052750565,
+ 1.9707565162110616,
+ 0.41777440182301556,
+ 0.4678040726472207,
+ 4.7646383467278985,
+ 1.940700808625337,
+ 1.204335608189482,
+ 4.089450253649446,
+ 0.14326647564469913,
+ 1.643192488262911,
+ 0,
+ 0.1072961373390558,
+ 0.14012143858010276,
+ 2.272727272727273,
+ 7.704654895666131
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(251, 154, 153)"
+ },
+ "name": "M1",
+ "text": [
+ 0,
+ 0.9746588693957114,
+ 0,
+ 0.06618133686300463,
+ 0.0690965624460183,
+ 0.04782400765184123,
+ 19.28391959798995,
+ 0.8928571428571428,
+ 0.06337135614702154,
+ 8.13850251553714,
+ 0.23664638269100743,
+ 1.480223246784761,
+ 0.06736274840013473,
+ 0.022935779816513763,
+ 0.034352456200618345,
+ 0.054945054945054944,
+ 0.052083333333333336,
+ 0,
+ 0,
+ 0.6922257720979765,
+ 0.05730659025787965,
+ 0,
+ 0.5807460352914898,
+ 2.93896006028636,
+ 0,
+ 0.7785795670338017,
+ 0.6053935057787562,
+ 0.14351320321469577,
+ 1.9676549865229112,
+ 0.04014452027298274,
+ 0.01035303861683404,
+ 0,
+ 1.4671361502347418,
+ 0,
+ 0,
+ 0.023353573096683792,
+ 2.272727272727273,
+ 0.2140181915462814
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "11",
+ "111",
+ "116",
+ "119",
+ "121",
+ "137",
+ "140",
+ "141",
+ "146",
+ "149",
+ "15",
+ "153",
+ "157",
+ "162",
+ "169",
+ "174",
+ "177",
+ "182",
+ "183",
+ "184",
+ "187",
+ "26",
+ "32",
+ "5",
+ "7",
+ "85",
+ "89",
+ "95",
+ "98",
+ "104",
+ "18",
+ "160",
+ "171",
+ "178",
+ "179",
+ "40",
+ "51",
+ "61"
+ ],
+ "y": [
+ 0,
+ 0.9746588693957114,
+ 0,
+ 0.06618133686300463,
+ 0.0690965624460183,
+ 0.04782400765184123,
+ 19.28391959798995,
+ 0.8928571428571428,
+ 0.06337135614702154,
+ 8.13850251553714,
+ 0.23664638269100743,
+ 1.480223246784761,
+ 0.06736274840013473,
+ 0.022935779816513763,
+ 0.034352456200618345,
+ 0.054945054945054944,
+ 0.052083333333333336,
+ 0,
+ 0,
+ 0.6922257720979765,
+ 0.05730659025787965,
+ 0,
+ 0.5807460352914898,
+ 2.93896006028636,
+ 0,
+ 0.7785795670338017,
+ 0.6053935057787562,
+ 0.14351320321469577,
+ 1.9676549865229112,
+ 0.04014452027298274,
+ 0.01035303861683404,
+ 0,
+ 1.4671361502347418,
+ 0,
+ 0,
+ 0.023353573096683792,
+ 2.272727272727273,
+ 0.2140181915462814
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(227, 26, 28)"
+ },
+ "name": "M2",
+ "text": [
+ 0,
+ 0.29239766081871343,
+ 0,
+ 0,
+ 0,
+ 0.04782400765184123,
+ 2.386934673366834,
+ 0.08928571428571429,
+ 0.12674271229404308,
+ 0.08878366380585972,
+ 0.03380662609871535,
+ 0.3397233681145353,
+ 0.23576961940047153,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.3492433061699651,
+ 0.05387931034482758,
+ 0.5857294994675186,
+ 0.2292263610315186,
+ 0,
+ 0.16752289479562207,
+ 0.22607385079125847,
+ 0,
+ 0.3038359285985568,
+ 0.2201430930104568,
+ 1.2629161882893225,
+ 1.8867924528301887,
+ 0.08028904054596547,
+ 0,
+ 0,
+ 0.05868544600938967,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1.0165864098448367
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "11",
+ "111",
+ "116",
+ "119",
+ "121",
+ "137",
+ "140",
+ "141",
+ "146",
+ "149",
+ "15",
+ "153",
+ "157",
+ "162",
+ "169",
+ "174",
+ "177",
+ "182",
+ "183",
+ "184",
+ "187",
+ "26",
+ "32",
+ "5",
+ "7",
+ "85",
+ "89",
+ "95",
+ "98",
+ "104",
+ "18",
+ "160",
+ "171",
+ "178",
+ "179",
+ "40",
+ "51",
+ "61"
+ ],
+ "y": [
+ 0,
+ 0.29239766081871343,
+ 0,
+ 0,
+ 0,
+ 0.04782400765184123,
+ 2.386934673366834,
+ 0.08928571428571429,
+ 0.12674271229404308,
+ 0.08878366380585972,
+ 0.03380662609871535,
+ 0.3397233681145353,
+ 0.23576961940047153,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.3492433061699651,
+ 0.05387931034482758,
+ 0.5857294994675186,
+ 0.2292263610315186,
+ 0,
+ 0.16752289479562207,
+ 0.22607385079125847,
+ 0,
+ 0.3038359285985568,
+ 0.2201430930104568,
+ 1.2629161882893225,
+ 1.8867924528301887,
+ 0.08028904054596547,
+ 0,
+ 0,
+ 0.05868544600938967,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1.0165864098448367
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(253, 191, 111)"
+ },
+ "name": "Treg",
+ "text": [
+ 0,
+ 0.09746588693957114,
+ 0,
+ 0,
+ 0.03454828122300915,
+ 0.09564801530368246,
+ 0.18844221105527637,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.07279786459597186,
+ 0,
+ 0.022935779816513763,
+ 0.034352456200618345,
+ 0,
+ 0,
+ 0,
+ 0.21551724137931033,
+ 0.05324813631522897,
+ 0.05730659025787965,
+ 0.026954177897574125,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.13758943313153552,
+ 0.02870264064293915,
+ 0.05390835579514825,
+ 0.12043356081894822,
+ 0.02070607723366808,
+ 0,
+ 0,
+ 0,
+ 0.2145922746781116,
+ 0,
+ 2.272727272727273,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "11",
+ "111",
+ "116",
+ "119",
+ "121",
+ "137",
+ "140",
+ "141",
+ "146",
+ "149",
+ "15",
+ "153",
+ "157",
+ "162",
+ "169",
+ "174",
+ "177",
+ "182",
+ "183",
+ "184",
+ "187",
+ "26",
+ "32",
+ "5",
+ "7",
+ "85",
+ "89",
+ "95",
+ "98",
+ "104",
+ "18",
+ "160",
+ "171",
+ "178",
+ "179",
+ "40",
+ "51",
+ "61"
+ ],
+ "y": [
+ 0,
+ 0.09746588693957114,
+ 0,
+ 0,
+ 0.03454828122300915,
+ 0.09564801530368246,
+ 0.18844221105527637,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.07279786459597186,
+ 0,
+ 0.022935779816513763,
+ 0.034352456200618345,
+ 0,
+ 0,
+ 0,
+ 0.21551724137931033,
+ 0.05324813631522897,
+ 0.05730659025787965,
+ 0.026954177897574125,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.13758943313153552,
+ 0.02870264064293915,
+ 0.05390835579514825,
+ 0.12043356081894822,
+ 0.02070607723366808,
+ 0,
+ 0,
+ 0,
+ 0.2145922746781116,
+ 0,
+ 2.272727272727273,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(1.0, 0.4980392156862745, 0.0)"
+ },
+ "name": "IMMUNE_OTHER",
+ "text": [
+ 0.4197610590894414,
+ 3.8011695906432745,
+ 0.5050505050505051,
+ 0.37502757555702626,
+ 6.045949214026603,
+ 1.3390722142515543,
+ 0.37688442211055273,
+ 2.232142857142857,
+ 3.2953105196451205,
+ 7.8425569695176085,
+ 0.6423258958755916,
+ 6.867265226886678,
+ 2.9976423038059954,
+ 0.7110091743119267,
+ 0.5839917554105118,
+ 2.5274725274725274,
+ 1.4583333333333333,
+ 9.31315483119907,
+ 0.43103448275862066,
+ 0.05324813631522897,
+ 1.2893982808022924,
+ 0.40431266846361186,
+ 1.3625195443377263,
+ 2.0723436322532027,
+ 0.6993006993006993,
+ 5.867831371059628,
+ 5.338470005503577,
+ 15.757749712973594,
+ 2.183288409703504,
+ 2.769971898835809,
+ 0.8593022051972253,
+ 2.148997134670487,
+ 3.931924882629108,
+ 0.1534526854219949,
+ 0.3218884120171674,
+ 0.39701074264362446,
+ 0,
+ 1.9796682718031033
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "11",
+ "111",
+ "116",
+ "119",
+ "121",
+ "137",
+ "140",
+ "141",
+ "146",
+ "149",
+ "15",
+ "153",
+ "157",
+ "162",
+ "169",
+ "174",
+ "177",
+ "182",
+ "183",
+ "184",
+ "187",
+ "26",
+ "32",
+ "5",
+ "7",
+ "85",
+ "89",
+ "95",
+ "98",
+ "104",
+ "18",
+ "160",
+ "171",
+ "178",
+ "179",
+ "40",
+ "51",
+ "61"
+ ],
+ "y": [
+ 0.4197610590894414,
+ 3.8011695906432745,
+ 0.5050505050505051,
+ 0.37502757555702626,
+ 6.045949214026603,
+ 1.3390722142515543,
+ 0.37688442211055273,
+ 2.232142857142857,
+ 3.2953105196451205,
+ 7.8425569695176085,
+ 0.6423258958755916,
+ 6.867265226886678,
+ 2.9976423038059954,
+ 0.7110091743119267,
+ 0.5839917554105118,
+ 2.5274725274725274,
+ 1.4583333333333333,
+ 9.31315483119907,
+ 0.43103448275862066,
+ 0.05324813631522897,
+ 1.2893982808022924,
+ 0.40431266846361186,
+ 1.3625195443377263,
+ 2.0723436322532027,
+ 0.6993006993006993,
+ 5.867831371059628,
+ 5.338470005503577,
+ 15.757749712973594,
+ 2.183288409703504,
+ 2.769971898835809,
+ 0.8593022051972253,
+ 2.148997134670487,
+ 3.931924882629108,
+ 0.1534526854219949,
+ 0.3218884120171674,
+ 0.39701074264362446,
+ 0,
+ 1.9796682718031033
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(202, 178, 214)"
+ },
+ "name": "CANCER",
+ "text": [
+ 8.976428802066517,
+ 87.62183235867447,
+ 63.13131313131313,
+ 94.61725126847563,
+ 63.085161513214715,
+ 62.26685796269727,
+ 2.198492462311558,
+ 6.3392857142857135,
+ 58.04816223067174,
+ 21.751997632435632,
+ 61.629479377958084,
+ 38.34020868721184,
+ 82.95722465476591,
+ 53.23394495412844,
+ 53.72724149776709,
+ 16.208791208791208,
+ 13.489583333333332,
+ 71.0128055878929,
+ 30.010775862068968,
+ 90.94781682641107,
+ 74.46991404011462,
+ 79.51482479784366,
+ 70.66115702479338,
+ 14.80783722682743,
+ 49.01462174189447,
+ 81.14318268135207,
+ 68.51953769950467,
+ 53.12858783008036,
+ 58.11320754716981,
+ 64.23123243677237,
+ 86.66528626151776,
+ 80.30085959885386,
+ 30.6924882629108,
+ 82.50639386189258,
+ 33.47639484978541,
+ 53.10602522185894,
+ 25,
+ 51.2573568753344
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "11",
+ "111",
+ "116",
+ "119",
+ "121",
+ "137",
+ "140",
+ "141",
+ "146",
+ "149",
+ "15",
+ "153",
+ "157",
+ "162",
+ "169",
+ "174",
+ "177",
+ "182",
+ "183",
+ "184",
+ "187",
+ "26",
+ "32",
+ "5",
+ "7",
+ "85",
+ "89",
+ "95",
+ "98",
+ "104",
+ "18",
+ "160",
+ "171",
+ "178",
+ "179",
+ "40",
+ "51",
+ "61"
+ ],
+ "y": [
+ 8.976428802066517,
+ 87.62183235867447,
+ 63.13131313131313,
+ 94.61725126847563,
+ 63.085161513214715,
+ 62.26685796269727,
+ 2.198492462311558,
+ 6.3392857142857135,
+ 58.04816223067174,
+ 21.751997632435632,
+ 61.629479377958084,
+ 38.34020868721184,
+ 82.95722465476591,
+ 53.23394495412844,
+ 53.72724149776709,
+ 16.208791208791208,
+ 13.489583333333332,
+ 71.0128055878929,
+ 30.010775862068968,
+ 90.94781682641107,
+ 74.46991404011462,
+ 79.51482479784366,
+ 70.66115702479338,
+ 14.80783722682743,
+ 49.01462174189447,
+ 81.14318268135207,
+ 68.51953769950467,
+ 53.12858783008036,
+ 58.11320754716981,
+ 64.23123243677237,
+ 86.66528626151776,
+ 80.30085959885386,
+ 30.6924882629108,
+ 82.50639386189258,
+ 33.47639484978541,
+ 53.10602522185894,
+ 25,
+ 51.2573568753344
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(106, 61, 154)"
+ },
+ "name": "αSMA_myCAF",
+ "text": [
+ 6.603164352599291,
+ 0.09746588693957114,
+ 2.0202020202020203,
+ 0.3529671299360247,
+ 3.161167731905338,
+ 19.56001912960306,
+ 4.1457286432160805,
+ 50.44642857142857,
+ 5.640050697084917,
+ 36.99319325244155,
+ 25.25354969574036,
+ 10.070371269109438,
+ 4.445941394408893,
+ 13.96788990825688,
+ 7.626245276537272,
+ 66.0989010989011,
+ 40,
+ 0.23282887077997672,
+ 0.646551724137931,
+ 0.26624068157614483,
+ 20.515759312320917,
+ 1.3207547169811322,
+ 0.05584096493187402,
+ 69.51770911831197,
+ 1.5257469802924348,
+ 0.7216103304215724,
+ 0.1651073197578426,
+ 2.3823191733639493,
+ 0.6738544474393532,
+ 11.60176635889201,
+ 0.2381198881871829,
+ 2.3638968481375358,
+ 6.924882629107981,
+ 11.253196930946292,
+ 29.184549356223176,
+ 36.47828117702009,
+ 2.272727272727273,
+ 20.064205457463885
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "11",
+ "111",
+ "116",
+ "119",
+ "121",
+ "137",
+ "140",
+ "141",
+ "146",
+ "149",
+ "15",
+ "153",
+ "157",
+ "162",
+ "169",
+ "174",
+ "177",
+ "182",
+ "183",
+ "184",
+ "187",
+ "26",
+ "32",
+ "5",
+ "7",
+ "85",
+ "89",
+ "95",
+ "98",
+ "104",
+ "18",
+ "160",
+ "171",
+ "178",
+ "179",
+ "40",
+ "51",
+ "61"
+ ],
+ "y": [
+ 6.603164352599291,
+ 0.09746588693957114,
+ 2.0202020202020203,
+ 0.3529671299360247,
+ 3.161167731905338,
+ 19.56001912960306,
+ 4.1457286432160805,
+ 50.44642857142857,
+ 5.640050697084917,
+ 36.99319325244155,
+ 25.25354969574036,
+ 10.070371269109438,
+ 4.445941394408893,
+ 13.96788990825688,
+ 7.626245276537272,
+ 66.0989010989011,
+ 40,
+ 0.23282887077997672,
+ 0.646551724137931,
+ 0.26624068157614483,
+ 20.515759312320917,
+ 1.3207547169811322,
+ 0.05584096493187402,
+ 69.51770911831197,
+ 1.5257469802924348,
+ 0.7216103304215724,
+ 0.1651073197578426,
+ 2.3823191733639493,
+ 0.6738544474393532,
+ 11.60176635889201,
+ 0.2381198881871829,
+ 2.3638968481375358,
+ 6.924882629107981,
+ 11.253196930946292,
+ 29.184549356223176,
+ 36.47828117702009,
+ 2.272727272727273,
+ 20.064205457463885
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(1.0, 1.0, 0.6)"
+ },
+ "name": "STROMA_OTHER",
+ "text": [
+ 82.3861801743623,
+ 0.29239766081871343,
+ 28.28282828282828,
+ 2.294286344584161,
+ 4.076697184315081,
+ 9.660449545671927,
+ 18.40452261306533,
+ 13.750000000000002,
+ 20.975918884664132,
+ 12.577685705830127,
+ 7.8431372549019605,
+ 19.97088085416161,
+ 1.5156618390030314,
+ 22.889908256880734,
+ 20.405358983167297,
+ 12.307692307692308,
+ 14.322916666666666,
+ 11.874272409778813,
+ 56.35775862068966,
+ 2.1299254526091587,
+ 1.489971346704871,
+ 12.722371967654986,
+ 6.85727049363413,
+ 4.672192916352675,
+ 33.75715193897012,
+ 4.69046714774022,
+ 13.401210787011559,
+ 15.355912743972445,
+ 8.679245283018867,
+ 7.226013649136894,
+ 1.9877834144321358,
+ 13.46704871060172,
+ 41.31455399061033,
+ 4.143222506393862,
+ 34.12017167381974,
+ 7.26296123306866,
+ 13.636363636363635,
+ 9.523809523809524
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "11",
+ "111",
+ "116",
+ "119",
+ "121",
+ "137",
+ "140",
+ "141",
+ "146",
+ "149",
+ "15",
+ "153",
+ "157",
+ "162",
+ "169",
+ "174",
+ "177",
+ "182",
+ "183",
+ "184",
+ "187",
+ "26",
+ "32",
+ "5",
+ "7",
+ "85",
+ "89",
+ "95",
+ "98",
+ "104",
+ "18",
+ "160",
+ "171",
+ "178",
+ "179",
+ "40",
+ "51",
+ "61"
+ ],
+ "y": [
+ 82.3861801743623,
+ 0.29239766081871343,
+ 28.28282828282828,
+ 2.294286344584161,
+ 4.076697184315081,
+ 9.660449545671927,
+ 18.40452261306533,
+ 13.750000000000002,
+ 20.975918884664132,
+ 12.577685705830127,
+ 7.8431372549019605,
+ 19.97088085416161,
+ 1.5156618390030314,
+ 22.889908256880734,
+ 20.405358983167297,
+ 12.307692307692308,
+ 14.322916666666666,
+ 11.874272409778813,
+ 56.35775862068966,
+ 2.1299254526091587,
+ 1.489971346704871,
+ 12.722371967654986,
+ 6.85727049363413,
+ 4.672192916352675,
+ 33.75715193897012,
+ 4.69046714774022,
+ 13.401210787011559,
+ 15.355912743972445,
+ 8.679245283018867,
+ 7.226013649136894,
+ 1.9877834144321358,
+ 13.46704871060172,
+ 41.31455399061033,
+ 4.143222506393862,
+ 34.12017167381974,
+ 7.26296123306866,
+ 13.636363636363635,
+ 9.523809523809524
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(177, 89, 40)"
+ },
+ "name": "ENDOTHELIAL",
+ "text": [
+ 1.4045850823377461,
+ 0.9746588693957114,
+ 1.5151515151515151,
+ 0.7500551511140525,
+ 10.139920538953188,
+ 4.8302247728359635,
+ 3.2035175879396984,
+ 6.517857142857143,
+ 6.2103929024081115,
+ 3.2849955608168098,
+ 2.9073698444895197,
+ 8.444552293132734,
+ 0.9767598518019536,
+ 7.178899082568807,
+ 7.591892820336654,
+ 1.208791208791209,
+ 23.802083333333332,
+ 4.307334109429569,
+ 9.321120689655173,
+ 0.6922257720979765,
+ 0.40114613180515757,
+ 1.2398921832884098,
+ 0.08934554389099844,
+ 1.6955538809344386,
+ 1.2714558169103625,
+ 1.3672616786935055,
+ 3.6873968079251513,
+ 4.104477611940299,
+ 2.533692722371968,
+ 5.9012444801284625,
+ 2.4536701521896678,
+ 1.2177650429799427,
+ 8.392018779342724,
+ 1.8925831202046037,
+ 1.1802575107296138,
+ 2.335357309668379,
+ 43.18181818181818,
+ 4.012841091492777
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "11",
+ "111",
+ "116",
+ "119",
+ "121",
+ "137",
+ "140",
+ "141",
+ "146",
+ "149",
+ "15",
+ "153",
+ "157",
+ "162",
+ "169",
+ "174",
+ "177",
+ "182",
+ "183",
+ "184",
+ "187",
+ "26",
+ "32",
+ "5",
+ "7",
+ "85",
+ "89",
+ "95",
+ "98",
+ "104",
+ "18",
+ "160",
+ "171",
+ "178",
+ "179",
+ "40",
+ "51",
+ "61"
+ ],
+ "y": [
+ 1.4045850823377461,
+ 0.9746588693957114,
+ 1.5151515151515151,
+ 0.7500551511140525,
+ 10.139920538953188,
+ 4.8302247728359635,
+ 3.2035175879396984,
+ 6.517857142857143,
+ 6.2103929024081115,
+ 3.2849955608168098,
+ 2.9073698444895197,
+ 8.444552293132734,
+ 0.9767598518019536,
+ 7.178899082568807,
+ 7.591892820336654,
+ 1.208791208791209,
+ 23.802083333333332,
+ 4.307334109429569,
+ 9.321120689655173,
+ 0.6922257720979765,
+ 0.40114613180515757,
+ 1.2398921832884098,
+ 0.08934554389099844,
+ 1.6955538809344386,
+ 1.2714558169103625,
+ 1.3672616786935055,
+ 3.6873968079251513,
+ 4.104477611940299,
+ 2.533692722371968,
+ 5.9012444801284625,
+ 2.4536701521896678,
+ 1.2177650429799427,
+ 8.392018779342724,
+ 1.8925831202046037,
+ 1.1802575107296138,
+ 2.335357309668379,
+ 43.18181818181818,
+ 4.012841091492777
+ ]
+ }
+ ],
+ "layout": {
+ "barmode": "stack",
+ "plot_bgcolor": "white",
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "Cell subtypes proportions by Patient and tissue type - NACT group"
+ },
+ "xaxis": {
+ "autorange": true,
+ "linecolor": "black",
+ "range": [
+ -0.5,
+ 37.5
+ ],
+ "type": "category"
+ },
+ "yaxis": {
+ "autorange": true,
+ "linecolor": "black",
+ "range": [
+ 0,
+ 105.26315789473688
+ ],
+ "title": {
+ "text": "Cell count (%)"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 62,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "fig = go.Figure()\n",
+ "title = 'Cell subtypes proportions by Patient and tissue type - NACT group'\n",
+ "\n",
+ "for cell_subtype in cell_subtypes:\n",
+ " fig.add_trace(\n",
+ " go.Bar(\n",
+ " name=cell_subtype,\n",
+ " x=counts_perc_patients['Patient'],\n",
+ " y=counts_perc_patients[f'{cell_subtype.lower()}_perc'],\n",
+ " text=counts_perc_patients[f'{cell_subtype.lower()}_perc'],\n",
+ " textposition='auto',\n",
+ " marker_color='rgb' + str(cell_subtype_color_dict[cell_subtype])))\n",
+ "\n",
+ "fig.update_layout(\n",
+ " plot_bgcolor='white',\n",
+ " barmode='stack',\n",
+ " title=title,\n",
+ " xaxis=dict(linecolor='black'),\n",
+ " yaxis=dict(title='Cell count (%)', linecolor='black'))\n",
+ "\n",
+ "output_filename = title.replace(\" \", \"_\") + \".png\"\n",
+ "#fig.write_image(output_images_dir + \"/\" + output_filename, scale=1000)\n",
+ "\n",
+ "fig.show()\n",
+ "plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "969a6ead-d94f-4e6f-80c4-48bc8cb716d6",
+ "metadata": {},
+ "source": [
+ "##### V.4.3.4.1 ACT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "id": "e704c689-1307-43a8-98a2-4bf301f4d451",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " dc \n",
+ " b \n",
+ " tcd4 \n",
+ " tcd8 \n",
+ " m1 \n",
+ " m2 \n",
+ " treg \n",
+ " immune_other \n",
+ " cancer \n",
+ " αsma_mycaf \n",
+ " stroma_other \n",
+ " endothelial \n",
+ " Total_cells \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 900.0 \n",
+ " 24.0 \n",
+ " 167.0 \n",
+ " 100.0 \n",
+ " 5.0 \n",
+ " 28.0 \n",
+ " 3981 \n",
+ " 388.0 \n",
+ " 530 \n",
+ " 335.0 \n",
+ " 6460.0 \n",
+ " \n",
+ " \n",
+ " 100 \n",
+ " 21.0 \n",
+ " 0.0 \n",
+ " 92.0 \n",
+ " 46.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 30.0 \n",
+ " 1449 \n",
+ " 30.0 \n",
+ " 73 \n",
+ " 131.0 \n",
+ " 1876.0 \n",
+ " \n",
+ " \n",
+ " 101 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 20.0 \n",
+ " 15.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 24.0 \n",
+ " 1896 \n",
+ " 81.0 \n",
+ " 173 \n",
+ " 60.0 \n",
+ " 2275.0 \n",
+ " \n",
+ " \n",
+ " 102 \n",
+ " 1.0 \n",
+ " 2.0 \n",
+ " 45.0 \n",
+ " 24.0 \n",
+ " 5.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 38.0 \n",
+ " 3564 \n",
+ " 18.0 \n",
+ " 91 \n",
+ " 16.0 \n",
+ " 3805.0 \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " 57.0 \n",
+ " 0.0 \n",
+ " 72.0 \n",
+ " 555.0 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 78.0 \n",
+ " 2157 \n",
+ " 17.0 \n",
+ " 131 \n",
+ " 117.0 \n",
+ " 3192.0 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 92 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 11.0 \n",
+ " 990.0 \n",
+ " 3.0 \n",
+ " 25.0 \n",
+ " 1.0 \n",
+ " 184.0 \n",
+ " 424 \n",
+ " 140.0 \n",
+ " 22 \n",
+ " 15.0 \n",
+ " 1815.0 \n",
+ " \n",
+ " \n",
+ " 96 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 76.0 \n",
+ " 2.0 \n",
+ " 2.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 1854 \n",
+ " 1.0 \n",
+ " 16 \n",
+ " 3.0 \n",
+ " 1959.0 \n",
+ " \n",
+ " \n",
+ " 97 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 174.0 \n",
+ " 38.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 56.0 \n",
+ " 2193 \n",
+ " 28.0 \n",
+ " 163 \n",
+ " 102.0 \n",
+ " 2755.0 \n",
+ " \n",
+ " \n",
+ " 60 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 107.0 \n",
+ " 9.0 \n",
+ " 16.0 \n",
+ " 1.0 \n",
+ " 57.0 \n",
+ " 1979 \n",
+ " 107.0 \n",
+ " 1 \n",
+ " 32.0 \n",
+ " 2309.0 \n",
+ " \n",
+ " \n",
+ " 62 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 23.0 \n",
+ " 3.0 \n",
+ " 15.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 151 \n",
+ " 91.0 \n",
+ " 20 \n",
+ " 3.0 \n",
+ " 310.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
139 rows Ć 13 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " dc b tcd4 tcd8 m1 m2 treg immune_other cancer \\\n",
+ "10 2.0 0.0 900.0 24.0 167.0 100.0 5.0 28.0 3981 \n",
+ "100 21.0 0.0 92.0 46.0 0.0 3.0 1.0 30.0 1449 \n",
+ "101 2.0 0.0 20.0 15.0 3.0 1.0 0.0 24.0 1896 \n",
+ "102 1.0 2.0 45.0 24.0 5.0 1.0 0.0 38.0 3564 \n",
+ "103 57.0 0.0 72.0 555.0 7.0 0.0 1.0 78.0 2157 \n",
+ ".. ... ... ... ... ... ... ... ... ... \n",
+ "92 0.0 0.0 11.0 990.0 3.0 25.0 1.0 184.0 424 \n",
+ "96 0.0 0.0 76.0 2.0 2.0 1.0 0.0 4.0 1854 \n",
+ "97 0.0 0.0 174.0 38.0 0.0 0.0 1.0 56.0 2193 \n",
+ "60 0.0 0.0 0.0 107.0 9.0 16.0 1.0 57.0 1979 \n",
+ "62 0.0 0.0 0.0 23.0 3.0 15.0 0.0 4.0 151 \n",
+ "\n",
+ " αsma_mycaf stroma_other endothelial Total_cells \n",
+ "10 388.0 530 335.0 6460.0 \n",
+ "100 30.0 73 131.0 1876.0 \n",
+ "101 81.0 173 60.0 2275.0 \n",
+ "102 18.0 91 16.0 3805.0 \n",
+ "103 17.0 131 117.0 3192.0 \n",
+ ".. ... ... ... ... \n",
+ "92 140.0 22 15.0 1815.0 \n",
+ "96 1.0 16 3.0 1959.0 \n",
+ "97 28.0 163 102.0 2755.0 \n",
+ "60 107.0 1 32.0 2309.0 \n",
+ "62 91.0 20 3.0 310.0 \n",
+ "\n",
+ "[139 rows x 13 columns]"
+ ]
+ },
+ "execution_count": 63,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Compter par numƩro de patiente pour les patientes ACT uniquement\n",
+ "patient_counts = {}\n",
+ "\n",
+ "# Boucle sur les sous-types de cellules pour compter les Ʃchantillons correspondants par patient\n",
+ "for subtype in cell_subtypes:\n",
+ " patient_counts[subtype.lower()] = pd.DataFrame({subtype.lower():\n",
+ " df.loc[\n",
+ " (df['cell_subtype'] == subtype) & (df['Patient'].isin(num_ACT_patients)), 'Patient'].value_counts()\n",
+ " }).sort_index()\n",
+ "\n",
+ "# ConcatƩnation des counts des sous-types de cellules en un seul DataFrame\n",
+ "counts_patients = pd.concat([pd.DataFrame(v) for v in patient_counts.values()], axis=1, sort=False)\n",
+ "counts_patients = counts_patients.fillna(0)\n",
+ "\n",
+ "# Ajout de la colonne de total de cellules comptƩes par patientes\n",
+ "counts_patients['Total_cells'] = counts_patients.sum(axis=1)\n",
+ "\n",
+ "# Enregistrement des counts des sous-types de cellules par patient dans un fichier CSV\n",
+ "filename_patients = os.path.join(output_data_dir, project_name + \"_cell_subtypes_number_by_patient_ACT.csv\")\n",
+ "counts_patients.to_csv(filename_patients, index=False)\n",
+ "counts_patients"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "id": "c15c1ebe-0fa9-45a3-b753-e7370a75e10d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " dc \n",
+ " b \n",
+ " tcd4 \n",
+ " tcd8 \n",
+ " m1 \n",
+ " m2 \n",
+ " treg \n",
+ " immune_other \n",
+ " cancer \n",
+ " αsma_mycaf \n",
+ " ... \n",
+ " tcd8_perc \n",
+ " m1_perc \n",
+ " m2_perc \n",
+ " treg_perc \n",
+ " immune_other_perc \n",
+ " cancer_perc \n",
+ " αsma_mycaf_perc \n",
+ " stroma_other_perc \n",
+ " endothelial_perc \n",
+ " Patient \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 900.0 \n",
+ " 24.0 \n",
+ " 167.0 \n",
+ " 100.0 \n",
+ " 5.0 \n",
+ " 28.0 \n",
+ " 3981 \n",
+ " 388.0 \n",
+ " ... \n",
+ " 0.371517 \n",
+ " 2.585139 \n",
+ " 1.547988 \n",
+ " 0.077399 \n",
+ " 0.433437 \n",
+ " 61.625387 \n",
+ " 6.006192 \n",
+ " 8.204334 \n",
+ " 5.185759 \n",
+ " 10 \n",
+ " \n",
+ " \n",
+ " 100 \n",
+ " 21.0 \n",
+ " 0.0 \n",
+ " 92.0 \n",
+ " 46.0 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 30.0 \n",
+ " 1449 \n",
+ " 30.0 \n",
+ " ... \n",
+ " 2.452026 \n",
+ " 0.000000 \n",
+ " 0.159915 \n",
+ " 0.053305 \n",
+ " 1.599147 \n",
+ " 77.238806 \n",
+ " 1.599147 \n",
+ " 3.891258 \n",
+ " 6.982942 \n",
+ " 100 \n",
+ " \n",
+ " \n",
+ " 101 \n",
+ " 2.0 \n",
+ " 0.0 \n",
+ " 20.0 \n",
+ " 15.0 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 24.0 \n",
+ " 1896 \n",
+ " 81.0 \n",
+ " ... \n",
+ " 0.659341 \n",
+ " 0.131868 \n",
+ " 0.043956 \n",
+ " 0.000000 \n",
+ " 1.054945 \n",
+ " 83.340659 \n",
+ " 3.560440 \n",
+ " 7.604396 \n",
+ " 2.637363 \n",
+ " 101 \n",
+ " \n",
+ " \n",
+ " 102 \n",
+ " 1.0 \n",
+ " 2.0 \n",
+ " 45.0 \n",
+ " 24.0 \n",
+ " 5.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 38.0 \n",
+ " 3564 \n",
+ " 18.0 \n",
+ " ... \n",
+ " 0.630749 \n",
+ " 0.131406 \n",
+ " 0.026281 \n",
+ " 0.000000 \n",
+ " 0.998686 \n",
+ " 93.666229 \n",
+ " 0.473062 \n",
+ " 2.391590 \n",
+ " 0.420499 \n",
+ " 102 \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " 57.0 \n",
+ " 0.0 \n",
+ " 72.0 \n",
+ " 555.0 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 78.0 \n",
+ " 2157 \n",
+ " 17.0 \n",
+ " ... \n",
+ " 17.387218 \n",
+ " 0.219298 \n",
+ " 0.000000 \n",
+ " 0.031328 \n",
+ " 2.443609 \n",
+ " 67.575188 \n",
+ " 0.532581 \n",
+ " 4.104010 \n",
+ " 3.665414 \n",
+ " 103 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 92 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 11.0 \n",
+ " 990.0 \n",
+ " 3.0 \n",
+ " 25.0 \n",
+ " 1.0 \n",
+ " 184.0 \n",
+ " 424 \n",
+ " 140.0 \n",
+ " ... \n",
+ " 54.545455 \n",
+ " 0.165289 \n",
+ " 1.377410 \n",
+ " 0.055096 \n",
+ " 10.137741 \n",
+ " 23.360882 \n",
+ " 7.713499 \n",
+ " 1.212121 \n",
+ " 0.826446 \n",
+ " 92 \n",
+ " \n",
+ " \n",
+ " 96 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 76.0 \n",
+ " 2.0 \n",
+ " 2.0 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 1854 \n",
+ " 1.0 \n",
+ " ... \n",
+ " 0.102093 \n",
+ " 0.102093 \n",
+ " 0.051046 \n",
+ " 0.000000 \n",
+ " 0.204186 \n",
+ " 94.640123 \n",
+ " 0.051046 \n",
+ " 0.816743 \n",
+ " 0.153139 \n",
+ " 96 \n",
+ " \n",
+ " \n",
+ " 97 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 174.0 \n",
+ " 38.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " 56.0 \n",
+ " 2193 \n",
+ " 28.0 \n",
+ " ... \n",
+ " 1.379310 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.036298 \n",
+ " 2.032668 \n",
+ " 79.600726 \n",
+ " 1.016334 \n",
+ " 5.916515 \n",
+ " 3.702359 \n",
+ " 97 \n",
+ " \n",
+ " \n",
+ " 60 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 107.0 \n",
+ " 9.0 \n",
+ " 16.0 \n",
+ " 1.0 \n",
+ " 57.0 \n",
+ " 1979 \n",
+ " 107.0 \n",
+ " ... \n",
+ " 4.634041 \n",
+ " 0.389779 \n",
+ " 0.692941 \n",
+ " 0.043309 \n",
+ " 2.468601 \n",
+ " 85.708099 \n",
+ " 4.634041 \n",
+ " 0.043309 \n",
+ " 1.385881 \n",
+ " 60 \n",
+ " \n",
+ " \n",
+ " 62 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 23.0 \n",
+ " 3.0 \n",
+ " 15.0 \n",
+ " 0.0 \n",
+ " 4.0 \n",
+ " 151 \n",
+ " 91.0 \n",
+ " ... \n",
+ " 7.419355 \n",
+ " 0.967742 \n",
+ " 4.838710 \n",
+ " 0.000000 \n",
+ " 1.290323 \n",
+ " 48.709677 \n",
+ " 29.354839 \n",
+ " 6.451613 \n",
+ " 0.967742 \n",
+ " 62 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
139 rows Ć 26 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " dc b tcd4 tcd8 m1 m2 treg immune_other cancer \\\n",
+ "10 2.0 0.0 900.0 24.0 167.0 100.0 5.0 28.0 3981 \n",
+ "100 21.0 0.0 92.0 46.0 0.0 3.0 1.0 30.0 1449 \n",
+ "101 2.0 0.0 20.0 15.0 3.0 1.0 0.0 24.0 1896 \n",
+ "102 1.0 2.0 45.0 24.0 5.0 1.0 0.0 38.0 3564 \n",
+ "103 57.0 0.0 72.0 555.0 7.0 0.0 1.0 78.0 2157 \n",
+ ".. ... ... ... ... ... ... ... ... ... \n",
+ "92 0.0 0.0 11.0 990.0 3.0 25.0 1.0 184.0 424 \n",
+ "96 0.0 0.0 76.0 2.0 2.0 1.0 0.0 4.0 1854 \n",
+ "97 0.0 0.0 174.0 38.0 0.0 0.0 1.0 56.0 2193 \n",
+ "60 0.0 0.0 0.0 107.0 9.0 16.0 1.0 57.0 1979 \n",
+ "62 0.0 0.0 0.0 23.0 3.0 15.0 0.0 4.0 151 \n",
+ "\n",
+ " αsma_mycaf ... tcd8_perc m1_perc m2_perc treg_perc \\\n",
+ "10 388.0 ... 0.371517 2.585139 1.547988 0.077399 \n",
+ "100 30.0 ... 2.452026 0.000000 0.159915 0.053305 \n",
+ "101 81.0 ... 0.659341 0.131868 0.043956 0.000000 \n",
+ "102 18.0 ... 0.630749 0.131406 0.026281 0.000000 \n",
+ "103 17.0 ... 17.387218 0.219298 0.000000 0.031328 \n",
+ ".. ... ... ... ... ... ... \n",
+ "92 140.0 ... 54.545455 0.165289 1.377410 0.055096 \n",
+ "96 1.0 ... 0.102093 0.102093 0.051046 0.000000 \n",
+ "97 28.0 ... 1.379310 0.000000 0.000000 0.036298 \n",
+ "60 107.0 ... 4.634041 0.389779 0.692941 0.043309 \n",
+ "62 91.0 ... 7.419355 0.967742 4.838710 0.000000 \n",
+ "\n",
+ " immune_other_perc cancer_perc αsma_mycaf_perc stroma_other_perc \\\n",
+ "10 0.433437 61.625387 6.006192 8.204334 \n",
+ "100 1.599147 77.238806 1.599147 3.891258 \n",
+ "101 1.054945 83.340659 3.560440 7.604396 \n",
+ "102 0.998686 93.666229 0.473062 2.391590 \n",
+ "103 2.443609 67.575188 0.532581 4.104010 \n",
+ ".. ... ... ... ... \n",
+ "92 10.137741 23.360882 7.713499 1.212121 \n",
+ "96 0.204186 94.640123 0.051046 0.816743 \n",
+ "97 2.032668 79.600726 1.016334 5.916515 \n",
+ "60 2.468601 85.708099 4.634041 0.043309 \n",
+ "62 1.290323 48.709677 29.354839 6.451613 \n",
+ "\n",
+ " endothelial_perc Patient \n",
+ "10 5.185759 10 \n",
+ "100 6.982942 100 \n",
+ "101 2.637363 101 \n",
+ "102 0.420499 102 \n",
+ "103 3.665414 103 \n",
+ ".. ... ... \n",
+ "92 0.826446 92 \n",
+ "96 0.153139 96 \n",
+ "97 3.702359 97 \n",
+ "60 1.385881 60 \n",
+ "62 0.967742 62 \n",
+ "\n",
+ "[139 rows x 26 columns]"
+ ]
+ },
+ "execution_count": 64,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Ajout des colonnes de pourcentages pour chaque sous-type de cellules par patient\n",
+ "counts_perc_patients = counts_patients.copy()\n",
+ "\n",
+ "# Calcul des pourcentages pour chaque sous-type de cellules, en excluant la colonne 'total_cells'\n",
+ "for col in counts_perc_patients.columns:\n",
+ " if col != 'Total_cells':\n",
+ " counts_perc_patients[col + '_perc'] = (counts_perc_patients[col] / counts_perc_patients['Total_cells']) * 100\n",
+ "\n",
+ "\n",
+ "# Affichage des pourcentages des sous-types de cellules par patient\n",
+ "counts_perc_patients['Patient'] = counts_perc_patients.index\n",
+ "counts_perc_patients.columns.values\n",
+ "counts_perc_patients\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "id": "1ab4d7e0-5666-4692-b256-16606b279700",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "counts_perc_patients_ACT = counts_perc_patients"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "id": "4b3e2548-257e-40dc-8c9f-78f3daf28404",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "marker": {
+ "color": "rgb(166, 206, 227)"
+ },
+ "name": "DC",
+ "text": [
+ 0.030959752321981428,
+ 1.1194029850746268,
+ 0.0879120879120879,
+ 0.026281208935611037,
+ 1.7857142857142856,
+ 0.16251354279523295,
+ 0.01915341888527102,
+ 1.8001800180018002,
+ 0.27932960893854747,
+ 0.07040600797934757,
+ 0.03170577045022194,
+ 0.6369426751592357,
+ 0.19162332329592116,
+ 0.044444444444444446,
+ 0.19485580670303976,
+ 0.1509813789632612,
+ 0.6265664160401002,
+ 1.3333333333333335,
+ 1.8334606569900689,
+ 0.48543689320388345,
+ 0.10482180293501049,
+ 0.4731488052992667,
+ 0.38910505836575876,
+ 1.3261210957948002,
+ 11.179606797734088,
+ 0.16381933068102036,
+ 0.15408320493066258,
+ 0.012711325791280032,
+ 0.130718954248366,
+ 1.6082294986960302,
+ 0.025412960609911054,
+ 0.250678922080635,
+ 0.2883762200532387,
+ 0.8665511265164645,
+ 0.5867396831605711,
+ 0.01882530120481928,
+ 0.07336757153338225,
+ 0.8547008547008548,
+ 3.489499192245557,
+ 22.03856749311295,
+ 0.10086746015735323,
+ 0.10156408693885843,
+ 0.25597269624573377,
+ 0.1310615989515072,
+ 0.21253985122210414,
+ 0.6975392365820577,
+ 2.3801760678187156,
+ 0.0643915003219575,
+ 0.09737098344693282,
+ 0.5830009205277692,
+ 0.01889287738522577,
+ 0.029498525073746312,
+ 1.3999164229001253,
+ 0.07777259293824856,
+ 0.03567606136282554,
+ 0.13120899718837864,
+ 0.6089604175728578,
+ 0.836635843240863,
+ 1.0788381742738589,
+ 2.1150424985174934,
+ 0.04315925766076824,
+ 0.07789678675754626,
+ 0.2491506228765572,
+ 0.8224993366940834,
+ 0.7874015748031495,
+ 0.9978048293753742,
+ 0.5996002664890073,
+ 0.29505778214900413,
+ 0.14691478942213515,
+ 0.3534956794972506,
+ 0.03664345914254306,
+ 0.5344503827820309,
+ 3.1978680879413726,
+ 0.044007627988851404,
+ 0.09629272989889263,
+ 0.1779359430604982,
+ 0.045187528242205156,
+ 0.09206407659731174,
+ 0.7308467741935484,
+ 0.04962779156327543,
+ 0.8764940239043826,
+ 0.17491254372813594,
+ 0.02337540906965872,
+ 1.1464968152866242,
+ 12.654392915404333,
+ 0.1128668171557562,
+ 6.478624944909652,
+ 0.14516421702050444,
+ 0.028477858465043433,
+ 1.9297036526533424,
+ 0.01858736059479554,
+ 0.05564830272676684,
+ 0.2434705621956618,
+ 0.03254678600488201,
+ 0.034916201117318434,
+ 0.12903225806451613,
+ 0.14248397055331277,
+ 0.6134969325153374,
+ 0.23715415019762848,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "110",
+ "112",
+ "113",
+ "114",
+ "115",
+ "120",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "139",
+ "14",
+ "143",
+ "144",
+ "147",
+ "148",
+ "150",
+ "152",
+ "154",
+ "155",
+ "158",
+ "159",
+ "161",
+ "164",
+ "165",
+ "166",
+ "168",
+ "170",
+ "175",
+ "176",
+ "180",
+ "181",
+ "186",
+ "19",
+ "20",
+ "22",
+ "23",
+ "27",
+ "28",
+ "30",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "87",
+ "88",
+ "90",
+ "91",
+ "94",
+ "99",
+ "108",
+ "135",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "167",
+ "17",
+ "172",
+ "173",
+ "21",
+ "24",
+ "47",
+ "48",
+ "49",
+ "55",
+ "56",
+ "59",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0.030959752321981428,
+ 1.1194029850746268,
+ 0.0879120879120879,
+ 0.026281208935611037,
+ 1.7857142857142856,
+ 0.16251354279523295,
+ 0.01915341888527102,
+ 1.8001800180018002,
+ 0.27932960893854747,
+ 0.07040600797934757,
+ 0.03170577045022194,
+ 0.6369426751592357,
+ 0.19162332329592116,
+ 0.044444444444444446,
+ 0.19485580670303976,
+ 0.1509813789632612,
+ 0.6265664160401002,
+ 1.3333333333333335,
+ 1.8334606569900689,
+ 0.48543689320388345,
+ 0.10482180293501049,
+ 0.4731488052992667,
+ 0.38910505836575876,
+ 1.3261210957948002,
+ 11.179606797734088,
+ 0.16381933068102036,
+ 0.15408320493066258,
+ 0.012711325791280032,
+ 0.130718954248366,
+ 1.6082294986960302,
+ 0.025412960609911054,
+ 0.250678922080635,
+ 0.2883762200532387,
+ 0.8665511265164645,
+ 0.5867396831605711,
+ 0.01882530120481928,
+ 0.07336757153338225,
+ 0.8547008547008548,
+ 3.489499192245557,
+ 22.03856749311295,
+ 0.10086746015735323,
+ 0.10156408693885843,
+ 0.25597269624573377,
+ 0.1310615989515072,
+ 0.21253985122210414,
+ 0.6975392365820577,
+ 2.3801760678187156,
+ 0.0643915003219575,
+ 0.09737098344693282,
+ 0.5830009205277692,
+ 0.01889287738522577,
+ 0.029498525073746312,
+ 1.3999164229001253,
+ 0.07777259293824856,
+ 0.03567606136282554,
+ 0.13120899718837864,
+ 0.6089604175728578,
+ 0.836635843240863,
+ 1.0788381742738589,
+ 2.1150424985174934,
+ 0.04315925766076824,
+ 0.07789678675754626,
+ 0.2491506228765572,
+ 0.8224993366940834,
+ 0.7874015748031495,
+ 0.9978048293753742,
+ 0.5996002664890073,
+ 0.29505778214900413,
+ 0.14691478942213515,
+ 0.3534956794972506,
+ 0.03664345914254306,
+ 0.5344503827820309,
+ 3.1978680879413726,
+ 0.044007627988851404,
+ 0.09629272989889263,
+ 0.1779359430604982,
+ 0.045187528242205156,
+ 0.09206407659731174,
+ 0.7308467741935484,
+ 0.04962779156327543,
+ 0.8764940239043826,
+ 0.17491254372813594,
+ 0.02337540906965872,
+ 1.1464968152866242,
+ 12.654392915404333,
+ 0.1128668171557562,
+ 6.478624944909652,
+ 0.14516421702050444,
+ 0.028477858465043433,
+ 1.9297036526533424,
+ 0.01858736059479554,
+ 0.05564830272676684,
+ 0.2434705621956618,
+ 0.03254678600488201,
+ 0.034916201117318434,
+ 0.12903225806451613,
+ 0.14248397055331277,
+ 0.6134969325153374,
+ 0.23715415019762848,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(31, 120, 180)"
+ },
+ "name": "B",
+ "text": [
+ 0,
+ 0,
+ 0,
+ 0.052562417871222074,
+ 0,
+ 0,
+ 0.15322735108216817,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.03352329869259135,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.011392116655274549,
+ 0.3660130718954248,
+ 0.03819709702062643,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.7407407407407408,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.03765060240963856,
+ 0,
+ 0,
+ 0.06462035541195477,
+ 0,
+ 0.0403469840629413,
+ 0.14218972171440178,
+ 0,
+ 0.5242463958060288,
+ 0,
+ 0.019376089905057157,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2.47787610619469,
+ 0.020894274968658588,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.019474196689386564,
+ 0,
+ 0.05306447333510214,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.0398406374501992,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.02821670428893905,
+ 0,
+ 0,
+ 0,
+ 0.02297266253158741,
+ 0.5204460966542751,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.06901311249137336,
+ 3.28416365154467,
+ 0.7992007992007992,
+ 0.04482294935006724,
+ 0.06188118811881188,
+ 0.14691478942213515,
+ 0.6885998469778117,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "110",
+ "112",
+ "113",
+ "114",
+ "115",
+ "120",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "139",
+ "14",
+ "143",
+ "144",
+ "147",
+ "148",
+ "150",
+ "152",
+ "154",
+ "155",
+ "158",
+ "159",
+ "161",
+ "164",
+ "165",
+ "166",
+ "168",
+ "170",
+ "175",
+ "176",
+ "180",
+ "181",
+ "186",
+ "19",
+ "20",
+ "22",
+ "23",
+ "27",
+ "28",
+ "30",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "87",
+ "88",
+ "90",
+ "91",
+ "94",
+ "99",
+ "108",
+ "135",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "167",
+ "17",
+ "172",
+ "173",
+ "21",
+ "24",
+ "47",
+ "48",
+ "49",
+ "55",
+ "56",
+ "59",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0,
+ 0,
+ 0,
+ 0.052562417871222074,
+ 0,
+ 0,
+ 0.15322735108216817,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.03352329869259135,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.011392116655274549,
+ 0.3660130718954248,
+ 0.03819709702062643,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.7407407407407408,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.03765060240963856,
+ 0,
+ 0,
+ 0.06462035541195477,
+ 0,
+ 0.0403469840629413,
+ 0.14218972171440178,
+ 0,
+ 0.5242463958060288,
+ 0,
+ 0.019376089905057157,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 2.47787610619469,
+ 0.020894274968658588,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.019474196689386564,
+ 0,
+ 0.05306447333510214,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.0398406374501992,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.02821670428893905,
+ 0,
+ 0,
+ 0,
+ 0.02297266253158741,
+ 0.5204460966542751,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.06901311249137336,
+ 3.28416365154467,
+ 0.7992007992007992,
+ 0.04482294935006724,
+ 0.06188118811881188,
+ 0.14691478942213515,
+ 0.6885998469778117,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(178, 223, 138)"
+ },
+ "name": "TCD4",
+ "text": [
+ 13.93188854489164,
+ 4.904051172707889,
+ 0.8791208791208791,
+ 1.1826544021024967,
+ 2.2556390977443606,
+ 0.3250270855904659,
+ 1.991955564068186,
+ 0.7200720072007201,
+ 3.35195530726257,
+ 3.9192677775170144,
+ 1.077996195307546,
+ 1.6426416359369762,
+ 6.131946345469477,
+ 1.1111111111111112,
+ 9.353078721745907,
+ 2.7176648213387016,
+ 1.1278195488721803,
+ 14.143790849673202,
+ 3.7815126050420167,
+ 10.922330097087379,
+ 6.184486373165619,
+ 1.0172699313934233,
+ 14.184648036788113,
+ 3.78642470772989,
+ 13.595468177274242,
+ 0.5850690381465012,
+ 2.6964560862865947,
+ 2.4151519003432056,
+ 0.34858387799564267,
+ 0.7099391480730223,
+ 2.9987293519695046,
+ 0.50135784416127,
+ 6.521739130434782,
+ 1.6464471403812824,
+ 5.671816937218853,
+ 0.5271084337349398,
+ 0.9537784299339692,
+ 3.9316239316239314,
+ 3.5541195476575123,
+ 1.9283746556473829,
+ 7.625579987895905,
+ 1.360958764980703,
+ 6.228668941979522,
+ 0.655307994757536,
+ 0.3188097768331562,
+ 0.8331718659174578,
+ 1.3694163677861102,
+ 0.901481004507405,
+ 2.044790652385589,
+ 15.081313286284137,
+ 0.49121481201587003,
+ 0.14749262536873156,
+ 4.9937317175094025,
+ 0.6999533364442371,
+ 0.9275775954334641,
+ 18.481724461105905,
+ 2.7838190517616357,
+ 1.4971378247468077,
+ 0.16597510373443983,
+ 1.344139157936351,
+ 0.02157962883038412,
+ 0.3894839337877313,
+ 5.458663646659117,
+ 45.900769434863356,
+ 60.23622047244095,
+ 14.887248054280583,
+ 2.9313790806129245,
+ 1.1802311285960165,
+ 4.521710741103494,
+ 1.4532600157109192,
+ 2.381824844265299,
+ 1.314459049544995,
+ 0.39973351099267157,
+ 0.029338418659234266,
+ 1.1073663938372653,
+ 3.0249110320284696,
+ 5.309534568459105,
+ 2.1542993923770943,
+ 1.7389112903225805,
+ 0.5955334987593052,
+ 0.6772908366533864,
+ 5.022488755622189,
+ 0.4908835904628331,
+ 0.7825295723384895,
+ 3.6588207876951757,
+ 2.3702031602708806,
+ 3.1511679153812255,
+ 0.32661948829613496,
+ 10.024206179695287,
+ 1.6540317022742934,
+ 0.2788104089219331,
+ 0,
+ 2.058432934926959,
+ 7.518307567127747,
+ 0.6983240223463687,
+ 7.677419354838709,
+ 15.696984089289955,
+ 0.2044989775051125,
+ 7.114624505928854,
+ 0.2070393374741201,
+ 2.9223490119677153,
+ 0.07492507492507493,
+ 0.22411474675033619,
+ 3.248762376237624,
+ 0.2938295788442703,
+ 0.07651109410864575,
+ 0.45126353790613716,
+ 0.17538731365097923,
+ 3.5419915348629982,
+ 1.8327067669172932,
+ 0.6085192697768762,
+ 0.12626262626262627,
+ 2.686428902269569,
+ 0.37735849056603776,
+ 0.639749786750071,
+ 0.09342883836810963,
+ 3.3608310418576233,
+ 0.033681374200067365,
+ 1.9677996422182469,
+ 2.814191220685508,
+ 0.47095761381475665,
+ 0.43464762496119214,
+ 1.2394366197183098,
+ 0.26752273943285176,
+ 0.10162601626016261,
+ 0.026048450117218028,
+ 0.39913520705138866,
+ 0.5095541401273885,
+ 0.18885741265344666,
+ 0.8818342151675485,
+ 0.14958863126402394,
+ 2.552048354600403,
+ 0.0992063492063492,
+ 6.718682271348071,
+ 0.6060606060606061,
+ 3.8795303726391013,
+ 6.315789473684211,
+ 0,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "110",
+ "112",
+ "113",
+ "114",
+ "115",
+ "120",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "139",
+ "14",
+ "143",
+ "144",
+ "147",
+ "148",
+ "150",
+ "152",
+ "154",
+ "155",
+ "158",
+ "159",
+ "161",
+ "164",
+ "165",
+ "166",
+ "168",
+ "170",
+ "175",
+ "176",
+ "180",
+ "181",
+ "186",
+ "19",
+ "20",
+ "22",
+ "23",
+ "27",
+ "28",
+ "30",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "87",
+ "88",
+ "90",
+ "91",
+ "94",
+ "99",
+ "108",
+ "135",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "167",
+ "17",
+ "172",
+ "173",
+ "21",
+ "24",
+ "47",
+ "48",
+ "49",
+ "55",
+ "56",
+ "59",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 13.93188854489164,
+ 4.904051172707889,
+ 0.8791208791208791,
+ 1.1826544021024967,
+ 2.2556390977443606,
+ 0.3250270855904659,
+ 1.991955564068186,
+ 0.7200720072007201,
+ 3.35195530726257,
+ 3.9192677775170144,
+ 1.077996195307546,
+ 1.6426416359369762,
+ 6.131946345469477,
+ 1.1111111111111112,
+ 9.353078721745907,
+ 2.7176648213387016,
+ 1.1278195488721803,
+ 14.143790849673202,
+ 3.7815126050420167,
+ 10.922330097087379,
+ 6.184486373165619,
+ 1.0172699313934233,
+ 14.184648036788113,
+ 3.78642470772989,
+ 13.595468177274242,
+ 0.5850690381465012,
+ 2.6964560862865947,
+ 2.4151519003432056,
+ 0.34858387799564267,
+ 0.7099391480730223,
+ 2.9987293519695046,
+ 0.50135784416127,
+ 6.521739130434782,
+ 1.6464471403812824,
+ 5.671816937218853,
+ 0.5271084337349398,
+ 0.9537784299339692,
+ 3.9316239316239314,
+ 3.5541195476575123,
+ 1.9283746556473829,
+ 7.625579987895905,
+ 1.360958764980703,
+ 6.228668941979522,
+ 0.655307994757536,
+ 0.3188097768331562,
+ 0.8331718659174578,
+ 1.3694163677861102,
+ 0.901481004507405,
+ 2.044790652385589,
+ 15.081313286284137,
+ 0.49121481201587003,
+ 0.14749262536873156,
+ 4.9937317175094025,
+ 0.6999533364442371,
+ 0.9275775954334641,
+ 18.481724461105905,
+ 2.7838190517616357,
+ 1.4971378247468077,
+ 0.16597510373443983,
+ 1.344139157936351,
+ 0.02157962883038412,
+ 0.3894839337877313,
+ 5.458663646659117,
+ 45.900769434863356,
+ 60.23622047244095,
+ 14.887248054280583,
+ 2.9313790806129245,
+ 1.1802311285960165,
+ 4.521710741103494,
+ 1.4532600157109192,
+ 2.381824844265299,
+ 1.314459049544995,
+ 0.39973351099267157,
+ 0.029338418659234266,
+ 1.1073663938372653,
+ 3.0249110320284696,
+ 5.309534568459105,
+ 2.1542993923770943,
+ 1.7389112903225805,
+ 0.5955334987593052,
+ 0.6772908366533864,
+ 5.022488755622189,
+ 0.4908835904628331,
+ 0.7825295723384895,
+ 3.6588207876951757,
+ 2.3702031602708806,
+ 3.1511679153812255,
+ 0.32661948829613496,
+ 10.024206179695287,
+ 1.6540317022742934,
+ 0.2788104089219331,
+ 0,
+ 2.058432934926959,
+ 7.518307567127747,
+ 0.6983240223463687,
+ 7.677419354838709,
+ 15.696984089289955,
+ 0.2044989775051125,
+ 7.114624505928854,
+ 0.2070393374741201,
+ 2.9223490119677153,
+ 0.07492507492507493,
+ 0.22411474675033619,
+ 3.248762376237624,
+ 0.2938295788442703,
+ 0.07651109410864575,
+ 0.45126353790613716,
+ 0.17538731365097923,
+ 3.5419915348629982,
+ 1.8327067669172932,
+ 0.6085192697768762,
+ 0.12626262626262627,
+ 2.686428902269569,
+ 0.37735849056603776,
+ 0.639749786750071,
+ 0.09342883836810963,
+ 3.3608310418576233,
+ 0.033681374200067365,
+ 1.9677996422182469,
+ 2.814191220685508,
+ 0.47095761381475665,
+ 0.43464762496119214,
+ 1.2394366197183098,
+ 0.26752273943285176,
+ 0.10162601626016261,
+ 0.026048450117218028,
+ 0.39913520705138866,
+ 0.5095541401273885,
+ 0.18885741265344666,
+ 0.8818342151675485,
+ 0.14958863126402394,
+ 2.552048354600403,
+ 0.0992063492063492,
+ 6.718682271348071,
+ 0.6060606060606061,
+ 3.8795303726391013,
+ 6.315789473684211,
+ 0,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(51, 160, 44)"
+ },
+ "name": "TCD8",
+ "text": [
+ 0.37151702786377705,
+ 2.4520255863539444,
+ 0.6593406593406593,
+ 0.6307490144546649,
+ 17.387218045112782,
+ 6.121343445287107,
+ 1.762114537444934,
+ 29.072907290729074,
+ 3.55147645650439,
+ 0.21121802393804273,
+ 0.03170577045022194,
+ 17.063359034528997,
+ 0.3011223651793047,
+ 0.26666666666666666,
+ 0.03897116134060795,
+ 0.20130850528434827,
+ 1.948051948051948,
+ 1.1764705882352942,
+ 0.2291825821237586,
+ 0.24271844660194172,
+ 1.1530398322851152,
+ 1.230186893778093,
+ 0.21223912274495935,
+ 0.24428546501483162,
+ 0.4998333888703766,
+ 0,
+ 0.23112480739599386,
+ 0.07626795474768018,
+ 7.363834422657953,
+ 0.3911909591422776,
+ 0.20330368487928843,
+ 0.9609358679757677,
+ 1.4640638864241349,
+ 0.6932409012131715,
+ 0.8214355564247995,
+ 0.1694277108433735,
+ 0,
+ 0.927960927960928,
+ 3.1825525040387723,
+ 11.937557392102846,
+ 0.0403469840629413,
+ 0.28437944342880356,
+ 0.6825938566552902,
+ 0.1310615989515072,
+ 0.10626992561105207,
+ 0.019376089905057157,
+ 2.41278121943267,
+ 0.19317450096587252,
+ 0.9737098344693282,
+ 3.958269407793802,
+ 0.4345361798601928,
+ 12.271386430678465,
+ 15.670706226493941,
+ 0,
+ 0.8205494113449875,
+ 2.7741330834114337,
+ 1.4354066985645932,
+ 19.154557463672393,
+ 71.45228215767635,
+ 25.677011267048822,
+ 1.294777729823047,
+ 0.4089581304771178,
+ 0.7927519818799547,
+ 0.02653223666755107,
+ 2.3622047244094486,
+ 9.5988824585911,
+ 0.6662225183211192,
+ 0.34423407917383825,
+ 0.3917727717923604,
+ 0.864100549882168,
+ 1.667277390985709,
+ 0.10111223458038424,
+ 1.4434821230290917,
+ 16.62021417045621,
+ 0.9950248756218906,
+ 6.93950177935943,
+ 0.11296882060551287,
+ 1.8228687166267723,
+ 1.033266129032258,
+ 7.626137303556659,
+ 0.5179282868525896,
+ 1.5492253873063468,
+ 0.02337540906965872,
+ 1.4194722474977253,
+ 4.474481472850152,
+ 3.470654627539503,
+ 12.5605993829881,
+ 2.558519324986391,
+ 0.25630072618539085,
+ 4.387778543533195,
+ 2.5650557620817844,
+ 26.26599888703395,
+ 0.15493581230633025,
+ 0.32546786004882017,
+ 0.13966480446927373,
+ 0.25806451612903225,
+ 2.3509855141296603,
+ 10.429447852760736,
+ 1.8181818181818181,
+ 0,
+ 0.11132758140829391,
+ 0.12487512487512488,
+ 2.3756163155535632,
+ 0.8353960396039605,
+ 0.3428011753183154,
+ 0,
+ 27.707581227436823,
+ 1.929260450160772,
+ 0.06683002895967921,
+ 1.3157894736842104,
+ 0,
+ 0.5050505050505051,
+ 0,
+ 0.25157232704402516,
+ 0.5828831390389536,
+ 0.21800062285892244,
+ 0.5346776657500764,
+ 0,
+ 0.17889087656529518,
+ 1.0944076969332532,
+ 7.064364207221351,
+ 0.3104625892579944,
+ 2.873239436619718,
+ 11.021936864633494,
+ 5.7926829268292686,
+ 0.3125814014066163,
+ 1.1308830866456012,
+ 0.12738853503184713,
+ 0.09442870632672333,
+ 0.5291005291005291,
+ 1.6828721017202692,
+ 0.1343183344526528,
+ 0,
+ 1.1847998844097674,
+ 54.54545454545454,
+ 0.10209290454313426,
+ 1.3793103448275863,
+ 4.634040710264184,
+ 7.419354838709677
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "110",
+ "112",
+ "113",
+ "114",
+ "115",
+ "120",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "139",
+ "14",
+ "143",
+ "144",
+ "147",
+ "148",
+ "150",
+ "152",
+ "154",
+ "155",
+ "158",
+ "159",
+ "161",
+ "164",
+ "165",
+ "166",
+ "168",
+ "170",
+ "175",
+ "176",
+ "180",
+ "181",
+ "186",
+ "19",
+ "20",
+ "22",
+ "23",
+ "27",
+ "28",
+ "30",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "87",
+ "88",
+ "90",
+ "91",
+ "94",
+ "99",
+ "108",
+ "135",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "167",
+ "17",
+ "172",
+ "173",
+ "21",
+ "24",
+ "47",
+ "48",
+ "49",
+ "55",
+ "56",
+ "59",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0.37151702786377705,
+ 2.4520255863539444,
+ 0.6593406593406593,
+ 0.6307490144546649,
+ 17.387218045112782,
+ 6.121343445287107,
+ 1.762114537444934,
+ 29.072907290729074,
+ 3.55147645650439,
+ 0.21121802393804273,
+ 0.03170577045022194,
+ 17.063359034528997,
+ 0.3011223651793047,
+ 0.26666666666666666,
+ 0.03897116134060795,
+ 0.20130850528434827,
+ 1.948051948051948,
+ 1.1764705882352942,
+ 0.2291825821237586,
+ 0.24271844660194172,
+ 1.1530398322851152,
+ 1.230186893778093,
+ 0.21223912274495935,
+ 0.24428546501483162,
+ 0.4998333888703766,
+ 0,
+ 0.23112480739599386,
+ 0.07626795474768018,
+ 7.363834422657953,
+ 0.3911909591422776,
+ 0.20330368487928843,
+ 0.9609358679757677,
+ 1.4640638864241349,
+ 0.6932409012131715,
+ 0.8214355564247995,
+ 0.1694277108433735,
+ 0,
+ 0.927960927960928,
+ 3.1825525040387723,
+ 11.937557392102846,
+ 0.0403469840629413,
+ 0.28437944342880356,
+ 0.6825938566552902,
+ 0.1310615989515072,
+ 0.10626992561105207,
+ 0.019376089905057157,
+ 2.41278121943267,
+ 0.19317450096587252,
+ 0.9737098344693282,
+ 3.958269407793802,
+ 0.4345361798601928,
+ 12.271386430678465,
+ 15.670706226493941,
+ 0,
+ 0.8205494113449875,
+ 2.7741330834114337,
+ 1.4354066985645932,
+ 19.154557463672393,
+ 71.45228215767635,
+ 25.677011267048822,
+ 1.294777729823047,
+ 0.4089581304771178,
+ 0.7927519818799547,
+ 0.02653223666755107,
+ 2.3622047244094486,
+ 9.5988824585911,
+ 0.6662225183211192,
+ 0.34423407917383825,
+ 0.3917727717923604,
+ 0.864100549882168,
+ 1.667277390985709,
+ 0.10111223458038424,
+ 1.4434821230290917,
+ 16.62021417045621,
+ 0.9950248756218906,
+ 6.93950177935943,
+ 0.11296882060551287,
+ 1.8228687166267723,
+ 1.033266129032258,
+ 7.626137303556659,
+ 0.5179282868525896,
+ 1.5492253873063468,
+ 0.02337540906965872,
+ 1.4194722474977253,
+ 4.474481472850152,
+ 3.470654627539503,
+ 12.5605993829881,
+ 2.558519324986391,
+ 0.25630072618539085,
+ 4.387778543533195,
+ 2.5650557620817844,
+ 26.26599888703395,
+ 0.15493581230633025,
+ 0.32546786004882017,
+ 0.13966480446927373,
+ 0.25806451612903225,
+ 2.3509855141296603,
+ 10.429447852760736,
+ 1.8181818181818181,
+ 0,
+ 0.11132758140829391,
+ 0.12487512487512488,
+ 2.3756163155535632,
+ 0.8353960396039605,
+ 0.3428011753183154,
+ 0,
+ 27.707581227436823,
+ 1.929260450160772,
+ 0.06683002895967921,
+ 1.3157894736842104,
+ 0,
+ 0.5050505050505051,
+ 0,
+ 0.25157232704402516,
+ 0.5828831390389536,
+ 0.21800062285892244,
+ 0.5346776657500764,
+ 0,
+ 0.17889087656529518,
+ 1.0944076969332532,
+ 7.064364207221351,
+ 0.3104625892579944,
+ 2.873239436619718,
+ 11.021936864633494,
+ 5.7926829268292686,
+ 0.3125814014066163,
+ 1.1308830866456012,
+ 0.12738853503184713,
+ 0.09442870632672333,
+ 0.5291005291005291,
+ 1.6828721017202692,
+ 0.1343183344526528,
+ 0,
+ 1.1847998844097674,
+ 54.54545454545454,
+ 0.10209290454313426,
+ 1.3793103448275863,
+ 4.634040710264184,
+ 7.419354838709677
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(251, 154, 153)"
+ },
+ "name": "M1",
+ "text": [
+ 2.5851393188854486,
+ 0,
+ 0.13186813186813187,
+ 0.1314060446780552,
+ 0.21929824561403508,
+ 0.16251354279523295,
+ 0.03830683777054204,
+ 0.6300630063006301,
+ 0.03990422984836393,
+ 0,
+ 0.07926442612555486,
+ 0,
+ 0.32849712565015055,
+ 0,
+ 0,
+ 0.050327126321087066,
+ 0.011392116655274549,
+ 0.052287581699346414,
+ 0,
+ 0,
+ 0,
+ 0.02365744026496333,
+ 0.035373187124159884,
+ 0.034897923573547374,
+ 3.9986671109630127,
+ 0,
+ 0.07704160246533129,
+ 0.025422651582560064,
+ 0.261437908496732,
+ 0,
+ 0,
+ 0.020889910173386254,
+ 0.4658385093167702,
+ 0,
+ 0.019557989438685704,
+ 0,
+ 0,
+ 0,
+ 0.12924071082390953,
+ 0,
+ 0.0806939681258826,
+ 0.14218972171440178,
+ 0,
+ 0,
+ 0,
+ 0.27126525867080026,
+ 0.39126181936746,
+ 0.128783000643915,
+ 1.7526777020447908,
+ 0.04602638846271863,
+ 0,
+ 2.0648967551622417,
+ 0,
+ 0.04666355576294914,
+ 0.03567606136282554,
+ 0.056232427366447985,
+ 0,
+ 0,
+ 2.1576763485477177,
+ 0.0197667523225934,
+ 0,
+ 0.07789678675754626,
+ 0,
+ 0.02653223666755107,
+ 0,
+ 0.9978048293753742,
+ 0,
+ 0,
+ 0,
+ 0.1178318931657502,
+ 0.09160864785635764,
+ 0.36111512350137226,
+ 0,
+ 0.044007627988851404,
+ 0,
+ 0,
+ 0.022593764121102578,
+ 0.055238445958387034,
+ 0.12600806451612903,
+ 0.016542597187758478,
+ 0,
+ 0.29985007496251875,
+ 0.04675081813931744,
+ 0.07279344858962694,
+ 0.3262642740619902,
+ 0,
+ 0.3085059497576025,
+ 0.07258210851025222,
+ 0,
+ 0.13783597518952445,
+ 0.5390334572490706,
+ 0.1669449081803005,
+ 0.04426737494466578,
+ 0.09764035801464606,
+ 0.034916201117318434,
+ 0.25806451612903225,
+ 0.04749465685110425,
+ 0,
+ 0.3952569169960474,
+ 0.06901311249137336,
+ 0,
+ 0,
+ 0,
+ 3.125,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.022276676319893073,
+ 0,
+ 0.10141987829614604,
+ 0.06313131313131314,
+ 0.09263547938860583,
+ 0,
+ 0,
+ 0.06228589224540642,
+ 0.030553009471432937,
+ 0,
+ 6.350626118067979,
+ 0,
+ 0.15698587127158556,
+ 0.03104625892579944,
+ 0,
+ 0,
+ 0.1524390243902439,
+ 0.052096900234436055,
+ 0.2827207716614003,
+ 0,
+ 0.09442870632672333,
+ 0,
+ 0.1869857890800299,
+ 0.2686366689053056,
+ 0,
+ 0,
+ 0.1652892561983471,
+ 0.10209290454313426,
+ 0,
+ 0.3897791251624079,
+ 0.967741935483871
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "110",
+ "112",
+ "113",
+ "114",
+ "115",
+ "120",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "139",
+ "14",
+ "143",
+ "144",
+ "147",
+ "148",
+ "150",
+ "152",
+ "154",
+ "155",
+ "158",
+ "159",
+ "161",
+ "164",
+ "165",
+ "166",
+ "168",
+ "170",
+ "175",
+ "176",
+ "180",
+ "181",
+ "186",
+ "19",
+ "20",
+ "22",
+ "23",
+ "27",
+ "28",
+ "30",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "87",
+ "88",
+ "90",
+ "91",
+ "94",
+ "99",
+ "108",
+ "135",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "167",
+ "17",
+ "172",
+ "173",
+ "21",
+ "24",
+ "47",
+ "48",
+ "49",
+ "55",
+ "56",
+ "59",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 2.5851393188854486,
+ 0,
+ 0.13186813186813187,
+ 0.1314060446780552,
+ 0.21929824561403508,
+ 0.16251354279523295,
+ 0.03830683777054204,
+ 0.6300630063006301,
+ 0.03990422984836393,
+ 0,
+ 0.07926442612555486,
+ 0,
+ 0.32849712565015055,
+ 0,
+ 0,
+ 0.050327126321087066,
+ 0.011392116655274549,
+ 0.052287581699346414,
+ 0,
+ 0,
+ 0,
+ 0.02365744026496333,
+ 0.035373187124159884,
+ 0.034897923573547374,
+ 3.9986671109630127,
+ 0,
+ 0.07704160246533129,
+ 0.025422651582560064,
+ 0.261437908496732,
+ 0,
+ 0,
+ 0.020889910173386254,
+ 0.4658385093167702,
+ 0,
+ 0.019557989438685704,
+ 0,
+ 0,
+ 0,
+ 0.12924071082390953,
+ 0,
+ 0.0806939681258826,
+ 0.14218972171440178,
+ 0,
+ 0,
+ 0,
+ 0.27126525867080026,
+ 0.39126181936746,
+ 0.128783000643915,
+ 1.7526777020447908,
+ 0.04602638846271863,
+ 0,
+ 2.0648967551622417,
+ 0,
+ 0.04666355576294914,
+ 0.03567606136282554,
+ 0.056232427366447985,
+ 0,
+ 0,
+ 2.1576763485477177,
+ 0.0197667523225934,
+ 0,
+ 0.07789678675754626,
+ 0,
+ 0.02653223666755107,
+ 0,
+ 0.9978048293753742,
+ 0,
+ 0,
+ 0,
+ 0.1178318931657502,
+ 0.09160864785635764,
+ 0.36111512350137226,
+ 0,
+ 0.044007627988851404,
+ 0,
+ 0,
+ 0.022593764121102578,
+ 0.055238445958387034,
+ 0.12600806451612903,
+ 0.016542597187758478,
+ 0,
+ 0.29985007496251875,
+ 0.04675081813931744,
+ 0.07279344858962694,
+ 0.3262642740619902,
+ 0,
+ 0.3085059497576025,
+ 0.07258210851025222,
+ 0,
+ 0.13783597518952445,
+ 0.5390334572490706,
+ 0.1669449081803005,
+ 0.04426737494466578,
+ 0.09764035801464606,
+ 0.034916201117318434,
+ 0.25806451612903225,
+ 0.04749465685110425,
+ 0,
+ 0.3952569169960474,
+ 0.06901311249137336,
+ 0,
+ 0,
+ 0,
+ 3.125,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.022276676319893073,
+ 0,
+ 0.10141987829614604,
+ 0.06313131313131314,
+ 0.09263547938860583,
+ 0,
+ 0,
+ 0.06228589224540642,
+ 0.030553009471432937,
+ 0,
+ 6.350626118067979,
+ 0,
+ 0.15698587127158556,
+ 0.03104625892579944,
+ 0,
+ 0,
+ 0.1524390243902439,
+ 0.052096900234436055,
+ 0.2827207716614003,
+ 0,
+ 0.09442870632672333,
+ 0,
+ 0.1869857890800299,
+ 0.2686366689053056,
+ 0,
+ 0,
+ 0.1652892561983471,
+ 0.10209290454313426,
+ 0,
+ 0.3897791251624079,
+ 0.967741935483871
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(227, 26, 28)"
+ },
+ "name": "M2",
+ "text": [
+ 1.5479876160990713,
+ 0.15991471215351813,
+ 0.04395604395604395,
+ 0.026281208935611037,
+ 0,
+ 0.16251354279523295,
+ 0,
+ 1.4401440144014401,
+ 0.11971268954509177,
+ 0,
+ 0.03170577045022194,
+ 0,
+ 0.08212428141253764,
+ 0.044444444444444446,
+ 0.03897116134060795,
+ 0,
+ 0.03417634996582365,
+ 0.0784313725490196,
+ 0.03819709702062643,
+ 0,
+ 0,
+ 0,
+ 0.035373187124159884,
+ 0.034897923573547374,
+ 0.049983338887037654,
+ 0,
+ 0.30816640986132515,
+ 0.012711325791280032,
+ 0.08714596949891067,
+ 0,
+ 0,
+ 0.04177982034677251,
+ 0.022182786157941437,
+ 0,
+ 0,
+ 0.01882530120481928,
+ 0,
+ 0,
+ 0.08077544426494346,
+ 0,
+ 0.0403469840629413,
+ 0,
+ 0.3412969283276451,
+ 0.655307994757536,
+ 0,
+ 0,
+ 2.184545158134985,
+ 0,
+ 0.4868549172346641,
+ 0,
+ 0,
+ 0.029498525073746312,
+ 0.06268282490597576,
+ 0.031109037175299427,
+ 0,
+ 0,
+ 0.04349717268377556,
+ 0.08806693086745927,
+ 1.0788381742738589,
+ 0,
+ 0,
+ 0.07789678675754626,
+ 0,
+ 0.10612894667020428,
+ 0,
+ 0.23947315905008978,
+ 0,
+ 0,
+ 0.04897159647404505,
+ 0,
+ 0,
+ 0.01444460494005489,
+ 0,
+ 0.029338418659234266,
+ 0,
+ 0,
+ 0.11296882060551287,
+ 0.018412815319462345,
+ 0,
+ 0.5128205128205128,
+ 0,
+ 0.12493753123438281,
+ 0,
+ 0.03639672429481347,
+ 0.745746912141692,
+ 0.4514672686230248,
+ 0.37461436756280303,
+ 0.07258210851025222,
+ 0,
+ 0.1837813002526993,
+ 0.966542750929368,
+ 0.4451864218141347,
+ 0.02213368747233289,
+ 0.5044751830756713,
+ 0.10474860335195531,
+ 0.8387096774193548,
+ 0.5224412253621468,
+ 0,
+ 0.3952569169960474,
+ 0,
+ 0,
+ 0.04995004995004995,
+ 0.08964589870013448,
+ 0.09282178217821782,
+ 0,
+ 0,
+ 0,
+ 0.029231218941829874,
+ 0,
+ 0.046992481203007516,
+ 0.3042596348884381,
+ 0,
+ 0,
+ 0,
+ 0.04264998578333807,
+ 0.03114294612270321,
+ 0,
+ 0,
+ 0.08944543828264759,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.35569105691056907,
+ 0,
+ 0.09978380176284717,
+ 0.06369426751592357,
+ 0.3777148253068933,
+ 0,
+ 0.037397157816005985,
+ 0.0671591672263264,
+ 0,
+ 0.014448779078167894,
+ 1.3774104683195594,
+ 0.05104645227156713,
+ 0,
+ 0.6929406669553919,
+ 4.838709677419355
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "110",
+ "112",
+ "113",
+ "114",
+ "115",
+ "120",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "139",
+ "14",
+ "143",
+ "144",
+ "147",
+ "148",
+ "150",
+ "152",
+ "154",
+ "155",
+ "158",
+ "159",
+ "161",
+ "164",
+ "165",
+ "166",
+ "168",
+ "170",
+ "175",
+ "176",
+ "180",
+ "181",
+ "186",
+ "19",
+ "20",
+ "22",
+ "23",
+ "27",
+ "28",
+ "30",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "87",
+ "88",
+ "90",
+ "91",
+ "94",
+ "99",
+ "108",
+ "135",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "167",
+ "17",
+ "172",
+ "173",
+ "21",
+ "24",
+ "47",
+ "48",
+ "49",
+ "55",
+ "56",
+ "59",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 1.5479876160990713,
+ 0.15991471215351813,
+ 0.04395604395604395,
+ 0.026281208935611037,
+ 0,
+ 0.16251354279523295,
+ 0,
+ 1.4401440144014401,
+ 0.11971268954509177,
+ 0,
+ 0.03170577045022194,
+ 0,
+ 0.08212428141253764,
+ 0.044444444444444446,
+ 0.03897116134060795,
+ 0,
+ 0.03417634996582365,
+ 0.0784313725490196,
+ 0.03819709702062643,
+ 0,
+ 0,
+ 0,
+ 0.035373187124159884,
+ 0.034897923573547374,
+ 0.049983338887037654,
+ 0,
+ 0.30816640986132515,
+ 0.012711325791280032,
+ 0.08714596949891067,
+ 0,
+ 0,
+ 0.04177982034677251,
+ 0.022182786157941437,
+ 0,
+ 0,
+ 0.01882530120481928,
+ 0,
+ 0,
+ 0.08077544426494346,
+ 0,
+ 0.0403469840629413,
+ 0,
+ 0.3412969283276451,
+ 0.655307994757536,
+ 0,
+ 0,
+ 2.184545158134985,
+ 0,
+ 0.4868549172346641,
+ 0,
+ 0,
+ 0.029498525073746312,
+ 0.06268282490597576,
+ 0.031109037175299427,
+ 0,
+ 0,
+ 0.04349717268377556,
+ 0.08806693086745927,
+ 1.0788381742738589,
+ 0,
+ 0,
+ 0.07789678675754626,
+ 0,
+ 0.10612894667020428,
+ 0,
+ 0.23947315905008978,
+ 0,
+ 0,
+ 0.04897159647404505,
+ 0,
+ 0,
+ 0.01444460494005489,
+ 0,
+ 0.029338418659234266,
+ 0,
+ 0,
+ 0.11296882060551287,
+ 0.018412815319462345,
+ 0,
+ 0.5128205128205128,
+ 0,
+ 0.12493753123438281,
+ 0,
+ 0.03639672429481347,
+ 0.745746912141692,
+ 0.4514672686230248,
+ 0.37461436756280303,
+ 0.07258210851025222,
+ 0,
+ 0.1837813002526993,
+ 0.966542750929368,
+ 0.4451864218141347,
+ 0.02213368747233289,
+ 0.5044751830756713,
+ 0.10474860335195531,
+ 0.8387096774193548,
+ 0.5224412253621468,
+ 0,
+ 0.3952569169960474,
+ 0,
+ 0,
+ 0.04995004995004995,
+ 0.08964589870013448,
+ 0.09282178217821782,
+ 0,
+ 0,
+ 0,
+ 0.029231218941829874,
+ 0,
+ 0.046992481203007516,
+ 0.3042596348884381,
+ 0,
+ 0,
+ 0,
+ 0.04264998578333807,
+ 0.03114294612270321,
+ 0,
+ 0,
+ 0.08944543828264759,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.35569105691056907,
+ 0,
+ 0.09978380176284717,
+ 0.06369426751592357,
+ 0.3777148253068933,
+ 0,
+ 0.037397157816005985,
+ 0.0671591672263264,
+ 0,
+ 0.014448779078167894,
+ 1.3774104683195594,
+ 0.05104645227156713,
+ 0,
+ 0.6929406669553919,
+ 4.838709677419355
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(253, 191, 111)"
+ },
+ "name": "Treg",
+ "text": [
+ 0.07739938080495357,
+ 0.053304904051172705,
+ 0,
+ 0,
+ 0.03132832080200501,
+ 0,
+ 0,
+ 0,
+ 0.03990422984836393,
+ 0.16428068528514433,
+ 0,
+ 0.1340931947703654,
+ 0.027374760470845878,
+ 0,
+ 0,
+ 0.10065425264217413,
+ 0,
+ 0.026143790849673207,
+ 0,
+ 0.08090614886731393,
+ 0,
+ 0.02365744026496333,
+ 0.14149274849663954,
+ 0,
+ 0.049983338887037654,
+ 0,
+ 0.15408320493066258,
+ 0,
+ 0.17429193899782133,
+ 0,
+ 0.20330368487928843,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.01882530120481928,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.0403469840629413,
+ 0.020312817387771683,
+ 0.3412969283276451,
+ 0.2621231979030144,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.0613685179502915,
+ 0,
+ 0,
+ 0.020894274968658588,
+ 0,
+ 0,
+ 0.09372071227741331,
+ 0.04349717268377556,
+ 0,
+ 0.08298755186721991,
+ 0,
+ 0,
+ 0.03894839337877313,
+ 0,
+ 0.02653223666755107,
+ 0.7874015748031495,
+ 0.6385950908002395,
+ 0.06662225183211193,
+ 0,
+ 0,
+ 0,
+ 0.01832172957127153,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.1779359430604982,
+ 0,
+ 0,
+ 0,
+ 0.033085194375516956,
+ 0.0398406374501992,
+ 0,
+ 0.02337540906965872,
+ 0,
+ 0.04660918200885575,
+ 0.02821670428893905,
+ 0.4627589246364037,
+ 0,
+ 0.056955716930086865,
+ 0,
+ 0.01858736059479554,
+ 0,
+ 0.02213368747233289,
+ 0,
+ 0,
+ 0.12903225806451613,
+ 0.04749465685110425,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.04995004995004995,
+ 0,
+ 0.03094059405940594,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.022276676319893073,
+ 0,
+ 0.10141987829614604,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.015276504735716468,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.03104625892579944,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.037397157816005985,
+ 0,
+ 0,
+ 0.014448779078167894,
+ 0.055096418732782364,
+ 0,
+ 0.03629764065335753,
+ 0.043308791684711995,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "110",
+ "112",
+ "113",
+ "114",
+ "115",
+ "120",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "139",
+ "14",
+ "143",
+ "144",
+ "147",
+ "148",
+ "150",
+ "152",
+ "154",
+ "155",
+ "158",
+ "159",
+ "161",
+ "164",
+ "165",
+ "166",
+ "168",
+ "170",
+ "175",
+ "176",
+ "180",
+ "181",
+ "186",
+ "19",
+ "20",
+ "22",
+ "23",
+ "27",
+ "28",
+ "30",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "87",
+ "88",
+ "90",
+ "91",
+ "94",
+ "99",
+ "108",
+ "135",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "167",
+ "17",
+ "172",
+ "173",
+ "21",
+ "24",
+ "47",
+ "48",
+ "49",
+ "55",
+ "56",
+ "59",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0.07739938080495357,
+ 0.053304904051172705,
+ 0,
+ 0,
+ 0.03132832080200501,
+ 0,
+ 0,
+ 0,
+ 0.03990422984836393,
+ 0.16428068528514433,
+ 0,
+ 0.1340931947703654,
+ 0.027374760470845878,
+ 0,
+ 0,
+ 0.10065425264217413,
+ 0,
+ 0.026143790849673207,
+ 0,
+ 0.08090614886731393,
+ 0,
+ 0.02365744026496333,
+ 0.14149274849663954,
+ 0,
+ 0.049983338887037654,
+ 0,
+ 0.15408320493066258,
+ 0,
+ 0.17429193899782133,
+ 0,
+ 0.20330368487928843,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.01882530120481928,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.0403469840629413,
+ 0.020312817387771683,
+ 0.3412969283276451,
+ 0.2621231979030144,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.0613685179502915,
+ 0,
+ 0,
+ 0.020894274968658588,
+ 0,
+ 0,
+ 0.09372071227741331,
+ 0.04349717268377556,
+ 0,
+ 0.08298755186721991,
+ 0,
+ 0,
+ 0.03894839337877313,
+ 0,
+ 0.02653223666755107,
+ 0.7874015748031495,
+ 0.6385950908002395,
+ 0.06662225183211193,
+ 0,
+ 0,
+ 0,
+ 0.01832172957127153,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.1779359430604982,
+ 0,
+ 0,
+ 0,
+ 0.033085194375516956,
+ 0.0398406374501992,
+ 0,
+ 0.02337540906965872,
+ 0,
+ 0.04660918200885575,
+ 0.02821670428893905,
+ 0.4627589246364037,
+ 0,
+ 0.056955716930086865,
+ 0,
+ 0.01858736059479554,
+ 0,
+ 0.02213368747233289,
+ 0,
+ 0,
+ 0.12903225806451613,
+ 0.04749465685110425,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.04995004995004995,
+ 0,
+ 0.03094059405940594,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.022276676319893073,
+ 0,
+ 0.10141987829614604,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.015276504735716468,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.03104625892579944,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.037397157816005985,
+ 0,
+ 0,
+ 0.014448779078167894,
+ 0.055096418732782364,
+ 0,
+ 0.03629764065335753,
+ 0.043308791684711995,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(1.0, 0.4980392156862745, 0.0)"
+ },
+ "name": "IMMUNE_OTHER",
+ "text": [
+ 0.43343653250773995,
+ 1.5991471215351813,
+ 1.054945054945055,
+ 0.9986859395532195,
+ 2.443609022556391,
+ 2.654387865655471,
+ 1.742961118559663,
+ 7.380738073807381,
+ 1.5163607342378291,
+ 2.1825862473597746,
+ 0.30120481927710846,
+ 4.793831713040563,
+ 0.6022447303586094,
+ 1.2,
+ 1.0522213561964147,
+ 0.9562154001006542,
+ 1.9366598313966734,
+ 6.431372549019608,
+ 2.2536287242169597,
+ 1.132686084142395,
+ 2.515723270440252,
+ 0.63875088715401,
+ 0.3537318712415989,
+ 0.9596928982725527,
+ 0.733088970343219,
+ 1.8956236835946643,
+ 0.3852080123266564,
+ 0.6737002669378416,
+ 4.488017429193899,
+ 0.275282526803825,
+ 0.8640406607369758,
+ 0.6893670357217464,
+ 2.085181898846495,
+ 4.419410745233969,
+ 1.388617250146685,
+ 1.8072289156626504,
+ 0,
+ 1.05006105006105,
+ 2.245557350565428,
+ 4.40771349862259,
+ 0.685898729070002,
+ 0.7312614259597806,
+ 0.6825938566552902,
+ 0.1310615989515072,
+ 0.5313496280552604,
+ 0.019376089905057157,
+ 2.4779915226605804,
+ 0.7726980038634901,
+ 1.7526777020447908,
+ 0.981896287204664,
+ 2.871717362554317,
+ 1.6814159292035398,
+ 3.238612620142081,
+ 0.15554518587649713,
+ 3.2108455226542985,
+ 1.3870665417057169,
+ 1.1309264897781643,
+ 9.64332892998679,
+ 5.892116182572614,
+ 7.96600118600514,
+ 1.7911091929218816,
+ 0.7984420642648491,
+ 1.0192525481313703,
+ 0.6102414433536747,
+ 0.7874015748031495,
+ 4.170824186789064,
+ 0.4663557628247834,
+ 0.09835259404966806,
+ 1.305909239307868,
+ 0.3534956794972506,
+ 1.2092341517039207,
+ 2.5278058645096055,
+ 1.6655562958027983,
+ 4.987531172069826,
+ 0.6900978976087305,
+ 1.0676156583629894,
+ 1.6041572525982828,
+ 1.067943288528816,
+ 4.057459677419355,
+ 3.391232423490488,
+ 6.135458167330677,
+ 1.9740129935032484,
+ 0.23375409069658717,
+ 4.112829845313922,
+ 6.688417618270799,
+ 2.5677200902934536,
+ 11.943587483472895,
+ 2.7399745962620217,
+ 0.39869001851060804,
+ 2.3661842407535034,
+ 7.862453531598514,
+ 10.684474123539232,
+ 1.1730854360336431,
+ 3.254678600488202,
+ 1.291899441340782,
+ 0.25806451612903225,
+ 2.7546900973640467,
+ 6.5439672801636,
+ 0.9486166007905139,
+ 0.4830917874396135,
+ 1.057612023378792,
+ 1.4735264735264737,
+ 1.8825638727028238,
+ 1.8254950495049505,
+ 0.832517140058766,
+ 6.809487375669472,
+ 3.8808664259927803,
+ 1.4907921660333234,
+ 1.70416573847182,
+ 0.9868421052631579,
+ 1.1156186612576064,
+ 1.6203703703703702,
+ 0.7874015748031495,
+ 1.509433962264151,
+ 1.6917827694057437,
+ 0.9342883836810962,
+ 0.4277421326000611,
+ 0.40417649040080833,
+ 0.9838998211091234,
+ 2.1286831028262174,
+ 4.23861852433281,
+ 0.37255510710959333,
+ 0.7887323943661971,
+ 4.5478865703584805,
+ 2.9471544715447155,
+ 0.5209690023443605,
+ 0.7982704141027773,
+ 0.1910828025477707,
+ 1.2275731822474032,
+ 1.9400352733686066,
+ 4.18848167539267,
+ 0.5372733378106112,
+ 1.3888888888888888,
+ 0.5201560468140443,
+ 10.137741046831957,
+ 0.20418580908626852,
+ 2.0326678765880217,
+ 2.468601126028584,
+ 1.2903225806451613
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "110",
+ "112",
+ "113",
+ "114",
+ "115",
+ "120",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "139",
+ "14",
+ "143",
+ "144",
+ "147",
+ "148",
+ "150",
+ "152",
+ "154",
+ "155",
+ "158",
+ "159",
+ "161",
+ "164",
+ "165",
+ "166",
+ "168",
+ "170",
+ "175",
+ "176",
+ "180",
+ "181",
+ "186",
+ "19",
+ "20",
+ "22",
+ "23",
+ "27",
+ "28",
+ "30",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "87",
+ "88",
+ "90",
+ "91",
+ "94",
+ "99",
+ "108",
+ "135",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "167",
+ "17",
+ "172",
+ "173",
+ "21",
+ "24",
+ "47",
+ "48",
+ "49",
+ "55",
+ "56",
+ "59",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 0.43343653250773995,
+ 1.5991471215351813,
+ 1.054945054945055,
+ 0.9986859395532195,
+ 2.443609022556391,
+ 2.654387865655471,
+ 1.742961118559663,
+ 7.380738073807381,
+ 1.5163607342378291,
+ 2.1825862473597746,
+ 0.30120481927710846,
+ 4.793831713040563,
+ 0.6022447303586094,
+ 1.2,
+ 1.0522213561964147,
+ 0.9562154001006542,
+ 1.9366598313966734,
+ 6.431372549019608,
+ 2.2536287242169597,
+ 1.132686084142395,
+ 2.515723270440252,
+ 0.63875088715401,
+ 0.3537318712415989,
+ 0.9596928982725527,
+ 0.733088970343219,
+ 1.8956236835946643,
+ 0.3852080123266564,
+ 0.6737002669378416,
+ 4.488017429193899,
+ 0.275282526803825,
+ 0.8640406607369758,
+ 0.6893670357217464,
+ 2.085181898846495,
+ 4.419410745233969,
+ 1.388617250146685,
+ 1.8072289156626504,
+ 0,
+ 1.05006105006105,
+ 2.245557350565428,
+ 4.40771349862259,
+ 0.685898729070002,
+ 0.7312614259597806,
+ 0.6825938566552902,
+ 0.1310615989515072,
+ 0.5313496280552604,
+ 0.019376089905057157,
+ 2.4779915226605804,
+ 0.7726980038634901,
+ 1.7526777020447908,
+ 0.981896287204664,
+ 2.871717362554317,
+ 1.6814159292035398,
+ 3.238612620142081,
+ 0.15554518587649713,
+ 3.2108455226542985,
+ 1.3870665417057169,
+ 1.1309264897781643,
+ 9.64332892998679,
+ 5.892116182572614,
+ 7.96600118600514,
+ 1.7911091929218816,
+ 0.7984420642648491,
+ 1.0192525481313703,
+ 0.6102414433536747,
+ 0.7874015748031495,
+ 4.170824186789064,
+ 0.4663557628247834,
+ 0.09835259404966806,
+ 1.305909239307868,
+ 0.3534956794972506,
+ 1.2092341517039207,
+ 2.5278058645096055,
+ 1.6655562958027983,
+ 4.987531172069826,
+ 0.6900978976087305,
+ 1.0676156583629894,
+ 1.6041572525982828,
+ 1.067943288528816,
+ 4.057459677419355,
+ 3.391232423490488,
+ 6.135458167330677,
+ 1.9740129935032484,
+ 0.23375409069658717,
+ 4.112829845313922,
+ 6.688417618270799,
+ 2.5677200902934536,
+ 11.943587483472895,
+ 2.7399745962620217,
+ 0.39869001851060804,
+ 2.3661842407535034,
+ 7.862453531598514,
+ 10.684474123539232,
+ 1.1730854360336431,
+ 3.254678600488202,
+ 1.291899441340782,
+ 0.25806451612903225,
+ 2.7546900973640467,
+ 6.5439672801636,
+ 0.9486166007905139,
+ 0.4830917874396135,
+ 1.057612023378792,
+ 1.4735264735264737,
+ 1.8825638727028238,
+ 1.8254950495049505,
+ 0.832517140058766,
+ 6.809487375669472,
+ 3.8808664259927803,
+ 1.4907921660333234,
+ 1.70416573847182,
+ 0.9868421052631579,
+ 1.1156186612576064,
+ 1.6203703703703702,
+ 0.7874015748031495,
+ 1.509433962264151,
+ 1.6917827694057437,
+ 0.9342883836810962,
+ 0.4277421326000611,
+ 0.40417649040080833,
+ 0.9838998211091234,
+ 2.1286831028262174,
+ 4.23861852433281,
+ 0.37255510710959333,
+ 0.7887323943661971,
+ 4.5478865703584805,
+ 2.9471544715447155,
+ 0.5209690023443605,
+ 0.7982704141027773,
+ 0.1910828025477707,
+ 1.2275731822474032,
+ 1.9400352733686066,
+ 4.18848167539267,
+ 0.5372733378106112,
+ 1.3888888888888888,
+ 0.5201560468140443,
+ 10.137741046831957,
+ 0.20418580908626852,
+ 2.0326678765880217,
+ 2.468601126028584,
+ 1.2903225806451613
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(202, 178, 214)"
+ },
+ "name": "CANCER",
+ "text": [
+ 61.62538699690403,
+ 77.23880597014924,
+ 83.34065934065934,
+ 93.66622864651774,
+ 67.57518796992481,
+ 31.79848320693391,
+ 68.22447806933538,
+ 41.4041404140414,
+ 65.0438946528332,
+ 87.23304388641165,
+ 96.92454026632848,
+ 55.17934964800536,
+ 78.0454421023816,
+ 95.82222222222222,
+ 76.34450506625097,
+ 54.10166079516859,
+ 88.12941444520392,
+ 68.99346405228758,
+ 76.54698242933537,
+ 30.663430420711972,
+ 56.49895178197065,
+ 84.50437662644902,
+ 62.7874071453838,
+ 82.0275693596231,
+ 38.97034321892702,
+ 36.438099695764095,
+ 11.864406779661017,
+ 90.78428880132198,
+ 82.35294117647058,
+ 77.20950449145175,
+ 62.10927573062261,
+ 88.17631084186338,
+ 57.298136645962735,
+ 17.76429809358752,
+ 70.38920398982984,
+ 79.96987951807229,
+ 34.62949376375642,
+ 85.61660561660561,
+ 72.60096930533118,
+ 34.067952249770435,
+ 88.5212830340932,
+ 75.42149096079626,
+ 76.36518771331058,
+ 84.40366972477065,
+ 98.61849096705633,
+ 87.21178066266228,
+ 48.64688620802087,
+ 92.33741146168705,
+ 89.87341772151899,
+ 35.624424670144215,
+ 81.56055167201964,
+ 72.18289085545723,
+ 70.41370664437943,
+ 70.33753305335199,
+ 35.06956831965751,
+ 26.316776007497655,
+ 51.63114397564158,
+ 62.79172170849846,
+ 15.684647302904564,
+ 55.44574026487447,
+ 94.00086318515322,
+ 93.59298928919182,
+ 88.08607021517554,
+ 38.657468824621915,
+ 27.95275590551181,
+ 59.229694671722214,
+ 65.48967355096602,
+ 89.08286206048685,
+ 71.12308194580477,
+ 89.59151610369207,
+ 57.80505679736167,
+ 52.809475660840675,
+ 68.37663779702422,
+ 69.15065277981518,
+ 92.52126464451933,
+ 23.843416370106763,
+ 73.99457749661093,
+ 85.2329221137912,
+ 80.49395161290323,
+ 78.85856079404466,
+ 81.63346613545816,
+ 81.6591704147926,
+ 92.56661991584852,
+ 65.44131028207461,
+ 63.41179212304824,
+ 72.65801354401806,
+ 52.53415601586602,
+ 88.78606423516602,
+ 64.27452655560302,
+ 82.97725706409372,
+ 54.62825278810409,
+ 60.82359488035615,
+ 75.27667109340416,
+ 72.70951993490642,
+ 86.90642458100558,
+ 72.3225806451613,
+ 59.677036333412495,
+ 79.34560327198365,
+ 34.30830039525692,
+ 93.5127674258109,
+ 70.52602282215419,
+ 85.3896103896104,
+ 82.65351860152398,
+ 75.74257425742574,
+ 50.783545543584715,
+ 55.54705432287682,
+ 64.71119133574007,
+ 94.9137679041216,
+ 82.9583426152818,
+ 87.59398496240601,
+ 31.237322515212984,
+ 84.4486531986532,
+ 91.29226493747105,
+ 94.0880503144654,
+ 80.56582314472563,
+ 71.87791965119901,
+ 63.0766880537733,
+ 43.078477601886156,
+ 86.6726296958855,
+ 88.43054720384846,
+ 72.68445839874411,
+ 85.06674945669047,
+ 70.53521126760563,
+ 69.55591225254146,
+ 74.13617886178862,
+ 90.70070330815317,
+ 90.63695326791951,
+ 96.11464968152866,
+ 64.30594900849859,
+ 84.65608465608466,
+ 90.42632759910246,
+ 75.55406312961719,
+ 82.49007936507937,
+ 68.38607137696864,
+ 23.360881542699723,
+ 94.64012251148544,
+ 79.60072595281306,
+ 85.70809874404503,
+ 48.70967741935484
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "110",
+ "112",
+ "113",
+ "114",
+ "115",
+ "120",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "139",
+ "14",
+ "143",
+ "144",
+ "147",
+ "148",
+ "150",
+ "152",
+ "154",
+ "155",
+ "158",
+ "159",
+ "161",
+ "164",
+ "165",
+ "166",
+ "168",
+ "170",
+ "175",
+ "176",
+ "180",
+ "181",
+ "186",
+ "19",
+ "20",
+ "22",
+ "23",
+ "27",
+ "28",
+ "30",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "87",
+ "88",
+ "90",
+ "91",
+ "94",
+ "99",
+ "108",
+ "135",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "167",
+ "17",
+ "172",
+ "173",
+ "21",
+ "24",
+ "47",
+ "48",
+ "49",
+ "55",
+ "56",
+ "59",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 61.62538699690403,
+ 77.23880597014924,
+ 83.34065934065934,
+ 93.66622864651774,
+ 67.57518796992481,
+ 31.79848320693391,
+ 68.22447806933538,
+ 41.4041404140414,
+ 65.0438946528332,
+ 87.23304388641165,
+ 96.92454026632848,
+ 55.17934964800536,
+ 78.0454421023816,
+ 95.82222222222222,
+ 76.34450506625097,
+ 54.10166079516859,
+ 88.12941444520392,
+ 68.99346405228758,
+ 76.54698242933537,
+ 30.663430420711972,
+ 56.49895178197065,
+ 84.50437662644902,
+ 62.7874071453838,
+ 82.0275693596231,
+ 38.97034321892702,
+ 36.438099695764095,
+ 11.864406779661017,
+ 90.78428880132198,
+ 82.35294117647058,
+ 77.20950449145175,
+ 62.10927573062261,
+ 88.17631084186338,
+ 57.298136645962735,
+ 17.76429809358752,
+ 70.38920398982984,
+ 79.96987951807229,
+ 34.62949376375642,
+ 85.61660561660561,
+ 72.60096930533118,
+ 34.067952249770435,
+ 88.5212830340932,
+ 75.42149096079626,
+ 76.36518771331058,
+ 84.40366972477065,
+ 98.61849096705633,
+ 87.21178066266228,
+ 48.64688620802087,
+ 92.33741146168705,
+ 89.87341772151899,
+ 35.624424670144215,
+ 81.56055167201964,
+ 72.18289085545723,
+ 70.41370664437943,
+ 70.33753305335199,
+ 35.06956831965751,
+ 26.316776007497655,
+ 51.63114397564158,
+ 62.79172170849846,
+ 15.684647302904564,
+ 55.44574026487447,
+ 94.00086318515322,
+ 93.59298928919182,
+ 88.08607021517554,
+ 38.657468824621915,
+ 27.95275590551181,
+ 59.229694671722214,
+ 65.48967355096602,
+ 89.08286206048685,
+ 71.12308194580477,
+ 89.59151610369207,
+ 57.80505679736167,
+ 52.809475660840675,
+ 68.37663779702422,
+ 69.15065277981518,
+ 92.52126464451933,
+ 23.843416370106763,
+ 73.99457749661093,
+ 85.2329221137912,
+ 80.49395161290323,
+ 78.85856079404466,
+ 81.63346613545816,
+ 81.6591704147926,
+ 92.56661991584852,
+ 65.44131028207461,
+ 63.41179212304824,
+ 72.65801354401806,
+ 52.53415601586602,
+ 88.78606423516602,
+ 64.27452655560302,
+ 82.97725706409372,
+ 54.62825278810409,
+ 60.82359488035615,
+ 75.27667109340416,
+ 72.70951993490642,
+ 86.90642458100558,
+ 72.3225806451613,
+ 59.677036333412495,
+ 79.34560327198365,
+ 34.30830039525692,
+ 93.5127674258109,
+ 70.52602282215419,
+ 85.3896103896104,
+ 82.65351860152398,
+ 75.74257425742574,
+ 50.783545543584715,
+ 55.54705432287682,
+ 64.71119133574007,
+ 94.9137679041216,
+ 82.9583426152818,
+ 87.59398496240601,
+ 31.237322515212984,
+ 84.4486531986532,
+ 91.29226493747105,
+ 94.0880503144654,
+ 80.56582314472563,
+ 71.87791965119901,
+ 63.0766880537733,
+ 43.078477601886156,
+ 86.6726296958855,
+ 88.43054720384846,
+ 72.68445839874411,
+ 85.06674945669047,
+ 70.53521126760563,
+ 69.55591225254146,
+ 74.13617886178862,
+ 90.70070330815317,
+ 90.63695326791951,
+ 96.11464968152866,
+ 64.30594900849859,
+ 84.65608465608466,
+ 90.42632759910246,
+ 75.55406312961719,
+ 82.49007936507937,
+ 68.38607137696864,
+ 23.360881542699723,
+ 94.64012251148544,
+ 79.60072595281306,
+ 85.70809874404503,
+ 48.70967741935484
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(106, 61, 154)"
+ },
+ "name": "αSMA_myCAF",
+ "text": [
+ 6.006191950464396,
+ 1.5991471215351813,
+ 3.5604395604395607,
+ 0.47306176084099866,
+ 0.5325814536340852,
+ 8.992416034669557,
+ 3.466768818234055,
+ 9.27092709270927,
+ 8.419792498004789,
+ 0.49284205585543295,
+ 0.15852885225110971,
+ 0.10056989607777406,
+ 6.925814399124007,
+ 0,
+ 1.3250194855806703,
+ 22.496225465525917,
+ 0.37593984962406013,
+ 0.8627450980392156,
+ 1.2605042016806722,
+ 16.50485436893204,
+ 14.884696016771489,
+ 2.389401466761296,
+ 12.203749557835161,
+ 0.17448961786773687,
+ 2.149283572142619,
+ 18.207348467119118,
+ 55.007704160246526,
+ 1.271132579128003,
+ 2.6143790849673203,
+ 9.171254708780063,
+ 11.130876747141041,
+ 2.3605598495926468,
+ 2.1960958296362025,
+ 9.272097053726169,
+ 15.822413455896733,
+ 5.779367469879518,
+ 16.654438738077772,
+ 0.2442002442002442,
+ 0.5008077544426494,
+ 10.1010101010101,
+ 0.1613879362517652,
+ 12.512695510867358,
+ 0.3412969283276451,
+ 1.7038007863695939,
+ 0,
+ 1.9182329006006589,
+ 23.214867949135964,
+ 0.7726980038634901,
+ 0.2921129503407984,
+ 23.672905799324948,
+ 0.7557150954090308,
+ 2.5958702064896757,
+ 0.25073129962390306,
+ 0.21776326022709597,
+ 25.615412058508742,
+ 19.66260543580131,
+ 17.31187472814267,
+ 3.742844561867019,
+ 0.16597510373443983,
+ 1.838307966001186,
+ 0.7768666378938283,
+ 1.8500486854917235,
+ 0.4983012457531144,
+ 0.29185460334306185,
+ 1.574803149606299,
+ 0.15964877270005987,
+ 0.9993337774816788,
+ 0.3688222276862552,
+ 7.280444009141365,
+ 0.8248232521602514,
+ 16.049835104433857,
+ 9.648996099956667,
+ 3.7530535198756385,
+ 1.3495672583247762,
+ 0.4814636494944632,
+ 21.70818505338078,
+ 2.914595571622232,
+ 7.1625851592708525,
+ 3.7298387096774195,
+ 3.854425144747725,
+ 2.8685258964143427,
+ 3.4482758620689653,
+ 0.6778868630201029,
+ 10.191082802547772,
+ 2.6800279655092054,
+ 7.900677200902935,
+ 3.239312472454826,
+ 0.7439666122300853,
+ 3.3461483696426026,
+ 1.0797151389846085,
+ 24.423791821561338,
+ 0.5564830272676683,
+ 6.219566179725542,
+ 2.196908055329536,
+ 4.504189944134078,
+ 8.580645161290322,
+ 7.1954405129422945,
+ 0,
+ 31.067193675889328,
+ 0.06901311249137336,
+ 16.587809629835792,
+ 6.8431568431568435,
+ 0.9861048857014791,
+ 0.8663366336633664,
+ 0.3428011753183154,
+ 16.985462892119358,
+ 0,
+ 0.08769365682548962,
+ 0.08910670527957229,
+ 0,
+ 49.59432048681541,
+ 6.228956228956229,
+ 0.18527095877721167,
+ 0.8805031446540881,
+ 3.4119988626670454,
+ 13.79632513235752,
+ 21.387106630003057,
+ 5.4563826204109125,
+ 0.5366726296958855,
+ 1.2988574864702345,
+ 1.4128728414442702,
+ 7.295870847562869,
+ 17.464788732394364,
+ 6.046013911182451,
+ 0.1524390243902439,
+ 5.183641573326387,
+ 4.656577415599535,
+ 0.7006369426751593,
+ 24.45703493862134,
+ 9.347442680776014,
+ 1.2341062079281975,
+ 7.118871725990597,
+ 9.1765873015873,
+ 0.9680681982372489,
+ 7.7134986225895315,
+ 0.05104645227156713,
+ 1.0163339382940109,
+ 4.634040710264184,
+ 29.354838709677416
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "110",
+ "112",
+ "113",
+ "114",
+ "115",
+ "120",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "139",
+ "14",
+ "143",
+ "144",
+ "147",
+ "148",
+ "150",
+ "152",
+ "154",
+ "155",
+ "158",
+ "159",
+ "161",
+ "164",
+ "165",
+ "166",
+ "168",
+ "170",
+ "175",
+ "176",
+ "180",
+ "181",
+ "186",
+ "19",
+ "20",
+ "22",
+ "23",
+ "27",
+ "28",
+ "30",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "87",
+ "88",
+ "90",
+ "91",
+ "94",
+ "99",
+ "108",
+ "135",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "167",
+ "17",
+ "172",
+ "173",
+ "21",
+ "24",
+ "47",
+ "48",
+ "49",
+ "55",
+ "56",
+ "59",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 6.006191950464396,
+ 1.5991471215351813,
+ 3.5604395604395607,
+ 0.47306176084099866,
+ 0.5325814536340852,
+ 8.992416034669557,
+ 3.466768818234055,
+ 9.27092709270927,
+ 8.419792498004789,
+ 0.49284205585543295,
+ 0.15852885225110971,
+ 0.10056989607777406,
+ 6.925814399124007,
+ 0,
+ 1.3250194855806703,
+ 22.496225465525917,
+ 0.37593984962406013,
+ 0.8627450980392156,
+ 1.2605042016806722,
+ 16.50485436893204,
+ 14.884696016771489,
+ 2.389401466761296,
+ 12.203749557835161,
+ 0.17448961786773687,
+ 2.149283572142619,
+ 18.207348467119118,
+ 55.007704160246526,
+ 1.271132579128003,
+ 2.6143790849673203,
+ 9.171254708780063,
+ 11.130876747141041,
+ 2.3605598495926468,
+ 2.1960958296362025,
+ 9.272097053726169,
+ 15.822413455896733,
+ 5.779367469879518,
+ 16.654438738077772,
+ 0.2442002442002442,
+ 0.5008077544426494,
+ 10.1010101010101,
+ 0.1613879362517652,
+ 12.512695510867358,
+ 0.3412969283276451,
+ 1.7038007863695939,
+ 0,
+ 1.9182329006006589,
+ 23.214867949135964,
+ 0.7726980038634901,
+ 0.2921129503407984,
+ 23.672905799324948,
+ 0.7557150954090308,
+ 2.5958702064896757,
+ 0.25073129962390306,
+ 0.21776326022709597,
+ 25.615412058508742,
+ 19.66260543580131,
+ 17.31187472814267,
+ 3.742844561867019,
+ 0.16597510373443983,
+ 1.838307966001186,
+ 0.7768666378938283,
+ 1.8500486854917235,
+ 0.4983012457531144,
+ 0.29185460334306185,
+ 1.574803149606299,
+ 0.15964877270005987,
+ 0.9993337774816788,
+ 0.3688222276862552,
+ 7.280444009141365,
+ 0.8248232521602514,
+ 16.049835104433857,
+ 9.648996099956667,
+ 3.7530535198756385,
+ 1.3495672583247762,
+ 0.4814636494944632,
+ 21.70818505338078,
+ 2.914595571622232,
+ 7.1625851592708525,
+ 3.7298387096774195,
+ 3.854425144747725,
+ 2.8685258964143427,
+ 3.4482758620689653,
+ 0.6778868630201029,
+ 10.191082802547772,
+ 2.6800279655092054,
+ 7.900677200902935,
+ 3.239312472454826,
+ 0.7439666122300853,
+ 3.3461483696426026,
+ 1.0797151389846085,
+ 24.423791821561338,
+ 0.5564830272676683,
+ 6.219566179725542,
+ 2.196908055329536,
+ 4.504189944134078,
+ 8.580645161290322,
+ 7.1954405129422945,
+ 0,
+ 31.067193675889328,
+ 0.06901311249137336,
+ 16.587809629835792,
+ 6.8431568431568435,
+ 0.9861048857014791,
+ 0.8663366336633664,
+ 0.3428011753183154,
+ 16.985462892119358,
+ 0,
+ 0.08769365682548962,
+ 0.08910670527957229,
+ 0,
+ 49.59432048681541,
+ 6.228956228956229,
+ 0.18527095877721167,
+ 0.8805031446540881,
+ 3.4119988626670454,
+ 13.79632513235752,
+ 21.387106630003057,
+ 5.4563826204109125,
+ 0.5366726296958855,
+ 1.2988574864702345,
+ 1.4128728414442702,
+ 7.295870847562869,
+ 17.464788732394364,
+ 6.046013911182451,
+ 0.1524390243902439,
+ 5.183641573326387,
+ 4.656577415599535,
+ 0.7006369426751593,
+ 24.45703493862134,
+ 9.347442680776014,
+ 1.2341062079281975,
+ 7.118871725990597,
+ 9.1765873015873,
+ 0.9680681982372489,
+ 7.7134986225895315,
+ 0.05104645227156713,
+ 1.0163339382940109,
+ 4.634040710264184,
+ 29.354838709677416
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(1.0, 1.0, 0.6)"
+ },
+ "name": "STROMA_OTHER",
+ "text": [
+ 8.204334365325078,
+ 3.8912579957356077,
+ 7.604395604395604,
+ 2.3915900131406045,
+ 4.1040100250626566,
+ 47.724810400866744,
+ 18.904424439762497,
+ 7.110711071107111,
+ 15.283320031923383,
+ 3.9427364468434636,
+ 0.6024096385542169,
+ 18.739523969158565,
+ 4.51683547768957,
+ 1.1111111111111112,
+ 10.366328916601715,
+ 13.38701560140916,
+ 3.30371383002962,
+ 4.4183006535947715,
+ 9.511077158135981,
+ 29.773462783171524,
+ 15.40880503144654,
+ 8.493021055121835,
+ 7.7467279801910145,
+ 8.131216192636538,
+ 23.60879706764412,
+ 39.316639363444885,
+ 24.65331278890601,
+ 4.004067624253209,
+ 0.4357298474945534,
+ 9.330628803245435,
+ 22.13468869123253,
+ 5.765615207854606,
+ 12.999112688553682,
+ 60.65857885615251,
+ 3.2270682573831406,
+ 10.466867469879517,
+ 45.8547322083639,
+ 6.349206349206349,
+ 13.021001615508885,
+ 14.784205693296604,
+ 1.9164817429897114,
+ 6.581352833638025,
+ 9.556313993174061,
+ 9.305373525557012,
+ 0.10626992561105207,
+ 6.878511916295292,
+ 15.128790348875123,
+ 4.443013522215067,
+ 1.557935735150925,
+ 16.49278919914084,
+ 12.091441526544493,
+ 4.808259587020649,
+ 2.632678646050982,
+ 26.52045419194276,
+ 32.28683553335712,
+ 25.43580131208997,
+ 11.43975641583297,
+ 1.9815059445178336,
+ 0.16597510373443983,
+ 4.605653291164262,
+ 0.49633146309883475,
+ 1.6942551119766307,
+ 3.2842582106455263,
+ 11.223136110374105,
+ 3.149606299212598,
+ 5.807224106964678,
+ 24.117255163224517,
+ 7.892795672485862,
+ 11.68788769180542,
+ 6.009426551453259,
+ 12.678636863319898,
+ 30.680340892676583,
+ 20.00888296691095,
+ 5.867683731846853,
+ 3.1134649333975286,
+ 16.90391459074733,
+ 13.985539990962495,
+ 1.067943288528816,
+ 6.628024193548388,
+ 3.6228287841191067,
+ 6.414342629482071,
+ 5.072463768115942,
+ 4.417952314165498,
+ 13.757961783439491,
+ 3.0062922395711955,
+ 8.154627539503386,
+ 7.073600705156456,
+ 3.411359099981855,
+ 18.4251744268831,
+ 3.3769813921433496,
+ 5.037174721189591,
+ 0.5008347245409015,
+ 12.107127047366092,
+ 10.398698128559806,
+ 4.888268156424581,
+ 8.193548387096774,
+ 8.287817620517691,
+ 2.8629856850715747,
+ 21.027667984189723,
+ 5.106970324361629,
+ 3.9521291399944336,
+ 2.5474525474525476,
+ 9.816225907664725,
+ 9.498762376237623,
+ 44.0254652301665,
+ 19.204284621270084,
+ 1.7148014440433215,
+ 0.233849751534639,
+ 7.329026509244821,
+ 7.471804511278196,
+ 16.227180527383368,
+ 6.123737373737374,
+ 0.2779064381658175,
+ 2.515723270440252,
+ 11.415979528006824,
+ 11.398318280909374,
+ 8.218759547815461,
+ 49.882115190299764,
+ 2.5044722719141324,
+ 3.2471437161755863,
+ 12.71585557299843,
+ 5.867742936976095,
+ 4.563380281690141,
+ 1.5516318887105405,
+ 14.329268292682926,
+ 1.8233915082052619,
+ 0.6485947114585066,
+ 1.9745222929936306,
+ 6.326723323890462,
+ 0.7936507936507936,
+ 1.5706806282722512,
+ 12.088650100738752,
+ 4.761904761904762,
+ 18.971246929634447,
+ 1.2121212121212122,
+ 0.8167432363450741,
+ 5.916515426497278,
+ 0.043308791684711995,
+ 6.451612903225806
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "110",
+ "112",
+ "113",
+ "114",
+ "115",
+ "120",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "139",
+ "14",
+ "143",
+ "144",
+ "147",
+ "148",
+ "150",
+ "152",
+ "154",
+ "155",
+ "158",
+ "159",
+ "161",
+ "164",
+ "165",
+ "166",
+ "168",
+ "170",
+ "175",
+ "176",
+ "180",
+ "181",
+ "186",
+ "19",
+ "20",
+ "22",
+ "23",
+ "27",
+ "28",
+ "30",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "87",
+ "88",
+ "90",
+ "91",
+ "94",
+ "99",
+ "108",
+ "135",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "167",
+ "17",
+ "172",
+ "173",
+ "21",
+ "24",
+ "47",
+ "48",
+ "49",
+ "55",
+ "56",
+ "59",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 8.204334365325078,
+ 3.8912579957356077,
+ 7.604395604395604,
+ 2.3915900131406045,
+ 4.1040100250626566,
+ 47.724810400866744,
+ 18.904424439762497,
+ 7.110711071107111,
+ 15.283320031923383,
+ 3.9427364468434636,
+ 0.6024096385542169,
+ 18.739523969158565,
+ 4.51683547768957,
+ 1.1111111111111112,
+ 10.366328916601715,
+ 13.38701560140916,
+ 3.30371383002962,
+ 4.4183006535947715,
+ 9.511077158135981,
+ 29.773462783171524,
+ 15.40880503144654,
+ 8.493021055121835,
+ 7.7467279801910145,
+ 8.131216192636538,
+ 23.60879706764412,
+ 39.316639363444885,
+ 24.65331278890601,
+ 4.004067624253209,
+ 0.4357298474945534,
+ 9.330628803245435,
+ 22.13468869123253,
+ 5.765615207854606,
+ 12.999112688553682,
+ 60.65857885615251,
+ 3.2270682573831406,
+ 10.466867469879517,
+ 45.8547322083639,
+ 6.349206349206349,
+ 13.021001615508885,
+ 14.784205693296604,
+ 1.9164817429897114,
+ 6.581352833638025,
+ 9.556313993174061,
+ 9.305373525557012,
+ 0.10626992561105207,
+ 6.878511916295292,
+ 15.128790348875123,
+ 4.443013522215067,
+ 1.557935735150925,
+ 16.49278919914084,
+ 12.091441526544493,
+ 4.808259587020649,
+ 2.632678646050982,
+ 26.52045419194276,
+ 32.28683553335712,
+ 25.43580131208997,
+ 11.43975641583297,
+ 1.9815059445178336,
+ 0.16597510373443983,
+ 4.605653291164262,
+ 0.49633146309883475,
+ 1.6942551119766307,
+ 3.2842582106455263,
+ 11.223136110374105,
+ 3.149606299212598,
+ 5.807224106964678,
+ 24.117255163224517,
+ 7.892795672485862,
+ 11.68788769180542,
+ 6.009426551453259,
+ 12.678636863319898,
+ 30.680340892676583,
+ 20.00888296691095,
+ 5.867683731846853,
+ 3.1134649333975286,
+ 16.90391459074733,
+ 13.985539990962495,
+ 1.067943288528816,
+ 6.628024193548388,
+ 3.6228287841191067,
+ 6.414342629482071,
+ 5.072463768115942,
+ 4.417952314165498,
+ 13.757961783439491,
+ 3.0062922395711955,
+ 8.154627539503386,
+ 7.073600705156456,
+ 3.411359099981855,
+ 18.4251744268831,
+ 3.3769813921433496,
+ 5.037174721189591,
+ 0.5008347245409015,
+ 12.107127047366092,
+ 10.398698128559806,
+ 4.888268156424581,
+ 8.193548387096774,
+ 8.287817620517691,
+ 2.8629856850715747,
+ 21.027667984189723,
+ 5.106970324361629,
+ 3.9521291399944336,
+ 2.5474525474525476,
+ 9.816225907664725,
+ 9.498762376237623,
+ 44.0254652301665,
+ 19.204284621270084,
+ 1.7148014440433215,
+ 0.233849751534639,
+ 7.329026509244821,
+ 7.471804511278196,
+ 16.227180527383368,
+ 6.123737373737374,
+ 0.2779064381658175,
+ 2.515723270440252,
+ 11.415979528006824,
+ 11.398318280909374,
+ 8.218759547815461,
+ 49.882115190299764,
+ 2.5044722719141324,
+ 3.2471437161755863,
+ 12.71585557299843,
+ 5.867742936976095,
+ 4.563380281690141,
+ 1.5516318887105405,
+ 14.329268292682926,
+ 1.8233915082052619,
+ 0.6485947114585066,
+ 1.9745222929936306,
+ 6.326723323890462,
+ 0.7936507936507936,
+ 1.5706806282722512,
+ 12.088650100738752,
+ 4.761904761904762,
+ 18.971246929634447,
+ 1.2121212121212122,
+ 0.8167432363450741,
+ 5.916515426497278,
+ 0.043308791684711995,
+ 6.451612903225806
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(177, 89, 40)"
+ },
+ "name": "ENDOTHELIAL",
+ "text": [
+ 5.185758513931889,
+ 6.982942430703624,
+ 2.6373626373626373,
+ 0.4204993429697766,
+ 3.6654135338345863,
+ 1.895991332611051,
+ 3.6966098448573073,
+ 1.17011701170117,
+ 2.3543495610534717,
+ 1.7836188688101384,
+ 0.7609384908053266,
+ 1.6761649346295675,
+ 2.8469750889679712,
+ 0.4,
+ 1.2860483242400622,
+ 5.8379466532460995,
+ 2.4948735475051267,
+ 2.1176470588235294,
+ 4.507257448433919,
+ 10.194174757281553,
+ 3.2494758909853245,
+ 1.20652945351313,
+ 1.910152104704634,
+ 3.2804048159134536,
+ 5.1649450183272245,
+ 3.3934004212497073,
+ 4.468412942989214,
+ 0.7245455701029617,
+ 1.0021786492374727,
+ 1.303969863807592,
+ 0.3303684879288437,
+ 1.2325047002297889,
+ 16.65927240461402,
+ 4.679376083188909,
+ 2.0731468805006847,
+ 1.1859939759036144,
+ 1.834189288334556,
+ 1.0256410256410255,
+ 1.1308562197092082,
+ 0.7346189164370982,
+ 0.746419205164414,
+ 2.701604712573634,
+ 5.2047781569965865,
+ 2.0969855832241153,
+ 0.10626992561105207,
+ 2.1313698895562876,
+ 1.793283338767525,
+ 0.38634900193174504,
+ 1.1684518013631937,
+ 3.4980055231666154,
+ 1.7759304742112223,
+ 1.710914454277286,
+ 1.2954450480568325,
+ 1.9132057862809144,
+ 1.9978594363182305,
+ 5.660731021555764,
+ 13.571117877337974,
+ 0.26420079260237783,
+ 2.0746887966804977,
+ 0.98833761612967,
+ 1.5753129046180405,
+ 0.9737098344693282,
+ 0.6115515288788221,
+ 2.255240116741841,
+ 2.3622047244094486,
+ 3.2727998403512273,
+ 4.663557628247834,
+ 0.7376444553725104,
+ 3.493307215148547,
+ 0.432050274941084,
+ 8.061561011359473,
+ 2.0078000866676295,
+ 1.1547856984232734,
+ 1.877658794190993,
+ 0.9950248756218906,
+ 26.156583629893237,
+ 1.8978761861726163,
+ 1.325722703001289,
+ 1.4616935483870968,
+ 1.4392059553349876,
+ 0.796812749003984,
+ 0.6746626686656672,
+ 1.496026180458158,
+ 3.0391264786169248,
+ 2.307154509438359,
+ 2.2573363431151243,
+ 1.8730718378140152,
+ 1.1431682090364725,
+ 3.1895201480848643,
+ 1.8837583275901677,
+ 3.141263940520446,
+ 0.5008347245409015,
+ 2.6781761841522798,
+ 2.9617575264442633,
+ 1.3966480446927374,
+ 1.3548387096774193,
+ 3.2771313227261936,
+ 0,
+ 2.6877470355731226,
+ 0.4830917874396135,
+ 1.5585861397161147,
+ 2.647352647352647,
+ 1.9273868220528911,
+ 4.672029702970297,
+ 3.232125367286973,
+ 0.6885998469778117,
+ 1.5342960288808665,
+ 1.140017538731365,
+ 4.265983515259523,
+ 0.7518796992481203,
+ 0.7099391480730223,
+ 0.8838383838383838,
+ 4.678091709124595,
+ 0.37735849056603776,
+ 1.6491327836224055,
+ 1.5882902522578637,
+ 2.9483654139932782,
+ 1.1451667228022904,
+ 0.7155635062611807,
+ 0.9861695730607337,
+ 1.2558869701726845,
+ 0.5898789195901893,
+ 2.535211267605634,
+ 7.009095773140716,
+ 2.0325203252032518,
+ 1.3805678562125552,
+ 1.3470813237984367,
+ 0.3184713375796179,
+ 2.927289896128423,
+ 1.8518518518518516,
+ 0.48616305160807777,
+ 1.6789791806581598,
+ 2.083333333333333,
+ 3.22207773443144,
+ 0.8264462809917356,
+ 0.1531393568147014,
+ 3.7023593466424685,
+ 1.3858813339107838,
+ 0.967741935483871
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "10",
+ "100",
+ "101",
+ "102",
+ "103",
+ "105",
+ "106",
+ "109",
+ "110",
+ "112",
+ "113",
+ "114",
+ "115",
+ "120",
+ "122",
+ "123",
+ "124",
+ "125",
+ "126",
+ "127",
+ "128",
+ "129",
+ "131",
+ "132",
+ "133",
+ "134",
+ "139",
+ "14",
+ "143",
+ "144",
+ "147",
+ "148",
+ "150",
+ "152",
+ "154",
+ "155",
+ "158",
+ "159",
+ "161",
+ "164",
+ "165",
+ "166",
+ "168",
+ "170",
+ "175",
+ "176",
+ "180",
+ "181",
+ "186",
+ "19",
+ "20",
+ "22",
+ "23",
+ "27",
+ "28",
+ "30",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "4",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "50",
+ "52",
+ "53",
+ "54",
+ "57",
+ "58",
+ "6",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "70",
+ "71",
+ "73",
+ "75",
+ "8",
+ "80",
+ "81",
+ "82",
+ "83",
+ "87",
+ "88",
+ "90",
+ "91",
+ "94",
+ "99",
+ "108",
+ "135",
+ "185",
+ "25",
+ "29",
+ "3",
+ "79",
+ "107",
+ "117",
+ "12",
+ "13",
+ "130",
+ "136",
+ "142",
+ "156",
+ "16",
+ "167",
+ "17",
+ "172",
+ "173",
+ "21",
+ "24",
+ "47",
+ "48",
+ "49",
+ "55",
+ "56",
+ "59",
+ "72",
+ "74",
+ "77",
+ "78",
+ "84",
+ "86",
+ "9",
+ "92",
+ "96",
+ "97",
+ "60",
+ "62"
+ ],
+ "y": [
+ 5.185758513931889,
+ 6.982942430703624,
+ 2.6373626373626373,
+ 0.4204993429697766,
+ 3.6654135338345863,
+ 1.895991332611051,
+ 3.6966098448573073,
+ 1.17011701170117,
+ 2.3543495610534717,
+ 1.7836188688101384,
+ 0.7609384908053266,
+ 1.6761649346295675,
+ 2.8469750889679712,
+ 0.4,
+ 1.2860483242400622,
+ 5.8379466532460995,
+ 2.4948735475051267,
+ 2.1176470588235294,
+ 4.507257448433919,
+ 10.194174757281553,
+ 3.2494758909853245,
+ 1.20652945351313,
+ 1.910152104704634,
+ 3.2804048159134536,
+ 5.1649450183272245,
+ 3.3934004212497073,
+ 4.468412942989214,
+ 0.7245455701029617,
+ 1.0021786492374727,
+ 1.303969863807592,
+ 0.3303684879288437,
+ 1.2325047002297889,
+ 16.65927240461402,
+ 4.679376083188909,
+ 2.0731468805006847,
+ 1.1859939759036144,
+ 1.834189288334556,
+ 1.0256410256410255,
+ 1.1308562197092082,
+ 0.7346189164370982,
+ 0.746419205164414,
+ 2.701604712573634,
+ 5.2047781569965865,
+ 2.0969855832241153,
+ 0.10626992561105207,
+ 2.1313698895562876,
+ 1.793283338767525,
+ 0.38634900193174504,
+ 1.1684518013631937,
+ 3.4980055231666154,
+ 1.7759304742112223,
+ 1.710914454277286,
+ 1.2954450480568325,
+ 1.9132057862809144,
+ 1.9978594363182305,
+ 5.660731021555764,
+ 13.571117877337974,
+ 0.26420079260237783,
+ 2.0746887966804977,
+ 0.98833761612967,
+ 1.5753129046180405,
+ 0.9737098344693282,
+ 0.6115515288788221,
+ 2.255240116741841,
+ 2.3622047244094486,
+ 3.2727998403512273,
+ 4.663557628247834,
+ 0.7376444553725104,
+ 3.493307215148547,
+ 0.432050274941084,
+ 8.061561011359473,
+ 2.0078000866676295,
+ 1.1547856984232734,
+ 1.877658794190993,
+ 0.9950248756218906,
+ 26.156583629893237,
+ 1.8978761861726163,
+ 1.325722703001289,
+ 1.4616935483870968,
+ 1.4392059553349876,
+ 0.796812749003984,
+ 0.6746626686656672,
+ 1.496026180458158,
+ 3.0391264786169248,
+ 2.307154509438359,
+ 2.2573363431151243,
+ 1.8730718378140152,
+ 1.1431682090364725,
+ 3.1895201480848643,
+ 1.8837583275901677,
+ 3.141263940520446,
+ 0.5008347245409015,
+ 2.6781761841522798,
+ 2.9617575264442633,
+ 1.3966480446927374,
+ 1.3548387096774193,
+ 3.2771313227261936,
+ 0,
+ 2.6877470355731226,
+ 0.4830917874396135,
+ 1.5585861397161147,
+ 2.647352647352647,
+ 1.9273868220528911,
+ 4.672029702970297,
+ 3.232125367286973,
+ 0.6885998469778117,
+ 1.5342960288808665,
+ 1.140017538731365,
+ 4.265983515259523,
+ 0.7518796992481203,
+ 0.7099391480730223,
+ 0.8838383838383838,
+ 4.678091709124595,
+ 0.37735849056603776,
+ 1.6491327836224055,
+ 1.5882902522578637,
+ 2.9483654139932782,
+ 1.1451667228022904,
+ 0.7155635062611807,
+ 0.9861695730607337,
+ 1.2558869701726845,
+ 0.5898789195901893,
+ 2.535211267605634,
+ 7.009095773140716,
+ 2.0325203252032518,
+ 1.3805678562125552,
+ 1.3470813237984367,
+ 0.3184713375796179,
+ 2.927289896128423,
+ 1.8518518518518516,
+ 0.48616305160807777,
+ 1.6789791806581598,
+ 2.083333333333333,
+ 3.22207773443144,
+ 0.8264462809917356,
+ 0.1531393568147014,
+ 3.7023593466424685,
+ 1.3858813339107838,
+ 0.967741935483871
+ ]
+ }
+ ],
+ "layout": {
+ "barmode": "stack",
+ "plot_bgcolor": "white",
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "Cell subtypes proportions by Patient and tissue type - ACT group"
+ },
+ "xaxis": {
+ "autorange": true,
+ "linecolor": "black",
+ "range": [
+ -0.5,
+ 138.5
+ ],
+ "type": "category"
+ },
+ "yaxis": {
+ "autorange": true,
+ "linecolor": "black",
+ "range": [
+ 0,
+ 105.26315789473688
+ ],
+ "title": {
+ "text": "Cell count (%)"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 66,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "fig = go.Figure()\n",
+ "title = 'Cell subtypes proportions by Patient and tissue type - ACT group'\n",
+ "\n",
+ "for cell_subtype in cell_subtypes:\n",
+ " fig.add_trace(\n",
+ " go.Bar(\n",
+ " name=cell_subtype,\n",
+ " x=counts_perc_patients['Patient'],\n",
+ " y=counts_perc_patients[f'{cell_subtype.lower()}_perc'],\n",
+ " text=counts_perc_patients[f'{cell_subtype.lower()}_perc'],\n",
+ " textposition='auto',\n",
+ " marker_color='rgb' + str(cell_subtype_color_dict[cell_subtype])))\n",
+ "\n",
+ "fig.update_layout(\n",
+ " plot_bgcolor='white',\n",
+ " barmode='stack',\n",
+ " title=title,\n",
+ " xaxis=dict(linecolor='black'),\n",
+ " yaxis=dict(title='Cell count (%)', linecolor='black'))\n",
+ "\n",
+ "output_filename = title.replace(\" \", \"_\") + \".png\"\n",
+ "#fig.write_image(output_images_dir + \"/\" + output_filename, scale=1000)\n",
+ "\n",
+ "fig.show()\n",
+ "plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7599e22c-8a7b-4c97-915d-203fd83a899a",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "58d1fe75-c053-4b11-97f9-1e707e79b7c0",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 67,
+ "id": "736dd86d-e585-487f-8a67-9c61de47ca32",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Statistique de test de Mann-Whitney : 2845.0\n",
+ "P-value associƩe : 0.44739619874878456\n",
+ "Il n'y a pas de diffƩrence statistiquement significative entre les groupes.\n"
+ ]
+ }
+ ],
+ "source": [
+ "from scipy.stats import mannwhitneyu\n",
+ "\n",
+ "\n",
+ "# Choisissez la colonne sur laquelle vous voulez effectuer la comparaison\n",
+ "column_to_compare = 'm2'\n",
+ "\n",
+ "# Effectuez le test de Mann-Whitney\n",
+ "statistic, p_value = mannwhitneyu(counts_perc_patients_NACT[column_to_compare], counts_perc_patients_ACT[column_to_compare])\n",
+ "\n",
+ "# Affichez les rƩsultats\n",
+ "print(\"Statistique de test de Mann-Whitney :\", statistic)\n",
+ "print(\"P-value associƩe :\", p_value)\n",
+ "\n",
+ "# InterprƩtez les rƩsultats\n",
+ "alpha = 0.05\n",
+ "if p_value < alpha:\n",
+ " print(\"La diffƩrence entre les groupes est statistiquement significative.\")\n",
+ "else:\n",
+ " print(\"Il n'y a pas de diffƩrence statistiquement significative entre les groupes.\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "id": "fed49f2c-d2ea-450a-a7a1-c47acc8f5ebf",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "box": {
+ "visible": true
+ },
+ "meanline": {
+ "visible": true
+ },
+ "name": "NACT",
+ "type": "violin",
+ "y": [
+ 0,
+ 3,
+ 0,
+ 0,
+ 0,
+ 1,
+ 38,
+ 1,
+ 2,
+ 3,
+ 1,
+ 14,
+ 7,
+ 0,
+ 0,
+ 0,
+ 0,
+ 3,
+ 1,
+ 11,
+ 8,
+ 0,
+ 15,
+ 6,
+ 0,
+ 16,
+ 8,
+ 44,
+ 70,
+ 2,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 19
+ ]
+ },
+ {
+ "box": {
+ "visible": true
+ },
+ "meanline": {
+ "visible": true
+ },
+ "name": "ACT",
+ "type": "violin",
+ "y": [
+ 100,
+ 3,
+ 1,
+ 1,
+ 0,
+ 3,
+ 0,
+ 16,
+ 3,
+ 0,
+ 2,
+ 0,
+ 3,
+ 1,
+ 1,
+ 0,
+ 3,
+ 3,
+ 1,
+ 0,
+ 0,
+ 0,
+ 1,
+ 2,
+ 3,
+ 0,
+ 4,
+ 1,
+ 2,
+ 0,
+ 0,
+ 2,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 5,
+ 0,
+ 2,
+ 0,
+ 4,
+ 5,
+ 0,
+ 0,
+ 67,
+ 0,
+ 5,
+ 0,
+ 0,
+ 1,
+ 3,
+ 2,
+ 0,
+ 0,
+ 1,
+ 2,
+ 13,
+ 0,
+ 0,
+ 4,
+ 0,
+ 4,
+ 0,
+ 12,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 1,
+ 0,
+ 2,
+ 0,
+ 0,
+ 5,
+ 1,
+ 0,
+ 31,
+ 0,
+ 5,
+ 0,
+ 2,
+ 32,
+ 16,
+ 17,
+ 4,
+ 0,
+ 8,
+ 52,
+ 8,
+ 1,
+ 31,
+ 3,
+ 13,
+ 22,
+ 0,
+ 5,
+ 0,
+ 0,
+ 2,
+ 2,
+ 3,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 1,
+ 3,
+ 0,
+ 0,
+ 0,
+ 3,
+ 1,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 7,
+ 0,
+ 6,
+ 1,
+ 4,
+ 0,
+ 1,
+ 1,
+ 0,
+ 1,
+ 25,
+ 1,
+ 0,
+ 16,
+ 15
+ ]
+ }
+ ],
+ "layout": {
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "Comparaison de la distribution de 'm2' entre les groupes NACT et ACT"
+ },
+ "xaxis": {
+ "autorange": true,
+ "range": [
+ -0.5,
+ 1.5
+ ],
+ "title": {
+ "text": "Groupe"
+ },
+ "type": "category"
+ },
+ "yaxis": {
+ "autorange": true,
+ "range": [
+ -12.07180287434527,
+ 108.00377909864974
+ ],
+ "title": {
+ "text": "Valeurs de 'm2'"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 68,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import plotly.graph_objs as go\n",
+ "\n",
+ "# Données à comparer\n",
+ "data1 = counts_perc_patients_NACT[column_to_compare]\n",
+ "data2 = counts_perc_patients_ACT[column_to_compare]\n",
+ "\n",
+ "# CrƩer un graphique boxplot\n",
+ "fig = go.Figure()\n",
+ "\n",
+ "# Ajouter les donnƩes de chaque groupe au graphique\n",
+ "fig.add_trace(go.Violin(y=data1, name='NACT', box_visible=True, meanline_visible=True))\n",
+ "fig.add_trace(go.Violin(y=data2, name='ACT', box_visible=True, meanline_visible=True))\n",
+ "\n",
+ "# Mettre en forme le titre et les axes\n",
+ "fig.update_layout(\n",
+ " title=\"Comparaison de la distribution de '{}' entre les groupes NACT et ACT\".format(column_to_compare),\n",
+ " xaxis_title=\"Groupe\",\n",
+ " yaxis_title=\"Valeurs de '{}'\".format(column_to_compare)\n",
+ ")\n",
+ "\n",
+ "# Afficher le graphique\n",
+ "fig.show()\n",
+ "\n",
+ "plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c2c60153-a937-472b-b427-fb27ebca41c7",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4c2baa6b-beff-4c73-a09e-c44b1fc7a75d",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "raw",
+ "id": "ad91909f-ece5-4aef-aac2-3b21a056b531",
+ "metadata": {},
+ "source": [
+ "Regarder les proportion d'immune checkpoint par patientes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 69,
+ "id": "4499f228-c73e-47f3-a086-30ed17518e42",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Patient immune_checkpoint\n",
+ "104 None 2461\n",
+ " PDL1 20\n",
+ " PD1 10\n",
+ "11 None 6138\n",
+ " PDL1 50\n",
+ " ... \n",
+ "95 B7H4_PDL1 1\n",
+ "98 None 2901\n",
+ " B7H4 487\n",
+ " PDL1 321\n",
+ " PD1 1\n",
+ "Name: immune_checkpoint, Length: 155, dtype: int64\n",
+ "Patient immune_checkpoint\n",
+ "10 None 6427\n",
+ " B7H4 23\n",
+ " PD1 5\n",
+ " PDL1 4\n",
+ " B7H4_PD1 1\n",
+ " ... \n",
+ "97 B7H4 2\n",
+ "99 None 1064\n",
+ " B7H4 182\n",
+ " PD1 13\n",
+ " PDL1 6\n",
+ "Name: immune_checkpoint, Length: 583, dtype: int64\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Compter le nombre d'occurrences des checkpoints immunitaires par patiente\n",
+ "occurrences_checkpoint_NACT = df_NACT.groupby('Patient')['immune_checkpoint'].value_counts()\n",
+ "occurrences_checkpoint_ACT = df_ACT.groupby('Patient')['immune_checkpoint'].value_counts()\n",
+ "\n",
+ "# Afficher le rƩsultat\n",
+ "print(occurrences_checkpoint_NACT)\n",
+ "print(occurrences_checkpoint_ACT)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 70,
+ "id": "e0956b08-eb10-4f0b-94b7-1993184a6051",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Statistique de test de chi-deux : 609887.0\n",
+ "P-valeur associƩe : 0.0\n",
+ "Il y a une diffƩrence statistiquement significative entre les distributions des checkpoints immunitaires dans les deux groupes.\n"
+ ]
+ }
+ ],
+ "source": [
+ "from scipy.stats import chi2_contingency\n",
+ "\n",
+ "# Créer un tableau de contingence à partir des occurrences de checkpoints immunitaires dans chaque tableau\n",
+ "contingency_table = pd.concat([occurrences_checkpoint_NACT, occurrences_checkpoint_ACT], axis=1, keys=['NACT', 'ACT'], sort=False).fillna(0)\n",
+ "\n",
+ "# Effectuer le test de chi-deux\n",
+ "chi2_stat, p_val, _, _ = chi2_contingency(contingency_table)\n",
+ "\n",
+ "# Afficher les rƩsultats\n",
+ "print(\"Statistique de test de chi-deux :\", chi2_stat)\n",
+ "print(\"P-valeur associƩe :\", p_val)\n",
+ "\n",
+ "# InterprƩter les rƩsultats\n",
+ "alpha = 0.05\n",
+ "if p_val < alpha:\n",
+ " print(\"Il y a une diffƩrence statistiquement significative entre les distributions des checkpoints immunitaires dans les deux groupes.\")\n",
+ "else:\n",
+ " print(\"Il n'y a pas de diffƩrence statistiquement significative entre les distributions des checkpoints immunitaires dans les deux groupes.\")\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 71,
+ "id": "337ec728-0e6a-40ae-b9b8-2decc402a95c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " NACT \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " Patient \n",
+ " immune_checkpoint \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 104 \n",
+ " None \n",
+ " 64.763158 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " PDL1 \n",
+ " 0.526316 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " PD1 \n",
+ " 0.263158 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " None \n",
+ " 161.526316 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " PDL1 \n",
+ " 1.315789 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 97 \n",
+ " B7H4 \n",
+ " 0.000000 \n",
+ " 0.014388 \n",
+ " \n",
+ " \n",
+ " 99 \n",
+ " None \n",
+ " 0.000000 \n",
+ " 7.654676 \n",
+ " \n",
+ " \n",
+ " B7H4 \n",
+ " 0.000000 \n",
+ " 1.309353 \n",
+ " \n",
+ " \n",
+ " PD1 \n",
+ " 0.000000 \n",
+ " 0.093525 \n",
+ " \n",
+ " \n",
+ " PDL1 \n",
+ " 0.000000 \n",
+ " 0.043165 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
738 rows Ć 2 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " NACT ACT\n",
+ "Patient immune_checkpoint \n",
+ "104 None 64.763158 0.000000\n",
+ " PDL1 0.526316 0.000000\n",
+ " PD1 0.263158 0.000000\n",
+ "11 None 161.526316 0.000000\n",
+ " PDL1 1.315789 0.000000\n",
+ "... ... ...\n",
+ "97 B7H4 0.000000 0.014388\n",
+ "99 None 0.000000 7.654676\n",
+ " B7H4 0.000000 1.309353\n",
+ " PD1 0.000000 0.093525\n",
+ " PDL1 0.000000 0.043165\n",
+ "\n",
+ "[738 rows x 2 columns]"
+ ]
+ },
+ "execution_count": 71,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import plotly.graph_objs as go\n",
+ "\n",
+ "# ConcatƩner les occurrences des checkpoints immunitaires dans les deux tableaux\n",
+ "all_occurrences = pd.concat([occurrences_checkpoint_NACT, occurrences_checkpoint_ACT], axis=1, keys=['NACT', 'ACT'], sort=False).fillna(0)\n",
+ "\n",
+ "# Calculer le nombre total de patientes dans chaque groupe\n",
+ "total_patients_NACT = len(df_NACT['Patient'].unique())\n",
+ "total_patients_ACT = len(df_ACT['Patient'].unique())\n",
+ "\n",
+ "# Diviser le nombre d'occurrences de chaque checkpoint immunitaire par le nombre total de patientes dans le groupe correspondant\n",
+ "all_occurrences_normalized = all_occurrences.copy()\n",
+ "all_occurrences_normalized['NACT'] /= total_patients_NACT\n",
+ "all_occurrences_normalized['ACT'] /= total_patients_ACT\n",
+ "\n",
+ "all_occurrences_normalized"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 72,
+ "id": "6ec09056-4b7f-4aa5-8a2c-529f99b921a3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['62', '63', '59', '60', '33', '35', '36', '37', '38', '30', '25',\n",
+ " '27', '29', '20', '21', '22', '23', '24', '14', '16', '17', '19',\n",
+ " '12', '8', '9', '10', '4', '52', '53', '54', '55', '56', '57',\n",
+ " '50', '42', '43', '44', '45', '47', '39', '41', '49', '46', '48',\n",
+ " '58', '28', '13', '6', '34', '3', '122', '125', '124', '94', '101',\n",
+ " '86', '84', '83', '91', '88', '87', '75', '74', '82', '81', '80',\n",
+ " '79', '67', '66', '65', '64', '73', '71', '69', '68', '123', '115',\n",
+ " '114', '113', '120', '117', '126', '105', '103', '102', '110',\n",
+ " '109', '106', '166', '112', '108', '107', '97', '96', '100', '78',\n",
+ " '77', '70', '72', '99', '92', '90', '136', '135', '134', '133',\n",
+ " '132', '131', '130', '129', '144', '143', '155', '154', '150',\n",
+ " '148', '147', '164', '161', '159', '128', '127', '142', '139',\n",
+ " '152', '158', '156', '172', '170', '168', '167', '165', '181',\n",
+ " '180', '176', '173', '175', '185', '186'], dtype=object)"
+ ]
+ },
+ "execution_count": 72,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_ACT['Patient'].unique()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 73,
+ "id": "ec75dc89-a6fa-46ad-9bdc-ba218985da88",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "name": "NACT",
+ "type": "bar",
+ "x": [
+ "None",
+ "PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "B7H4_PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PD1",
+ "PDL1",
+ "None",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4_PDL1",
+ "B7H4_PD1",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "None",
+ "PDL1",
+ "PD1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "B7H4_PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "B7H4",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "B7H4",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "B7H4_PDL1",
+ "PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "PD1_PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PDL1",
+ "B7H4_PD1",
+ "B7H4_PD1_PDL1",
+ "PD1_PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "PD1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "PDL1",
+ "PD1",
+ "PD1_PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "PD1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "B7H4_PDL1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "PD1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "B7H4_PDL1",
+ "None",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "PD1",
+ "PDL1",
+ "B7H4",
+ "None",
+ "PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "B7H4",
+ "None",
+ "B7H4_PD1",
+ "PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PDL1",
+ "B7H4",
+ "B7H4",
+ "None",
+ "PDL1",
+ "B7H4_PDL1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "PD1",
+ "B7H4",
+ "None",
+ "PDL1",
+ "PD1_PDL1",
+ "PD1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PD1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PD1",
+ "B7H4",
+ "None",
+ "B7H4_PDL1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "B7H4_PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "None",
+ "B7H4",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "PD1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PD1",
+ "B7H4",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "B7H4",
+ "B7H4_PD1",
+ "PDL1",
+ "None",
+ "PD1",
+ "B7H4",
+ "PDL1",
+ "B7H4_PD1",
+ "PD1_PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "PD1_PDL1",
+ "B7H4",
+ "None",
+ "PD1",
+ "B7H4_PDL1",
+ "PDL1",
+ "None",
+ "PD1",
+ "B7H4",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PDL1",
+ "B7H4",
+ "PD1_PDL1",
+ "None",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "PD1_PDL1",
+ "None",
+ "PD1",
+ "PDL1",
+ "B7H4",
+ "PD1_PDL1",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PDL1",
+ "PD1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1",
+ "PDL1",
+ "B7H4_PDL1",
+ "PD1",
+ "None",
+ "B7H4_PD1",
+ "B7H4",
+ "PDL1",
+ "PD1_PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "PD1_PDL1",
+ "None",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "None",
+ "PD1",
+ "PDL1",
+ "PD1_PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1"
+ ],
+ "y": [
+ 64.76315789473684,
+ 0.5263157894736842,
+ 0.2631578947368421,
+ 161.52631578947367,
+ 1.3157894736842106,
+ 0.05263157894736842,
+ 0.05263157894736842,
+ 0.05263157894736842,
+ 25.42105263157895,
+ 0.9473684210526315,
+ 0.5789473684210527,
+ 0.02631578947368421,
+ 0.02631578947368421,
+ 4.473684210526316,
+ 0.631578947368421,
+ 0.10526315789473684,
+ 60.94736842105263,
+ 57.8421052631579,
+ 0.47368421052631576,
+ 0.02631578947368421,
+ 81.60526315789474,
+ 68.55263157894737,
+ 1.6578947368421053,
+ 0.2894736842105263,
+ 0.13157894736842105,
+ 0.10526315789473684,
+ 54.23684210526316,
+ 0.6578947368421053,
+ 0.10526315789473684,
+ 0.02631578947368421,
+ 41.68421052631579,
+ 0.13157894736842105,
+ 0.07894736842105263,
+ 28.94736842105263,
+ 0.4473684210526316,
+ 0.07894736842105263,
+ 39.526315789473685,
+ 1.9210526315789473,
+ 0.05263157894736842,
+ 0.02631578947368421,
+ 81.13157894736842,
+ 7.684210526315789,
+ 0.07894736842105263,
+ 0.02631578947368421,
+ 50.86842105263158,
+ 26.710526315789473,
+ 0.18421052631578946,
+ 0.07894736842105263,
+ 107.05263157894737,
+ 0.9473684210526315,
+ 0.2894736842105263,
+ 0.13157894736842105,
+ 0.02631578947368421,
+ 77.78947368421052,
+ 0.18421052631578946,
+ 0.13157894736842105,
+ 0.02631578947368421,
+ 31.473684210526315,
+ 5.2105263157894735,
+ 0.05263157894736842,
+ 113.39473684210526,
+ 1.105263157894737,
+ 0.23684210526315788,
+ 72.1842105263158,
+ 3.8421052631578947,
+ 0.34210526315789475,
+ 0.13157894736842105,
+ 0.10526315789473684,
+ 43.71052631578947,
+ 0.9736842105263158,
+ 0.07894736842105263,
+ 0.05263157894736842,
+ 0.02631578947368421,
+ 46.578947368421055,
+ 1.236842105263158,
+ 0.05263157894736842,
+ 0.02631578947368421,
+ 47.21052631578947,
+ 3.3157894736842106,
+ 51.21052631578947,
+ 0.18421052631578946,
+ 0.05263157894736842,
+ 24.342105263157894,
+ 0.18421052631578946,
+ 237.07894736842104,
+ 8.342105263157896,
+ 8.105263157894736,
+ 0.6052631578947368,
+ 0.05263157894736842,
+ 20.105263157894736,
+ 1.4210526315789473,
+ 1.0789473684210527,
+ 44.526315789473685,
+ 4.2105263157894735,
+ 0.10526315789473684,
+ 34.39473684210526,
+ 14.605263157894736,
+ 0.13157894736842105,
+ 0.10526315789473684,
+ 0.10526315789473684,
+ 0.07894736842105263,
+ 90.92105263157895,
+ 0.7105263157894737,
+ 0.18421052631578946,
+ 0.02631578947368421,
+ 97,
+ 0.5263157894736842,
+ 0.07894736842105263,
+ 0.02631578947368421,
+ 224.47368421052633,
+ 5.815789473684211,
+ 3.3157894736842106,
+ 1.9473684210526316,
+ 0.07894736842105263,
+ 110.21052631578948,
+ 2.3947368421052633,
+ 0.07894736842105263,
+ 68.15789473684211,
+ 1.0789473684210527,
+ 0.5526315789473685,
+ 0.05263157894736842,
+ 1.105263157894737,
+ 0.02631578947368421,
+ 0.02631578947368421,
+ 48.55263157894737,
+ 0.47368421052631576,
+ 0.10526315789473684,
+ 0.05263157894736842,
+ 40.78947368421053,
+ 0.39473684210526316,
+ 0.21052631578947367,
+ 58.13157894736842,
+ 44.5,
+ 31.68421052631579,
+ 3.763157894736842,
+ 0.23684210526315788,
+ 0.23684210526315788,
+ 0.02631578947368421,
+ 73.26315789473684,
+ 17.68421052631579,
+ 4.342105263157895,
+ 0.18421052631578946,
+ 0.13157894736842105,
+ 0.02631578947368421,
+ 59.94736842105263,
+ 22.263157894736842,
+ 5.842105263157895,
+ 2.736842105263158,
+ 0.631578947368421,
+ 0.23684210526315788,
+ 0.02631578947368421,
+ 76.34210526315789,
+ 12.81578947368421,
+ 8.447368421052632,
+ 0.02631578947368421,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "name": "ACT",
+ "type": "bar",
+ "x": [
+ "None",
+ "PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "B7H4_PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PD1",
+ "PDL1",
+ "None",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4_PDL1",
+ "B7H4_PD1",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "None",
+ "PDL1",
+ "PD1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "B7H4_PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "B7H4",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "B7H4",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "B7H4_PDL1",
+ "PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "PD1_PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PDL1",
+ "B7H4_PD1",
+ "B7H4_PD1_PDL1",
+ "PD1_PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "PD1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "PDL1",
+ "PD1",
+ "PD1_PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "PD1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "B7H4_PDL1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "PD1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "B7H4_PDL1",
+ "None",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "PD1",
+ "PDL1",
+ "B7H4",
+ "None",
+ "PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "B7H4",
+ "None",
+ "B7H4_PD1",
+ "PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PDL1",
+ "B7H4",
+ "B7H4",
+ "None",
+ "PDL1",
+ "B7H4_PDL1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "PD1",
+ "B7H4",
+ "None",
+ "PDL1",
+ "PD1_PDL1",
+ "PD1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PD1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PD1",
+ "B7H4",
+ "None",
+ "B7H4_PDL1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "B7H4_PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "None",
+ "B7H4",
+ "PDL1",
+ "B7H4_PDL1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "None",
+ "B7H4",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "PD1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "PD1",
+ "B7H4",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "B7H4",
+ "B7H4_PD1",
+ "PDL1",
+ "None",
+ "PD1",
+ "B7H4",
+ "PDL1",
+ "B7H4_PD1",
+ "PD1_PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "PD1_PDL1",
+ "B7H4",
+ "None",
+ "PD1",
+ "B7H4_PDL1",
+ "PDL1",
+ "None",
+ "PD1",
+ "B7H4",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PDL1",
+ "B7H4",
+ "PD1_PDL1",
+ "None",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "None",
+ "B7H4",
+ "PDL1",
+ "PD1",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "PD1_PDL1",
+ "None",
+ "PD1",
+ "PDL1",
+ "B7H4",
+ "PD1_PDL1",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PDL1",
+ "PD1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1",
+ "PDL1",
+ "B7H4_PDL1",
+ "PD1",
+ "None",
+ "B7H4_PD1",
+ "B7H4",
+ "PDL1",
+ "PD1_PDL1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "PD1",
+ "PD1_PDL1",
+ "None",
+ "PD1",
+ "PDL1",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1",
+ "None",
+ "PD1",
+ "PDL1",
+ "PD1_PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "PD1",
+ "None",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PDL1",
+ "B7H4",
+ "None",
+ "B7H4",
+ "PD1",
+ "PDL1"
+ ],
+ "y": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 46.23741007194245,
+ 0.16546762589928057,
+ 0.03597122302158273,
+ 0.02877697841726619,
+ 0.007194244604316547,
+ 7.748201438848921,
+ 5.719424460431655,
+ 0.02877697841726619,
+ 15.611510791366907,
+ 0.460431654676259,
+ 0.2949640287769784,
+ 26.136690647482013,
+ 0.9712230215827338,
+ 0.22302158273381295,
+ 0.03597122302158273,
+ 0.007194244604316547,
+ 21.971223021582734,
+ 0.8633093525179856,
+ 0.1223021582733813,
+ 0.007194244604316547,
+ 13.237410071942445,
+ 0.02877697841726619,
+ 0.007194244604316547,
+ 0.007194244604316547,
+ 37.32374100719424,
+ 0.19424460431654678,
+ 0.03597122302158273,
+ 0.007194244604316547,
+ 7.683453237410072,
+ 0.26618705035971224,
+ 0.02158273381294964,
+ 10.410071942446043,
+ 0.007194244604316547,
+ 0.007194244604316547,
+ 7.913669064748201,
+ 0.06474820143884892,
+ 0.014388489208633094,
+ 17.949640287769785,
+ 0.04316546762589928,
+ 0.02158273381294964,
+ 0.014388489208633094,
+ 24.971223021582734,
+ 4.402877697841727,
+ 1.1223021582733812,
+ 0.14388489208633093,
+ 0.014388489208633094,
+ 37.35251798561151,
+ 7.920863309352518,
+ 0.06474820143884892,
+ 0.04316546762589928,
+ 16.892086330935253,
+ 4.287769784172662,
+ 0.19424460431654678,
+ 0.07913669064748201,
+ 0.007194244604316547,
+ 19.446043165467625,
+ 6.7913669064748206,
+ 0.02877697841726619,
+ 0.007194244604316547,
+ 0.007194244604316547,
+ 23.848920863309353,
+ 0.39568345323741005,
+ 0.35251798561151076,
+ 0.007194244604316547,
+ 0.007194244604316547,
+ 57.330935251798564,
+ 6.446043165467626,
+ 0.7769784172661871,
+ 0.014388489208633094,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 16.12230215827338,
+ 0.050359712230215826,
+ 0.014388489208633094,
+ 18.43884892086331,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 14.172661870503598,
+ 0.06474820143884892,
+ 0.02877697841726619,
+ 0.02877697841726619,
+ 60.68345323741007,
+ 2.0575539568345325,
+ 0.2949640287769784,
+ 0.09352517985611511,
+ 0.02158273381294964,
+ 26.906474820143885,
+ 0.4460431654676259,
+ 0.11510791366906475,
+ 0.04316546762589928,
+ 0.007194244604316547,
+ 17.690647482014388,
+ 0.8561151079136691,
+ 0.2014388489208633,
+ 0.050359712230215826,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 0.007194244604316547,
+ 0.007194244604316547,
+ 8.172661870503598,
+ 0.6834532374100719,
+ 0.02158273381294964,
+ 0.014388489208633094,
+ 6.827338129496403,
+ 0.03597122302158273,
+ 20.115107913669064,
+ 9.985611510791367,
+ 0.20863309352517986,
+ 0.06474820143884892,
+ 0.02158273381294964,
+ 0.014388489208633094,
+ 14.388489208633093,
+ 0.8920863309352518,
+ 0.02158273381294964,
+ 0.007194244604316547,
+ 6.9784172661870505,
+ 0.09352517985611511,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 20.223021582733814,
+ 0.07913669064748201,
+ 0.02877697841726619,
+ 0.007194244604316547,
+ 41.03597122302158,
+ 0.08633093525179857,
+ 0.04316546762589928,
+ 0.03597122302158273,
+ 0.02877697841726619,
+ 43.03597122302158,
+ 0.09352517985611511,
+ 0.04316546762589928,
+ 0.007194244604316547,
+ 30.41726618705036,
+ 0.17985611510791366,
+ 0.14388489208633093,
+ 20.172661870503596,
+ 5.561151079136691,
+ 0.07913669064748201,
+ 0.02877697841726619,
+ 0.007194244604316547,
+ 34.014388489208635,
+ 0.1079136690647482,
+ 0.06474820143884892,
+ 9.33093525179856,
+ 0.007194244604316547,
+ 53.669064748201436,
+ 2.827338129496403,
+ 0.07913669064748201,
+ 0.02158273381294964,
+ 13.81294964028777,
+ 1.683453237410072,
+ 0.03597122302158273,
+ 15.863309352517986,
+ 0.5971223021582733,
+ 0.02877697841726619,
+ 0.007194244604316547,
+ 0.007194244604316547,
+ 0.007194244604316547,
+ 49.46762589928058,
+ 0.11510791366906475,
+ 0.05755395683453238,
+ 0.014388489208633094,
+ 15.83453237410072,
+ 12.266187050359711,
+ 0.1079136690647482,
+ 0.10071942446043165,
+ 33.13669064748201,
+ 1.0215827338129497,
+ 0.2589928057553957,
+ 0.02158273381294964,
+ 31.60431654676259,
+ 0.5755395683453237,
+ 0.2014388489208633,
+ 0.050359712230215826,
+ 8.179856115107913,
+ 0.07913669064748201,
+ 0.03597122302158273,
+ 0.007194244604316547,
+ 35.489208633093526,
+ 0.7482014388489209,
+ 0.5251798561151079,
+ 0.02158273381294964,
+ 37.56115107913669,
+ 0.460431654676259,
+ 0.17985611510791366,
+ 0.014388489208633094,
+ 5.510791366906475,
+ 0.18705035971223022,
+ 0.02158273381294964,
+ 9.43884892086331,
+ 0.35251798561151076,
+ 0.014388489208633094,
+ 23.928057553956833,
+ 5.446043165467626,
+ 0.04316546762589928,
+ 0.03597122302158273,
+ 0.007194244604316547,
+ 50.34532374100719,
+ 0.11510791366906475,
+ 0.07913669064748201,
+ 0.05755395683453238,
+ 0.007194244604316547,
+ 41.17985611510792,
+ 2,
+ 1.3021582733812949,
+ 0.03597122302158273,
+ 0.014388489208633094,
+ 7.827338129496403,
+ 0.007194244604316547,
+ 30.381294964028775,
+ 5.014388489208633,
+ 0.2517985611510791,
+ 0.014388489208633094,
+ 30.33812949640288,
+ 4.60431654676259,
+ 0.2733812949640288,
+ 0.1223021582733813,
+ 0.06474820143884892,
+ 0.014388489208633094,
+ 21.26618705035971,
+ 1.776978417266187,
+ 0.050359712230215826,
+ 0.007194244604316547,
+ 6.848920863309353,
+ 1.5107913669064748,
+ 0.050359712230215826,
+ 0.02158273381294964,
+ 45.618705035971225,
+ 1.4028776978417266,
+ 0.02877697841726619,
+ 0.02158273381294964,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 5.41726618705036,
+ 0.06474820143884892,
+ 0.007194244604316547,
+ 21.33093525179856,
+ 0.02158273381294964,
+ 0.007194244604316547,
+ 7.798561151079137,
+ 0.20863309352517986,
+ 0.02158273381294964,
+ 0.014388489208633094,
+ 6.741007194244604,
+ 0.02877697841726619,
+ 36.82014388489208,
+ 0.2014388489208633,
+ 0.08633093525179857,
+ 0.02158273381294964,
+ 17.60431654676259,
+ 4.330935251798561,
+ 0.12949640287769784,
+ 11.100719424460431,
+ 0.05755395683453238,
+ 0.014388489208633094,
+ 28.26618705035971,
+ 0.5107913669064749,
+ 0.02158273381294964,
+ 0.007194244604316547,
+ 5.316546762589928,
+ 1.9568345323741008,
+ 0.06474820143884892,
+ 0.04316546762589928,
+ 0.007194244604316547,
+ 46.719424460431654,
+ 0.06474820143884892,
+ 0.06474820143884892,
+ 0.04316546762589928,
+ 27.841726618705035,
+ 9.956834532374101,
+ 0.17266187050359713,
+ 0.07913669064748201,
+ 0.02877697841726619,
+ 59.20863309352518,
+ 0.3597122302158273,
+ 0.16546762589928057,
+ 0.08633093525179857,
+ 14.647482014388489,
+ 9.39568345323741,
+ 0.19424460431654678,
+ 0.1366906474820144,
+ 0.014388489208633094,
+ 33.7410071942446,
+ 0.5107913669064749,
+ 0.14388489208633093,
+ 0.03597122302158273,
+ 3.273381294964029,
+ 1.2805755395683454,
+ 0.02158273381294964,
+ 0.007194244604316547,
+ 11.956834532374101,
+ 3.971223021582734,
+ 0.06474820143884892,
+ 0.050359712230215826,
+ 0.007194244604316547,
+ 45.15827338129496,
+ 0.8848920863309353,
+ 0.2014388489208633,
+ 0.007194244604316547,
+ 19.863309352517987,
+ 0.2949640287769784,
+ 0.007194244604316547,
+ 21.02158273381295,
+ 2.093525179856115,
+ 0.10071942446043165,
+ 0.03597122302158273,
+ 14.633093525179856,
+ 0.03597122302158273,
+ 0.02158273381294964,
+ 36.16546762589928,
+ 2.1654676258992804,
+ 0.04316546762589928,
+ 0.007194244604316547,
+ 16.47482014388489,
+ 0.04316546762589928,
+ 0.02158273381294964,
+ 16.25179856115108,
+ 0.050359712230215826,
+ 0.03597122302158273,
+ 5.438848920863309,
+ 3.064748201438849,
+ 0.11510791366906475,
+ 0.050359712230215826,
+ 35.726618705035975,
+ 0.6474820143884892,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 33.03597122302158,
+ 0.18705035971223022,
+ 0.07194244604316546,
+ 0.04316546762589928,
+ 36.46762589928058,
+ 0.38848920863309355,
+ 0.06474820143884892,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 30.769784172661872,
+ 0.9640287769784173,
+ 0.02158273381294964,
+ 0.007194244604316547,
+ 26.92086330935252,
+ 0.11510791366906475,
+ 0.05755395683453238,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 1.8273381294964028,
+ 25.007194244604317,
+ 10.877697841726619,
+ 0.1223021582733813,
+ 0.03597122302158273,
+ 0.007194244604316547,
+ 10.37410071942446,
+ 0.31654676258992803,
+ 0.1079136690647482,
+ 23.280575539568346,
+ 5.942446043165468,
+ 0.02877697841726619,
+ 0.007194244604316547,
+ 42.410071942446045,
+ 1.6115107913669064,
+ 0.02158273381294964,
+ 0.02158273381294964,
+ 0.007194244604316547,
+ 13.179856115107913,
+ 5.136690647482014,
+ 23.165467625899282,
+ 0.007194244604316547,
+ 12.633093525179856,
+ 0.11510791366906475,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 11.201438848920864,
+ 2.223021582733813,
+ 0.02158273381294964,
+ 36.719424460431654,
+ 2.014388489208633,
+ 0.4892086330935252,
+ 0.02877697841726619,
+ 0.014388489208633094,
+ 49.73381294964029,
+ 0.02877697841726619,
+ 0.02158273381294964,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 31.35251798561151,
+ 0.9496402877697842,
+ 0.09352517985611511,
+ 48.97122302158273,
+ 0.03597122302158273,
+ 0.02158273381294964,
+ 0.007194244604316547,
+ 0.007194244604316547,
+ 11.517985611510792,
+ 2.597122302158273,
+ 0.02158273381294964,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 27.53956834532374,
+ 0.050359712230215826,
+ 0.02158273381294964,
+ 0.007194244604316547,
+ 24.964028776978417,
+ 19.841726618705035,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 3.985611510791367,
+ 0.04316546762589928,
+ 0.007194244604316547,
+ 0.007194244604316547,
+ 42.65467625899281,
+ 0.5683453237410072,
+ 0.02158273381294964,
+ 0.014388489208633094,
+ 30.798561151079138,
+ 0.9424460431654677,
+ 0.10071942446043165,
+ 16.510791366906474,
+ 0.05755395683453238,
+ 0.02158273381294964,
+ 0.02158273381294964,
+ 2.1510791366906474,
+ 0.050359712230215826,
+ 0.02158273381294964,
+ 0.007194244604316547,
+ 38.589928057553955,
+ 0.45323741007194246,
+ 0.02158273381294964,
+ 0.007194244604316547,
+ 27.323741007194243,
+ 0.5323741007194245,
+ 0.4892086330935252,
+ 0.19424460431654678,
+ 0.007194244604316547,
+ 36.1294964028777,
+ 6.58273381294964,
+ 0.7122302158273381,
+ 0.03597122302158273,
+ 0.014388489208633094,
+ 0.014388489208633094,
+ 13.942446043165468,
+ 3.7338129496402876,
+ 0.31654676258992803,
+ 0.050359712230215826,
+ 0.007194244604316547,
+ 0.007194244604316547,
+ 13.431654676258994,
+ 11.762589928057555,
+ 3.539568345323741,
+ 0.03597122302158273,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 23.41007194244604,
+ 6.345323741007194,
+ 1.0071942446043165,
+ 0.014388489208633094,
+ 36.7410071942446,
+ 2.172661870503597,
+ 0.5467625899280576,
+ 0.03597122302158273,
+ 0.03597122302158273,
+ 29.25179856115108,
+ 0.7913669064748201,
+ 0.7410071942446043,
+ 0.06474820143884892,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 25.035971223021583,
+ 0.2733812949640288,
+ 0.10071942446043165,
+ 0.07913669064748201,
+ 0.007194244604316547,
+ 11.028776978417266,
+ 0.22302158273381295,
+ 0.02877697841726619,
+ 0.014388489208633094,
+ 29.784172661870503,
+ 1.0431654676258992,
+ 0.9712230215827338,
+ 0.7697841726618705,
+ 0.05755395683453238,
+ 0.02158273381294964,
+ 3.906474820143885,
+ 3.6546762589928057,
+ 0.02877697841726619,
+ 0.02158273381294964,
+ 0.007194244604316547,
+ 26.633093525179856,
+ 12.453237410071942,
+ 0.2949640287769784,
+ 0.16546762589928057,
+ 0.08633093525179857,
+ 0.014388489208633094,
+ 6.028776978417266,
+ 2.093525179856115,
+ 0.014388489208633094,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 16.0431654676259,
+ 3.1007194244604315,
+ 0.07194244604316546,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 9.237410071942445,
+ 0.1510791366906475,
+ 0.014388489208633094,
+ 50.02158273381295,
+ 0.381294964028777,
+ 0.1079136690647482,
+ 0.014388489208633094,
+ 25.97841726618705,
+ 4.237410071942446,
+ 0.6115107913669064,
+ 0.4172661870503597,
+ 0.04316546762589928,
+ 0.02158273381294964,
+ 0.007194244604316547,
+ 33,
+ 2.8920863309352516,
+ 1.316546762589928,
+ 1.2589928057553956,
+ 0.22302158273381295,
+ 0.014388489208633094,
+ 12.654676258992806,
+ 0.15827338129496402,
+ 0.11510791366906475,
+ 27.992805755395683,
+ 4.223021582733813,
+ 0.19424460431654678,
+ 0.06474820143884892,
+ 0.014388489208633094,
+ 0.014388489208633094,
+ 10.618705035971223,
+ 0.07194244604316546,
+ 0.014388489208633094,
+ 0.007194244604316547,
+ 14.402877697841726,
+ 0.07913669064748201,
+ 0.02158273381294964,
+ 28.66906474820144,
+ 11.366906474820144,
+ 2.5611510791366907,
+ 1.5611510791366907,
+ 0.03597122302158273,
+ 0.014388489208633094,
+ 12.446043165467627,
+ 7.661870503597123,
+ 0.2589928057553957,
+ 0.1366906474820144,
+ 0.08633093525179857,
+ 0.014388489208633094,
+ 48.884892086330936,
+ 0.6187050359712231,
+ 0.2589928057553957,
+ 0.02158273381294964,
+ 0.007194244604316547,
+ 10.525179856115107,
+ 0.5179856115107914,
+ 0.1079136690647482,
+ 17.06474820143885,
+ 11.496402877697841,
+ 1.7050359712230216,
+ 0.02877697841726619,
+ 11.928057553956835,
+ 0.8345323741007195,
+ 0.2014388489208633,
+ 0.050359712230215826,
+ 0.03597122302158273,
+ 0.007194244604316547,
+ 3.4532374100719423,
+ 0.04316546762589928,
+ 0.007194244604316547,
+ 0.007194244604316547,
+ 0.007194244604316547,
+ 8.050359712230216,
+ 6.0359712230215825,
+ 0.007194244604316547,
+ 19.453237410071942,
+ 0.35251798561151076,
+ 0.014388489208633094,
+ 7.654676258992806,
+ 1.3093525179856116,
+ 0.09352517985611511,
+ 0.04316546762589928
+ ]
+ }
+ ],
+ "layout": {
+ "legend": {
+ "title": {
+ "text": "Groupe"
+ }
+ },
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "Comparaison des proportions de checkpoints immunitaires entre les groupes NACT et ACT"
+ },
+ "xaxis": {
+ "autorange": true,
+ "range": [
+ -0.5,
+ 7.5
+ ],
+ "tickangle": -45,
+ "title": {
+ "text": "Checkpoint Immunitaire"
+ },
+ "type": "category"
+ },
+ "yaxis": {
+ "autorange": true,
+ "range": [
+ 0,
+ 3360.8178720181763
+ ],
+ "title": {
+ "text": "Proportion d'Occurrences"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 73,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import plotly.graph_objs as go\n",
+ "\n",
+ "# Calculer le nombre total de patientes dans chaque groupe\n",
+ "total_patients_NACT = len(df_NACT['Patient'].unique())\n",
+ "total_patients_ACT = len(df_ACT['Patient'].unique())\n",
+ "\n",
+ "# Diviser le nombre d'occurrences de chaque checkpoint immunitaire par le nombre total de patientes dans le groupe correspondant\n",
+ "all_occurrences_normalized = all_occurrences.copy()\n",
+ "all_occurrences_normalized['NACT'] /= total_patients_NACT\n",
+ "all_occurrences_normalized['ACT'] /= total_patients_ACT\n",
+ "\n",
+ "# CrƩer un objet Figure de Plotly\n",
+ "fig = go.Figure()\n",
+ "\n",
+ "# Ajouter les barres pour les proportions normalisƩes de chaque checkpoint immunitaire dans les deux groupes\n",
+ "for col in all_occurrences_normalized.columns:\n",
+ " fig.add_trace(go.Bar(x=all_occurrences_normalized.index.get_level_values('immune_checkpoint'), y=all_occurrences_normalized[col], name=col))\n",
+ "\n",
+ "# Mettre en forme le titre et les axes\n",
+ "fig.update_layout(\n",
+ " title=\"Comparaison des proportions de checkpoints immunitaires entre les groupes NACT et ACT\",\n",
+ " xaxis_title=\"Checkpoint Immunitaire\",\n",
+ " yaxis_title=\"Proportion d'Occurrences\",\n",
+ " xaxis_tickangle=-45,\n",
+ " legend_title=\"Groupe\"\n",
+ ")\n",
+ "\n",
+ "# Afficher le graphique\n",
+ "fig.show()\n",
+ "plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "12a2c3e6-c90f-4a78-b19e-607fbb3219ab",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "935d8f96-9104-4778-b218-07291b128729",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a841c9f8-3cfb-4a34-a99e-e14808dbde71",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "93837651-60b5-4749-b759-7210fb35c925",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "bc0bcd77-4132-4c6b-b179-033f06d6b71b",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ef825078-cabe-4d97-b0f4-f0e64ba1f91d",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "27c4ad36-55cc-4402-8553-aaad40f129e4",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6a796f99-a904-4a3c-870f-d7ff95593de5",
+ "metadata": {},
+ "source": [
+ "### V.4.3. IMMUNE CHECKPOINT"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9d172bdd-3ddd-4881-9d96-be3813e61572",
+ "metadata": {},
+ "source": [
+ "#### V.4.3.1. NACT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 74,
+ "id": "34ba6aef-4cee-4a56-9982-867439fae8bb",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " cell_type \n",
+ " cell_subtype \n",
+ " immune_checkpoint \n",
+ " count \n",
+ " percentage \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " CANCER \n",
+ " CANCER \n",
+ " B7H4 \n",
+ " 10827 \n",
+ " 16.317273 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " CANCER \n",
+ " CANCER \n",
+ " B7H4_PD1 \n",
+ " 140 \n",
+ " 0.210993 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " CANCER \n",
+ " CANCER \n",
+ " B7H4_PDL1 \n",
+ " 19 \n",
+ " 0.028635 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " CANCER \n",
+ " CANCER \n",
+ " None \n",
+ " 52778 \n",
+ " 79.541242 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " CANCER \n",
+ " CANCER \n",
+ " PD1 \n",
+ " 1553 \n",
+ " 2.340512 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 59 \n",
+ " STROMA \n",
+ " αSMA_myCAF \n",
+ " B7H4 \n",
+ " 13 \n",
+ " 0.101634 \n",
+ " \n",
+ " \n",
+ " 60 \n",
+ " STROMA \n",
+ " αSMA_myCAF \n",
+ " B7H4_PD1 \n",
+ " 1 \n",
+ " 0.007818 \n",
+ " \n",
+ " \n",
+ " 61 \n",
+ " STROMA \n",
+ " αSMA_myCAF \n",
+ " None \n",
+ " 12746 \n",
+ " 99.648190 \n",
+ " \n",
+ " \n",
+ " 62 \n",
+ " STROMA \n",
+ " αSMA_myCAF \n",
+ " PD1 \n",
+ " 15 \n",
+ " 0.117270 \n",
+ " \n",
+ " \n",
+ " 63 \n",
+ " STROMA \n",
+ " αSMA_myCAF \n",
+ " PDL1 \n",
+ " 16 \n",
+ " 0.125088 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
64 rows Ć 5 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " cell_type cell_subtype immune_checkpoint count percentage\n",
+ "0 CANCER CANCER B7H4 10827 16.317273\n",
+ "1 CANCER CANCER B7H4_PD1 140 0.210993\n",
+ "2 CANCER CANCER B7H4_PDL1 19 0.028635\n",
+ "3 CANCER CANCER None 52778 79.541242\n",
+ "4 CANCER CANCER PD1 1553 2.340512\n",
+ ".. ... ... ... ... ...\n",
+ "59 STROMA αSMA_myCAF B7H4 13 0.101634\n",
+ "60 STROMA αSMA_myCAF B7H4_PD1 1 0.007818\n",
+ "61 STROMA αSMA_myCAF None 12746 99.648190\n",
+ "62 STROMA αSMA_myCAF PD1 15 0.117270\n",
+ "63 STROMA αSMA_myCAF PDL1 16 0.125088\n",
+ "\n",
+ "[64 rows x 5 columns]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Count of each immune_checkpoint type by cell_subtype\n",
+ "counts_NACT = df_NACT.groupby(['cell_type', 'cell_subtype', 'immune_checkpoint']).size().reset_index(name='count')\n",
+ "\n",
+ "# % for each cell_subtype\n",
+ "counts_NACT['percentage'] = counts_NACT.groupby('cell_subtype')['count'].apply(lambda x: (x / x.sum()) * 100)\n",
+ "\n",
+ "display(counts_NACT)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 75,
+ "id": "59093d4c-11e4-4a94-a4d3-e5837bd2314c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "cell_type=CANCER Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "CANCER",
+ "marker": {
+ "color": "#636efa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "CANCER",
+ "offsetgroup": "CANCER",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 16.317272768375204,
+ 0.21099272075113407,
+ 0.02863472638765391,
+ 79.54124154145254,
+ 2.34051210947508,
+ 0.022606362937621506,
+ 1.5387397706207708
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "cell_type=ENDOTHELIAL Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "ENDOTHELIAL",
+ "marker": {
+ "color": "#EF553B",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "ENDOTHELIAL",
+ "offsetgroup": "ENDOTHELIAL",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 0.6641366223908919,
+ 98.60056925996204,
+ 0.5218216318785579,
+ 0.21347248576850095
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "cell_type=IMMUNE Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "IMMUNE",
+ "marker": {
+ "color": "#00cc96",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "IMMUNE",
+ "offsetgroup": "IMMUNE",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4",
+ "None",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 7.547169811320755,
+ 84.90566037735849,
+ 1.8867924528301887,
+ 5.660377358490567,
+ 2.955665024630542,
+ 0.3694581280788177,
+ 87.192118226601,
+ 7.8817733990147785,
+ 1.600985221674877,
+ 9.932279909706546,
+ 0.5804579168010319,
+ 0.032247662044501774,
+ 64.49532408900355,
+ 21.896162528216703,
+ 1.3221541438245727,
+ 1.7413737504030957,
+ 0.8964143426294822,
+ 0.398406374501992,
+ 90.43824701195219,
+ 5.278884462151394,
+ 0.199203187250996,
+ 2.788844621513944,
+ 2.9197080291970803,
+ 0.36496350364963503,
+ 70.07299270072993,
+ 15.693430656934307,
+ 5.839416058394161,
+ 5.109489051094891,
+ 1.828890266584005,
+ 0.04649721016738996,
+ 93.83137011779293,
+ 3.223806571605704,
+ 1.069435833849969,
+ 3.3856722276741906,
+ 0.04906771344455348,
+ 0.04906771344455348,
+ 86.01570166830226,
+ 7.065750736015702,
+ 1.5701668302257115,
+ 1.8645731108930326,
+ 2.7027027027027026,
+ 91.8918918918919,
+ 5.405405405405405
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "cell_type=STROMA Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "STROMA",
+ "marker": {
+ "color": "#ab63fa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "STROMA",
+ "offsetgroup": "STROMA",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 0.23769907297361542,
+ 0.047539814594723076,
+ 97.9676729260756,
+ 1.1587829807463752,
+ 0.5883052056096981,
+ 0.10163396137909467,
+ 0.007817997029161129,
+ 99.64819013368775,
+ 0.11726995543741693,
+ 0.12508795246657806
+ ],
+ "yaxis": "y"
+ }
+ ],
+ "layout": {
+ "barmode": "relative",
+ "legend": {
+ "title": {
+ "text": "cell_type"
+ },
+ "tracegroupgap": 0
+ },
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "Percentage of Each Immune Checkpoint Type by Cell Subtype in NACT"
+ },
+ "xaxis": {
+ "anchor": "y",
+ "autorange": true,
+ "domain": [
+ 0,
+ 1
+ ],
+ "range": [
+ -0.5,
+ 6.5
+ ],
+ "title": {
+ "text": "Immune Checkpoint"
+ },
+ "type": "category"
+ },
+ "yaxis": {
+ "anchor": "x",
+ "autorange": true,
+ "domain": [
+ 0,
+ 1
+ ],
+ "range": [
+ 0,
+ 1099.579978889274
+ ],
+ "title": {
+ "text": "Percentage"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 75,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "fig = px.bar(counts_NACT, x='immune_checkpoint', y='percentage', color='cell_type', \n",
+ " title='Percentage of Each Immune Checkpoint Type by Cell Subtype in NACT',\n",
+ " labels={'immune_checkpoint': 'Immune Checkpoint', 'percentage': 'Percentage', 'cell_subtype': 'Cell Subtype'})\n",
+ "\n",
+ "fig.show()\n",
+ "plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0910a1d1-84bc-4df2-a490-b3c43e747939",
+ "metadata": {},
+ "source": [
+ "#### V.4.3.2. ACT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 76,
+ "id": "07a58e22-600b-4f32-a3b1-ad82ba09988a",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " cell_type cell_subtype immune_checkpoint count percentage\n",
+ "0 CANCER CANCER B7H4 32646 9.083725\n",
+ "1 CANCER CANCER B7H4_PD1 425 0.118256\n",
+ "2 CANCER CANCER B7H4_PDL1 84 0.023373\n",
+ "3 CANCER CANCER None 314226 87.433151\n",
+ "4 CANCER CANCER PD1 7532 2.095773\n",
+ ".. ... ... ... ... ...\n",
+ "66 STROMA STROMA_OTHER PDL1 160 0.332226\n",
+ "67 STROMA αSMA_myCAF B7H4 51 0.185266\n",
+ "68 STROMA αSMA_myCAF None 27200 98.808486\n",
+ "69 STROMA αSMA_myCAF PD1 256 0.929962\n",
+ "70 STROMA αSMA_myCAF PDL1 21 0.076286\n",
+ "\n",
+ "[71 rows x 5 columns]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Count of each immune_checkpoint type by cell_subtype\n",
+ "counts_ACT = df_ACT.groupby(['cell_type', 'cell_subtype', 'immune_checkpoint']).size().reset_index(name='count')\n",
+ "\n",
+ "# % for each cell_subtype\n",
+ "counts_ACT['percentage'] = counts_ACT.groupby('cell_subtype')['count'].apply(lambda x: (x / x.sum()) * 100)\n",
+ "\n",
+ "print(counts_ACT)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 77,
+ "id": "c26c0ee1-0b90-48f4-9959-9d5ae9d5467a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "cell_type=CANCER Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "CANCER",
+ "marker": {
+ "color": "#636efa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "CANCER",
+ "offsetgroup": "CANCER",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 9.083725201035087,
+ 0.11825593366537744,
+ 0.02337293747739225,
+ 87.4331506163221,
+ 2.0957733938061716,
+ 0.005843234369348063,
+ 1.2398786833245221
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "cell_type=ENDOTHELIAL Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "ENDOTHELIAL",
+ "marker": {
+ "color": "#EF553B",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "ENDOTHELIAL",
+ "offsetgroup": "ENDOTHELIAL",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 1.0226320201173513,
+ 0.07544006705783739,
+ 97.88767812238055,
+ 0.6454316848281643,
+ 0.36881810561609385
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "cell_type=IMMUNE Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "IMMUNE",
+ "marker": {
+ "color": "#00cc96",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "IMMUNE",
+ "offsetgroup": "IMMUNE",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PD1",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1",
+ "B7H4",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 4.584527220630372,
+ 77.36389684813754,
+ 0.28653295128939826,
+ 17.765042979942695,
+ 3.9944521497919556,
+ 0.08321775312066575,
+ 0.055478502080443824,
+ 90.98474341192788,
+ 3.633841886269071,
+ 1.248266296809986,
+ 4.385964912280701,
+ 0.2562586240883107,
+ 0.03942440370589395,
+ 84.72304356396609,
+ 8.219988172678889,
+ 0.29568302779420463,
+ 2.0796372954859055,
+ 5.770964833183047,
+ 0.9017132551848512,
+ 78.26871055004509,
+ 10.18935978358882,
+ 2.6149684400360687,
+ 2.254283137962128,
+ 2.3255813953488373,
+ 0.15503875968992248,
+ 0.7751937984496124,
+ 81.55038759689923,
+ 11.782945736434108,
+ 2.0155038759689923,
+ 1.3953488372093024,
+ 2.3240517430388072,
+ 0.05481254110940583,
+ 0.005481254110940584,
+ 95.94387195790397,
+ 1.0633632975224732,
+ 0.005481254110940584,
+ 0.6029379522034641,
+ 8.640796562777057,
+ 0.09547841505831003,
+ 0.22505626406601648,
+ 81.67496419559436,
+ 5.162654299938621,
+ 0.7501875468867216,
+ 3.45086271567892,
+ 3.1446540880503147,
+ 88.67924528301887,
+ 1.257861635220126,
+ 0.628930817610063,
+ 6.289308176100629
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "cell_type=STROMA Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "STROMA",
+ "marker": {
+ "color": "#ab63fa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "STROMA",
+ "offsetgroup": "STROMA",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PD1_PDL1",
+ "None",
+ "PD1",
+ "PDL1",
+ "B7H4",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 0.3924418604651163,
+ 0.008305647840531562,
+ 0.0020764119601328905,
+ 98.69393687707641,
+ 0.5710132890365449,
+ 0.33222591362126247,
+ 0.18526591107236268,
+ 98.8084859052601,
+ 0.929962220284801,
+ 0.07628596338273758
+ ],
+ "yaxis": "y"
+ }
+ ],
+ "layout": {
+ "barmode": "relative",
+ "legend": {
+ "title": {
+ "text": "cell_type"
+ },
+ "tracegroupgap": 0
+ },
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "Percentage of Each Immune Checkpoint Type by Cell Subtype in ACT"
+ },
+ "xaxis": {
+ "anchor": "y",
+ "autorange": true,
+ "domain": [
+ 0,
+ 1
+ ],
+ "range": [
+ -0.5,
+ 7.5
+ ],
+ "title": {
+ "text": "Immune Checkpoint"
+ },
+ "type": "category"
+ },
+ "yaxis": {
+ "anchor": "x",
+ "autorange": true,
+ "domain": [
+ 0,
+ 1
+ ],
+ "range": [
+ 0,
+ 1117.9074893984548
+ ],
+ "title": {
+ "text": "Percentage"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 77,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Créer le graphique à barres avec Plotly Express\n",
+ "fig = px.bar(counts_ACT, x='immune_checkpoint', y='percentage', color='cell_type', \n",
+ " title='Percentage of Each Immune Checkpoint Type by Cell Subtype in ACT',\n",
+ " labels={'immune_checkpoint': 'Immune Checkpoint', 'percentage': 'Percentage', 'cell_subtype': 'Cell Subtype'})\n",
+ "\n",
+ "# Afficher le graphique\n",
+ "fig.show()\n",
+ "plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b81afd88-6cb5-4c12-a8ab-86b2218d6a3b",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "917007be-deb6-4c55-a116-0ca354fe218a",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 78,
+ "id": "499dabdc-7da2-4610-ae96-a1cfeda7fd76",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=CANCER Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "CANCER",
+ "marker": {
+ "color": "#636efa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "CANCER",
+ "offsetgroup": "CANCER",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 16.317272768375204,
+ 0.21099272075113407,
+ 0.02863472638765391,
+ 79.54124154145254,
+ 2.34051210947508,
+ 0.022606362937621506,
+ 1.5387397706207708
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=CANCER Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "CANCER",
+ "marker": {
+ "color": "#636efa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "CANCER",
+ "offsetgroup": "CANCER",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 9.083725201035087,
+ 0.11825593366537744,
+ 0.02337293747739225,
+ 87.4331506163221,
+ 2.0957733938061716,
+ 0.005843234369348063,
+ 1.2398786833245221
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=ENDOTHELIAL Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "ENDOTHELIAL",
+ "marker": {
+ "color": "#EF553B",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "ENDOTHELIAL",
+ "offsetgroup": "ENDOTHELIAL",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 0.6641366223908919,
+ 98.60056925996204,
+ 0.5218216318785579,
+ 0.21347248576850095
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=ENDOTHELIAL Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "ENDOTHELIAL",
+ "marker": {
+ "color": "#EF553B",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "ENDOTHELIAL",
+ "offsetgroup": "ENDOTHELIAL",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 1.0226320201173513,
+ 0.07544006705783739,
+ 97.88767812238055,
+ 0.6454316848281643,
+ 0.36881810561609385
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=B Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "B",
+ "marker": {
+ "color": "#00cc96",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "B",
+ "offsetgroup": "B",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 7.547169811320755,
+ 84.90566037735849,
+ 1.8867924528301887,
+ 5.660377358490567
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=B Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "B",
+ "marker": {
+ "color": "#00cc96",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "B",
+ "offsetgroup": "B",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 4.584527220630372,
+ 77.36389684813754,
+ 0.28653295128939826,
+ 17.765042979942695
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=DC Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "DC",
+ "marker": {
+ "color": "#ab63fa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "DC",
+ "offsetgroup": "DC",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PD1_PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 2.955665024630542,
+ 0.3694581280788177,
+ 87.192118226601,
+ 7.8817733990147785,
+ 1.600985221674877
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=DC Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "DC",
+ "marker": {
+ "color": "#ab63fa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "DC",
+ "offsetgroup": "DC",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 3.9944521497919556,
+ 0.08321775312066575,
+ 0.055478502080443824,
+ 90.98474341192788,
+ 3.633841886269071,
+ 1.248266296809986
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=IMMUNE_OTHER Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "IMMUNE_OTHER",
+ "marker": {
+ "color": "#FFA15A",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "IMMUNE_OTHER",
+ "offsetgroup": "IMMUNE_OTHER",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 9.932279909706546,
+ 0.5804579168010319,
+ 0.032247662044501774,
+ 64.49532408900355,
+ 21.896162528216703,
+ 1.3221541438245727,
+ 1.7413737504030957
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=IMMUNE_OTHER Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "IMMUNE_OTHER",
+ "marker": {
+ "color": "#FFA15A",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "IMMUNE_OTHER",
+ "offsetgroup": "IMMUNE_OTHER",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 4.385964912280701,
+ 0.2562586240883107,
+ 0.03942440370589395,
+ 84.72304356396609,
+ 8.219988172678889,
+ 0.29568302779420463,
+ 2.0796372954859055
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=M1 Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "M1",
+ "marker": {
+ "color": "#19d3f3",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "M1",
+ "offsetgroup": "M1",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 0.8964143426294822,
+ 0.398406374501992,
+ 90.43824701195219,
+ 5.278884462151394,
+ 0.199203187250996,
+ 2.788844621513944
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=M1 Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "M1",
+ "marker": {
+ "color": "#19d3f3",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "M1",
+ "offsetgroup": "M1",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 5.770964833183047,
+ 0.9017132551848512,
+ 78.26871055004509,
+ 10.18935978358882,
+ 2.6149684400360687,
+ 2.254283137962128
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=M2 Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "M2",
+ "marker": {
+ "color": "#FF6692",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "M2",
+ "offsetgroup": "M2",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 2.9197080291970803,
+ 0.36496350364963503,
+ 70.07299270072993,
+ 15.693430656934307,
+ 5.839416058394161,
+ 5.109489051094891
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=M2 Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "M2",
+ "marker": {
+ "color": "#FF6692",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "M2",
+ "offsetgroup": "M2",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 2.3255813953488373,
+ 0.15503875968992248,
+ 0.7751937984496124,
+ 81.55038759689923,
+ 11.782945736434108,
+ 2.0155038759689923,
+ 1.3953488372093024
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=TCD4 Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "TCD4",
+ "marker": {
+ "color": "#B6E880",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "TCD4",
+ "offsetgroup": "TCD4",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 1.828890266584005,
+ 0.04649721016738996,
+ 93.83137011779293,
+ 3.223806571605704,
+ 1.069435833849969
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=TCD4 Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "TCD4",
+ "marker": {
+ "color": "#B6E880",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "TCD4",
+ "offsetgroup": "TCD4",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 2.3240517430388072,
+ 0.05481254110940583,
+ 0.005481254110940584,
+ 95.94387195790397,
+ 1.0633632975224732,
+ 0.005481254110940584,
+ 0.6029379522034641
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=TCD8 Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "TCD8",
+ "marker": {
+ "color": "#FF97FF",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "TCD8",
+ "offsetgroup": "TCD8",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 3.3856722276741906,
+ 0.04906771344455348,
+ 0.04906771344455348,
+ 86.01570166830226,
+ 7.065750736015702,
+ 1.5701668302257115,
+ 1.8645731108930326
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=TCD8 Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "TCD8",
+ "marker": {
+ "color": "#FF97FF",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "TCD8",
+ "offsetgroup": "TCD8",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 8.640796562777057,
+ 0.09547841505831003,
+ 0.22505626406601648,
+ 81.67496419559436,
+ 5.162654299938621,
+ 0.7501875468867216,
+ 3.45086271567892
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=Treg Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "Treg",
+ "marker": {
+ "color": "#FECB52",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "Treg",
+ "offsetgroup": "Treg",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 2.7027027027027026,
+ 91.8918918918919,
+ 5.405405405405405
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=Treg Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "Treg",
+ "marker": {
+ "color": "#FECB52",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "Treg",
+ "offsetgroup": "Treg",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 3.1446540880503147,
+ 88.67924528301887,
+ 1.257861635220126,
+ 0.628930817610063,
+ 6.289308176100629
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=STROMA_OTHER Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "STROMA_OTHER",
+ "marker": {
+ "color": "#636efa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "STROMA_OTHER",
+ "offsetgroup": "STROMA_OTHER",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 0.23769907297361542,
+ 0.047539814594723076,
+ 97.9676729260756,
+ 1.1587829807463752,
+ 0.5883052056096981
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=STROMA_OTHER Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "STROMA_OTHER",
+ "marker": {
+ "color": "#636efa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "STROMA_OTHER",
+ "offsetgroup": "STROMA_OTHER",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PD1_PDL1",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 0.3924418604651163,
+ 0.008305647840531562,
+ 0.0020764119601328905,
+ 98.69393687707641,
+ 0.5710132890365449,
+ 0.33222591362126247
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=αSMA_myCAF Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "αSMA_myCAF",
+ "marker": {
+ "color": "#EF553B",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "αSMA_myCAF",
+ "offsetgroup": "αSMA_myCAF",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 0.10163396137909467,
+ 0.007817997029161129,
+ 99.64819013368775,
+ 0.11726995543741693,
+ 0.12508795246657806
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=αSMA_myCAF Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "αSMA_myCAF",
+ "marker": {
+ "color": "#EF553B",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "αSMA_myCAF",
+ "offsetgroup": "αSMA_myCAF",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 0.18526591107236268,
+ 98.8084859052601,
+ 0.929962220284801,
+ 0.07628596338273758
+ ],
+ "yaxis": "y"
+ }
+ ],
+ "layout": {
+ "annotations": [
+ {
+ "font": {},
+ "showarrow": false,
+ "text": "Dataset=ACT",
+ "x": 0.5,
+ "xanchor": "center",
+ "xref": "paper",
+ "y": 0.46499999999999997,
+ "yanchor": "bottom",
+ "yref": "paper"
+ },
+ {
+ "font": {},
+ "showarrow": false,
+ "text": "Dataset=NACT",
+ "x": 0.5,
+ "xanchor": "center",
+ "xref": "paper",
+ "y": 0.9999999999999999,
+ "yanchor": "bottom",
+ "yref": "paper"
+ }
+ ],
+ "barmode": "relative",
+ "legend": {
+ "title": {
+ "text": "Cell Subtype"
+ },
+ "tracegroupgap": 0
+ },
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "Percentage of Each Immune Checkpoint Type by Cell Subtype"
+ },
+ "xaxis": {
+ "anchor": "y",
+ "autorange": true,
+ "domain": [
+ 0,
+ 1
+ ],
+ "range": [
+ -0.5,
+ 7.5
+ ],
+ "title": {
+ "text": "Immune Checkpoint"
+ },
+ "type": "category"
+ },
+ "xaxis2": {
+ "anchor": "y2",
+ "autorange": true,
+ "domain": [
+ 0,
+ 1
+ ],
+ "matches": "x",
+ "range": [
+ -0.5,
+ 7.5
+ ],
+ "showticklabels": false,
+ "type": "category"
+ },
+ "yaxis": {
+ "anchor": "x",
+ "autorange": true,
+ "domain": [
+ 0,
+ 0.46499999999999997
+ ],
+ "range": [
+ 0,
+ 1117.9074893984548
+ ],
+ "title": {
+ "text": "Percentage"
+ },
+ "type": "linear"
+ },
+ "yaxis2": {
+ "anchor": "x2",
+ "autorange": true,
+ "domain": [
+ 0.5349999999999999,
+ 0.9999999999999999
+ ],
+ "matches": "y",
+ "range": [
+ 0,
+ 1117.9074893984548
+ ],
+ "title": {
+ "text": "Percentage"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 78,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# ConcatƩner les deux DataFrames\n",
+ "combined_counts = pd.concat([counts_NACT, counts_ACT])\n",
+ "\n",
+ "# Ajouter une colonne pour distinguer les deux ensembles de donnƩes\n",
+ "combined_counts['dataset'] = ['NACT'] * len(counts_NACT) + ['ACT'] * len(counts_ACT)\n",
+ "\n",
+ "# Créer le graphique à barres avec Plotly Express\n",
+ "fig = px.bar(combined_counts, x='immune_checkpoint', y='percentage', color='cell_subtype', \n",
+ " facet_col='dataset', facet_col_wrap=1,\n",
+ " title='Percentage of Each Immune Checkpoint Type by Cell Subtype',\n",
+ " labels={'immune_checkpoint': 'Immune Checkpoint', 'percentage': 'Percentage', 'cell_subtype': 'Cell Subtype', 'dataset': 'Dataset'})\n",
+ "\n",
+ "# Afficher le graphique\n",
+ "fig.show()\n",
+ "plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 79,
+ "id": "33a95712-5262-41af-85f8-12305682ad5f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=CANCER Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "CANCER",
+ "marker": {
+ "color": "#636efa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "CANCER",
+ "offsetgroup": "CANCER",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 16.317272768375204,
+ 0.21099272075113407,
+ 0.02863472638765391,
+ 79.54124154145254,
+ 2.34051210947508,
+ 0.022606362937621506,
+ 1.5387397706207708
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=CANCER Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "CANCER",
+ "marker": {
+ "color": "#636efa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "CANCER",
+ "offsetgroup": "CANCER",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 9.083725201035087,
+ 0.11825593366537744,
+ 0.02337293747739225,
+ 87.4331506163221,
+ 2.0957733938061716,
+ 0.005843234369348063,
+ 1.2398786833245221
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=ENDOTHELIAL Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "ENDOTHELIAL",
+ "marker": {
+ "color": "#EF553B",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "ENDOTHELIAL",
+ "offsetgroup": "ENDOTHELIAL",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 0.6641366223908919,
+ 98.60056925996204,
+ 0.5218216318785579,
+ 0.21347248576850095
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=ENDOTHELIAL Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "ENDOTHELIAL",
+ "marker": {
+ "color": "#EF553B",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "ENDOTHELIAL",
+ "offsetgroup": "ENDOTHELIAL",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 1.0226320201173513,
+ 0.07544006705783739,
+ 97.88767812238055,
+ 0.6454316848281643,
+ 0.36881810561609385
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=B Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "B",
+ "marker": {
+ "color": "#00cc96",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "B",
+ "offsetgroup": "B",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 7.547169811320755,
+ 84.90566037735849,
+ 1.8867924528301887,
+ 5.660377358490567
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=B Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "B",
+ "marker": {
+ "color": "#00cc96",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "B",
+ "offsetgroup": "B",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 4.584527220630372,
+ 77.36389684813754,
+ 0.28653295128939826,
+ 17.765042979942695
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=DC Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "DC",
+ "marker": {
+ "color": "#ab63fa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "DC",
+ "offsetgroup": "DC",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PD1_PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 2.955665024630542,
+ 0.3694581280788177,
+ 87.192118226601,
+ 7.8817733990147785,
+ 1.600985221674877
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=DC Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "DC",
+ "marker": {
+ "color": "#ab63fa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "DC",
+ "offsetgroup": "DC",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 3.9944521497919556,
+ 0.08321775312066575,
+ 0.055478502080443824,
+ 90.98474341192788,
+ 3.633841886269071,
+ 1.248266296809986
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=IMMUNE_OTHER Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "IMMUNE_OTHER",
+ "marker": {
+ "color": "#FFA15A",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "IMMUNE_OTHER",
+ "offsetgroup": "IMMUNE_OTHER",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 9.932279909706546,
+ 0.5804579168010319,
+ 0.032247662044501774,
+ 64.49532408900355,
+ 21.896162528216703,
+ 1.3221541438245727,
+ 1.7413737504030957
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=IMMUNE_OTHER Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "IMMUNE_OTHER",
+ "marker": {
+ "color": "#FFA15A",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "IMMUNE_OTHER",
+ "offsetgroup": "IMMUNE_OTHER",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 4.385964912280701,
+ 0.2562586240883107,
+ 0.03942440370589395,
+ 84.72304356396609,
+ 8.219988172678889,
+ 0.29568302779420463,
+ 2.0796372954859055
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=M1 Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "M1",
+ "marker": {
+ "color": "#19d3f3",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "M1",
+ "offsetgroup": "M1",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 0.8964143426294822,
+ 0.398406374501992,
+ 90.43824701195219,
+ 5.278884462151394,
+ 0.199203187250996,
+ 2.788844621513944
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=M1 Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "M1",
+ "marker": {
+ "color": "#19d3f3",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "M1",
+ "offsetgroup": "M1",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 5.770964833183047,
+ 0.9017132551848512,
+ 78.26871055004509,
+ 10.18935978358882,
+ 2.6149684400360687,
+ 2.254283137962128
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=M2 Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "M2",
+ "marker": {
+ "color": "#FF6692",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "M2",
+ "offsetgroup": "M2",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 2.9197080291970803,
+ 0.36496350364963503,
+ 70.07299270072993,
+ 15.693430656934307,
+ 5.839416058394161,
+ 5.109489051094891
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=M2 Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "M2",
+ "marker": {
+ "color": "#FF6692",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "M2",
+ "offsetgroup": "M2",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 2.3255813953488373,
+ 0.15503875968992248,
+ 0.7751937984496124,
+ 81.55038759689923,
+ 11.782945736434108,
+ 2.0155038759689923,
+ 1.3953488372093024
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=TCD4 Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "TCD4",
+ "marker": {
+ "color": "#B6E880",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "TCD4",
+ "offsetgroup": "TCD4",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 1.828890266584005,
+ 0.04649721016738996,
+ 93.83137011779293,
+ 3.223806571605704,
+ 1.069435833849969
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=TCD4 Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "TCD4",
+ "marker": {
+ "color": "#B6E880",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "TCD4",
+ "offsetgroup": "TCD4",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 2.3240517430388072,
+ 0.05481254110940583,
+ 0.005481254110940584,
+ 95.94387195790397,
+ 1.0633632975224732,
+ 0.005481254110940584,
+ 0.6029379522034641
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=TCD8 Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "TCD8",
+ "marker": {
+ "color": "#FF97FF",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "TCD8",
+ "offsetgroup": "TCD8",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 3.3856722276741906,
+ 0.04906771344455348,
+ 0.04906771344455348,
+ 86.01570166830226,
+ 7.065750736015702,
+ 1.5701668302257115,
+ 1.8645731108930326
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=TCD8 Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "TCD8",
+ "marker": {
+ "color": "#FF97FF",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "TCD8",
+ "offsetgroup": "TCD8",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PDL1",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 8.640796562777057,
+ 0.09547841505831003,
+ 0.22505626406601648,
+ 81.67496419559436,
+ 5.162654299938621,
+ 0.7501875468867216,
+ 3.45086271567892
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=Treg Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "Treg",
+ "marker": {
+ "color": "#FECB52",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "Treg",
+ "offsetgroup": "Treg",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 2.7027027027027026,
+ 91.8918918918919,
+ 5.405405405405405
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=Treg Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "Treg",
+ "marker": {
+ "color": "#FECB52",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "Treg",
+ "offsetgroup": "Treg",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PD1",
+ "PD1_PDL1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 3.1446540880503147,
+ 88.67924528301887,
+ 1.257861635220126,
+ 0.628930817610063,
+ 6.289308176100629
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=STROMA_OTHER Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "STROMA_OTHER",
+ "marker": {
+ "color": "#636efa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "STROMA_OTHER",
+ "offsetgroup": "STROMA_OTHER",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 0.23769907297361542,
+ 0.047539814594723076,
+ 97.9676729260756,
+ 1.1587829807463752,
+ 0.5883052056096981
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=STROMA_OTHER Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "STROMA_OTHER",
+ "marker": {
+ "color": "#636efa",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "STROMA_OTHER",
+ "offsetgroup": "STROMA_OTHER",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "B7H4_PD1_PDL1",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 0.3924418604651163,
+ 0.008305647840531562,
+ 0.0020764119601328905,
+ 98.69393687707641,
+ 0.5710132890365449,
+ 0.33222591362126247
+ ],
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=αSMA_myCAF Dataset=NACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "αSMA_myCAF",
+ "marker": {
+ "color": "#EF553B",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "αSMA_myCAF",
+ "offsetgroup": "αSMA_myCAF",
+ "orientation": "v",
+ "showlegend": true,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "B7H4_PD1",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x2",
+ "y": [
+ 0.10163396137909467,
+ 0.007817997029161129,
+ 99.64819013368775,
+ 0.11726995543741693,
+ 0.12508795246657806
+ ],
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Cell Subtype=αSMA_myCAF Dataset=ACT Immune Checkpoint=%{x} Percentage=%{y} ",
+ "legendgroup": "αSMA_myCAF",
+ "marker": {
+ "color": "#EF553B",
+ "pattern": {
+ "shape": ""
+ }
+ },
+ "name": "αSMA_myCAF",
+ "offsetgroup": "αSMA_myCAF",
+ "orientation": "v",
+ "showlegend": false,
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "B7H4",
+ "None",
+ "PD1",
+ "PDL1"
+ ],
+ "xaxis": "x",
+ "y": [
+ 0.18526591107236268,
+ 98.8084859052601,
+ 0.929962220284801,
+ 0.07628596338273758
+ ],
+ "yaxis": "y"
+ }
+ ],
+ "layout": {
+ "annotations": [
+ {
+ "font": {},
+ "showarrow": false,
+ "text": "Dataset=ACT",
+ "x": 0.5,
+ "xanchor": "center",
+ "xref": "paper",
+ "y": 0.46499999999999997,
+ "yanchor": "bottom",
+ "yref": "paper"
+ },
+ {
+ "font": {},
+ "showarrow": false,
+ "text": "Dataset=NACT",
+ "x": 0.5,
+ "xanchor": "center",
+ "xref": "paper",
+ "y": 0.9999999999999999,
+ "yanchor": "bottom",
+ "yref": "paper"
+ }
+ ],
+ "barmode": "group",
+ "legend": {
+ "title": {
+ "text": "Cell Subtype"
+ },
+ "tracegroupgap": 0
+ },
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "Percentage of Each Immune Checkpoint Type by Cell Subtype"
+ },
+ "xaxis": {
+ "anchor": "y",
+ "autorange": true,
+ "domain": [
+ 0,
+ 1
+ ],
+ "range": [
+ -0.5,
+ 7.5
+ ],
+ "title": {
+ "text": "Immune Checkpoint"
+ },
+ "type": "category"
+ },
+ "xaxis2": {
+ "anchor": "y2",
+ "autorange": true,
+ "domain": [
+ 0,
+ 1
+ ],
+ "matches": "x",
+ "range": [
+ -0.5,
+ 7.5
+ ],
+ "showticklabels": false,
+ "type": "category"
+ },
+ "yaxis": {
+ "anchor": "x",
+ "autorange": true,
+ "domain": [
+ 0,
+ 0.46499999999999997
+ ],
+ "range": [
+ 0,
+ 104.89283171967132
+ ],
+ "title": {
+ "text": "Percentage"
+ },
+ "type": "linear"
+ },
+ "yaxis2": {
+ "anchor": "x2",
+ "autorange": true,
+ "domain": [
+ 0.5349999999999999,
+ 0.9999999999999999
+ ],
+ "matches": "y",
+ "range": [
+ 0,
+ 104.89283171967132
+ ],
+ "title": {
+ "text": "Percentage"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 79,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# ConcatƩner les deux DataFrames\n",
+ "combined_counts = pd.concat([counts_NACT, counts_ACT])\n",
+ "\n",
+ "# Ajouter une colonne pour distinguer les deux ensembles de donnƩes\n",
+ "combined_counts['dataset'] = ['NACT'] * len(counts_NACT) + ['ACT'] * len(counts_ACT)\n",
+ "\n",
+ "# Créer le graphique à barres groupées avec Plotly Express\n",
+ "fig = px.bar(combined_counts, x='immune_checkpoint', y='percentage', color='cell_subtype', \n",
+ " facet_col='dataset', facet_col_wrap=1,\n",
+ " barmode='group',\n",
+ " title='Percentage of Each Immune Checkpoint Type by Cell Subtype',\n",
+ " labels={'immune_checkpoint': 'Immune Checkpoint', 'percentage': 'Percentage', 'cell_subtype': 'Cell Subtype', 'dataset': 'Dataset'})\n",
+ "\n",
+ "# Afficher le graphique\n",
+ "fig.show()\n",
+ "plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 80,
+ "id": "ba1d34e1-ad9d-4d49-a1dd-b31ba1e1348a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " cell_type \n",
+ " cell_subtype \n",
+ " immune_checkpoint \n",
+ " count \n",
+ " percentage \n",
+ " dataset \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " CANCER \n",
+ " CANCER \n",
+ " B7H4 \n",
+ " 10827 \n",
+ " 16.317273 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " CANCER \n",
+ " CANCER \n",
+ " B7H4_PD1 \n",
+ " 140 \n",
+ " 0.210993 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " CANCER \n",
+ " CANCER \n",
+ " B7H4_PDL1 \n",
+ " 19 \n",
+ " 0.028635 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " CANCER \n",
+ " CANCER \n",
+ " None \n",
+ " 52778 \n",
+ " 79.541242 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " CANCER \n",
+ " CANCER \n",
+ " PD1 \n",
+ " 1553 \n",
+ " 2.340512 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 66 \n",
+ " STROMA \n",
+ " STROMA_OTHER \n",
+ " PDL1 \n",
+ " 160 \n",
+ " 0.332226 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 67 \n",
+ " STROMA \n",
+ " αSMA_myCAF \n",
+ " B7H4 \n",
+ " 51 \n",
+ " 0.185266 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 68 \n",
+ " STROMA \n",
+ " αSMA_myCAF \n",
+ " None \n",
+ " 27200 \n",
+ " 98.808486 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 69 \n",
+ " STROMA \n",
+ " αSMA_myCAF \n",
+ " PD1 \n",
+ " 256 \n",
+ " 0.929962 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 70 \n",
+ " STROMA \n",
+ " αSMA_myCAF \n",
+ " PDL1 \n",
+ " 21 \n",
+ " 0.076286 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
135 rows Ć 6 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " cell_type cell_subtype immune_checkpoint count percentage dataset\n",
+ "0 CANCER CANCER B7H4 10827 16.317273 NACT\n",
+ "1 CANCER CANCER B7H4_PD1 140 0.210993 NACT\n",
+ "2 CANCER CANCER B7H4_PDL1 19 0.028635 NACT\n",
+ "3 CANCER CANCER None 52778 79.541242 NACT\n",
+ "4 CANCER CANCER PD1 1553 2.340512 NACT\n",
+ ".. ... ... ... ... ... ...\n",
+ "66 STROMA STROMA_OTHER PDL1 160 0.332226 ACT\n",
+ "67 STROMA αSMA_myCAF B7H4 51 0.185266 ACT\n",
+ "68 STROMA αSMA_myCAF None 27200 98.808486 ACT\n",
+ "69 STROMA αSMA_myCAF PD1 256 0.929962 ACT\n",
+ "70 STROMA αSMA_myCAF PDL1 21 0.076286 ACT\n",
+ "\n",
+ "[135 rows x 6 columns]"
+ ]
+ },
+ "execution_count": 80,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "combined_counts"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9fb00374-bd37-4d47-a465-c0ff2b3a308f",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "289bc49c-6d36-47f1-82d2-28f12df146ff",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "28838faa-aac4-4f8b-a123-a8006c28c45d",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1c82387a-1035-4039-9c71-f7871f219961",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "10453d0f-75fd-487b-a696-7f57bebed76a",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6e497d2e-05dd-4d40-94e0-d3b50906f90e",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a60caf94-300d-4d5f-8111-d2bcd6437fe9",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d8d0c3dc-d5db-452d-af17-ed5fe40c1d61",
+ "metadata": {},
+ "source": [
+ "### V.4.4. NACT VS ACT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 81,
+ "id": "7688f4a2-419f-44a9-b7f3-b22544a32e00",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " dc \n",
+ " b \n",
+ " tcd4 \n",
+ " tcd8 \n",
+ " m1 \n",
+ " m2 \n",
+ " treg \n",
+ " immune_other \n",
+ " cancer \n",
+ " αsma_mycaf \n",
+ " stroma_other \n",
+ " endothelial \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1.csv \n",
+ " 11.0 \n",
+ " 0.0 \n",
+ " 551 \n",
+ " 539 \n",
+ " 73 \n",
+ " 22.0 \n",
+ " 1 \n",
+ " 110 \n",
+ " 8186 \n",
+ " 1143 \n",
+ " 2380 \n",
+ " 283 \n",
+ " \n",
+ " \n",
+ " DD3S3.csv \n",
+ " 27.0 \n",
+ " 44.0 \n",
+ " 1441 \n",
+ " 728 \n",
+ " 69 \n",
+ " 19.0 \n",
+ " 2 \n",
+ " 258 \n",
+ " 13963 \n",
+ " 2334 \n",
+ " 5066 \n",
+ " 321 \n",
+ " \n",
+ " \n",
+ " DD4S1.csv \n",
+ " 48.0 \n",
+ " 3.0 \n",
+ " 1087 \n",
+ " 211 \n",
+ " 26 \n",
+ " 5.0 \n",
+ " 5 \n",
+ " 531 \n",
+ " 8862 \n",
+ " 274 \n",
+ " 843 \n",
+ " 778 \n",
+ " \n",
+ " \n",
+ " DD4S2.csv \n",
+ " 28.0 \n",
+ " 1.0 \n",
+ " 807 \n",
+ " 47 \n",
+ " 78 \n",
+ " 74.0 \n",
+ " 4 \n",
+ " 161 \n",
+ " 6999 \n",
+ " 334 \n",
+ " 619 \n",
+ " 268 \n",
+ " \n",
+ " \n",
+ " DD4S3.csv \n",
+ " 82.0 \n",
+ " 1.0 \n",
+ " 373 \n",
+ " 144 \n",
+ " 55 \n",
+ " 64.0 \n",
+ " 5 \n",
+ " 917 \n",
+ " 5474 \n",
+ " 37 \n",
+ " 708 \n",
+ " 178 \n",
+ " \n",
+ " \n",
+ " DD5S1.csv \n",
+ " 55.0 \n",
+ " 1.0 \n",
+ " 861 \n",
+ " 69 \n",
+ " 342 \n",
+ " 17.0 \n",
+ " 7 \n",
+ " 548 \n",
+ " 6529 \n",
+ " 1776 \n",
+ " 2269 \n",
+ " 758 \n",
+ " \n",
+ " \n",
+ " DD5S2.csv \n",
+ " 71.0 \n",
+ " 0.0 \n",
+ " 413 \n",
+ " 63 \n",
+ " 27 \n",
+ " 4.0 \n",
+ " 5 \n",
+ " 247 \n",
+ " 5963 \n",
+ " 2673 \n",
+ " 3198 \n",
+ " 930 \n",
+ " \n",
+ " \n",
+ " DD5S3.csv \n",
+ " 490.0 \n",
+ " 3.0 \n",
+ " 904 \n",
+ " 230 \n",
+ " 332 \n",
+ " 69.0 \n",
+ " 7 \n",
+ " 312 \n",
+ " 8092 \n",
+ " 2657 \n",
+ " 1428 \n",
+ " 581 \n",
+ " \n",
+ " \n",
+ " DD3S2.csv \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 15 \n",
+ " 7 \n",
+ " 2 \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 17 \n",
+ " 2285 \n",
+ " 1563 \n",
+ " 317 \n",
+ " 119 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " dc b tcd4 tcd8 m1 m2 treg immune_other cancer \\\n",
+ "DD3S1.csv 11.0 0.0 551 539 73 22.0 1 110 8186 \n",
+ "DD3S3.csv 27.0 44.0 1441 728 69 19.0 2 258 13963 \n",
+ "DD4S1.csv 48.0 3.0 1087 211 26 5.0 5 531 8862 \n",
+ "DD4S2.csv 28.0 1.0 807 47 78 74.0 4 161 6999 \n",
+ "DD4S3.csv 82.0 1.0 373 144 55 64.0 5 917 5474 \n",
+ "DD5S1.csv 55.0 1.0 861 69 342 17.0 7 548 6529 \n",
+ "DD5S2.csv 71.0 0.0 413 63 27 4.0 5 247 5963 \n",
+ "DD5S3.csv 490.0 3.0 904 230 332 69.0 7 312 8092 \n",
+ "DD3S2.csv 0.0 0.0 15 7 2 0.0 1 17 2285 \n",
+ "\n",
+ " αsma_mycaf stroma_other endothelial \n",
+ "DD3S1.csv 1143 2380 283 \n",
+ "DD3S3.csv 2334 5066 321 \n",
+ "DD4S1.csv 274 843 778 \n",
+ "DD4S2.csv 334 619 268 \n",
+ "DD4S3.csv 37 708 178 \n",
+ "DD5S1.csv 1776 2269 758 \n",
+ "DD5S2.csv 2673 3198 930 \n",
+ "DD5S3.csv 2657 1428 581 \n",
+ "DD3S2.csv 1563 317 119 "
+ ]
+ },
+ "execution_count": 81,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "#######\n",
+ "####### Count by cell SUBtype !! IN NACT !!\n",
+ "#######\n",
+ "cell_subtypes = ['DC', 'B', 'TCD4', 'TCD8', 'M1', 'M2', 'Treg', \\\n",
+ " 'IMMUNE_OTHER', 'CANCER', 'αSMA_myCAF', 'STROMA_OTHER', 'ENDOTHELIAL']\n",
+ "# Initialisation d'un dictionnaire pour stocker les counts des sous-types de cellules\n",
+ "subtype_counts = {}\n",
+ "\n",
+ "# Boucle sur les sous-types de cellules pour compter les Ʃchantillons correspondants\n",
+ "for subtype in cell_subtypes:\n",
+ " subtype_counts[subtype.lower()] = pd.DataFrame({subtype.lower():\n",
+ " df_NACT.loc[\n",
+ " df_NACT['cell_subtype'] == subtype, 'Sample_ID'].value_counts()\n",
+ " }).sort_index()\n",
+ "\n",
+ "# ConcatƩnation des counts des sous-types de cellules en un seul DataFrame\n",
+ "counts_subtypes = pd.concat([pd.DataFrame(v) for v in subtype_counts.values()], axis=1, sort=False)\n",
+ "counts_subtypes = counts_subtypes.fillna(0)\n",
+ "\n",
+ "# Enregistrement des counts des sous-types de cellules dans un fichier CSV\n",
+ "filename_subtypes = os.path.join(output_data_dir, project_name + \"_cell_subtypes_number.csv\")\n",
+ "counts_subtypes.to_csv(filename_subtypes, index=False)\n",
+ "counts_subtypes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 82,
+ "id": "bbab2efd-bb51-4475-9c3f-75639b9260ba",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " dc \n",
+ " b \n",
+ " tcd4 \n",
+ " tcd8 \n",
+ " m1 \n",
+ " m2 \n",
+ " treg \n",
+ " immune_other \n",
+ " cancer \n",
+ " αsma_mycaf \n",
+ " ... \n",
+ " tcd8_perc \n",
+ " m1_perc \n",
+ " m2_perc \n",
+ " treg_perc \n",
+ " immune_other_perc \n",
+ " cancer_perc \n",
+ " αsma_mycaf_perc \n",
+ " stroma_other_perc \n",
+ " endothelial_perc \n",
+ " Sample_ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1.csv \n",
+ " 11.0 \n",
+ " 0.0 \n",
+ " 551 \n",
+ " 539 \n",
+ " 73 \n",
+ " 22.0 \n",
+ " 1 \n",
+ " 110 \n",
+ " 8186 \n",
+ " 1143 \n",
+ " ... \n",
+ " 4.051649 \n",
+ " 0.548572 \n",
+ " 0.165316 \n",
+ " 0.007514 \n",
+ " 0.826571 \n",
+ " 61.508057 \n",
+ " 8.548777 \n",
+ " 17.789229 \n",
+ " 2.112465 \n",
+ " DD3S1.csv \n",
+ " \n",
+ " \n",
+ " DD3S3.csv \n",
+ " 27.0 \n",
+ " 44.0 \n",
+ " 1441 \n",
+ " 728 \n",
+ " 69 \n",
+ " 19.0 \n",
+ " 2 \n",
+ " 258 \n",
+ " 13963 \n",
+ " 2334 \n",
+ " ... \n",
+ " 2.998571 \n",
+ " 0.284170 \n",
+ " 0.078249 \n",
+ " 0.008237 \n",
+ " 1.062533 \n",
+ " 57.501935 \n",
+ " 9.589089 \n",
+ " 20.805140 \n",
+ " 1.317163 \n",
+ " DD3S3.csv \n",
+ " \n",
+ " \n",
+ " DD4S1.csv \n",
+ " 48.0 \n",
+ " 3.0 \n",
+ " 1087 \n",
+ " 211 \n",
+ " 26 \n",
+ " 5.0 \n",
+ " 5 \n",
+ " 531 \n",
+ " 8862 \n",
+ " 274 \n",
+ " ... \n",
+ " 1.663778 \n",
+ " 0.204988 \n",
+ " 0.039420 \n",
+ " 0.039420 \n",
+ " 4.186401 \n",
+ " 69.844899 \n",
+ " 2.147679 \n",
+ " 6.606528 \n",
+ " 6.093973 \n",
+ " DD4S1.csv \n",
+ " \n",
+ " \n",
+ " DD4S2.csv \n",
+ " 28.0 \n",
+ " 1.0 \n",
+ " 807 \n",
+ " 47 \n",
+ " 78 \n",
+ " 74.0 \n",
+ " 4 \n",
+ " 161 \n",
+ " 6999 \n",
+ " 334 \n",
+ " ... \n",
+ " 0.498469 \n",
+ " 0.827202 \n",
+ " 0.784713 \n",
+ " 0.042413 \n",
+ " 1.707131 \n",
+ " 74.199057 \n",
+ " 3.513225 \n",
+ " 6.508632 \n",
+ " 2.816027 \n",
+ " DD4S2.csv \n",
+ " \n",
+ " \n",
+ " DD4S3.csv \n",
+ " 82.0 \n",
+ " 1.0 \n",
+ " 373 \n",
+ " 144 \n",
+ " 55 \n",
+ " 64.0 \n",
+ " 5 \n",
+ " 917 \n",
+ " 5474 \n",
+ " 37 \n",
+ " ... \n",
+ " 1.790227 \n",
+ " 0.683615 \n",
+ " 0.795412 \n",
+ " 0.062135 \n",
+ " 11.395546 \n",
+ " 67.929123 \n",
+ " 0.455310 \n",
+ " 8.711933 \n",
+ " 2.187943 \n",
+ " DD4S3.csv \n",
+ " \n",
+ " \n",
+ " DD5S1.csv \n",
+ " 55.0 \n",
+ " 1.0 \n",
+ " 861 \n",
+ " 69 \n",
+ " 342 \n",
+ " 17.0 \n",
+ " 7 \n",
+ " 548 \n",
+ " 6529 \n",
+ " 1776 \n",
+ " ... \n",
+ " 0.521190 \n",
+ " 2.583189 \n",
+ " 0.128379 \n",
+ " 0.052861 \n",
+ " 4.138280 \n",
+ " 49.289035 \n",
+ " 13.357759 \n",
+ " 17.048613 \n",
+ " 5.688107 \n",
+ " DD5S1.csv \n",
+ " \n",
+ " \n",
+ " DD5S2.csv \n",
+ " 71.0 \n",
+ " 0.0 \n",
+ " 413 \n",
+ " 63 \n",
+ " 27 \n",
+ " 4.0 \n",
+ " 5 \n",
+ " 247 \n",
+ " 5963 \n",
+ " 2673 \n",
+ " ... \n",
+ " 0.463318 \n",
+ " 0.198558 \n",
+ " 0.029416 \n",
+ " 0.036769 \n",
+ " 1.816405 \n",
+ " 43.845251 \n",
+ " 19.591101 \n",
+ " 23.405353 \n",
+ " 6.794795 \n",
+ " DD5S2.csv \n",
+ " \n",
+ " \n",
+ " DD5S3.csv \n",
+ " 490.0 \n",
+ " 3.0 \n",
+ " 904 \n",
+ " 230 \n",
+ " 332 \n",
+ " 69.0 \n",
+ " 7 \n",
+ " 312 \n",
+ " 8092 \n",
+ " 2657 \n",
+ " ... \n",
+ " 1.521743 \n",
+ " 2.196382 \n",
+ " 0.456411 \n",
+ " 0.046301 \n",
+ " 2.063701 \n",
+ " 53.516636 \n",
+ " 17.510159 \n",
+ " 9.399957 \n",
+ " 3.822127 \n",
+ " DD5S3.csv \n",
+ " \n",
+ " \n",
+ " DD3S2.csv \n",
+ " 0.0 \n",
+ " 0.0 \n",
+ " 15 \n",
+ " 7 \n",
+ " 2 \n",
+ " 0.0 \n",
+ " 1 \n",
+ " 17 \n",
+ " 2285 \n",
+ " 1563 \n",
+ " ... \n",
+ " 0.161799 \n",
+ " 0.046227 \n",
+ " 0.000000 \n",
+ " 0.023113 \n",
+ " 0.392920 \n",
+ " 52.808306 \n",
+ " 35.686731 \n",
+ " 7.179310 \n",
+ " 2.690697 \n",
+ " DD3S2.csv \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
9 rows Ć 25 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " dc b tcd4 tcd8 m1 m2 treg immune_other cancer \\\n",
+ "DD3S1.csv 11.0 0.0 551 539 73 22.0 1 110 8186 \n",
+ "DD3S3.csv 27.0 44.0 1441 728 69 19.0 2 258 13963 \n",
+ "DD4S1.csv 48.0 3.0 1087 211 26 5.0 5 531 8862 \n",
+ "DD4S2.csv 28.0 1.0 807 47 78 74.0 4 161 6999 \n",
+ "DD4S3.csv 82.0 1.0 373 144 55 64.0 5 917 5474 \n",
+ "DD5S1.csv 55.0 1.0 861 69 342 17.0 7 548 6529 \n",
+ "DD5S2.csv 71.0 0.0 413 63 27 4.0 5 247 5963 \n",
+ "DD5S3.csv 490.0 3.0 904 230 332 69.0 7 312 8092 \n",
+ "DD3S2.csv 0.0 0.0 15 7 2 0.0 1 17 2285 \n",
+ "\n",
+ " αsma_mycaf ... tcd8_perc m1_perc m2_perc treg_perc \\\n",
+ "DD3S1.csv 1143 ... 4.051649 0.548572 0.165316 0.007514 \n",
+ "DD3S3.csv 2334 ... 2.998571 0.284170 0.078249 0.008237 \n",
+ "DD4S1.csv 274 ... 1.663778 0.204988 0.039420 0.039420 \n",
+ "DD4S2.csv 334 ... 0.498469 0.827202 0.784713 0.042413 \n",
+ "DD4S3.csv 37 ... 1.790227 0.683615 0.795412 0.062135 \n",
+ "DD5S1.csv 1776 ... 0.521190 2.583189 0.128379 0.052861 \n",
+ "DD5S2.csv 2673 ... 0.463318 0.198558 0.029416 0.036769 \n",
+ "DD5S3.csv 2657 ... 1.521743 2.196382 0.456411 0.046301 \n",
+ "DD3S2.csv 1563 ... 0.161799 0.046227 0.000000 0.023113 \n",
+ "\n",
+ " immune_other_perc cancer_perc αsma_mycaf_perc stroma_other_perc \\\n",
+ "DD3S1.csv 0.826571 61.508057 8.548777 17.789229 \n",
+ "DD3S3.csv 1.062533 57.501935 9.589089 20.805140 \n",
+ "DD4S1.csv 4.186401 69.844899 2.147679 6.606528 \n",
+ "DD4S2.csv 1.707131 74.199057 3.513225 6.508632 \n",
+ "DD4S3.csv 11.395546 67.929123 0.455310 8.711933 \n",
+ "DD5S1.csv 4.138280 49.289035 13.357759 17.048613 \n",
+ "DD5S2.csv 1.816405 43.845251 19.591101 23.405353 \n",
+ "DD5S3.csv 2.063701 53.516636 17.510159 9.399957 \n",
+ "DD3S2.csv 0.392920 52.808306 35.686731 7.179310 \n",
+ "\n",
+ " endothelial_perc Sample_ID \n",
+ "DD3S1.csv 2.112465 DD3S1.csv \n",
+ "DD3S3.csv 1.317163 DD3S3.csv \n",
+ "DD4S1.csv 6.093973 DD4S1.csv \n",
+ "DD4S2.csv 2.816027 DD4S2.csv \n",
+ "DD4S3.csv 2.187943 DD4S3.csv \n",
+ "DD5S1.csv 5.688107 DD5S1.csv \n",
+ "DD5S2.csv 6.794795 DD5S2.csv \n",
+ "DD5S3.csv 3.822127 DD5S3.csv \n",
+ "DD3S2.csv 2.690697 DD3S2.csv \n",
+ "\n",
+ "[9 rows x 25 columns]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Ajout des colonnes de pourcentages pour chaque sous-type de cellules\n",
+ "counts_perc = counts_subtypes.copy()\n",
+ "\n",
+ "# Calcul des pourcentages pour chaque sous-type de cellules\n",
+ "for col in counts_perc.columns:\n",
+ " counts_perc[col + '_perc'] = (counts_perc[col] / counts_perc.sum(axis=1)) * 100\n",
+ "\n",
+ "# Affichage des pourcentages des sous-types de cellules\n",
+ "\n",
+ "counts_perc['Sample_ID'] = counts_perc.index\n",
+ "counts_perc.columns.values\n",
+ "display(counts_perc)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 83,
+ "id": "dfd8e431-e4ae-414b-ab2c-a8045567977f",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "marker": {
+ "color": "rgb(166, 206, 227)"
+ },
+ "name": "DC",
+ "text": [
+ 0.0827129859387924,
+ 0.11123928806855636,
+ 0.3787579894263395,
+ 0.29723991507431,
+ 1.0201542672306545,
+ 0.4156590084643289,
+ 0.5222892452552597,
+ 3.243958953988745,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "DD3S2.csv"
+ ],
+ "y": [
+ 0.0827129859387924,
+ 0.11123928806855636,
+ 0.3787579894263395,
+ 0.29723991507431,
+ 1.0201542672306545,
+ 0.4156590084643289,
+ 0.5222892452552597,
+ 3.243958953988745,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(31, 120, 180)"
+ },
+ "name": "B",
+ "text": [
+ 0,
+ 0.1812780090129917,
+ 0.023671666863966878,
+ 0.010615376293678553,
+ 0.012439326942963133,
+ 0.00755719912198505,
+ 0,
+ 0.019856708748881652,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "DD3S2.csv"
+ ],
+ "y": [
+ 0,
+ 0.1812780090129917,
+ 0.023671666863966878,
+ 0.010615376293678553,
+ 0.012439326942963133,
+ 0.00755719912198505,
+ 0,
+ 0.019856708748881652,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(178, 223, 138)"
+ },
+ "name": "TCD4",
+ "text": [
+ 4.143142891065517,
+ 5.936810455679476,
+ 8.577017939999875,
+ 8.566599015622506,
+ 4.639861770149079,
+ 6.506744727945322,
+ 3.037988325097145,
+ 5.98348037226371,
+ 0.34674063800277394
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "DD3S2.csv"
+ ],
+ "y": [
+ 4.143142891065517,
+ 5.936810455679476,
+ 8.577017939999875,
+ 8.566599015622506,
+ 4.639861770149079,
+ 6.506744727945322,
+ 3.037988325097145,
+ 5.98348037226371,
+ 0.34674063800277394
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(51, 160, 44)"
+ },
+ "name": "TCD8",
+ "text": [
+ 4.051648869525014,
+ 2.9985712309250405,
+ 1.6637781260558058,
+ 0.4984688281487404,
+ 1.7902270486407794,
+ 0.5211901581442018,
+ 0.4633184094349682,
+ 1.5217429984775828,
+ 0.161799329079382
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "DD3S2.csv"
+ ],
+ "y": [
+ 4.051648869525014,
+ 2.9985712309250405,
+ 1.6637781260558058,
+ 0.4984688281487404,
+ 1.7902270486407794,
+ 0.5211901581442018,
+ 0.4633184094349682,
+ 1.5217429984775828,
+ 0.161799329079382
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(251, 154, 153)"
+ },
+ "name": "M1",
+ "text": [
+ 0.5485720123741454,
+ 0.2841701428241529,
+ 0.2049884212074979,
+ 0.8272024092781988,
+ 0.683615127818909,
+ 2.583188654098764,
+ 0.19855826701155652,
+ 2.19638179931617,
+ 0.046226650924748126
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "DD3S2.csv"
+ ],
+ "y": [
+ 0.5485720123741454,
+ 0.2841701428241529,
+ 0.2049884212074979,
+ 0.8272024092781988,
+ 0.683615127818909,
+ 2.583188654098764,
+ 0.19855826701155652,
+ 2.19638179931617,
+ 0.046226650924748126
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(227, 26, 28)"
+ },
+ "name": "M2",
+ "text": [
+ 0.1653162573143431,
+ 0.0782488337048752,
+ 0.03942021313708706,
+ 0.7847129330749794,
+ 0.795411836093024,
+ 0.12837906596399754,
+ 0.029415610030689036,
+ 0.45641062192745147,
+ 0
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "DD3S2.csv"
+ ],
+ "y": [
+ 0.1653162573143431,
+ 0.0782488337048752,
+ 0.03942021313708706,
+ 0.7847129330749794,
+ 0.795411836093024,
+ 0.12837906596399754,
+ 0.029415610030689036,
+ 0.45641062192745147,
+ 0
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(253, 191, 111)"
+ },
+ "name": "Treg",
+ "text": [
+ 0.007514281986421941,
+ 0.008236692794049295,
+ 0.03942009062313482,
+ 0.04241338596665315,
+ 0.06213540722152419,
+ 0.05286145585611015,
+ 0.036769432998897254,
+ 0.046301129033429325,
+ 0.02311307851031047
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "DD3S2.csv"
+ ],
+ "y": [
+ 0.007514281986421941,
+ 0.008236692794049295,
+ 0.03942009062313482,
+ 0.04241338596665315,
+ 0.06213540722152419,
+ 0.05286145585611015,
+ 0.036769432998897254,
+ 0.046301129033429325,
+ 0.02311307851031047
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(1.0, 0.4980392156862745, 0.0)"
+ },
+ "name": "IMMUNE_OTHER",
+ "text": [
+ 0.8265705517880316,
+ 1.0625330100046495,
+ 4.186400613316501,
+ 1.7071311077824347,
+ 11.395545692380658,
+ 4.138280310256386,
+ 1.8164050786181491,
+ 2.063701145273896,
+ 0.3929202356388057
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "DD3S2.csv"
+ ],
+ "y": [
+ 0.8265705517880316,
+ 1.0625330100046495,
+ 4.186400613316501,
+ 1.7071311077824347,
+ 11.395545692380658,
+ 4.138280310256386,
+ 1.8164050786181491,
+ 2.063701145273896,
+ 0.3929202356388057
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(202, 178, 214)"
+ },
+ "name": "CANCER",
+ "text": [
+ 61.50805729344066,
+ 57.50193502100974,
+ 69.84489878174446,
+ 74.19905740837119,
+ 67.92912258071058,
+ 49.28903507122674,
+ 43.84525054830309,
+ 53.516636114275805,
+ 52.8083064493023
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "DD3S2.csv"
+ ],
+ "y": [
+ 61.50805729344066,
+ 57.50193502100974,
+ 69.84489878174446,
+ 74.19905740837119,
+ 67.92912258071058,
+ 49.28903507122674,
+ 43.84525054830309,
+ 53.516636114275805,
+ 52.8083064493023
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(106, 61, 154)"
+ },
+ "name": "αSMA_myCAF",
+ "text": [
+ 8.548777014392844,
+ 9.589089431425785,
+ 2.147679059615977,
+ 3.5132253959133983,
+ 0.45531016793807066,
+ 13.357759485108605,
+ 19.591100824877437,
+ 17.51015890901156,
+ 35.68673127196452
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "DD3S2.csv"
+ ],
+ "y": [
+ 8.548777014392844,
+ 9.589089431425785,
+ 2.147679059615977,
+ 3.5132253959133983,
+ 0.45531016793807066,
+ 13.357759485108605,
+ 19.591100824877437,
+ 17.51015890901156,
+ 35.68673127196452
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(1.0, 1.0, 0.6)"
+ },
+ "name": "STROMA_OTHER",
+ "text": [
+ 17.789228909183365,
+ 20.805139931914812,
+ 6.606528173248096,
+ 6.508632262536575,
+ 8.711933470860176,
+ 17.048612880820258,
+ 23.40535281148082,
+ 9.39995713999546,
+ 7.179310443232148
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "DD3S2.csv"
+ ],
+ "y": [
+ 17.789228909183365,
+ 20.805139931914812,
+ 6.606528173248096,
+ 6.508632262536575,
+ 8.711933470860176,
+ 17.048612880820258,
+ 23.40535281148082,
+ 9.39995713999546,
+ 7.179310443232148
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(177, 89, 40)"
+ },
+ "name": "ENDOTHELIAL",
+ "text": [
+ 2.112465018885279,
+ 1.3171631517495686,
+ 6.093972871074612,
+ 2.8160266766751407,
+ 2.1879428780169374,
+ 5.6881074409594685,
+ 6.794795343838826,
+ 3.8221273791194568,
+ 2.6906974449716654
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv",
+ "DD3S2.csv"
+ ],
+ "y": [
+ 2.112465018885279,
+ 1.3171631517495686,
+ 6.093972871074612,
+ 2.8160266766751407,
+ 2.1879428780169374,
+ 5.6881074409594685,
+ 6.794795343838826,
+ 3.8221273791194568,
+ 2.6906974449716654
+ ]
+ }
+ ],
+ "layout": {
+ "barmode": "stack",
+ "plot_bgcolor": "white",
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "NACT_patients_Cell subtypes proportions by Sample ID and tissue type"
+ },
+ "xaxis": {
+ "autorange": true,
+ "linecolor": "black",
+ "range": [
+ -0.5,
+ 8.5
+ ],
+ "type": "category"
+ },
+ "yaxis": {
+ "autorange": true,
+ "linecolor": "black",
+ "range": [
+ 0,
+ 105.1309633674881
+ ],
+ "title": {
+ "text": "Cell count (%)"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 83,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "fig = go.Figure()\n",
+ "title = 'NACT_patients_Cell subtypes proportions by Sample ID and tissue type'\n",
+ "\n",
+ "for cell_subtype in cell_subtypes:\n",
+ " fig.add_trace(\n",
+ " go.Bar(\n",
+ " name=cell_subtype,\n",
+ " x=counts_perc['Sample_ID'],\n",
+ " y=counts_perc[f'{cell_subtype.lower()}_perc'],\n",
+ " text=counts_perc[f'{cell_subtype.lower()}_perc'],\n",
+ " textposition='auto',\n",
+ " marker_color='rgb' + str(cell_subtype_color_dict[cell_subtype])))\n",
+ "\n",
+ "fig.update_layout(\n",
+ " plot_bgcolor='white',\n",
+ " barmode='stack',\n",
+ " xaxis=dict(linecolor='black'),\n",
+ " title=title,\n",
+ " yaxis=dict(title='Cell count (%)', linecolor='black')\n",
+ ")\n",
+ "\n",
+ "# Enregistrer l'image\n",
+ "output_filename = title.replace(\" \", \"_\") + \".png\"\n",
+ "#fig.write_image(output_images_dir + \"/\" + output_filename, scale=1000)\n",
+ "\n",
+ "# Afficher le graphique\n",
+ "fig.show()\n",
+ "plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 84,
+ "id": "ea307a4d-0bfa-41e3-b3e3-feee3254e12d",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " dc \n",
+ " b \n",
+ " tcd4 \n",
+ " tcd8 \n",
+ " m1 \n",
+ " m2 \n",
+ " treg \n",
+ " immune_other \n",
+ " cancer \n",
+ " αsma_mycaf \n",
+ " stroma_other \n",
+ " endothelial \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1.csv \n",
+ " 70 \n",
+ " 0.0 \n",
+ " 2440 \n",
+ " 2310 \n",
+ " 237 \n",
+ " 107 \n",
+ " 5 \n",
+ " 884 \n",
+ " 40795 \n",
+ " 2824 \n",
+ " 4343 \n",
+ " 1383 \n",
+ " \n",
+ " \n",
+ " DD3S2.csv \n",
+ " 294 \n",
+ " 0.0 \n",
+ " 1900 \n",
+ " 2343 \n",
+ " 92 \n",
+ " 25 \n",
+ " 37 \n",
+ " 1244 \n",
+ " 48774 \n",
+ " 3226 \n",
+ " 6958 \n",
+ " 1631 \n",
+ " \n",
+ " \n",
+ " DD3S3.csv \n",
+ " 253 \n",
+ " 94.0 \n",
+ " 5416 \n",
+ " 2822 \n",
+ " 183 \n",
+ " 77 \n",
+ " 26 \n",
+ " 1616 \n",
+ " 63037 \n",
+ " 5090 \n",
+ " 10922 \n",
+ " 2457 \n",
+ " \n",
+ " \n",
+ " DD4S1.csv \n",
+ " 224 \n",
+ " 26.0 \n",
+ " 1580 \n",
+ " 1739 \n",
+ " 50 \n",
+ " 33 \n",
+ " 7 \n",
+ " 1858 \n",
+ " 45151 \n",
+ " 2832 \n",
+ " 3300 \n",
+ " 1275 \n",
+ " \n",
+ " \n",
+ " DD4S2.csv \n",
+ " 102 \n",
+ " 13.0 \n",
+ " 1131 \n",
+ " 1647 \n",
+ " 34 \n",
+ " 28 \n",
+ " 15 \n",
+ " 680 \n",
+ " 32471 \n",
+ " 1330 \n",
+ " 3910 \n",
+ " 964 \n",
+ " \n",
+ " \n",
+ " DD4S3.csv \n",
+ " 1068 \n",
+ " 30.0 \n",
+ " 1980 \n",
+ " 2796 \n",
+ " 100 \n",
+ " 264 \n",
+ " 33 \n",
+ " 2419 \n",
+ " 45124 \n",
+ " 3649 \n",
+ " 4122 \n",
+ " 1195 \n",
+ " \n",
+ " \n",
+ " DD5S1.csv \n",
+ " 528 \n",
+ " 138.0 \n",
+ " 1979 \n",
+ " 467 \n",
+ " 162 \n",
+ " 11 \n",
+ " 21 \n",
+ " 672 \n",
+ " 37194 \n",
+ " 5200 \n",
+ " 7822 \n",
+ " 2037 \n",
+ " \n",
+ " \n",
+ " DD5S2.csv \n",
+ " 89 \n",
+ " 16.0 \n",
+ " 722 \n",
+ " 82 \n",
+ " 104 \n",
+ " 59 \n",
+ " 9 \n",
+ " 220 \n",
+ " 24876 \n",
+ " 1203 \n",
+ " 4024 \n",
+ " 405 \n",
+ " \n",
+ " \n",
+ " DD5S3.csv \n",
+ " 977 \n",
+ " 32.0 \n",
+ " 1096 \n",
+ " 457 \n",
+ " 147 \n",
+ " 41 \n",
+ " 6 \n",
+ " 553 \n",
+ " 21968 \n",
+ " 2174 \n",
+ " 2759 \n",
+ " 583 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " dc b tcd4 tcd8 m1 m2 treg immune_other cancer \\\n",
+ "DD3S1.csv 70 0.0 2440 2310 237 107 5 884 40795 \n",
+ "DD3S2.csv 294 0.0 1900 2343 92 25 37 1244 48774 \n",
+ "DD3S3.csv 253 94.0 5416 2822 183 77 26 1616 63037 \n",
+ "DD4S1.csv 224 26.0 1580 1739 50 33 7 1858 45151 \n",
+ "DD4S2.csv 102 13.0 1131 1647 34 28 15 680 32471 \n",
+ "DD4S3.csv 1068 30.0 1980 2796 100 264 33 2419 45124 \n",
+ "DD5S1.csv 528 138.0 1979 467 162 11 21 672 37194 \n",
+ "DD5S2.csv 89 16.0 722 82 104 59 9 220 24876 \n",
+ "DD5S3.csv 977 32.0 1096 457 147 41 6 553 21968 \n",
+ "\n",
+ " αsma_mycaf stroma_other endothelial \n",
+ "DD3S1.csv 2824 4343 1383 \n",
+ "DD3S2.csv 3226 6958 1631 \n",
+ "DD3S3.csv 5090 10922 2457 \n",
+ "DD4S1.csv 2832 3300 1275 \n",
+ "DD4S2.csv 1330 3910 964 \n",
+ "DD4S3.csv 3649 4122 1195 \n",
+ "DD5S1.csv 5200 7822 2037 \n",
+ "DD5S2.csv 1203 4024 405 \n",
+ "DD5S3.csv 2174 2759 583 "
+ ]
+ },
+ "execution_count": 84,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "#######\n",
+ "####### Count by cell SUBtype !! IN ACT !!\n",
+ "#######\n",
+ "cell_subtypes = ['DC', 'B', 'TCD4', 'TCD8', 'M1', 'M2', 'Treg', \\\n",
+ " 'IMMUNE_OTHER', 'CANCER', 'αSMA_myCAF', 'STROMA_OTHER', 'ENDOTHELIAL']\n",
+ "# Initialisation d'un dictionnaire pour stocker les counts des sous-types de cellules\n",
+ "subtype_counts = {}\n",
+ "\n",
+ "# Boucle sur les sous-types de cellules pour compter les Ʃchantillons correspondants\n",
+ "for subtype in cell_subtypes:\n",
+ " subtype_counts[subtype.lower()] = pd.DataFrame({subtype.lower():\n",
+ " df_ACT.loc[\n",
+ " df_ACT['cell_subtype'] == subtype, 'Sample_ID'].value_counts()\n",
+ " }).sort_index()\n",
+ "\n",
+ "# ConcatƩnation des counts des sous-types de cellules en un seul DataFrame\n",
+ "counts_subtypes = pd.concat([pd.DataFrame(v) for v in subtype_counts.values()], axis=1, sort=False)\n",
+ "counts_subtypes = counts_subtypes.fillna(0)\n",
+ "\n",
+ "# Enregistrement des counts des sous-types de cellules dans un fichier CSV\n",
+ "filename_subtypes = os.path.join(output_data_dir, project_name + \"_cell_subtypes_number.csv\")\n",
+ "counts_subtypes.to_csv(filename_subtypes, index=False)\n",
+ "counts_subtypes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 85,
+ "id": "41dcf9da-7ae4-49e7-9062-1c762dbc9b9e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " dc \n",
+ " b \n",
+ " tcd4 \n",
+ " tcd8 \n",
+ " m1 \n",
+ " m2 \n",
+ " treg \n",
+ " immune_other \n",
+ " cancer \n",
+ " αsma_mycaf \n",
+ " ... \n",
+ " tcd8_perc \n",
+ " m1_perc \n",
+ " m2_perc \n",
+ " treg_perc \n",
+ " immune_other_perc \n",
+ " cancer_perc \n",
+ " αsma_mycaf_perc \n",
+ " stroma_other_perc \n",
+ " endothelial_perc \n",
+ " Sample_ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1.csv \n",
+ " 70 \n",
+ " 0.0 \n",
+ " 2440 \n",
+ " 2310 \n",
+ " 237 \n",
+ " 107 \n",
+ " 5 \n",
+ " 884 \n",
+ " 40795 \n",
+ " 2824 \n",
+ " ... \n",
+ " 4.169485 \n",
+ " 0.427746 \n",
+ " 0.193116 \n",
+ " 0.009024 \n",
+ " 1.595457 \n",
+ " 73.625322 \n",
+ " 5.089889 \n",
+ " 7.826968 \n",
+ " 2.492095 \n",
+ " DD3S1.csv \n",
+ " \n",
+ " \n",
+ " DD3S2.csv \n",
+ " 294 \n",
+ " 0.0 \n",
+ " 1900 \n",
+ " 2343 \n",
+ " 92 \n",
+ " 25 \n",
+ " 37 \n",
+ " 1244 \n",
+ " 48774 \n",
+ " 3226 \n",
+ " ... \n",
+ " 3.521863 \n",
+ " 0.138282 \n",
+ " 0.037576 \n",
+ " 0.055613 \n",
+ " 1.869804 \n",
+ " 73.308069 \n",
+ " 4.843391 \n",
+ " 10.445711 \n",
+ " 2.448158 \n",
+ " DD3S2.csv \n",
+ " \n",
+ " \n",
+ " DD3S3.csv \n",
+ " 253 \n",
+ " 94.0 \n",
+ " 5416 \n",
+ " 2822 \n",
+ " 183 \n",
+ " 77 \n",
+ " 26 \n",
+ " 1616 \n",
+ " 63037 \n",
+ " 5090 \n",
+ " ... \n",
+ " 3.067416 \n",
+ " 0.198908 \n",
+ " 0.083693 \n",
+ " 0.028260 \n",
+ " 1.756471 \n",
+ " 68.515202 \n",
+ " 5.528227 \n",
+ " 11.861625 \n",
+ " 2.668033 \n",
+ " DD3S3.csv \n",
+ " \n",
+ " \n",
+ " DD4S1.csv \n",
+ " 224 \n",
+ " 26.0 \n",
+ " 1580 \n",
+ " 1739 \n",
+ " 50 \n",
+ " 33 \n",
+ " 7 \n",
+ " 1858 \n",
+ " 45151 \n",
+ " 2832 \n",
+ " ... \n",
+ " 2.994241 \n",
+ " 0.086086 \n",
+ " 0.056817 \n",
+ " 0.012052 \n",
+ " 3.198964 \n",
+ " 77.733303 \n",
+ " 4.869139 \n",
+ " 5.673310 \n",
+ " 2.191747 \n",
+ " DD4S1.csv \n",
+ " \n",
+ " \n",
+ " DD4S2.csv \n",
+ " 102 \n",
+ " 13.0 \n",
+ " 1131 \n",
+ " 1647 \n",
+ " 34 \n",
+ " 28 \n",
+ " 15 \n",
+ " 680 \n",
+ " 32471 \n",
+ " 1330 \n",
+ " ... \n",
+ " 3.891047 \n",
+ " 0.080318 \n",
+ " 0.066144 \n",
+ " 0.035434 \n",
+ " 1.606349 \n",
+ " 76.702624 \n",
+ " 3.136029 \n",
+ " 9.218771 \n",
+ " 2.272369 \n",
+ " DD4S2.csv \n",
+ " \n",
+ " \n",
+ " DD4S3.csv \n",
+ " 1068 \n",
+ " 30.0 \n",
+ " 1980 \n",
+ " 2796 \n",
+ " 100 \n",
+ " 264 \n",
+ " 33 \n",
+ " 2419 \n",
+ " 45124 \n",
+ " 3649 \n",
+ " ... \n",
+ " 4.453300 \n",
+ " 0.159263 \n",
+ " 0.420452 \n",
+ " 0.052556 \n",
+ " 3.852525 \n",
+ " 71.860551 \n",
+ " 5.804437 \n",
+ " 6.556229 \n",
+ " 1.900504 \n",
+ " DD4S3.csv \n",
+ " \n",
+ " \n",
+ " DD5S1.csv \n",
+ " 528 \n",
+ " 138.0 \n",
+ " 1979 \n",
+ " 467 \n",
+ " 162 \n",
+ " 11 \n",
+ " 21 \n",
+ " 672 \n",
+ " 37194 \n",
+ " 5200 \n",
+ " ... \n",
+ " 0.830433 \n",
+ " 0.288069 \n",
+ " 0.019560 \n",
+ " 0.037342 \n",
+ " 1.194945 \n",
+ " 66.136689 \n",
+ " 9.235544 \n",
+ " 13.890111 \n",
+ " 3.616361 \n",
+ " DD5S1.csv \n",
+ " \n",
+ " \n",
+ " DD5S2.csv \n",
+ " 89 \n",
+ " 16.0 \n",
+ " 722 \n",
+ " 82 \n",
+ " 104 \n",
+ " 59 \n",
+ " 9 \n",
+ " 220 \n",
+ " 24876 \n",
+ " 1203 \n",
+ " ... \n",
+ " 0.257768 \n",
+ " 0.326922 \n",
+ " 0.185464 \n",
+ " 0.028291 \n",
+ " 0.691554 \n",
+ " 78.194228 \n",
+ " 3.772191 \n",
+ " 12.616375 \n",
+ " 1.269287 \n",
+ " DD5S2.csv \n",
+ " \n",
+ " \n",
+ " DD5S3.csv \n",
+ " 977 \n",
+ " 32.0 \n",
+ " 1096 \n",
+ " 457 \n",
+ " 147 \n",
+ " 41 \n",
+ " 6 \n",
+ " 553 \n",
+ " 21968 \n",
+ " 2174 \n",
+ " ... \n",
+ " 1.483774 \n",
+ " 0.477252 \n",
+ " 0.133109 \n",
+ " 0.019479 \n",
+ " 1.795341 \n",
+ " 71.316005 \n",
+ " 7.041282 \n",
+ " 8.933977 \n",
+ " 1.887279 \n",
+ " DD5S3.csv \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
9 rows Ć 25 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " dc b tcd4 tcd8 m1 m2 treg immune_other cancer \\\n",
+ "DD3S1.csv 70 0.0 2440 2310 237 107 5 884 40795 \n",
+ "DD3S2.csv 294 0.0 1900 2343 92 25 37 1244 48774 \n",
+ "DD3S3.csv 253 94.0 5416 2822 183 77 26 1616 63037 \n",
+ "DD4S1.csv 224 26.0 1580 1739 50 33 7 1858 45151 \n",
+ "DD4S2.csv 102 13.0 1131 1647 34 28 15 680 32471 \n",
+ "DD4S3.csv 1068 30.0 1980 2796 100 264 33 2419 45124 \n",
+ "DD5S1.csv 528 138.0 1979 467 162 11 21 672 37194 \n",
+ "DD5S2.csv 89 16.0 722 82 104 59 9 220 24876 \n",
+ "DD5S3.csv 977 32.0 1096 457 147 41 6 553 21968 \n",
+ "\n",
+ " αsma_mycaf ... tcd8_perc m1_perc m2_perc treg_perc \\\n",
+ "DD3S1.csv 2824 ... 4.169485 0.427746 0.193116 0.009024 \n",
+ "DD3S2.csv 3226 ... 3.521863 0.138282 0.037576 0.055613 \n",
+ "DD3S3.csv 5090 ... 3.067416 0.198908 0.083693 0.028260 \n",
+ "DD4S1.csv 2832 ... 2.994241 0.086086 0.056817 0.012052 \n",
+ "DD4S2.csv 1330 ... 3.891047 0.080318 0.066144 0.035434 \n",
+ "DD4S3.csv 3649 ... 4.453300 0.159263 0.420452 0.052556 \n",
+ "DD5S1.csv 5200 ... 0.830433 0.288069 0.019560 0.037342 \n",
+ "DD5S2.csv 1203 ... 0.257768 0.326922 0.185464 0.028291 \n",
+ "DD5S3.csv 2174 ... 1.483774 0.477252 0.133109 0.019479 \n",
+ "\n",
+ " immune_other_perc cancer_perc αsma_mycaf_perc stroma_other_perc \\\n",
+ "DD3S1.csv 1.595457 73.625322 5.089889 7.826968 \n",
+ "DD3S2.csv 1.869804 73.308069 4.843391 10.445711 \n",
+ "DD3S3.csv 1.756471 68.515202 5.528227 11.861625 \n",
+ "DD4S1.csv 3.198964 77.733303 4.869139 5.673310 \n",
+ "DD4S2.csv 1.606349 76.702624 3.136029 9.218771 \n",
+ "DD4S3.csv 3.852525 71.860551 5.804437 6.556229 \n",
+ "DD5S1.csv 1.194945 66.136689 9.235544 13.890111 \n",
+ "DD5S2.csv 0.691554 78.194228 3.772191 12.616375 \n",
+ "DD5S3.csv 1.795341 71.316005 7.041282 8.933977 \n",
+ "\n",
+ " endothelial_perc Sample_ID \n",
+ "DD3S1.csv 2.492095 DD3S1.csv \n",
+ "DD3S2.csv 2.448158 DD3S2.csv \n",
+ "DD3S3.csv 2.668033 DD3S3.csv \n",
+ "DD4S1.csv 2.191747 DD4S1.csv \n",
+ "DD4S2.csv 2.272369 DD4S2.csv \n",
+ "DD4S3.csv 1.900504 DD4S3.csv \n",
+ "DD5S1.csv 3.616361 DD5S1.csv \n",
+ "DD5S2.csv 1.269287 DD5S2.csv \n",
+ "DD5S3.csv 1.887279 DD5S3.csv \n",
+ "\n",
+ "[9 rows x 25 columns]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Ajout des colonnes de pourcentages pour chaque sous-type de cellules\n",
+ "counts_perc = counts_subtypes.copy()\n",
+ "\n",
+ "# Calcul des pourcentages pour chaque sous-type de cellules\n",
+ "for col in counts_perc.columns:\n",
+ " counts_perc[col + '_perc'] = (counts_perc[col] / counts_perc.sum(axis=1)) * 100\n",
+ "\n",
+ "# Affichage des pourcentages des sous-types de cellules\n",
+ "\n",
+ "counts_perc['Sample_ID'] = counts_perc.index\n",
+ "counts_perc.columns.values\n",
+ "display(counts_perc)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 86,
+ "id": "7fe02123-a51b-41d3-a874-1dfdefe193a2",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "marker": {
+ "color": "rgb(166, 206, 227)"
+ },
+ "name": "DC",
+ "text": [
+ 0.1263583522870862,
+ 0.44194576393482055,
+ 0.27502092550520146,
+ 0.3857081360309944,
+ 0.24099232132309512,
+ 1.7011787193373686,
+ 0.9389838345396667,
+ 0.2797950265648087,
+ 3.1727990127626406
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv"
+ ],
+ "y": [
+ 0.1263583522870862,
+ 0.44194576393482055,
+ 0.27502092550520146,
+ 0.3857081360309944,
+ 0.24099232132309512,
+ 1.7011787193373686,
+ 0.9389838345396667,
+ 0.2797950265648087,
+ 3.1727990127626406
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(31, 120, 180)"
+ },
+ "name": "B",
+ "text": [
+ 0,
+ 0,
+ 0.10218138225714654,
+ 0.04476939702245929,
+ 0.030714532735580807,
+ 0.047784624240428966,
+ 0.24541213142173884,
+ 0.0502997870530273,
+ 0.10390901560672446
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv"
+ ],
+ "y": [
+ 0,
+ 0,
+ 0.10218138225714654,
+ 0.04476939702245929,
+ 0.030714532735580807,
+ 0.047784624240428966,
+ 0.24541213142173884,
+ 0.0502997870530273,
+ 0.10390901560672446
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(178, 223, 138)"
+ },
+ "name": "TCD4",
+ "text": [
+ 4.404481090599421,
+ 2.8560931056723975,
+ 5.887380336183737,
+ 2.7205997217898124,
+ 2.6721624088637532,
+ 3.1537827994503047,
+ 3.5193368731056647,
+ 2.2697743015899574,
+ 3.558871776581617
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv"
+ ],
+ "y": [
+ 4.404481090599421,
+ 2.8560931056723975,
+ 5.887380336183737,
+ 2.7205997217898124,
+ 2.6721624088637532,
+ 3.1537827994503047,
+ 3.5193368731056647,
+ 2.2697743015899574,
+ 3.558871776581617
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(51, 160, 44)"
+ },
+ "name": "TCD8",
+ "text": [
+ 4.169484615593472,
+ 3.5218625572784665,
+ 3.067415824248211,
+ 2.9942413243954746,
+ 3.8910465509192713,
+ 4.453299882146847,
+ 0.8304332817076379,
+ 0.2577676078454985,
+ 1.4837741546245424
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv"
+ ],
+ "y": [
+ 4.169484615593472,
+ 3.5218625572784665,
+ 3.067415824248211,
+ 2.9942413243954746,
+ 3.8910465509192713,
+ 4.453299882146847,
+ 0.8304332817076379,
+ 0.2577676078454985,
+ 1.4837741546245424
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(251, 154, 153)"
+ },
+ "name": "M1",
+ "text": [
+ 0.4277461004063633,
+ 0.13828177698141805,
+ 0.19890800159614094,
+ 0.08608645667323953,
+ 0.0803178035339514,
+ 0.15926266217270818,
+ 0.2880689615783534,
+ 0.3269221218943977,
+ 0.47725228361395766
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv"
+ ],
+ "y": [
+ 0.4277461004063633,
+ 0.13828177698141805,
+ 0.19890800159614094,
+ 0.08608645667323953,
+ 0.0803178035339514,
+ 0.15926266217270818,
+ 0.2880689615783534,
+ 0.3269221218943977,
+ 0.47725228361395766
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(227, 26, 28)"
+ },
+ "name": "M2",
+ "text": [
+ 0.19311594685888067,
+ 0.03757649173059919,
+ 0.08369334978216912,
+ 0.05681697719160057,
+ 0.0661439480011151,
+ 0.4204523616755389,
+ 0.019560137935990707,
+ 0.18546352857617837,
+ 0.1331091186794271
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv"
+ ],
+ "y": [
+ 0.19311594685888067,
+ 0.03757649173059919,
+ 0.08369334978216912,
+ 0.05681697719160057,
+ 0.0661439480011151,
+ 0.4204523616755389,
+ 0.019560137935990707,
+ 0.18546352857617837,
+ 0.1331091186794271
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(253, 191, 111)"
+ },
+ "name": "Treg",
+ "text": [
+ 0.009024078213789965,
+ 0.0556131763511265,
+ 0.028260066426471966,
+ 0.012052074281208806,
+ 0.03543420249152224,
+ 0.052556193281648726,
+ 0.03734206852594778,
+ 0.02829088179745908,
+ 0.019479299042123373
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv"
+ ],
+ "y": [
+ 0.009024078213789965,
+ 0.0556131763511265,
+ 0.028260066426471966,
+ 0.012052074281208806,
+ 0.03543420249152224,
+ 0.052556193281648726,
+ 0.03734206852594778,
+ 0.02829088179745908,
+ 0.019479299042123373
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(1.0, 0.4980392156862745, 0.0)"
+ },
+ "name": "IMMUNE_OTHER",
+ "text": [
+ 1.5954567683492522,
+ 1.869803609487587,
+ 1.7564712814403198,
+ 3.19896419541581,
+ 1.6063491683461841,
+ 3.852525004110784,
+ 1.1949453993694665,
+ 0.6915542733800497,
+ 1.795340926332853
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv"
+ ],
+ "y": [
+ 1.5954567683492522,
+ 1.869803609487587,
+ 1.7564712814403198,
+ 3.19896419541581,
+ 1.6063491683461841,
+ 3.852525004110784,
+ 1.1949453993694665,
+ 0.6915542733800497,
+ 1.795340926332853
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(202, 178, 214)"
+ },
+ "name": "CANCER",
+ "text": [
+ 73.62532211002868,
+ 73.3080693550564,
+ 68.5152019449635,
+ 77.73330336338945,
+ 76.70262447548536,
+ 71.86055096289236,
+ 66.1366887232176,
+ 78.19422792185516,
+ 71.31600502211866
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv"
+ ],
+ "y": [
+ 73.62532211002868,
+ 73.3080693550564,
+ 68.5152019449635,
+ 77.73330336338945,
+ 76.70262447548536,
+ 71.86055096289236,
+ 66.1366887232176,
+ 78.19422792185516,
+ 71.31600502211866
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(106, 61, 154)"
+ },
+ "name": "αSMA_myCAF",
+ "text": [
+ 5.089888531903868,
+ 4.8433908307482465,
+ 5.528227303122323,
+ 4.869139089480771,
+ 3.1360287273659497,
+ 5.8044369491344945,
+ 9.235543716457371,
+ 3.772190534565567,
+ 7.041281739806083
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv"
+ ],
+ "y": [
+ 5.089888531903868,
+ 4.8433908307482465,
+ 5.528227303122323,
+ 4.869139089480771,
+ 3.1360287273659497,
+ 5.8044369491344945,
+ 9.235543716457371,
+ 3.772190534565567,
+ 7.041281739806083
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(1.0, 1.0, 0.6)"
+ },
+ "name": "STROMA_OTHER",
+ "text": [
+ 7.826968188430753,
+ 10.44571078738319,
+ 11.861625449529612,
+ 5.673310006252082,
+ 9.218771193764127,
+ 6.556229162277743,
+ 13.890110642897596,
+ 12.616375290010604,
+ 8.93397740824535
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv"
+ ],
+ "y": [
+ 7.826968188430753,
+ 10.44571078738319,
+ 11.861625449529612,
+ 5.673310006252082,
+ 9.218771193764127,
+ 6.556229162277743,
+ 13.890110642897596,
+ 12.616375290010604,
+ 8.93397740824535
+ ]
+ },
+ {
+ "marker": {
+ "color": "rgb(177, 89, 40)"
+ },
+ "name": "ENDOTHELIAL",
+ "text": [
+ 2.492095397489472,
+ 2.4481579532513242,
+ 2.668033314022932,
+ 2.1917469128865066,
+ 2.27236937105123,
+ 1.9005038655176862,
+ 3.6163613074166885,
+ 1.2692871846197977,
+ 1.887278897927334
+ ],
+ "textposition": "auto",
+ "type": "bar",
+ "x": [
+ "DD3S1.csv",
+ "DD3S2.csv",
+ "DD3S3.csv",
+ "DD4S1.csv",
+ "DD4S2.csv",
+ "DD4S3.csv",
+ "DD5S1.csv",
+ "DD5S2.csv",
+ "DD5S3.csv"
+ ],
+ "y": [
+ 2.492095397489472,
+ 2.4481579532513242,
+ 2.668033314022932,
+ 2.1917469128865066,
+ 2.27236937105123,
+ 1.9005038655176862,
+ 3.6163613074166885,
+ 1.2692871846197977,
+ 1.887278897927334
+ ]
+ }
+ ],
+ "layout": {
+ "barmode": "stack",
+ "plot_bgcolor": "white",
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "ACT_patients_Cell subtypes proportions by Sample ID and tissue type"
+ },
+ "xaxis": {
+ "autorange": true,
+ "linecolor": "black",
+ "range": [
+ -0.5,
+ 8.5
+ ],
+ "type": "category"
+ },
+ "yaxis": {
+ "autorange": true,
+ "linecolor": "black",
+ "range": [
+ 0,
+ 105.2341254516608
+ ],
+ "title": {
+ "text": "Cell count (%)"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 86,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "fig = go.Figure()\n",
+ "title = 'ACT_patients_Cell subtypes proportions by Sample ID and tissue type'\n",
+ "\n",
+ "for cell_subtype in cell_subtypes:\n",
+ " fig.add_trace(\n",
+ " go.Bar(\n",
+ " name=cell_subtype,\n",
+ " x=counts_perc['Sample_ID'],\n",
+ " y=counts_perc[f'{cell_subtype.lower()}_perc'],\n",
+ " text=counts_perc[f'{cell_subtype.lower()}_perc'],\n",
+ " textposition='auto',\n",
+ " marker_color='rgb' + str(cell_subtype_color_dict[cell_subtype])))\n",
+ "\n",
+ "fig.update_layout(\n",
+ " plot_bgcolor='white',\n",
+ " barmode='stack',\n",
+ " xaxis=dict(linecolor='black'),\n",
+ " title=title,\n",
+ " yaxis=dict(title='Cell count (%)', linecolor='black')\n",
+ ")\n",
+ "\n",
+ "# Enregistrer l'image\n",
+ "output_filename = title.replace(\" \", \"_\") + \".png\"\n",
+ "#fig.write_image(output_images_dir + \"/\" + output_filename, scale=1000)\n",
+ "\n",
+ "# Afficher le graphique\n",
+ "fig.show()\n",
+ "plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "cc016170-cec5-4981-b074-0cf1622a73ec",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "471b7d74-09e9-4db8-b5d8-a9e764363439",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 87,
+ "id": "d149cb8e-6819-40f5-89ec-827ff60ff3d1",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " HLA_Cytoplasm_Intensity_Average \n",
+ " CKs_Cytoplasm_Intensity_Average \n",
+ " Ki67_Nucleus_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " ColVI_Cytoplasm_Intensity_Average \n",
+ " CD20_Cytoplasm_Intensity_Average \n",
+ " PD1_Cytoplasm_Intensity_Average \n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ " CD31_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nuc_Y_Inv \n",
+ " Nucleus_Roundness \n",
+ " Nuc_X \n",
+ " ROI_index \n",
+ " Nucleus_Size \n",
+ " Sample_ID \n",
+ " immune_checkpoint \n",
+ " Cell_Size \n",
+ " Patient \n",
+ " Unique_ROI_index \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_0 \n",
+ " -0.677863 \n",
+ " -0.417494 \n",
+ " -0.912537 \n",
+ " -0.817876 \n",
+ " 0.930099 \n",
+ " 0.232078 \n",
+ " -0.483158 \n",
+ " 1.535604 \n",
+ " 0.807339 \n",
+ " 1.167755 \n",
+ " ... \n",
+ " 16632.205078 \n",
+ " 0.955040 \n",
+ " 1484.771729 \n",
+ " 0 \n",
+ " 127 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 339 \n",
+ " 61 \n",
+ " 61a \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_1 \n",
+ " -0.677863 \n",
+ " -0.516487 \n",
+ " -0.838037 \n",
+ " -0.869685 \n",
+ " 1.114924 \n",
+ " 0.301333 \n",
+ " -0.344770 \n",
+ " 1.668368 \n",
+ " 0.875455 \n",
+ " 1.643023 \n",
+ " ... \n",
+ " 16627.384766 \n",
+ " 0.966643 \n",
+ " 1426.250000 \n",
+ " 0 \n",
+ " 112 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 344 \n",
+ " 61 \n",
+ " 61a \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_2 \n",
+ " -0.677863 \n",
+ " -0.141921 \n",
+ " -1.016023 \n",
+ " -0.755879 \n",
+ " 0.834577 \n",
+ " 0.259216 \n",
+ " -0.438292 \n",
+ " 1.336308 \n",
+ " 0.705088 \n",
+ " 1.053636 \n",
+ " ... \n",
+ " 16622.238281 \n",
+ " 0.721534 \n",
+ " 1531.110474 \n",
+ " 0 \n",
+ " 181 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 422 \n",
+ " 61 \n",
+ " 61a \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_3 \n",
+ " -0.741282 \n",
+ " -0.460472 \n",
+ " -0.491711 \n",
+ " -0.818084 \n",
+ " 0.648200 \n",
+ " 0.107027 \n",
+ " -0.444889 \n",
+ " 1.249805 \n",
+ " 0.660707 \n",
+ " 1.165861 \n",
+ " ... \n",
+ " 16623.007812 \n",
+ " 0.587196 \n",
+ " 1518.907593 \n",
+ " 0 \n",
+ " 119 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 278 \n",
+ " 61 \n",
+ " 61a \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_6 \n",
+ " -0.621521 \n",
+ " -0.247254 \n",
+ " -0.867127 \n",
+ " -0.742544 \n",
+ " 0.810579 \n",
+ " 0.272128 \n",
+ " -0.507117 \n",
+ " 1.251434 \n",
+ " 0.947172 \n",
+ " 2.545301 \n",
+ " ... \n",
+ " 16619.978516 \n",
+ " 0.935716 \n",
+ " 1471.914917 \n",
+ " 0 \n",
+ " 47 \n",
+ " DD3S1.csv \n",
+ " None \n",
+ " 204 \n",
+ " 61 \n",
+ " 61a \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115755 \n",
+ " 0.478275 \n",
+ " 0.558670 \n",
+ " -0.962840 \n",
+ " 1.732291 \n",
+ " 0.507434 \n",
+ " -0.912641 \n",
+ " 0.311322 \n",
+ " 0.816068 \n",
+ " 0.596520 \n",
+ " 0.090397 \n",
+ " ... \n",
+ " 2663.253418 \n",
+ " 0.982196 \n",
+ " 15564.458008 \n",
+ " 59 \n",
+ " 142 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 386 \n",
+ " c59 \n",
+ " c59a \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115756 \n",
+ " 0.297418 \n",
+ " 0.420594 \n",
+ " -0.971632 \n",
+ " 1.966955 \n",
+ " 0.304365 \n",
+ " -1.164112 \n",
+ " 0.866636 \n",
+ " -0.092857 \n",
+ " -0.241830 \n",
+ " -0.617835 \n",
+ " ... \n",
+ " 2661.765869 \n",
+ " 0.775977 \n",
+ " 15629.680664 \n",
+ " 59 \n",
+ " 47 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 270 \n",
+ " c59 \n",
+ " c59a \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115757 \n",
+ " 0.346950 \n",
+ " 0.453951 \n",
+ " -0.602893 \n",
+ " 1.338956 \n",
+ " 0.559435 \n",
+ " -0.801333 \n",
+ " 0.447061 \n",
+ " 0.988156 \n",
+ " 1.567869 \n",
+ " 0.403878 \n",
+ " ... \n",
+ " 2657.015625 \n",
+ " 0.688747 \n",
+ " 15518.421875 \n",
+ " 59 \n",
+ " 64 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 202 \n",
+ " c59 \n",
+ " c59a \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115758 \n",
+ " -0.189415 \n",
+ " 0.508840 \n",
+ " -0.886041 \n",
+ " 0.647980 \n",
+ " -0.227224 \n",
+ " -1.022549 \n",
+ " -0.099256 \n",
+ " 0.219755 \n",
+ " 0.603715 \n",
+ " -0.219145 \n",
+ " ... \n",
+ " 2660.258545 \n",
+ " 0.751402 \n",
+ " 15539.275391 \n",
+ " 59 \n",
+ " 58 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 182 \n",
+ " c59 \n",
+ " c59a \n",
+ " \n",
+ " \n",
+ " TMA_Cell_115760 \n",
+ " 0.245777 \n",
+ " 0.460219 \n",
+ " -1.003840 \n",
+ " 0.191158 \n",
+ " -0.313127 \n",
+ " -1.120675 \n",
+ " 0.004962 \n",
+ " -0.316199 \n",
+ " 1.727776 \n",
+ " -0.495501 \n",
+ " ... \n",
+ " 2654.292480 \n",
+ " 0.674126 \n",
+ " 15542.961914 \n",
+ " 59 \n",
+ " 106 \n",
+ " TMA.csv \n",
+ " None \n",
+ " 295 \n",
+ " c59 \n",
+ " c59a \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
704629 rows Ć 39 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.677863 \n",
+ "DD3S1_Cell_1 -0.677863 \n",
+ "DD3S1_Cell_2 -0.677863 \n",
+ "DD3S1_Cell_3 -0.741282 \n",
+ "DD3S1_Cell_6 -0.621521 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.478275 \n",
+ "TMA_Cell_115756 0.297418 \n",
+ "TMA_Cell_115757 0.346950 \n",
+ "TMA_Cell_115758 -0.189415 \n",
+ "TMA_Cell_115760 0.245777 \n",
+ "\n",
+ " HLA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.417494 \n",
+ "DD3S1_Cell_1 -0.516487 \n",
+ "DD3S1_Cell_2 -0.141921 \n",
+ "DD3S1_Cell_3 -0.460472 \n",
+ "DD3S1_Cell_6 -0.247254 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.558670 \n",
+ "TMA_Cell_115756 0.420594 \n",
+ "TMA_Cell_115757 0.453951 \n",
+ "TMA_Cell_115758 0.508840 \n",
+ "TMA_Cell_115760 0.460219 \n",
+ "\n",
+ " CKs_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.912537 \n",
+ "DD3S1_Cell_1 -0.838037 \n",
+ "DD3S1_Cell_2 -1.016023 \n",
+ "DD3S1_Cell_3 -0.491711 \n",
+ "DD3S1_Cell_6 -0.867127 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.962840 \n",
+ "TMA_Cell_115756 -0.971632 \n",
+ "TMA_Cell_115757 -0.602893 \n",
+ "TMA_Cell_115758 -0.886041 \n",
+ "TMA_Cell_115760 -1.003840 \n",
+ "\n",
+ " Ki67_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.817876 \n",
+ "DD3S1_Cell_1 -0.869685 \n",
+ "DD3S1_Cell_2 -0.755879 \n",
+ "DD3S1_Cell_3 -0.818084 \n",
+ "DD3S1_Cell_6 -0.742544 \n",
+ "... ... \n",
+ "TMA_Cell_115755 1.732291 \n",
+ "TMA_Cell_115756 1.966955 \n",
+ "TMA_Cell_115757 1.338956 \n",
+ "TMA_Cell_115758 0.647980 \n",
+ "TMA_Cell_115760 0.191158 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.930099 \n",
+ "DD3S1_Cell_1 1.114924 \n",
+ "DD3S1_Cell_2 0.834577 \n",
+ "DD3S1_Cell_3 0.648200 \n",
+ "DD3S1_Cell_6 0.810579 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.507434 \n",
+ "TMA_Cell_115756 0.304365 \n",
+ "TMA_Cell_115757 0.559435 \n",
+ "TMA_Cell_115758 -0.227224 \n",
+ "TMA_Cell_115760 -0.313127 \n",
+ "\n",
+ " ColVI_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.232078 \n",
+ "DD3S1_Cell_1 0.301333 \n",
+ "DD3S1_Cell_2 0.259216 \n",
+ "DD3S1_Cell_3 0.107027 \n",
+ "DD3S1_Cell_6 0.272128 \n",
+ "... ... \n",
+ "TMA_Cell_115755 -0.912641 \n",
+ "TMA_Cell_115756 -1.164112 \n",
+ "TMA_Cell_115757 -0.801333 \n",
+ "TMA_Cell_115758 -1.022549 \n",
+ "TMA_Cell_115760 -1.120675 \n",
+ "\n",
+ " CD20_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 -0.483158 \n",
+ "DD3S1_Cell_1 -0.344770 \n",
+ "DD3S1_Cell_2 -0.438292 \n",
+ "DD3S1_Cell_3 -0.444889 \n",
+ "DD3S1_Cell_6 -0.507117 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.311322 \n",
+ "TMA_Cell_115756 0.866636 \n",
+ "TMA_Cell_115757 0.447061 \n",
+ "TMA_Cell_115758 -0.099256 \n",
+ "TMA_Cell_115760 0.004962 \n",
+ "\n",
+ " PD1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 1.535604 \n",
+ "DD3S1_Cell_1 1.668368 \n",
+ "DD3S1_Cell_2 1.336308 \n",
+ "DD3S1_Cell_3 1.249805 \n",
+ "DD3S1_Cell_6 1.251434 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.816068 \n",
+ "TMA_Cell_115756 -0.092857 \n",
+ "TMA_Cell_115757 0.988156 \n",
+ "TMA_Cell_115758 0.219755 \n",
+ "TMA_Cell_115760 -0.316199 \n",
+ "\n",
+ " AXL_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.807339 \n",
+ "DD3S1_Cell_1 0.875455 \n",
+ "DD3S1_Cell_2 0.705088 \n",
+ "DD3S1_Cell_3 0.660707 \n",
+ "DD3S1_Cell_6 0.947172 \n",
+ "... ... \n",
+ "TMA_Cell_115755 0.596520 \n",
+ "TMA_Cell_115756 -0.241830 \n",
+ "TMA_Cell_115757 1.567869 \n",
+ "TMA_Cell_115758 0.603715 \n",
+ "TMA_Cell_115760 1.727776 \n",
+ "\n",
+ " CD31_Cytoplasm_Intensity_Average ... Nuc_Y_Inv \\\n",
+ "ID ... \n",
+ "DD3S1_Cell_0 1.167755 ... 16632.205078 \n",
+ "DD3S1_Cell_1 1.643023 ... 16627.384766 \n",
+ "DD3S1_Cell_2 1.053636 ... 16622.238281 \n",
+ "DD3S1_Cell_3 1.165861 ... 16623.007812 \n",
+ "DD3S1_Cell_6 2.545301 ... 16619.978516 \n",
+ "... ... ... ... \n",
+ "TMA_Cell_115755 0.090397 ... 2663.253418 \n",
+ "TMA_Cell_115756 -0.617835 ... 2661.765869 \n",
+ "TMA_Cell_115757 0.403878 ... 2657.015625 \n",
+ "TMA_Cell_115758 -0.219145 ... 2660.258545 \n",
+ "TMA_Cell_115760 -0.495501 ... 2654.292480 \n",
+ "\n",
+ " Nucleus_Roundness Nuc_X ROI_index Nucleus_Size \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 0.955040 1484.771729 0 127 \n",
+ "DD3S1_Cell_1 0.966643 1426.250000 0 112 \n",
+ "DD3S1_Cell_2 0.721534 1531.110474 0 181 \n",
+ "DD3S1_Cell_3 0.587196 1518.907593 0 119 \n",
+ "DD3S1_Cell_6 0.935716 1471.914917 0 47 \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 0.982196 15564.458008 59 142 \n",
+ "TMA_Cell_115756 0.775977 15629.680664 59 47 \n",
+ "TMA_Cell_115757 0.688747 15518.421875 59 64 \n",
+ "TMA_Cell_115758 0.751402 15539.275391 59 58 \n",
+ "TMA_Cell_115760 0.674126 15542.961914 59 106 \n",
+ "\n",
+ " Sample_ID immune_checkpoint Cell_Size Patient \\\n",
+ "ID \n",
+ "DD3S1_Cell_0 DD3S1.csv None 339 61 \n",
+ "DD3S1_Cell_1 DD3S1.csv None 344 61 \n",
+ "DD3S1_Cell_2 DD3S1.csv None 422 61 \n",
+ "DD3S1_Cell_3 DD3S1.csv None 278 61 \n",
+ "DD3S1_Cell_6 DD3S1.csv None 204 61 \n",
+ "... ... ... ... ... \n",
+ "TMA_Cell_115755 TMA.csv None 386 c59 \n",
+ "TMA_Cell_115756 TMA.csv None 270 c59 \n",
+ "TMA_Cell_115757 TMA.csv None 202 c59 \n",
+ "TMA_Cell_115758 TMA.csv None 182 c59 \n",
+ "TMA_Cell_115760 TMA.csv None 295 c59 \n",
+ "\n",
+ " Unique_ROI_index \n",
+ "ID \n",
+ "DD3S1_Cell_0 61a \n",
+ "DD3S1_Cell_1 61a \n",
+ "DD3S1_Cell_2 61a \n",
+ "DD3S1_Cell_3 61a \n",
+ "DD3S1_Cell_6 61a \n",
+ "... ... \n",
+ "TMA_Cell_115755 c59a \n",
+ "TMA_Cell_115756 c59a \n",
+ "TMA_Cell_115757 c59a \n",
+ "TMA_Cell_115758 c59a \n",
+ "TMA_Cell_115760 c59a \n",
+ "\n",
+ "[704629 rows x 39 columns]"
+ ]
+ },
+ "execution_count": 87,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df1"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "1f7aeca8-71f4-44fc-b869-d93911a13167",
+ "metadata": {},
+ "source": [
+ "## RATIO M2/M1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 88,
+ "id": "89bf3e70-3862-408b-a898-54a7c7da47be",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Filtrer les lignes correspondant aux cellules M1 et M2 pour les patients NACT\n",
+ "df_M1_NACT = df[(df['cell_subtype'] == 'M1') & df['Patient'].isin(num_NACT_patients)]\n",
+ "df_M2_NACT = df[(df['cell_subtype'] == 'M2') & df['Patient'].isin(num_NACT_patients)]\n",
+ "\n",
+ "# Filtrer les lignes correspondant aux cellules M1 et M2 pour les patients ACT\n",
+ "df_M1_ACT = df[(df['cell_subtype'] == 'M1') & df['Patient'].isin(num_ACT_patients)]\n",
+ "df_M2_ACT = df[(df['cell_subtype'] == 'M2') & df['Patient'].isin(num_ACT_patients)]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 89,
+ "id": "e474111d-be52-49f6-8543-1d407ec612af",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Regrouper les donnƩes par patient et calculer le total de cellules M1 et M2 pour les patients NACT\n",
+ "result_M1_NACT = df_M1_NACT.groupby('Patient').size().rename('total_M1_cells')\n",
+ "result_M2_NACT = df_M2_NACT.groupby('Patient').size().rename('total_M2_cells')\n",
+ "\n",
+ "# Regrouper les donnƩes par patient et calculer le total de cellules M1 et M2 pour les patients ACT\n",
+ "result_M1_ACT = df_M1_ACT.groupby('Patient').size().rename('total_M1_cells')\n",
+ "result_M2_ACT = df_M2_ACT.groupby('Patient').size().rename('total_M2_cells')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 90,
+ "id": "79c6b7fd-d9c8-475b-badd-734ab73733ed",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# CrƩer le DataFrame rƩsultant avec Patient comme index pour les patients NACT\n",
+ "result_NACT = pd.concat([result_M1_NACT, result_M2_NACT], axis=1, sort=False).fillna(0)\n",
+ "\n",
+ "# CrƩer le DataFrame rƩsultant avec Patient comme index pour les patients ACT\n",
+ "result_ACT = pd.concat([result_M1_ACT, result_M2_ACT], axis=1, sort=False).fillna(0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 91,
+ "id": "076cc0b8-e874-4fdb-9481-b2e3655d12e7",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Ajouter une colonne pour le ratio de M2/M1 pour les patients NACT\n",
+ "result_NACT['M2_M1_ratio'] = result_NACT['total_M2_cells'] / result_NACT['total_M1_cells']\n",
+ "result_NACT['Treatment_Type'] = 'NACT' # Ajouter une colonne pour indiquer le traitement\n",
+ "\n",
+ "# Ajouter une colonne pour le ratio de M2/M1 pour les patients ACT\n",
+ "result_ACT['M2_M1_ratio'] = result_ACT['total_M2_cells'] / result_ACT['total_M1_cells']\n",
+ "result_ACT['Treatment_Type'] = 'ACT' # Ajouter une colonne pour indiquer le traitement"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 92,
+ "id": "d37f1727-7136-49a5-b563-07c7a7281379",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Regrouper les donnƩes par patient et calculer le total de cellules M1 et M2 pour les patients NACT\n",
+ "result_M1_NACT = df_M1_NACT.groupby('Patient').size().rename('total_M1_cells')\n",
+ "result_M2_NACT = df_M2_NACT.groupby('Patient').size().rename('total_M2_cells')\n",
+ "\n",
+ "# Regrouper les donnƩes par patient et calculer le total de cellules M1 et M2 pour les patients ACT\n",
+ "result_M1_ACT = df_M1_ACT.groupby('Patient').size().rename('total_M1_cells')\n",
+ "result_M2_ACT = df_M2_ACT.groupby('Patient').size().rename('total_M2_cells')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 93,
+ "id": "2b7dcdd6-e409-4295-ad02-25143ab87ff3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " total_M1_cells \n",
+ " total_M2_cells \n",
+ " M2_M1_ratio \n",
+ " Treatment_Type \n",
+ " \n",
+ " \n",
+ " Patient \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 167.0 \n",
+ " 100.0 \n",
+ " 0.598802 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 101 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 0.333333 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 102 \n",
+ " 5.0 \n",
+ " 1.0 \n",
+ " 0.200000 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 105 \n",
+ " 3.0 \n",
+ " 3.0 \n",
+ " 1.000000 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 34 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " inf \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 45 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " inf \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 71 \n",
+ " 0.0 \n",
+ " 16.0 \n",
+ " inf \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 72 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " inf \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " inf \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
103 rows Ć 4 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " total_M1_cells total_M2_cells M2_M1_ratio Treatment_Type\n",
+ "Patient \n",
+ "10 167.0 100.0 0.598802 ACT\n",
+ "101 3.0 1.0 0.333333 ACT\n",
+ "102 5.0 1.0 0.200000 ACT\n",
+ "103 7.0 0.0 0.000000 ACT\n",
+ "105 3.0 3.0 1.000000 ACT\n",
+ "... ... ... ... ...\n",
+ "34 0.0 2.0 inf ACT\n",
+ "45 0.0 3.0 inf ACT\n",
+ "71 0.0 16.0 inf ACT\n",
+ "72 0.0 1.0 inf ACT\n",
+ "9 0.0 1.0 inf ACT\n",
+ "\n",
+ "[103 rows x 4 columns]"
+ ]
+ },
+ "execution_count": 93,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "result_ACT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 94,
+ "id": "09a86c99-e546-4c9a-81ae-5b77ed419fae",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " total_M1_cells \n",
+ " total_M2_cells \n",
+ " M2_M1_ratio \n",
+ " Treatment_Type \n",
+ " \n",
+ " \n",
+ " Patient \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 104 \n",
+ " 1.0 \n",
+ " 2.0 \n",
+ " 2.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 111 \n",
+ " 10.0 \n",
+ " 3.0 \n",
+ " 0.300000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 119 \n",
+ " 3.0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 121 \n",
+ " 4.0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 137 \n",
+ " 1.0 \n",
+ " 1.0 \n",
+ " 1.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 140 \n",
+ " 307.0 \n",
+ " 38.0 \n",
+ " 0.123779 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 141 \n",
+ " 10.0 \n",
+ " 1.0 \n",
+ " 0.100000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 146 \n",
+ " 1.0 \n",
+ " 2.0 \n",
+ " 2.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 149 \n",
+ " 275.0 \n",
+ " 3.0 \n",
+ " 0.010909 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 7.0 \n",
+ " 1.0 \n",
+ " 0.142857 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 153 \n",
+ " 61.0 \n",
+ " 14.0 \n",
+ " 0.229508 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 157 \n",
+ " 2.0 \n",
+ " 7.0 \n",
+ " 3.500000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 162 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 169 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 171 \n",
+ " 25.0 \n",
+ " 1.0 \n",
+ " 0.040000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 174 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 177 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 184 \n",
+ " 13.0 \n",
+ " 11.0 \n",
+ " 0.846154 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 187 \n",
+ " 2.0 \n",
+ " 8.0 \n",
+ " 4.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 32 \n",
+ " 52.0 \n",
+ " 15.0 \n",
+ " 0.288462 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 40 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 78.0 \n",
+ " 6.0 \n",
+ " 0.076923 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 51 \n",
+ " 1.0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 61 \n",
+ " 4.0 \n",
+ " 19.0 \n",
+ " 4.750000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 85 \n",
+ " 41.0 \n",
+ " 16.0 \n",
+ " 0.390244 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 89 \n",
+ " 22.0 \n",
+ " 8.0 \n",
+ " 0.363636 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 95 \n",
+ " 5.0 \n",
+ " 44.0 \n",
+ " 8.800000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 98 \n",
+ " 73.0 \n",
+ " 70.0 \n",
+ " 0.958904 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 182 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " inf \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 183 \n",
+ " 0.0 \n",
+ " 1.0 \n",
+ " inf \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " total_M1_cells total_M2_cells M2_M1_ratio Treatment_Type\n",
+ "Patient \n",
+ "104 1.0 2.0 2.000000 NACT\n",
+ "111 10.0 3.0 0.300000 NACT\n",
+ "119 3.0 0.0 0.000000 NACT\n",
+ "121 4.0 0.0 0.000000 NACT\n",
+ "137 1.0 1.0 1.000000 NACT\n",
+ "140 307.0 38.0 0.123779 NACT\n",
+ "141 10.0 1.0 0.100000 NACT\n",
+ "146 1.0 2.0 2.000000 NACT\n",
+ "149 275.0 3.0 0.010909 NACT\n",
+ "15 7.0 1.0 0.142857 NACT\n",
+ "153 61.0 14.0 0.229508 NACT\n",
+ "157 2.0 7.0 3.500000 NACT\n",
+ "162 1.0 0.0 0.000000 NACT\n",
+ "169 1.0 0.0 0.000000 NACT\n",
+ "171 25.0 1.0 0.040000 NACT\n",
+ "174 1.0 0.0 0.000000 NACT\n",
+ "177 1.0 0.0 0.000000 NACT\n",
+ "18 1.0 0.0 0.000000 NACT\n",
+ "184 13.0 11.0 0.846154 NACT\n",
+ "187 2.0 8.0 4.000000 NACT\n",
+ "32 52.0 15.0 0.288462 NACT\n",
+ "40 1.0 0.0 0.000000 NACT\n",
+ "5 78.0 6.0 0.076923 NACT\n",
+ "51 1.0 0.0 0.000000 NACT\n",
+ "61 4.0 19.0 4.750000 NACT\n",
+ "85 41.0 16.0 0.390244 NACT\n",
+ "89 22.0 8.0 0.363636 NACT\n",
+ "95 5.0 44.0 8.800000 NACT\n",
+ "98 73.0 70.0 0.958904 NACT\n",
+ "182 0.0 3.0 inf NACT\n",
+ "183 0.0 1.0 inf NACT"
+ ]
+ },
+ "execution_count": 94,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "result_NACT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1def865f-3d17-4bf2-ab48-8a87cc564f58",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 95,
+ "id": "f9acacbe-4654-45c4-86cf-a4d840f1f65f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " total_M1_cells \n",
+ " total_M2_cells \n",
+ " M2_M1_ratio \n",
+ " Treatment_Type \n",
+ " \n",
+ " \n",
+ " Patient \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 167.0 \n",
+ " 100.0 \n",
+ " 0.598802 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 100 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " inf \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 101 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 0.333333 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 102 \n",
+ " 5.0 \n",
+ " 1.0 \n",
+ " 0.200000 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 92 \n",
+ " 3.0 \n",
+ " 25.0 \n",
+ " 8.333333 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 95 \n",
+ " 5.0 \n",
+ " 44.0 \n",
+ " 8.800000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 96 \n",
+ " 2.0 \n",
+ " 1.0 \n",
+ " 0.500000 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 98 \n",
+ " 73.0 \n",
+ " 70.0 \n",
+ " 0.958904 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 99 \n",
+ " 5.0 \n",
+ " 5.0 \n",
+ " 1.000000 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
134 rows Ć 4 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " total_M1_cells total_M2_cells M2_M1_ratio Treatment_Type\n",
+ "Patient \n",
+ "10 167.0 100.0 0.598802 ACT\n",
+ "100 0.0 3.0 inf ACT\n",
+ "101 3.0 1.0 0.333333 ACT\n",
+ "102 5.0 1.0 0.200000 ACT\n",
+ "103 7.0 0.0 0.000000 ACT\n",
+ "... ... ... ... ...\n",
+ "92 3.0 25.0 8.333333 ACT\n",
+ "95 5.0 44.0 8.800000 NACT\n",
+ "96 2.0 1.0 0.500000 ACT\n",
+ "98 73.0 70.0 0.958904 NACT\n",
+ "99 5.0 5.0 1.000000 ACT\n",
+ "\n",
+ "[134 rows x 4 columns]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# ConcatƩner les rƩsultats pour obtenir le DataFrame final\n",
+ "result_final = pd.concat([result_NACT, result_ACT])\n",
+ "\n",
+ "# Trier le DataFrame par index\n",
+ "result_sorted = result_final.sort_index()\n",
+ "\n",
+ "# DƩfinir l'option pour afficher toutes les lignes du DataFrame\n",
+ "#pd.set_option('display.max_rows', None)\n",
+ "\n",
+ "display(result_sorted)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 96,
+ "id": "492238f5-352d-412e-a960-166b0ea6808b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " total_M1_cells \n",
+ " total_M2_cells \n",
+ " M2_M1_ratio \n",
+ " Treatment_Type \n",
+ " \n",
+ " \n",
+ " Patient \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 167.0 \n",
+ " 100.0 \n",
+ " 0.598802 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 100 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " inf \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 101 \n",
+ " 3.0 \n",
+ " 1.0 \n",
+ " 0.333333 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 102 \n",
+ " 5.0 \n",
+ " 1.0 \n",
+ " 0.200000 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " 7.0 \n",
+ " 0.0 \n",
+ " 0.000000 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 92 \n",
+ " 3.0 \n",
+ " 25.0 \n",
+ " 8.333333 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 95 \n",
+ " 5.0 \n",
+ " 44.0 \n",
+ " 8.800000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 96 \n",
+ " 2.0 \n",
+ " 1.0 \n",
+ " 0.500000 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 98 \n",
+ " 73.0 \n",
+ " 70.0 \n",
+ " 0.958904 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 99 \n",
+ " 5.0 \n",
+ " 5.0 \n",
+ " 1.000000 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
134 rows Ć 4 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " total_M1_cells total_M2_cells M2_M1_ratio Treatment_Type\n",
+ "Patient \n",
+ "10 167.0 100.0 0.598802 ACT\n",
+ "100 0.0 3.0 inf ACT\n",
+ "101 3.0 1.0 0.333333 ACT\n",
+ "102 5.0 1.0 0.200000 ACT\n",
+ "103 7.0 0.0 0.000000 ACT\n",
+ "... ... ... ... ...\n",
+ "92 3.0 25.0 8.333333 ACT\n",
+ "95 5.0 44.0 8.800000 NACT\n",
+ "96 2.0 1.0 0.500000 ACT\n",
+ "98 73.0 70.0 0.958904 NACT\n",
+ "99 5.0 5.0 1.000000 ACT\n",
+ "\n",
+ "[134 rows x 4 columns]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Remplacer les valeurs nƩgatives du ratio M2/M1 par 0\n",
+ "#result_sorted['M2_M1_ratio'] = result_sorted['M2_M1_ratio'].clip(lower=0)\n",
+ "\n",
+ "#result_sorted['M2_M1_ratio'] = result_sorted['M2_M1_ratio'].replace([-float('inf'), float('inf')], 0)\n",
+ "#result_sorted['M2_M1_ratio'] = result_sorted['M2_M1_ratio'].apply(lambda x: 0 if x < 0 else x)\n",
+ "\n",
+ "# DƩfinir l'option pour afficher toutes les lignes du DataFrame\n",
+ "#pd.set_option('display.max_rows', None)\n",
+ "\n",
+ "display(result_sorted)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 97,
+ "id": "b873bac3-4490-4fcf-b964-6073acd2b5f5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "alignmentgroup": "True",
+ "box": {
+ "visible": true
+ },
+ "customdata": [
+ [
+ 167,
+ 100
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 7,
+ 16
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 240,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 307,
+ 38
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 275,
+ 3
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 21,
+ 1
+ ],
+ [
+ 61,
+ 14
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 7,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 25,
+ 1
+ ],
+ [
+ 71,
+ 1
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 14,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 12,
+ 67
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 13,
+ 11
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 18,
+ 5
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 70,
+ 1
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 101,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 52,
+ 15
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 26,
+ 13
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 50,
+ 12
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 78,
+ 6
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 25,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 17,
+ 6
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 9,
+ 16
+ ],
+ [
+ 4,
+ 19
+ ],
+ [
+ 3,
+ 15
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 1,
+ 31
+ ],
+ [
+ 12,
+ 5
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 14,
+ 32
+ ],
+ [
+ 0,
+ 16
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 14,
+ 17
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 29,
+ 52
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 41,
+ 16
+ ],
+ [
+ 6,
+ 31
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 22,
+ 8
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 4,
+ 13
+ ],
+ [
+ 2,
+ 22
+ ],
+ [
+ 3,
+ 25
+ ],
+ [
+ 5,
+ 44
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 73,
+ 70
+ ],
+ [
+ 5,
+ 5
+ ]
+ ],
+ "hovertemplate": "Treatment_Type=%{x} M2_M1_ratio=%{y} total_M1_cells=%{customdata[0]} total_M2_cells=%{customdata[1]} ",
+ "legendgroup": "",
+ "marker": {
+ "color": "#636efa"
+ },
+ "name": "",
+ "offsetgroup": "",
+ "orientation": "v",
+ "scalegroup": "True",
+ "showlegend": false,
+ "type": "violin",
+ "x": [
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "NACT",
+ "NACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "NACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "NACT",
+ "ACT",
+ "NACT",
+ "ACT"
+ ],
+ "x0": " ",
+ "xaxis": "x",
+ "y": [
+ 0.5988023952095808,
+ null,
+ 0.3333333333333333,
+ 0.2,
+ 0,
+ 2,
+ 1,
+ 0,
+ 0,
+ 2.2857142857142856,
+ 3,
+ 0.3,
+ 0.4,
+ 0.25,
+ null,
+ 0,
+ 0,
+ null,
+ 0,
+ null,
+ 0,
+ 3,
+ 1.5,
+ null,
+ 0,
+ null,
+ 3,
+ 1,
+ 1,
+ 0.0125,
+ 0,
+ 1,
+ 4,
+ 0.5,
+ 0.1237785016286645,
+ 0.1,
+ 0,
+ 0.3333333333333333,
+ 2,
+ 2,
+ 0.01090909090909091,
+ 0.14285714285714285,
+ 0.047619047619047616,
+ 0.22950819672131148,
+ 0,
+ null,
+ 3.5,
+ null,
+ 0.625,
+ 0,
+ 0.5,
+ 0,
+ 0.5,
+ null,
+ 0,
+ 0,
+ null,
+ 0.04,
+ 0.014084507042253521,
+ 0,
+ 0,
+ 0,
+ 0,
+ 5.583333333333333,
+ 0,
+ null,
+ null,
+ 0.8461538461538461,
+ null,
+ 0.2777777777777778,
+ 4,
+ 0,
+ 0.014285714285714285,
+ null,
+ 0,
+ null,
+ 0.6666666666666666,
+ 0,
+ 0.0297029702970297,
+ 0,
+ 0.28846153846153844,
+ null,
+ null,
+ 0.5,
+ 0,
+ 1,
+ 4,
+ 0,
+ 0.24,
+ null,
+ 0,
+ 0,
+ 0.07692307692307693,
+ 0,
+ 0,
+ 0.04,
+ 0.6666666666666666,
+ 2.3333333333333335,
+ 0,
+ 0.35294117647058826,
+ 5,
+ 1.7777777777777777,
+ 4.75,
+ 5,
+ 0.3333333333333333,
+ 0,
+ 31,
+ 0.4166666666666667,
+ 0,
+ 0.5,
+ 2.2857142857142856,
+ null,
+ null,
+ 1.2142857142857142,
+ 4,
+ 1,
+ 0.2,
+ 1.3333333333333333,
+ 1.793103448275862,
+ 2.6666666666666665,
+ 0.5,
+ 0.25,
+ 0.3902439024390244,
+ 5.166666666666667,
+ 3,
+ 0.36363636363636365,
+ null,
+ 3.25,
+ 11,
+ 8.333333333333334,
+ 8.8,
+ 0.5,
+ 0.958904109589041,
+ 1
+ ],
+ "y0": " ",
+ "yaxis": "y"
+ }
+ ],
+ "layout": {
+ "legend": {
+ "tracegroupgap": 0
+ },
+ "margin": {
+ "t": 60
+ },
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "#E5ECF6",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "white",
+ "linecolor": "white",
+ "minorgridcolor": "white",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "#E5ECF6",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "white"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "#E5ECF6",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "radialaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "yaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ },
+ "zaxis": {
+ "backgroundcolor": "#E5ECF6",
+ "gridcolor": "white",
+ "gridwidth": 2,
+ "linecolor": "white",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "white"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ },
+ "bgcolor": "#E5ECF6",
+ "caxis": {
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "white",
+ "linecolor": "white",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "white",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "text": "Violin Plot du Ratio M2/M1 en fonction du Traitement"
+ },
+ "violinmode": "group",
+ "xaxis": {
+ "anchor": "y",
+ "autorange": true,
+ "domain": [
+ 0,
+ 1
+ ],
+ "range": [
+ -0.5,
+ 1.5
+ ],
+ "title": {
+ "text": "Traitement"
+ },
+ "type": "category"
+ },
+ "yaxis": {
+ "anchor": "x",
+ "autorange": true,
+ "domain": [
+ 0,
+ 1
+ ],
+ "range": [
+ -3.0062104703092807,
+ 34.00621047030928
+ ],
+ "title": {
+ "text": "Ratio M2/M1"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# CrƩer le violin plot avec des points individuels\n",
+ "fig = px.violin(result_sorted, x='Treatment_Type', y='M2_M1_ratio', \n",
+ " box=True, hover_data=result_sorted.columns)\n",
+ "\n",
+ "# Afficher le violin plot\n",
+ "fig.update_layout(title=f'Violin Plot du Ratio M2/M1 en fonction du Traitement',\n",
+ " xaxis_title='Traitement', yaxis_title='Ratio M2/M1')\n",
+ "\n",
+ "\n",
+ "fig.show()\n",
+ "plot(fig)\n",
+ "import plotly.io as pio\n",
+ "#pio.write_image(fig, 'Violinplot_ratio_M2_M1.png')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "06291b29-7ce3-4629-a0d6-c301afeced76",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "67d75d80-d22e-40b9-9992-958d1d33b3bc",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "42cb23d6-bcbc-4069-94ad-fd4c385a5a51",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "raw",
+ "id": "3b69fd7a-9b2f-4989-ab52-73aadbcb1d3e",
+ "metadata": {},
+ "source": [
+ "Chercher parmis cellules cancer express B7H4"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 98,
+ "id": "4bea449b-6a2c-4ae5-a65f-29f5ec0ee85b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Filtrer les lignes correspondant aux cellules CANCER B7H4/PDL1 pour les patients NACT\n",
+ "df_B7H4_NACT = df[(df['immune_checkpoint'] == 'B7H4') & df['Patient'].isin(num_NACT_patients) & (df['cell_type'] == 'CANCER')]\n",
+ "df_PDL1_NACT = df[(df['immune_checkpoint'] == 'PDL1') & df['Patient'].isin(num_NACT_patients) & ((df['cell_type'] == 'CANCER') | (df['cell_type'] == 'IMMUNE'))]\n",
+ "\n",
+ "# Filtrer les lignes correspondant aux cellules CANCER B7H4/PDL1 pour les patients ACT\n",
+ "df_B7H4_ACT = df[(df['immune_checkpoint'] == 'B7H4') & df['Patient'].isin(num_ACT_patients) & (df['cell_type'] == 'CANCER')]\n",
+ "df_PDL1_ACT = df[(df['immune_checkpoint'] == 'PDL1') & df['Patient'].isin(num_ACT_patients) & ((df['cell_type'] == 'CANCER') | (df['cell_type'] == 'IMMUNE'))]\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 99,
+ "id": "22682aac-310a-419e-b5e5-0ab5e51cf234",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "(10827, 40)\n",
+ "(1229, 40)\n",
+ "(32646, 40)\n",
+ "(5434, 40)\n"
+ ]
+ }
+ ],
+ "source": [
+ "#pd.set_option('display.max_rows', None)\n",
+ "print(df_B7H4_NACT.shape)\n",
+ "print(df_PDL1_NACT.shape)\n",
+ "\n",
+ "print(df_B7H4_ACT.shape)\n",
+ "print(df_PDL1_ACT.shape)"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "93b1f3f3-d201-43cc-b593-c9b769232501",
+ "metadata": {},
+ "source": [
+ "# Filtrer les lignes correspondant aux cellules CANCER B7H4/PDL1 pour les patients NACT\n",
+ "df_B7H4_NACT = df[(df['immune_checkpoint'] == 'B7H4') & df['Patient'].isin(num_NACT_patients) & (df['cell_type'] == 'CANCER')]\n",
+ "df_PDL1_NACT = df[(df['immune_checkpoint'] == 'PDL1') & df['Patient'].isin(num_NACT_patients) & (df['cell_type'] == 'CANCER')]\n",
+ "\n",
+ "# Filtrer les lignes correspondant aux cellules CANCER B7H4/PDL1 pour les patients ACT\n",
+ "df_B7H4_ACT = df[(df['immune_checkpoint'] == 'B7H4') & df['Patient'].isin(num_ACT_patients) & (df['cell_type'] == 'CANCER')]\n",
+ "df_PDL1_ACT = df[(df['immune_checkpoint'] == 'PDL1') & df['Patient'].isin(num_ACT_patients) & (df['cell_type'] == 'CANCER')]\n"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "821010a8-b0f4-4f40-9ea1-2a54337b22a3",
+ "metadata": {},
+ "source": [
+ "#pd.set_option('display.max_rows', None)\n",
+ "print(df_B7H4_NACT.shape)\n",
+ "print(df_PDL1_NACT.shape)\n",
+ "\n",
+ "print(df_B7H4_ACT.shape)\n",
+ "print(df_PDL1_ACT.shape)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 100,
+ "id": "2d0a55fe-70ac-4b4c-b5db-65bd9cf1a525",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " PDL1_Cytoplasm_Intensity_Average \n",
+ " HLA_Cytoplasm_Intensity_Average \n",
+ " CKs_Cytoplasm_Intensity_Average \n",
+ " Ki67_Nucleus_Intensity_Average \n",
+ " CD163_Cytoplasm_Intensity_Average \n",
+ " ColVI_Cytoplasm_Intensity_Average \n",
+ " CD20_Cytoplasm_Intensity_Average \n",
+ " PD1_Cytoplasm_Intensity_Average \n",
+ " AXL_Cytoplasm_Intensity_Average \n",
+ " CD31_Cytoplasm_Intensity_Average \n",
+ " ... \n",
+ " Nucleus_Roundness \n",
+ " Nuc_X \n",
+ " ROI_index \n",
+ " Nucleus_Size \n",
+ " Sample_ID \n",
+ " immune_checkpoint \n",
+ " Cell_Size \n",
+ " Patient \n",
+ " Unique_ROI_index \n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ " \n",
+ " \n",
+ " ID \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_21828 \n",
+ " 1.609792 \n",
+ " 2.521615 \n",
+ " 0.223023 \n",
+ " 1.084166 \n",
+ " 0.338872 \n",
+ " -1.112327 \n",
+ " 1.374637 \n",
+ " 0.236768 \n",
+ " -0.450948 \n",
+ " -0.132787 \n",
+ " ... \n",
+ " 0.868000 \n",
+ " 3246.450684 \n",
+ " 11 \n",
+ " 91 \n",
+ " DD3S1.csv \n",
+ " PDL1 \n",
+ " 220 \n",
+ " 32 \n",
+ " 32a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_21831 \n",
+ " 1.590608 \n",
+ " 2.493721 \n",
+ " 0.231741 \n",
+ " 0.251524 \n",
+ " 1.185084 \n",
+ " -1.203795 \n",
+ " 1.610041 \n",
+ " -0.700345 \n",
+ " -0.673078 \n",
+ " -0.641906 \n",
+ " ... \n",
+ " 0.580756 \n",
+ " 2951.785645 \n",
+ " 11 \n",
+ " 70 \n",
+ " DD3S1.csv \n",
+ " PDL1 \n",
+ " 153 \n",
+ " 32 \n",
+ " 32a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_21937 \n",
+ " 1.611230 \n",
+ " 2.189588 \n",
+ " 0.558693 \n",
+ " 0.249337 \n",
+ " 0.313269 \n",
+ " -1.248514 \n",
+ " 1.501920 \n",
+ " -0.669547 \n",
+ " -0.781676 \n",
+ " -0.848153 \n",
+ " ... \n",
+ " 0.829105 \n",
+ " 3137.495117 \n",
+ " 11 \n",
+ " 101 \n",
+ " DD3S1.csv \n",
+ " PDL1 \n",
+ " 200 \n",
+ " 32 \n",
+ " 32a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_21939 \n",
+ " 1.630944 \n",
+ " 2.690321 \n",
+ " -0.185765 \n",
+ " 1.258937 \n",
+ " 0.552631 \n",
+ " -1.223585 \n",
+ " 1.519502 \n",
+ " -0.700822 \n",
+ " -0.721136 \n",
+ " -0.785331 \n",
+ " ... \n",
+ " 0.925649 \n",
+ " 3217.131348 \n",
+ " 11 \n",
+ " 99 \n",
+ " DD3S1.csv \n",
+ " PDL1 \n",
+ " 183 \n",
+ " 32 \n",
+ " 32a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " DD3S1_Cell_21959 \n",
+ " 1.517887 \n",
+ " 2.719076 \n",
+ " 0.000214 \n",
+ " -0.039537 \n",
+ " 0.431631 \n",
+ " -1.257583 \n",
+ " 1.471392 \n",
+ " -0.863404 \n",
+ " -0.803700 \n",
+ " -0.732914 \n",
+ " ... \n",
+ " 0.777269 \n",
+ " 2996.028564 \n",
+ " 11 \n",
+ " 105 \n",
+ " DD3S1.csv \n",
+ " PDL1 \n",
+ " 154 \n",
+ " 32 \n",
+ " 32a \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
5 rows Ć 40 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " PDL1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_21828 1.609792 \n",
+ "DD3S1_Cell_21831 1.590608 \n",
+ "DD3S1_Cell_21937 1.611230 \n",
+ "DD3S1_Cell_21939 1.630944 \n",
+ "DD3S1_Cell_21959 1.517887 \n",
+ "\n",
+ " HLA_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_21828 2.521615 \n",
+ "DD3S1_Cell_21831 2.493721 \n",
+ "DD3S1_Cell_21937 2.189588 \n",
+ "DD3S1_Cell_21939 2.690321 \n",
+ "DD3S1_Cell_21959 2.719076 \n",
+ "\n",
+ " CKs_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_21828 0.223023 \n",
+ "DD3S1_Cell_21831 0.231741 \n",
+ "DD3S1_Cell_21937 0.558693 \n",
+ "DD3S1_Cell_21939 -0.185765 \n",
+ "DD3S1_Cell_21959 0.000214 \n",
+ "\n",
+ " Ki67_Nucleus_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_21828 1.084166 \n",
+ "DD3S1_Cell_21831 0.251524 \n",
+ "DD3S1_Cell_21937 0.249337 \n",
+ "DD3S1_Cell_21939 1.258937 \n",
+ "DD3S1_Cell_21959 -0.039537 \n",
+ "\n",
+ " CD163_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_21828 0.338872 \n",
+ "DD3S1_Cell_21831 1.185084 \n",
+ "DD3S1_Cell_21937 0.313269 \n",
+ "DD3S1_Cell_21939 0.552631 \n",
+ "DD3S1_Cell_21959 0.431631 \n",
+ "\n",
+ " ColVI_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_21828 -1.112327 \n",
+ "DD3S1_Cell_21831 -1.203795 \n",
+ "DD3S1_Cell_21937 -1.248514 \n",
+ "DD3S1_Cell_21939 -1.223585 \n",
+ "DD3S1_Cell_21959 -1.257583 \n",
+ "\n",
+ " CD20_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_21828 1.374637 \n",
+ "DD3S1_Cell_21831 1.610041 \n",
+ "DD3S1_Cell_21937 1.501920 \n",
+ "DD3S1_Cell_21939 1.519502 \n",
+ "DD3S1_Cell_21959 1.471392 \n",
+ "\n",
+ " PD1_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_21828 0.236768 \n",
+ "DD3S1_Cell_21831 -0.700345 \n",
+ "DD3S1_Cell_21937 -0.669547 \n",
+ "DD3S1_Cell_21939 -0.700822 \n",
+ "DD3S1_Cell_21959 -0.863404 \n",
+ "\n",
+ " AXL_Cytoplasm_Intensity_Average \\\n",
+ "ID \n",
+ "DD3S1_Cell_21828 -0.450948 \n",
+ "DD3S1_Cell_21831 -0.673078 \n",
+ "DD3S1_Cell_21937 -0.781676 \n",
+ "DD3S1_Cell_21939 -0.721136 \n",
+ "DD3S1_Cell_21959 -0.803700 \n",
+ "\n",
+ " CD31_Cytoplasm_Intensity_Average ... Nucleus_Roundness \\\n",
+ "ID ... \n",
+ "DD3S1_Cell_21828 -0.132787 ... 0.868000 \n",
+ "DD3S1_Cell_21831 -0.641906 ... 0.580756 \n",
+ "DD3S1_Cell_21937 -0.848153 ... 0.829105 \n",
+ "DD3S1_Cell_21939 -0.785331 ... 0.925649 \n",
+ "DD3S1_Cell_21959 -0.732914 ... 0.777269 \n",
+ "\n",
+ " Nuc_X ROI_index Nucleus_Size Sample_ID \\\n",
+ "ID \n",
+ "DD3S1_Cell_21828 3246.450684 11 91 DD3S1.csv \n",
+ "DD3S1_Cell_21831 2951.785645 11 70 DD3S1.csv \n",
+ "DD3S1_Cell_21937 3137.495117 11 101 DD3S1.csv \n",
+ "DD3S1_Cell_21939 3217.131348 11 99 DD3S1.csv \n",
+ "DD3S1_Cell_21959 2996.028564 11 105 DD3S1.csv \n",
+ "\n",
+ " immune_checkpoint Cell_Size Patient Unique_ROI_index \\\n",
+ "ID \n",
+ "DD3S1_Cell_21828 PDL1 220 32 32a \n",
+ "DD3S1_Cell_21831 PDL1 153 32 32a \n",
+ "DD3S1_Cell_21937 PDL1 200 32 32a \n",
+ "DD3S1_Cell_21939 PDL1 183 32 32a \n",
+ "DD3S1_Cell_21959 PDL1 154 32 32a \n",
+ "\n",
+ " Primary_chem(1)_vs_surg(0) \n",
+ "ID \n",
+ "DD3S1_Cell_21828 1.0 \n",
+ "DD3S1_Cell_21831 1.0 \n",
+ "DD3S1_Cell_21937 1.0 \n",
+ "DD3S1_Cell_21939 1.0 \n",
+ "DD3S1_Cell_21959 1.0 \n",
+ "\n",
+ "[5 rows x 40 columns]"
+ ]
+ },
+ "execution_count": 100,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df_PDL1_NACT.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 101,
+ "id": "8b4bb2f2-baa7-4b68-a04c-d3ad2c26eeb0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Regrouper les donnƩes par patient et calculer le total de cellules B7H4 et PDL1 pour les patients NACT\n",
+ "result_B7H4_NACT = df_B7H4_NACT.groupby('Patient').size().rename('B7H4_cells')\n",
+ "result_PDL1_NACT = df_PDL1_NACT.groupby('Patient').size().rename('PDL1_cells')\n",
+ "\n",
+ "# Regrouper les donnƩes par patient et calculer le total de cellules B7H4 et PDL1 pour les patients ACT\n",
+ "result_B7H4_ACT = df_B7H4_ACT.groupby('Patient').size().rename('B7H4_cells')\n",
+ "result_PDL1_ACT = df_PDL1_ACT.groupby('Patient').size().rename('PDL1_cells')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 102,
+ "id": "58019f7b-1ac3-481f-b878-86353d38d833",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Patient\n",
+ "104 20\n",
+ "111 1\n",
+ "116 3\n",
+ "119 18\n",
+ "121 4\n",
+ "137 4\n",
+ "140 3\n",
+ "141 2\n",
+ "149 1\n",
+ "15 6\n",
+ "153 30\n",
+ "157 7\n",
+ "160 198\n",
+ "162 5\n",
+ "169 12\n",
+ "171 1\n",
+ "178 6\n",
+ "18 307\n",
+ "182 46\n",
+ "183 2\n",
+ "184 3\n",
+ "187 7\n",
+ "26 19\n",
+ "32 126\n",
+ "5 34\n",
+ "61 18\n",
+ "7 6\n",
+ "85 9\n",
+ "89 5\n",
+ "95 23\n",
+ "98 303\n",
+ "Name: PDL1_cells, dtype: int64"
+ ]
+ },
+ "execution_count": 102,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "result_PDL1_NACT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 103,
+ "id": "54c9bc84-f96c-4ea9-a5b1-c7d3240ca507",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# CrƩer le DataFrame rƩsultant avec Patient comme index pour les patients NACT\n",
+ "result_NACT = pd.concat([result_B7H4_NACT, result_PDL1_NACT], axis=1, sort=False).fillna(0)\n",
+ "\n",
+ "# CrƩer le DataFrame rƩsultant avec Patient comme index pour les patients ACT\n",
+ "result_ACT = pd.concat([result_B7H4_ACT, result_PDL1_ACT], axis=1, sort=False).fillna(0)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 104,
+ "id": "f004e2a0-34c0-43ff-859e-e115e0582f7e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " B7H4_cells \n",
+ " PDL1_cells \n",
+ " \n",
+ " \n",
+ " Patient \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 111 \n",
+ " 35.0 \n",
+ " 1.0 \n",
+ " \n",
+ " \n",
+ " 116 \n",
+ " 24.0 \n",
+ " 3.0 \n",
+ " \n",
+ " \n",
+ " 119 \n",
+ " 2151.0 \n",
+ " 18.0 \n",
+ " \n",
+ " \n",
+ " 121 \n",
+ " 2361.0 \n",
+ " 4.0 \n",
+ " \n",
+ " \n",
+ " 137 \n",
+ " 25.0 \n",
+ " 4.0 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " B7H4_cells PDL1_cells\n",
+ "Patient \n",
+ "111 35.0 1.0\n",
+ "116 24.0 3.0\n",
+ "119 2151.0 18.0\n",
+ "121 2361.0 4.0\n",
+ "137 25.0 4.0"
+ ]
+ },
+ "execution_count": 104,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "result_NACT.head()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 105,
+ "id": "43bc13d1-bb0b-4116-9796-8d4fd8f3d17c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "66353"
+ ]
+ },
+ "execution_count": 105,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(df_NACT[df_NACT['cell_type'] == 'CANCER'])\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 106,
+ "id": "f4409dc4-7053-4bcf-bbb2-9239090f5cab",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# pour les patients NACT\n",
+ "result_NACT['%_B7H4'] = result_NACT['B7H4_cells'] / len(df_NACT[df_NACT['cell_type'] == 'CANCER'])\n",
+ "result_NACT['%_PDL1'] = result_NACT['PDL1_cells'] / len(df_NACT[(df_NACT['cell_type'] == 'CANCER') | (df_NACT['cell_type'] == 'IMMUNE')])\n",
+ "result_NACT['Treatment_Type'] = 'NACT' # Ajouter une colonne pour indiquer le traitement\n",
+ "\n",
+ "# pour le ratio de M2/M1 pour les patients ACT\n",
+ "result_ACT['%_B7H4'] = result_ACT['B7H4_cells'] / len(df_ACT[df_ACT['cell_type'] == 'CANCER'])\n",
+ "result_ACT['%_PDL1'] = result_ACT['PDL1_cells'] / len(df_ACT[(df_ACT['cell_type'] == 'CANCER') | (df_ACT['cell_type'] == 'IMMUNE')])\n",
+ "result_ACT['Treatment_Type'] = 'ACT' # Ajouter une colonne pour indiquer le traitement"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 107,
+ "id": "387e6ee3-c71a-4157-a538-79c0260b92f9",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "80124"
+ ]
+ },
+ "execution_count": 107,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(df_NACT[(df_NACT['cell_type'] == 'CANCER') | (df_NACT['cell_type'] == 'IMMUNE')])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 108,
+ "id": "50f2ce62-fa9a-4560-ae82-2e99b5a6e3b8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " B7H4_cells \n",
+ " PDL1_cells \n",
+ " %_B7H4 \n",
+ " %_PDL1 \n",
+ " Treatment_Type \n",
+ " \n",
+ " \n",
+ " Patient \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 111 \n",
+ " 35.0 \n",
+ " 1.0 \n",
+ " 0.000527 \n",
+ " 0.000012 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 116 \n",
+ " 24.0 \n",
+ " 3.0 \n",
+ " 0.000362 \n",
+ " 0.000037 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 119 \n",
+ " 2151.0 \n",
+ " 18.0 \n",
+ " 0.032418 \n",
+ " 0.000225 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 121 \n",
+ " 2361.0 \n",
+ " 4.0 \n",
+ " 0.035582 \n",
+ " 0.000050 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 137 \n",
+ " 25.0 \n",
+ " 4.0 \n",
+ " 0.000377 \n",
+ " 0.000050 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 146 \n",
+ " 71.0 \n",
+ " 0.0 \n",
+ " 0.001070 \n",
+ " 0.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 149 \n",
+ " 281.0 \n",
+ " 1.0 \n",
+ " 0.004235 \n",
+ " 0.000012 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 1008.0 \n",
+ " 6.0 \n",
+ " 0.015191 \n",
+ " 0.000075 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 153 \n",
+ " 9.0 \n",
+ " 30.0 \n",
+ " 0.000136 \n",
+ " 0.000374 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 157 \n",
+ " 2.0 \n",
+ " 7.0 \n",
+ " 0.000030 \n",
+ " 0.000087 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 160 \n",
+ " 1.0 \n",
+ " 198.0 \n",
+ " 0.000015 \n",
+ " 0.002471 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 162 \n",
+ " 40.0 \n",
+ " 5.0 \n",
+ " 0.000603 \n",
+ " 0.000062 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 169 \n",
+ " 140.0 \n",
+ " 12.0 \n",
+ " 0.002110 \n",
+ " 0.000150 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 171 \n",
+ " 28.0 \n",
+ " 1.0 \n",
+ " 0.000422 \n",
+ " 0.000012 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 174 \n",
+ " 47.0 \n",
+ " 0.0 \n",
+ " 0.000708 \n",
+ " 0.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 177 \n",
+ " 124.0 \n",
+ " 0.0 \n",
+ " 0.001869 \n",
+ " 0.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 178 \n",
+ " 2.0 \n",
+ " 6.0 \n",
+ " 0.000030 \n",
+ " 0.000075 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 179 \n",
+ " 6.0 \n",
+ " 0.0 \n",
+ " 0.000090 \n",
+ " 0.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 285.0 \n",
+ " 307.0 \n",
+ " 0.004295 \n",
+ " 0.003832 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 182 \n",
+ " 39.0 \n",
+ " 46.0 \n",
+ " 0.000588 \n",
+ " 0.000574 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 183 \n",
+ " 152.0 \n",
+ " 2.0 \n",
+ " 0.002291 \n",
+ " 0.000025 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 184 \n",
+ " 1260.0 \n",
+ " 3.0 \n",
+ " 0.018989 \n",
+ " 0.000037 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 187 \n",
+ " 14.0 \n",
+ " 7.0 \n",
+ " 0.000211 \n",
+ " 0.000087 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 26 \n",
+ " 3.0 \n",
+ " 19.0 \n",
+ " 0.000045 \n",
+ " 0.000237 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 32 \n",
+ " 215.0 \n",
+ " 126.0 \n",
+ " 0.003240 \n",
+ " 0.001573 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 40 \n",
+ " 90.0 \n",
+ " 0.0 \n",
+ " 0.001356 \n",
+ " 0.000000 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 1.0 \n",
+ " 34.0 \n",
+ " 0.000015 \n",
+ " 0.000424 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 61 \n",
+ " 2.0 \n",
+ " 18.0 \n",
+ " 0.000030 \n",
+ " 0.000225 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 15.0 \n",
+ " 6.0 \n",
+ " 0.000226 \n",
+ " 0.000075 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 85 \n",
+ " 1563.0 \n",
+ " 9.0 \n",
+ " 0.023556 \n",
+ " 0.000112 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 89 \n",
+ " 154.0 \n",
+ " 5.0 \n",
+ " 0.002321 \n",
+ " 0.000062 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 95 \n",
+ " 207.0 \n",
+ " 23.0 \n",
+ " 0.003120 \n",
+ " 0.000287 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 98 \n",
+ " 472.0 \n",
+ " 303.0 \n",
+ " 0.007113 \n",
+ " 0.003782 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 104 \n",
+ " 0.0 \n",
+ " 20.0 \n",
+ " 0.000000 \n",
+ " 0.000250 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 140 \n",
+ " 0.0 \n",
+ " 3.0 \n",
+ " 0.000000 \n",
+ " 0.000037 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 141 \n",
+ " 0.0 \n",
+ " 2.0 \n",
+ " 0.000000 \n",
+ " 0.000025 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " B7H4_cells PDL1_cells %_B7H4 %_PDL1 Treatment_Type\n",
+ "Patient \n",
+ "111 35.0 1.0 0.000527 0.000012 NACT\n",
+ "116 24.0 3.0 0.000362 0.000037 NACT\n",
+ "119 2151.0 18.0 0.032418 0.000225 NACT\n",
+ "121 2361.0 4.0 0.035582 0.000050 NACT\n",
+ "137 25.0 4.0 0.000377 0.000050 NACT\n",
+ "146 71.0 0.0 0.001070 0.000000 NACT\n",
+ "149 281.0 1.0 0.004235 0.000012 NACT\n",
+ "15 1008.0 6.0 0.015191 0.000075 NACT\n",
+ "153 9.0 30.0 0.000136 0.000374 NACT\n",
+ "157 2.0 7.0 0.000030 0.000087 NACT\n",
+ "160 1.0 198.0 0.000015 0.002471 NACT\n",
+ "162 40.0 5.0 0.000603 0.000062 NACT\n",
+ "169 140.0 12.0 0.002110 0.000150 NACT\n",
+ "171 28.0 1.0 0.000422 0.000012 NACT\n",
+ "174 47.0 0.0 0.000708 0.000000 NACT\n",
+ "177 124.0 0.0 0.001869 0.000000 NACT\n",
+ "178 2.0 6.0 0.000030 0.000075 NACT\n",
+ "179 6.0 0.0 0.000090 0.000000 NACT\n",
+ "18 285.0 307.0 0.004295 0.003832 NACT\n",
+ "182 39.0 46.0 0.000588 0.000574 NACT\n",
+ "183 152.0 2.0 0.002291 0.000025 NACT\n",
+ "184 1260.0 3.0 0.018989 0.000037 NACT\n",
+ "187 14.0 7.0 0.000211 0.000087 NACT\n",
+ "26 3.0 19.0 0.000045 0.000237 NACT\n",
+ "32 215.0 126.0 0.003240 0.001573 NACT\n",
+ "40 90.0 0.0 0.001356 0.000000 NACT\n",
+ "5 1.0 34.0 0.000015 0.000424 NACT\n",
+ "61 2.0 18.0 0.000030 0.000225 NACT\n",
+ "7 15.0 6.0 0.000226 0.000075 NACT\n",
+ "85 1563.0 9.0 0.023556 0.000112 NACT\n",
+ "89 154.0 5.0 0.002321 0.000062 NACT\n",
+ "95 207.0 23.0 0.003120 0.000287 NACT\n",
+ "98 472.0 303.0 0.007113 0.003782 NACT\n",
+ "104 0.0 20.0 0.000000 0.000250 NACT\n",
+ "140 0.0 3.0 0.000000 0.000037 NACT\n",
+ "141 0.0 2.0 0.000000 0.000025 NACT"
+ ]
+ },
+ "execution_count": 108,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "result_NACT"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 109,
+ "id": "5bf30f0f-cf19-468d-b30a-aa3f1d3794a5",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " B7H4_cells \n",
+ " PDL1_cells \n",
+ " %_B7H4 \n",
+ " %_PDL1 \n",
+ " Treatment_Type \n",
+ " \n",
+ " \n",
+ " Patient \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 18.0 \n",
+ " 4.0 \n",
+ " 0.000050 \n",
+ " 0.000010 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 100 \n",
+ " 663.0 \n",
+ " 0.0 \n",
+ " 0.001845 \n",
+ " 0.000000 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 101 \n",
+ " 61.0 \n",
+ " 41.0 \n",
+ " 0.000170 \n",
+ " 0.000100 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 102 \n",
+ " 135.0 \n",
+ " 31.0 \n",
+ " 0.000376 \n",
+ " 0.000076 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 103 \n",
+ " 12.0 \n",
+ " 120.0 \n",
+ " 0.000033 \n",
+ " 0.000294 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 95 \n",
+ " 207.0 \n",
+ " 23.0 \n",
+ " 0.003120 \n",
+ " 0.000287 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 96 \n",
+ " 812.0 \n",
+ " 0.0 \n",
+ " 0.002259 \n",
+ " 0.000000 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 97 \n",
+ " 2.0 \n",
+ " 46.0 \n",
+ " 0.000006 \n",
+ " 0.000113 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ " 98 \n",
+ " 472.0 \n",
+ " 303.0 \n",
+ " 0.007113 \n",
+ " 0.003782 \n",
+ " NACT \n",
+ " \n",
+ " \n",
+ " 99 \n",
+ " 161.0 \n",
+ " 2.0 \n",
+ " 0.000448 \n",
+ " 0.000005 \n",
+ " ACT \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
172 rows Ć 5 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " B7H4_cells PDL1_cells %_B7H4 %_PDL1 Treatment_Type\n",
+ "Patient \n",
+ "10 18.0 4.0 0.000050 0.000010 ACT\n",
+ "100 663.0 0.0 0.001845 0.000000 ACT\n",
+ "101 61.0 41.0 0.000170 0.000100 ACT\n",
+ "102 135.0 31.0 0.000376 0.000076 ACT\n",
+ "103 12.0 120.0 0.000033 0.000294 ACT\n",
+ "... ... ... ... ... ...\n",
+ "95 207.0 23.0 0.003120 0.000287 NACT\n",
+ "96 812.0 0.0 0.002259 0.000000 ACT\n",
+ "97 2.0 46.0 0.000006 0.000113 ACT\n",
+ "98 472.0 303.0 0.007113 0.003782 NACT\n",
+ "99 161.0 2.0 0.000448 0.000005 ACT\n",
+ "\n",
+ "[172 rows x 5 columns]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# ConcatƩner les rƩsultats pour obtenir le DataFrame final\n",
+ "result_final = pd.concat([result_NACT, result_ACT])\n",
+ "\n",
+ "# Trier le DataFrame par index\n",
+ "result_sorted = result_final.sort_index()\n",
+ "\n",
+ "# DƩfinir l'option pour afficher toutes les lignes du DataFrame\n",
+ "#pd.set_option('display.max_rows', None)\n",
+ "\n",
+ "display(result_sorted)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2961b7b2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 120,
+ "id": "3f238363-d9db-40a6-abb8-f3a12f2b26b8",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "alignmentgroup": "True",
+ "customdata": [
+ [
+ 18,
+ 4,
+ 9.796478166099287e-06
+ ],
+ [
+ 663,
+ 0,
+ 0
+ ],
+ [
+ 61,
+ 41,
+ 0.0001004139012025177
+ ],
+ [
+ 135,
+ 31,
+ 7.592270578726947e-05
+ ],
+ [
+ 12,
+ 120,
+ 0.0002938943449829786
+ ],
+ [
+ 1,
+ 4,
+ 9.796478166099287e-06
+ ],
+ [
+ 5,
+ 25,
+ 6.122798853812054e-05
+ ],
+ [
+ 0,
+ 37,
+ 9.061742303641841e-05
+ ],
+ [
+ 1,
+ 1,
+ 2.4491195415248216e-06
+ ],
+ [
+ 0,
+ 9,
+ 2.2042075873723398e-05
+ ],
+ [
+ 1,
+ 6,
+ 1.469471724914893e-05
+ ],
+ [
+ 605,
+ 145,
+ 0.00035512233352109917
+ ],
+ [
+ 1093,
+ 7,
+ 1.7143836790673752e-05
+ ],
+ [
+ 347,
+ 27,
+ 6.612622762117019e-05
+ ],
+ [
+ 930,
+ 1,
+ 2.4491195415248216e-06
+ ],
+ [
+ 48,
+ 55,
+ 0.0001347015747838652
+ ],
+ [
+ 884,
+ 100,
+ 0.0002449119541524822
+ ],
+ [
+ 2,
+ 7,
+ 1.7143836790673752e-05
+ ],
+ [
+ 2,
+ 1,
+ 2.4491195415248216e-06
+ ],
+ [
+ 9,
+ 3,
+ 7.347358624574465e-06
+ ],
+ [
+ 284,
+ 40,
+ 9.796478166099288e-05
+ ],
+ [
+ 56,
+ 6,
+ 1.469471724914893e-05
+ ],
+ [
+ 115,
+ 28,
+ 6.857534716269501e-05
+ ],
+ [
+ 88,
+ 1,
+ 2.4491195415248216e-06
+ ],
+ [
+ 1350,
+ 28,
+ 6.857534716269501e-05
+ ],
+ [
+ 3,
+ 124,
+ 0.0003036908231490779
+ ],
+ [
+ 0,
+ 12,
+ 2.938943449829786e-05
+ ],
+ [
+ 3,
+ 6,
+ 1.469471724914893e-05
+ ],
+ [
+ 4,
+ 9,
+ 2.2042075873723398e-05
+ ],
+ [
+ 0,
+ 13,
+ 3.183855403982268e-05
+ ],
+ [
+ 22,
+ 12,
+ 2.938943449829786e-05
+ ],
+ [
+ 753,
+ 10,
+ 2.449119541524822e-05
+ ],
+ [
+ 7,
+ 9,
+ 2.2042075873723398e-05
+ ],
+ [
+ 1,
+ 0,
+ 0
+ ],
+ [
+ 10,
+ 391,
+ 0.0009576057407362054
+ ],
+ [
+ 232,
+ 5,
+ 1.224559770762411e-05
+ ],
+ [
+ 3,
+ 82,
+ 0.0002008278024050354
+ ],
+ [
+ 6,
+ 15,
+ 3.6736793122872325e-05
+ ],
+ [
+ 1685,
+ 14,
+ 3.4287673581347504e-05
+ ],
+ [
+ 134,
+ 33,
+ 8.082094487031911e-05
+ ],
+ [
+ 78,
+ 24,
+ 5.877886899659572e-05
+ ],
+ [
+ 10,
+ 0,
+ 0
+ ],
+ [
+ 68,
+ 90,
+ 0.00022042075873723396
+ ],
+ [
+ 22,
+ 63,
+ 0.00015429453111606378
+ ],
+ [
+ 25,
+ 3,
+ 7.347358624574465e-06
+ ],
+ [
+ 34,
+ 0,
+ 0
+ ],
+ [
+ 748,
+ 5,
+ 1.224559770762411e-05
+ ],
+ [
+ 6,
+ 13,
+ 3.183855403982268e-05
+ ],
+ [
+ 175,
+ 273,
+ 0.0006686096348362763
+ ],
+ [
+ 0,
+ 1,
+ 2.4491195415248216e-06
+ ],
+ [
+ 671,
+ 35,
+ 8.571918395336877e-05
+ ],
+ [
+ 634,
+ 36,
+ 8.816830349489359e-05
+ ],
+ [
+ 247,
+ 6,
+ 1.469471724914893e-05
+ ],
+ [
+ 207,
+ 7,
+ 1.7143836790673752e-05
+ ],
+ [
+ 192,
+ 2,
+ 4.898239083049643e-06
+ ],
+ [
+ 1,
+ 8,
+ 1.9592956332198573e-05
+ ],
+ [
+ 2,
+ 3,
+ 7.347358624574465e-06
+ ],
+ [
+ 0,
+ 4,
+ 9.796478166099287e-06
+ ],
+ [
+ 11,
+ 27,
+ 6.612622762117019e-05
+ ],
+ [
+ 0,
+ 583,
+ 0.0014278366927089712
+ ],
+ [
+ 2,
+ 8,
+ 1.9592956332198573e-05
+ ],
+ [
+ 3,
+ 71,
+ 0.00017388748744826235
+ ],
+ [
+ 708,
+ 0,
+ 0
+ ],
+ [
+ 1,
+ 7,
+ 1.7143836790673752e-05
+ ],
+ [
+ 3823,
+ 20,
+ 4.898239083049644e-05
+ ],
+ [
+ 11,
+ 50,
+ 0.0001224559770762411
+ ],
+ [
+ 1,
+ 1285,
+ 0.003147118610859396
+ ],
+ [
+ 60,
+ 4,
+ 9.796478166099287e-06
+ ],
+ [
+ 171,
+ 3,
+ 7.347358624574465e-06
+ ],
+ [
+ 540,
+ 7,
+ 1.7143836790673752e-05
+ ],
+ [
+ 121,
+ 9,
+ 2.2042075873723398e-05
+ ],
+ [
+ 24,
+ 0,
+ 0
+ ],
+ [
+ 251,
+ 14,
+ 3.4287673581347504e-05
+ ],
+ [
+ 1,
+ 4,
+ 9.796478166099287e-06
+ ],
+ [
+ 295,
+ 4,
+ 9.796478166099287e-06
+ ],
+ [
+ 2,
+ 0,
+ 0
+ ],
+ [
+ 5,
+ 0,
+ 0
+ ],
+ [
+ 103,
+ 7,
+ 1.7143836790673752e-05
+ ],
+ [
+ 59,
+ 1,
+ 2.4491195415248216e-06
+ ],
+ [
+ 24,
+ 8,
+ 1.9592956332198573e-05
+ ],
+ [
+ 7,
+ 54,
+ 0.00013225245524234037
+ ],
+ [
+ 2,
+ 133,
+ 0.0003257328990228013
+ ],
+ [
+ 10,
+ 1,
+ 2.4491195415248216e-06
+ ],
+ [
+ 1133,
+ 16,
+ 3.9185912664397146e-05
+ ],
+ [
+ 15,
+ 36,
+ 8.816830349489359e-05
+ ],
+ [
+ 821,
+ 0,
+ 0
+ ],
+ [
+ 221,
+ 3,
+ 7.347358624574465e-06
+ ],
+ [
+ 694,
+ 0,
+ 0
+ ],
+ [
+ 1,
+ 0,
+ 0
+ ],
+ [
+ 16,
+ 0,
+ 0
+ ],
+ [
+ 251,
+ 0,
+ 0
+ ],
+ [
+ 7,
+ 279,
+ 0.0006833043520854253
+ ],
+ [
+ 1,
+ 4,
+ 9.796478166099287e-06
+ ],
+ [
+ 127,
+ 13,
+ 3.183855403982268e-05
+ ],
+ [
+ 2,
+ 5,
+ 1.224559770762411e-05
+ ],
+ [
+ 325,
+ 2,
+ 4.898239083049643e-06
+ ],
+ [
+ 4,
+ 0,
+ 0
+ ],
+ [
+ 2694,
+ 2,
+ 4.898239083049643e-06
+ ],
+ [
+ 4,
+ 1,
+ 2.4491195415248216e-06
+ ],
+ [
+ 78,
+ 2,
+ 4.898239083049643e-06
+ ],
+ [
+ 129,
+ 10,
+ 2.449119541524822e-05
+ ],
+ [
+ 1,
+ 8,
+ 1.9592956332198573e-05
+ ],
+ [
+ 6,
+ 1,
+ 2.4491195415248216e-06
+ ],
+ [
+ 53,
+ 3,
+ 7.347358624574465e-06
+ ],
+ [
+ 67,
+ 27,
+ 6.612622762117019e-05
+ ],
+ [
+ 2,
+ 5,
+ 1.224559770762411e-05
+ ],
+ [
+ 37,
+ 1,
+ 2.4491195415248216e-06
+ ],
+ [
+ 484,
+ 2,
+ 4.898239083049643e-06
+ ],
+ [
+ 140,
+ 0,
+ 0
+ ],
+ [
+ 76,
+ 2,
+ 4.898239083049643e-06
+ ],
+ [
+ 90,
+ 9,
+ 2.2042075873723398e-05
+ ],
+ [
+ 33,
+ 9,
+ 2.2042075873723398e-05
+ ],
+ [
+ 29,
+ 4,
+ 9.796478166099287e-06
+ ],
+ [
+ 57,
+ 107,
+ 0.00026205579094315594
+ ],
+ [
+ 525,
+ 0,
+ 0
+ ],
+ [
+ 39,
+ 12,
+ 2.938943449829786e-05
+ ],
+ [
+ 283,
+ 2,
+ 4.898239083049643e-06
+ ],
+ [
+ 2,
+ 10,
+ 2.449119541524822e-05
+ ],
+ [
+ 0,
+ 18,
+ 4.4084151747446796e-05
+ ],
+ [
+ 53,
+ 13,
+ 3.183855403982268e-05
+ ],
+ [
+ 564,
+ 85,
+ 0.00020817516102960984
+ ],
+ [
+ 169,
+ 177,
+ 0.00043349415884989345
+ ],
+ [
+ 0,
+ 16,
+ 3.9185912664397146e-05
+ ],
+ [
+ 560,
+ 7,
+ 1.7143836790673752e-05
+ ],
+ [
+ 1,
+ 7,
+ 1.7143836790673752e-05
+ ],
+ [
+ 11,
+ 0,
+ 0
+ ],
+ [
+ 1497,
+ 5,
+ 1.224559770762411e-05
+ ],
+ [
+ 16,
+ 12,
+ 2.938943449829786e-05
+ ],
+ [
+ 29,
+ 83,
+ 0.0002032769219465602
+ ],
+ [
+ 0,
+ 15,
+ 3.6736793122872325e-05
+ ],
+ [
+ 1395,
+ 4,
+ 9.796478166099287e-06
+ ],
+ [
+ 1,
+ 28,
+ 6.857534716269501e-05
+ ],
+ [
+ 0,
+ 6,
+ 1.469471724914893e-05
+ ],
+ [
+ 812,
+ 0,
+ 0
+ ],
+ [
+ 2,
+ 46,
+ 0.0001126594989101418
+ ],
+ [
+ 161,
+ 2,
+ 4.898239083049643e-06
+ ]
+ ],
+ "hovertemplate": "Treatment_Type=%{x} %_B7H4=%{y} B7H4_cells=%{customdata[0]} PDL1_cells=%{customdata[1]} %_PDL1=%{customdata[2]} ",
+ "legendgroup": "ACT",
+ "marker": {
+ "color": "#636efa"
+ },
+ "name": "ACT",
+ "notched": false,
+ "offsetgroup": "ACT",
+ "orientation": "v",
+ "showlegend": true,
+ "type": "box",
+ "x": [
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT"
+ ],
+ "x0": " ",
+ "xaxis": "x",
+ "y": [
+ 5.008486602298339e-05,
+ 0.0018447925651798882,
+ 0.00016973204596677704,
+ 0.0003756364951723754,
+ 3.338991068198893e-05,
+ 2.7824925568324103e-06,
+ 1.3912462784162053e-05,
+ 0,
+ 2.7824925568324103e-06,
+ 0,
+ 2.7824925568324103e-06,
+ 0.0016834079968836083,
+ 0.0030412643646178248,
+ 0.0009655249172208464,
+ 0.0025877180778541417,
+ 0.0001335596427279557,
+ 0.0024597234202398508,
+ 5.564985113664821e-06,
+ 5.564985113664821e-06,
+ 2.5042433011491696e-05,
+ 0.0007902278861404046,
+ 0.00015581958318261499,
+ 0.0003199866440357272,
+ 0.0002448593450012521,
+ 0.003756364951723754,
+ 8.347477670497232e-06,
+ 0,
+ 8.347477670497232e-06,
+ 1.1129970227329641e-05,
+ 0,
+ 6.121483625031303e-05,
+ 0.002095216895294805,
+ 1.9477447897826873e-05,
+ 2.7824925568324103e-06,
+ 2.7824925568324105e-05,
+ 0.0006455382731851192,
+ 8.347477670497232e-06,
+ 1.6694955340994464e-05,
+ 0.004688499958262611,
+ 0.00037285400261554303,
+ 0.00021703441943292801,
+ 2.7824925568324105e-05,
+ 0.0001892094938646039,
+ 6.121483625031303e-05,
+ 6.956231392081027e-05,
+ 9.460474693230196e-05,
+ 0.002081304432510643,
+ 1.6694955340994464e-05,
+ 0.00048693619744567183,
+ 0,
+ 0.0018670525056345474,
+ 0.0017641002810317482,
+ 0.0006872756615376054,
+ 0.000575975959264309,
+ 0.0005342385709118228,
+ 2.7824925568324103e-06,
+ 5.564985113664821e-06,
+ 0,
+ 3.0607418125156515e-05,
+ 0,
+ 5.564985113664821e-06,
+ 8.347477670497232e-06,
+ 0.0019700047302373467,
+ 2.7824925568324103e-06,
+ 0.010637469044770306,
+ 3.0607418125156515e-05,
+ 2.7824925568324103e-06,
+ 0.00016694955340994464,
+ 0.0004758062272183422,
+ 0.0015025459806895017,
+ 0.0003366815993767217,
+ 6.677982136397785e-05,
+ 0.000698405631764935,
+ 2.7824925568324103e-06,
+ 0.0008208353042655611,
+ 5.564985113664821e-06,
+ 1.3912462784162053e-05,
+ 0.00028659673335373827,
+ 0.0001641670608531122,
+ 6.677982136397785e-05,
+ 1.9477447897826873e-05,
+ 5.564985113664821e-06,
+ 2.7824925568324105e-05,
+ 0.003152564066891121,
+ 4.173738835248616e-05,
+ 0.002284426389159409,
+ 0.0006149308550599627,
+ 0.0019310498344416928,
+ 2.7824925568324103e-06,
+ 4.4519880909318565e-05,
+ 0.000698405631764935,
+ 1.9477447897826873e-05,
+ 2.7824925568324103e-06,
+ 0.0003533765547177161,
+ 5.564985113664821e-06,
+ 0.0009043100809705334,
+ 1.1129970227329641e-05,
+ 0.007496034948106514,
+ 1.1129970227329641e-05,
+ 0.00021703441943292801,
+ 0.000358941539831381,
+ 2.7824925568324103e-06,
+ 1.6694955340994464e-05,
+ 0.00014747210551211776,
+ 0.00018642700130777151,
+ 5.564985113664821e-06,
+ 0.00010295222460279918,
+ 0.0013467263975068867,
+ 0.0003895489579565375,
+ 0.0002114694343192632,
+ 0.00025042433011491697,
+ 9.182225437546954e-05,
+ 8.06922841481399e-05,
+ 0.00015860207573944738,
+ 0.0014608085923370154,
+ 0.00010851720971646401,
+ 0.0007874453935835722,
+ 5.564985113664821e-06,
+ 0,
+ 0.00014747210551211776,
+ 0.0015693258020534795,
+ 0.0004702412421046774,
+ 0,
+ 0.00155819583182615,
+ 2.7824925568324103e-06,
+ 3.0607418125156515e-05,
+ 0.004165391357578118,
+ 4.4519880909318565e-05,
+ 8.06922841481399e-05,
+ 0,
+ 0.0038815771167812125,
+ 2.7824925568324103e-06,
+ 0,
+ 0.002259383956147917,
+ 5.564985113664821e-06,
+ 0.0004479813016500181
+ ],
+ "y0": " ",
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "customdata": [
+ [
+ 0,
+ 20,
+ 0.000249613099695472
+ ],
+ [
+ 35,
+ 1,
+ 1.2480654984773601e-05
+ ],
+ [
+ 24,
+ 3,
+ 3.74419649543208e-05
+ ],
+ [
+ 2151,
+ 18,
+ 0.00022465178972592482
+ ],
+ [
+ 2361,
+ 4,
+ 4.9922619939094404e-05
+ ],
+ [
+ 25,
+ 4,
+ 4.9922619939094404e-05
+ ],
+ [
+ 0,
+ 3,
+ 3.74419649543208e-05
+ ],
+ [
+ 0,
+ 2,
+ 2.4961309969547202e-05
+ ],
+ [
+ 71,
+ 0,
+ 0
+ ],
+ [
+ 281,
+ 1,
+ 1.2480654984773601e-05
+ ],
+ [
+ 1008,
+ 6,
+ 7.48839299086416e-05
+ ],
+ [
+ 9,
+ 30,
+ 0.00037441964954320803
+ ],
+ [
+ 2,
+ 7,
+ 8.736458489341521e-05
+ ],
+ [
+ 1,
+ 198,
+ 0.002471169686985173
+ ],
+ [
+ 40,
+ 5,
+ 6.2403274923868e-05
+ ],
+ [
+ 140,
+ 12,
+ 0.0001497678598172832
+ ],
+ [
+ 28,
+ 1,
+ 1.2480654984773601e-05
+ ],
+ [
+ 47,
+ 0,
+ 0
+ ],
+ [
+ 124,
+ 0,
+ 0
+ ],
+ [
+ 2,
+ 6,
+ 7.48839299086416e-05
+ ],
+ [
+ 6,
+ 0,
+ 0
+ ],
+ [
+ 285,
+ 307,
+ 0.0038315610803254956
+ ],
+ [
+ 39,
+ 46,
+ 0.0005741101292995856
+ ],
+ [
+ 152,
+ 2,
+ 2.4961309969547202e-05
+ ],
+ [
+ 1260,
+ 3,
+ 3.74419649543208e-05
+ ],
+ [
+ 14,
+ 7,
+ 8.736458489341521e-05
+ ],
+ [
+ 3,
+ 19,
+ 0.00023713244471069842
+ ],
+ [
+ 215,
+ 126,
+ 0.0015725625280814737
+ ],
+ [
+ 90,
+ 0,
+ 0
+ ],
+ [
+ 1,
+ 34,
+ 0.00042434226948230244
+ ],
+ [
+ 2,
+ 18,
+ 0.00022465178972592482
+ ],
+ [
+ 15,
+ 6,
+ 7.48839299086416e-05
+ ],
+ [
+ 1563,
+ 9,
+ 0.00011232589486296241
+ ],
+ [
+ 154,
+ 5,
+ 6.2403274923868e-05
+ ],
+ [
+ 207,
+ 23,
+ 0.0002870550646497928
+ ],
+ [
+ 472,
+ 303,
+ 0.0037816384603864012
+ ]
+ ],
+ "hovertemplate": "Treatment_Type=%{x} %_B7H4=%{y} B7H4_cells=%{customdata[0]} PDL1_cells=%{customdata[1]} %_PDL1=%{customdata[2]} ",
+ "legendgroup": "NACT",
+ "marker": {
+ "color": "#EF553B"
+ },
+ "name": "NACT",
+ "notched": false,
+ "offsetgroup": "NACT",
+ "orientation": "v",
+ "showlegend": true,
+ "type": "box",
+ "x": [
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT"
+ ],
+ "x0": " ",
+ "xaxis": "x",
+ "y": [
+ 0,
+ 0.0005274818018778352,
+ 0.00036170180700194414,
+ 0.032417524452549244,
+ 0.03558241526381625,
+ 0.00037677271562702513,
+ 0,
+ 0,
+ 0.0010700345123807514,
+ 0.004234925323647763,
+ 0.015191475894081654,
+ 0.00013563817762572906,
+ 3.0141817250162012e-05,
+ 1.5070908625081006e-05,
+ 0.0006028363450032402,
+ 0.0021099272075113407,
+ 0.00042198544150226817,
+ 0.0007083327053788073,
+ 0.0018687926695100448,
+ 3.0141817250162012e-05,
+ 9.042545175048603e-05,
+ 0.004295208958148087,
+ 0.0005877654363781593,
+ 0.002290778111012313,
+ 0.01898934486760207,
+ 0.00021099272075113408,
+ 4.521272587524302e-05,
+ 0.003240245354392416,
+ 0.0013563817762572905,
+ 1.5070908625081006e-05,
+ 3.0141817250162012e-05,
+ 0.00022606362937621508,
+ 0.023555830181001613,
+ 0.002320919928262475,
+ 0.003119678085391768,
+ 0.007113468871038235
+ ],
+ "y0": " ",
+ "yaxis": "y"
+ }
+ ],
+ "layout": {
+ "boxmode": "overlay",
+ "legend": {
+ "title": {
+ "font": {
+ "family": "Arial, sans-serif",
+ "size": 12
+ },
+ "text": "Treatment"
+ },
+ "tracegroupgap": 0
+ },
+ "margin": {
+ "t": 60
+ },
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "white",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "white",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "#C8D4E3",
+ "linecolor": "#C8D4E3",
+ "minorgridcolor": "#C8D4E3",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "#C8D4E3",
+ "linecolor": "#C8D4E3",
+ "minorgridcolor": "#C8D4E3",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "white",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "#C8D4E3"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "white",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": ""
+ },
+ "bgcolor": "white",
+ "radialaxis": {
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ },
+ "yaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ },
+ "zaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ },
+ "bgcolor": "white",
+ "caxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#EBF0F8",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#EBF0F8",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "font": {
+ "family": "Arial, sans-serif",
+ "size": 18
+ },
+ "text": "Distribution of % B7H4 in Cancer Cells by Treatment",
+ "x": 0.5
+ },
+ "xaxis": {
+ "anchor": "y",
+ "autorange": true,
+ "categoryarray": [
+ "ACT",
+ "NACT"
+ ],
+ "categoryorder": "array",
+ "domain": [
+ 0,
+ 1
+ ],
+ "linecolor": "black",
+ "linewidth": 2,
+ "mirror": true,
+ "range": [
+ -0.5,
+ 1.5
+ ],
+ "showline": true,
+ "tickangle": -45,
+ "title": {
+ "font": {
+ "family": "Arial, sans-serif",
+ "size": 14
+ },
+ "text": "Treatment Type"
+ },
+ "type": "category"
+ },
+ "yaxis": {
+ "anchor": "x",
+ "autorange": true,
+ "domain": [
+ 0,
+ 1
+ ],
+ "gridcolor": "white",
+ "gridwidth": 1,
+ "linecolor": "black",
+ "linewidth": 2,
+ "mirror": true,
+ "range": [
+ -0.0019768008479897916,
+ 0.03755921611180604
+ ],
+ "showgrid": true,
+ "showline": true,
+ "title": {
+ "font": {
+ "family": "Arial, sans-serif",
+ "size": 14
+ },
+ "text": "% B7H4"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "ename": "AssertionError",
+ "evalue": "",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mAssertionError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[120], line 41\u001b[0m\n\u001b[0;32m 37\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mstatsmodels\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mstats\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmulticomp\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m pairwise_tukeyhsd\n\u001b[0;32m 39\u001b[0m \u001b[38;5;66;03m# Assuming 'result_sorted' is your DataFrame and already imported\u001b[39;00m\n\u001b[0;32m 40\u001b[0m \u001b[38;5;66;03m# Perform ANOVA\u001b[39;00m\n\u001b[1;32m---> 41\u001b[0m model \u001b[38;5;241m=\u001b[39m \u001b[43mols\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43m%\u001b[39;49m\u001b[38;5;124;43m_B7H4 ~ C(Treatment_Type)\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mresult_sorted\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mfit()\n\u001b[0;32m 42\u001b[0m anova_table \u001b[38;5;241m=\u001b[39m sm\u001b[38;5;241m.\u001b[39mstats\u001b[38;5;241m.\u001b[39manova_lm(model, typ\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m) \u001b[38;5;66;03m# Type 2 ANOVA DataFrame\u001b[39;00m\n\u001b[0;32m 44\u001b[0m \u001b[38;5;28mprint\u001b[39m(anova_table)\n",
+ "File \u001b[1;32mc:\\Logiciels\\Anaconda\\envs\\CycIF-python\\lib\\site-packages\\statsmodels\\base\\model.py:203\u001b[0m, in \u001b[0;36mModel.from_formula\u001b[1;34m(cls, formula, data, subset, drop_cols, *args, **kwargs)\u001b[0m\n\u001b[0;32m 200\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m missing \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mnone\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;66;03m# with patsy it's drop or raise. let's raise.\u001b[39;00m\n\u001b[0;32m 201\u001b[0m missing \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mraise\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m--> 203\u001b[0m tmp \u001b[38;5;241m=\u001b[39m \u001b[43mhandle_formula_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mformula\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdepth\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43meval_env\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 204\u001b[0m \u001b[43m \u001b[49m\u001b[43mmissing\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmissing\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 205\u001b[0m ((endog, exog), missing_idx, design_info) \u001b[38;5;241m=\u001b[39m tmp\n\u001b[0;32m 206\u001b[0m max_endog \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39m_formula_max_endog\n",
+ "File \u001b[1;32mc:\\Logiciels\\Anaconda\\envs\\CycIF-python\\lib\\site-packages\\statsmodels\\formula\\formulatools.py:63\u001b[0m, in \u001b[0;36mhandle_formula_data\u001b[1;34m(Y, X, formula, depth, missing)\u001b[0m\n\u001b[0;32m 61\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 62\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m data_util\u001b[38;5;241m.\u001b[39m_is_using_pandas(Y, \u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m---> 63\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mdmatrices\u001b[49m\u001b[43m(\u001b[49m\u001b[43mformula\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mY\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdepth\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreturn_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mdataframe\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[0;32m 64\u001b[0m \u001b[43m \u001b[49m\u001b[43mNA_action\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mna_action\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 65\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 66\u001b[0m result \u001b[38;5;241m=\u001b[39m dmatrices(formula, Y, depth, return_type\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdataframe\u001b[39m\u001b[38;5;124m'\u001b[39m,\n\u001b[0;32m 67\u001b[0m NA_action\u001b[38;5;241m=\u001b[39mna_action)\n",
+ "File \u001b[1;32mc:\\Logiciels\\Anaconda\\envs\\CycIF-python\\lib\\site-packages\\patsy\\highlevel.py:309\u001b[0m, in \u001b[0;36mdmatrices\u001b[1;34m(formula_like, data, eval_env, NA_action, return_type)\u001b[0m\n\u001b[0;32m 299\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Construct two design matrices given a formula_like and data.\u001b[39;00m\n\u001b[0;32m 300\u001b[0m \n\u001b[0;32m 301\u001b[0m \u001b[38;5;124;03mThis function is identical to :func:`dmatrix`, except that it requires\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 306\u001b[0m \u001b[38;5;124;03mSee :func:`dmatrix` for details.\u001b[39;00m\n\u001b[0;32m 307\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 308\u001b[0m eval_env \u001b[38;5;241m=\u001b[39m EvalEnvironment\u001b[38;5;241m.\u001b[39mcapture(eval_env, reference\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m--> 309\u001b[0m (lhs, rhs) \u001b[38;5;241m=\u001b[39m \u001b[43m_do_highlevel_design\u001b[49m\u001b[43m(\u001b[49m\u001b[43mformula_like\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meval_env\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 310\u001b[0m \u001b[43m \u001b[49m\u001b[43mNA_action\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreturn_type\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 311\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m lhs\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m1\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[0;32m 312\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m PatsyError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmodel is missing required outcome variables\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
+ "File \u001b[1;32mc:\\Logiciels\\Anaconda\\envs\\CycIF-python\\lib\\site-packages\\patsy\\highlevel.py:164\u001b[0m, in \u001b[0;36m_do_highlevel_design\u001b[1;34m(formula_like, data, eval_env, NA_action, return_type)\u001b[0m\n\u001b[0;32m 162\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdata_iter_maker\u001b[39m():\n\u001b[0;32m 163\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28miter\u001b[39m([data])\n\u001b[1;32m--> 164\u001b[0m design_infos \u001b[38;5;241m=\u001b[39m \u001b[43m_try_incr_builders\u001b[49m\u001b[43m(\u001b[49m\u001b[43mformula_like\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata_iter_maker\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43meval_env\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 165\u001b[0m \u001b[43m \u001b[49m\u001b[43mNA_action\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 166\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m design_infos \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m 167\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m build_design_matrices(design_infos, data,\n\u001b[0;32m 168\u001b[0m NA_action\u001b[38;5;241m=\u001b[39mNA_action,\n\u001b[0;32m 169\u001b[0m return_type\u001b[38;5;241m=\u001b[39mreturn_type)\n",
+ "File \u001b[1;32mc:\\Logiciels\\Anaconda\\envs\\CycIF-python\\lib\\site-packages\\patsy\\highlevel.py:62\u001b[0m, in \u001b[0;36m_try_incr_builders\u001b[1;34m(formula_like, data_iter_maker, eval_env, NA_action)\u001b[0m\n\u001b[0;32m 55\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m PatsyError(\n\u001b[0;32m 56\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mOn Python 2, formula strings must be either \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstr\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m objects, \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 57\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mor else \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124municode\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m objects containing only ascii \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 58\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcharacters. You passed a unicode string with non-ascii \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 59\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcharacters. I\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mm afraid you\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mll have to either switch to \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 60\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mascii-only, or else upgrade to Python 3.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 61\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(formula_like, \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m---> 62\u001b[0m formula_like \u001b[38;5;241m=\u001b[39m \u001b[43mModelDesc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfrom_formula\u001b[49m\u001b[43m(\u001b[49m\u001b[43mformula_like\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 63\u001b[0m \u001b[38;5;66;03m# fallthrough\u001b[39;00m\n\u001b[0;32m 64\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(formula_like, ModelDesc):\n",
+ "File \u001b[1;32mc:\\Logiciels\\Anaconda\\envs\\CycIF-python\\lib\\site-packages\\patsy\\desc.py:165\u001b[0m, in \u001b[0;36mModelDesc.from_formula\u001b[1;34m(cls, tree_or_string)\u001b[0m\n\u001b[0;32m 163\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 164\u001b[0m tree \u001b[38;5;241m=\u001b[39m parse_formula(tree_or_string)\n\u001b[1;32m--> 165\u001b[0m value \u001b[38;5;241m=\u001b[39m \u001b[43mEvaluator\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtree\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrequire_evalexpr\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[0;32m 166\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(value, \u001b[38;5;28mcls\u001b[39m)\n\u001b[0;32m 167\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m value\n",
+ "File \u001b[1;32mc:\\Logiciels\\Anaconda\\envs\\CycIF-python\\lib\\site-packages\\patsy\\desc.py:400\u001b[0m, in \u001b[0;36mEvaluator.eval\u001b[1;34m(self, tree, require_evalexpr)\u001b[0m\n\u001b[0;32m 396\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m key \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_evaluators:\n\u001b[0;32m 397\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m PatsyError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mI don\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt know how to evaluate this \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 398\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m operator\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m (tree\u001b[38;5;241m.\u001b[39mtype,),\n\u001b[0;32m 399\u001b[0m tree\u001b[38;5;241m.\u001b[39mtoken)\n\u001b[1;32m--> 400\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_evaluators\u001b[49m\u001b[43m[\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m]\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtree\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 401\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m require_evalexpr \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(result, IntermediateExpr):\n\u001b[0;32m 402\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(result, ModelDesc):\n",
+ "File \u001b[1;32mc:\\Logiciels\\Anaconda\\envs\\CycIF-python\\lib\\site-packages\\patsy\\desc.py:221\u001b[0m, in \u001b[0;36m_eval_any_tilde\u001b[1;34m(evaluator, tree)\u001b[0m\n\u001b[0;32m 220\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_eval_any_tilde\u001b[39m(evaluator, tree):\n\u001b[1;32m--> 221\u001b[0m exprs \u001b[38;5;241m=\u001b[39m [evaluator\u001b[38;5;241m.\u001b[39meval(arg) \u001b[38;5;28;01mfor\u001b[39;00m arg \u001b[38;5;129;01min\u001b[39;00m tree\u001b[38;5;241m.\u001b[39margs] \n\u001b[0;32m 222\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(exprs) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[0;32m 223\u001b[0m \u001b[38;5;66;03m# Formula was like: \"~ foo\"\u001b[39;00m\n\u001b[0;32m 224\u001b[0m \u001b[38;5;66;03m# We pretend that instead it was like: \"0 ~ foo\"\u001b[39;00m\n\u001b[0;32m 225\u001b[0m exprs\u001b[38;5;241m.\u001b[39minsert(\u001b[38;5;241m0\u001b[39m, IntermediateExpr(\u001b[38;5;28;01mFalse\u001b[39;00m, \u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;28;01mTrue\u001b[39;00m, []))\n",
+ "File \u001b[1;32mc:\\Logiciels\\Anaconda\\envs\\CycIF-python\\lib\\site-packages\\patsy\\desc.py:221\u001b[0m, in \u001b[0;36m\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 220\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_eval_any_tilde\u001b[39m(evaluator, tree):\n\u001b[1;32m--> 221\u001b[0m exprs \u001b[38;5;241m=\u001b[39m [\u001b[43mevaluator\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43meval\u001b[49m\u001b[43m(\u001b[49m\u001b[43marg\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m arg \u001b[38;5;129;01min\u001b[39;00m tree\u001b[38;5;241m.\u001b[39margs] \n\u001b[0;32m 222\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(exprs) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[0;32m 223\u001b[0m \u001b[38;5;66;03m# Formula was like: \"~ foo\"\u001b[39;00m\n\u001b[0;32m 224\u001b[0m \u001b[38;5;66;03m# We pretend that instead it was like: \"0 ~ foo\"\u001b[39;00m\n\u001b[0;32m 225\u001b[0m exprs\u001b[38;5;241m.\u001b[39minsert(\u001b[38;5;241m0\u001b[39m, IntermediateExpr(\u001b[38;5;28;01mFalse\u001b[39;00m, \u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;28;01mTrue\u001b[39;00m, []))\n",
+ "File \u001b[1;32mc:\\Logiciels\\Anaconda\\envs\\CycIF-python\\lib\\site-packages\\patsy\\desc.py:400\u001b[0m, in \u001b[0;36mEvaluator.eval\u001b[1;34m(self, tree, require_evalexpr)\u001b[0m\n\u001b[0;32m 396\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m key \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_evaluators:\n\u001b[0;32m 397\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m PatsyError(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mI don\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt know how to evaluate this \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 398\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m operator\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m (tree\u001b[38;5;241m.\u001b[39mtype,),\n\u001b[0;32m 399\u001b[0m tree\u001b[38;5;241m.\u001b[39mtoken)\n\u001b[1;32m--> 400\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_evaluators\u001b[49m\u001b[43m[\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m]\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtree\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 401\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m require_evalexpr \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(result, IntermediateExpr):\n\u001b[0;32m 402\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(result, ModelDesc):\n",
+ "File \u001b[1;32mc:\\Logiciels\\Anaconda\\envs\\CycIF-python\\lib\\site-packages\\patsy\\desc.py:358\u001b[0m, in \u001b[0;36m_eval_python_expr\u001b[1;34m(evaluator, tree)\u001b[0m\n\u001b[0;32m 357\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_eval_python_expr\u001b[39m(evaluator, tree):\n\u001b[1;32m--> 358\u001b[0m factor \u001b[38;5;241m=\u001b[39m \u001b[43mEvalFactor\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtree\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtoken\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mextra\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morigin\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtree\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43morigin\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 359\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m IntermediateExpr(\u001b[38;5;28;01mFalse\u001b[39;00m, \u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;28;01mFalse\u001b[39;00m, [Term([factor])])\n",
+ "File \u001b[1;32mc:\\Logiciels\\Anaconda\\envs\\CycIF-python\\lib\\site-packages\\patsy\\eval.py:452\u001b[0m, in \u001b[0;36mEvalFactor.__init__\u001b[1;34m(self, code, origin)\u001b[0m\n\u001b[0;32m 430\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"A factor class that executes arbitrary Python code and supports\u001b[39;00m\n\u001b[0;32m 431\u001b[0m \u001b[38;5;124;03mstateful transforms.\u001b[39;00m\n\u001b[0;32m 432\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 446\u001b[0m \u001b[38;5;124;03m assert EvalFactor(\"a + b\") != EvalFactor(\"b + a\")\u001b[39;00m\n\u001b[0;32m 447\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 449\u001b[0m \u001b[38;5;66;03m# For parsed formulas, the code will already have been normalized by\u001b[39;00m\n\u001b[0;32m 450\u001b[0m \u001b[38;5;66;03m# the parser. But let's normalize anyway, so we can be sure of having\u001b[39;00m\n\u001b[0;32m 451\u001b[0m \u001b[38;5;66;03m# consistent semantics for __eq__ and __hash__.\u001b[39;00m\n\u001b[1;32m--> 452\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcode \u001b[38;5;241m=\u001b[39m \u001b[43mnormalize_token_spacing\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 453\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39morigin \u001b[38;5;241m=\u001b[39m origin\n",
+ "File \u001b[1;32mc:\\Logiciels\\Anaconda\\envs\\CycIF-python\\lib\\site-packages\\patsy\\tokens.py:157\u001b[0m, in \u001b[0;36mnormalize_token_spacing\u001b[1;34m(code)\u001b[0m\n\u001b[0;32m 154\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnormalize_token_spacing\u001b[39m(code):\n\u001b[0;32m 155\u001b[0m tokens \u001b[38;5;241m=\u001b[39m [(t[\u001b[38;5;241m0\u001b[39m], t[\u001b[38;5;241m1\u001b[39m])\n\u001b[0;32m 156\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m t \u001b[38;5;129;01min\u001b[39;00m tokenize\u001b[38;5;241m.\u001b[39mgenerate_tokens(StringIO(code)\u001b[38;5;241m.\u001b[39mreadline)]\n\u001b[1;32m--> 157\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mpretty_untokenize\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtokens\u001b[49m\u001b[43m)\u001b[49m\n",
+ "File \u001b[1;32mc:\\Logiciels\\Anaconda\\envs\\CycIF-python\\lib\\site-packages\\patsy\\tokens.py:103\u001b[0m, in \u001b[0;36mpretty_untokenize\u001b[1;34m(typed_tokens)\u001b[0m\n\u001b[0;32m 101\u001b[0m brackets \u001b[38;5;241m=\u001b[39m []\n\u001b[0;32m 102\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m token_type, token \u001b[38;5;129;01min\u001b[39;00m typed_tokens:\n\u001b[1;32m--> 103\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m token_type \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m (tokenize\u001b[38;5;241m.\u001b[39mINDENT, tokenize\u001b[38;5;241m.\u001b[39mDEDENT,\n\u001b[0;32m 104\u001b[0m tokenize\u001b[38;5;241m.\u001b[39mNL)\n\u001b[0;32m 105\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m token_type \u001b[38;5;241m==\u001b[39m tokenize\u001b[38;5;241m.\u001b[39mNEWLINE:\n\u001b[0;32m 106\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n",
+ "\u001b[1;31mAssertionError\u001b[0m: "
+ ]
+ }
+ ],
+ "source": [
+ "import plotly.express as px\n",
+ "\n",
+ "fig = px.box(result_sorted, x='Treatment_Type', y='%_B7H4', \n",
+ " hover_data=result_sorted.columns,\n",
+ " color='Treatment_Type', # This can be set to a single color if preferred\n",
+ " template='plotly_white', # Starting with a clean white template\n",
+ " )\n",
+ "\n",
+ "fig.update_layout(\n",
+ " title_text='Distribution of % B7H4 in Cancer Cells by Treatment',\n",
+ " title_x=0.5, # Center the title\n",
+ " title_font=dict(size=18, family='Arial, sans-serif'),\n",
+ " xaxis_title='Treatment Type',\n",
+ " yaxis_title='% B7H4',\n",
+ " xaxis=dict(tickangle=-45, title_font=dict(size=14, family='Arial, sans-serif')),\n",
+ " yaxis=dict(title_font=dict(size=14, family='Arial, sans-serif')),\n",
+ " legend_title_text='Treatment',\n",
+ " legend_title_font=dict(size=12, family='Arial, sans-serif'),\n",
+ ")\n",
+ "\n",
+ "# Adjusting gridlines to mimic R's ggplot2 style\n",
+ "fig.update_yaxes(showgrid=True, gridwidth=1, gridcolor='white')\n",
+ "fig.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\n",
+ "fig.update_yaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\n",
+ "\n",
+ "fig.show()\n",
+ "plot(fig)\n",
+ "\n",
+ "import plotly.io as pio\n",
+ "#pio.write_image(fig, 'Violinplot_%B7H4.png')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 178,
+ "id": "d65d70d0-84f0-49d0-afed-06629bf4fa45",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "alignmentgroup": "True",
+ "customdata": [
+ [
+ 18,
+ 4,
+ 5.008486602298339e-05
+ ],
+ [
+ 663,
+ 0,
+ 0.0018447925651798882
+ ],
+ [
+ 61,
+ 41,
+ 0.00016973204596677704
+ ],
+ [
+ 135,
+ 31,
+ 0.0003756364951723754
+ ],
+ [
+ 12,
+ 120,
+ 3.338991068198893e-05
+ ],
+ [
+ 1,
+ 4,
+ 2.7824925568324103e-06
+ ],
+ [
+ 5,
+ 25,
+ 1.3912462784162053e-05
+ ],
+ [
+ 0,
+ 37,
+ 0
+ ],
+ [
+ 1,
+ 1,
+ 2.7824925568324103e-06
+ ],
+ [
+ 0,
+ 9,
+ 0
+ ],
+ [
+ 1,
+ 6,
+ 2.7824925568324103e-06
+ ],
+ [
+ 605,
+ 145,
+ 0.0016834079968836083
+ ],
+ [
+ 1093,
+ 7,
+ 0.0030412643646178248
+ ],
+ [
+ 347,
+ 27,
+ 0.0009655249172208464
+ ],
+ [
+ 930,
+ 1,
+ 0.0025877180778541417
+ ],
+ [
+ 48,
+ 55,
+ 0.0001335596427279557
+ ],
+ [
+ 884,
+ 100,
+ 0.0024597234202398508
+ ],
+ [
+ 2,
+ 7,
+ 5.564985113664821e-06
+ ],
+ [
+ 2,
+ 1,
+ 5.564985113664821e-06
+ ],
+ [
+ 9,
+ 3,
+ 2.5042433011491696e-05
+ ],
+ [
+ 284,
+ 40,
+ 0.0007902278861404046
+ ],
+ [
+ 56,
+ 6,
+ 0.00015581958318261499
+ ],
+ [
+ 115,
+ 28,
+ 0.0003199866440357272
+ ],
+ [
+ 88,
+ 1,
+ 0.0002448593450012521
+ ],
+ [
+ 1350,
+ 28,
+ 0.003756364951723754
+ ],
+ [
+ 3,
+ 124,
+ 8.347477670497232e-06
+ ],
+ [
+ 0,
+ 12,
+ 0
+ ],
+ [
+ 3,
+ 6,
+ 8.347477670497232e-06
+ ],
+ [
+ 4,
+ 9,
+ 1.1129970227329641e-05
+ ],
+ [
+ 0,
+ 13,
+ 0
+ ],
+ [
+ 22,
+ 12,
+ 6.121483625031303e-05
+ ],
+ [
+ 753,
+ 10,
+ 0.002095216895294805
+ ],
+ [
+ 7,
+ 9,
+ 1.9477447897826873e-05
+ ],
+ [
+ 1,
+ 0,
+ 2.7824925568324103e-06
+ ],
+ [
+ 10,
+ 391,
+ 2.7824925568324105e-05
+ ],
+ [
+ 232,
+ 5,
+ 0.0006455382731851192
+ ],
+ [
+ 3,
+ 82,
+ 8.347477670497232e-06
+ ],
+ [
+ 6,
+ 15,
+ 1.6694955340994464e-05
+ ],
+ [
+ 1685,
+ 14,
+ 0.004688499958262611
+ ],
+ [
+ 134,
+ 33,
+ 0.00037285400261554303
+ ],
+ [
+ 78,
+ 24,
+ 0.00021703441943292801
+ ],
+ [
+ 10,
+ 0,
+ 2.7824925568324105e-05
+ ],
+ [
+ 68,
+ 90,
+ 0.0001892094938646039
+ ],
+ [
+ 22,
+ 63,
+ 6.121483625031303e-05
+ ],
+ [
+ 25,
+ 3,
+ 6.956231392081027e-05
+ ],
+ [
+ 34,
+ 0,
+ 9.460474693230196e-05
+ ],
+ [
+ 748,
+ 5,
+ 0.002081304432510643
+ ],
+ [
+ 6,
+ 13,
+ 1.6694955340994464e-05
+ ],
+ [
+ 175,
+ 273,
+ 0.00048693619744567183
+ ],
+ [
+ 0,
+ 1,
+ 0
+ ],
+ [
+ 671,
+ 35,
+ 0.0018670525056345474
+ ],
+ [
+ 634,
+ 36,
+ 0.0017641002810317482
+ ],
+ [
+ 247,
+ 6,
+ 0.0006872756615376054
+ ],
+ [
+ 207,
+ 7,
+ 0.000575975959264309
+ ],
+ [
+ 192,
+ 2,
+ 0.0005342385709118228
+ ],
+ [
+ 1,
+ 8,
+ 2.7824925568324103e-06
+ ],
+ [
+ 2,
+ 3,
+ 5.564985113664821e-06
+ ],
+ [
+ 0,
+ 4,
+ 0
+ ],
+ [
+ 11,
+ 27,
+ 3.0607418125156515e-05
+ ],
+ [
+ 0,
+ 583,
+ 0
+ ],
+ [
+ 2,
+ 8,
+ 5.564985113664821e-06
+ ],
+ [
+ 3,
+ 71,
+ 8.347477670497232e-06
+ ],
+ [
+ 708,
+ 0,
+ 0.0019700047302373467
+ ],
+ [
+ 1,
+ 7,
+ 2.7824925568324103e-06
+ ],
+ [
+ 3823,
+ 20,
+ 0.010637469044770306
+ ],
+ [
+ 11,
+ 50,
+ 3.0607418125156515e-05
+ ],
+ [
+ 1,
+ 1285,
+ 2.7824925568324103e-06
+ ],
+ [
+ 60,
+ 4,
+ 0.00016694955340994464
+ ],
+ [
+ 171,
+ 3,
+ 0.0004758062272183422
+ ],
+ [
+ 540,
+ 7,
+ 0.0015025459806895017
+ ],
+ [
+ 121,
+ 9,
+ 0.0003366815993767217
+ ],
+ [
+ 24,
+ 0,
+ 6.677982136397785e-05
+ ],
+ [
+ 251,
+ 14,
+ 0.000698405631764935
+ ],
+ [
+ 1,
+ 4,
+ 2.7824925568324103e-06
+ ],
+ [
+ 295,
+ 4,
+ 0.0008208353042655611
+ ],
+ [
+ 2,
+ 0,
+ 5.564985113664821e-06
+ ],
+ [
+ 5,
+ 0,
+ 1.3912462784162053e-05
+ ],
+ [
+ 103,
+ 7,
+ 0.00028659673335373827
+ ],
+ [
+ 59,
+ 1,
+ 0.0001641670608531122
+ ],
+ [
+ 24,
+ 8,
+ 6.677982136397785e-05
+ ],
+ [
+ 7,
+ 54,
+ 1.9477447897826873e-05
+ ],
+ [
+ 2,
+ 133,
+ 5.564985113664821e-06
+ ],
+ [
+ 10,
+ 1,
+ 2.7824925568324105e-05
+ ],
+ [
+ 1133,
+ 16,
+ 0.003152564066891121
+ ],
+ [
+ 15,
+ 36,
+ 4.173738835248616e-05
+ ],
+ [
+ 821,
+ 0,
+ 0.002284426389159409
+ ],
+ [
+ 221,
+ 3,
+ 0.0006149308550599627
+ ],
+ [
+ 694,
+ 0,
+ 0.0019310498344416928
+ ],
+ [
+ 1,
+ 0,
+ 2.7824925568324103e-06
+ ],
+ [
+ 16,
+ 0,
+ 4.4519880909318565e-05
+ ],
+ [
+ 251,
+ 0,
+ 0.000698405631764935
+ ],
+ [
+ 7,
+ 279,
+ 1.9477447897826873e-05
+ ],
+ [
+ 1,
+ 4,
+ 2.7824925568324103e-06
+ ],
+ [
+ 127,
+ 13,
+ 0.0003533765547177161
+ ],
+ [
+ 2,
+ 5,
+ 5.564985113664821e-06
+ ],
+ [
+ 325,
+ 2,
+ 0.0009043100809705334
+ ],
+ [
+ 4,
+ 0,
+ 1.1129970227329641e-05
+ ],
+ [
+ 2694,
+ 2,
+ 0.007496034948106514
+ ],
+ [
+ 4,
+ 1,
+ 1.1129970227329641e-05
+ ],
+ [
+ 78,
+ 2,
+ 0.00021703441943292801
+ ],
+ [
+ 129,
+ 10,
+ 0.000358941539831381
+ ],
+ [
+ 1,
+ 8,
+ 2.7824925568324103e-06
+ ],
+ [
+ 6,
+ 1,
+ 1.6694955340994464e-05
+ ],
+ [
+ 53,
+ 3,
+ 0.00014747210551211776
+ ],
+ [
+ 67,
+ 27,
+ 0.00018642700130777151
+ ],
+ [
+ 2,
+ 5,
+ 5.564985113664821e-06
+ ],
+ [
+ 37,
+ 1,
+ 0.00010295222460279918
+ ],
+ [
+ 484,
+ 2,
+ 0.0013467263975068867
+ ],
+ [
+ 140,
+ 0,
+ 0.0003895489579565375
+ ],
+ [
+ 76,
+ 2,
+ 0.0002114694343192632
+ ],
+ [
+ 90,
+ 9,
+ 0.00025042433011491697
+ ],
+ [
+ 33,
+ 9,
+ 9.182225437546954e-05
+ ],
+ [
+ 29,
+ 4,
+ 8.06922841481399e-05
+ ],
+ [
+ 57,
+ 107,
+ 0.00015860207573944738
+ ],
+ [
+ 525,
+ 0,
+ 0.0014608085923370154
+ ],
+ [
+ 39,
+ 12,
+ 0.00010851720971646401
+ ],
+ [
+ 283,
+ 2,
+ 0.0007874453935835722
+ ],
+ [
+ 2,
+ 10,
+ 5.564985113664821e-06
+ ],
+ [
+ 0,
+ 18,
+ 0
+ ],
+ [
+ 53,
+ 13,
+ 0.00014747210551211776
+ ],
+ [
+ 564,
+ 85,
+ 0.0015693258020534795
+ ],
+ [
+ 169,
+ 177,
+ 0.0004702412421046774
+ ],
+ [
+ 0,
+ 16,
+ 0
+ ],
+ [
+ 560,
+ 7,
+ 0.00155819583182615
+ ],
+ [
+ 1,
+ 7,
+ 2.7824925568324103e-06
+ ],
+ [
+ 11,
+ 0,
+ 3.0607418125156515e-05
+ ],
+ [
+ 1497,
+ 5,
+ 0.004165391357578118
+ ],
+ [
+ 16,
+ 12,
+ 4.4519880909318565e-05
+ ],
+ [
+ 29,
+ 83,
+ 8.06922841481399e-05
+ ],
+ [
+ 0,
+ 15,
+ 0
+ ],
+ [
+ 1395,
+ 4,
+ 0.0038815771167812125
+ ],
+ [
+ 1,
+ 28,
+ 2.7824925568324103e-06
+ ],
+ [
+ 0,
+ 6,
+ 0
+ ],
+ [
+ 812,
+ 0,
+ 0.002259383956147917
+ ],
+ [
+ 2,
+ 46,
+ 5.564985113664821e-06
+ ],
+ [
+ 161,
+ 2,
+ 0.0004479813016500181
+ ]
+ ],
+ "hovertemplate": "Treatment_Type=%{x} %_PDL1=%{y} B7H4_cells=%{customdata[0]} PDL1_cells=%{customdata[1]} %_B7H4=%{customdata[2]} ",
+ "legendgroup": "ACT",
+ "marker": {
+ "color": "#636efa"
+ },
+ "name": "ACT",
+ "notched": false,
+ "offsetgroup": "ACT",
+ "orientation": "v",
+ "showlegend": true,
+ "type": "box",
+ "x": [
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT"
+ ],
+ "x0": " ",
+ "xaxis": "x",
+ "y": [
+ 9.796478166099287e-06,
+ 0,
+ 0.0001004139012025177,
+ 7.592270578726947e-05,
+ 0.0002938943449829786,
+ 9.796478166099287e-06,
+ 6.122798853812054e-05,
+ 9.061742303641841e-05,
+ 2.4491195415248216e-06,
+ 2.2042075873723398e-05,
+ 1.469471724914893e-05,
+ 0.00035512233352109917,
+ 1.7143836790673752e-05,
+ 6.612622762117019e-05,
+ 2.4491195415248216e-06,
+ 0.0001347015747838652,
+ 0.0002449119541524822,
+ 1.7143836790673752e-05,
+ 2.4491195415248216e-06,
+ 7.347358624574465e-06,
+ 9.796478166099288e-05,
+ 1.469471724914893e-05,
+ 6.857534716269501e-05,
+ 2.4491195415248216e-06,
+ 6.857534716269501e-05,
+ 0.0003036908231490779,
+ 2.938943449829786e-05,
+ 1.469471724914893e-05,
+ 2.2042075873723398e-05,
+ 3.183855403982268e-05,
+ 2.938943449829786e-05,
+ 2.449119541524822e-05,
+ 2.2042075873723398e-05,
+ 0,
+ 0.0009576057407362054,
+ 1.224559770762411e-05,
+ 0.0002008278024050354,
+ 3.6736793122872325e-05,
+ 3.4287673581347504e-05,
+ 8.082094487031911e-05,
+ 5.877886899659572e-05,
+ 0,
+ 0.00022042075873723396,
+ 0.00015429453111606378,
+ 7.347358624574465e-06,
+ 0,
+ 1.224559770762411e-05,
+ 3.183855403982268e-05,
+ 0.0006686096348362763,
+ 2.4491195415248216e-06,
+ 8.571918395336877e-05,
+ 8.816830349489359e-05,
+ 1.469471724914893e-05,
+ 1.7143836790673752e-05,
+ 4.898239083049643e-06,
+ 1.9592956332198573e-05,
+ 7.347358624574465e-06,
+ 9.796478166099287e-06,
+ 6.612622762117019e-05,
+ 0.0014278366927089712,
+ 1.9592956332198573e-05,
+ 0.00017388748744826235,
+ 0,
+ 1.7143836790673752e-05,
+ 4.898239083049644e-05,
+ 0.0001224559770762411,
+ 0.003147118610859396,
+ 9.796478166099287e-06,
+ 7.347358624574465e-06,
+ 1.7143836790673752e-05,
+ 2.2042075873723398e-05,
+ 0,
+ 3.4287673581347504e-05,
+ 9.796478166099287e-06,
+ 9.796478166099287e-06,
+ 0,
+ 0,
+ 1.7143836790673752e-05,
+ 2.4491195415248216e-06,
+ 1.9592956332198573e-05,
+ 0.00013225245524234037,
+ 0.0003257328990228013,
+ 2.4491195415248216e-06,
+ 3.9185912664397146e-05,
+ 8.816830349489359e-05,
+ 0,
+ 7.347358624574465e-06,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.0006833043520854253,
+ 9.796478166099287e-06,
+ 3.183855403982268e-05,
+ 1.224559770762411e-05,
+ 4.898239083049643e-06,
+ 0,
+ 4.898239083049643e-06,
+ 2.4491195415248216e-06,
+ 4.898239083049643e-06,
+ 2.449119541524822e-05,
+ 1.9592956332198573e-05,
+ 2.4491195415248216e-06,
+ 7.347358624574465e-06,
+ 6.612622762117019e-05,
+ 1.224559770762411e-05,
+ 2.4491195415248216e-06,
+ 4.898239083049643e-06,
+ 0,
+ 4.898239083049643e-06,
+ 2.2042075873723398e-05,
+ 2.2042075873723398e-05,
+ 9.796478166099287e-06,
+ 0.00026205579094315594,
+ 0,
+ 2.938943449829786e-05,
+ 4.898239083049643e-06,
+ 2.449119541524822e-05,
+ 4.4084151747446796e-05,
+ 3.183855403982268e-05,
+ 0.00020817516102960984,
+ 0.00043349415884989345,
+ 3.9185912664397146e-05,
+ 1.7143836790673752e-05,
+ 1.7143836790673752e-05,
+ 0,
+ 1.224559770762411e-05,
+ 2.938943449829786e-05,
+ 0.0002032769219465602,
+ 3.6736793122872325e-05,
+ 9.796478166099287e-06,
+ 6.857534716269501e-05,
+ 1.469471724914893e-05,
+ 0,
+ 0.0001126594989101418,
+ 4.898239083049643e-06
+ ],
+ "y0": " ",
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "customdata": [
+ [
+ 0,
+ 20,
+ 0
+ ],
+ [
+ 35,
+ 1,
+ 0.0005274818018778352
+ ],
+ [
+ 24,
+ 3,
+ 0.00036170180700194414
+ ],
+ [
+ 2151,
+ 18,
+ 0.032417524452549244
+ ],
+ [
+ 2361,
+ 4,
+ 0.03558241526381625
+ ],
+ [
+ 25,
+ 4,
+ 0.00037677271562702513
+ ],
+ [
+ 0,
+ 3,
+ 0
+ ],
+ [
+ 0,
+ 2,
+ 0
+ ],
+ [
+ 71,
+ 0,
+ 0.0010700345123807514
+ ],
+ [
+ 281,
+ 1,
+ 0.004234925323647763
+ ],
+ [
+ 1008,
+ 6,
+ 0.015191475894081654
+ ],
+ [
+ 9,
+ 30,
+ 0.00013563817762572906
+ ],
+ [
+ 2,
+ 7,
+ 3.0141817250162012e-05
+ ],
+ [
+ 1,
+ 198,
+ 1.5070908625081006e-05
+ ],
+ [
+ 40,
+ 5,
+ 0.0006028363450032402
+ ],
+ [
+ 140,
+ 12,
+ 0.0021099272075113407
+ ],
+ [
+ 28,
+ 1,
+ 0.00042198544150226817
+ ],
+ [
+ 47,
+ 0,
+ 0.0007083327053788073
+ ],
+ [
+ 124,
+ 0,
+ 0.0018687926695100448
+ ],
+ [
+ 2,
+ 6,
+ 3.0141817250162012e-05
+ ],
+ [
+ 6,
+ 0,
+ 9.042545175048603e-05
+ ],
+ [
+ 285,
+ 307,
+ 0.004295208958148087
+ ],
+ [
+ 39,
+ 46,
+ 0.0005877654363781593
+ ],
+ [
+ 152,
+ 2,
+ 0.002290778111012313
+ ],
+ [
+ 1260,
+ 3,
+ 0.01898934486760207
+ ],
+ [
+ 14,
+ 7,
+ 0.00021099272075113408
+ ],
+ [
+ 3,
+ 19,
+ 4.521272587524302e-05
+ ],
+ [
+ 215,
+ 126,
+ 0.003240245354392416
+ ],
+ [
+ 90,
+ 0,
+ 0.0013563817762572905
+ ],
+ [
+ 1,
+ 34,
+ 1.5070908625081006e-05
+ ],
+ [
+ 2,
+ 18,
+ 3.0141817250162012e-05
+ ],
+ [
+ 15,
+ 6,
+ 0.00022606362937621508
+ ],
+ [
+ 1563,
+ 9,
+ 0.023555830181001613
+ ],
+ [
+ 154,
+ 5,
+ 0.002320919928262475
+ ],
+ [
+ 207,
+ 23,
+ 0.003119678085391768
+ ],
+ [
+ 472,
+ 303,
+ 0.007113468871038235
+ ]
+ ],
+ "hovertemplate": "Treatment_Type=%{x} %_PDL1=%{y} B7H4_cells=%{customdata[0]} PDL1_cells=%{customdata[1]} %_B7H4=%{customdata[2]} ",
+ "legendgroup": "NACT",
+ "marker": {
+ "color": "#EF553B"
+ },
+ "name": "NACT",
+ "notched": false,
+ "offsetgroup": "NACT",
+ "orientation": "v",
+ "showlegend": true,
+ "type": "box",
+ "x": [
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT"
+ ],
+ "x0": " ",
+ "xaxis": "x",
+ "y": [
+ 0.000249613099695472,
+ 1.2480654984773601e-05,
+ 3.74419649543208e-05,
+ 0.00022465178972592482,
+ 4.9922619939094404e-05,
+ 4.9922619939094404e-05,
+ 3.74419649543208e-05,
+ 2.4961309969547202e-05,
+ 0,
+ 1.2480654984773601e-05,
+ 7.48839299086416e-05,
+ 0.00037441964954320803,
+ 8.736458489341521e-05,
+ 0.002471169686985173,
+ 6.2403274923868e-05,
+ 0.0001497678598172832,
+ 1.2480654984773601e-05,
+ 0,
+ 0,
+ 7.48839299086416e-05,
+ 0,
+ 0.0038315610803254956,
+ 0.0005741101292995856,
+ 2.4961309969547202e-05,
+ 3.74419649543208e-05,
+ 8.736458489341521e-05,
+ 0.00023713244471069842,
+ 0.0015725625280814737,
+ 0,
+ 0.00042434226948230244,
+ 0.00022465178972592482,
+ 7.48839299086416e-05,
+ 0.00011232589486296241,
+ 6.2403274923868e-05,
+ 0.0002870550646497928,
+ 0.0037816384603864012
+ ],
+ "y0": " ",
+ "yaxis": "y"
+ }
+ ],
+ "layout": {
+ "boxmode": "overlay",
+ "legend": {
+ "title": {
+ "font": {
+ "family": "Arial, sans-serif",
+ "size": 12
+ },
+ "text": "Treatment"
+ },
+ "tracegroupgap": 0
+ },
+ "margin": {
+ "t": 60
+ },
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "white",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "white",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "#C8D4E3",
+ "linecolor": "#C8D4E3",
+ "minorgridcolor": "#C8D4E3",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "#C8D4E3",
+ "linecolor": "#C8D4E3",
+ "minorgridcolor": "#C8D4E3",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "white",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "#C8D4E3"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "white",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": ""
+ },
+ "bgcolor": "white",
+ "radialaxis": {
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ },
+ "yaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ },
+ "zaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ },
+ "bgcolor": "white",
+ "caxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#EBF0F8",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#EBF0F8",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "font": {
+ "family": "Arial, sans-serif",
+ "size": 18
+ },
+ "text": "Distribution of % PDL1 in Cancer Cells by Treatment",
+ "x": 0.5
+ },
+ "xaxis": {
+ "anchor": "y",
+ "autorange": true,
+ "categoryarray": [
+ "ACT",
+ "NACT"
+ ],
+ "categoryorder": "array",
+ "domain": [
+ 0,
+ 1
+ ],
+ "linecolor": "black",
+ "linewidth": 2,
+ "mirror": true,
+ "range": [
+ -0.5,
+ 1.5
+ ],
+ "showline": true,
+ "tickangle": -45,
+ "title": {
+ "font": {
+ "family": "Arial, sans-serif",
+ "size": 14
+ },
+ "text": "Treatment Type"
+ },
+ "type": "category"
+ },
+ "yaxis": {
+ "anchor": "x",
+ "autorange": true,
+ "domain": [
+ 0,
+ 1
+ ],
+ "gridcolor": "white",
+ "gridwidth": 1,
+ "linecolor": "black",
+ "linewidth": 2,
+ "mirror": true,
+ "range": [
+ -0.00021286450446252752,
+ 0.0040444255847880235
+ ],
+ "showgrid": true,
+ "showline": true,
+ "title": {
+ "font": {
+ "family": "Arial, sans-serif",
+ "size": 14
+ },
+ "text": "% PDL1"
+ },
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig = px.box(result_sorted, x='Treatment_Type', y='%_PDL1', \n",
+ " hover_data=result_sorted.columns,\n",
+ " color='Treatment_Type', # This can be set to a single color if preferred\n",
+ " template='plotly_white', # Starting with a clean white template\n",
+ " )\n",
+ "\n",
+ "fig.update_layout(\n",
+ " title_text='Distribution of % PDL1 in Cancer Cells by Treatment',\n",
+ " title_x=0.5, # Center the title\n",
+ " title_font=dict(size=18, family='Arial, sans-serif'),\n",
+ " xaxis_title='Treatment Type',\n",
+ " yaxis_title='% PDL1',\n",
+ " xaxis=dict(tickangle=-45, title_font=dict(size=14, family='Arial, sans-serif')),\n",
+ " yaxis=dict(title_font=dict(size=14, family='Arial, sans-serif')),\n",
+ " legend_title_text='Treatment',\n",
+ " legend_title_font=dict(size=12, family='Arial, sans-serif'),\n",
+ ")\n",
+ "\n",
+ "# Adjusting gridlines to mimic R's ggplot2 style\n",
+ "fig.update_yaxes(showgrid=True, gridwidth=1, gridcolor='white')\n",
+ "fig.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\n",
+ "fig.update_yaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\n",
+ "\n",
+ "\n",
+ "fig.show()\n",
+ "plot(fig)\n",
+ "\n",
+ "\n",
+ "import plotly.io as pio\n",
+ "#pio.write_image(fig, 'Violinplot_%PDL1.png')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 194,
+ "id": "b846e26c-ffe2-4996-8c80-b7e80d85aa73",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.plotly.v1+json": {
+ "config": {
+ "plotlyServerURL": "https://plot.ly"
+ },
+ "data": [
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Treatment_Type=%{x} %_B7H4=%{y} ",
+ "legendgroup": "ACT",
+ "marker": {
+ "color": "#327EBA"
+ },
+ "name": "ACT",
+ "notched": false,
+ "offsetgroup": "ACT",
+ "orientation": "v",
+ "showlegend": true,
+ "type": "box",
+ "x": [
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT"
+ ],
+ "x0": " ",
+ "xaxis": "x",
+ "y": [
+ 5.008486602298339e-05,
+ 0.0018447925651798882,
+ 0.00016973204596677704,
+ 0.0003756364951723754,
+ 3.338991068198893e-05,
+ 2.7824925568324103e-06,
+ 1.3912462784162053e-05,
+ 0,
+ 2.7824925568324103e-06,
+ 0,
+ 2.7824925568324103e-06,
+ 0.0016834079968836083,
+ 0.0030412643646178248,
+ 0.0009655249172208464,
+ 0.0025877180778541417,
+ 0.0001335596427279557,
+ 0.0024597234202398508,
+ 5.564985113664821e-06,
+ 5.564985113664821e-06,
+ 2.5042433011491696e-05,
+ 0.0007902278861404046,
+ 0.00015581958318261499,
+ 0.0003199866440357272,
+ 0.0002448593450012521,
+ 0.003756364951723754,
+ 8.347477670497232e-06,
+ 0,
+ 8.347477670497232e-06,
+ 1.1129970227329641e-05,
+ 0,
+ 6.121483625031303e-05,
+ 0.002095216895294805,
+ 1.9477447897826873e-05,
+ 2.7824925568324103e-06,
+ 2.7824925568324105e-05,
+ 0.0006455382731851192,
+ 8.347477670497232e-06,
+ 1.6694955340994464e-05,
+ 0.004688499958262611,
+ 0.00037285400261554303,
+ 0.00021703441943292801,
+ 2.7824925568324105e-05,
+ 0.0001892094938646039,
+ 6.121483625031303e-05,
+ 6.956231392081027e-05,
+ 9.460474693230196e-05,
+ 0.002081304432510643,
+ 1.6694955340994464e-05,
+ 0.00048693619744567183,
+ 0,
+ 0.0018670525056345474,
+ 0.0017641002810317482,
+ 0.0006872756615376054,
+ 0.000575975959264309,
+ 0.0005342385709118228,
+ 2.7824925568324103e-06,
+ 5.564985113664821e-06,
+ 0,
+ 3.0607418125156515e-05,
+ 0,
+ 5.564985113664821e-06,
+ 8.347477670497232e-06,
+ 0.0019700047302373467,
+ 2.7824925568324103e-06,
+ 0.010637469044770306,
+ 3.0607418125156515e-05,
+ 2.7824925568324103e-06,
+ 0.00016694955340994464,
+ 0.0004758062272183422,
+ 0.0015025459806895017,
+ 0.0003366815993767217,
+ 6.677982136397785e-05,
+ 0.000698405631764935,
+ 2.7824925568324103e-06,
+ 0.0008208353042655611,
+ 5.564985113664821e-06,
+ 1.3912462784162053e-05,
+ 0.00028659673335373827,
+ 0.0001641670608531122,
+ 6.677982136397785e-05,
+ 1.9477447897826873e-05,
+ 5.564985113664821e-06,
+ 2.7824925568324105e-05,
+ 0.003152564066891121,
+ 4.173738835248616e-05,
+ 0.002284426389159409,
+ 0.0006149308550599627,
+ 0.0019310498344416928,
+ 2.7824925568324103e-06,
+ 4.4519880909318565e-05,
+ 0.000698405631764935,
+ 1.9477447897826873e-05,
+ 2.7824925568324103e-06,
+ 0.0003533765547177161,
+ 5.564985113664821e-06,
+ 0.0009043100809705334,
+ 1.1129970227329641e-05,
+ 0.007496034948106514,
+ 1.1129970227329641e-05,
+ 0.00021703441943292801,
+ 0.000358941539831381,
+ 2.7824925568324103e-06,
+ 1.6694955340994464e-05,
+ 0.00014747210551211776,
+ 0.00018642700130777151,
+ 5.564985113664821e-06,
+ 0.00010295222460279918,
+ 0.0013467263975068867,
+ 0.0003895489579565375,
+ 0.0002114694343192632,
+ 0.00025042433011491697,
+ 9.182225437546954e-05,
+ 8.06922841481399e-05,
+ 0.00015860207573944738,
+ 0.0014608085923370154,
+ 0.00010851720971646401,
+ 0.0007874453935835722,
+ 5.564985113664821e-06,
+ 0,
+ 0.00014747210551211776,
+ 0.0015693258020534795,
+ 0.0004702412421046774,
+ 0,
+ 0.00155819583182615,
+ 2.7824925568324103e-06,
+ 3.0607418125156515e-05,
+ 0.004165391357578118,
+ 4.4519880909318565e-05,
+ 8.06922841481399e-05,
+ 0,
+ 0.0038815771167812125,
+ 2.7824925568324103e-06,
+ 0,
+ 0.002259383956147917,
+ 5.564985113664821e-06,
+ 0.0004479813016500181
+ ],
+ "y0": " ",
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Treatment_Type=%{x} %_B7H4=%{y} ",
+ "legendgroup": "NACT",
+ "marker": {
+ "color": "#E06663"
+ },
+ "name": "NACT",
+ "notched": false,
+ "offsetgroup": "NACT",
+ "orientation": "v",
+ "showlegend": true,
+ "type": "box",
+ "x": [
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT"
+ ],
+ "x0": " ",
+ "xaxis": "x",
+ "y": [
+ 0,
+ 0.0005274818018778352,
+ 0.00036170180700194414,
+ 0.032417524452549244,
+ 0.03558241526381625,
+ 0.00037677271562702513,
+ 0,
+ 0,
+ 0.0010700345123807514,
+ 0.004234925323647763,
+ 0.015191475894081654,
+ 0.00013563817762572906,
+ 3.0141817250162012e-05,
+ 1.5070908625081006e-05,
+ 0.0006028363450032402,
+ 0.0021099272075113407,
+ 0.00042198544150226817,
+ 0.0007083327053788073,
+ 0.0018687926695100448,
+ 3.0141817250162012e-05,
+ 9.042545175048603e-05,
+ 0.004295208958148087,
+ 0.0005877654363781593,
+ 0.002290778111012313,
+ 0.01898934486760207,
+ 0.00021099272075113408,
+ 4.521272587524302e-05,
+ 0.003240245354392416,
+ 0.0013563817762572905,
+ 1.5070908625081006e-05,
+ 3.0141817250162012e-05,
+ 0.00022606362937621508,
+ 0.023555830181001613,
+ 0.002320919928262475,
+ 0.003119678085391768,
+ 0.007113468871038235
+ ],
+ "y0": " ",
+ "yaxis": "y"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Treatment_Type=%{x} %_PDL1=%{y} ",
+ "legendgroup": "ACT",
+ "marker": {
+ "color": "#327EBA"
+ },
+ "name": "ACT",
+ "notched": false,
+ "offsetgroup": "ACT",
+ "orientation": "v",
+ "showlegend": true,
+ "type": "box",
+ "x": [
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT",
+ "ACT"
+ ],
+ "x0": " ",
+ "xaxis": "x2",
+ "y": [
+ 9.796478166099287e-06,
+ 0,
+ 0.0001004139012025177,
+ 7.592270578726947e-05,
+ 0.0002938943449829786,
+ 9.796478166099287e-06,
+ 6.122798853812054e-05,
+ 9.061742303641841e-05,
+ 2.4491195415248216e-06,
+ 2.2042075873723398e-05,
+ 1.469471724914893e-05,
+ 0.00035512233352109917,
+ 1.7143836790673752e-05,
+ 6.612622762117019e-05,
+ 2.4491195415248216e-06,
+ 0.0001347015747838652,
+ 0.0002449119541524822,
+ 1.7143836790673752e-05,
+ 2.4491195415248216e-06,
+ 7.347358624574465e-06,
+ 9.796478166099288e-05,
+ 1.469471724914893e-05,
+ 6.857534716269501e-05,
+ 2.4491195415248216e-06,
+ 6.857534716269501e-05,
+ 0.0003036908231490779,
+ 2.938943449829786e-05,
+ 1.469471724914893e-05,
+ 2.2042075873723398e-05,
+ 3.183855403982268e-05,
+ 2.938943449829786e-05,
+ 2.449119541524822e-05,
+ 2.2042075873723398e-05,
+ 0,
+ 0.0009576057407362054,
+ 1.224559770762411e-05,
+ 0.0002008278024050354,
+ 3.6736793122872325e-05,
+ 3.4287673581347504e-05,
+ 8.082094487031911e-05,
+ 5.877886899659572e-05,
+ 0,
+ 0.00022042075873723396,
+ 0.00015429453111606378,
+ 7.347358624574465e-06,
+ 0,
+ 1.224559770762411e-05,
+ 3.183855403982268e-05,
+ 0.0006686096348362763,
+ 2.4491195415248216e-06,
+ 8.571918395336877e-05,
+ 8.816830349489359e-05,
+ 1.469471724914893e-05,
+ 1.7143836790673752e-05,
+ 4.898239083049643e-06,
+ 1.9592956332198573e-05,
+ 7.347358624574465e-06,
+ 9.796478166099287e-06,
+ 6.612622762117019e-05,
+ 0.0014278366927089712,
+ 1.9592956332198573e-05,
+ 0.00017388748744826235,
+ 0,
+ 1.7143836790673752e-05,
+ 4.898239083049644e-05,
+ 0.0001224559770762411,
+ 0.003147118610859396,
+ 9.796478166099287e-06,
+ 7.347358624574465e-06,
+ 1.7143836790673752e-05,
+ 2.2042075873723398e-05,
+ 0,
+ 3.4287673581347504e-05,
+ 9.796478166099287e-06,
+ 9.796478166099287e-06,
+ 0,
+ 0,
+ 1.7143836790673752e-05,
+ 2.4491195415248216e-06,
+ 1.9592956332198573e-05,
+ 0.00013225245524234037,
+ 0.0003257328990228013,
+ 2.4491195415248216e-06,
+ 3.9185912664397146e-05,
+ 8.816830349489359e-05,
+ 0,
+ 7.347358624574465e-06,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0.0006833043520854253,
+ 9.796478166099287e-06,
+ 3.183855403982268e-05,
+ 1.224559770762411e-05,
+ 4.898239083049643e-06,
+ 0,
+ 4.898239083049643e-06,
+ 2.4491195415248216e-06,
+ 4.898239083049643e-06,
+ 2.449119541524822e-05,
+ 1.9592956332198573e-05,
+ 2.4491195415248216e-06,
+ 7.347358624574465e-06,
+ 6.612622762117019e-05,
+ 1.224559770762411e-05,
+ 2.4491195415248216e-06,
+ 4.898239083049643e-06,
+ 0,
+ 4.898239083049643e-06,
+ 2.2042075873723398e-05,
+ 2.2042075873723398e-05,
+ 9.796478166099287e-06,
+ 0.00026205579094315594,
+ 0,
+ 2.938943449829786e-05,
+ 4.898239083049643e-06,
+ 2.449119541524822e-05,
+ 4.4084151747446796e-05,
+ 3.183855403982268e-05,
+ 0.00020817516102960984,
+ 0.00043349415884989345,
+ 3.9185912664397146e-05,
+ 1.7143836790673752e-05,
+ 1.7143836790673752e-05,
+ 0,
+ 1.224559770762411e-05,
+ 2.938943449829786e-05,
+ 0.0002032769219465602,
+ 3.6736793122872325e-05,
+ 9.796478166099287e-06,
+ 6.857534716269501e-05,
+ 1.469471724914893e-05,
+ 0,
+ 0.0001126594989101418,
+ 4.898239083049643e-06
+ ],
+ "y0": " ",
+ "yaxis": "y2"
+ },
+ {
+ "alignmentgroup": "True",
+ "hovertemplate": "Treatment_Type=%{x} %_PDL1=%{y} ",
+ "legendgroup": "NACT",
+ "marker": {
+ "color": "#E06663"
+ },
+ "name": "NACT",
+ "notched": false,
+ "offsetgroup": "NACT",
+ "orientation": "v",
+ "showlegend": true,
+ "type": "box",
+ "x": [
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT",
+ "NACT"
+ ],
+ "x0": " ",
+ "xaxis": "x2",
+ "y": [
+ 0.000249613099695472,
+ 1.2480654984773601e-05,
+ 3.74419649543208e-05,
+ 0.00022465178972592482,
+ 4.9922619939094404e-05,
+ 4.9922619939094404e-05,
+ 3.74419649543208e-05,
+ 2.4961309969547202e-05,
+ 0,
+ 1.2480654984773601e-05,
+ 7.48839299086416e-05,
+ 0.00037441964954320803,
+ 8.736458489341521e-05,
+ 0.002471169686985173,
+ 6.2403274923868e-05,
+ 0.0001497678598172832,
+ 1.2480654984773601e-05,
+ 0,
+ 0,
+ 7.48839299086416e-05,
+ 0,
+ 0.0038315610803254956,
+ 0.0005741101292995856,
+ 2.4961309969547202e-05,
+ 3.74419649543208e-05,
+ 8.736458489341521e-05,
+ 0.00023713244471069842,
+ 0.0015725625280814737,
+ 0,
+ 0.00042434226948230244,
+ 0.00022465178972592482,
+ 7.48839299086416e-05,
+ 0.00011232589486296241,
+ 6.2403274923868e-05,
+ 0.0002870550646497928,
+ 0.0037816384603864012
+ ],
+ "y0": " ",
+ "yaxis": "y2"
+ }
+ ],
+ "layout": {
+ "annotations": [
+ {
+ "font": {
+ "size": 16
+ },
+ "showarrow": false,
+ "text": "Distribution of % B7H4",
+ "x": 0.2475,
+ "xanchor": "center",
+ "xref": "paper",
+ "y": 1,
+ "yanchor": "bottom",
+ "yref": "paper"
+ },
+ {
+ "font": {
+ "size": 16
+ },
+ "showarrow": false,
+ "text": "Distribution of % PDL1",
+ "x": 0.7525,
+ "xanchor": "center",
+ "xref": "paper",
+ "y": 1,
+ "yanchor": "bottom",
+ "yref": "paper"
+ }
+ ],
+ "height": 700,
+ "legend": {
+ "title": {
+ "font": {
+ "family": "Arial, sans-serif",
+ "size": 12
+ },
+ "text": "Treatment"
+ }
+ },
+ "template": {
+ "data": {
+ "bar": [
+ {
+ "error_x": {
+ "color": "#2a3f5f"
+ },
+ "error_y": {
+ "color": "#2a3f5f"
+ },
+ "marker": {
+ "line": {
+ "color": "white",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "bar"
+ }
+ ],
+ "barpolar": [
+ {
+ "marker": {
+ "line": {
+ "color": "white",
+ "width": 0.5
+ },
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "barpolar"
+ }
+ ],
+ "carpet": [
+ {
+ "aaxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "#C8D4E3",
+ "linecolor": "#C8D4E3",
+ "minorgridcolor": "#C8D4E3",
+ "startlinecolor": "#2a3f5f"
+ },
+ "baxis": {
+ "endlinecolor": "#2a3f5f",
+ "gridcolor": "#C8D4E3",
+ "linecolor": "#C8D4E3",
+ "minorgridcolor": "#C8D4E3",
+ "startlinecolor": "#2a3f5f"
+ },
+ "type": "carpet"
+ }
+ ],
+ "choropleth": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "choropleth"
+ }
+ ],
+ "contour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "contour"
+ }
+ ],
+ "contourcarpet": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "contourcarpet"
+ }
+ ],
+ "heatmap": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmap"
+ }
+ ],
+ "heatmapgl": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "heatmapgl"
+ }
+ ],
+ "histogram": [
+ {
+ "marker": {
+ "pattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ }
+ },
+ "type": "histogram"
+ }
+ ],
+ "histogram2d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2d"
+ }
+ ],
+ "histogram2dcontour": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "histogram2dcontour"
+ }
+ ],
+ "mesh3d": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "type": "mesh3d"
+ }
+ ],
+ "parcoords": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "parcoords"
+ }
+ ],
+ "pie": [
+ {
+ "automargin": true,
+ "type": "pie"
+ }
+ ],
+ "scatter": [
+ {
+ "fillpattern": {
+ "fillmode": "overlay",
+ "size": 10,
+ "solidity": 0.2
+ },
+ "type": "scatter"
+ }
+ ],
+ "scatter3d": [
+ {
+ "line": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatter3d"
+ }
+ ],
+ "scattercarpet": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattercarpet"
+ }
+ ],
+ "scattergeo": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergeo"
+ }
+ ],
+ "scattergl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattergl"
+ }
+ ],
+ "scattermapbox": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scattermapbox"
+ }
+ ],
+ "scatterpolar": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolar"
+ }
+ ],
+ "scatterpolargl": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterpolargl"
+ }
+ ],
+ "scatterternary": [
+ {
+ "marker": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "type": "scatterternary"
+ }
+ ],
+ "surface": [
+ {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ },
+ "colorscale": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "type": "surface"
+ }
+ ],
+ "table": [
+ {
+ "cells": {
+ "fill": {
+ "color": "#EBF0F8"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "header": {
+ "fill": {
+ "color": "#C8D4E3"
+ },
+ "line": {
+ "color": "white"
+ }
+ },
+ "type": "table"
+ }
+ ]
+ },
+ "layout": {
+ "annotationdefaults": {
+ "arrowcolor": "#2a3f5f",
+ "arrowhead": 0,
+ "arrowwidth": 1
+ },
+ "autotypenumbers": "strict",
+ "coloraxis": {
+ "colorbar": {
+ "outlinewidth": 0,
+ "ticks": ""
+ }
+ },
+ "colorscale": {
+ "diverging": [
+ [
+ 0,
+ "#8e0152"
+ ],
+ [
+ 0.1,
+ "#c51b7d"
+ ],
+ [
+ 0.2,
+ "#de77ae"
+ ],
+ [
+ 0.3,
+ "#f1b6da"
+ ],
+ [
+ 0.4,
+ "#fde0ef"
+ ],
+ [
+ 0.5,
+ "#f7f7f7"
+ ],
+ [
+ 0.6,
+ "#e6f5d0"
+ ],
+ [
+ 0.7,
+ "#b8e186"
+ ],
+ [
+ 0.8,
+ "#7fbc41"
+ ],
+ [
+ 0.9,
+ "#4d9221"
+ ],
+ [
+ 1,
+ "#276419"
+ ]
+ ],
+ "sequential": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ],
+ "sequentialminus": [
+ [
+ 0,
+ "#0d0887"
+ ],
+ [
+ 0.1111111111111111,
+ "#46039f"
+ ],
+ [
+ 0.2222222222222222,
+ "#7201a8"
+ ],
+ [
+ 0.3333333333333333,
+ "#9c179e"
+ ],
+ [
+ 0.4444444444444444,
+ "#bd3786"
+ ],
+ [
+ 0.5555555555555556,
+ "#d8576b"
+ ],
+ [
+ 0.6666666666666666,
+ "#ed7953"
+ ],
+ [
+ 0.7777777777777778,
+ "#fb9f3a"
+ ],
+ [
+ 0.8888888888888888,
+ "#fdca26"
+ ],
+ [
+ 1,
+ "#f0f921"
+ ]
+ ]
+ },
+ "colorway": [
+ "#636efa",
+ "#EF553B",
+ "#00cc96",
+ "#ab63fa",
+ "#FFA15A",
+ "#19d3f3",
+ "#FF6692",
+ "#B6E880",
+ "#FF97FF",
+ "#FECB52"
+ ],
+ "font": {
+ "color": "#2a3f5f"
+ },
+ "geo": {
+ "bgcolor": "white",
+ "lakecolor": "white",
+ "landcolor": "white",
+ "showlakes": true,
+ "showland": true,
+ "subunitcolor": "#C8D4E3"
+ },
+ "hoverlabel": {
+ "align": "left"
+ },
+ "hovermode": "closest",
+ "mapbox": {
+ "style": "light"
+ },
+ "paper_bgcolor": "white",
+ "plot_bgcolor": "white",
+ "polar": {
+ "angularaxis": {
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": ""
+ },
+ "bgcolor": "white",
+ "radialaxis": {
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": ""
+ }
+ },
+ "scene": {
+ "xaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ },
+ "yaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ },
+ "zaxis": {
+ "backgroundcolor": "white",
+ "gridcolor": "#DFE8F3",
+ "gridwidth": 2,
+ "linecolor": "#EBF0F8",
+ "showbackground": true,
+ "ticks": "",
+ "zerolinecolor": "#EBF0F8"
+ }
+ },
+ "shapedefaults": {
+ "line": {
+ "color": "#2a3f5f"
+ }
+ },
+ "ternary": {
+ "aaxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ },
+ "baxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ },
+ "bgcolor": "white",
+ "caxis": {
+ "gridcolor": "#DFE8F3",
+ "linecolor": "#A2B1C6",
+ "ticks": ""
+ }
+ },
+ "title": {
+ "x": 0.05
+ },
+ "xaxis": {
+ "automargin": true,
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#EBF0F8",
+ "zerolinewidth": 2
+ },
+ "yaxis": {
+ "automargin": true,
+ "gridcolor": "#EBF0F8",
+ "linecolor": "#EBF0F8",
+ "ticks": "",
+ "title": {
+ "standoff": 15
+ },
+ "zerolinecolor": "#EBF0F8",
+ "zerolinewidth": 2
+ }
+ }
+ },
+ "title": {
+ "font": {
+ "family": "Arial, sans-serif",
+ "size": 18
+ },
+ "text": "Distribution of % B7H4 and % PDL1 in Cancer Cells by Treatment",
+ "x": 0.5
+ },
+ "width": 950,
+ "xaxis": {
+ "anchor": "y",
+ "autorange": true,
+ "domain": [
+ 0,
+ 0.495
+ ],
+ "linecolor": "black",
+ "linewidth": 2,
+ "mirror": true,
+ "range": [
+ -0.5,
+ 1.5
+ ],
+ "showline": true,
+ "tickangle": -45,
+ "title": {
+ "font": {
+ "family": "Arial, sans-serif",
+ "size": 14
+ },
+ "text": "Treatment Type"
+ },
+ "type": "category"
+ },
+ "xaxis2": {
+ "anchor": "y2",
+ "autorange": true,
+ "domain": [
+ 0.505,
+ 1
+ ],
+ "linecolor": "black",
+ "linewidth": 2,
+ "mirror": true,
+ "range": [
+ -0.5,
+ 1.5
+ ],
+ "showline": true,
+ "type": "category"
+ },
+ "yaxis": {
+ "anchor": "x",
+ "domain": [
+ 0,
+ 1
+ ],
+ "gridcolor": "white",
+ "gridwidth": 1,
+ "linecolor": "black",
+ "linewidth": 2,
+ "mirror": true,
+ "range": [
+ -0.001,
+ 0.036
+ ],
+ "showgrid": true,
+ "showline": true,
+ "title": {
+ "font": {
+ "family": "Arial, sans-serif",
+ "size": 14
+ },
+ "text": "Percentage"
+ },
+ "type": "linear"
+ },
+ "yaxis2": {
+ "anchor": "x2",
+ "domain": [
+ 0,
+ 1
+ ],
+ "gridcolor": "white",
+ "gridwidth": 1,
+ "linecolor": "black",
+ "linewidth": 2,
+ "matches": "y",
+ "mirror": true,
+ "range": [
+ -0.001,
+ 0.036
+ ],
+ "showgrid": true,
+ "showline": true,
+ "showticklabels": false,
+ "type": "linear"
+ }
+ }
+ }
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "'temp-plot.html'"
+ ]
+ },
+ "execution_count": 194,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# both on the same plot\n",
+ "import plotly.graph_objects as go\n",
+ "from plotly.subplots import make_subplots\n",
+ "import plotly.express as px\n",
+ "\n",
+ "# Assuming 'result_sorted' is your DataFrame\n",
+ "\n",
+ "# Create subplots with a shared y-axis\n",
+ "fig = make_subplots(rows=1, cols=2,\n",
+ " shared_yaxes=True, \n",
+ " horizontal_spacing=0.01,\n",
+ " subplot_titles=('Distribution of % B7H4', 'Distribution of % PDL1'))\n",
+ "\n",
+ "# Define a color map for the treatment types\n",
+ "color_map = {'ACT': \"#327EBA\", 'NACT': \"#E06663\"}\n",
+ "\n",
+ "# Add first plot for % B7H4\n",
+ "fig1 = px.box(result_sorted, x='Treatment_Type', y='%_B7H4', template='plotly_white',\n",
+ " color='Treatment_Type', color_discrete_map=color_map)\n",
+ "for trace in fig1.data:\n",
+ " fig.add_trace(trace, row=1, col=1)\n",
+ "\n",
+ "# Add second plot for % PDL1\n",
+ "fig2 = px.box(result_sorted, x='Treatment_Type', y='%_PDL1', template='plotly_white',\n",
+ " color='Treatment_Type', color_discrete_map=color_map)\n",
+ "for trace in fig2.data:\n",
+ " fig.add_trace(trace, row=1, col=2)\n",
+ "\n",
+ "# Update layout to match the style and adjust gridlines\n",
+ "fig.update_layout(\n",
+ " title_text='Distribution of % B7H4 and % PDL1 in Cancer Cells by Treatment',\n",
+ " title_x=0.5,\n",
+ " title_font=dict(size=18, family='Arial, sans-serif'),\n",
+ " xaxis_title='Treatment Type',\n",
+ " yaxis_title='Percentage',\n",
+ " xaxis=dict(tickangle=-45, title_font=dict(size=14, family='Arial, sans-serif')),\n",
+ " yaxis=dict(title_font=dict(size=14, family='Arial, sans-serif')),\n",
+ " legend_title_text='Treatment',\n",
+ " legend_title_font=dict(size=12, family='Arial, sans-serif'),\n",
+ " template='plotly_white',\n",
+ " width=950, # Increase the width of the figure\n",
+ " height=700, # Increase the height of the figure\n",
+ ")\n",
+ "\n",
+ "# Set y-axis range to enhance visibility\n",
+ "fig.update_yaxes(range=[-0.001, 0.036]) # Adjust this range based on your data\n",
+ " \n",
+ "# Adjust grid and lines\n",
+ "fig.update_yaxes(showgrid=True, gridwidth=1, gridcolor='white')\n",
+ "fig.update_xaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\n",
+ "fig.update_yaxes(showline=True, linewidth=2, linecolor='black', mirror=True)\n",
+ "\n",
+ "fig.show()\n",
+ "\n",
+ "\n",
+ "plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "81ee2131-cf48-466b-8919-63a3da78b30c",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a81b0396",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e33eb527",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0d82f232-533c-46b5-9f6a-051d9271f51b",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6961332e-8b09-41f6-8360-53799f0a348b",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "03832944-4339-4a44-b3c1-070ce13595ce",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "f="
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "857a014e-49d0-4a4c-b582-09e28d44e754",
+ "metadata": {},
+ "source": [
+ "## V.5. XY MAPS"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "51c2588d-e4ba-4891-80bd-e30dd1cd3ee9",
+ "metadata": {},
+ "source": [
+ "#### V.5.1. CELL SUBTYPES"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f175de05-afb0-43e0-b145-d380b7a28643",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Create a x, y map and visualize the tissues architecture\n",
+ "for sample in ls_samples:\n",
+ " sample_id = sample.split('_')[0] + '.csv'\n",
+ " sample_id2 = sample.split('_')[0]\n",
+ " location_colors = df.loc[df['Sample_ID'] == sample_id,['Nuc_X','Nuc_Y_Inv','cell_type']]\n",
+ "\n",
+ " #print('nb c endo',len(location_colors.loc[location_colors['cell_type']=='ENDOTHELIAL']))\n",
+ " #print('nb c immune',len(location_colors.loc[location_colors['cell_type']=='IMMUNE']))\n",
+ " #print('nb c cancer',len(location_colors.loc[location_colors['cell_type']=='CANCER']))\n",
+ "\n",
+ " fig = go.Figure()\n",
+ " title = sample_id2 + \" Background Subtracted XY Map cell types\"\n",
+ "\n",
+ " for celltype in df.loc[df['Sample_ID'] == sample_id,'cell_type'].unique():\n",
+ " fig.add_scatter(\n",
+ " mode = 'markers',\n",
+ " marker=dict(size=3, opacity=0.5, color='rgb' + str(cell_type_color_dict[celltype])),\n",
+ " x = location_colors.loc[location_colors['cell_type']==celltype,'Nuc_X'],\n",
+ " y = location_colors.loc[location_colors['cell_type']==celltype,'Nuc_Y_Inv'],\n",
+ " name = celltype)\n",
+ "\n",
+ " fig.update_layout(title = title, plot_bgcolor = 'white')\n",
+ " fig.update_xaxes(title_text = 'Nuc_X', linecolor = 'black')\n",
+ " fig.update_yaxes(title_text = 'Nuc_Y_Inv', linecolor = 'black')\n",
+ " \n",
+ " # Adjust the size of the points\n",
+ " for trace in fig.data:\n",
+ " trace.marker.size = 2 \n",
+ " # Adjust the size of the points\n",
+ " for trace in fig.data:\n",
+ " trace.marker.size = 2 \n",
+ " fig.update_layout(\n",
+ " title=title,\n",
+ " plot_bgcolor='white',\n",
+ " legend=dict(\n",
+ " title='Cell Types', # Titre de la lƩgende\n",
+ " font=dict(\n",
+ " family='Arial',\n",
+ " size=12,\n",
+ " color='black'\n",
+ " ),\n",
+ " bgcolor='white',\n",
+ " bordercolor='black',\n",
+ " borderwidth=0.4,\n",
+ " itemsizing='constant'\n",
+ " )\n",
+ " )\n",
+ " \n",
+ "\n",
+ " #fig.write_image(output_images_dir + \"/\" + title.replace(\" \", \"_\") + \".png\", width=1200, height=800, scale=4)\n",
+ " print(sample_id, \"processed!\")\n",
+ "\n",
+ " fig.show(renderer='png') # Display the figure as png\n",
+ " plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "aeab8d32-f133-4853-85e3-b7643458c415",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Create a x,y map and visualize the tissues architecture\n",
+ "for sample in ls_samples:\n",
+ " sample_id = sample.split('_')[0] + '.csv'\n",
+ " sample_id2 = sample.split('_')[0]\n",
+ " location_colors = df.loc[df['Sample_ID'] == sample_id,['Nuc_X','Nuc_Y_Inv','cell_subtype']]\n",
+ "\n",
+ " fig = go.Figure()\n",
+ " title = sample_id2 + \" Background Subtracted XY Map cell subtypes\"\n",
+ "\n",
+ " for cellsubtype in df.loc[df['Sample_ID'] == sample_id,'cell_subtype'].unique():\n",
+ " fig.add_scatter(\n",
+ " mode = 'markers',\n",
+ " marker = dict(size=3, \n",
+ " opacity=0.5, \n",
+ " color='rgb' + str(cell_subtype_color_dict[cellsubtype])),\n",
+ " x = location_colors.loc[location_colors['cell_subtype']==cellsubtype,'Nuc_X'],\n",
+ " y = location_colors.loc[location_colors['cell_subtype']==cellsubtype,'Nuc_Y_Inv'],\n",
+ " name = cellsubtype)\n",
+ "\n",
+ " fig.update_layout(title = title, plot_bgcolor = 'white')\n",
+ " fig.update_xaxes(title_text = 'Nuc_X', linecolor = 'black')\n",
+ " fig.update_yaxes(title_text = 'Nuc_Y_Inv', linecolor = 'black')\n",
+ " \n",
+ " # Adjust the size of the points\n",
+ " for trace in fig.data:\n",
+ " trace.marker.size = 2 \n",
+ " fig.update_layout(\n",
+ " title=title,\n",
+ " plot_bgcolor='white',\n",
+ " legend=dict(\n",
+ " title='Cell Subtypes', #Legende title\n",
+ " font=dict(\n",
+ " family='Arial',\n",
+ " size=12,\n",
+ " color='black'\n",
+ " ),\n",
+ " bgcolor='white',\n",
+ " bordercolor='black',\n",
+ " borderwidth=0.4,\n",
+ " itemsizing='constant'\n",
+ " )\n",
+ " )\n",
+ " \n",
+ "\n",
+ " fig.write_image(output_images_dir + \"/\" + title.replace(\" \", \"_\") + \".png\", width=1200, height=800, scale=4)\n",
+ " print(sample_id, \"processed!\")\n",
+ "\n",
+ " plot(fig)\n",
+ " fig.show(renderer='png') # Display the figure as png"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "09d8a845-4bdd-4c86-b17f-84639d88b8fc",
+ "metadata": {},
+ "source": [
+ "#### V.5.1. IMMUNE CHECKPOINTS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "55cccde4-5288-45d9-aedf-6d49c0eb5187",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "immune_checkpoint_color_dict"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "af2bd6ea-df4c-4e66-8a69-f5c491a35384",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# !!!! test for B7H4 !!!!\n",
+ "\n",
+ "\n",
+ "for sample in ls_samples:\n",
+ " sample_id = sample.split('_')[0] + '.csv'\n",
+ " sample_id2 = sample.split('_')[0]\n",
+ " location_colors = df.loc[df['Sample_ID'] == sample_id,['Nuc_X','Nuc_Y_Inv','immune_checkpoint']]\n",
+ "\n",
+ "\n",
+ " fig = go.Figure()\n",
+ " title = sample_id2 + \" Background Subtracted XY Map immune checkpoint\"\n",
+ "\n",
+ " for immunecheckpoint in df.loc[df['Sample_ID'] == sample_id,'immune_checkpoint'].unique():\n",
+ " fig.add_scatter(\n",
+ " mode = 'markers',\n",
+ " marker=dict(size=3, opacity=0.5, color='rgb' + str(immune_checkpoint_color_dict[immunecheckpoint])),\n",
+ " x = location_colors.loc[location_colors['immune_checkpoint']==immunecheckpoint,'Nuc_X'],\n",
+ " y = location_colors.loc[location_colors['immune_checkpoint']==immunecheckpoint,'Nuc_Y_Inv'],\n",
+ " name = immunecheckpoint)\n",
+ "\n",
+ " fig.update_layout(title = title, plot_bgcolor = 'white')\n",
+ " fig.update_xaxes(title_text = 'Nuc_X', linecolor = 'black')\n",
+ " fig.update_yaxes(title_text = 'Nuc_Y_Inv', linecolor = 'black')\n",
+ " \n",
+ " # Adjust the size of the points\n",
+ " for trace in fig.data:\n",
+ " trace.marker.size = 2 \n",
+ " # Adjust the size of the points\n",
+ " for trace in fig.data:\n",
+ " trace.marker.size = 2 \n",
+ " fig.update_layout(\n",
+ " title=title,\n",
+ " plot_bgcolor='white',\n",
+ " legend=dict(\n",
+ " title='Immune checkpoint', # Titre de la lƩgende\n",
+ " font=dict(\n",
+ " family='Arial',\n",
+ " size=12,\n",
+ " color='black'\n",
+ " ),\n",
+ " bgcolor='white',\n",
+ " bordercolor='black',\n",
+ " borderwidth=0.4,\n",
+ " itemsizing='constant'\n",
+ " )\n",
+ " )\n",
+ " \n",
+ "\n",
+ " fig.write_image(output_images_dir + \"/\" + title.replace(\" \", \"_\") + \".png\", width=1200, height=800, scale=4)\n",
+ " print(sample_id, \"processed!\")\n",
+ "\n",
+ " fig.show(renderer='png') # Display the figure as png\n",
+ " plot(fig)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "67915e19-5963-4441-a86d-7181d39f01cd",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for sample in ls_samples:\n",
+ " sample_id = sample.split('_')[0] + '.csv'\n",
+ " sample_id2 = sample.split('_')[0]\n",
+ " location_colors = df.loc[df['Sample_ID'] == sample_id, ['Nuc_X', 'Nuc_Y_Inv', 'immune_checkpoint']]\n",
+ "\n",
+ " fig = go.Figure()\n",
+ " title = sample_id2 + \" Background Subtracted XY Map immune checkpoint\"\n",
+ "\n",
+ " for immunecheckpoint in df.loc[df['Sample_ID'] == sample_id, 'immune_checkpoint'].unique():\n",
+ " # VƩrifier si la combinaison est dans le dictionnaire avant d'ajouter la trace\n",
+ " if immunecheckpoint in immune_checkpoint_color_dict:\n",
+ " color = 'rgb' + str(immune_checkpoint_color_dict[immunecheckpoint])\n",
+ " \n",
+ " fig.add_scatter(\n",
+ " mode='markers',\n",
+ " marker=dict(size=3, opacity=0.5, color=color),\n",
+ " x=location_colors.loc[location_colors['immune_checkpoint'] == immunecheckpoint, 'Nuc_X'],\n",
+ " y=location_colors.loc[location_colors['immune_checkpoint'] == immunecheckpoint, 'Nuc_Y_Inv'],\n",
+ " name=immunecheckpoint\n",
+ " )\n",
+ " \n",
+ " fig.update_layout(\n",
+ " title=title,\n",
+ " plot_bgcolor='white',\n",
+ " xaxis_title='Nuc_X',\n",
+ " yaxis_title='Nuc_Y_Inv',\n",
+ " legend_title='Immune checkpoint',\n",
+ " legend=dict(\n",
+ " font=dict(\n",
+ " family='Arial',\n",
+ " size=12,\n",
+ " color='black'\n",
+ " ),\n",
+ " bgcolor='white',\n",
+ " bordercolor='black',\n",
+ " borderwidth=0.4,\n",
+ " itemsizing='constant'\n",
+ " )\n",
+ " )\n",
+ " \n",
+ " fig.write_image(output_images_dir + \"/\" + title.replace(\" \", \"_\") + \".png\", width=1200, height=800, scale=4)\n",
+ " print(sample_id, \"processed!\")\n",
+ "\n",
+ " fig.show(renderer='png') # Display the figure as png\n",
+ " plot(fig)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "29ffb8ee-aed1-4f0e-b229-9cd3da3896f1",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "23803970-60db-4ad1-988f-6e3cc5febe45",
+ "metadata": {},
+ "source": [
+ "### V.5.2. CELL SUBTYPE DENSITY"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b3feb8aa-727a-4356-97a4-18ca52c584ae",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9ba082fc-7b05-462d-a7fb-880043b381e4",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from shapely.geometry import MultiPoint\n",
+ "\n",
+ " \n",
+ "\n",
+ "# Convert pixel to mm\n",
+ "\n",
+ "df['x_mm'] = df['Nuc_X'] * 0.650 / 1000\n",
+ "\n",
+ "df['y_mm'] = df['Nuc_Y_Inv'] * 0.650 / 1000\n",
+ "\n",
+ " \n",
+ "\n",
+ "# Group by Sample_ID and ROI_Index and calculate the convex hull for each group\n",
+ "\n",
+ "df_grouped = df.groupby(['Sample_ID', 'ROI_index']).apply(lambda group: MultiPoint(group[['x_mm', 'y_mm']].values).convex_hull)\n",
+ "\n",
+ " \n",
+ "\n",
+ "# Calculate the area of each convex hull\n",
+ "\n",
+ "df_area = df_grouped.apply(lambda hull: hull.area if hull.geom_type == 'Polygon' else 0)\n",
+ "\n",
+ " \n",
+ "\n",
+ "# Convert to DataFrame\n",
+ "\n",
+ "df_area = pd.DataFrame(df_area, columns=['Area_mm2'])\n",
+ "\n",
+ " \n",
+ "\n",
+ "print(df_area)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "cfd53782-4f82-49ac-a9e0-9a6ead74914c",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "405c5c7b-4d99-433e-8b62-176298d61e3f",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "cdfe357d-a691-49a5-836b-0b49c4dd8f6f",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "da02b174-decc-483f-bc5a-9e4828ce96f7",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "83d006dd-7e2a-4e57-9d21-b76717d7b4f3",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "raw",
+ "id": "d0999992-3a79-4c69-8b8c-e25eb084ccc7",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "raw",
+ "id": "24ce3877-172e-47d8-9fbb-4006fd72e04e",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "raw",
+ "id": "463687d9-ce5a-4ab0-9993-2b30402379a0",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "953cd672-52c6-4a72-9ad7-1833e2c07cf4",
+ "metadata": {},
+ "source": [
+ "## V.6. CORRELATION PLOTS"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "483b222a-93ed-456f-9eb8-3f5d03fe4b92",
+ "metadata": {},
+ "source": [
+ "!! Correlation plots are not relevant !!\n",
+ "!! We can keep this code but do not use this as interpretation material !!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4340ae3a-7c78-41c5-9dbf-27cdd35e38a1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Get Pearson correlations and P values for all marker values\n",
+ "# First, get we need to determine how many columns we will be evaluating. \n",
+ "# And prepare empty Numpy arrays to hold our data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "08144838-b58e-425d-b154-808ed22a195c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#This is a work in progress section, need to run this on individual cell types instead of all cell types together\n",
+ "\n",
+ "keep_sample_Set_A = [ 'TMA.csv', 'D3S1.csv', 'D3S2.csv','D3S3.csv','D4S1.csv','D4S2.csv','D4S3.csv','D5S1.csv','D5S2.csv','D5S3.csv']\n",
+ "keep_sample_Set_B = [ 'TMA.csv', 'DD3S1.csv','DD3S2.csv','DD3S3.csv','DD4S1.csv','DD4S2.csv','DD4S3.csv','DD5S1.csv','DD5S2.csv','DD5S3.csv']\n",
+ "keep_cell_type = [ 'CANCER', 'STROMA', 'ENDOTHELIAL', 'IMMUNE' ]\n",
+ "\n",
+ "# Check project name and execute corresponding operations\n",
+ "if project_name == 'Set_A':\n",
+ " keep_sample = keep_sample_Set_A\n",
+ "elif project_name == 'Set_B':\n",
+ " keep_sample = keep_sample_Set_B\n",
+ "else:\n",
+ " raise ValueError(\"Unknown project name.\")\n",
+ "\n",
+ "df_keep_sample = df.loc[(df['Sample_ID'].isin(keep_sample))\n",
+ " & (df['Sample_ID'].isin(keep_sample)), :].copy()\n",
+ "\n",
+ "# df_keep_sample will change regarding which sample you decided to keep in the kee_sample_proj list\n",
+ "df_keep_sample"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e82126b0-dcc2-4a2f-800b-be7b9beef32f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# n_corr_cols is the number of colums you will compute the correlations with\n",
+ "# (columns in df_keep_sample that are not in the list not_intensities)\n",
+ "n_corr_cols = len(df_keep_sample.columns[~df_keep_sample.columns.isin(not_intensities)])\n",
+ "print(n_corr_cols)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "8c25e4d8-75d9-40a6-b8cd-5585af9c3dc0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# An empty 2D NumPy array is created with dimensions n_corr_cols by n_corr_cols and assigned to the variable pvalues \n",
+ "# This array is intended to store p-values.\n",
+ "pvalues = np.empty((n_corr_cols, n_corr_cols))\n",
+ "\n",
+ "# Similarly, another empty 2D NumPy array with dimensions n_corr_cols by n_corr_cols is created and assigned to the variable corrvalues. \n",
+ "# This array is intended to store correlation values.\n",
+ "corrvalues = np.empty((n_corr_cols,n_corr_cols))\n",
+ "\n",
+ "#print(pvalues)\n",
+ "#print(corrvalues)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b86a1fb3-74e9-4925-aaaa-690dcf8531cc",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Columns of the DataFrame for_corr are renamed using the dictionary full_to_short_names\n",
+ "for_corr = df_keep_sample.loc[:,~df_keep_sample.columns.isin(not_intensities)].copy()\n",
+ "for_corr = for_corr.rename(columns = full_to_short_names)\n",
+ "for_corr.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fbf3be17-3e89-466f-9258-5c990a540ecf",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Compute Pearson correlation coefficient and the corresponding p-value for each pair of columns in dataframe\n",
+ "for i in range(for_corr.shape[1]):\n",
+ " for j in range(0,for_corr.shape[1]):\n",
+ " col1 = for_corr[for_corr.columns.values[i]]\n",
+ " col2 = for_corr[for_corr.columns.values[j]]\n",
+ " corrvalues[i,j] = pearsonr(col1,col2)[0]\n",
+ " pvalues[i,j] = pearsonr(col1,col2)[1]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6b2928ab-4f81-44b1-8fea-ca7295febf58",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Correlation and p-value calculations are being organized and formatted into dataframes\n",
+ "corrvalues = pd.DataFrame(corrvalues).round(3)\n",
+ "corrvalues.columns = for_corr.columns.values\n",
+ "corrvalues.index = for_corr.columns.values\n",
+ "\n",
+ "pvalues = pd.DataFrame(pvalues)\n",
+ "pvalues.columns = for_corr.columns.values\n",
+ "pvalues.index = for_corr.columns.values"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e595da1a-aa7e-44c0-a203-a052576c2fd7",
+ "metadata": {},
+ "source": [
+ "### V.6.1. OPTION 1"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "75a032cd-2002-4a10-a8cb-e90af570b5ae",
+ "metadata": {},
+ "source": [
+ "Option 1: no correlation value on plot, just put p value and have star is p<=0.05"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "be4d1d04-11d5-4e3b-a01e-a7d2ba898a62",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Visualizing and marking statistically significant p-values with an asterisk (*) \n",
+ "# for ease of interpretation\n",
+ "# p-values that are less than or equal to 0.05\n",
+ "\n",
+ "# p_add_star() in my_modules.py\n",
+ "p_w_star = pvalues.copy()\n",
+ "p_w_star = p_w_star.apply(lambda row: p_add_star(row), axis = 1)\n",
+ "p_w_star.columns = for_corr.columns.values\n",
+ "p_w_star.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d98ac87b-f60b-4a80-a04f-6692c4180423",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Check if there is non-significant values\n",
+ "for index, row in p_w_star.iterrows():\n",
+ " for col in p_w_star.columns:\n",
+ " value = p_w_star.loc[index, col]\n",
+ " if \"*\" not in value:\n",
+ " print(f\"Value without asterisk found at index: {index}, column: {col}, value: {value}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4024da71-dd6b-4b05-a92c-36e8a6ecc90a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Correlation visualization\n",
+ "sb.set()\n",
+ "\n",
+ "x_axis_labels = for_corr.columns.values.tolist()\n",
+ "y_axis_labels = for_corr.columns.values.tolist()\n",
+ "\n",
+ "ax = sb.heatmap(corrvalues, \n",
+ " annot = p_w_star, \n",
+ " annot_kws = {\"size\": 1.25},\n",
+ " fmt = 's',\n",
+ " xticklabels = x_axis_labels, \n",
+ " yticklabels = y_axis_labels,\n",
+ " cbar_kws = {'label':'Pearson correlation'},\n",
+ " linecolor = 'black', \n",
+ " linewidth = 0.5,\n",
+ " cmap = 'coolwarm')\n",
+ "\n",
+ "plt.yticks(rotation=0, size = 5)\n",
+ "ax.xaxis.tick_top() # x axis on top\n",
+ "ax.xaxis.set_label_position('top')\n",
+ "ax.tick_params(length=0)\n",
+ "plt.xticks(rotation=45, size = 5)\n",
+ "plt.setp(ax.xaxis.get_majorticklabels(), ha='left')\n",
+ "\n",
+ "ax.set_title(label = \"Correlations option 1\", fontsize = 20)\n",
+ "plt.tight_layout()\n",
+ "\n",
+ "filename = \"correlations_option1.png\"\n",
+ "filename = os.path.join(output_images_dir, filename)\n",
+ "plt.savefig(filename,dpi=500)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "dcf458a5-00a4-4e63-b583-668c23fef0b1",
+ "metadata": {},
+ "source": [
+ "### V.6.2. OPTION 2"
+ ]
+ },
+ {
+ "cell_type": "raw",
+ "id": "44434cb5-7ff3-468c-ad6b-5d49ee50debe",
+ "metadata": {},
+ "source": [
+ "Option 2: include correlation and 1-3 stars depending on p-value. \n",
+ "1 star: p-value <= 0.05; \n",
+ "2 stars: p-value <= 0.01; \n",
+ "3 stars: p-value <= 0.001."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7428d69a-00a7-44b1-af3f-ad14a395d448",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# If the item is less than or equal to 0.001, it assigns 3 asterisks, \n",
+ "# if less than or equal to 0.01, it assigns 2 asterisks, \n",
+ "# if less than or equal to 0.05, it assigns 1 asterisk, \n",
+ "# and if greater than 0.05, it assigns 0 asterisks. \n",
+ "\n",
+ "# p_to_star() in my_modules.py\n",
+ "p_as_stars = pvalues.copy()\n",
+ "p_as_stars = p_as_stars.apply(lambda row: p_to_star(row), axis = 1)\n",
+ "p_as_stars.columns = for_corr.columns.values\n",
+ "p_as_stars.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "42327081-1765-4335-bda6-907ac21455d3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "corr_w_star = corrvalues.round(2).astype(str) + p_as_stars\n",
+ "corr_w_star.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "aa5b1ca4-4bd7-4987-b41d-6f7d6b5eef82",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Check if there is non-significant values\n",
+ "for index, row in corr_w_star.iterrows():\n",
+ " for col in corr_w_star.columns:\n",
+ " value = corr_w_star.loc[index, col]\n",
+ " if \"*\" not in value:\n",
+ " print(f\"Value without asterisk found at index: {index}, column: {col}, value: {value}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7b8134e4-58ff-4a6c-b194-008ce95b6734",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "corrvalues.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4837b7b3-bee4-42cf-afd1-013dfd9b7c32",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "corr_w_star.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d0527383-3b44-4277-88e8-cbcf3bb2bfd0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Correlation visualization\n",
+ "sb.set()\n",
+ "\n",
+ "x_axis_labels = for_corr.columns.values.tolist()\n",
+ "y_axis_labels = for_corr.columns.values.tolist()\n",
+ "\n",
+ "ax = sb.heatmap(corrvalues, \n",
+ " annot = corr_w_star, \n",
+ " annot_kws = {\"size\": 1.25},\n",
+ " fmt = 's',\n",
+ " xticklabels = x_axis_labels, \n",
+ " yticklabels=y_axis_labels,\n",
+ " cbar_kws = {'label':'Pearson correlation'},\n",
+ " linecolor = 'black', linewidth = 0.5,\n",
+ " cmap = 'coolwarm')\n",
+ "\n",
+ "plt.yticks(rotation=0, size = 5)\n",
+ "ax.xaxis.tick_top() # x axis on top\n",
+ "ax.xaxis.set_label_position('top')\n",
+ "ax.tick_params(length=0)\n",
+ "plt.xticks(rotation=45, size = 5)\n",
+ "plt.setp(ax.xaxis.get_majorticklabels(), ha='left')\n",
+ "\n",
+ "ax.set_title(label = \"Correlations option 2\", fontsize = 20)\n",
+ "plt.tight_layout()\n",
+ "\n",
+ "filename = \"correlations_option2.png\"\n",
+ "filename = os.path.join(output_images_dir, filename)\n",
+ "plt.savefig(filename,dpi=500)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ccf3ece0-a64b-49b9-b4d4-255ba5744ae0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "filename = \"zscore_pearson_correlations.csv\"\n",
+ "filename = os.path.join(output_data_dir, filename)\n",
+ "corrvalues.to_csv(filename, index = True)\n",
+ "\n",
+ "filename = \"zscore_pearson_p-values.csv\"\n",
+ "filename = os.path.join(output_data_dir, filename)\n",
+ "pvalues.to_csv(filename, index = True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d306e691-e82f-4fd5-a818-e7ac594e2d35",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9a0bcaff-b1bd-4f60-9ff5-faafc907134c",
+ "metadata": {},
+ "source": [
+ "## V.7. PCA"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "aeda3882-5cca-4fb8-8239-2872eb4184cd",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "def demo_PCA(data, c):\n",
+ " reduced_data = PCA(n_components=2).fit_transform(data)\n",
+ " kmeans = KMeans(init=\"k-means++\", n_clusters=c, n_init=4)\n",
+ " kmeans.fit(reduced_data)\n",
+ "\n",
+ " # Step size of the mesh. Decrease to increase the quality of the VQ.\n",
+ " h = 0.02 # point in the mesh [x_min, x_max]x[y_min, y_max].\n",
+ "\n",
+ " # Plot the decision boundary. For that, we will assign a color to each\n",
+ " x_min, x_max = reduced_data[:, 0].min() - 1, reduced_data[:, 0].max() + 1\n",
+ " y_min, y_max = reduced_data[:, 1].min() - 1, reduced_data[:, 1].max() + 1\n",
+ " xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n",
+ "\n",
+ " # Obtain labels for each point in mesh. Use last trained model.\n",
+ " Z = kmeans.predict(np.c_[xx.ravel(), yy.ravel()])\n",
+ "\n",
+ " # Put the result into a color plot\n",
+ " Z = Z.reshape(xx.shape)\n",
+ " plt.figure(1)\n",
+ " plt.clf()\n",
+ " plt.imshow(\n",
+ " Z,\n",
+ " interpolation=\"nearest\",\n",
+ " extent=(xx.min(), xx.max(), yy.min(), yy.max()),\n",
+ " cmap=plt.cm.Paired,\n",
+ " aspect=\"auto\",\n",
+ " origin=\"lower\",\n",
+ " )\n",
+ "\n",
+ " plt.plot(reduced_data[:, 0], reduced_data[:, 1], \"k.\", markersize=2)\n",
+ " # Plot the centroids as a white X\n",
+ " centroids = kmeans.cluster_centers_\n",
+ " plt.scatter(\n",
+ " centroids[:, 0],\n",
+ " centroids[:, 1],\n",
+ " marker=\"x\",\n",
+ " s=169,\n",
+ " linewidths=3,\n",
+ " color=\"w\",\n",
+ " zorder=10,\n",
+ " )\n",
+ " plt.title(\n",
+ " \"K-means clustering on the dataset (PCA-reduced data)\\n\"\n",
+ " \"Centroids are marked with white cross\"\n",
+ " )\n",
+ " plt.xlim(x_min, x_max)\n",
+ " plt.ylim(y_min, y_max)\n",
+ " plt.xticks(())\n",
+ " plt.yticks(())\n",
+ " plt.show()\n",
+ " \n",
+ " return None\n",
+ "\n",
+ "\n",
+ "def other_PCA(data, c):\n",
+ " reduced_data = PCA(n_components=2).fit_transform(data)\n",
+ " ###kmeans = KMeans(init=\"k-means++\", n_clusters=c, n_init=4)\n",
+ " ###kmeans.fit(reduced_data)\n",
+ " \n",
+ " plt.scatter(reduced_data[:,0], reduced_data[:,1], cmap = 'plasma')\n",
+ " plt.xlabel('1st Principal Component')\n",
+ " plt.ylabel('2nd Principal Component')\n",
+ " plt.title('Scatter Plot of the 2 Principal Component')\n",
+ " plt.show()\n",
+ " \n",
+ " return None"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e0b598d9-7355-4f58-8065-e6e4cf073526",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df_test=df.loc[:,~df.columns.isin(not_intensities)]\n",
+ "demo_PCA(df_test, 100)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e15b7d17-f6ce-498d-b92f-5c11081798f0",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "other_PCA(df_test, 100)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "1bd0536e-59f9-4d21-916b-93151a94cf5f",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6fb1db45-9f4a-480e-b51e-3f8722cf8292",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "24c08b97-1995-4f15-9587-396c369a6ce1",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "efaea32f-0cbc-4f11-9618-efc8736a87d1",
+ "metadata": {},
+ "source": [
+ "## V.8. KMEANS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "978dc47e-e957-4922-a731-87bec80112c2",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define number of clusters - according to set & cell type\n",
+ "\n",
+ "def kmeans_analysis(df, c):\n",
+ " analyzed_df = df.loc[:,~df.columns.isin(not_intensities)]\n",
+ " ###kM = KMeans(n_clusters=c).fit_predict(analyzed_df)\n",
+ " kM = KMeans(n_clusters=c).fit(analyzed_df)\n",
+ " ###centroids = kmeans.cluster_centers_ #list of clusters. Each cluster is a matrix of means for each parameter (protein) analyzed\n",
+ " labels = kM.labels_\n",
+ " clusterCount = np.bincount(labels) #holds information for how many points are in each cluster\n",
+ " ###plt.scatter(normed_V1, normed_V2, s=10, c=labels, cmap='coolwarm') # instead of c=bn_class\n",
+ " return None\n",
+ "\n",
+ "def scale_data(df):\n",
+ " pca = PCA(n_components=2) #We are doing a 2D data visualisation, so we need to select 2 principal components for PCA\n",
+ " sc = StandardScaler()\n",
+ " df_scaled = sc.fit_transform(df.loc[:,~df.columns.isin(not_intensities)])\n",
+ " PCs = pca.fit_transform(df_scaled)\n",
+ " return PCs, df_scaled\n",
+ "\n",
+ "def plot_kmeans(df, nb_cl):\n",
+ " pc, scaled_df = scale_data(df)\n",
+ " ###kmeans = KMeans(n_clusters= nb_cl).fit(scaled_df)\n",
+ " ###df_predict = kmeans.predict(scaled_df)\n",
+ " test = KMeans(n_clusters= nb_cl).fit_predict(scaled_df)\n",
+ " sb.scatterplot(x=pc[:,0],y=pc[:,1],hue=test)\n",
+ " return None\n",
+ "\n",
+ "def kmeans_plotting(df, c):\n",
+ " analyzed_df = df.loc[:,~df.columns.isin(not_intensities)]\n",
+ " #Initialize the class object\n",
+ " kmeans = KMeans(n_clusters= c)\n",
+ " #Predict the labels of clusters.\n",
+ " l = kmeans.fit_predict(analyzed_df) #returns the array of cluster labels each data point belongs to\n",
+ " plot_results(l)\n",
+ " return l\n",
+ "\n",
+ "def plot_results(label): #https://www.askpython.com/python/examples/plot-k-means-clusters-python\n",
+ " #Getting unique labels\n",
+ " u_labels = np.unique(label)\n",
+ " #Plotting the results\n",
+ " for i in u_labels:\n",
+ " plt.scatter(df.iloc[label == i , 0] , df.iloc[label == i , 1] , label = i)\n",
+ " plt.title(\"K-means clustering\")\n",
+ " plt.legend(loc='center left', title = \"Clusters\", bbox_to_anchor=(1, 0.5))\n",
+ " plt.show()\n",
+ " return None"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a63f40f4-0756-46e5-97e0-0d07fa066bc1",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define number of clusters - according to set & cell type\n",
+ "\n",
+ "clusterList = kmeans_analysis(df, 20)\n",
+ "plot_kmeans(df, 20)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "caebf01f-b05b-4b39-a6ae-daa55646cff1",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "clusterLabels_array = kmeans_plotting(df, 20)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "213f638b-5d2d-49fd-af69-34835c7f854b",
+ "metadata": {},
+ "source": [
+ "## pca + kmean"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "efa95946-e460-4d62-910c-99f43c28cc37",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "def standardization(df):\n",
+ " df = df.loc[:,~df.columns.isin(not_intensities)]\n",
+ " scaler = StandardScaler()\n",
+ " data_std = scaler.fit_transform(df)\n",
+ " return data_std\n",
+ "\n",
+ "def determine_features_kept(x, y):\n",
+ " real_componentValue = np.interp(0.8, y, x)\n",
+ " rounded_componentValue = round(real_componentValue)\n",
+ " print(\"Number of features/components kept : {}\".format(rounded_componentValue))\n",
+ " return rounded_componentValue\n",
+ "\n",
+ "def explained_variance(pCA):\n",
+ " y = pCA.explained_variance_ratio_\n",
+ " max_range = len(y) + 1\n",
+ " x = range(1,max_range)\n",
+ " plt.figure(figsize = (10,8))\n",
+ " plt.plot(x, y.cumsum(), marker = 'o', linestyle = '--')\n",
+ " plt.title(\"Explained Variance by Components\")\n",
+ " plt.xlabel(\"Number of components\")\n",
+ " plt.ylabel(\"Cumulative Explained Variance\")\n",
+ " plt.show()\n",
+ " nb_features = determine_features_kept(x, y.cumsum())\n",
+ " return nb_features\n",
+ "\n",
+ "def pca_analysis(nb_feat, df):\n",
+ " pca = PCA(n_components = nb_feat)\n",
+ " pca.fit(df)\n",
+ " scores_pca = pca.transform(df)\n",
+ " return scores_pca\n",
+ "\n",
+ "def dimensionality_reduction(df): #using PCA\n",
+ " standard_df = standardization(df)\n",
+ " pca = PCA()\n",
+ " pca.fit(standard_df)\n",
+ " nb_components = explained_variance(pca)\n",
+ " pca_scores = pca_analysis(nb_components, standard_df)\n",
+ " return pca_scores"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "fe2808df-29f3-40d1-94e2-83ae0e95c9ab",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "scoresPCA = dimensionality_reduction(df)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0c60a038-0950-49e6-adaf-b56be3a7d3b7",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "def determine_slope(a, b):\n",
+ " return abs((b[1] - a[1]) / (b[0] - a[0]))\n",
+ "\n",
+ "def record_slopes(X, Y):\n",
+ " slope_list = []\n",
+ " if len(X) == len(Y):\n",
+ " for i in range(len(X)-1):\n",
+ " A = (X[i], Y[i])\n",
+ " B = (X[i+1], Y[i+1])\n",
+ " slope = determine_slope(A, B)\n",
+ " slope_list.append(slope)\n",
+ " else:\n",
+ " print(\"Error! length of X and Y coordinates do not match!\")\n",
+ " slope_list.append(0)\n",
+ " return slope_list\n",
+ "\n",
+ "def elbow_coordinates(diff_ls, x_coord):\n",
+ " max_diff = max(diff_ls) #the slopes with the highest difference correspond to the \"sharpest\" elbow\n",
+ " index_max = diff_ls.index(max_diff) \n",
+ " s_coord = x_coord[index_max+1] #we determine the X position of the elbow\n",
+ " return s_coord\n",
+ "\n",
+ "def highest_slope_diff(ls_slopes, coord_x):\n",
+ " ls_diffs = [] #list of slope differences\n",
+ " for i in range(len(ls_slopes)-1):\n",
+ " diff = abs(ls_slopes[i] - ls_slopes[i+1]) #compare differences between each slope\n",
+ " ls_diffs.append(diff)\n",
+ " elbow = elbow_coordinates(ls_diffs, coord_x) #returns the X coordinates where the elbow is\n",
+ " return elbow"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d61cc628-2bc0-4c78-bdde-1e99fa75b6ed",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "liste = [46405799.34079681, 38240577.23298195, 35026058.95518527, 32185738.815936424, 30500185.571518555, 28678764.340087377, 27418667.363556623, 26234063.97845333, 25405258.778627113, 24454635.699228957]\n",
+ "x = list(range(1, 11))\n",
+ "\n",
+ "highest_slope_diff(liste, x)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b83187a4-476e-4d54-b3f3-e152b6ab654e",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "50092353-e190-42d5-bf76-1f59b9579989",
+ "metadata": {},
+ "source": [
+ "## V.9. T-SNE"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "34e3b33d-f2f6-4791-9c20-e69c69917b9f",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# ImplƩmente notre dataset\n",
+ "## A partir df_tsne, ajoute colonne(s) d'intérêt\n",
+ "cols = list(df.columns)\n",
+ "df['Patient']= df['Patient']\n",
+ "df['cell_type']= df['cell_type']\n",
+ "print('Size of the dataframe: {}'.format(df.shape))\n",
+ "\n",
+ "## Selectionner nb random de valeurs (temp, pr performance)\n",
+ "np.random.seed(50)\n",
+ "rndperm = np.random.permutation(df.shape[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3caff5dd-8998-49ae-b920-990d66d3770e",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "#Remove index values (unneeded & handicapping for T-SNE analysis)\n",
+ "df = df.reset_index(drop=True)\n",
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "4e98e3e1-7e1c-4e45-809e-314a6298c812",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "#Keep only the numbers in the patient ID column\n",
+ "df['Patient'] = df['Patient'].map(lambda x: x.lstrip('Pt'))\n",
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "161bb688-aada-4219-a8bf-701ca75c5527",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "#t-sne\n",
+ "N = 20000\n",
+ "\n",
+ "df_subset = df.loc[rndperm[:N],:].copy() #remove later for full subset? (since it is already a subset)\n",
+ "\n",
+ "data_subset = df_subset[cols].values\n",
+ "\n",
+ "pca = PCA(n_components=3)\n",
+ "data_subset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5f025c11-0ad8-4fe9-97e8-5e909bedbb51",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "\n",
+ "pca_result = pca.fit_transform(data_subset)\n",
+ "\n",
+ "df_subset['pca-one'] = pca_result[:,0]\n",
+ "df_subset['pca-two'] = pca_result[:,1] \n",
+ "df_subset['pca-three'] = pca_result[:,2]\n",
+ "\n",
+ "print('Explained variation per principal component: {}'.format(pca.explained_variance_ratio_))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "01654dbe-b1ab-4e59-98bd-ac66b4092d6e",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b64686e7-ed59-4fc5-9047-7b957f2265f5",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2c7ac1e3-0dea-4143-aea0-71247e2272e2",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "id": "09ff9130-a963-4fdd-aa66-353f559292b6",
+ "metadata": {},
+ "source": [
+ "## V.10. SAVE"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c06a342d-a60e-4688-ace6-e358590f70e5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Save the data by Sample_ID\n",
+ "# Check for the existence of the output file first\n",
+ "for sample in ls_samples:\n",
+ " sample_id = sample.split('_')[0]\n",
+ " filename = os.path.join(output_data_dir, sample_id + \"_\" + step_suffix + \".csv\")\n",
+ " if os.path.exists(filename):\n",
+ " print(\"File by name \"+filename+\" already exists.\")\n",
+ " else:\n",
+ " sample_id_csv = sample_id + '.csv'\n",
+ " df_save = df.loc[df['Sample_ID'] == sample_id_csv, :]\n",
+ " #print(df_save)\n",
+ " filename = os.path.join(output_data_dir, sample_id + \"_\" + step_suffix + \".csv\")\n",
+ " df_save.to_csv(filename, index=True, index_label='ID') # Set index parameter to True to retain the index column\n",
+ " print(\"File \" + filename + \" was created!\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2701ab54-d228-46f3-ba6f-7698ceede677",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Save the dataset as a single file for TSNE/UMAP notebook\n",
+ "filename = \"all_Samples_\" + project_name + \".csv\"\n",
+ "filename = os.path.join(output_data_dir, filename)\n",
+ "\n",
+ "if os.path.exists(filename):\n",
+ " print(\"File by name \"+filename+\" already exists.\")\n",
+ "else :\n",
+ " df.to_csv(filename, index = False)\n",
+ " print(\"File \" + filename + \" was created!\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b09ecaa6-e836-4380-b1f2-428a02049481",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "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.11.7"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/wetransfer_data-zip_2024-05-17_1431/__pycache__/my_modules.cpython-311.pyc b/wetransfer_data-zip_2024-05-17_1431/__pycache__/my_modules.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..7d98b1c819689f79a9dcd23342e48838b86a8636
Binary files /dev/null and b/wetransfer_data-zip_2024-05-17_1431/__pycache__/my_modules.cpython-311.pyc differ
diff --git a/wetransfer_data-zip_2024-05-17_1431/data.zip b/wetransfer_data-zip_2024-05-17_1431/data.zip
new file mode 100644
index 0000000000000000000000000000000000000000..9650fd9e6e7ec50a0ff42695177dc276ac2c8e81
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/data.zip
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:72623169e7fa754d5892a19670be3a1f4cd2bec5fb4736db5e8de103d70c5fe4
+size 326996556
diff --git a/wetransfer_data-zip_2024-05-17_1431/my_modules.py b/wetransfer_data-zip_2024-05-17_1431/my_modules.py
new file mode 100644
index 0000000000000000000000000000000000000000..ced6e8b96a63181aca02de202f5f76b9a1a06239
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/my_modules.py
@@ -0,0 +1,468 @@
+import os
+import numpy as np
+import pandas as pd
+import subprocess
+import os
+import random
+import re
+import pandas as pd
+import numpy as np
+import seaborn as sb
+import matplotlib.pyplot as plt
+import matplotlib.colors as mplc
+import subprocess
+
+
+from scipy import signal
+
+import plotly.figure_factory as ff
+import plotly
+import plotly.graph_objs as go
+from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
+
+
+# This function takes in a dataframe, changes the names
+# of the column in various ways, and returns the dataframe.
+# For best accuracy and generalizability, the code uses
+# regular expressions (regex) to find strings for replacement.
+def apply_header_changes(df):
+ # remove lowercase x at beginning of name
+ df.columns = df.columns.str.replace("^x","")
+ # remove space at beginning of name
+ df.columns = df.columns.str.replace("^ ","")
+ # replace space with underscore
+ df.columns = df.columns.str.replace(" ","_")
+ # fix typos
+ df.columns = df.columns.str.replace("AF_AF","AF")
+ # change "Cell Id" into "ID"
+ df.columns = df.columns.str.replace("Cell Id","ID")
+ # if the ID is the index, change "Cell Id" into "ID"
+ df.index.name = "ID"
+ #
+ df.columns = df.columns.str.replace("","")
+ return df
+
+def apply_df_changes(df):
+ # Remove "@1" after the ID in the index
+ df.index = df.index.str.replace(r'@1$', '')
+ return df
+
+def compare_headers(expected, actual, name):
+ missing_actual = np.setdiff1d(expected, actual)
+ extra_actual = np.setdiff1d(actual, expected)
+ if len(missing_actual) > 0:
+ #print("WARNING: File '" + name + "' lacks the following expected header(s) after import header reformatting: \n"
+ # + str(missing_actual))
+ print("WARNING: File '" + name + "' lacks the following expected item(s): \n" + str(missing_actual))
+ if len(extra_actual) > 0:
+ #print("WARNING: '" + name + "' has the following unexpected header(s) after import header reformatting: \n"
+ # + str(extra_actual))
+ print("WARNING: '" + name + "' has the following unexpected item(s): \n" + str(extra_actual))
+
+ return None
+
+
+def add_metadata_location(row):
+ fc = row['full_column'].lower()
+ if 'cytoplasm' in fc and 'cell' not in fc and 'nucleus' not in fc:
+ return 'cytoplasm'
+ elif 'cell' in fc and 'cytoplasm' not in fc and 'nucleus' not in fc:
+ return 'cell'
+ elif 'nucleus' in fc and 'cell' not in fc and 'cytoplasm' not in fc:
+ return 'nucleus'
+ else:
+ return 'unknown'
+
+
+def get_perc(row, cell_type):
+ total = row['stroma'] + row['immune'] + row['cancer']+row['endothelial']
+ return round(row[cell_type]/total *100,1)
+
+
+
+# Divide each marker (and its localisation) by the right exposure setting for each group of samples
+def divide_exp_time(col, exp_col, metadata):
+ exp_time = metadata.loc[metadata['full_column'] == col.name, exp_col].values[0]
+ return col/exp_time
+
+
+def do_background_sub(col, df, metadata):
+ #print(col.name)
+ location = metadata.loc[metadata['full_column'] == col.name, 'localisation'].values[0]
+ #print('location = ' + location)
+ channel = metadata.loc[metadata['full_column'] == col.name, 'Channel'].values[0]
+ #print('channel = ' + channel)
+ af_target = metadata.loc[
+ (metadata['Channel']==channel) \
+ & (metadata['localisation']==location) \
+ & (metadata['target_lower'].str.contains(r'^af\d{3}$')),\
+ 'full_column'].values[0]
+ return col - df.loc[:,af_target]
+
+
+"""
+This function plots distributions. It takes in a string title (title), a list of
+dataframes from which to plot (dfs), a list of dataframe names for the legend
+(names), a list of the desired colors for the plotted samples (colors),
+a string for the x-axis label (x_label), ```a float binwidth for histrogram (bin_size)```,
+a boolean to show the legend or not (legend),
+and the names of the marker(s) to plot (input_labels). If not specified,
+the function will plot all markers in one plot. input_labels can either be a
+single string, e.g., 'my_marker', or a list, e.g., ['my_marker1','my_marker2'].
+
+The function will create a distribution plot and save it to png. It requires
+a list of items not to be considered as markers when evaluating column names
+(not_markers) to be in memory. It also requires a desired output location of
+the files (output_dir) to already be in memory.
+"""
+
+
+
+def make_distr_plot_per_sample(title, location, dfs, df_names, colors, x_label, legend, xlims = None, markers = ['all'],not_intensities = None):
+ ### GET LIST OF MARKERS TO PLOT ###
+ # Get list of markers to plot if not specified by user, using columns in first df
+ # Writing function(parameter = FILLER) makes that parameter optional when user calls function,
+ # since it is given a default value!
+ if markers == ["all"]:
+ markers = [c for c in dfs[0].columns.values if c not in not_intensities]
+ elif not isinstance(markers, list):
+ markers = [markers]
+ # Make input labels a set to get only unique values, then put back into list
+ markers = list(set(markers))
+
+ ### GET XLIMS ###
+ if xlims == None:
+ mins = [df.loc[:,markers].min().min() for df in dfs]
+ maxes = [df.loc[:,markers].max().max() for df in dfs]
+ xlims = [min(mins), max(maxes)]
+ if not isinstance(xlims, list):
+ print("Problem - xlmis not list. Exiting method...")
+ return None
+ ### CHECK DATA CAN BE PLOTTED ###
+ # Check for data with only 1 unique value - this will cause error if plotted
+ group_labels = []
+ hist_data = []
+ # Iterate through all dataframes (dfs)
+ for i in range(len(dfs)):
+ # Iterate through all marker labels
+ for f in markers:
+ # If there is only one unique value in the marker data for this dataframe,
+ # you cannot plot a distribution plot. It gives you a linear algebra
+ # singular value matrix error
+ if dfs[i][f].nunique() != 1:
+ # Add df name and marker name to labels list
+ # If we have >1 df, we want to make clear
+ # which legend label is associated with which df
+ if len(df_names) > 1:
+ group_labels.append(df_names[i]+"_"+f)
+ else:
+ group_labels.append(f)
+ # add the data to the data list
+ hist_data.append(dfs[i][f])
+ # if no data had >1 unique values, there is nothing to plot
+ if len(group_labels) < 1:
+ print("No markers plotted - all were singular value. Names and markers were " + str(df_names) + ", " + str(markers))
+ return None
+
+ ### TRANSFORM COLOR ITEMS TO CORRECT TYPE ###
+ if isinstance(colors[0], tuple):
+ colors = ['rgb' + str(color) for color in colors]
+
+ ### PLOT DATA ###
+ # Create plot
+ fig = ff.create_distplot(hist_data, group_labels, bin_size=0.1,
+ #colors=colors, bin_size=bin_size, show_rug=False)#show_hist=False,
+ colors=colors, show_rug=False)
+ # Adjust title, font, background color, legend...
+ fig.update_layout(title_text=title, font=dict(size=18),
+ plot_bgcolor = 'white', showlegend = legend)#, legend_x = 3)
+ # Adjust opacity
+ fig.update_traces(opacity=0.6)
+ # Adjust x-axis parameters
+ fig.update_xaxes(title_text = x_label, showline=True, linewidth=2, linecolor='black',
+ tickfont=dict(size=18), range = xlims) # x lims was here
+ # Adjust y-axis parameters
+ fig.update_yaxes(title_text = "Kernel density estimate",showline=True, linewidth=1, linecolor='black',
+ tickfont=dict(size=18))
+
+
+ ### SAVE/DISPLAY PLOT ###
+ # Save plot to HTML
+ # plotly.io.write_html(fig, file = output_dir + "/" + title + ".html")
+ # Plot in new tab
+ #plot(fig)
+ # Save to png
+ filename = os.path.join(location, title.replace(" ","_") + ".png")
+ fig.write_image(filename)
+ return None
+
+
+
+
+
+ # this could be changed to use recursion and make it 'smarter'
+
+def shorten_feature_names(long_names):
+ name_dict = dict(zip(long_names,[n.split('_')[0] for n in long_names]))
+ names_lts, long_names, iteration = shorten_feature_names_helper(name_dict, long_names, 1)
+ # names_lts = names long-to-short
+ # names_stl = names stl
+ names_stl = {}
+ for n in names_lts.items():
+ names_stl[n[1]] = n[0]
+ return names_lts, names_stl
+
+
+def shorten_feature_names_helper(name_dict, long_names, iteration):
+ #print("\nThis is iteration #"+str(iteration))
+ #print("name_dict is: " + str(name_dict))
+ #print("long_names is: " + str(long_names))
+ ## If the number of unique nicknames == number of long names
+ ## then the work here is done
+ #print('\nCompare lengths: ' + str(len(set(name_dict.values()))) + ", " + str(len(long_names)))
+ #print('set(name_dict.values()): ' + str(set(name_dict.values())))
+ #print('long_names: ' + str(long_names))
+ if len(set(name_dict.values())) == len(long_names):
+ #print('All done!')
+ return name_dict, long_names, iteration
+
+ ## otherwise, if the number of unique nicknames is not
+ ## equal to the number of long names (must be shorter than),
+ ## then we need to find more unique names
+ iteration += 1
+ nicknames_set = set()
+ non_unique_nicknames = set()
+ # construct set of current nicknames
+ for long_name in long_names:
+ #print('long_name is ' + long_name + ' and non_unique_nicknames set is ' + str(non_unique_nicknames))
+ short_name = name_dict[long_name]
+ if short_name in nicknames_set:
+ non_unique_nicknames.add(short_name)
+ else:
+ nicknames_set.add(short_name)
+ #print('non_unique_nicknames are: ' + str(non_unique_nicknames))
+
+ # figure out all long names associated
+ # with the non-unique short names
+ trouble_long_names = set()
+ for long_name in long_names:
+ short_name = name_dict[long_name]
+ if short_name in non_unique_nicknames:
+ trouble_long_names.add(long_name)
+
+ #print('troublesome long names are: ' + str(trouble_long_names))
+ #print('name_dict: ' + str(name_dict))
+ # operate on all names that are associated with
+ # the non-unique short nicknames
+ for long_name in trouble_long_names:
+ #print('trouble long name is: ' + long_name)
+ #print('old nickname is: ' + name_dict[long_name])
+ name_dict[long_name] = '_'.join(long_name.split('_')[0:iteration])
+ #print('new nickname is: ' + name_dict[long_name])
+ shorten_feature_names_helper(name_dict, long_names, iteration)
+ return name_dict, long_names, iteration
+
+
+def heatmap_function2(title,
+ data,
+ method, metric, cmap,
+ cbar_kws, xticklabels, save_loc,
+ row_cluster, col_cluster,
+ annotations = {'rows':[],'cols':[]}):
+
+ sb.set(font_scale= 6.0)
+
+ # Extract row and column mappings
+ row_mappings = []
+ col_mappings = []
+ for ann in annotations['rows']:
+ row_mappings.append(ann['mapping'])
+ for ann in annotations['cols']:
+ col_mappings.append(ann['mapping'])
+ # If empty lists, convert to None so seaborn accepts
+ # as the row_colors or col_colors objects
+ if len(row_mappings) == 0:
+ row_mappings = None
+ if len(col_mappings) == 0:
+ col_mappings = None
+
+def heatmap_function(title,
+ data,
+ method, metric, cmap,
+ cbar_kws, xticklabels, save_loc,
+ row_cluster, col_cluster,
+ annotations = {'rows':[],'cols':[]}):
+
+ sb.set(font_scale= 2.0)
+
+ # Extract row and column mappings
+ row_mappings = []
+ col_mappings = []
+ for ann in annotations['rows']:
+ row_mappings.append(ann['mapping'])
+ for ann in annotations['cols']:
+ col_mappings.append(ann['mapping'])
+ # If empty lists, convert to None so seaborn accepts
+ # as the row_colors or col_colors objects
+ if len(row_mappings) == 0:
+ row_mappings = None
+ if len(col_mappings) == 0:
+ col_mappings = None
+
+ # Create clustermap
+ g = sb.clustermap(data = data,
+ robust = True,
+ method = method, metric = metric,
+ cmap = cmap,
+ row_cluster = row_cluster, col_cluster = col_cluster,
+ figsize = (40,30),
+ row_colors=row_mappings, col_colors=col_mappings,
+ yticklabels = False,
+ cbar_kws = cbar_kws,
+ xticklabels = xticklabels)
+
+ # To rotate slightly the x labels
+ plt.setp(g.ax_heatmap.xaxis.get_majorticklabels(), rotation=45)
+
+ # Add title
+ g.fig.suptitle(title, fontsize = 60.0)
+
+ #And now for the legends:
+ # iterate through 'rows', 'cols'
+ for ann_type in annotations.keys():
+ # iterate through each individual annotation feature
+ for ann in annotations[ann_type]:
+ color_dict = ann['dict']
+ handles = []
+ for item in color_dict.keys():
+ h = g.ax_col_dendrogram.bar(0,0, color = color_dict[item], label = item,
+ linewidth = 0)
+ handles.append(h)
+ legend = plt.legend(handles = handles, loc = ann['location'], title = ann['label'],
+ bbox_to_anchor=ann['bbox_to_anchor'],
+ bbox_transform=plt.gcf().transFigure)
+ ax = plt.gca().add_artist(legend)
+
+ # Save image
+ filename = os.path.join(save_loc, title.lower().replace(" ","_") + ".png")
+ g.savefig(filename)
+
+ return None
+
+
+
+# sources -
+#https://stackoverflow.com/questions/27988846/how-to-express-classes-on-the-axis-of-a-heatmap-in-seaborn
+# https://matplotlib.org/3.1.1/tutorials/intermediate/legend_guide.html
+
+
+def verify_line_no(filename, lines_read):
+ # Use Linux "wc -l" command to get the number of lines in the unopened file
+ wc = subprocess.check_output(['wc', '-l', filename]).decode("utf-8")
+ # Take that string, turn it into a list, extract the first item,
+ # and make that an int - this is the number of lines in the file
+ wc = int(wc.split()[0])
+ if lines_read != wc:
+ print("WARNING: '" + filename + "' has " + str(wc) +
+ " lines, but imported dataframe has "
+ + str(lines_read) + " (including header).")
+ return None
+
+
+def rgb_tuple_from_str(rgb_str):
+ rgb_str = rgb_str.replace("(","").replace(")","").replace(" ","")
+ rgb = list(map(float,rgb_str.split(",")))
+ return tuple(rgb)
+
+def color_dict_to_df(cd, column_name):
+ df = pd.DataFrame.from_dict(cd, orient = 'index')
+ df['rgb'] = df.apply(lambda row: (np.float64(row[0]), np.float64(row[1]), np.float64(row[2])), axis = 1)
+ df = df.drop(columns = [0,1,2])
+ df['hex'] = df.apply(lambda row: mplc.to_hex(row['rgb']), axis = 1)
+ df[column_name] = df.index
+ return df
+
+
+# p-values that are less than or equal to 0.05
+def p_add_star(row):
+ m = [str('{:0.3e}'.format(m)) + "*"
+ if m <= 0.05 \
+ else str('{:0.3e}'.format(m))
+ for m in row ]
+ return pd.Series(m)
+
+# assigns a specific number of asterisks based on the thresholds
+def p_to_star(row):
+ output = []
+ for item in row:
+ if item <= 0.001:
+ stars = 3
+ elif item <= 0.01:
+ stars = 2
+ elif item <= 0.05:
+ stars = 1
+ else:
+ stars = 0
+ value = ''
+ for i in range(stars):
+ value += '*'
+ output.append(value)
+ return pd.Series(output)
+
+
+
+def plot_gaussian_distributions(df):
+ # Initialize thresholds list to store all calculated thresholds
+ all_thresholds = []
+
+ # Iterate over all columns except the first one (assuming the first one is non-numeric or an index)
+ for column in df.columns:
+ # Extract the marker data
+ marker_data = df[column]
+
+ # Calculating mean and standard deviation for each marker
+ m_mean, m_std = np.mean(marker_data), np.std(marker_data)
+
+ # Generating x values for the Gaussian curve
+ x_vals = np.linspace(marker_data.min(), marker_data.max(), 100)
+
+ # Calculating Gaussian distribution curve
+ gaussian_curve = (1 / (m_std * np.sqrt(2 * np.pi))) * np.exp(-(x_vals - m_mean) ** 2 / (2 * m_std ** 2))
+
+ # Creating figure for Gaussian distribution for each marker
+ fig = go.Figure()
+ fig.add_trace(go.Scatter(x=x_vals, y=gaussian_curve, mode='lines', name=f'{column} Gaussian Distribution'))
+ fig.update_layout(title=f'Gaussian Distribution for {column} Marker')
+
+ # Calculating thresholds based on each marker's distribution
+ seuil_1sigma = m_mean + m_std
+ seuil_2sigma = m_mean + 2 * m_std
+ seuil_3sigma = m_mean + 3 * m_std
+
+ # Display the figures with thresholds
+ fig.add_shape(type='line', x0=seuil_1sigma, y0=0, x1=seuil_1sigma, y1=np.max(gaussian_curve),
+ line=dict(color='red', dash='dash'), name=f'Seuil 1Ļ: {seuil_1sigma:.2f}')
+ fig.add_shape(type='line', x0=seuil_2sigma, y0=0, x1=seuil_2sigma, y1=np.max(gaussian_curve),
+ line=dict(color='green', dash='dash'), name=f'Seuil 2Ļ: {seuil_2sigma:.2f}')
+ fig.add_shape(type='line', x0=seuil_3sigma, y0=0, x1=seuil_3sigma, y1=np.max(gaussian_curve),
+ line=dict(color='blue', dash='dash'), name=f'Seuil 3Ļ: {seuil_3sigma:.2f}')
+
+ # Add markers and values to the plot
+ fig.add_trace(go.Scatter(x=[seuil_1sigma, seuil_2sigma, seuil_3sigma],
+ y=[0, 0, 0],
+ mode='markers+text',
+ text=[f'{seuil_1sigma:.2f}', f'{seuil_2sigma:.2f}', f'{seuil_3sigma:.2f}'],
+ textposition="top center",
+ marker=dict(size=10, color=['red', 'green', 'blue']),
+ name='Threshold Values'))
+
+ fig.show()
+
+ # Append thresholds for each marker to the list
+ all_thresholds.append((column, seuil_1sigma, seuil_2sigma, seuil_3sigma)) # Include the column name
+
+ # Return thresholds for all markers
+ return all_thresholds
+
+
+
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S1_bs.csv b/wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S1_bs.csv
new file mode 100644
index 0000000000000000000000000000000000000000..9ff531a6a1143c74808a561579f64117b4919a9d
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S1_bs.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e554b52d689c4163abcc6256d41c996caff2eb545a6c6dceef7a4ab66f9541db
+size 133327656
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S2_bs.csv b/wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S2_bs.csv
new file mode 100644
index 0000000000000000000000000000000000000000..5eab0b861f2e3186feab7d554caeff2318d919b4
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S2_bs.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8e7b08b8eda9e9c78adec651f40aa373646543a1425dcbff5394f5e83459460c
+size 138615691
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S3_bs.csv b/wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S3_bs.csv
new file mode 100644
index 0000000000000000000000000000000000000000..f665e40da46762f7142a9c607241d0be096f603b
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_bs/DD3S3_bs.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:92a152e8e267d5d835d84edb1e93ae8b940b655bcde7a1ffda639ce21d19fcce
+size 225018985
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_bs/TMA_bs.csv b/wetransfer_data-zip_2024-05-17_1431/test_bs/TMA_bs.csv
new file mode 100644
index 0000000000000000000000000000000000000000..3bedf4381dc046db65f27b66f5a7e0ef4171e91e
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_bs/TMA_bs.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e19792f19207ff5f7c039c79527c5fc9a6ad3590f56caebe5a52bd30b585bf78
+size 181932794
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_cqc/test_cell_subtypes_number_by_scenes.csv b/wetransfer_data-zip_2024-05-17_1431/test_cqc/test_cell_subtypes_number_by_scenes.csv
new file mode 100644
index 0000000000000000000000000000000000000000..6c866174e116a6d0ef30c289c29027b02b7113a0
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_cqc/test_cell_subtypes_number_by_scenes.csv
@@ -0,0 +1 @@
+dc,b,tcd4,tcd8,m1,m2,treg,immune_other,cancer,αsma_mycaf,stroma_other,endothelial,total_cells
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_data/Ashlar_Exposure_Time.csv b/wetransfer_data-zip_2024-05-17_1431/test_data/Ashlar_Exposure_Time.csv
new file mode 100644
index 0000000000000000000000000000000000000000..57f8b2c5e4822ecbe5b279c3a15299c6a53398e1
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_data/Ashlar_Exposure_Time.csv
@@ -0,0 +1,91 @@
+Target,Round,Channel,ExposureTime
+DAPI0,R0,c0,30.0
+AF488,R0,c1,300.0
+AF555,R0,c2,1500.0
+AF647,R0,c3,1500.0
+AF750,R0,c4,1500.0
+DAPI1,R1,c0,20.0
+ColVI,R1,c1,300.0
+CD31,R1,c2,1200.0
+CD4,R1,c3,1500.0
+Ecad,R1,c4,800.0
+DAPI2,R2,c0,15.0
+Desmin,R2,c1,300.0
+B7H4,R2,c2,1500.0
+CD8,R2,c3,1500.0
+CD20,R2,c4,1500.0
+DAPI3,R3,c0,20.0
+aSMA,R3,c1,50.0
+CD68,R3,c2,1500.0
+PD1,R3,c3,1500.0
+CD45,R3,c4,1500.0
+DAPI4,R4,c0,10.0
+Vimentin,R4,c1,150.0
+AXL,R4,c2,1500.0
+PDL1,R4,c3,1500.0
+FOXP3,R4,c4,1500.0
+DAPI5,R5,c0,10.0
+r5c2,R5,c1,20.0
+CA9,R5,c2,1500.0
+CD163,R5,c3,1500.0
+Ki67,R5,c4,1000.0
+DAPI6,R6,c0,10.0
+CKs,R6,c1,200.0
+Fibronectin,R6,c2,1500.0
+CD44,R6,c3,1200.0
+HLA,R6,c4,500.0
+DAPI7,R7,c0,10.0
+r7c2,R7,c1,20.0
+PDGFR,R7,c2,1500.0
+MMP9,R7,c3,1500.0
+GATA3,R7,c4,1500.0
+DAPI8,R8,c0,10.0
+r8c2,R8,c1,25.0
+CD11c,R8,c2,1500.0
+Sting,R8,c3,1000.0
+CD11b,R8,c4,1500.0
+DAPI0,R0,c0,30.0
+AF488,R0,c1,300.0
+AF555,R0,c2,1500.0
+AF647,R0,c3,1500.0
+AF750,R0,c4,1500.0
+DAPI1,R1,c0,20.0
+ColVI,R1,c1,300.0
+CD31,R1,c2,1200.0
+CD4,R1,c3,1500.0
+Ecad,R1,c4,800.0
+DAPI2,R2,c0,15.0
+Desmin,R2,c1,300.0
+B7H4,R2,c2,1500.0
+CD8,R2,c3,1500.0
+CD20,R2,c4,1500.0
+DAPI3,R3,c0,20.0
+aSMA,R3,c1,50.0
+CD68,R3,c2,1500.0
+PD1,R3,c3,1500.0
+CD45,R3,c4,1500.0
+DAPI4,R4,c0,10.0
+Vimentin,R4,c1,150.0
+AXL,R4,c2,1500.0
+PDL1,R4,c3,1500.0
+FOXP3,R4,c4,1500.0
+DAPI5,R5,c0,10.0
+r5c2,R5,c1,20.0
+CA9,R5,c2,1500.0
+CD163,R5,c3,1500.0
+Ki67,R5,c4,1000.0
+DAPI6,R6,c0,10.0
+CKs,R6,c1,200.0
+Fibronectin,R6,c2,1500.0
+CD44,R6,c3,1200.0
+HLA,R6,c4,500.0
+DAPI7,R7,c0,10.0
+r7c2,R7,c1,20.0
+PDGFR,R7,c2,1500.0
+MMP9,R7,c3,1500.0
+GATA3,R7,c4,1500.0
+DAPI8,R8,c0,10.0
+r8c2,R8,c1,25.0
+CD11c,R8,c2,1500.0
+Sting,R8,c3,1000.0
+CD11b,R8,c4,1500.0
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_data/DD3S1.csv b/wetransfer_data-zip_2024-05-17_1431/test_data/DD3S1.csv
new file mode 100644
index 0000000000000000000000000000000000000000..45ba630fd20852bc132abc8ae6ebbca365a79216
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_data/DD3S1.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c26fb09be4db360c1ca0490bd0624b0b14123537e66aa05ae7a4eb95e0ca512f
+size 208337030
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_data/DD3S2.csv b/wetransfer_data-zip_2024-05-17_1431/test_data/DD3S2.csv
new file mode 100644
index 0000000000000000000000000000000000000000..aa7fe9eb255d79778112605cb9fd397678bd4f90
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_data/DD3S2.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e2ed3706f14d9284987b77e3826a0aa0e97f4f15a96863eaea1ecda7ae6aea6a
+size 216509787
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_data/DD3S3.csv b/wetransfer_data-zip_2024-05-17_1431/test_data/DD3S3.csv
new file mode 100644
index 0000000000000000000000000000000000000000..936c975d6995130d8140813595de2bd93233b7e3
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_data/DD3S3.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b29edf8f829be7c8d8450e94492705e04febd85839c6c57a9f9a3db21bd32b94
+size 329608939
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_data/TMA.csv b/wetransfer_data-zip_2024-05-17_1431/test_data/TMA.csv
new file mode 100644
index 0000000000000000000000000000000000000000..fa416df70a6fd4b0da3237d427770eb741994d1a
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_data/TMA.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cee32a38d4883b8980cd07a16b8e209a3a0b9ebe92948c9d7fd33562f97ff627
+size 275328609
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_data/new_data.csv b/wetransfer_data-zip_2024-05-17_1431/test_data/new_data.csv
new file mode 100644
index 0000000000000000000000000000000000000000..278cecc4901b36a7b7d5795da2328851b385455b
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_data/new_data.csv
@@ -0,0 +1,46 @@
+Target,Round,Channel,ExposureTime
+DAPI0,R0,c0,30.0
+AF488,R0,c1,300.0
+AF555,R0,c2,1500.0
+AF647,R0,c3,1500.0
+AF750,R0,c4,1500.0
+DAPI1,R1,c0,20.0
+ColVI,R1,c1,300.0
+CD31,R1,c2,1200.0
+CD4,R1,c3,1500.0
+Ecad,R1,c4,800.0
+DAPI2,R2,c0,15.0
+Desmin,R2,c1,300.0
+B7H4,R2,c2,1500.0
+CD8,R2,c3,1500.0
+CD20,R2,c4,1500.0
+DAPI3,R3,c0,20.0
+aSMA,R3,c1,50.0
+CD68,R3,c2,1500.0
+PD1,R3,c3,1500.0
+CD45,R3,c4,1500.0
+DAPI4,R4,c0,10.0
+Vimentin,R4,c1,150.0
+AXL,R4,c2,1500.0
+PDL1,R4,c3,1500.0
+FOXP3,R4,c4,1500.0
+DAPI5,R5,c0,10.0
+r5c2,R5,c1,20.0
+CA9,R5,c2,1500.0
+CD163,R5,c3,1500.0
+Ki67,R5,c4,1000.0
+DAPI6,R6,c0,10.0
+CKs,R6,c1,200.0
+Fibronectin,R6,c2,1500.0
+CD44,R6,c3,1200.0
+HLA,R6,c4,500.0
+DAPI7,R7,c0,10.0
+r7c2,R7,c1,20.0
+PDGFR,R7,c2,1500.0
+MMP9,R7,c3,1500.0
+GATA3,R7,c4,1500.0
+DAPI8,R8,c0,10.0
+r8c2,R8,c1,25.0
+CD11c,R8,c2,1500.0
+Sting,R8,c3,1000.0
+CD11b,R8,c4,1500.0
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_data/stored_variables.json b/wetransfer_data-zip_2024-05-17_1431/test_data/stored_variables.json
new file mode 100644
index 0000000000000000000000000000000000000000..e34ddd76072f42a5223751f88c08841102d35a8b
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_data/stored_variables.json
@@ -0,0 +1 @@
+{"selected_metadata_files": ["Slide_B_DD1s1.one_1.tif.csv", "Slide_B_DD1s1.one_2.tif.csv"]}
\ No newline at end of file
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/Exposure_Time.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/Exposure_Time.csv
new file mode 100644
index 0000000000000000000000000000000000000000..0b266c119ab6e50f77cd84cf1bf1857c4cd1343e
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/Exposure_Time.csv
@@ -0,0 +1,37 @@
+Round,Target,Exp,Channel
+R0,AF488,300,c2
+R0,AF555,1500,c3
+R0,AF647,1500,c4
+R0,AF750,1500,c5
+R1,ColVI,300,c2
+R1,CD31,1200,c3
+R1,CD4,1500,c4
+R1,Ecad,800,c5
+R2,Desmin,300,c2
+R2,B7H4,1500,c3
+R2,CD8,1500,c4
+R2,CD20,1500,c5
+R3,aSMA,50,c2
+R3,CD68,1500,c3
+R3,PD1,1500,c4
+R3,CD45,1500,c5
+R4,Vimentin,150,c2
+R4,AXL,1500,c3
+R4,PDL1,1500,c4
+R4,FOXP3,1500,c5
+R5,r5c2,20,c2
+R5,CA9,1500,c3
+R5,CD163,1500,c4
+R5,Ki67,1000,c5
+R6,CKs,200,c2
+R6,Fibronectin,1500,c3
+R6,CD44,1200,c4
+R6,HLA,500,c5
+R7,r7c2,20,c2
+R7,PDGFR,1500,c3
+R7,MMP9,1500,c4
+R7,GATA3,1500,c5
+R8,r8c2,25,c2
+R8,CD11c,1500,c3
+R8,Sting,1000,c4
+R8,CD11b,1500,c5
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/Set_B_unique_ROIs.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/Set_B_unique_ROIs.csv
new file mode 100644
index 0000000000000000000000000000000000000000..4051835efd1009e734e921316a8a512cc8a39680
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/Set_B_unique_ROIs.csv
@@ -0,0 +1,468 @@
+Sample_ID;ROI_index;Patient;Unique_ROI_index
+DD3S1.csv;0;61;61a
+DD3S1.csv;1;62;62a
+DD3S1.csv;2;63;63a
+DD3S1.csv;3;59;59a
+DD3S1.csv;4;60;60a
+DD3S1.csv;5;33;33a
+DD3S1.csv;6;35;35a
+DD3S1.csv;7;36;36a
+DD3S1.csv;8;37;37a
+DD3S1.csv;9;38;38a
+DD3S1.csv;10;30;30a
+DD3S1.csv;11;32;32a
+DD3S1.csv;12;25;25a
+DD3S1.csv;13;26;26a
+DD3S1.csv;14;27;27a
+DD3S1.csv;15;29;29a
+DD3S1.csv;16;20;20a
+DD3S1.csv;17;21;21a
+DD3S1.csv;18;22;22a
+DD3S1.csv;19;23;23a
+DD3S1.csv;20;24;24a
+DD3S1.csv;21;14;14a
+DD3S1.csv;22;15;15a
+DD3S1.csv;23;16;16a
+DD3S1.csv;24;17;17a
+DD3S1.csv;25;18;18a
+DD3S1.csv;26;19;19a
+DD3S1.csv;27;11;11a
+DD3S1.csv;28;12;12a
+DD3S1.csv;29;5;5a
+DD3S1.csv;30;8;8a
+DD3S1.csv;31;9;9a
+DD3S1.csv;32;10;10a
+DD3S1.csv;33;4;4a
+DD3S1.csv;34;59;59b
+DD3S1.csv;35;60;60b
+DD3S1.csv;36;61;61b
+DD3S1.csv;37;62;62b
+DD3S1.csv;38;63;63b
+DD3S1.csv;39;59;59c
+DD3S2.csv;0;52;52a
+DD3S2.csv;1;53;53a
+DD3S2.csv;2;54;54a
+DD3S2.csv;3;55;55a
+DD3S2.csv;4;56;56a
+DD3S2.csv;5;57;57a
+DD3S2.csv;6;50;50a
+DD3S2.csv;7;51;51a
+DD3S2.csv;8;42;42a
+DD3S2.csv;9;43;43a
+DD3S2.csv;10;44;44a
+DD3S2.csv;11;45;45a
+DD3S2.csv;12;47;47a
+DD3S2.csv;13;39;39a
+DD3S2.csv;14;40;40a
+DD3S2.csv;15;41;41a
+DD3S2.csv;16;54;54b
+DD3S2.csv;17;55;55b
+DD3S2.csv;18;57;57b
+DD3S2.csv;19;49;49a
+DD3S2.csv;20;50;50b
+DD3S2.csv;21;51;51b
+DD3S2.csv;22;52;52b
+DD3S2.csv;23;53;53b
+DD3S2.csv;24;45;45b
+DD3S2.csv;25;40;40b
+DD3S2.csv;26;41;41b
+DD3S2.csv;27;42;42b
+DD3S2.csv;28;43;43b
+DD3S2.csv;29;57;57c
+DD3S2.csv;30;50;50c
+DD3S2.csv;31;51;51c
+DD3S2.csv;32;39;39b
+DD3S2.csv;33;52;52c
+DD3S2.csv;34;53;53c
+DD3S2.csv;35;54;54c
+DD3S2.csv;36;55;55c
+DD3S2.csv;37;56;56b
+DD3S2.csv;38;45;45c
+DD3S2.csv;39;46;46a
+DD3S2.csv;40;47;47b
+DD3S2.csv;41;48;48a
+DD3S2.csv;42;40;40c
+DD3S2.csv;43;41;41c
+DD3S2.csv;44;42;42c
+DD3S2.csv;45;44;44b
+DD3S3.csv;0;38;38b
+DD3S3.csv;1;58;58a
+DD3S3.csv;2;30;30b
+DD3S3.csv;3;32;32b
+DD3S3.csv;4;33;33a
+DD3S3.csv;5;36;36a
+DD3S3.csv;6;37;37b
+DD3S3.csv;7;28;28a
+DD3S3.csv;8;29;29b
+DD3S3.csv;9;20;20b
+DD3S3.csv;10;21;21b
+DD3S3.csv;11;22;22b
+DD3S3.csv;12;23;23b
+DD3S3.csv;13;25;25b
+DD3S3.csv;14;26;26b
+DD3S3.csv;15;27;27b
+DD3S3.csv;16;17;17b
+DD3S3.csv;17;18;18b
+DD3S3.csv;18;19;19b
+DD3S3.csv;19;11;11b
+DD3S3.csv;20;12;12b
+DD3S3.csv;21;13;13a
+DD3S3.csv;22;14;14b
+DD3S3.csv;23;15;15b
+DD3S3.csv;24;16;16b
+DD3S3.csv;25;8;8b
+DD3S3.csv;26;9;9b
+DD3S3.csv;27;10;10b
+DD3S3.csv;28;4;4b
+DD3S3.csv;29;5;5b
+DD3S3.csv;30;6;6a
+DD3S3.csv;31;30;30c
+DD3S3.csv;32;32;32c
+DD3S3.csv;33;33;33b
+DD3S3.csv;34;34;34a
+DD3S3.csv;35;36;36b
+DD3S3.csv;36;37;37c
+DD3S3.csv;37;38;38c
+DD3S3.csv;38;20;20c
+DD3S3.csv;39;21;21c
+DD3S3.csv;40;22;22c
+DD3S3.csv;41;23;23c
+DD3S3.csv;42;24;24b
+DD3S3.csv;43;25;25c
+DD3S3.csv;44;26;26c
+DD3S3.csv;45;27;27c
+DD3S3.csv;46;28;28a
+DD3S3.csv;47;29;29c
+DD3S3.csv;48;11;11c
+DD3S3.csv;49;12;12c
+DD3S3.csv;50;13;13b
+DD3S3.csv;51;14;14c
+DD3S3.csv;52;15;15c
+DD3S3.csv;53;16;16c
+DD3S3.csv;54;17;17c
+DD3S3.csv;55;18;18c
+DD3S3.csv;56;19;19c
+DD3S3.csv;57;3;3a
+DD3S3.csv;58;5;5c
+DD3S3.csv;59;6;6b
+DD3S3.csv;60;7;7a
+DD3S3.csv;61;8;8c
+DD3S3.csv;62;9;9c
+DD3S3.csv;63;10;10c
+DD4S1.csv;0;95;95a
+DD4S1.csv;1;122;122a
+DD4S1.csv;2;121;121a
+DD4S1.csv;3;125;125a
+DD4S1.csv;4;124;124a
+DD4S1.csv;5;94;94a
+DD4S1.csv;6;101;101a
+DD4S1.csv;7;86;86a
+DD4S1.csv;8;85;85a
+DD4S1.csv;9;84;84a
+DD4S1.csv;10;83;83a
+DD4S1.csv;11;91;91a
+DD4S1.csv;12;88;88a
+DD4S1.csv;13;87;87a
+DD4S1.csv;14;75;75a
+DD4S1.csv;15;74;74a
+DD4S1.csv;16;82;82a
+DD4S1.csv;17;81;81a
+DD4S1.csv;18;80;80a
+DD4S1.csv;19;79;79a
+DD4S1.csv;20;67;67a
+DD4S1.csv;21;66;66a
+DD4S1.csv;22;65;65a
+DD4S1.csv;23;64;64a
+DD4S1.csv;24;73;73a
+DD4S1.csv;25;71;71a
+DD4S1.csv;26;69;69a
+DD4S1.csv;27;68;68a
+DD4S1.csv;28;125;125b
+DD4S1.csv;29;124;124b
+DD4S1.csv;30;123;123a
+DD4S1.csv;31;122;122b
+DD4S1.csv;32;121;121b
+DD4S1.csv;33;125;125c
+DD4S1.csv;34;124;124c
+DD4S1.csv;35;123;123b
+DD4S1.csv;36;121;121c
+DD4S1.csv;37;115;115a
+DD4S1.csv;38;114;114a
+DD4S1.csv;39;113;113a
+DD4S1.csv;40;111;111a
+DD4S1.csv;41;120;120a
+DD4S1.csv;42;117;117a
+DD4S1.csv;43;116;116a
+DD4S1.csv;44;98;98a
+DD4S1.csv;45;126;126a
+DD4S2.csv;0;105;105a
+DD4S2.csv;1;103;103a
+DD4S2.csv;2;102;102a
+DD4S2.csv;3;110;110a
+DD4S2.csv;4;109;109a
+DD4S2.csv;5;106;106a
+DD4S2.csv;6;117;117b
+DD4S2.csv;7;166;116b
+DD4S2.csv;8;114;114b
+DD4S2.csv;9;113;113b
+DD4S2.csv;10;112;112a
+DD4S2.csv;11;119;119a
+DD4S2.csv;12;106;106b
+DD4S2.csv;13;105;105b
+DD4S2.csv;14;104;104a
+DD4S2.csv;15;110;110b
+DD4S2.csv;16;109;109b
+DD4S2.csv;17;119;119b
+DD4S2.csv;18;115;115b
+DD4S2.csv;19;114;114c
+DD4S2.csv;20;113;113c
+DD4S2.csv;21;112;112b
+DD4S2.csv;22;111;111b
+DD4S2.csv;23;110;110c
+DD4S2.csv;24;108;108a
+DD4S2.csv;25;107;107a
+DD4S2.csv;26;106;106c
+DD4S2.csv;27;105;105c
+DD4S2.csv;28;103;103b
+DD4S2.csv;29;102;102b
+DD4S2.csv;30;98;98b
+DD4S2.csv;31;97;97a
+DD4S2.csv;32;96;96a
+DD4S2.csv;33;95;95b
+DD4S2.csv;34;126;126b
+DD4S2.csv;35;100;100a
+DD4S3.csv;0;89;89a
+DD4S3.csv;1;88;88b
+DD4S3.csv;2;87;87b
+DD4S3.csv;3;85;85b
+DD4S3.csv;4;84;84b
+DD4S3.csv;5;83;83b
+DD4S3.csv;6;91;91b
+DD4S3.csv;7;78;78a
+DD4S3.csv;8;77;77a
+DD4S3.csv;9;75;75b
+DD4S3.csv;10;81;81b
+DD4S3.csv;11;80;80b
+DD4S3.csv;12;70;70a
+DD4S3.csv;13;69;69b
+DD4S3.csv;14;67;67b
+DD4S3.csv;15;65;65b
+DD4S3.csv;16;64;64b
+DD4S3.csv;17;73;73b
+DD4S3.csv;18;72;72a
+DD4S3.csv;19;71;71b
+DD4S3.csv;20;100;100b
+DD4S3.csv;21;99;99a
+DD4S3.csv;22;95;95c
+DD4S3.csv;23;92;92a
+DD4S3.csv;24;91;91c
+DD4S3.csv;25;90;90b
+DD4S3.csv;26;89;89b
+DD4S3.csv;27;88;88c
+DD4S3.csv;28;87;87c
+DD4S3.csv;29;85;85c
+DD4S3.csv;30;83;83c
+DD4S3.csv;31;81;81c
+DD4S3.csv;32;80;80c
+DD4S3.csv;33;78;78b
+DD4S3.csv;34;75;75c
+DD4S3.csv;35;74;74b
+DD4S3.csv;36;73;73c
+DD4S3.csv;37;71;71c
+DD4S3.csv;38;70;70b
+DD4S3.csv;39;69;69c
+DD4S3.csv;40;68;68b
+DD4S3.csv;41;67;67c
+DD4S3.csv;42;66;66b
+DD4S3.csv;43;65;65c
+DD4S3.csv;44;90;90a
+DD4S3.csv;45;79;79b
+DD5S1.csv;0;136;136a
+DD5S1.csv;1;135;135a
+DD5S1.csv;2;134;134a
+DD5S1.csv;3;133;133a
+DD5S1.csv;4;132;132a
+DD5S1.csv;5;131;131a
+DD5S1.csv;6;130;130a
+DD5S1.csv;7;129;129a
+DD5S1.csv;8;144;144a
+DD5S1.csv;9;143;143a
+DD5S1.csv;10;140;140a
+DD5S1.csv;11;137;137a
+DD5S1.csv;12;155;155a
+DD5S1.csv;13;154;154a
+DD5S1.csv;14;153;153a
+DD5S1.csv;15;150;150a
+DD5S1.csv;16;149;149a
+DD5S1.csv;17;148;148a
+DD5S1.csv;18;147;147a
+DD5S1.csv;19;146;146a
+DD5S1.csv;20;164;164a
+DD5S1.csv;21;162;162a
+DD5S1.csv;22;161;161a
+DD5S1.csv;23;160;160a
+DD5S1.csv;24;159;159a
+DD5S1.csv;25;157;157a
+DD5S1.csv;26;133;133b
+DD5S1.csv;27;132;132b
+DD5S1.csv;28;131;131b
+DD5S1.csv;29;130;130b
+DD5S1.csv;30;129;129b
+DD5S1.csv;31;128;128a
+DD5S1.csv;32;127;127a
+DD5S1.csv;33;136;136b
+DD5S1.csv;34;135;135b
+DD5S1.csv;35;134;134a
+DD5S1.csv;36;142;142a
+DD5S1.csv;37;139;139a
+DD5S1.csv;38;137;137b
+DD5S1.csv;39;144;144b
+DD5S1.csv;40;143;143b
+DD5S1.csv;41;152;152a
+DD5S1.csv;42;150;150b
+DD5S1.csv;43;149;149b
+DD5S1.csv;44;148;148b
+DD5S1.csv;45;147;147b
+DD5S1.csv;46;146;146b
+DD5S1.csv;47;155;155b
+DD5S1.csv;48;154;154b
+DD5S1.csv;49;153;153b
+DD5S2.csv;0;162;162b
+DD5S2.csv;1;161;161b
+DD5S2.csv;2;159;159b
+DD5S2.csv;3;158;158a
+DD5S2.csv;4;157;157b
+DD5S2.csv;5;156;156a
+DD5S2.csv;6;164;164b
+DD5S2.csv;7;172;172a
+DD5S2.csv;8;171;171a
+DD5S2.csv;9;170;170a
+DD5S2.csv;10;169;169a
+DD5S2.csv;11;168;168a
+DD5S2.csv;12;167;167a
+DD5S2.csv;13;165;165a
+DD5S2.csv;14;183;183a
+DD5S2.csv;15;182;182a
+DD5S2.csv;16;181;181a
+DD5S2.csv;17;180;180a
+DD5S2.csv;18;179;179a
+DD5S2.csv;19;177;177a
+DD5S2.csv;20;176;176a
+DD5S2.csv;21;171;171b
+DD5S2.csv;22;170;170b
+DD5S2.csv;23;168;168b
+DD5S2.csv;24;167;167b
+DD5S2.csv;25;166;166a
+DD5S2.csv;26;165;165b
+DD5S2.csv;27;174;174a
+DD5S2.csv;28;173;173a
+DD5S2.csv;29;172;172b
+DD5S2.csv;30;180;180b
+DD5S2.csv;31;179;179b
+DD5S2.csv;32;178;178a
+DD5S2.csv;33;176;176b
+DD5S2.csv;34;175;175a
+DD5S2.csv;35;183;183b
+DD5S2.csv;36;181;181b
+DD5S2.csv;37;168;168c
+DD5S2.csv;38;166;166b
+DD5S2.csv;39;174;174b
+DD5S2.csv;40;171;171c
+DD5S2.csv;41;170;170c
+DD5S2.csv;42;169;169b
+DD5S3.csv;0;178;178b
+DD5S3.csv;1;177;177b
+DD5S3.csv;2;176;176c
+DD5S3.csv;3;175;175b
+DD5S3.csv;4;183;183c
+DD5S3.csv;5;182;182b
+DD5S3.csv;6;180;180c
+DD5S3.csv;7;187;187a
+DD5S3.csv;8;185;185a
+DD5S3.csv;9;184;184a
+DD5S3.csv;10;187;187b
+DD5S3.csv;11;185;185b
+DD5S3.csv;12;130;130c
+DD5S3.csv;13;129;129c
+DD5S3.csv;14;136;136c
+DD5S3.csv;15;134;134b
+DD5S3.csv;16;133;133c
+DD5S3.csv;17;132;132c
+DD5S3.csv;18;144;114c
+DD5S3.csv;19;141;141a
+DD5S3.csv;20;140;140b
+DD5S3.csv;21;149;149c
+DD5S3.csv;22;148;148c
+DD5S3.csv;23;154;154c
+DD5S3.csv;24;153;153c
+DD5S3.csv;25;152;152a
+DD5S3.csv;26;157;157c
+DD5S3.csv;27;155;155c
+DD5S3.csv;28;164;164c
+DD5S3.csv;29;162;162c
+DD5S3.csv;30;161;161c
+DD5S3.csv;31;159;159c
+DD5S3.csv;32;185;185c
+DD5S3.csv;33;184;184b
+DD5S3.csv;34;187;187c
+DD5S3.csv;35;186;186a
+TMA.csv;0;c0;c0a
+TMA.csv;1;c1;c1a
+TMA.csv;2;c2;c2a
+TMA.csv;3;c3;c3a
+TMA.csv;4;c4;c4a
+TMA.csv;5;c5;c5a
+TMA.csv;6;c6;c6a
+TMA.csv;7;c7;c7a
+TMA.csv;8;c8;c8a
+TMA.csv;9;c9;c9a
+TMA.csv;10;c10;c10a
+TMA.csv;11;c11;c11a
+TMA.csv;12;c12;c12a
+TMA.csv;13;c13;c13a
+TMA.csv;14;c14;c14a
+TMA.csv;15;c15;c15a
+TMA.csv;16;c16;c16a
+TMA.csv;17;c17;c17a
+TMA.csv;18;c18;c18a
+TMA.csv;19;c19;c19a
+TMA.csv;20;c20;c20a
+TMA.csv;21;c21;c21a
+TMA.csv;22;c22;c22a
+TMA.csv;23;c23;c23a
+TMA.csv;24;c24;c24a
+TMA.csv;25;c25;c25a
+TMA.csv;26;c26;c26a
+TMA.csv;27;c27;c27a
+TMA.csv;28;c28;c28a
+TMA.csv;29;c29;c29a
+TMA.csv;30;c30;c30a
+TMA.csv;31;c31;c31a
+TMA.csv;32;c32;c32a
+TMA.csv;33;c33;c33a
+TMA.csv;34;c34;c34a
+TMA.csv;35;c35;c35a
+TMA.csv;36;c36;c36a
+TMA.csv;37;c37;c37a
+TMA.csv;38;c38;c38a
+TMA.csv;39;c39;c39a
+TMA.csv;40;c40;c40a
+TMA.csv;41;c41;c41a
+TMA.csv;42;c42;c42a
+TMA.csv;43;c43;c43a
+TMA.csv;44;c44;c44a
+TMA.csv;45;c45;c45a
+TMA.csv;46;c46;c46a
+TMA.csv;47;c47;c47a
+TMA.csv;48;c48;c48a
+TMA.csv;49;c49;c49a
+TMA.csv;50;c50;c50a
+TMA.csv;51;c51;c51a
+TMA.csv;52;c52;c52a
+TMA.csv;53;c53;c53a
+TMA.csv;54;c54;c54a
+TMA.csv;55;c55;c55a
+TMA.csv;56;c56;c56a
+TMA.csv;57;c57;c57a
+TMA.csv;58;c58;c58a
+TMA.csv;59;c59;c59a
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/Slide_B_DD1s1.one_1.tif.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/Slide_B_DD1s1.one_1.tif.csv
new file mode 100644
index 0000000000000000000000000000000000000000..c1ba01be0d64992c49c22139bf677aa721692f75
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/Slide_B_DD1s1.one_1.tif.csv
@@ -0,0 +1,46 @@
+Channel,Name,Cycle,ChannelIndex,ExposureTime,ExposureTimeUnit,Fluor,AcquisitionMode,IlluminationType,ContrastMethod,ExcitationWavelength,ExcitationWavelengthUnit,EmissionWavelength,EmissionWavelengthUnit,Color
+0,DAPI0,0,0,30.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+1,AF488,0,1,300.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+2,AF555,0,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+3,AF647,0,3,1500.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+4,AF750,0,4,1500.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+5,DAPI1,1,0,20.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+6,ColVI,1,1,300.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+7,CD31,1,2,1200.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+8,CD4,1,3,1500.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+9,Ecad,1,4,800.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+10,DAPI2,2,0,15.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+11,Desmin,2,1,300.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+12,B7H4,2,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+13,CD8,2,3,1500.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+14,CD20,2,4,1500.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+15,DAPI3,3,0,20.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+16,aSMA,3,1,50.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+17,CD68,3,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+18,PD1,3,3,1500.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+19,CD45,3,4,1500.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+20,DAPI4,4,0,10.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+21,Vimentin,4,1,150.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+22,AXL,4,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+23,PDL1,4,3,1500.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+24,FOXP3,4,4,1500.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+25,DAPI5,5,0,10.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+26,r5c2,5,1,20.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+27,CA9,5,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+28,CD163,5,3,1500.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+29,Ki67,5,4,1000.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+30,DAPI6,6,0,10.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+31,CKs,6,1,200.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+32,Fibronectin,6,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+33,CD44,6,3,1200.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+34,HLA,6,4,500.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+35,DAPI7,7,0,10.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+36,r7c2,7,1,20.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+37,PDGFR,7,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+38,MMP9,7,3,1500.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+39,GATA3,7,4,1500.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+40,DAPI8,8,0,10.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+41,r8c2,8,1,25.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+42,CD11c,8,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+43,Sting,8,3,1000.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+44,CD11b,8,4,1500.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/Slide_B_DD1s1.one_2.tif.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/Slide_B_DD1s1.one_2.tif.csv
new file mode 100644
index 0000000000000000000000000000000000000000..c1ba01be0d64992c49c22139bf677aa721692f75
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/Slide_B_DD1s1.one_2.tif.csv
@@ -0,0 +1,46 @@
+Channel,Name,Cycle,ChannelIndex,ExposureTime,ExposureTimeUnit,Fluor,AcquisitionMode,IlluminationType,ContrastMethod,ExcitationWavelength,ExcitationWavelengthUnit,EmissionWavelength,EmissionWavelengthUnit,Color
+0,DAPI0,0,0,30.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+1,AF488,0,1,300.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+2,AF555,0,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+3,AF647,0,3,1500.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+4,AF750,0,4,1500.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+5,DAPI1,1,0,20.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+6,ColVI,1,1,300.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+7,CD31,1,2,1200.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+8,CD4,1,3,1500.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+9,Ecad,1,4,800.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+10,DAPI2,2,0,15.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+11,Desmin,2,1,300.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+12,B7H4,2,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+13,CD8,2,3,1500.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+14,CD20,2,4,1500.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+15,DAPI3,3,0,20.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+16,aSMA,3,1,50.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+17,CD68,3,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+18,PD1,3,3,1500.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+19,CD45,3,4,1500.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+20,DAPI4,4,0,10.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+21,Vimentin,4,1,150.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+22,AXL,4,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+23,PDL1,4,3,1500.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+24,FOXP3,4,4,1500.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+25,DAPI5,5,0,10.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+26,r5c2,5,1,20.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+27,CA9,5,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+28,CD163,5,3,1500.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+29,Ki67,5,4,1000.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+30,DAPI6,6,0,10.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+31,CKs,6,1,200.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+32,Fibronectin,6,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+33,CD44,6,3,1200.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+34,HLA,6,4,500.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+35,DAPI7,7,0,10.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+36,r7c2,7,1,20.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+37,PDGFR,7,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+38,MMP9,7,3,1500.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+39,GATA3,7,4,1500.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
+40,DAPI8,8,0,10.000000,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.000000,nm,465.000000,nm,#FF0000FF
+41,r8c2,8,1,25.000000,ms,FITC,WideField,Epifluorescence,Fluorescence,495.000000,nm,519.000000,nm,#FF00FF28
+42,CD11c,8,2,1500.000000,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.000000,nm,568.000000,nm,#FFFFFF00
+43,Sting,8,3,1000.000000,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.000000,nm,668.000000,nm,#FFFF0000
+44,CD11b,8,4,1500.000000,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.000000,nm,779.000000,nm,#FF00FFFF
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/TMA_Clinical_Data_187-OC.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/TMA_Clinical_Data_187-OC.csv
new file mode 100644
index 0000000000000000000000000000000000000000..7b813a671684b0bcf57295195c76f1c17718026b
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/TMA_Clinical_Data_187-OC.csv
@@ -0,0 +1,188 @@
+ID;%_tumor;%_necrosis;Age_Diagnosis;BMI;CA125;Race;Other_Cancers;BRCAStatus;NACT_vs_ACT;Diagnosis_to_Start_Chemo;Diagnosis_to_surgery;Stage;Histo_Type;Optimal_Debulking;Residual_Disease;Platinum_sensitive;Days_surgery_to_recurrence;Avastin;Disease_Stat;Days_from_surgery_to_last_contact_or_death;Recurrence;Vital_Status
+1;80;5;72;35;;C;breast;0;ACT;;8;3C;HGSOC;0;1;1;506;1;DOD;1776;Yes;1
+2;50;0;36;24;;C;breast;1;ACT;;0;3C;HGSOC;1;0;1;669;1;DOD;2223;Yes;1
+3;80;5;55;45;944;C;0;;ACT;;0;3C;HGSOC;1;0;1;596;0;DOD;1355;Yes;1
+4;80;5;59;26;50;C;0;0;ACT;;0;3A;HGtubal;1;0;;;;;1783;;
+5;50;0;70;32;1426;C;0;;NACT;19;90;X;CCC;;0;1;377;1;DOD;977;Yes;1
+6;80;5;44;24;788;C;0;;ACT;;0;3C;HGSOC;0;1;;471;0;;1263;Yes;
+7;80;5;63;29;10965;C;0;;NACT;5;69;X;HGSOC;;0;0;516;0;DOD;814;Yes;1
+8;90;5;54;24;2465;C;0;;ACT;;0;3C;HGStubal;0;1;0;144;1;DOD;693;Yes;1
+9;90;5;57;20;3694;C;0;;ACT;;0;3C;HGSOC;0;1;0;428;0;DOD;475;Yes;1
+10;90;5;50;20;316;C;0;1;ACT;;0;3C;serousfallopian;1;0;1;;0;;2162;No;
+11;90;0;58;20;72;C;0;;NACT;35;133;X;Signetringcell;;0;0;203;0;DOD;263;Yes;1
+12;90;0;73;30;1704;C;breast;;ACT;;0;3C;HGSOC;0;1;;;0;DOD;1448;No;1
+13;60;30;62;31;219;C;0;;ACT;;0;3C;HGSOC;1;0;0;162;0;DOD;2286;Yes;1
+14;80;0;52;27;1222;C;breastuterine;;ACT;;0;2B;ENDOOV ;1;0;1;;0;NED;2933;No;0
+15;60;0;77;35;183;C;0;;NACT;10;57;X;HGSOC;1;0;1;460;0;NED;2585;Yes;0
+16;80;0;36;23;333;C;0;0;ACT;;0;1A;ENDOOV ;1;0;;;0;NED;1442;No;0
+17;80;0;66;19;503;C;0;;ACT;;21;3C;HGSOC;1;0;0;;0;DOD;383;;1
+18;90;0;75;25;55;C;0;0;NACT;7;153;X;HGSOC;1;0;1;359;1;DOD;439;Yes;1
+19;80;0;49;35;1100;C;0;;ACT;;0;3C;HGSOC;0;1;1;892;0;AWD;2543;Yes;0
+20;90;0;49;26;25000;C;0;;ACT;;0;1A;CCC;1;0;1;;0;NED;2217;No;0
+21;90;5;55;20;235;C;0;;ACT;;0;1C;ENDOOV ;1;0;1;;0;NED;2087;No;0
+22;80;5;60;19;11;C;squamousskincarcinoma;0;ACT;;0;1A;mucinouscarcinoma;1;0;;;0;NED;1636;No;0
+23;90;5;60;36;38;C;0;;ACT;;0;3B;HGSOC;1;0;1;960;0;DOD;2352;Yes;1
+24;90;5;68;50;28;C;0;;ACT;;0;1C;CCC;1;0;1;;0;NED;1336;;0
+25;80;0;66;25;168;C;0;;ACT;;0;1C;CCC;1;0;1;;0;NED;1092;No;0
+26;80;0;69;29;1907;C;0;0;NACT;9;50;X;HGSOC;1;0;1;;0;DOD;1085;No;1
+27;90;0;51;22;1692;C;0;;ACT;;0;3C;HGSOC;0;1;0;233;1;DOD;465;Yes;1
+28;50;0;70;43;109;C;0;0;ACT;;0;1A;CCC;1;0;;;0;NED;2423;No;0
+29;90;0;76;23;234;C;0;;ACT;;0;3A;CCC;1;0;1;;0;NED;2036;No;0
+30;80;5;46;31;5632;C;0;;ACT;;0;3C;HGSOC;1;0;;789;0;NED;1846;Yes;0
+31;70;0;62;26;11785;C;0;;NACT;11;105;3C;HGSOC;1;0;1;;1;DOD;328;No;1
+32;90;5;75;41;4532;C;0;;NACT;10;80;X;HGSOC;1;0;1;1157;0;AWD;1864;Yes;0
+33;70;0;65;32;871;C;0;;ACT;;0;3C;HGSOC;1;0;1;967;1;DOD;2299;Yes;1
+34;90;0;59;31;458;C;0;;ACT;;0;3C;HGSOC;1;0;1;249;0;DOD;914;Yes;1
+35;90;0;50;;;C;0;;ACT;;0;X;CCC;1;0;0;58;0;DOD;1003;Yes;1
+36;90;0;46;30;1086;C;0;;ACT;;0;4B;HGSOC;0;1;0;230;0;DOD;916;Yes;1
+37;90;0;67;;200;C;;;ACT;;0;1C;ENDOOV ;1;0;1;;0;;3390;No;
+38;90;5;69;28;39;C;0;;ACT;;0;1A;uterineMMT;1;0;;;0;;475;No;
+39;80;5;53;30;;C;0;;ACT;;0;3C;HGSOC;1;0;1;748;1;DOD;1411;Yes;1
+40;70;5;64;;8393;C;;;NACT;31;101;X;HGSOC;1;0;1;;0;;131;No;
+41;90;0;51;20;78;C;breast;1;ACT;;0;2C;HGSOC;1;0;1;716;1;DOD;1570;Yes;1
+42;90;0;63;29;2760;C;0;;ACT;;0;3C;HGSOC;0;1;0;1321;1;DOD;2909;Yes;1
+43;70;5;64;24;118;C;breast;;ACT;;0;3C;HGSOC;0;1;1;600;1;DOD;1719;Yes;1
+44;90;0;71;27;;C;0;;ACT;;0;1C;HGSOC;1;0;;;;NED;4494;No;0
+45;90;5;65;26;8420;latino;0;;ACT;;0;3C;HGSOC;0;1;0;289;1;DOD;548;Yes;1
+46;90;0;43;34;3769;C;0;;ACT;;0;3C;HGSOC;0;1;0;190;1;DOD;1089;Yes;1
+47;80;0;25;55;83;C;0;;ACT;;0;3C;HGSOC;0;1;;;;;25;No;
+48;90;5;84;27;2927;C;0;;ACT;;0;3C;HGSOC;1;0;1;266;0;DOD;403;Yes;1
+49;90;5;62;44;;C;0;;ACT;;0;3C;HGSOC;1;0;1;433;0;;468;Yes;
+50;90;5;59;32;1040;C;0;;ACT;;0;3C;HGSOC;0;1;0;454;0;DOD;1292;Yes;1
+51;90;0;55;33;1000;C;renalcell;;NACT;;90;X;HGSOC;1;0;1;2103;0;;2124;Yes;
+52;90;0;;;;;;;ACT;;0;;mucinousadenocarcinomag2;;;;293;;DOD;487;Yes;1
+53;80;0;76;21;980;C;0;;ACT;;0;3C;HGSOC;1;0;1;529;0;DOD;670;Yes;1
+54;90;5;64;21;250;C;0;;ACT;;0;3C;HGSOC;1;0;1;297;1;DOD;709;Yes;1
+55;90;0;70;21;1665;C;0;;ACT;;0;1C;CCC;1;0;1;;0;NED;5229;No;0
+56;80;5;71;32;1124;C;0;;ACT;;0;3C;HGSOC;0;1;;;;;966;No;
+57;90;5;48;32;3800;C;breast;;ACT;;0;3C;HGSOC;0;1;;;0;;1006;;
+58;90;0;60;29;18;C;breast;0;ACT;;0;1C;CCC;1;0;1;;0;NED;5143;No;0
+59;90;5;65;22;1927;C;0;;ACT;;0;3C;HGSOC;0;1;0;203;0;AWD;386;Yes;0
+60;90;5;63;18;71;C;0;;ACT;;0;1C;mucinousadenocarcinomag2;1;0;1;;0;NED;4798;No;0
+61;60;10;65;23;281;C;0;;NACT;9;9;X;metastaticadenocarcinoma;;;1;;0;;23;No;
+62;90;0;62;24;675;C;0;0;ACT;;0;3C;HGSOC;0;1;1;1055;1;DOD;1842;Yes;1
+63;80;0;49;32;443;C;0;;ACT;;0;3B;HGSOC;1;0;1;609;1;DOD;1899;Yes;1
+64;90;0;50;29;64;C;0;;ACT;;0;2C;HGSOC;1;0;1;;0;NED;4887;No;0
+65;90;0;79;23;136;C;breast;;ACT;;0;3C;HGSOC;0;1;;;;DOD;23;No;1
+66;90;0;75;26;1703;C;0;0;ACT;;0;3C;HGSOC;1;0;0;295;1;AWD;610;Yes;0
+67;90;0;44;24;529;C;breast;1;ACT;;0;2C;HGSOC;1;0;1;892;1;DOD;4347;Yes;1
+68;90;0;80;22;7861;C;melanoma;;ACT;;0;3C;HGSOC;0;1;;;0;DOD;21;No;1
+69;80;0;60;31;78;C;0;0;ACT;;0;3A;HGSOC;1;0;1;;0;NED;4691;No;0
+70;90;0;62;23;139;C;0;;ACT;;0;3C;serousperitonealg1;1;0;0;238;0;DOD;1439;Yes;1
+71;90;5;75;20;1698;C;0;;ACT;;0;3C;HGSOC;0;1;;;0;DOC;4509;No;1
+72;80;5;;;;C;0;;ACT;;0;;;;;;365;1;;38468;Yes;
+73;70;0;75;21;30;C;0;;ACT;;0;3C;HGSOC;0;1;;;0;DOD;37;No;1
+74;90;0;68;23;1360;C;0;;ACT;;0;3C;HGSOC;1;0;1;335;1;DOD;1309;Yes;1
+75;40;0;53;26;587;C;0;;ACT;;0;1A;mucinousadenocarcinomag1;1;0;;;0;NED;4229;No;0
+76;90;5;74;29;4124;C;breaststomach;;ACT;;0;3C;HGSOC;0;1;;;0;DOD;3164;No;1
+77;80;0;54;28;3757;MiddleEastern;0;;ACT;;0;3A;CCC;1;0;1;;0;NED;4557;No;0
+78;80;5;51;30;176;C;0;0;ACT;;0;2B;ENDOOV ;1;0;1;;0;NED;4470;No;0
+79;80;0;57;21;776;Japanese;0;2;ACT;;0;2C;HGSOC;1;0;0;195;1;NED;4521;Yes;0
+80;70;5;69;24;532;C;0;;ACT;;0;3C;HGSOC;1;0;1;760;0;DOD;1111;Yes;1
+81;90;0;64;28;180;C;0;;ACT;;0;3C;HGSOC;1;0;0;535;1;DOD;3945;Yes;1
+82;80;0;64;42;12;C;0;;ACT;;0;3C;HGSOC;1;0;0;147;0;DOD;379;Yes;1
+83;90;0;72;30;959;C;0;;ACT;;0;X;HGSOC;;1;1;468;0;;1064;Yes;
+84;80;10;66;27;;C;braintumorofovarianorigin;;ACT;;0;4B;HGSOC;;;1;393;0;DOD;463;Yes;1
+85;90;0;61;30;116;hispanic;0;;NACT;8;343;X;HGSOC;1;0;1;572;0;DOD;600;Yes;1
+86;80;10;66;29;406;C;0;;ACT;;0;3C;HGSOC;0;1;0;251;1;DOD;540;Yes;1
+87;80;0;86;27;2779;C;0;;ACT;;0;3C;HGSOC;1;0;0;293;0;AWD;826;Yes;0
+88;90;5;49;41;371;C;breast;2;ACT;;0;3C;HGSOC;1;0;0;132;0;NED;4015;Yes;0
+89;90;0;64;28;855;C;0;0;NACT;48;159;X;HGSOC;1;0;1;540;1;DOD;1820;Yes;1
+90;90;5;61;29;547;C;0;;ACT;;0;3C;HGSOC;0;1;;600;0;DOD;1899;Yes;1
+91;70;5;56;40;877;C;0;2;ACT;;0;3C;HGSOC;1;0;1;1140;0;AWD;1358;Yes;0
+92;70;5;75;38;3083;C;0;0;ACT;;0;3C;HGSOC;1;0;1;615;0;DOD;705;Yes;1
+93;90;5;89;21;2895;C;0;;ACT;;0;3B;HGSOC;0;1;;;0;DOD;297;;1
+94;90;5;51;28;5242;C;0;0;ACT;;0;3C;HGSOC;1;0;1;785;1;DOD;1758;Yes;1
+95;80;5;80;24;2799;C;0;;NACT;7;97;X;HGSOC;1;0;;;0;;96;No;
+96;90;5;68;20;2683;C;0;;ACT;;0;2C;HGSOC;1;0;1;;0;NED;4082;No;0
+97;70;5;57;40;19842;C;0;;ACT;;0;2C;mixedepithelialmucosal;1;0;0;174;0;DOD;206;Yes;1
+98;70;0;79;26;2461;C;0;;NACT;12;135;X;HGSOC;1;0;1;343;0;DOD;923;Yes;1
+99;90;0;55;21;1400;C;breast;1;ACT;;0;2C;HGSOC;1;0;;141;0;;336;Yes;
+100;90;0;62;32;2059;C;0;;ACT;;0;1C;HGSOC;1;0;1;;0;NED;2938;No;0
+101;90;5;75;33;242;C;0;;ACT;;0;3C;HGSOC;0;1;1;460;0;DOD;836;Yes;1
+102;90;0;55;25;1395;C;0;;ACT;;0;3C;HGSOC;1;0;1;797;0;DOD;2554;Yes;1
+103;90;10;46;23;116;C;uterine;PMS2;ACT;;0;1C;HGSOC;1;0;1;;0;NED;3578;No;0
+104;90;0;60;29;63;C;0;;NACT;6;103;X;HGSOC;1;0;1;335;0;DOD;351;Yes;1
+105;80;10;75;26;873;C;0;0;ACT;;0;3B;HGSOC;1;0;1;468;0;DOD;622;Yes;1
+106;80;5;69;29;242;C;skintongue;;ACT;;0;3C;HGSOC;1;0;1;648;1;DOD;1320;Yes;1
+107;90;5;63;26;1928;C;0;MSH6;ACT;;0;3C;HGSOC;1;0;1;;0;NED;3725;No;0
+108;80;5;57;40;3687;C;0;;ACT;;0;4;HGSOC;0;1;0;353;1;DOD;791;Yes;1
+109;80;5;75;35;223;C;0;;ACT;;0;1A;HGSOC;0;1;1;;0;NED;3863;No;0
+110;90;0;56;29;5902;C;0;;ACT;;0;3C;HGSOC;0;1;1;438;1;DOD;1527;Yes;1
+111;90;5;50;32;1960;C;0;0;NACT;15;79;X;HGSOC;1;0;1;533;1;DOD;1888;Yes;1
+112;70;5;64;34;301;C;0;0;ACT;;0;1A;HGSOC;1;0;;896;1;AWD;3656;Yes;0
+113;90;0;62;21;115;C;0;;ACT;;0;3C;mucinousadenocarcinomag2;1;0;0;148;;;161;Yes;
+114;90;0;54;24;8571;C;0;;ACT;;0;3C;HGSOC;1;0;0;175;1;DOD;472;Yes;1
+115;80;5;58;22;942;C;;;ACT;;0;4;HGSOC;1;0;1;;0;NED;3219;No;0
+116;80;0;76;34;7453;C;0;;NACT;8;92;X;HGSOC;1;0;1;;0;;478;No;
+117;90;5;54;27;6910;C;0;;ACT;;0;3C;HGSOC;1;0;1;;0;NED;3672;No;0
+118;90;0;64;45;4;C;0;;ACT;;0;1C;HGSOC;1;0;1;609;0;DOD;688;Yes;1
+119;90;0;57;17;16234;C;0;;NACT;12;95;X;HGSOC;0;1;1;655;0;DOD;374;Yes;1
+120;90;0;77;28;18;C;cervical;;ACT;;0;3C;HGSOC;0;1;1;991;1;DOD;1616;Yes;1
+121;90;5;64;38;2207;C;melanoma;;NACT;6;136;X;HGSOC;1;0;;;1;DOD;2445;;1
+122;90;5;81;25;1884;C;0;;ACT;;0;3C;HGSOC;1;0;;517;0;;877;Yes;
+123;70;0;83;26;471;C;breast;;ACT;;0;3C;HGSOC;1;0;1;538;0;DOD;722;Yes;1
+124;90;0;47;22;1993;C;0;2;ACT;;0;4A;HGSOC;0;1;1;570;1;DOD;1042;Yes;1
+125;90;5;70;36;4078;C;breast;0;ACT;;0;3C;HGSOC;1;0;;;;;1077;;
+126;90;0;72;27;2018;C;0;;ACT;;0;3C;HGSOC;1;0;0;341;;DOD;711;Yes;1
+127;70;0;62;22;547;C;melanoma;;ACT;;0;3C;HGSOC;1;0;1;345;0;DOD;485;Yes;1
+128;80;5;58;34;776;C;0;;ACT;;0;3Bor4B;uterinepapillaryserous;1;0;0;282;0;DOD;582;Yes;1
+129;90;0;48;35;944;C;0;1;ACT;;0;4A;HGSOC;1;0;1;543;0;DOD;1763;Yes;1
+130;90;0;76;26;251;C;0;;ACT;;0;2C;ovarianmucinousgrade2intestinal;1;0;1;;0;NED;3292;No;0
+131;70;5;60;18;109;C;0;;ACT;;0;3C;HGSOC;1;0;1;630;0;AWD;1803;Yes;0
+132;90;5;67;37;428;C;0;;ACT;;0;3C;HGSOC;0;1;1;;0;DOC;731;No;1
+133;90;0;75;24;27;C;basalcellcarcinomauterineorcervical;;ACT;;0;3C;HGSOC;1;0;1;2351;0;AWD;2700;Yes;0
+134;80;5;48;17;718;C;0;;ACT;;0;3C;HGSOC;1;0;;;;DOD;977;;1
+135;80;5;44;35;976;C;0;1;ACT;;0;3C;HGSOC;1;0;1;795;0;DOC;2414;Yes;1
+136;90;0;43;38;1000;C;0;;ACT;;0;1C;ENDOOV ;1;0;1;;0;NED;3080;No;0
+137;90;0;54;19;2964;C;neurofibromatosisremotebreast;1;NACT;2;68;X;HGSOC;1;0;1;575;1;DOD;1330;Yes;1
+138;70;5;70;26;1210;Asian;0;;NACT;14;88;X;HGSOC;1;0;0;268;0;DOD;471;Yes;1
+139;80;5;58;33;2162;C;0;;ACT;;0;3C;HGSOC;0;1;0;242;1;DOD;657;Yes;1
+140;70;5;71;21;1046;C;skincancer;;NACT;4;80;X;HGSOC;1;0;;;0;;206;;
+141;70;5;31;31;575;C;0;1;NACT;12;64;X;HGSOC;1;0;1;613;1;DOD;1628;Yes;1
+142;90;0;75;22;95;C;0;0;ACT;;0;1B;HGSOC;1;0;1;1273;0;DOD;1983;Yes;1
+143;80;10;64;28;22;C;0;;ACT;;0;1A;HGSOC;1;0;;;0;NED;3096;No;0
+144;90;0;44;35;377;hispanic;0;1;ACT;;0;4A;HGSOC;1;0;1;455;0;DOD;949;Yes;1
+145;70;0;58;42;222;C;0;0;ACT;;0;3C;highgradetubal;0;1;0;510;1;DOD;849;Yes;1
+146;70;0;71;21;10824;C;0;;NACT;37;136;X;HGSOC;1;0;0;263;0;DOD;352;Yes;1
+147;90;0;51;31;16;C;0;;ACT;;0;2A;HGSOC;1;0;;;;NED;2854;;0
+148;90;5;66;37;1586;C;0;1;ACT;;0;2C;HGSOC;1;0;1;617;0;AWD;1925;Yes;0
+149;70;0;52;26;7363;C;papillarythyroid;;NACT;2;50;X;HGSOC;1;0;1;;0;NED;2706;No;0
+150;90;0;51;26;;C;0;0;ACT;;0;3A;HGSOC;1;0;1;630;0;DOD;2551;Yes;1
+151;80;0;64;;1929;C;0;0;ACT;;0;3C;HGSOC;0;1;1;884;0;DOD;1420;Yes;1
+152;70;5;67;28;15;C;0;0;ACT;;0;2B;ENDOOV ;1;0;1;;0;NED;2867;No;0
+153;80;5;64;23;968;C;othermalignantneoplasmsitenotspecified;2;NACT;19;172;X;HGSOC;1;0;1;361;1;DOD;2336;Yes;1
+154;80;5;54;34;324;C;0;0;ACT;;0;3A;HGSOC;1;0;1;465;1;DOD;2645;Yes;1
+155;90;0;50;32;1218;C;0;;ACT;;0;1C;ENDOOV ;;;;;0;DOC;2743;No;1
+156;90;5;43;38;;C;0;0;ACT;;0;;HGSOC;;;1;6940;0;DOD;9303;Yes;1
+157;80;5;56;36;1971;C;0;2;NACT;8;94;X;ENDOOV ;1;0;1;;0;DOD;1667;No;1
+158;90;5;46;31;853;C;0;0;ACT;;0;3C;HGSOC;1;0;1;1892;0;AWD;2778;Yes;0
+159;90;0;66;23;14365;C;0;;ACT;;0;3C;HGSOC;1;0;1;1209;0;DOD;2073;Yes;1
+160;90;5;59;27;89;C;breast;0;NACT;22;278;X;HGSOC;0;1;1;160;1;DOD;328;Yes;1
+161;90;0;59;28;12;C;0;MSH6;ACT;;0;1C;ENDOOV ;1;0;1;;0;NED;2642;No;0
+162;80;0;75;20;7482;C;0;0;NACT;49;143;X;serousofMullerianorigin;1;0;1;536;0;DOD;2353;Yes;1
+163;80;10;24;21;;hispanic;thymiccarcinoma;MSH2;ACT;;0;1C;mucinouscarcinoma;1;0;;;0;DOD;585;No;1
+164;80;5;68;21;249;C;0;0;ACT;;0;1B;HGSOC;1;0;1;;0;NED;2699;No;0
+165;90;5;51;37;;C;0;;ACT;;0;1A;HGSOC;1;0;1;;0;NED;2674;No;0
+166;90;5;63;23;;C;0;FBXW7;ACT;;0;3C;HGSOC;1;0;0;464;1;DOD;1184;Yes;1
+167;90;5;64;21;624;C;breast;0;ACT;;0;3C;HGSOC;0;1;1;;0;DOC;2593;No;1
+168;90;5;80;30;;C;0;0;ACT;;0;3B;HGSOC;1;0;1;;0;NED;2631;No;0
+169;80;5;75;35;245;C;0;;NACT;10;78;X;HGSOC;1;0;1;1003;0;DOD;1442;Yes;1
+170;70;5;55;21;3071;C;0;;ACT;;0;3C;HGSOC;1;0;1;;0;NED;2345;No;0
+171;80;5;60;34;500;C;0;;NACT;14;145;X;HGSOC;1;0;1;302;0;DOD;456;Yes;1
+172;90;0;56;25;371;C;concomitantmetastaticpancreaticcanceridentifiedatsurgery;;ACT;;0;1A;HGSOC;0;1;;;0;DOD;619;No;1
+173;90;5;72;33;;C;0;;ACT;;0;3C;HGSOC;1;0;1;1038;0;DOD;2404;Yes;1
+174;50;0;54;36;8529;C;0;0;NACT;15;127;X;HGSPC;1;0;1;387;0;DOD;660;Yes;1
+175;80;5;59;44;378;C;0;;ACT;;0;3C;HGSOC;1;0;1;947;0;DOD;1930;Yes;1
+176;70;0;56;29;1812;C;0;0;ACT;;0;3C;HGSOC;1;0;1;2101;0;DOD;2223;Yes;1
+177;90;0;60;32;919;C;colon;0;NACT;10;70;X;HGSOC;1;0;1;450;1;DOD;1743;Yes;1
+178;80;0;67;27;107;C;basalcellcarcinoma;0;NACT;50;603;3C;HGSOC;0;1;1;416;0;DOD;977;Yes;1
+179;80;0;83;25;;C;0;;NACT;15;62;X;HGSOC;1;0;1;;;DOD;1070;;1
+180;70;10;64;25;88;C;0;0;ACT;;0;1A;1Aendometrialadenocarcinomag31Aclearcellofovary;1;0;1;;0;NED;2274;No;0
+181;90;5;20;27;229;C;0;0;ACT;;0;3C;HGSOC;1;0;1;1170;0;AWD;4810;Yes;0
+182;80;0;81;28;990;C;0;;NACT;19;102;X;HGSOC;1;0;0;381;0;DOD;1552;Yes;1
+183;70;5;72;22;597;C;breast;0;NACT;8;88;X;HGSOC;1;0;1;;;DOD;1036;;1
+184;90;0;72;26;3788;C;breast;;NACT;22;91;X;HGSOC;1;0;1;282;0;;468;Yes;
+185;90;0;70;29;1330;C;0;;ACT;;0;3C;HGSOC;1;0;;;;DOD;1020;;1
+186;80;0;84;17;564;C;squamouscellcarcinoma;;ACT;;0;2B;HGSOC;1;0;;;;DOC;1869;No;1
+187;80;0;27;22;922;C;0;0;NACT;11;91;X;serousprimarilylowgradewfociofhighgrade;1;1;1;540;0;DOD;1279;Yes;1
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/cellsubtype_color_data.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/cellsubtype_color_data.csv
new file mode 100644
index 0000000000000000000000000000000000000000..b5e72f27a37c063dd21bb360077318a90cfa4698
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/cellsubtype_color_data.csv
@@ -0,0 +1,13 @@
+rgb,hex,cell_subtype
+"(0.6509803921568628, 0.807843137254902, 0.8901960784313725)",#a6cee3,DC
+"(0.12156862745098039, 0.47058823529411764, 0.7058823529411765)",#1f78b4,B
+"(0.6980392156862745, 0.8745098039215686, 0.5411764705882353)",#b2df8a,TCD4
+"(0.2, 0.6274509803921569, 0.17254901960784313)",#33a02c,TCD8
+"(0.984313725490196, 0.6039215686274509, 0.6)",#fb9a99,M1
+"(0.8901960784313725, 0.10196078431372549, 0.10980392156862745)",#e31a1c,M2
+"(0.9921568627450981, 0.7490196078431373, 0.43529411764705883)",#fdbf6f,Treg
+"(1.0, 0.4980392156862745, 0.0)",#ff7f00,IMMUNE_OTHER
+"(0.792156862745098, 0.6980392156862745, 0.8392156862745098)",#cab2d6,CANCER
+"(0.41568627450980394, 0.23921568627450981, 0.6039215686274509)",#6a3d9a,αSMA_myCAF
+"(1.0, 1.0, 0.6)",#ffff99,STROMA_OTHER
+"(0.6941176470588235, 0.34901960784313724, 0.1568627450980392)",#b15928,ENDOTHELIAL
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/celltype_color_data.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/celltype_color_data.csv
new file mode 100644
index 0000000000000000000000000000000000000000..0600b2cebb13dca8c5a4d3eab7b9a44a3bce29ff
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/celltype_color_data.csv
@@ -0,0 +1,5 @@
+rgb,hex,cell_type
+"(0.1333, 0.5451, 0.1333)",#228b22,CANCER
+"(0.4, 0.4, 0.4)",#666666,STROMA
+"(1.0, 1.0, 0.0)",#ffff00,IMMUNE
+"(0.502, 0.0, 0.502)",#800080,ENDOTHELIAL
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/channel_color_data.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/channel_color_data.csv
new file mode 100644
index 0000000000000000000000000000000000000000..835cd11cda39d090244169a22adb022e10752b2e
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/channel_color_data.csv
@@ -0,0 +1,5 @@
+rgb,hex,Channel
+"(0.00784313725490196, 0.24313725490196078, 1.0)",#023eff,c2
+"(1.0, 0.48627450980392156, 0.0)",#ff7c00,c3
+"(0.10196078431372549, 0.788235294117647, 0.2196078431372549)",#1ac938,c4
+"(0.9098039215686274, 0.0, 0.043137254901960784)",#e8000b,c5
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/combined_metadata.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/combined_metadata.csv
new file mode 100644
index 0000000000000000000000000000000000000000..9a3e5b2eb2e24a07ef2ec9d570f47a02425a1264
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/combined_metadata.csv
@@ -0,0 +1,91 @@
+Channel,Name,Cycle,ChannelIndex,ExposureTime,ExposureTimeUnit,Fluor,AcquisitionMode,IlluminationType,ContrastMethod,ExcitationWavelength,ExcitationWavelengthUnit,EmissionWavelength,EmissionWavelengthUnit,Color
+0,DAPI0,0,0,30.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+1,AF488,0,1,300.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+2,AF555,0,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+3,AF647,0,3,1500.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+4,AF750,0,4,1500.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+5,DAPI1,1,0,20.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+6,ColVI,1,1,300.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+7,CD31,1,2,1200.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+8,CD4,1,3,1500.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+9,Ecad,1,4,800.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+10,DAPI2,2,0,15.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+11,Desmin,2,1,300.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+12,B7H4,2,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+13,CD8,2,3,1500.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+14,CD20,2,4,1500.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+15,DAPI3,3,0,20.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+16,aSMA,3,1,50.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+17,CD68,3,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+18,PD1,3,3,1500.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+19,CD45,3,4,1500.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+20,DAPI4,4,0,10.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+21,Vimentin,4,1,150.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+22,AXL,4,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+23,PDL1,4,3,1500.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+24,FOXP3,4,4,1500.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+25,DAPI5,5,0,10.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+26,r5c2,5,1,20.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+27,CA9,5,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+28,CD163,5,3,1500.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+29,Ki67,5,4,1000.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+30,DAPI6,6,0,10.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+31,CKs,6,1,200.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+32,Fibronectin,6,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+33,CD44,6,3,1200.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+34,HLA,6,4,500.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+35,DAPI7,7,0,10.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+36,r7c2,7,1,20.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+37,PDGFR,7,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+38,MMP9,7,3,1500.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+39,GATA3,7,4,1500.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+40,DAPI8,8,0,10.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+41,r8c2,8,1,25.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+42,CD11c,8,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+43,Sting,8,3,1000.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+44,CD11b,8,4,1500.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+0,DAPI0,0,0,30.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+1,AF488,0,1,300.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+2,AF555,0,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+3,AF647,0,3,1500.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+4,AF750,0,4,1500.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+5,DAPI1,1,0,20.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+6,ColVI,1,1,300.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+7,CD31,1,2,1200.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+8,CD4,1,3,1500.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+9,Ecad,1,4,800.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+10,DAPI2,2,0,15.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+11,Desmin,2,1,300.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+12,B7H4,2,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+13,CD8,2,3,1500.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+14,CD20,2,4,1500.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+15,DAPI3,3,0,20.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+16,aSMA,3,1,50.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+17,CD68,3,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+18,PD1,3,3,1500.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+19,CD45,3,4,1500.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+20,DAPI4,4,0,10.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+21,Vimentin,4,1,150.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+22,AXL,4,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+23,PDL1,4,3,1500.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+24,FOXP3,4,4,1500.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+25,DAPI5,5,0,10.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+26,r5c2,5,1,20.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+27,CA9,5,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+28,CD163,5,3,1500.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+29,Ki67,5,4,1000.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+30,DAPI6,6,0,10.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+31,CKs,6,1,200.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+32,Fibronectin,6,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+33,CD44,6,3,1200.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+34,HLA,6,4,500.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+35,DAPI7,7,0,10.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+36,r7c2,7,1,20.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+37,PDGFR,7,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+38,MMP9,7,3,1500.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+39,GATA3,7,4,1500.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
+40,DAPI8,8,0,10.0,ms,DAPI,WideField,Epifluorescence,Fluorescence,353.0,nm,465.0,nm,#FF0000FF
+41,r8c2,8,1,25.0,ms,FITC,WideField,Epifluorescence,Fluorescence,495.0,nm,519.0,nm,#FF00FF28
+42,CD11c,8,2,1500.0,ms,Alexa Fluor 555,WideField,Epifluorescence,Fluorescence,553.0,nm,568.0,nm,#FFFFFF00
+43,Sting,8,3,1000.0,ms,Alexa Fluor 647,WideField,Epifluorescence,Fluorescence,653.0,nm,668.0,nm,#FFFF0000
+44,CD11b,8,4,1500.0,ms,Alexa Fluor 750,WideField,Epifluorescence,Fluorescence,752.0,nm,779.0,nm,#FF00FFFF
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/full_to_short_column_names.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/full_to_short_column_names.csv
new file mode 100644
index 0000000000000000000000000000000000000000..1559ab340f6d91a6b42bef36e8c5d74b7bde5e64
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/full_to_short_column_names.csv
@@ -0,0 +1,109 @@
+full_name,short_name
+AF488_Cell_Intensity_Average,AF488_Cell
+AF488_Cytoplasm_Intensity_Average,AF488_Cytoplasm
+AF488_Nucleus_Intensity_Average,AF488_Nucleus
+AF555_Cell_Intensity_Average,AF555_Cell
+AF555_Cytoplasm_Intensity_Average,AF555_Cytoplasm
+AF555_Nucleus_Intensity_Average,AF555_Nucleus
+AF647_Cell_Intensity_Average,AF647_Cell
+AF647_Cytoplasm_Intensity_Average,AF647_Cytoplasm
+AF647_Nucleus_Intensity_Average,AF647_Nucleus
+AF750_Cell_Intensity_Average,AF750_Cell
+AF750_Cytoplasm_Intensity_Average,AF750_Cytoplasm
+AF750_Nucleus_Intensity_Average,AF750_Nucleus
+aSMA_Cell_Intensity_Average,aSMA_Cell
+aSMA_Cytoplasm_Intensity_Average,aSMA_Cytoplasm
+aSMA_Nucleus_Intensity_Average,aSMA_Nucleus
+AXL_Cell_Intensity_Average,AXL_Cell
+AXL_Cytoplasm_Intensity_Average,AXL_Cytoplasm
+AXL_Nucleus_Intensity_Average,AXL_Nucleus
+B7H4_Cell_Intensity_Average,B7H4_Cell
+B7H4_Cytoplasm_Intensity_Average,B7H4_Cytoplasm
+B7H4_Nucleus_Intensity_Average,B7H4_Nucleus
+CA9_Cell_Intensity_Average,CA9_Cell
+CA9_Cytoplasm_Intensity_Average,CA9_Cytoplasm
+CA9_Nucleus_Intensity_Average,CA9_Nucleus
+CD4_Cell_Intensity_Average,CD4_Cell
+CD4_Cytoplasm_Intensity_Average,CD4_Cytoplasm
+CD4_Nucleus_Intensity_Average,CD4_Nucleus
+CD8_Cell_Intensity_Average,CD8_Cell
+CD8_Cytoplasm_Intensity_Average,CD8_Cytoplasm
+CD8_Nucleus_Intensity_Average,CD8_Nucleus
+CD11b_Cell_Intensity_Average,CD11b_Cell
+CD11b_Cytoplasm_Intensity_Average,CD11b_Cytoplasm
+CD11b_Nucleus_Intensity_Average,CD11b_Nucleus
+CD11c_Cell_Intensity_Average,CD11c_Cell
+CD11c_Cytoplasm_Intensity_Average,CD11c_Cytoplasm
+CD11c_Nucleus_Intensity_Average,CD11c_Nucleus
+CD20_Cell_Intensity_Average,CD20_Cell
+CD20_Cytoplasm_Intensity_Average,CD20_Cytoplasm
+CD20_Nucleus_Intensity_Average,CD20_Nucleus
+CD31_Cell_Intensity_Average,CD31_Cell
+CD31_Cytoplasm_Intensity_Average,CD31_Cytoplasm
+CD31_Nucleus_Intensity_Average,CD31_Nucleus
+CD44_Cell_Intensity_Average,CD44_Cell
+CD44_Cytoplasm_Intensity_Average,CD44_Cytoplasm
+CD44_Nucleus_Intensity_Average,CD44_Nucleus
+CD45_Cell_Intensity_Average,CD45_Cell
+CD45_Cytoplasm_Intensity_Average,CD45_Cytoplasm
+CD45_Nucleus_Intensity_Average,CD45_Nucleus
+CD68_Cell_Intensity_Average,CD68_Cell
+CD68_Cytoplasm_Intensity_Average,CD68_Cytoplasm
+CD68_Nucleus_Intensity_Average,CD68_Nucleus
+CD163_Cell_Intensity_Average,CD163_Cell
+CD163_Cytoplasm_Intensity_Average,CD163_Cytoplasm
+CD163_Nucleus_Intensity_Average,CD163_Nucleus
+CKs_Cell_Intensity_Average,CKs_Cell
+CKs_Cytoplasm_Intensity_Average,CKs_Cytoplasm
+CKs_Nucleus_Intensity_Average,CKs_Nucleus
+ColVI_Cell_Intensity_Average,ColVI_Cell
+ColVI_Cytoplasm_Intensity_Average,ColVI_Cytoplasm
+ColVI_Nucleus_Intensity_Average,ColVI_Nucleus
+Desmin_Cell_Intensity_Average,Desmin_Cell
+Desmin_Cytoplasm_Intensity_Average,Desmin_Cytoplasm
+Desmin_Nucleus_Intensity_Average,Desmin_Nucleus
+Ecad_Cell_Intensity_Average,Ecad_Cell
+Ecad_Cytoplasm_Intensity_Average,Ecad_Cytoplasm
+Ecad_Nucleus_Intensity_Average,Ecad_Nucleus
+Fibronectin_Cell_Intensity_Average,Fibronectin_Cell
+Fibronectin_Cytoplasm_Intensity_Average,Fibronectin_Cytoplasm
+Fibronectin_Nucleus_Intensity_Average,Fibronectin_Nucleus
+FOXP3_Cell_Intensity_Average,FOXP3_Cell
+FOXP3_Cytoplasm_Intensity_Average,FOXP3_Cytoplasm
+FOXP3_Nucleus_Intensity_Average,FOXP3_Nucleus
+GATA3_Cell_Intensity_Average,GATA3_Cell
+GATA3_Cytoplasm_Intensity_Average,GATA3_Cytoplasm
+GATA3_Nucleus_Intensity_Average,GATA3_Nucleus
+HLA_Cell_Intensity_Average,HLA_Cell
+HLA_Cytoplasm_Intensity_Average,HLA_Cytoplasm
+HLA_Nucleus_Intensity_Average,HLA_Nucleus
+Ki67_Cell_Intensity_Average,Ki67_Cell
+Ki67_Cytoplasm_Intensity_Average,Ki67_Cytoplasm
+Ki67_Nucleus_Intensity_Average,Ki67_Nucleus
+MMP9_Cell_Intensity_Average,MMP9_Cell
+MMP9_Cytoplasm_Intensity_Average,MMP9_Cytoplasm
+MMP9_Nucleus_Intensity_Average,MMP9_Nucleus
+PD1_Cell_Intensity_Average,PD1_Cell
+PD1_Cytoplasm_Intensity_Average,PD1_Cytoplasm
+PD1_Nucleus_Intensity_Average,PD1_Nucleus
+PDGFR_Cell_Intensity_Average,PDGFR_Cell
+PDGFR_Cytoplasm_Intensity_Average,PDGFR_Cytoplasm
+PDGFR_Nucleus_Intensity_Average,PDGFR_Nucleus
+PDL1_Cell_Intensity_Average,PDL1_Cell
+PDL1_Cytoplasm_Intensity_Average,PDL1_Cytoplasm
+PDL1_Nucleus_Intensity_Average,PDL1_Nucleus
+r5c2_Cell_Intensity_Average,r5c2_Cell
+r5c2_Cytoplasm_Intensity_Average,r5c2_Cytoplasm
+r5c2_Nucleus_Intensity_Average,r5c2_Nucleus
+r7c2_Cell_Intensity_Average,r7c2_Cell
+r7c2_Cytoplasm_Intensity_Average,r7c2_Cytoplasm
+r7c2_Nucleus_Intensity_Average,r7c2_Nucleus
+r8c2_Cell_Intensity_Average,r8c2_Cell
+r8c2_Cytoplasm_Intensity_Average,r8c2_Cytoplasm
+r8c2_Nucleus_Intensity_Average,r8c2_Nucleus
+Sting_Cell_Intensity_Average,Sting_Cell
+Sting_Cytoplasm_Intensity_Average,Sting_Cytoplasm
+Sting_Nucleus_Intensity_Average,Sting_Nucleus
+Vimentin_Cell_Intensity_Average,Vimentin_Cell
+Vimentin_Cytoplasm_Intensity_Average,Vimentin_Cytoplasm
+Vimentin_Nucleus_Intensity_Average,Vimentin_Nucleus
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Cellsubtype_legend.png b/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Cellsubtype_legend.png
new file mode 100644
index 0000000000000000000000000000000000000000..d240e07e43c243939f89e11c06a2757f5d38385e
Binary files /dev/null and b/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Cellsubtype_legend.png differ
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Celltype_legend.png b/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Celltype_legend.png
new file mode 100644
index 0000000000000000000000000000000000000000..931e609afadc0e4785d890426ec79c1689769c2d
Binary files /dev/null and b/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Celltype_legend.png differ
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Channel_legend.png b/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Channel_legend.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac6c2e7bcdc651e2abf6d8616d5996aafa586a9a
Binary files /dev/null and b/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Channel_legend.png differ
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Round_legend.png b/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Round_legend.png
new file mode 100644
index 0000000000000000000000000000000000000000..b355b3d49f423f042e46427c63d9760529057abb
Binary files /dev/null and b/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Round_legend.png differ
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Sample_legend.png b/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Sample_legend.png
new file mode 100644
index 0000000000000000000000000000000000000000..4dc24fa65944c412d470bd0b76fab60bbea89b55
Binary files /dev/null and b/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/Sample_legend.png differ
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/immune_checkpoint_legend.png b/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/immune_checkpoint_legend.png
new file mode 100644
index 0000000000000000000000000000000000000000..d240e07e43c243939f89e11c06a2757f5d38385e
Binary files /dev/null and b/wetransfer_data-zip_2024-05-17_1431/test_metadata/images/immune_checkpoint_legend.png differ
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/immunecheckpoint_color_data.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/immunecheckpoint_color_data.csv
new file mode 100644
index 0000000000000000000000000000000000000000..4945727898a0cc33a5bf3b906a3131e6f0cdc7ee
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/immunecheckpoint_color_data.csv
@@ -0,0 +1,6 @@
+rgb,hex,immune_checkpoint
+"(0.9677975592919913, 0.44127456009157356, 0.5358103155058701)",#f77189,B7H4
+"(0.3126890019504329, 0.6928754610296064, 0.1923704830330379)",#50b131,PDL1
+"(0.23299120924703914, 0.639586552066035, 0.9260706093977744)",#3ba3ec,PD1
+"(0.6402432806212122, 0.56707501056059, 0.36409039926945397)",#a3915d,B7H4_PDL1
+"(0.5044925901631545, 0.5912455243957383, 0.5514171359788941)",#81978d,None
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/marker_intensity_metadata.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/marker_intensity_metadata.csv
new file mode 100644
index 0000000000000000000000000000000000000000..80dd04a89820bf39d377899a36a68d433e99a309
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/marker_intensity_metadata.csv
@@ -0,0 +1,109 @@
+Round,Target,Exp,Channel,target_lower,full_column,marker,localisation
+R0,AF488,300,c2,af488,AF488_Cell_Intensity_Average,AF488,cell
+R0,AF488,300,c2,af488,AF488_Cytoplasm_Intensity_Average,AF488,cytoplasm
+R0,AF488,300,c2,af488,AF488_Nucleus_Intensity_Average,AF488,nucleus
+R0,AF555,1500,c3,af555,AF555_Cell_Intensity_Average,AF555,cell
+R0,AF555,1500,c3,af555,AF555_Cytoplasm_Intensity_Average,AF555,cytoplasm
+R0,AF555,1500,c3,af555,AF555_Nucleus_Intensity_Average,AF555,nucleus
+R0,AF647,1500,c4,af647,AF647_Cell_Intensity_Average,AF647,cell
+R0,AF647,1500,c4,af647,AF647_Cytoplasm_Intensity_Average,AF647,cytoplasm
+R0,AF647,1500,c4,af647,AF647_Nucleus_Intensity_Average,AF647,nucleus
+R0,AF750,1500,c5,af750,AF750_Cell_Intensity_Average,AF750,cell
+R0,AF750,1500,c5,af750,AF750_Cytoplasm_Intensity_Average,AF750,cytoplasm
+R0,AF750,1500,c5,af750,AF750_Nucleus_Intensity_Average,AF750,nucleus
+R1,ColVI,300,c2,colvi,ColVI_Cell_Intensity_Average,ColVI,cell
+R1,ColVI,300,c2,colvi,ColVI_Cytoplasm_Intensity_Average,ColVI,cytoplasm
+R1,ColVI,300,c2,colvi,ColVI_Nucleus_Intensity_Average,ColVI,nucleus
+R1,CD31,1200,c3,cd31,CD31_Cell_Intensity_Average,CD31,cell
+R1,CD31,1200,c3,cd31,CD31_Cytoplasm_Intensity_Average,CD31,cytoplasm
+R1,CD31,1200,c3,cd31,CD31_Nucleus_Intensity_Average,CD31,nucleus
+R1,CD4,1500,c4,cd4,CD4_Cell_Intensity_Average,CD4,cell
+R1,CD4,1500,c4,cd4,CD4_Cytoplasm_Intensity_Average,CD4,cytoplasm
+R1,CD4,1500,c4,cd4,CD4_Nucleus_Intensity_Average,CD4,nucleus
+R1,Ecad,800,c5,ecad,Ecad_Cell_Intensity_Average,Ecad,cell
+R1,Ecad,800,c5,ecad,Ecad_Cytoplasm_Intensity_Average,Ecad,cytoplasm
+R1,Ecad,800,c5,ecad,Ecad_Nucleus_Intensity_Average,Ecad,nucleus
+R2,Desmin,300,c2,desmin,Desmin_Cell_Intensity_Average,Desmin,cell
+R2,Desmin,300,c2,desmin,Desmin_Cytoplasm_Intensity_Average,Desmin,cytoplasm
+R2,Desmin,300,c2,desmin,Desmin_Nucleus_Intensity_Average,Desmin,nucleus
+R2,B7H4,1500,c3,b7h4,B7H4_Cell_Intensity_Average,B7H4,cell
+R2,B7H4,1500,c3,b7h4,B7H4_Cytoplasm_Intensity_Average,B7H4,cytoplasm
+R2,B7H4,1500,c3,b7h4,B7H4_Nucleus_Intensity_Average,B7H4,nucleus
+R2,CD8,1500,c4,cd8,CD8_Cell_Intensity_Average,CD8,cell
+R2,CD8,1500,c4,cd8,CD8_Cytoplasm_Intensity_Average,CD8,cytoplasm
+R2,CD8,1500,c4,cd8,CD8_Nucleus_Intensity_Average,CD8,nucleus
+R2,CD20,1500,c5,cd20,CD20_Cell_Intensity_Average,CD20,cell
+R2,CD20,1500,c5,cd20,CD20_Cytoplasm_Intensity_Average,CD20,cytoplasm
+R2,CD20,1500,c5,cd20,CD20_Nucleus_Intensity_Average,CD20,nucleus
+R3,aSMA,50,c2,asma,aSMA_Cell_Intensity_Average,aSMA,cell
+R3,aSMA,50,c2,asma,aSMA_Cytoplasm_Intensity_Average,aSMA,cytoplasm
+R3,aSMA,50,c2,asma,aSMA_Nucleus_Intensity_Average,aSMA,nucleus
+R3,CD68,1500,c3,cd68,CD68_Cell_Intensity_Average,CD68,cell
+R3,CD68,1500,c3,cd68,CD68_Cytoplasm_Intensity_Average,CD68,cytoplasm
+R3,CD68,1500,c3,cd68,CD68_Nucleus_Intensity_Average,CD68,nucleus
+R3,PD1,1500,c4,pd1,PD1_Cell_Intensity_Average,PD1,cell
+R3,PD1,1500,c4,pd1,PD1_Cytoplasm_Intensity_Average,PD1,cytoplasm
+R3,PD1,1500,c4,pd1,PD1_Nucleus_Intensity_Average,PD1,nucleus
+R3,CD45,1500,c5,cd45,CD45_Cell_Intensity_Average,CD45,cell
+R3,CD45,1500,c5,cd45,CD45_Cytoplasm_Intensity_Average,CD45,cytoplasm
+R3,CD45,1500,c5,cd45,CD45_Nucleus_Intensity_Average,CD45,nucleus
+R4,Vimentin,150,c2,vimentin,Vimentin_Cell_Intensity_Average,Vimentin,cell
+R4,Vimentin,150,c2,vimentin,Vimentin_Cytoplasm_Intensity_Average,Vimentin,cytoplasm
+R4,Vimentin,150,c2,vimentin,Vimentin_Nucleus_Intensity_Average,Vimentin,nucleus
+R4,AXL,1500,c3,axl,AXL_Cell_Intensity_Average,AXL,cell
+R4,AXL,1500,c3,axl,AXL_Cytoplasm_Intensity_Average,AXL,cytoplasm
+R4,AXL,1500,c3,axl,AXL_Nucleus_Intensity_Average,AXL,nucleus
+R4,PDL1,1500,c4,pdl1,PDL1_Cell_Intensity_Average,PDL1,cell
+R4,PDL1,1500,c4,pdl1,PDL1_Cytoplasm_Intensity_Average,PDL1,cytoplasm
+R4,PDL1,1500,c4,pdl1,PDL1_Nucleus_Intensity_Average,PDL1,nucleus
+R4,FOXP3,1500,c5,foxp3,FOXP3_Cell_Intensity_Average,FOXP3,cell
+R4,FOXP3,1500,c5,foxp3,FOXP3_Cytoplasm_Intensity_Average,FOXP3,cytoplasm
+R4,FOXP3,1500,c5,foxp3,FOXP3_Nucleus_Intensity_Average,FOXP3,nucleus
+R5,r5c2,20,c2,r5c2,r5c2_Cell_Intensity_Average,r5c2,cell
+R5,r5c2,20,c2,r5c2,r5c2_Cytoplasm_Intensity_Average,r5c2,cytoplasm
+R5,r5c2,20,c2,r5c2,r5c2_Nucleus_Intensity_Average,r5c2,nucleus
+R5,CA9,1500,c3,ca9,CA9_Cell_Intensity_Average,CA9,cell
+R5,CA9,1500,c3,ca9,CA9_Cytoplasm_Intensity_Average,CA9,cytoplasm
+R5,CA9,1500,c3,ca9,CA9_Nucleus_Intensity_Average,CA9,nucleus
+R5,CD163,1500,c4,cd163,CD163_Cell_Intensity_Average,CD163,cell
+R5,CD163,1500,c4,cd163,CD163_Cytoplasm_Intensity_Average,CD163,cytoplasm
+R5,CD163,1500,c4,cd163,CD163_Nucleus_Intensity_Average,CD163,nucleus
+R5,Ki67,1000,c5,ki67,Ki67_Cell_Intensity_Average,Ki67,cell
+R5,Ki67,1000,c5,ki67,Ki67_Cytoplasm_Intensity_Average,Ki67,cytoplasm
+R5,Ki67,1000,c5,ki67,Ki67_Nucleus_Intensity_Average,Ki67,nucleus
+R6,CKs,200,c2,cks,CKs_Cell_Intensity_Average,CKs,cell
+R6,CKs,200,c2,cks,CKs_Cytoplasm_Intensity_Average,CKs,cytoplasm
+R6,CKs,200,c2,cks,CKs_Nucleus_Intensity_Average,CKs,nucleus
+R6,Fibronectin,1500,c3,fibronectin,Fibronectin_Cell_Intensity_Average,Fibronectin,cell
+R6,Fibronectin,1500,c3,fibronectin,Fibronectin_Cytoplasm_Intensity_Average,Fibronectin,cytoplasm
+R6,Fibronectin,1500,c3,fibronectin,Fibronectin_Nucleus_Intensity_Average,Fibronectin,nucleus
+R6,CD44,1200,c4,cd44,CD44_Cell_Intensity_Average,CD44,cell
+R6,CD44,1200,c4,cd44,CD44_Cytoplasm_Intensity_Average,CD44,cytoplasm
+R6,CD44,1200,c4,cd44,CD44_Nucleus_Intensity_Average,CD44,nucleus
+R6,HLA,500,c5,hla,HLA_Cell_Intensity_Average,HLA,cell
+R6,HLA,500,c5,hla,HLA_Cytoplasm_Intensity_Average,HLA,cytoplasm
+R6,HLA,500,c5,hla,HLA_Nucleus_Intensity_Average,HLA,nucleus
+R7,r7c2,20,c2,r7c2,r7c2_Cell_Intensity_Average,r7c2,cell
+R7,r7c2,20,c2,r7c2,r7c2_Cytoplasm_Intensity_Average,r7c2,cytoplasm
+R7,r7c2,20,c2,r7c2,r7c2_Nucleus_Intensity_Average,r7c2,nucleus
+R7,PDGFR,1500,c3,pdgfr,PDGFR_Cell_Intensity_Average,PDGFR,cell
+R7,PDGFR,1500,c3,pdgfr,PDGFR_Cytoplasm_Intensity_Average,PDGFR,cytoplasm
+R7,PDGFR,1500,c3,pdgfr,PDGFR_Nucleus_Intensity_Average,PDGFR,nucleus
+R7,MMP9,1500,c4,mmp9,MMP9_Cell_Intensity_Average,MMP9,cell
+R7,MMP9,1500,c4,mmp9,MMP9_Cytoplasm_Intensity_Average,MMP9,cytoplasm
+R7,MMP9,1500,c4,mmp9,MMP9_Nucleus_Intensity_Average,MMP9,nucleus
+R7,GATA3,1500,c5,gata3,GATA3_Cell_Intensity_Average,GATA3,cell
+R7,GATA3,1500,c5,gata3,GATA3_Cytoplasm_Intensity_Average,GATA3,cytoplasm
+R7,GATA3,1500,c5,gata3,GATA3_Nucleus_Intensity_Average,GATA3,nucleus
+R8,r8c2,25,c2,r8c2,r8c2_Cell_Intensity_Average,r8c2,cell
+R8,r8c2,25,c2,r8c2,r8c2_Cytoplasm_Intensity_Average,r8c2,cytoplasm
+R8,r8c2,25,c2,r8c2,r8c2_Nucleus_Intensity_Average,r8c2,nucleus
+R8,CD11c,1500,c3,cd11c,CD11c_Cell_Intensity_Average,CD11c,cell
+R8,CD11c,1500,c3,cd11c,CD11c_Cytoplasm_Intensity_Average,CD11c,cytoplasm
+R8,CD11c,1500,c3,cd11c,CD11c_Nucleus_Intensity_Average,CD11c,nucleus
+R8,Sting,1000,c4,sting,Sting_Cell_Intensity_Average,Sting,cell
+R8,Sting,1000,c4,sting,Sting_Cytoplasm_Intensity_Average,Sting,cytoplasm
+R8,Sting,1000,c4,sting,Sting_Nucleus_Intensity_Average,Sting,nucleus
+R8,CD11b,1500,c5,cd11b,CD11b_Cell_Intensity_Average,CD11b,cell
+R8,CD11b,1500,c5,cd11b,CD11b_Cytoplasm_Intensity_Average,CD11b,cytoplasm
+R8,CD11b,1500,c5,cd11b,CD11b_Nucleus_Intensity_Average,CD11b,nucleus
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/not_intensities.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/not_intensities.csv
new file mode 100644
index 0000000000000000000000000000000000000000..a077677c4caa31d810fb588009576304825a6079
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/not_intensities.csv
@@ -0,0 +1,12 @@
+Marker
+Cell_Size
+Nuc_X
+Nuc_Y_Inv
+ROI_index
+Nucleus_Size
+Nucleus_Roundness
+Sample_ID
+Round
+Exp
+Channel
+Target
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/round_color_data.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/round_color_data.csv
new file mode 100644
index 0000000000000000000000000000000000000000..b2a7d5f6a6a53ff6f91726b06a8d441ffb6d482f
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/round_color_data.csv
@@ -0,0 +1,10 @@
+rgb,hex,Round
+"(0.28685356234627135, 0.13009829239513535, 0.23110332132624437)",#49213b,R0
+"(0.36541462435986094, 0.2025447048359916, 0.37693310021636883)",#5d3460,R1
+"(0.40867533458903105, 0.2940761173840091, 0.5166711878800253)",#684b84,R2
+"(0.42890613750051265, 0.4082290173220481, 0.6335348887063806)",#6d68a2,R3
+"(0.4444462906865238, 0.5264664993764805, 0.7056321892616532)",#7186b4,R4
+"(0.47707206309601013, 0.6427061780374552, 0.7418477948908153)",#7aa4bd,R5
+"(0.5414454866716836, 0.7466759172596551, 0.7572905778378964)",#8abec1,R6
+"(0.6414710091647722, 0.8321551072276492, 0.7746773027952071)",#a4d4c6,R7
+"(0.7684256891219349, 0.8992667116749021, 0.8171383269422353)",#c4e5d0,R8
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/sample_color_data.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/sample_color_data.csv
new file mode 100644
index 0000000000000000000000000000000000000000..4606e80d25e013c6fbbb2aa9ef230d35d7f0e436
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/sample_color_data.csv
@@ -0,0 +1,5 @@
+rgb,hex,Sample_ID
+"(0.9677975592919913, 0.44127456009157356, 0.5358103155058701)",#f77189,DD3S1.csv
+"(0.5920891529639701, 0.6418467016378244, 0.1935069134991043)",#97a431,DD3S2.csv
+"(0.21044753832183283, 0.6773105080456748, 0.6433941168468681)",#36ada4,DD3S3.csv
+"(0.5019607843137255, 0.5019607843137255, 0.5019607843137255)",#808080,TMA.csv
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_metadata/short_to_full_column_names.csv b/wetransfer_data-zip_2024-05-17_1431/test_metadata/short_to_full_column_names.csv
new file mode 100644
index 0000000000000000000000000000000000000000..c3a56032e25138d0214afe3facbca21ec86ca8ca
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_metadata/short_to_full_column_names.csv
@@ -0,0 +1,109 @@
+short_name,full_name
+AF488_Cell,AF488_Cell_Intensity_Average
+AF488_Cytoplasm,AF488_Cytoplasm_Intensity_Average
+AF488_Nucleus,AF488_Nucleus_Intensity_Average
+AF555_Cell,AF555_Cell_Intensity_Average
+AF555_Cytoplasm,AF555_Cytoplasm_Intensity_Average
+AF555_Nucleus,AF555_Nucleus_Intensity_Average
+AF647_Cell,AF647_Cell_Intensity_Average
+AF647_Cytoplasm,AF647_Cytoplasm_Intensity_Average
+AF647_Nucleus,AF647_Nucleus_Intensity_Average
+AF750_Cell,AF750_Cell_Intensity_Average
+AF750_Cytoplasm,AF750_Cytoplasm_Intensity_Average
+AF750_Nucleus,AF750_Nucleus_Intensity_Average
+aSMA_Cell,aSMA_Cell_Intensity_Average
+aSMA_Cytoplasm,aSMA_Cytoplasm_Intensity_Average
+aSMA_Nucleus,aSMA_Nucleus_Intensity_Average
+AXL_Cell,AXL_Cell_Intensity_Average
+AXL_Cytoplasm,AXL_Cytoplasm_Intensity_Average
+AXL_Nucleus,AXL_Nucleus_Intensity_Average
+B7H4_Cell,B7H4_Cell_Intensity_Average
+B7H4_Cytoplasm,B7H4_Cytoplasm_Intensity_Average
+B7H4_Nucleus,B7H4_Nucleus_Intensity_Average
+CA9_Cell,CA9_Cell_Intensity_Average
+CA9_Cytoplasm,CA9_Cytoplasm_Intensity_Average
+CA9_Nucleus,CA9_Nucleus_Intensity_Average
+CD4_Cell,CD4_Cell_Intensity_Average
+CD4_Cytoplasm,CD4_Cytoplasm_Intensity_Average
+CD4_Nucleus,CD4_Nucleus_Intensity_Average
+CD8_Cell,CD8_Cell_Intensity_Average
+CD8_Cytoplasm,CD8_Cytoplasm_Intensity_Average
+CD8_Nucleus,CD8_Nucleus_Intensity_Average
+CD11b_Cell,CD11b_Cell_Intensity_Average
+CD11b_Cytoplasm,CD11b_Cytoplasm_Intensity_Average
+CD11b_Nucleus,CD11b_Nucleus_Intensity_Average
+CD11c_Cell,CD11c_Cell_Intensity_Average
+CD11c_Cytoplasm,CD11c_Cytoplasm_Intensity_Average
+CD11c_Nucleus,CD11c_Nucleus_Intensity_Average
+CD20_Cell,CD20_Cell_Intensity_Average
+CD20_Cytoplasm,CD20_Cytoplasm_Intensity_Average
+CD20_Nucleus,CD20_Nucleus_Intensity_Average
+CD31_Cell,CD31_Cell_Intensity_Average
+CD31_Cytoplasm,CD31_Cytoplasm_Intensity_Average
+CD31_Nucleus,CD31_Nucleus_Intensity_Average
+CD44_Cell,CD44_Cell_Intensity_Average
+CD44_Cytoplasm,CD44_Cytoplasm_Intensity_Average
+CD44_Nucleus,CD44_Nucleus_Intensity_Average
+CD45_Cell,CD45_Cell_Intensity_Average
+CD45_Cytoplasm,CD45_Cytoplasm_Intensity_Average
+CD45_Nucleus,CD45_Nucleus_Intensity_Average
+CD68_Cell,CD68_Cell_Intensity_Average
+CD68_Cytoplasm,CD68_Cytoplasm_Intensity_Average
+CD68_Nucleus,CD68_Nucleus_Intensity_Average
+CD163_Cell,CD163_Cell_Intensity_Average
+CD163_Cytoplasm,CD163_Cytoplasm_Intensity_Average
+CD163_Nucleus,CD163_Nucleus_Intensity_Average
+CKs_Cell,CKs_Cell_Intensity_Average
+CKs_Cytoplasm,CKs_Cytoplasm_Intensity_Average
+CKs_Nucleus,CKs_Nucleus_Intensity_Average
+ColVI_Cell,ColVI_Cell_Intensity_Average
+ColVI_Cytoplasm,ColVI_Cytoplasm_Intensity_Average
+ColVI_Nucleus,ColVI_Nucleus_Intensity_Average
+Desmin_Cell,Desmin_Cell_Intensity_Average
+Desmin_Cytoplasm,Desmin_Cytoplasm_Intensity_Average
+Desmin_Nucleus,Desmin_Nucleus_Intensity_Average
+Ecad_Cell,Ecad_Cell_Intensity_Average
+Ecad_Cytoplasm,Ecad_Cytoplasm_Intensity_Average
+Ecad_Nucleus,Ecad_Nucleus_Intensity_Average
+Fibronectin_Cell,Fibronectin_Cell_Intensity_Average
+Fibronectin_Cytoplasm,Fibronectin_Cytoplasm_Intensity_Average
+Fibronectin_Nucleus,Fibronectin_Nucleus_Intensity_Average
+FOXP3_Cell,FOXP3_Cell_Intensity_Average
+FOXP3_Cytoplasm,FOXP3_Cytoplasm_Intensity_Average
+FOXP3_Nucleus,FOXP3_Nucleus_Intensity_Average
+GATA3_Cell,GATA3_Cell_Intensity_Average
+GATA3_Cytoplasm,GATA3_Cytoplasm_Intensity_Average
+GATA3_Nucleus,GATA3_Nucleus_Intensity_Average
+HLA_Cell,HLA_Cell_Intensity_Average
+HLA_Cytoplasm,HLA_Cytoplasm_Intensity_Average
+HLA_Nucleus,HLA_Nucleus_Intensity_Average
+Ki67_Cell,Ki67_Cell_Intensity_Average
+Ki67_Cytoplasm,Ki67_Cytoplasm_Intensity_Average
+Ki67_Nucleus,Ki67_Nucleus_Intensity_Average
+MMP9_Cell,MMP9_Cell_Intensity_Average
+MMP9_Cytoplasm,MMP9_Cytoplasm_Intensity_Average
+MMP9_Nucleus,MMP9_Nucleus_Intensity_Average
+PD1_Cell,PD1_Cell_Intensity_Average
+PD1_Cytoplasm,PD1_Cytoplasm_Intensity_Average
+PD1_Nucleus,PD1_Nucleus_Intensity_Average
+PDGFR_Cell,PDGFR_Cell_Intensity_Average
+PDGFR_Cytoplasm,PDGFR_Cytoplasm_Intensity_Average
+PDGFR_Nucleus,PDGFR_Nucleus_Intensity_Average
+PDL1_Cell,PDL1_Cell_Intensity_Average
+PDL1_Cytoplasm,PDL1_Cytoplasm_Intensity_Average
+PDL1_Nucleus,PDL1_Nucleus_Intensity_Average
+r5c2_Cell,r5c2_Cell_Intensity_Average
+r5c2_Cytoplasm,r5c2_Cytoplasm_Intensity_Average
+r5c2_Nucleus,r5c2_Nucleus_Intensity_Average
+r7c2_Cell,r7c2_Cell_Intensity_Average
+r7c2_Cytoplasm,r7c2_Cytoplasm_Intensity_Average
+r7c2_Nucleus,r7c2_Nucleus_Intensity_Average
+r8c2_Cell,r8c2_Cell_Intensity_Average
+r8c2_Cytoplasm,r8c2_Cytoplasm_Intensity_Average
+r8c2_Nucleus,r8c2_Nucleus_Intensity_Average
+Sting_Cell,Sting_Cell_Intensity_Average
+Sting_Cytoplasm,Sting_Cytoplasm_Intensity_Average
+Sting_Nucleus,Sting_Nucleus_Intensity_Average
+Vimentin_Cell,Vimentin_Cell_Intensity_Average
+Vimentin_Cytoplasm,Vimentin_Cytoplasm_Intensity_Average
+Vimentin_Nucleus,Vimentin_Nucleus_Intensity_Average
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_mt/DD3S1_mt.csv b/wetransfer_data-zip_2024-05-17_1431/test_mt/DD3S1_mt.csv
new file mode 100644
index 0000000000000000000000000000000000000000..58de03153d45f4f7b73ff63fda6bfed1d3372038
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_mt/DD3S1_mt.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c5e5d712093b48a1b53b42e9b21a7c5b0a98946f70cd4729a54511329af6b8c9
+size 42782100
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_mt/DD3S2_mt.csv b/wetransfer_data-zip_2024-05-17_1431/test_mt/DD3S2_mt.csv
new file mode 100644
index 0000000000000000000000000000000000000000..69e72af2e18c3debc8e8d4b43d5d16ae3939766d
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_mt/DD3S2_mt.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6430f2839ce44437a4016c73fb532e8bc704cf9b92b514c0ec771c8a0fee74cb
+size 38749776
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_mt/DD3S3_mt.csv b/wetransfer_data-zip_2024-05-17_1431/test_mt/DD3S3_mt.csv
new file mode 100644
index 0000000000000000000000000000000000000000..125277ab14c98a20e7cbe83e54f1d59078124060
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_mt/DD3S3_mt.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:797b5ec539dc0f32407330fd8aedfac86135664ce8387e17ba71b4da8ace1859
+size 72513073
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_mt/TMA_mt.csv b/wetransfer_data-zip_2024-05-17_1431/test_mt/TMA_mt.csv
new file mode 100644
index 0000000000000000000000000000000000000000..038fb489a3d303d0661f4fba45aa97c21bcc8c61
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_mt/TMA_mt.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:598bb6d17e4b2a7c1de59b43aa0e289f406ba0d409f90b1dbade6cc46ebbaffe
+size 58806993
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_mt/all_Samples_Set_A.csv b/wetransfer_data-zip_2024-05-17_1431/test_mt/all_Samples_Set_A.csv
new file mode 100644
index 0000000000000000000000000000000000000000..eb75ac2e96530c1bb2a766ebb72fea53d50159d3
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_mt/all_Samples_Set_A.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a47760a85a3142b7b31f8fa8dbce6a0b0348b5315361c19254e56ac60a828261
+size 212848897
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_mt/images/set_a.png b/wetransfer_data-zip_2024-05-17_1431/test_mt/images/set_a.png
new file mode 100644
index 0000000000000000000000000000000000000000..7148eb98518987b3d0651199f358f507e73f5dca
Binary files /dev/null and b/wetransfer_data-zip_2024-05-17_1431/test_mt/images/set_a.png differ
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S1_qc_eda.csv b/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S1_qc_eda.csv
new file mode 100644
index 0000000000000000000000000000000000000000..999383ff6478c2d9f4ead9aacefde700a4e88d46
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S1_qc_eda.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6cf58fd2ca16b1bc4ede574bd31f0a461c8643095220f0daf7fbf81341becf26
+size 170657110
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S2_qc_eda.csv b/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S2_qc_eda.csv
new file mode 100644
index 0000000000000000000000000000000000000000..a7b628570bc4132d53242cd218a6b0f312eabaa2
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S2_qc_eda.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:62b79e474dbd81c5f28bd0a2ee6bd34bd2cfe9f1a12bf81f83aa6e323271be86
+size 177226319
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S3_qc_eda.csv b/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S3_qc_eda.csv
new file mode 100644
index 0000000000000000000000000000000000000000..6ebaad60db6b9479fb6403543165e81cae3f2d93
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/DD3S3_qc_eda.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d25d0d1ee65c94045719bb80e01b4d844181a54528a591397e5eef690915c4e5
+size 269950821
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/TMA_qc_eda.csv b/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/TMA_qc_eda.csv
new file mode 100644
index 0000000000000000000000000000000000000000..62f1bb0b4e96b1f1eff404088869a4aec83ce07f
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/TMA_qc_eda.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d54309f2db608785a123dac6037f516f9ac7cef5b5d3096e55a542fa380499ae
+size 224289040
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/AF555_Cell_Intensity_Average_Distribution.png b/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/AF555_Cell_Intensity_Average_Distribution.png
new file mode 100644
index 0000000000000000000000000000000000000000..d40acbd65361d6a2a6db1c223bb1c1a137d9b522
Binary files /dev/null and b/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/AF555_Cell_Intensity_Average_Distribution.png differ
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/CKs_Cytoplasm_Intensity_Average_Distribution.png b/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/CKs_Cytoplasm_Intensity_Average_Distribution.png
new file mode 100644
index 0000000000000000000000000000000000000000..b0fd10220633ef0f6c3501bf5b02ed40d861a474
Binary files /dev/null and b/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/CKs_Cytoplasm_Intensity_Average_Distribution.png differ
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/Nucleus_Size_Distribution.png b/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/Nucleus_Size_Distribution.png
new file mode 100644
index 0000000000000000000000000000000000000000..113e94f370cd470ac02105d33255daaf3bdb8e19
Binary files /dev/null and b/wetransfer_data-zip_2024-05-17_1431/test_qc_eda/images/Nucleus_Size_Distribution.png differ
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S1_zscore.csv b/wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S1_zscore.csv
new file mode 100644
index 0000000000000000000000000000000000000000..bcbfb038ab79dc8f9631dbf18bfdd399fd98ae21
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S1_zscore.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1a31f0d1be50776d5e7b07e6c0ea54a08b19a8e50313c190077af8b27f97b68f
+size 43760094
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S2_zscore.csv b/wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S2_zscore.csv
new file mode 100644
index 0000000000000000000000000000000000000000..b9e60d9351d6046d0f0f1cced217d07fa926b72d
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S2_zscore.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a8fee41c8d4a004e08c2c6d4042eed85a08bc20f606a853be05455f08f9a151b
+size 39648680
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S3_zscore.csv b/wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S3_zscore.csv
new file mode 100644
index 0000000000000000000000000000000000000000..a9a8b61c33db7710e5f37c28db7c34cdb142c03f
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_zscore/DD3S3_zscore.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:37296b75e566e74c97fdba241cdb04323f7d0c381f42004920c56b45b91f4d36
+size 74123964
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_zscore/TMA_zscore.csv b/wetransfer_data-zip_2024-05-17_1431/test_zscore/TMA_zscore.csv
new file mode 100644
index 0000000000000000000000000000000000000000..d7e3d9b71ede3211fcf86729bbd378437d2de0b2
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_zscore/TMA_zscore.csv
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e1e373f7284f5dd328cc4f8a12ac880f142bfd23bfece765665836416ad9e50d
+size 60201773
diff --git a/wetransfer_data-zip_2024-05-17_1431/test_zscore/temp-plot.html b/wetransfer_data-zip_2024-05-17_1431/test_zscore/temp-plot.html
new file mode 100644
index 0000000000000000000000000000000000000000..67d426c974a19dc64af8a80358136b95afeb3924
--- /dev/null
+++ b/wetransfer_data-zip_2024-05-17_1431/test_zscore/temp-plot.html
@@ -0,0 +1,71 @@
+
+
+
+
+
+
\ No newline at end of file