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", + "
\n", + "
\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/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": 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": "iVBORw0KGgoAAAANSUhEUgAAA6oAAAIhCAYAAABHfEexAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC5D0lEQVR4nOzdd1QUVxsG8GdZ2KWvWGiKYANF7FjQKCoC9hZbUBQ1xESNlRRjEjWxF6LRaDQxYO+iUaNir6DEaBR7jIgFxIKgKG253x98TFzqgmvY6PM7Z8/ZnXnnzp3Z2dl99965IxNCCBARERERERHpCYPSrgARERERERHRy5ioEhERERERkV5hokpERERERER6hYkqERERERER6RUmqkRERERERKRXmKgSERERERGRXmGiSkRERERERHqFiSoRERERERHpFSaqREREREREpFdKPVENDQ2FTCaTHsbGxrC1tUWbNm0wY8YMJCQk5Flm8uTJkMlkxVrP8+fPMXnyZBw+fLhYy+W3LicnJ3Tu3LlY5RRl7dq1mD9/fr7zZDIZJk+erNP16dqBAwfg7u4OMzMzyGQybNu2rchlLly4AJlMBiMjI8TFxeUb07p1a43j4+VHdHQ0ACAmJqbAmPXr12uUl/N+5n4YGxvnWbeTk1O+sR9++GHxdxCA5ORkTJs2De7u7rC0tIRSqYSTkxOGDBmCP/74o9jl5Wx3aGioNC3n8xQTE6N1OYcPH4ZMJsPmzZuLXQcAmD59ulbv97+ldevWaN26tfS6pJ/9ktLmuKZXl3Pc/lvvq75zcnJCQEBAaVdDp4rzWc45tz98+LDE63JzcythTYsnv3N3adHF+Vub3yg52zx37txXWpe+KOn3ysKFC1GzZk0olUpUqVIFU6ZMQUZGhlbLZmRkYMqUKXBycoJSqUTNmjWxcOHCPHHF+Z1TmorzOdB22wty+vRp+Pr6wsLCAubm5mjTpg1OnDiRJy4gICDffVezZs3ibJpeu3fvHiZPnoxz587lmZdfzpP7PPxvMyy1NecSEhKCmjVrIiMjAwkJCTh+/DhmzZqFuXPnYsOGDWjXrp0U+/7776N9+/bFKv/58+eYMmUKABRrh5dkXSWxdu1aREdHY8yYMXnmRUREoFKlSq+9DiUlhECfPn3g7OyMX3/9FWZmZnBxcSlyuZ9//hkAkJmZiZUrV+Kzzz7LN65q1apYs2ZNnunVqlXTeP3xxx/Dz89PY1qNGjXyLXPPnj1QqVTSawOD/P+zadGiRZ4vVhsbm3xjC3Pjxg34+PggISEBH374IaZMmQJzc3PExMRg48aNaNSoEZ48eaJRp/+K6dOno1evXujevXtpVwUAsHjxYo3XJf3sl5S2xzURFa60P8uvi52dHSIiIvJ8h5UGfTt//1eU5FicNm0avvrqK3z++efw8fFBVFQUvvzyS9y9exfLli0rcvnhw4dj1apV+Pbbb9G4cWPs3bsXo0ePxtOnT/HFF1/kidf2d85/QXG3/WVRUVFo1aoVmjRpglWrVkEIgdmzZ8PLywuHDh2Ch4eHRryJiQkOHjyYZ9qb4t69e1LSX79+fY15/1bOUxx6k6i6ubnB3d1dev3uu+9i7NixeOedd9CzZ09cv35dShAqVar02hO358+fw9TU9F9ZV1GaNWtWqusvyr179/D48WP06NEDXl5eWi2TlpaGNWvWoF69enj48CF++eWXAn/Qm5iYaLUPKleurPW+atSoEcqXL19kXJkyZV55/6vVavTo0QMPHz5ERESExr/2np6eGDRoEHbv3g0jI6NXWg9lc3V1LbV1F+e4fp1yzl9E/2Wl+Vl+HdRqNTIzM6FUKvX+e/2/KiMjAzKZDIaGevPzFgDw6NEjTJ06FYGBgZg+fTqA7AQ3IyMDX375JcaMGVPo8X7x4kUsX74c06ZNwyeffCItn1Puhx9+iLJly2oso+3vHH1Xkm1/2VdffYUyZcpgz5490vdiu3btULVqVQQFBeVpWTUwMHhrP5/6kPPkptd/r1SuXBnz5s3D06dPsXTpUml6fk3TBw8eROvWrVGuXDmYmJigcuXKePfdd/H8+XPExMSgQoUKAIApU6ZITfk53aRyyvvjjz/Qq1cvWFlZSf90FtbNOCwsDHXr1oWxsTGqVq2K77//XmN+Qd0wc3dZa926NXbt2oVbt25pdDXIkV+3mujoaHTr1g1WVlYwNjZG/fr1sWLFinzXs27dOkycOBH29vawtLREu3btcPXq1YJ3/EuOHz8OLy8vWFhYwNTUFM2bN8euXbuk+ZMnT5YO6s8++wwymQxOTk5Flrtt2zY8evQI77//PgYNGoRr167h+PHjWtXpv2bbtm24cOECJkyYUGDXsg4dOmgkFtevX4efnx+sra2hVCpRq1Yt/PDDD/9WlaXj/uLFi3jvvfegUqlgY2ODIUOGICkpSYqTyWRISUnBihUrpOP25X+X4+PjMWzYMFSqVAkKhULq6pSZmSnFvNwlLDg4GFWqVIG5uTk8PDwQGRmpUa+///4b/fr1g729PZRKJWxsbODl5aXRheXlbiqFffaPHTsmfT5yW7lyJWQyGaKiooq134o6rrt37w5HR0dkZWXlWbZp06Zo2LCh9FoIgcWLF6N+/fowMTGBlZUVevXqhb///ltjuZwui0ePHkXz5s1hamqKIUOGAAA2bNgAHx8f2NnZwcTEBLVq1cLnn3+OlJSUPOv/6aef4OzsDKVSCVdXV6xduxYBAQF5Ps/p6emYOnWq1H2tQoUKGDx4MB48eKDVPjp16hS6dOmCcuXKwdjYGNWqVcvTk6So805BCuqilHs7co65OXPmYNasWXBycoKJiQlat26Na9euISMjA59//jns7e2hUqnQo0ePPJeh5FwCsmfPHjRs2BAmJiaoWbMmfvnll0LrmJGRAWtra/j7++eZ9+TJE5iYmGDcuHEAgNTUVIwfPx7169eHSqVC2bJl4eHhge3btxe5L7T9/smxf/9+eHl5wdLSEqampmjRogUOHDigEfPgwQN88MEHcHBwkN77Fi1aYP/+/QXW4+LFi5DJZNi0aZM07cyZM5DJZKhdu7ZGbNeuXdGoUSPptbaf5Zfdv3+/0HNWUaKiotCyZUuYmpqiatWqmDlzZp7Pa2xsLAYMGKBxfp43b55GXM4xNnv2bEydOhVVqlSBUqnEoUOH8u3yWNDlK7nfw19//RUeHh4wNTWFhYUFvL29ERERoVE/XZy/Hzx4gOHDh8PV1RXm5uawtrZG27ZtcezYMa33ZX6ysrIwbdo0VK5cGcbGxnB3d89znP31118YPHgwatSoAVNTU1SsWBFdunTBhQsXNOJyjuVVq1Zh/PjxqFixIpRKJf766y88f/4cQUFBqFKlCoyNjVG2bFm4u7vne75/mTbbre2x+LI9e/YgNTUVgwcP1pg+ePBgCCGK7H69bds2CCHyXf7FixfYs2dPocsXh7bfGwEBATA3N8dff/2Fjh07wtzcHA4ODhg/fjzS0tI0Yu/du4c+ffrAwsICKpUKffv2RXx8vFb1edVtP3HiBFq3bq3xG8vCwgKtWrXCyZMndXqJTnJyMgIDA1GuXDmYm5ujffv2uHbtWp7f8fl9twL55xw//PADWrVqBWtra5iZmaFOnTqYPXt2ni7jOb8FCjuHHT58GI0bNwaQvf9yjt2cuml7aaW2vwMKy820pdeJKgB07NgRcrkcR48eLTAmJiYGnTp1gkKhwC+//II9e/Zg5syZMDMzQ3p6Ouzs7KQDeejQoYiIiEBERAS++uorjXJ69uyJ6tWrY9OmTfjxxx8Lrde5c+cwZswYjB07FmFhYWjevDlGjx5dousvFi9ejBYtWsDW1laqW+4vnpddvXoVzZs3x8WLF/H9999j69atcHV1RUBAAGbPnp0n/osvvsCtW7fw888/Y9myZbh+/Tq6dOkCtVpdaL2OHDmCtm3bIikpCcuXL8e6detgYWGBLl26YMOGDQCyuwls3boVQHbX24iICISFhRW5zcuXL4dSqUT//v0xZMgQyGQyLF++vMD4zMxMjUd+P/RnzpwJhUIBU1NTvPPOO/j1118LLK9OnTqQy+WwsbHBwIEDERsbm2/c0aNHYWFhASMjI7i6umLevHlF7rfcwsPDAUDrrlWXLl1C48aNER0djXnz5mHnzp3o1KkTRo0aJXU1+re8++67cHZ2xpYtW/D5559j7dq1GDt2rDQ/IiICJiYm6Nixo3Tc5nTXi4+PR5MmTbB37158/fXX2L17N4YOHYoZM2YgMDAwz7p++OEH7Nu3D/Pnz8eaNWuQkpKCjh07avyw6tixI86cOYPZs2dj3759WLJkCRo0aIAnT57kW//CPvstW7ZEgwYN8v0DYNGiRWjcuLF0QtdWUcf1kCFDEBsbm6db0ZUrV3D69GmNL+Jhw4ZhzJgxaNeuHbZt24bFixfj4sWLaN68Oe7fv6+xfFxcHAYMGAA/Pz/89ttvGD58OIDsPzw6duyI5cuXY8+ePRgzZgw2btyILl26aCy/bNkyfPDBB6hbty62bt2KL7/8ElOmTMmTzGRlZaFbt26YOXMm/Pz8sGvXLsycORP79u1D69at8eLFi0L3z969e9GyZUvExsYiODgYu3fvxpdffqmxPdqcd3Tlhx9+wIkTJ/DDDz/g559/xpUrV9ClSxcMHToUDx48wC+//ILZs2dj//79eP/99/Ms/+eff2L8+PEYO3Ystm/fjrp162Lo0KGFfl8ZGRlhwIAB2LJlC5KTkzXmrVu3TuPHbFpaGh4/foygoCBs27YN69atk3oZrVy5Umf7YfXq1fDx8YGlpSVWrFiBjRs3omzZsvD19dVIIvz9/bFt2zZ8/fXXCA8Px88//4x27drh0aNHBZZdu3Zt2NnZaSSz+/fvh4mJCS5duoR79+4ByD7HHzlyROMyn5dp+z1e1DmrMPHx8ejfvz8GDBiAX3/9FR06dMCECROwevVqKebBgwdo3rw5wsPD8e233+LXX39Fu3btEBQUhJEjR+Yp8/vvv8fBgwcxd+5c7N69u8Br3V7+7o+IiMDBgwdRsWJF2NraSq1Fa9euRbdu3WBpaYl169Zh+fLlSExMROvWrfP9o/dVzt+PHz8GAEyaNAm7du1CSEgIqlatitatW7/SdeGLFi3Cnj17MH/+fKxevRoGBgbo0KGDxm+ee/fuoVy5cpg5cyb27NmDH374AYaGhmjatGm+f7JPmDABsbGx+PHHH7Fjxw5YW1tj3LhxWLJkCUaNGoU9e/Zg1apV6N27d6HHqrbbre2x+LKcMTXq1KmjMd3Ozg7ly5eX5he2fIUKFWBra6sxvW7duhrlv0zb3zm5afu9AWT/8da1a1d4eXlh+/btGDJkCL777jvMmjVLinnx4gXatWuH8PBwzJgxA5s2bYKtrS369u2rVX1Ksu0vS09Ph1KpzDM9Z1ruP0BevHgBW1tbyOVyVKpUCSNHjpSOi8IIIdC9e3fpj5OwsDA0a9YMHTp0KHLZwty4cQN+fn5YtWoVdu7ciaFDh2LOnDkYNmxYntiizmENGzZESEgIAODLL7+Ujt38vt8Kou3vgKJyM62JUhYSEiIAiKioqAJjbGxsRK1ataTXkyZNEi9XffPmzQKAOHfuXIFlPHjwQAAQkyZNyjMvp7yvv/66wHkvc3R0FDKZLM/6vL29haWlpUhJSdHYtps3b2rEHTp0SAAQhw4dkqZ16tRJODo65lv33PXu16+fUCqVIjY2ViOuQ4cOwtTUVDx58kRjPR07dtSI27hxowAgIiIi8l1fjmbNmglra2vx9OlTaVpmZqZwc3MTlSpVEllZWUIIIW7evCkAiDlz5hRaXo6YmBhhYGAg+vXrJ03z9PQUZmZmIjk5WSPW09NTAMjz6N+/vxRz7949ERgYKDZu3CiOHTsm1qxZI5o1ayYAiJ9++kmjvJUrV4pp06aJ3377TRw8eFDMnDlTlC1bVtjY2Ig7d+5oxA4fPlz88ssv4siRI2Lbtm2if//+AoAYMGCAVtuZo3379gKASE1N1Sre19dXVKpUSSQlJWlMHzlypDA2NhaPHz8WQvyz30NCQqSYgo65wuQcJ5s2bZKm5Rz3s2fP1ogdPny4MDY2lt57IYQwMzMTgwYNylPusGHDhLm5ubh165bG9Llz5woA4uLFixrbUadOHZGZmSnFnT59WgAQ69atE0II8fDhQwFAzJ8/v9Dt8fT0FJ6entLrwj77Ofvr7Nmzeda7YsWKQteTmzbHdUZGhrCxsRF+fn4ay3766adCoVCIhw8fCiGEiIiIEADEvHnzNOJu374tTExMxKeffqqxDgDiwIEDhdYvKytLZGRkiCNHjggA4s8//xRCCKFWq4Wtra1o2rSpRvytW7eEkZGRxnlp3bp1AoDYsmWLRmxUVJQAIBYvXlxoHapVqyaqVasmXrx4UWCMtued/M6jud/7HIMGDdLYjpxjrl69ekKtVkvT58+fLwCIrl27aiw/ZswYAUDjM+no6CiMjY01ju8XL16IsmXLimHDhhW6H86fPy8AiGXLlmlMb9KkiWjUqFGBy2VmZoqMjAwxdOhQ0aBBA415jo6OGp9Dbb9/UlJSRNmyZUWXLl004tRqtahXr55o0qSJNM3c3FyMGTOm0G3Lz4ABA0TVqlWl1+3atROBgYHCyspK+pydOHFCABDh4eFSXHE+y8U5Z+Un53N06tQpjemurq7C19dXev3555/nG/fRRx8JmUwmrl69KoT45xirVq2aSE9P14jN79z9sszMTNGtWzdhbm4uzpw5I4TIfj/s7e1FnTp1NI7Zp0+fCmtra9G8efMS7YuCzt/51SkjI0N4eXmJHj16aMwr6D3Jb5vt7e01Pv/JycmibNmyol27doWuOz09XdSoUUOMHTtWmp5zLLdq1SrPMm5ubqJ79+5FbldRCtruwo7F/AQGBgqlUpnvPGdnZ+Hj41Po8t7e3sLFxSXfeQqFQnzwwQfS6+L8zilKQd8bQmSfVwGIjRs3aizTsWNHjbouWbJEABDbt2/XiAsMDCz0c5CjONuen/r16wtnZ2eNz01GRoaoWrWqACDWrl0rTQ8ODhbBwcEiPDxchIeHi4kTJwpTU1NRs2ZNje+k/OzevVsAEAsWLNCYPm3atDzHSu7vpBz55RwvU6vVIiMjQ6xcuVLI5XLp96AQ2p/Dcr6v89vv+a0/93lY298B2uRm2tD7FlUg+1+KwtSvXx8KhQIffPABVqxYkadrnLbeffddrWNr166NevXqaUzz8/NDcnJyiUZwLY6DBw/Cy8sLDg4OGtMDAgLw/PnzPK2xXbt21Xid8y/UrVu3ClxHSkoKTp06hV69esHc3FyaLpfL4e/vjzt37mjdfTi3kJAQZGVlSd0TgeyWppSUlHxbTKpVq4aoqCiNx7fffivNt7Ozw7Jly9C7d2+888478PPzw9GjR9GgQQN8/vnnGt1M/f398cUXX6BDhw5o06YNPvvsM+zevRsPHjzI0xr9ww8/YPDgwWjVqhW6deuG1atXY+TIkVi9ejXOnj1bom0vSmpqKg4cOIAePXrA1NRUoxW5Y8eOSE1NzdMd9nXK79hJTU3NdzTu3Hbu3Ik2bdrA3t5eYzty/l08cuSIRnynTp0gl8s11gX8c5yWLVsW1apVw5w5cxAcHIyzZ8/m27JeHO+99x6sra01WlUXLlyIChUqaP1vbw5tjmtDQ0MMGDAAW7dulVqK1Wo1Vq1ahW7duqFcuXIAsvedTCbDgAEDNPadra0t6tWrl6dFw8rKCm3bts1Tp7///ht+fn7Sv8NGRkbw9PQEAFy+fBlAdg+N+Ph49OnTR2PZypUro0WLFhrTdu7ciTJlyqBLly4a9apfvz5sbW0LbWm5du0abty4gaFDhxY4+uTrPO/kp2PHjhoDjNSqVQtA9rH4spzpuVsk6tevj8qVK0uvjY2N4ezsXOi5Fchu6WjUqJH0zzaQ/X6cPn1a4/gBgE2bNqFFixYwNzeHoaEhjIyMsHz5cun9e1UnT57E48ePMWjQoDy9Vtq3b4+oqCipy1+TJk0QGhqKqVOnIjIyUuvRSr28vPD333/j5s2bSE1NxfHjx9G+fXu0adMG+/btA5DdyqpUKvHOO++80va8yjnL1tYWTZo0ybP8y+/nwYMH4erqmicuICAAQog8vSW6du1a7PEHRo4ciV27dmHTpk3S5QBXr17FvXv34O/vr3HMmpub491330VkZGSe7nSvsi8A4Mcff0TDhg1hbGwsHXsHDhx4pWOvZ8+eGp//nN4SR48elXorZWZmYvr06XB1dYVCoYChoSEUCgWuX7+e77rz++3WpEkT7N69G59//jkOHz5cZG+Pl72O7QZQaJdKbbpbart8cX7n5Eeb742X15u7pTX3Z+bQoUOwsLDIczzmHvyyMK+y7z7++GNcu3YNI0eOxN27d3H79m18+OGHUh1f/jyNHTsWY8eOhbe3N7y9vTF16lSsXLkSV65cwU8//VToeg4dOgQA6N+/v8b04mxnfs6ePYuuXbuiXLly0vsxcOBAqNVqXLt2TSNWm3PYq9L2d4CucjO9T1RTUlLw6NEj2NvbFxhTrVo17N+/H9bW1hgxYgSqVauGatWqYcGCBcVal52dndaxubsgvDytqK4lr+rRo0f51jVnH+Vef86P3xw53R0KO3EnJiZCCFGs9WgjKysLoaGhsLe3l0a6ffLkCdq1awczM7N8u//mXMfy8qNKlSqFrsfIyAh9+/bFo0ePcP369UJjmzRpAmdnZ60SwAEDBgBAsZLFnB+yN2/eLDL20aNHyMzMxMKFC2FkZKTx6NixIwCU+PYLJVGSYyfH/fv3sWPHjjzbkXNdWu7tKGpdMpkMBw4cgK+vL2bPno2GDRuiQoUKGDVqFJ4+fVqi7VMqlRg2bBjWrl2LJ0+e4MGDB9i4cSPef//9fLsKFaQ4x/WQIUOQmpoq3Tpp7969iIuL0+j2e//+fQghYGNjk2f/RUZG5tl3+X1Onz17hpYtW+LUqVOYOnUqDh8+jKioKKmrfs5+zfkc5zeade5p9+/fx5MnT6BQKPLUKz4+vtBjM+falcIGanhd552C5B6AQ6FQFDo9NTVVY3ruYxbIPqa0+XwMGTIEERERuHLlCoDsPzqUSiXee+89KWbr1q3o06cPKlasiNWrVyMiIgJRUVHSMaQLOd2ue/Xqlec9nTVrFoQQUre3DRs2YNCgQfj555/h4eGBsmXLYuDAgUVea5bTnXf//v04fvw4MjIy0LZtW7Rr107qWrx//360aNHilUfXfJVzljbvZ3G/f4vzuwIApk6dih9//BFLly7VGH0zp9yC1p2VlYXExESN6a+yL4KDg/HRRx+hadOm2LJlCyIjIxEVFYX27dsXK+nLraDfTunp6Xj27BkAYNy4cfjqq6/QvXt37NixA6dOnUJUVBTq1auX77rz2yfff/89PvvsM2zbtg1t2rRB2bJl0b179yJ/D7yu7S5XrhxSU1PzvTbv8ePHhQ4GlLN8fue+lJQUpKenF7m8tr9ztP3eyGFqaprnj0elUqlxfnr06FG+3y/5HQv5edVtHzJkCGbOnIlVq1ahUqVKqFy5Mi5duoSgoCAAQMWKFQtdvkePHjAzMyty3z169AiGhoZ5Pnfabmd+YmNj0bJlS9y9excLFizAsWPHEBUVJf25nvv9eJXvJG1p+ztAV7mZfg2Llo9du3ZBrVYXOfx3y5Yt0bJlS6jVavz+++9YuHAhxowZAxsbG/Tr10+rdRXn3qz5fTHnTMs5UHI+vLkvKn/VRKNcuXL5Xvydc62PLkZ5s7KygoGBgc7Xs3//fumfnfw+UJGRkbh06ZJORnvMaYnXZkh2IYTWcdqWmcPX1xfLli3Dtm3b8Pnnnxcaa2VlJbUejRgxIt+YopJ0fVG+fHnUrVsX06ZNy3d+YX8+FcTR0VFK+q5du4aNGzdi8uTJSE9PL/K68oJ89NFHmDlzJn755RekpqYiMzOz2PfKLc5xndMaExISgmHDhiEkJAT29vbw8fGR4suXLw+ZTIZjx44Vem1NjvzOXQcPHsS9e/dw+PBh6d9wAHmu582pb+7rXoG857ny5cujXLlyBQ5eYWFhke90ANLgI3fu3Ckw5lXPO8bGxvkOnPNv/rmjrffeew/jxo1DaGgopk2bhlWrVqF79+6wsrKSYlavXo0qVapgw4YNGu9x7u+U/Gj7/ZOzPxcuXFjgSJc5PzLLly+P+fPnY/78+YiNjcWvv/6Kzz//HAkJCYUOaFKpUiU4Oztj//79cHJygru7O8qUKQMvLy8MHz4cp06dQmRk5L9+DX5JFPf7tzi/K0JDQ/HVV19h8uTJeVrWcz6nBa3bwMBA49h5VatXr0br1q2xZMkSjekl/VMwR0G/nRQKhdSLYvXq1Rg4cKA0Om6Ohw8fokyZMnmWz28fm5mZYcqUKZgyZQru378vta526dJF+nMoP69ru3OuTb1w4QKaNm0qTc/5YV/UPXzr1KmD9evXIz4+XiPxybm+Upt7AGvzO0fb743iKFeuHE6fPp1nuraDKeli2z/77DOMGTMG169fh4WFBRwdHTFs2DCYmZlpDOBWEG32Xbly5ZCZmYlHjx5p/A7IbzuNjY3zPY/nPj9v27YNKSkp2Lp1KxwdHaXp+d0D9d9SnN8BusjN9LpFNTY2FkFBQVCpVPleNJwfuVyOpk2bSv825HTDLc4/idq4ePEi/vzzT41pa9euhYWFhdRVJ2dEr/Pnz2vE5TfIT3H+8fDy8pJOJi9buXIlTE1NdTKstpmZGZo2bYqtW7dq1CsrKwurV6+WfngU1/Lly2FgYIBt27bh0KFDGo9Vq1YBQJGjZmojIyMDGzZsQPny5VG9evVCYyMjI3H9+nWt9lvOACbF2cfdunVDnTp1MGPGjAIv+t+7d690S5E2bdrg7NmzqFu3bp6WZHd393wTodJU0LHbuXNnREdHo1q1avluR0kS1Zc5Ozvjyy+/RJ06dQrtbl/UZ9/Ozg69e/fG4sWL8eOPP6JLly4a3Tm1UdzjevDgwTh16hSOHz+OHTt2YNCgQRrdnjt37gwhBO7evZvvvss9IEd+cn685U5qXx5BHQBcXFxga2uLjRs3akyPjY3FyZMnNaZ17twZjx49glqtzrdehd0/2dnZGdWqVcMvv/xSYKL1qucdJycnXLt2TaP8R48e5dkOfWBlZYXu3btj5cqV2LlzJ+Lj4/MkJzKZDAqFQuOHeHx8vFaj/mr7/dOiRQuUKVMGly5dyvc9dXd3l1qUX1a5cmWMHDkS3t7eWl3u0q5dOxw8eBD79u2Dt7c3gOxjonLlyvj666+RkZFR4EBKOXT9PV4SXl5euHTpUp5tzhkpvE2bNiUqd8+ePQgMDMSQIUMwadKkPPNdXFxQsWJFrF27VuNyqJSUFGzZskUaCbi4Cjp/y2SyPOeO8+fPFzrQoza2bt2q0dr29OlT7NixAy1btpTOgfmte9euXbh7926J1mljY4OAgAC89957uHr1aqEjjmq73cU9Ftu3bw9jY2ONkZ6Bf0bnLmqwxW7dukEmk+W5u0NoaChMTEyKvPeltr9ztP3eKI42bdrg6dOnec49a9eu1Wr5V932HEqlEm5ubnB0dERsbCw2bNiAwMDAIntxbN68Gc+fPy9y3+V89tesWaMxPb/tdHJyQkJCgsYfxOnp6di7d69GXH7vhxCiyG7IhXnV82hJfgcUlJtpQ29aVKOjo6V+zgkJCTh27BhCQkIgl8sRFhYm/Rufnx9//BEHDx5Ep06dULlyZaSmpko/CnO++HL+Qdm+fTu8vLxQtmxZlC9fXqtbqeTH3t4eXbt2xeTJk2FnZ4fVq1dj3759mDVrlvRl0bhxY7i4uCAoKAiZmZmwsrJCWFhYvqPz1alTB1u3bsWSJUvQqFEjGBgYaNxX9mWTJk2Srv/7+uuvUbZsWaxZswa7du3C7NmzNW7w/CpmzJgBb29vtGnTBkFBQVAoFFi8eDGio6Oxbt26Yv1TDGT/YNy+fTt8fX3RrVu3fGO+++47rFy5EjNmzND6up5x48YhIyNDGjn59u3bWLhwIc6dOycdQznq1auHAQMGoFatWjA2Nsbp06cxZ84c2Nra4tNPP5Xi1q5di61bt6JTp05wdHTEkydPsGnTJqxfvx4BAQF5rk8uTM4x7OPjAw8PD3z00Udo06YNzMzMcOvWLWzevBk7duyQum0tWLAA77zzDlq2bImPPvoITk5OePr0Kf766y/s2LEjzzVQpa1OnTo4fPgwduzYATs7O1hYWMDFxQXffPMN9u3bh+bNm2PUqFFwcXFBamoqYmJi8Ntvv+HHH38s1v26zp8/j5EjR6J3796oUaMGFAoFDh48iPPnzxfaUq3NZ3/06NHSv9wvXzeojZIc1zmtae+99x7S0tLy3NagRYsW+OCDDzB48GD8/vvvaNWqFczMzBAXF4fjx4+jTp06+OijjwqtV/PmzWFlZYUPP/wQkyZNgpGREdasWZPnDzYDAwNMmTIFw4YNQ69evTBkyBA8efIEU6ZMgZ2dnca/yP369cOaNWvQsWNHjB49Gk2aNIGRkRHu3LmDQ4cOoVu3bujRo0eBdfrhhx/QpUsXNGvWDGPHjkXlypURGxuLvXv3Sl/ur3Le8ff3x9KlSzFgwAAEBgbi0aNHmD17NiwtLQvdV6VlyJAh2LBhA0aOHIlKlSrlSdQ6d+6MrVu3Yvjw4ejVqxdu376Nb7/9FnZ2dkV2YdT2+8fc3BwLFy7EoEGD8PjxY/Tq1QvW1tZ48OAB/vzzTzx48ABLlixBUlIS2rRpAz8/P9SsWRMWFhaIiorCnj170LNnzyK31cvLC4sXL8bDhw8xf/58jekhISGwsrIqsmVD19/jJTF27FisXLkSnTp1wjfffANHR0fs2rULixcvxkcffVSiP3Bv3ryJ3r17o2rVqhg8eHCeLoYNGjSAUqnE7Nmz0b9/f3Tu3BnDhg1DWloa5syZgydPnmDmzJkl2p6Czt+dO3fGt99+i0mTJsHT0xNXr17FN998gypVqmiM+1Bccrkc3t7eGDduHLKysjBr1iwkJydrtKZ37twZoaGhqFmzJurWrYszZ85gzpw5xfq+aNq0KTp37oy6devCysoKly9fxqpVq4pM6LXd7uIei2XLlsWXX36Jr776CmXLloWPjw+ioqIwefJkvP/++xq9yFauXIkhQ4bgl19+wcCBAwFkj4sydOhQTJo0CXK5HI0bN0Z4eDiWLVuGqVOnanR/1fZ3Tn60/d4ojoEDB+K7777DwIEDMW3aNNSoUQO//fZbnqSsIMXZ9m+++QbffPMNDhw4ILUIR0dHY8uWLXB3d4dSqcSff/6JmTNnokaNGhrjndy6dQt+fn7o168fqlevDplMhiNHjmD+/PmoXbt2kSPj+vj4oFWrVvj000+RkpICd3d3nDhxQvqz+mV9+/bF119/jX79+uGTTz5Bamoqvv/++zx3lfD29oZCocB7772HTz/9FKmpqViyZEmebv7FUa1aNZiYmGDNmjWoVasWzM3NYW9vr3Xjgba/A7TJzbTySkMx6UDOyIQ5D4VCIaytrYWnp6eYPn26SEhIyLNM7lGpIiIiRI8ePYSjo6NQKpWiXLlywtPTU/z6668ay+3fv180aNBAKJVKAUAa6S6nvAcPHhS5LiGyR1fs1KmT2Lx5s6hdu7ZQKBTCyclJBAcH51n+2rVrwsfHR1haWooKFSqIjz/+WOzatSvPaJWPHz8WvXr1EmXKlBEymUxjnchnZLkLFy6ILl26CJVKJRQKhahXr16eEbzyG81ViKJHHHzZsWPHRNu2bYWZmZkwMTERzZo1Ezt27Mi3vKJG/c0ZUXPbtm0Fxvz4448ao4l5enqK2rVrF1ru8uXLRZMmTUTZsmWFoaGhsLKyEr6+vmLv3r15Yvv16yeqV68uzMzMpBFNP/zwQ3Hv3j2NuIiICOHl5SVsbW2FkZGRMDU1FY0bNxaLFy/WGDmuOJ48eSK+/fZb0bBhQ2Fubi6MjIxE5cqVxYABA8SJEyc0Ym/evCmGDBkiKlasKIyMjESFChVE8+bNxdSpUzVicr+Puh71N/dnIr/yz507J1q0aCFMTU0FgDyjdI4aNUpUqVJFGBkZibJly4pGjRqJiRMnimfPnmlsR37Hz8vH/v3790VAQICoWbOmMDMzE+bm5qJu3briu+++0xgtOL+RXwv67L/MyclJY3RxbZXkuBZCCD8/PwFAtGjRosDlfvnlF9G0aVPp81etWjUxcOBA8fvvv0sxhX1GTp48KTw8PISpqamoUKGCeP/998Uff/yR7+d/2bJlonr16kKhUAhnZ2fxyy+/iG7duuUZXTYjI0PMnTtX1KtXTxgbGwtzc3NRs2ZNMWzYMHH9+vXCdpUQIvuz1aFDB6FSqYRSqRTVqlXTGMlTCO3OO/mN+iuEECtWrBC1atUSxsbGwtXVVWzYsKHAUX9zH3MFnTPzG50+53sgt4JGHs6PWq0WDg4OAoCYOHFivjEzZ84UTk5OQqlUilq1aomffvqpwO+l3Me1tt8/Qghx5MgR0alTJ1G2bFlhZGQkKlasKDp16iTti9TUVPHhhx+KunXrCktLS2FiYiJcXFzEpEmTpJHuC5OYmCgMDAyEmZmZxii4a9asEQBEz5498yxTnM9ycc5Z+Snoc5Tf6Jy3bt0Sfn5+oly5csLIyEi4uLiIOXPmaHw3FHZey33uzjnuCnq8XPdt27aJpk2bCmNjY2FmZia8vLzyfH/o4vydlpYmgoKCRMWKFYWxsbFo2LCh2LZtW777I7/fKAVt86xZs8SUKVNEpUqVhEKhEA0aNMjzXZ2YmCiGDh0qrK2thampqXjnnXfEsWPH8hwPBX1ehcgendnd3V1YWVkJpVIpqlatKsaOHSuNrF6Q4my3Nt8ruS1YsEA4OzsLhUIhKleuLCZNmpRnVOic9yn3OTo9PV1MmjRJVK5cWTpPf//993nWoe3vnIJo+70xaNAgYWZmlmf5/M5Pd+7cEe+++64wNzcXFhYW4t133xUnT57U+reottues+6Xz29Xr14VrVq1EmXLlhUKhUJUr15dfPnll9JvkByPHz8WPXr0EE5OTsLExEQoFApRo0YN8emnn0p30yjKkydPxJAhQ0SZMmWEqamp8Pb2FleuXMn3M/Lbb7+J+vXrCxMTE1G1alWxaNGifPfdjh07pO/bihUrik8++UQaYTj3qPfansPWrVsnatasKYyMjDTqps2ov0Jo9ztA29ysKDIhihhSl4joDXf+/HnUq1cPP/zwg3QP0rfdkydP4OzsjO7du2PZsmWlXR0iIqL/JJlMhkmTJmHy5MmlXZX/HL3p+ktE9G+7ceMGbt26hS+++AJ2dnZ5uuC+LeLj4zFt2jS0adMG5cqVw61bt/Ddd9/h6dOnGD16dGlXj4iIiN5CTFSJXkFR1+oYGBgUa4RgXRJC5LneITe5XF7sa43fJN9++y1WrVqFWrVqYdOmTXmuXXpb9qFSqURMTAyGDx+Ox48fS4Oy/fjjj9LthIiIiIj+Tez6S1RCMTExRd4qpjS7eoSGhmrcmzM/hw4dKvLWT2+zw4cPFzmKZ0hIyFvbEktERET0ujBRJSqh9PT0PLd+yK04I6np2qNHj3Dz5s1CY1xcXAq99+Xb7unTp7h69WqhMVWqVNG7WwYRERER/dcxUSUiIiIiIiK9UjoXzxEREREREREVgIMp/cuysrJw7949WFhY/OcHYCEiIiIiopITQuDp06ewt7cvtQE49RUT1X/ZvXv34ODgUNrVICIiIiIiPXH79m1UqlSptKuhV5io/styBq65ffs2LC0tS7k2/5eRAYSEZD8fPBgwMtJJsZYqFbZNGYS/3nHD4AaDYSTXTblFuZV0C3V/qYtj/Y+hrnXd17IOozVrYDxhAp7GxgIAlDNmwHDXLqQcP/5a1veyGREzsOvGLhwfkL2uj/Z+hKS0JKztuva1r5uIiIiIdCc5ORkODg4c3DIfTFT/ZTndfS0tLfUnUU1JAT75JPv5Rx8BZmb/zIuJAfK7Bcvu3UD79tnPJ08Gtm0Dzp3LExZ6aQW2C+Cjdz6CmcJMY97Gixsx/dh0XHt0DRXMKmBk45H4pMUnwMWLwJQpOHxtL9r0SM5T5uURl1GzfE0AQMC2ADxJfYJt/bZJ8y2ysj/o5ubmxd7HJ2+fxNSjUxFxJwIvMl6gRrkaCNh5F2PafQn52HH/BAYEAO+++0/5SiVgYKDz91Q2RYawsy7oHh4LKBTAkyeY2GYigloGwdI0e11G6ekw/P13WA6zA0xMAD8/YO7c7HgASE0FPvwQOHMGuHwZ6Nw5+/3K7YcfgEWLgJgY/FnXBjN72+K4/C4ePn8IpzJO+LDRhxjdbLTGIkIIzPu+H5bd3oZbJumwTjXAR7LG+GJ2JABg6+WtWLJrMs49voQ0qFE7SYHJDv7w/fxnqYyfzvyEledXIjohGgDQyK4RpntNR5OKTbTaR389/gsNljaAXCbHk8+fSNMPxxxGmxV5by3z8vFDREREpA94SWBeTFRJO/v3A7Vr//O6bNlXKm739d3ov7U/FnZYCJ9qPrj84DLe3/E+TO7EY+TQpUC7dsCMmcDp4bhabT4sv50N2NsDW7agQpmKr7gx+Qu7HIY+m/tgcP3BODToEMoYl8H+v/fj09vDEPl8JTaKsf+cRExMsh//hubNgWqdgOXLAQDmCnOYK8yz56nV2e+NuSFw/Djw6BEwaBAgBLBw4T8xJibAqFHAli35r2PJEmDCBOCnn4DGjXFm3yxU+C0Eq/tOgUOHvjh5+yQ+2PEB5AZyjGwyUlps9IxWCH8Qibm1RqFO0y5IevYID2MuSfOPHlkJ718vYnrvT1CmpTdCTi1Fl7vLcWp+OTQYMwsAcPjWYbzn9h6aOzSHsaExZp+YDZ9VPrg4/CIqWhb+XmeoM/DelvfQsnJLnLx9Mt+YqyOvwlL5zx8IFUwrFFomEREREekBQf+qpKQkAUAkJSWVdlX+8eyZENmpTfbzl928mT397Nn8lw0J+WfZnEdISPY8QAztArG1JkSWiYkQ1asLsX27EEKI9za/J3pt7KVR1Hcng0WlTw1FlnsjIdRqcejmIYHJEIkvEoU4d04ImUyImTOlek1qDYHJmo9DThA3d68TmAyxJXqTaP25rTD5UibqDpeJk80dhJg/X7P+gwYJ0a2beDZ7mij3mUz0HGAkxPDhQqSnZ8/39BS/OmeXvb529vZJ9bK2lIo5O2mYwGSIm4k3hRBCPEx5KPrNbiIqfmooTCZCuI1RiLXzBmus2jPEU3z828fik/BPhNVMK2Ezx0ZMOjRJmu/4naPGtjmOlQkhhJh0aJKot6RedtBvv4lB3SG6hfhKy2WtXStmtZKLKsGOwniqsai7pK7YdHGTxvbm4eEhRFCQ5rTRo4Vo0UJ6OXzncNEmtI30+tJfEcLwK4grv4bkLS/He+8J0UvzfXb9xkZM6WIpRFZWvotkqjOFxXQLseLcioLL/b9Pwz8VA7YOECFnQ4RqhkpjnsbxQ0RERKSH9DI30BMcWoq007UrYG0NtGgBbN78z/S+fYHx47NbW+Pish99+0qzJx0BNtYGXvweCXTsCPTvDzx+jDR1GowNjTVWYRL/EHdMM3Hr44HAS6OeNVjaAHb728NrtBUO7ftJmh50Euhj74P21dsjbnwc4t6/gua3/ylv4qEvEaRojXNtN8K5cXu81/EFMidOADZu1Ny2Q4cQfvcoHpkIBHWaDoSGZj8AYOtWdHleCc4oh3Wf+GZvnxZSVy5HowOXsbPuTET3OYwPavnDPykEp5Z9/U/QuXNYEfkjzIzMcOr9U5jtPRvfHPkG+27sAwBEBUYBAEK6hSCu0nxErTPPu6KICMDKCjD+Z19+afk7QuqosaTycFwcfhFjm43FgK0DcCTmiBTjNN8Jkw9P/qectDSNMgBkt8KePp19DTOApLQklDX5pyV9R/hCVH0iw86YvajyiQJOQYZ4f0xVPP7rQoHlZoksPEU6yt5PBm7dynffPc94joysDI115efgzYPYdGkTfuj4Q6FxDZY2gN08O3it9MKhm4cKjSUiIiIi/cCuv1Q4c3MgODg7QTUwAH79NTsRXbECGDAgO5kxNwcMDQFb2zyLh9YH1tcBfq5eDZg+Pbs76unT8K3mi7F7xyKgXgDaVGmDvx7/hflXQgEAcZVUcAJgZ26HZZ2XoZF9I6RlpmHV4mHweucCDt86ilaoDPN0wESuRJrcALbmtkCmMaD+Z91BzT9Bp4ZDAQBTHrii9uLa+GvIe6i5cSPQp88/gVZWuPauJ3BwL2p1fx/Yeho4cAAIDMzu4iyXo6ahHa49i83expgrRe62itMXIWjWUuC99wAAH9f1xJ4px7Dp5M9o+sE32UHGxqgLC0xqPQkAUKNcDSw6vQgHbh6AdzVvVDDL7qJaxrgMbOUAXuTzv1J8vEYimJKeguBzi3HwN0N4tHAArKqiqlVVHI89jqVnlsIT2detVitbDeVNy/9Tjq8v8PPPQPfuQMOG2dez/vJLdpL68CEiMmOw8eJG7PLbJS3y98O/cEslsOnaNqxsNQNqMxOMPfQZegU3w8H5idnXyPr6AmPHZl/T26YN5u34HCkvktDnIrKTfienPJv0+f7PUdGiItpVbVfg/n30/BECtgVgdc/VGt16X5bn+Dm/Cl4rvXA44DBaObYqsGwiIqL8CCGQmZkJtVpddDDR/8nlchgaGvIa1BJgokqFK18+O9HI4e4OJCYCs2dnJ6pFOG/z0gszM8DCAkhIQKBvIG48voHO6zojQ50BS6UlRlt6YfLDzZDL5AAAl/IucCnvIi3ukdIat+9dxtyTc9HK4/si113Xpi7w44/Azz/DLv4mEAgk7NqImuUaagbWrg3IspNAIQRgZwdcuKARIiCgkCuKXCcA4MEDqO/cxsyfB2LDif64ay6QJgfS5ICZWvlPXM2aqFuhtsaidhZ2SEhJ0G49OV468V16cAmpmanwfg/A9cHA9EAAQLo6HQ3sGgCoBQA4MPCAZhlffZWd9DZrlt2B28YmO7mcPRsXk66j245e+Nrza3hX85YWyRJZSDMEVrb7Ac7dhgAAlju5oNGmdrj620q4dH8/O9m/cQPo3BnrnNMwuYvAdqU/rFNWAXJ5nk2ZfWI21kWvw+GAw3la3F8WuCMQfnX8Ck048xw/Dh64nXw7+/hhokpERMWQnp6OuLg4PH/+vLSrQv9BpqamsLOzg0Kh5W9JAsBElUqiWbPs1jctZORuBJTJgKwsyGQyzPKehele0xH/LB4VzCrgQPhS4OFmON1+mn9hV66gWXkbrH58XaNr8D8ry9B4aXTgEDB2EjBvHmTubsBuT2R17AAcu625nJERapSrAQC4/PAymv+/jhqrzkpA/XKtAQAGOUnty6t+uSk3KwvzmgPftTbG/GaTUaeMM8wMTTHm96lId9K8RU/uW/bIIEOW0Fx3oWxtgTsv/ln1/5fdtQaouPjn7Pfq/5RyJXD8q/zLMTHJbkFduhS4fz87WV+2DJccTdF2Z28ENgzEl62+1FjEzsIehomAcyMfaVqtGs0BALG3L8IFyH6/Z83Chv71MfTXIdjUcx3a3VICWJWnNXXuybmYfmw69g/cn/0nQyEO3jyIX6/+irkn5wLI/iMhS2TB8BtDLOuyDEMaDMl3uWYVm2H1hdWFlk1ERPSyrKws3Lx5E3K5HPb29lAoFGwdI60IIZCeno4HDx7g5s2bqFGjBgzy+w1L+WKiStm3Vtm585/nRTl7NjuRyaFQZI8sm48vW01EYDsPKA3zL1duIJdGdl2XGgWPhyaw3vkLMGCYZjL655/A/v04O60e7MytgArZ3WIVqelQm/w/2ct9e5w//sgeMXf4cCD1CbAbwL17+dbDt5ovypqUxbyIeWgOB415v1ZJx/WsB5hfPwDAP6PGxpllwer/MecQ/88CNjY45myMblnOGOA9HkB2Ann9xHDUKl8r3/UXxMjACOqsQroYeXgAy77NvgUNANcKrlDKjBBbXsDzna5AcW+XY2QE/P9m0xd3LEdbfzUG1RuEaV7T8oS2aNgNmYd/xY1zh1Ctkj8A4Nrf2dfVOlauI8Wtu7AOQ3YMwbpe69CpZndg5sDseltbSzFzTszB1GNTsXfAXrjbuxdZzYihEVCLf/bL9ivbMevELJwcehIVLQoeKfhs/FnYmdsVOJ+IiCi39PR0ZGVlwcHBAaampqVdHfqPMTExgZGREW7duoX09HQY5x4ThArERJWyry/t1Cn/eStWZCcvDRpkJ447dgDffw/MmvVPjJMTcPNmdqJYqVJ2997/J7zu9u6Ac96yHz5/iM2XNqO1U2ukZqYi5GwINl3ahCMdvgd+GQO8+y7m93OCk70rat96gfTZM7D6fSdsST+HLU22ZLcANmsGp4gr2Fs3HVf3rEa5qcFQvfwnlYMDELIb2LsXqFgue9qVK4BRjTz1MVOYYWnnpei3uR8+MK2FkWZKWD6JwYG/D+CTFg/w/sPK6GhaD3j4ENXLVoeDvCwmezzF1EfXcP3RdcxDhEZ51V3fwZa4Azg5bwysWvki+NLPiH98G7WSXmpBvXIFuJECtC/4rXEyr4QDURvQ4pYjlIaZsDp3LruLbk6Lr48PsLFM9jWl9c7C4vFjBP1hjLGdMpD1dxjeqfwOktOScTJqC8yhwKDHj4GnT+H1Q1P0sGuDkT1nZpdz7Vr2wElNmwKJibi4aBLa1PkDPs5dMc5jHOKfxQO//Qb5tOmo8OdfAIB2rQLQ8LdxGLLnQ8w3VCPLzAQjfv0Q3s/M4NwxO3Fdd3IZBu77CAsaTkSzJ+aIH/M+8NtGmGz/Dar/b+PsE7Px1aGvsLbnWjiVccpeFzRvw7Po9CKEXQmTuizXqqCZ8P9+73cYyAzgZu0mTZsfOR9OZZxQu0JtpKvTsfr8amy5vAVb+hRwix4iIqJCsCWMSorHTskwUaWiTZ2aPUKrXA44O2d3EX35+tR33wW2bgXatAGePAFCQrKvbyzCij9XICg8CAICHpU8cHjQYTSp1BSIbAZMmYL0n5ciyPUF7loAJj2UqO1YDbtaLkLHGh2zC/jlFwQO88dh+Vm4Jw3CM+8sHLoLOOWsoHdvIPph9uBPxgL4CED3bsCuS/nWp5drLxwadAjTfvJHy4aXkbygCgBgputwfDbrOPBTNSAtDUZCYF35D/GR1UzU+7EeGts3xlS0RW9sksr6asQG3PzBB76JC2G6aQE+iDZG98qWSHIx+2eFqalAekqh+2jetSoYZ7QJP5UBKvoDMQ0aAK0BdKqWHSCXZ99zNupY9oBXJib41m8grH2qYsbxGfg78W+UMS6Dhtee4ot9qcD/B9q9UR94uPk0kJOoqtXAvHnA1auAkRE2vWeHB6YCa/7ejjXztkv1cWwLxPz/uYHMADtGn8LHC3zR6thgmGXI0CHdAfPG78z+cwPA0osrkIksjPjjW4wAACsAHwODHqxEKNoCABZHLUa6Oh29NvXS2PZJnpMwufVkANl/bNx4fKPQfZVbujodQeFBuPv0LkwMTVDbujZ2+e365/ghIiIiIr0lE0KIosNIV5KTk6FSqZCUlATL4nbLfF0yMoA1a7Kf9+8vJRmvXKw6A2suZJfbv07/PNdjaiUrCxg6NLtV9MgRoEbe1tDXJTUzFd3Wd8PtpNs4EnBEGoWXiIiI3h6pqam4efMmqlSpwm6bVCKFHUN6mRvoCbZDE5CeDgwenP1IT9ddsep0DN4+GIO3D0a6uoTlGhgAy5cDn30GHDums7ppw9jQGNv7bcfAegNx9NbRf3XdRERERG+Lw4cPQyaT4cmTJwCA0NBQlClTplTrRKWPiSrpPwMDYPRoYEj+I7m+TsaGxvj8nc/xruu7//q6iYiIiF7V7du3MXToUGnEYkdHR4wePRqPHj0qlfq0bt0aY8aM0ZjWvHlzxMXFQaVS5b9QCW3ZsgWurq5QKpVwdXVFWFhYkctcuHABnp6eMDExQcWKFfHNN9/g5Q6oOUl17seVK1d0WndiokpERERE9Eb6+++/4e7ujmvXrmHdunX466+/8OOPP+LAgQPw8PDA48ePS7uKAACFQgFbW1ud3vYnIiICffv2hb+/P/7880/4+/ujT58+OHXqVIHLJCcnw9vbG/b29oiKisLChQsxd+5cBAcH54m9evUq4uLipEeNf/HytLcFE1UiIiIiopJISSn48f9bx2kV++KFdrHFNGLECCgUCoSHh8PT0xOVK1dGhw4dsH//fty9excTJ06UYmUyGbZt26axfJkyZRAaGiq9/uyzz+Ds7AxTU1NUrVoVX331FTJeuo/95MmTUb9+faxatQpOTk5QqVTo168fnj59CgAICAjAkSNHsGDBAqklMiYmJk/X3/zs2LEDjRo1grGxMapWrYopU6YgMzOzwPj58+fD29sbEyZMQM2aNTFhwgR4eXlh/vz5BS6zZs0apKamIjQ0FG5ubujZsye++OILBAcHI/ewPtbW1rC1tZUecrm8wHKpZJioEhERERGVhLl5wY93c102ZG1dcGyHDpqxTk75xxXD48ePsXfvXgwfPhwmJiYa82xtbdG/f39s2LAhTwJWGAsLC4SGhuLSpUtYsGABfvrpJ3z33XcaMTdu3MC2bduwc+dO7Ny5E0eOHMHMmdl3GViwYAE8PDwQGBgotUQ6ODjktyoNe/fuxYABAzBq1ChcunQJS5cuRWhoKKZNy3uf9xwRERHw8fHRmObr64uTJ08WuoynpyeU/7/NYs4y9+7dQ0xMjEZsgwYNYGdnBy8vLxw6dKjIbaDiY6JKRERERPSGuX79OoQQqFWrVr7za9WqhcTERDx48EDrMr/88ks0b94cTk5O6NKlC8aPH4+NGzdqxGRlZUktki1btoS/vz8OHMi+D7pKpYJCoYCpqWmxWiKnTZuGzz//HIMGDULVqlXh7e2Nb7/9FkuXLi1wmfj4eNjY2GhMs7GxQXx8fLGXyZkHAHZ2dli2bBm2bNmCrVu3wsXFBV5eXjh6lANv6hrvo0pEREREVBLPnhU8L3cClpBQcKxBrrajXK13r0NOS6pCodB6mc2bN2P+/Pn466+/8OzZM2RmZua5pYqTkxMsLCyk13Z2dkgobNu1cObMGURFRWm0oKrVaqSmpuL58+cwNTXNd7nc17wKIYq8Dja/ZV6e7uLiAhcXF2m+h4cHbt++jblz56JVq1babxQViYkqAUolkPNv2EtdHV65WEMlNvbaKD0nIiIieqOYmZV+bAGqV68OmUyGS5cuoXv37nnmX7lyBRUqVJBuAyOTyfJ0A375+tPIyEj069cPU6ZMga+vL1QqFdavX4958+ZpLGNkZKTxWiaTISsr65W2JSsrC1OmTEHPnj3zzCvo3ra2trZ5Wk8TEhLytJhqswyAQpdr1qwZVq9eXeB8KhkmqgQYGgK9e+u+WAND9K6t+3KJiIiIqHDlypWDt7c3Fi9ejLFjx2pcpxofH481a9ZgxIgR0rQKFSogLi5Oen39+nU8f/5cen3ixAk4OjpqDMB069atYtdLoVBArVYXa5mGDRvi6tWrqF69utbLeHh4YN++fRg7dqw0LTw8HM2bNy90mS+++ALp6elSS3N4eDjs7e3h5ORU4HJnz56FnZ2d1nUj7TBRfcttupH02sruXU2398IiIiIiIu0tWrQIzZs3h6+vL6ZOnYoqVarg4sWL+OSTT+Ds7Iyvv/5aim3bti0WLVqEZs2aISsrC5999plG62j16tURGxuL9evXo3Hjxti1a5dW9yXNzcnJCadOnUJMTAzMzc1RtmzZIpf5+uuv0blzZzg4OKB3794wMDDA+fPnceHCBUydOjXfZUaPHo1WrVph1qxZ6NatG7Zv3479+/fj+PHjGvsnLCxMuobWz88PU6ZMQUBAAL744gtcv34d06dPx9dffy11/Z0/fz6cnJxQu3ZtpKenY/Xq1diyZQu2bNlS7H1BheNgSgRZZiYq/bYNlX7bBlkhw3wXV2ZWJjZd3IRNFzchM0t35RIRERFR0WrUqIGoqChUrVoVffr0gaOjIzp06ABnZ2ecOHEC5i+NJDxv3jw4ODigVatW8PPzQ1BQkMa1n926dcPYsWMxcuRI1K9fHydPnsRXX31V7DoFBQVBLpfD1dUVFSpUQGxsbJHL+Pr6YufOndi3bx8aN26MZs2aITg4GI6OjgUu07x5c6xfvx4hISGoW7cuQkNDsWHDBjRt2lSKefjwIW7cuCG9VqlU2LdvH+7cuQN3d3cMHz4c48aNw7hx46SY9PR0BAUFoW7dumjZsiWOHz+OXbt25dstmV6NTBRnTGp6ZcnJyVCpVEhKSspz8Xlp2HQjCfLnKehZtyIAYOv5u1Cbvvp1EQDQ0cEQ5jOyT4DPJjyDmUI35RIRERH9W1JTU3Hz5k1UqVKlwOsh/0smTZqE4OBghIeHw8PDo7Sr81Yo7BjSt9xAn7DrLxERERHRW2LKlClS99umTZvCIPeIw0R6gokqEREREdFbZPDgwaVdBaIi6c1fKDNmzIBMJsOYMWOkaUIITJ48Gfb29jAxMUHr1q1x8eJFjeXS0tLw8ccfo3z58jAzM0PXrl1x584djZjExET4+/tDpVJBpVLB398fT5480YiJjY1Fly5dYGZmhvLly2PUqFFIT0/XiLlw4QI8PT1hYmKCihUr4ptvvskzjDcRERERERG9Gr1IVKOiorBs2TLUrVtXY/rs2bMRHByMRYsWISoqCra2tvD29sbTp0+lmDFjxiAsLAzr16/H8ePH8ezZM3Tu3Flj2Gs/Pz+cO3cOe/bswZ49e3Du3Dn4+/tL89VqNTp16oSUlBQcP34c69evx5YtWzB+/HgpJjk5Gd7e3rC3t0dUVBQWLlyIuXPnIjg4+DXuGSIiIiIiordPqXf9ffbsGfr374+ffvpJY3hpIQTmz5+PiRMnSqNorVixAjY2Nli7di2GDRuGpKQkLF++HKtWrUK7du0AAKtXr4aDgwP2798PX19fXL58GXv27EFkZKQ0ytdPP/0EDw8PXL16FS4uLggPD8elS5dw+/Zt2NvbA8ge+SwgIADTpk2DpaUl1qxZg9TUVISGhkKpVMLNzQ3Xrl1DcHAwxo0bJw1ZTURERERERK+m1FtUR4wYgU6dOkmJZo6bN28iPj4ePj4+0jSlUglPT0+cPHkSAHDmzBlkZGRoxNjb28PNzU2KiYiIgEql0hiKulmzZlCpVBoxbm5uUpIKZA+DnZaWhjNnzkgxnp6eUCqVGjH37t1DTExMgduXlpaG5ORkjQcREREREREVrFRbVNevX48//vgDUVFReebFx8cDAGxsbDSm29jY4NatW1KMQqGAlZVVnpic5ePj42FtbZ2nfGtra42Y3OuxsrKCQqHQiHFycsqznpx5VapUyXcbZ8yYgSlTpuQ7T19kGSlwetYP0nNdUcgVCOkWIj0nIiIiIiLSRqklqrdv38bo0aMRHh5e6D2pcnepFUIU2c02d0x+8bqIyRlIqbD6TJgwQeMmwcnJyXBwcCi0/v82YWSEW+/213m5RnIjBNQP0Hm5RERERET0Ziu1rr9nzpxBQkICGjVqBENDQxgaGuLIkSP4/vvvYWhoqNFa+bKEhARpnq2tLdLT05GYmFhozP379/Os/8GDBxoxudeTmJiIjIyMQmMSEhIA5G31fZlSqYSlpaXGg4iIiIiIiApWaomql5cXLly4gHPnzkkPd3d39O/fH+fOnUPVqlVha2uLffv2Scukp6fjyJEjaN68OQCgUaNGMDIy0oiJi4tDdHS0FOPh4YGkpCScPn1aijl16hSSkpI0YqKjoxEXFyfFhIeHQ6lUolGjRlLM0aNHNW5ZEx4eDnt7+zxdgv9rZJmZsD20F7aH9kKWmamzcjOzMrHr2i7surYLmVm6K5eIiIiI3hyHDx+GTCaTbh8ZGhqKMmXKlGqdqPSVWqJqYWEBNzc3jYeZmRnKlSsHNzc36Z6q06dPR1hYGKKjoxEQEABTU1P4+fkBAFQqFYYOHYrx48fjwIEDOHv2LAYMGIA6depIgzPVqlUL7du3R2BgICIjIxEZGYnAwEB07twZLi4uAAAfHx+4urrC398fZ8+exYEDBxAUFITAwECpBdTPzw9KpRIBAQGIjo5GWFgYpk+f/kaM+GuQnoaWgX3RMrAvDNLTdFZuWmYaOq/rjM7rOiMtU3flEhEREZF2bt++jaFDh8Le3h4KhQKOjo4YPXo0Hj16VCr1ad26NcaMGaMxrXnz5oiLi4NKpdLpurZs2QJXV1colUq4uroiLCysyGU2btyI+vXrw9TUFI6OjpgzZ47G/JykOvfjypUrOq076cHtaQrz6aef4sWLFxg+fDgSExPRtGlThIeHw8LCQor57rvvYGhoiD59+uDFixfw8vJCaGgo5HK5FLNmzRqMGjVKGh24a9euWLRokTRfLpdj165dGD58OFq0aAETExP4+flh7ty5UoxKpcK+ffswYsQIuLu7w8rKCuPGjdO4/pSIiIiISF/8/fff8PDwgLOzM9atW4cqVarg4sWL+OSTT7B7925ERkaibNmypV1NKBQK2Nra6rTMiIgI9O3bF99++y169OiBsLAw9OnTB8ePH9e4G8jLdu/ejf79+2PhwoXw8fHB5cuX8f7778PExAQjR47UiL169arGJX0VKlTQaf0JkImcEYHoX5GcnAyVSoWkpCS9uF51040kyJ+noGfdigCArefvQm1qppOyOzoYwnyGOQDg2YRnMFPoplwiIiKif0tqaipu3ryJKlWq5BkANCU9pcDl5AZyGBsaaxVrIDOAiZFJkbHF/S3VoUMHREdH49q1azAx+af8+Ph4VKtWDQMHDsSSJUsAZA8OGhYWhu7du0txZcqUwfz58xEQEAAA+OyzzxAWFoY7d+7A1tYW/fv3x9dffw0jIyMAwOTJk7Ft2zaMHz8eX331FRITE9GhQwf89NNPsLCwQEBAAFasWKFRx5s3byImJgZt2rRBYmIiypQpg9DQUIwZM0bqCgwAO3bswOTJk3Hx4kXY29tj0KBBmDhxIgwN829369u3L5KTk7F7925pWvv27WFlZYV169blu4yfnx8yMjKwadMmadr8+fMxb948xMbGQiaT4fDhwxp11UZhx5C+5Qb6RK9bVImIiIiI9FXOH/L56VijI3b57ZJeW8+1xvOM5/nGejp64nDAYem10wInPHz+ME+cmKR9+9Ljx4+xd+9eTJs2TSNJBSAlmRs2bMDixYu1vozNwsICoaGhsLe3x4ULFxAYGAgLCwt8+umnUsyNGzewbds27Ny5E4mJiejTpw9mzpyJadOmYcGCBbh27Rrc3NzwzTffAMhuiYyJiSl0vXv37sWAAQPw/fffo2XLlrhx4wY++OADAMCkSZPyXSYiIgJjx47VmObr64v58+cXuJ60tDSYmppqTDMxMcGdO3dw69YtjXFpGjRogNTUVLi6uuLLL79EmzZtCt0GKr5Su0aViIiIiIhej+vXr0MIgVq1auU7v1atWkhMTMSDBw+0LvPLL79E8+bN4eTkhC5dumD8+PHYuHGjRkxWVhZCQ0Ph5uaGli1bwt/fHwcOHACQfSmdQqGAqakpbG1tYWtrq3G5XkGmTZuGzz//HIMGDULVqlXh7e2Nb7/9FkuXLi1wmfj4+Dx35rCxsclzF4+X+fr6YuvWrThw4ACysrJw7do1KbHNGXTVzs4Oy5Ytw5YtW7B161a4uLjAy8sLR48eLXI7qHjYokpEREREVALPJjwrcJ7cQDMBSwhKKDDWQKbZdhQzOuaV6qWNnKv/FAqF1sts3rwZ8+fPx19//YVnz54hMzMzT3dVJycnjfFk7OzspFs6ltSZM2cQFRWFadOmSdPUajVSU1Px/PnzPK2gOXK3FAshCm09DgwMxI0bN9C5c2dkZGTA0tISo0ePxuTJk6WE2sXFRRqQFci+M8jt27cxd+5ctGrV6lU2k3JhiyoRERERUQmYKcwKfLx8fWpRsS9fn1pYbHFUr14dMpkMly5dynf+lStXUKFCBek6S5lMhtxD12RkZEjPIyMj0a9fP3To0AE7d+7E2bNnMXHiRI1bNwKQrlfNIZPJkJWVVay655aVlYUpU6Zo3NbywoULuH79ep5rPnPY2trmaT1NSEjI08qau66zZs3Cs2fPcOvWLcTHx6NJkyYAUOjtKJs1a4br168Xf8OoUGxRJWQZKfDHpDnSc11RyBVY1GGR9JyIiIiI/h3lypWDt7c3Fi9ejLFjx+YZTGnNmjUYMWKENK1ChQpS91Ygu+vw8+f/XFN74sQJODo6YuLEidK0W7duFbteCoUCarW6WMs0bNgQV69eRfXq1bVexsPDA/v27dO4TjU8PBzNmzcvclm5XI6KFbMHGl23bh08PDxgbW1dYPzZs2dhZ2endd1IO0xUCcLICDf8A3VerpHcCCOajCg6kIiIiIh0btGiRWjevDl8fX0xdepUjdvTODs74+uvv5Zi27Zti0WLFqFZs2bIysrCZ599ptE6Wr16dcTGxmL9+vVo3Lgxdu3apdV9SXNzcnLCqVOnEBMTA3Nzc61uj/P111+jc+fOcHBwQO/evWFgYIDz58/jwoULmDp1ar7LjB49Gq1atcKsWbPQrVs3bN++Hfv378fx48c19k9YWJh0De3Dhw+xefNmtG7dGqmpqQgJCcGmTZtw5MgRaZn58+fDyckJtWvXRnp6OlavXo0tW7Zgy5Ytxd4XVDh2/SUiIiIiegPVqFEDUVFRqFq1Kvr06QNHR0d06NABzs7OOHHiBMzN/xm1eN68eXBwcECrVq3g5+eHoKAgjWs/u3XrhrFjx2LkyJGoX78+Tp48ia+++qrYdQoKCoJcLoerqysqVKiA2NjYIpfx9fXFzp07sW/fPjRu3BjNmjVDcHAwHB0dC1ymefPmWL9+PUJCQlC3bl2EhoZiw4YNGvdQffjwIW7cuKGx3IoVK+Du7o4WLVrg4sWLOHz4sNT9FwDS09MRFBSEunXromXLljh+/Dh27dqFnj17FntfUOF4H9V/mb7dK2nTjSRArUaFqJMAgAeNmwNajL6mjZ5VzHEs9hgAoGXllnkGFSAiIiLSd4XdA/O/aNKkSQgODkZ4eDg8PDxKuzpvBd5HtWTY9ZcgT0tF6wFdAABbz9+F2rR4F+sXJDUzFW1WZN9T6tmEZ8UeBICIiIiIdGvKlClS99umTZvCwIAdLEk/MVElIiIiInqLDB48uLSrQFQk/oVCREREREREeoWJKhEREREREekVJqpEREREREXg+KNUUjx2SoaJKhERERFRAXLuJfr8+fNSrgn9V+UcOy/fl5aKxsGUiIiIiIgKIJfLUaZMGSQkJAAATE1NIZPJSrlW9F8ghMDz58+RkJCAMmXKQK6jW0C+LZioErIMjfDnZ99Iz3XFSG6E2e1mS8+JiIiI/otsbW0BQEpWiYqjTJky0jFE2pMJdpr+V+nbTX033Uh6bWX3rqZ6bWUTERER/dvUajUyMjJKuxr0H2JkZFRoS6q+5Qb6hC2qRERERERakMvl7L5J9C9hokqAWg2ri38CABJr1wN0dAJWZ6nxR9wfAICGdg0hN+CJnYiIiIiIisZElSBPS0W7nm0BAFvP34Xa1Ewn5aZmpqLJz00AAM8mPIOZQjflEhERERHRm423pyEiIiIiIiK9wkSViIiIiIiI9AoTVSIiIiIiItIrTFSJiIiIiIhIrzBRJSIiIiIiIr3CRJWIiIiIiIj0Cm9PQ8gyNMLFjz+TnuuKkdwIkzwnSc+JiIiIiIi0IRNCiNKuxNskOTkZKpUKSUlJsLS0LO3qYNONpNdWdu9qqtdWNhERERHRf52+5Qb6hF1/iYiIiIiISK+w6y8BWVmw/OsqACC5ugtgoJv/L7JEFi4/uAwAqFWhFgxk/F+EiIiIiIiKxkSVIE99Ad+OHgCArefvQm1qppNyX2S8gNsSNwDAswnPYKbQTblERERERPRmYxMXERERERER6RUmqkRERERERKRXmKgSERERERGRXmGiSkRERERERHqFiSoRERERERHpFSaqREREREREpFd4expClqERrr7/sfRcV4zkRgjyCJKeExERERERaUMmhBClXYm3SXJyMlQqFZKSkmBpaVna1cGmG0mvreze1VSvrWwiIiIiov86fcsN9Am7/hIREREREZFeYddfArKyYHrvNgDgub0DYKCb/y+yRBZik2IBAJVVlWEg4/8iRERERERUNCaqBHnqC3RqXQ8AsPX8XahNzXRS7ouMF6iyoAoA4NmEZzBT6KZcIiIiIiJ6s7GJi4iIiIiIiPRKqSaqS5YsQd26dWFpaQlLS0t4eHhg9+7d0vyAgADIZDKNR7NmzTTKSEtLw8cff4zy5cvDzMwMXbt2xZ07dzRiEhMT4e/vD5VKBZVKBX9/fzx58kQjJjY2Fl26dIGZmRnKly+PUaNGIT09XSPmwoUL8PT0hImJCSpWrIhvvvkGHIuKiIiIiIhIt0o1Ua1UqRJmzpyJ33//Hb///jvatm2Lbt264eLFi1JM+/btERcXJz1+++03jTLGjBmDsLAwrF+/HsePH8ezZ8/QuXNnqNVqKcbPzw/nzp3Dnj17sGfPHpw7dw7+/v7SfLVajU6dOiElJQXHjx/H+vXrsWXLFowfP16KSU5Ohre3N+zt7REVFYWFCxdi7ty5CA4Ofo17iIiIiIiI6O1TqteodunSReP1tGnTsGTJEkRGRqJ27doAAKVSCVtb23yXT0pKwvLly7Fq1Sq0a9cOALB69Wo4ODhg//798PX1xeXLl7Fnzx5ERkaiadOmAICffvoJHh4euHr1KlxcXBAeHo5Lly7h9u3bsLe3BwDMmzcPAQEBmDZtGiwtLbFmzRqkpqYiNDQUSqUSbm5uuHbtGoKDgzFu3DjIZLLXtZuIiIiIiIjeKnpzjaparcb69euRkpICDw8Pafrhw4dhbW0NZ2dnBAYGIiEhQZp35swZZGRkwMfHR5pmb28PNzc3nDx5EgAQEREBlUolJakA0KxZM6hUKo0YNzc3KUkFAF9fX6SlpeHMmTNSjKenJ5RKpUbMvXv3EBMTU+B2paWlITk5WeNBREREREREBSv1RPXChQswNzeHUqnEhx9+iLCwMLi6ugIAOnTogDVr1uDgwYOYN28eoqKi0LZtW6SlpQEA4uPjoVAoYGVlpVGmjY0N4uPjpRhra+s867W2ttaIsbGx0ZhvZWUFhUJRaEzO65yY/MyYMUO6NlalUsHBwUHrfUNERERERPQ2KvXb07i4uODcuXN48uQJtmzZgkGDBuHIkSNwdXVF3759pTg3Nze4u7vD0dERu3btQs+ePQssUwih0RU3v265uojJGUipsG6/EyZMwLhx46TXycnJepesCrkh/ur/vvRcVwwNDDHcfbj0nIiIiIiISBulnj0oFApUr14dAODu7o6oqCgsWLAAS5cuzRNrZ2cHR0dHXL9+HQBga2uL9PR0JCYmarSqJiQkoHnz5lLM/fv385T14MEDqUXU1tYWp06d0pifmJiIjIwMjZjcLac53ZBzt7S+TKlUanQX1kdZSiXOTpmr83KVhkr80OkHnZdLRERERERvtlLv+pubEELq2pvbo0ePcPv2bdjZ2QEAGjVqBCMjI+zbt0+KiYuLQ3R0tJSoenh4ICkpCadPn5ZiTp06haSkJI2Y6OhoxMXFSTHh4eFQKpVo1KiRFHP06FGNW9aEh4fD3t4eTk5Outl4IiIiIiIiKt1E9YsvvsCxY8cQExODCxcuYOLEiTh8+DD69++PZ8+eISgoCBEREYiJicHhw4fRpUsXlC9fHj169AAAqFQqDB06FOPHj8eBAwdw9uxZDBgwAHXq1JFGAa5Vqxbat2+PwMBAREZGIjIyEoGBgejcuTNcXFwAAD4+PnB1dYW/vz/Onj2LAwcOICgoCIGBgbC0tASQfYsbpVKJgIAAREdHIywsDNOnT38zRvwVAopHD6F49BDQ4X1hhRB4kPIAD1Ie8H6zRERERESktVLt+nv//n34+/sjLi4OKpUKdevWxZ49e+Dt7Y0XL17gwoULWLlyJZ48eQI7Ozu0adMGGzZsgIWFhVTGd999B0NDQ/Tp0wcvXryAl5cXQkNDIZfLpZg1a9Zg1KhR0ujAXbt2xaJFi6T5crkcu3btwvDhw9GiRQuYmJjAz88Pc+f+0x1WpVJh3759GDFiBNzd3WFlZYVx48ZpXH/6XyV/8RzdmmZ3v956/i7UpmY6Kfd5xnNYz80eyOrZhGcwU+imXCIiIiIierPJBJu6/lXJyclQqVRISkqSWmtL06YbSZA/T0HPuhUB6DZR7ehgCPMZ5gCYqBIRERER5aZvuYE+0btrVImIiIiIiOjtxkSViIiIiIiI9AoTVSIiIiIiItIrTFSJiIiIiIhIrzBRJSIiIiIiIr1SqrenIf0g5IaI6fme9FxXDA0MMajeIOk5ERERERGRNpg9ELKUSkTNXqLzcpWGSoR2D9V5uURERERE9GZj118iIiIiIiLSK2xRJUAIyF88BwCoTUwBmUxHxQo8z8gu19TIFDIdlUtERERERG82tqgS5C+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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RoundTargetExpChannel
0R0AF488300c2
1R0AF5551500c3
2R0AF6471500c4
3R0AF7501500c5
17R4AXL1500c3
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RoundTargetExpChanneltarget_lower
0R0AF488300c2af488
1R0AF5551500c3af555
2R0AF6471500c4af647
3R0AF7501500c5af750
4R1ColVI300c2colvi
\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", + " \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", + "
full_column
0AF488_Cell_Intensity_Average
1AF488_Cytoplasm_Intensity_Average
2AF488_Nucleus_Intensity_Average
3AF555_Cell_Intensity_Average
4AF555_Cytoplasm_Intensity_Average
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
full_columnmarkermarker_lower
0AF488_Cell_Intensity_AverageAF488af488
1AF488_Cytoplasm_Intensity_AverageAF488af488
2AF488_Nucleus_Intensity_AverageAF488af488
3AF555_Cell_Intensity_AverageAF555af555
4AF555_Cytoplasm_Intensity_AverageAF555af555
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
full_columnmarkermarker_lower
0AF488_Cell_Intensity_AverageAF488af488
1AF488_Cytoplasm_Intensity_AverageAF488af488
2AF488_Nucleus_Intensity_AverageAF488af488
3AF555_Cell_Intensity_AverageAF555af555
4AF555_Cytoplasm_Intensity_AverageAF555af555
\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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RoundTargetExpChanneltarget_lowerfull_columnmarker
0R0AF488300c2af488AF488_Cell_Intensity_AverageAF488
1R0AF488300c2af488AF488_Cytoplasm_Intensity_AverageAF488
2R0AF488300c2af488AF488_Nucleus_Intensity_AverageAF488
3R0AF5551500c3af555AF555_Cell_Intensity_AverageAF555
4R0AF5551500c3af555AF555_Cytoplasm_Intensity_AverageAF555
........................
103R8Sting1000c4stingSting_Cytoplasm_Intensity_AverageSting
104R8Sting1000c4stingSting_Nucleus_Intensity_AverageSting
105R8CD11b1500c5cd11bCD11b_Cell_Intensity_AverageCD11b
106R8CD11b1500c5cd11bCD11b_Cytoplasm_Intensity_AverageCD11b
107R8CD11b1500c5cd11bCD11b_Nucleus_Intensity_AverageCD11b
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
RoundTargetExpChanneltarget_lowerfull_columnmarkerlocalisation
0R0AF488300c2af488AF488_Cell_Intensity_AverageAF488cell
1R0AF488300c2af488AF488_Cytoplasm_Intensity_AverageAF488cytoplasm
2R0AF488300c2af488AF488_Nucleus_Intensity_AverageAF488nucleus
3R0AF5551500c3af555AF555_Cell_Intensity_AverageAF555cell
4R0AF5551500c3af555AF555_Cytoplasm_Intensity_AverageAF555cytoplasm
...........................
103R8Sting1000c4stingSting_Cytoplasm_Intensity_AverageStingcytoplasm
104R8Sting1000c4stingSting_Nucleus_Intensity_AverageStingnucleus
105R8CD11b1500c5cd11bCD11b_Cell_Intensity_AverageCD11bcell
106R8CD11b1500c5cd11bCD11b_Cytoplasm_Intensity_AverageCD11bcytoplasm
107R8CD11b1500c5cd11bCD11b_Nucleus_Intensity_AverageCD11bnucleus
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + "
rgbhexChannel
c2(0.00784313725490196, 0.24313725490196078, 1.0)#023effc2
c3(1.0, 0.48627450980392156, 0.0)#ff7c00c3
c4(0.10196078431372549, 0.788235294117647, 0.219...#1ac938c4
c5(0.9098039215686274, 0.0, 0.043137254901960784)#e8000bc5
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
rgbhexRound
R0(0.28685356234627135, 0.13009829239513535, 0.2...#49213bR0
R1(0.36541462435986094, 0.2025447048359916, 0.37...#5d3460R1
R2(0.40867533458903105, 0.2940761173840091, 0.51...#684b84R2
R3(0.42890613750051265, 0.4082290173220481, 0.63...#6d68a2R3
R4(0.4444462906865238, 0.5264664993764805, 0.705...#7186b4R4
R5(0.47707206309601013, 0.6427061780374552, 0.74...#7aa4bdR5
R6(0.5414454866716836, 0.7466759172596551, 0.757...#8abec1R6
R7(0.6414710091647722, 0.8321551072276492, 0.774...#a4d4c6R7
R8(0.7684256891219349, 0.8992667116749021, 0.817...#c4e5d0R8
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + "
rgbhexSample_ID
DD3S1.csv(0.9677975592919913, 0.44127456009157356, 0.53...#f77189DD3S1.csv
DD3S2.csv(0.5920891529639701, 0.6418467016378244, 0.193...#97a431DD3S2.csv
DD3S3.csv(0.21044753832183283, 0.6773105080456748, 0.64...#36ada4DD3S3.csv
TMA.csv(0.5019607843137255, 0.5019607843137255, 0.501...#808080TMA.csv
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RoundTargetExpChanneltarget_lowerfull_columnmarkerlocalisationround_colorchannel_color
0R0AF488300c2af488AF488_Cell_Intensity_AverageAF488cell[0.28685356234627135, 0.13009829239513535, 0.2...[0.00784313725490196, 0.24313725490196078, 1.0]
1R0AF488300c2af488AF488_Cytoplasm_Intensity_AverageAF488cytoplasm[0.28685356234627135, 0.13009829239513535, 0.2...[0.00784313725490196, 0.24313725490196078, 1.0]
2R0AF488300c2af488AF488_Nucleus_Intensity_AverageAF488nucleus[0.28685356234627135, 0.13009829239513535, 0.2...[0.00784313725490196, 0.24313725490196078, 1.0]
3R0AF5551500c3af555AF555_Cell_Intensity_AverageAF555cell[0.28685356234627135, 0.13009829239513535, 0.2...[1.0, 0.48627450980392156, 0.0]
4R0AF5551500c3af555AF555_Cytoplasm_Intensity_AverageAF555cytoplasm[0.28685356234627135, 0.13009829239513535, 0.2...[1.0, 0.48627450980392156, 0.0]
.................................
103R8Sting1000c4stingSting_Cytoplasm_Intensity_AverageStingcytoplasm[0.7684256891219349, 0.8992667116749021, 0.817...[0.10196078431372549, 0.788235294117647, 0.219...
104R8Sting1000c4stingSting_Nucleus_Intensity_AverageStingnucleus[0.7684256891219349, 0.8992667116749021, 0.817...[0.10196078431372549, 0.788235294117647, 0.219...
105R8CD11b1500c5cd11bCD11b_Cell_Intensity_AverageCD11bcell[0.7684256891219349, 0.8992667116749021, 0.817...[0.9098039215686274, 0.0, 0.043137254901960784]
106R8CD11b1500c5cd11bCD11b_Cytoplasm_Intensity_AverageCD11bcytoplasm[0.7684256891219349, 0.8992667116749021, 0.817...[0.9098039215686274, 0.0, 0.043137254901960784]
107R8CD11b1500c5cd11bCD11b_Nucleus_Intensity_AverageCD11bnucleus[0.7684256891219349, 0.8992667116749021, 0.817...[0.9098039215686274, 0.0, 0.043137254901960784]
\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", + "
\n", + "
\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", + "
\n", + "
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RoundTargetExpChannel
0R0AF488300c2
1R0AF5551500c3
2R0AF6471500c4
3R0AF7501500c5
17R4AXL1500c3
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RoundTargetExpChanneltarget_lower
0R0AF488300c2af488
1R0AF5551500c3af555
2R0AF6471500c4af647
3R0AF7501500c5af750
4R1ColVI300c2colvi
\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", + " \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", + "
full_column
0AF488_Cell_Intensity_Average
1AF488_Cytoplasm_Intensity_Average
2AF488_Nucleus_Intensity_Average
3AF555_Cell_Intensity_Average
4AF555_Cytoplasm_Intensity_Average
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
full_columnmarkermarker_lower
0AF488_Cell_Intensity_AverageAF488af488
1AF488_Cytoplasm_Intensity_AverageAF488af488
2AF488_Nucleus_Intensity_AverageAF488af488
3AF555_Cell_Intensity_AverageAF555af555
4AF555_Cytoplasm_Intensity_AverageAF555af555
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
full_columnmarkermarker_lower
0AF488_Cell_Intensity_AverageAF488af488
1AF488_Cytoplasm_Intensity_AverageAF488af488
2AF488_Nucleus_Intensity_AverageAF488af488
3AF555_Cell_Intensity_AverageAF555af555
4AF555_Cytoplasm_Intensity_AverageAF555af555
\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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RoundTargetExpChanneltarget_lowerfull_columnmarker
0R0AF488300c2af488AF488_Cell_Intensity_AverageAF488
1R0AF488300c2af488AF488_Cytoplasm_Intensity_AverageAF488
2R0AF488300c2af488AF488_Nucleus_Intensity_AverageAF488
3R0AF5551500c3af555AF555_Cell_Intensity_AverageAF555
4R0AF5551500c3af555AF555_Cytoplasm_Intensity_AverageAF555
........................
103R8Sting1000c4stingSting_Cytoplasm_Intensity_AverageSting
104R8Sting1000c4stingSting_Nucleus_Intensity_AverageSting
105R8CD11b1500c5cd11bCD11b_Cell_Intensity_AverageCD11b
106R8CD11b1500c5cd11bCD11b_Cytoplasm_Intensity_AverageCD11b
107R8CD11b1500c5cd11bCD11b_Nucleus_Intensity_AverageCD11b
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
RoundTargetExpChanneltarget_lowerfull_columnmarkerlocalisation
0R0AF488300c2af488AF488_Cell_Intensity_AverageAF488cell
1R0AF488300c2af488AF488_Cytoplasm_Intensity_AverageAF488cytoplasm
2R0AF488300c2af488AF488_Nucleus_Intensity_AverageAF488nucleus
3R0AF5551500c3af555AF555_Cell_Intensity_AverageAF555cell
4R0AF5551500c3af555AF555_Cytoplasm_Intensity_AverageAF555cytoplasm
...........................
103R8Sting1000c4stingSting_Cytoplasm_Intensity_AverageStingcytoplasm
104R8Sting1000c4stingSting_Nucleus_Intensity_AverageStingnucleus
105R8CD11b1500c5cd11bCD11b_Cell_Intensity_AverageCD11bcell
106R8CD11b1500c5cd11bCD11b_Cytoplasm_Intensity_AverageCD11bcytoplasm
107R8CD11b1500c5cd11bCD11b_Nucleus_Intensity_AverageCD11bnucleus
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RoundTargetExpChanneltarget_lowerfull_columnmarkerlocalisationround_colorchannel_color
0R0AF488300c2af488AF488_Cell_Intensity_AverageAF488cell[0.28685356234627135, 0.13009829239513535, 0.2...[0.00784313725490196, 0.24313725490196078, 1.0]
1R0AF488300c2af488AF488_Cytoplasm_Intensity_AverageAF488cytoplasm[0.28685356234627135, 0.13009829239513535, 0.2...[0.00784313725490196, 0.24313725490196078, 1.0]
2R0AF488300c2af488AF488_Nucleus_Intensity_AverageAF488nucleus[0.28685356234627135, 0.13009829239513535, 0.2...[0.00784313725490196, 0.24313725490196078, 1.0]
3R0AF5551500c3af555AF555_Cell_Intensity_AverageAF555cell[0.28685356234627135, 0.13009829239513535, 0.2...[1.0, 0.48627450980392156, 0.0]
4R0AF5551500c3af555AF555_Cytoplasm_Intensity_AverageAF555cytoplasm[0.28685356234627135, 0.13009829239513535, 0.2...[1.0, 0.48627450980392156, 0.0]
.................................
103R8Sting1000c4stingSting_Cytoplasm_Intensity_AverageStingcytoplasm[0.7684256891219349, 0.8992667116749021, 0.817...[0.10196078431372549, 0.788235294117647, 0.219...
104R8Sting1000c4stingSting_Nucleus_Intensity_AverageStingnucleus[0.7684256891219349, 0.8992667116749021, 0.817...[0.10196078431372549, 0.788235294117647, 0.219...
105R8CD11b1500c5cd11bCD11b_Cell_Intensity_AverageCD11bcell[0.7684256891219349, 0.8992667116749021, 0.817...[0.9098039215686274, 0.0, 0.043137254901960784]
106R8CD11b1500c5cd11bCD11b_Cytoplasm_Intensity_AverageCD11bcytoplasm[0.7684256891219349, 0.8992667116749021, 0.817...[0.9098039215686274, 0.0, 0.043137254901960784]
107R8CD11b1500c5cd11bCD11b_Nucleus_Intensity_AverageCD11bnucleus[0.7684256891219349, 0.8992667116749021, 0.817...[0.9098039215686274, 0.0, 0.043137254901960784]
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RoundTargetExpChanneltarget_lowerfull_columnmarkerlocalisation
0R0AF488300c2af488AF488_Cell_Intensity_AverageAF488cell
1R0AF488300c2af488AF488_Cytoplasm_Intensity_AverageAF488cytoplasm
2R0AF488300c2af488AF488_Nucleus_Intensity_AverageAF488nucleus
3R0AF5551500c3af555AF555_Cell_Intensity_AverageAF555cell
4R0AF5551500c3af555AF555_Cytoplasm_Intensity_AverageAF555cytoplasm
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Nuc_XSample_IDNucleus_RoundnessNuc_Y_InvROI_indexCell_SizeNucleus_SizeAF488_Cell_Intensity_AverageAF488_Cytoplasm_Intensity_AverageAF488_Nucleus_Intensity_Average...r8c2_Cytoplasm_Intensity_Averager8c2_Nucleus_Intensity_AverageSting_Cell_Intensity_AverageSting_Cytoplasm_Intensity_AverageSting_Nucleus_Intensity_AverageVimentin_Cell_Intensity_AverageVimentin_Cytoplasm_Intensity_AverageVimentin_Nucleus_Intensity_Averagecell_typecell_subtype
ID
DD3S3_Cell_0823.567871DD3S3.csv0.83532415699.3828120281811996.3487551883.1500242275.851807...257.945007294.6419681358.5622561318.8349611456.6542972862.2526862464.3349613844.765381nonenone
DD3S3_Cell_1852.840027DD3S3.csv0.52342115690.5332030200752523.1999512450.0878912645.053223...301.056000325.8133241856.0050051954.3759771692.0533453007.5349123135.4960942794.266602nonenone
DD3S3_Cell_2868.272705DD3S3.csv0.68614715682.99414104251652864.3459472765.0461433020.818115...339.603851364.8242491969.5529792171.3039551651.6424561955.1882322099.0769041728.454590nonenone
DD3S3_Cell_4704.337280DD3S3.csv0.75762315683.05957004181693349.0239263018.8835453835.443848...350.662659433.1479191398.4760741301.9317631540.7219241861.6004641678.6666262131.130127nonenone
DD3S3_Cell_5852.893799DD3S3.csv0.71465115683.01757802011132366.1342772088.7158202582.177002...276.897736326.5929261328.6020511144.6817631471.8319091457.7263181205.8522951653.876099nonenone
\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": "iVBORw0KGgoAAAANSUhEUgAAAK4AAACHCAYAAACPr2IQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAVpklEQVR4nO2de1CU1f/H33thubisCIGIrdxvgqJUmmgkBYPklBphMlIgaqkIKVLqV+TiSJhUWzPlpWkFnUJNRbtQlNqud1BT0ESlGhGVJc1aCFkE4fz+YHh+PO0Cu+yGPbvnNfPMuOd8zuecZ+ft4TzPns/58AghBBQKx+A/7AFQKAOBCpfCSahwKZyECpfCSahwKZyECpfCSahwKZyECpfCSahwKZyECpfCSahwKZyECpfCSahwKZyECpfCSYSGNujo6EB7e/u/MRaKBSASicDnGz9f6i1cQggaGhqgVquN7pRiufD5fHh6ekIkEhnlh6fvRnKVSgW1Wg0XFxfY2dmBx+MZ1THF8ujs7ER9fT2srKwwatQoozSk14zb0dHBiNbJyWnAnVEozs7OqK+vx4MHD2BlZTVgP3otNrrXtHZ2dgPuiEIBwCwROjo6jPJj0CqZLg8oxmIqDdHXYRROQoVL4SRUuP2Qk5ODcePGMZ+TkpIwc+bMhzYeShdmLdyGhgakpqbCy8sL1tbWkEqleP7553H48OF/rc+ioiI4ODj8a/4pXRj8yxlXqK2txeTJk+Hg4ICCggKMGTMG7e3t+P7775GSkoIrV6487CFSjMBsZ9wlS5aAx+Ph9OnTiI2NhZ+fH4KCgpCeno7y8nLGTq1WY8GCBXB2doZEIsEzzzyDqqqqAfWpVCoxb948NDY2gsfjgcfjIScnB+vWrUNwcLCW/bhx47B27VoA/78Eyc3NZcayaNEitLW1MfadnZ3Iz8+Hp6cnbG1tERISgr179w5orFzHLGfcP//8E2VlZcjLy8OQIUO06nv+KY+Li4OtrS2+++47DB06FFu3bsWzzz6LmpoaODo6GtRvWFgYPvjgA2RlZeHq1asAALFYDLVajdzcXJw5cwZPPPEEAOD8+fO4cOECSkpKmPaHDx+GjY0NlEolamtrMW/ePDg5OSEvLw8AkJ+fj88++wxbtmyBr68vjh49ioSEBDg7O+Ppp5829GviNkQPNBoNqa6uJhqNRh/zh05FRQUBQEpKSvq0O3bsGJFIJKS1tZVV7u3tTbZu3UoIISQ7O5uEhIQwdYmJiWTGjBm9+iwsLCRDhw7VKo+JiSGLFy9mPqemppKpU6ey/Do6OpJ79+4xZZs3byZisZh0dHSQ1tZWYmdnR06ePMnyO3/+fBIfH9/nff6XMJWWzHLGJXqe41dVVYXm5matn7E1Gg1+++03k45p4cKFSE5Oxvvvvw8+n4/i4mLIZDKWTUhICOvXyUmTJqG5uRk3btxAc3MzWlpaEBUVxWrT1taG8ePHm3SsXMAshevr6wsej9fvA1hzczNGjBgBpVKpVWfqNwPPP/88rK2tsX//fohEIrS3t+Oll17Su31zczMAoLS0FCNHjmTVWVtbm3SsXMAshevo6Ijo6Gh8/PHHSEtL01rnqtVqODg4IDQ0FA0NDRAKhfDw8DBJ3yKRSOfv8EKhEImJiSgsLIRIJMKcOXNga2vLsqmqqoJGo2HKy8vLIRaLIZVK4ejoCGtra9TV1VneelYHZilcAPj4448xefJkTJgwAevWrcPYsWPx4MEDHDx4EJs3b8bly5cRGRmJSZMmYebMmdi4cSP8/PxQX1+P0tJSzJo1C48//rjB/Xp4eKC5uRmHDx9m/vR3//lfsGABAgMDAQAnTpzQatvW1ob58+cjMzMTtbW1yM7OxtKlS8Hn82Fvb4+MjAwsX74cnZ2dmDJlChobG3HixAlIJBIkJiYa94VxjcFcUA829fX1JCUlhbi7uxORSERGjhxJXnjhBaJQKBibpqYmkpqaStzc3IiVlRWRSqVk7ty5pK6ujhBi+MMZIYQsWrSIODk5EQAkOzubVffUU0+RoKAgrTbdfrOysoiTkxMRi8Vk4cKFrAfHzs5O8sEHHxB/f39iZWVFnJ2dSXR0NDly5IjB383DwlRa0msjeWtrK65duwZPT0/Y2NgMwn8n84QQAl9fXyxZsgTp6emsuqSkJKjVahw4cODhDG6QMJWWzHap8F/jzp072LVrFxoaGjBv3ryHPRzOQ4U7SLi4uOCRRx7BJ598gmHDhj3s4XAeKtxBor8VWVFR0eAMxEww270KFPOGCpfCSahwKZyECpfCSahwKZyECpfCSYx+Heb9rrcpxqEXv2UMbKthQ0MD8vLyUFpailu3bsHFxQXjxo3DsmXL8OyzzzJ2+fn5yMzMxIYNG/Dmm2+yfBQVFWHevHmIjo5GWVkZU65WqzFs2DAoFApMnTqVKVcoFCgoKEBFRQU0Gg08PDwQExOD9PR0jBw5EkqlEhERETrHq1Kp4OrqipycHOTm5gLoOnPLzc0NMTEx2LBhg8Gb3M0Ns59xa2tr8dhjj+HHH39EQUEBLl68iLKyMkRERCAlJYVlu23bNrz11lvYtm2bTl9CoRCHDh2CQqHos8+tW7ciMjISrq6u2LdvH6qrq7FlyxY0NjbivffeY9levXoVKpWKdbm4uDD1QUFBUKlUqKurQ2FhIcrKyrB48eIBfhvmg9n/ANEz9qzn9sagoCAkJyczn48cOQKNRoN169Zhx44dOHnyJMLCwli+hgwZgtmzZ2PVqlWoqKjQ2d/NmzeRlpaGtLQ01kZxDw8PhIeHa5126eLi0ufeX6FQCFdXVwDAyJEjERcXh8LCQn1v32wx6xm3O/YsJSWl39gzuVyO+Ph4WFlZIT4+HnK5XKfPnJwcXLx4sdcgxT179qCtrQ1vvfWWznpjNqjX1tbi+++/N/qITnPArIX766+/ghCCgICAPu2ampqwd+9eJCQkAAASEhLwxRdfMFEHPXFzc8Mbb7yBNWvW4MGDB1r1v/zyCyQSCUaMGKHXGB999FGIxWLmCgoKYtVfvHgRYrEYtra28PT0xKVLl7By5Uq9fJszZi1cPXZsAgB27twJb29vhISEAOgKG3d3d8fu3bt12q9cuRJ37tzRuRYmhBh0sNuxY8dQWVnJXN9++y2r3t/fH5WVlThz5gxWrlyJ6OhopKam6u3fXDFr4eobeyaXy3Hp0iUIhULmqq6u7vUhzcHBAatXr0Zubi5aWlpYdX5+fmhsbIRKpdJrjJ6envDx8WEud3d3Vr1IJIKPjw+Cg4OxYcMGCAQC5k2DJWPWwu0Ze3bv3j2terVajYsXL+Ls2bNQKpWsmU+pVOLUqVO9ij41NRV8Ph8ffvghq/yll16CSCTCxo0bdbYzNhVBZmYm3n33XdTX1xvlh+uY/VuF/mLPoqOjMWHCBISHh2u1feKJJyCXy1FQUKBVZ2Njg9zcXK1XalKpFDKZDEuXLkVTUxNeffVVeHh44ObNm9ixYwfEYjHrldjt27fR2trK8uHk5NTrad2TJk3C2LFj8fbbb+Ojjz4ayFdiFpj1jAsAXl5eOHfuHCIiIrBixQoEBwcjKioKhw8fxocffojPPvsMsbGxOtvGxsZix44dvWYZSkxMhJeXl1b5kiVL8MMPP+DWrVuYNWsWAgICsGDBAkgkEmRkZLBs/f39MWLECNb1008/9XlPy5cvx6effoobN27o+S2YHzTmjDKomEpLZj/jUswTKlwKJ6HCpXASKlwKJ6HCpXASKlwKJ6HCpXASKlwKJ6HCpXASKlwKJzF6k83rr79uinHoxdatWw1uc+fOHWRlZaG0tBS///47hg0bhpCQEISHhyMzM7PPtgqFgsl+A3QlUB4+fDjCw8NRUFCAUaNGsewvXbqE3NxcKBQKNDU1wd3dHXPmzMGqVatYuR08PDxw/fp17Ny5E3PmzGH5CAoKQnV1NQoLC5GUlMSq6yuY09Iw+xk3NjYW58+fx/bt21FTU4OvvvoKU6dOxZgxY1gBirNnz8a0adNYZd0xZxKJBCqVCrdu3cK+fftw9epVxMXFsfopLy/HxIkT0dbWhtLSUtTU1CAvLw9FRUWIiopi5SsDunaR/TN2rLy8HA0NDTrDjID+gzktCbPe1qhWq3Hs2DEolUomb4K7uzsmTJigZWtra4v79+8zgYk94fF4TPmIESMwf/58pKWloampCRKJBIQQzJ8/H4GBgSgpKQGfz2f68vPzw/jx4yGTyVghN3PnzoVMJsONGzcglUoBdAlz7ty52LFjh9YY9AnmtCTMesbtjuM6cOAA7t+/bxKft2/fxv79+yEQCCAQCAAAlZWVqK6uRnp6OiPabkJCQhAZGYmdO3eyyocPH47o6Ghs374dANDS0oLdu3ezIo97om8wp6Vg1sIVCoUoKirC9u3b4eDggMmTJ+N///sfLly4YJCfxsZGiMViDBkyBMOHD4dCoWBFDtfU1AAAk5jknwQGBjI2PUlOTkZRUREIIdi7dy+8vb1Zmdq7MSSY01Iwa+ECXWvc+vp6fPXVV5g2bRqUSiVCQ0MNOkjZ3t4elZWVOHv2LN577z2EhoYyaUp7om9wZjfTp09Hc3Mzjh49im3btvU62xoazGkJmL1wga4wm6ioKKxduxYnT55EUlISsrOz9W7P5/Ph4+ODwMBApKen48knn2SdJuPn5wcAuHz5ss72ly9fZmx6IhQK8corryA7OxsVFRWYO3euzvaGBnNaAhYh3H8yevRoncGT+rJq1Srs3r0b586dA9A1AwYEBEAmk6Gzs5NlW1VVhUOHDiE+Pl6nr+TkZBw5cgQzZszQmRtioMGc5o5Zv1W4e/cu4uLikJycjLFjx8Le3h5nz57Fxo0bMWPGjAH7lUqlmDVrFrKysvDNN9+Ax+NBLpcjKioKsbGxWL16NVxdXVFRUYEVK1Zg0qRJWLZsmU5fgYGB+OOPP1jveXsil8sHFMxp7pj1jCsWizFx4kTIZDKEh4cjODgYa9euxcKFC42OkF2+fDlKS0tx+vRpAEBYWBjKy8shEAgQExMDHx8frF69GomJiTh48GCf+XadnJy00qMCXZkmjQnmNGdosCRlUKHBkhSLhgqXwkmocCmchAqXwkmocCmchAqXwkmocCmchAqXwkmocCmchAqXwklMIFzeIF6Gk5SUhJkzZzL/5vF4WLRokZZdSkoKeDweK0DRUPupU6fq3ExTVFTEShOVk5Oj029lZSV4PB5qa2sBdKWH4vF4Oq/y8nK9vwNzxOJmXKlUil27dkGj0TBlra2tKC4u1oraHYi9vtjY2EAul+OXX37p1/bQoUNa2Scfe+yxAfdtDliccENDQyGVSlFSUsKUlZSUYNSoURg/frzR9vri7++PiIgIrFmzpl9bJycnuLq6sq7eckRYChYnXKBr83bP0PBt27YxZyeYwl5fNmzYgH379uHs2bNG+7I0LFK4CQkJOH78OK5fv47r16/jxIkTTCCiKez1JTQ0FLNnz+43U2RYWBgr+6RYLDa6b65j1hEQveHs7Izp06czEbbTp0/HI488YjJ7Q1i/fj0CAwPxww8/sLKm92T37t29RhBbKhYpXKDrz//SpUsBdOVCM4W9RCJBY2OjVrlarcbQoUN1tvH29sbChQuxatWqXs9KkEql8PHx6XeMloRFLhUAYNq0aWhra0N7ezuio6NNYu/v788EUPbk3LlzOqN8u8nKykJNTQ127dql/w1YOBY74woEAiacvPtEGmPtFy9ejI8++ghpaWlYsGABrK2tUVpaip07d+Lrr7/u1ffw4cORnp7ea9Dj3bt30dDQwCpzcHCw6DAqi51xga4/7RKJxGT2Xl5eOHr0KK5cuYLIyEhMnDgRX3zxBfbs2YNp06b16TsjI6PXh67IyEit7JMHDhzQe9zmCA2WpAwqNFiSYtFQ4VI4CRUuhZNQ4VI4CRUuhZNQ4VI4CRUuhZNQ4VI4CRUuhZNQ4VI4idGbbHJ5uaYYh15kE/3zNnSTlJTEpGTqSXR0NMrKypgsj6dOncKTTz7J1C9btow5sh7oCnDMze26V4FAAAcHB4wePRovvvgiFi9erHVwc39ZJpVKJSIiIvoce3dmy2XLlkGtVmvV83g87N+/nwkG5fF0B5R2Z7Ds7vOvv/5iBW92k5OTgwMHDqCyspJVfvPmTXh5ecHPzw8///xzv+MYDCxixv1nxkiVSsXKO2ZjY9NvFALQla5UpVKhrq4OCoUCcXFxyM/PR1hYGP7++2/GTp8sk2FhYXpntjSEwsJCrXs1VlBFRUWYPXs2mpqaUFFRYZQvU2ER2xqtra11Zozs5rXXXsOWLVvw7bff4rnnnuvVTigUMn7c3NwwZswYREVFISQkBO+88w7Wr19vUJbJnmPqK7OlITg4OBjtoyeEEBQWFmLTpk149NFHIZfLMXHiRJP5HygWMeP2h6enJxYtWoTVq1drZc3pj4CAAMTExDBRwAPJMvlfRqFQoKWlBZGRkUhISMCuXbuMylhkKixCuN98841WsOHbb7/NssnMzMS1a9fw+eefG+w/ICCAOcRjoFkm+6I7s6U+AZPx8fFadnV1dQb11xO5XI45c+ZAIBAgODgYXl5e2LNnz4D9mQqLWCpERERg8+bNrDJHR0fWZ2dnZ2RkZCArKwsvv/yyQf4JIVoPRoZmmewLe3t7nSFBvr6+WmUymQyRkZGsMjc3twH1q1arUVJSguPHjzNlCQkJkMvlrBN8HgYWIdwhQ4boFWyYnp6OTZs2YdOmTQb5v3z5Mjw9PQGws0zqOjCktyyTfdGd2VIfXF1dTRZYWVxcjNbWVtaalhCCzs5O1NTUGHwfpsQilgr6IhaLsXbtWuTl5bHeEvTFlStXUFZWxuQiMybL5H8NuVyOFStWsDJaVlVV4amnnnro6VgtYsa9f/++VrChUCjUeTbCa6+9BplMhuLiYq2n5wcPHqChoQGdnZ24e/culEol1q9fj3HjxuHNN98EAKOyTJoCtVqtda/29vZMpnegK82qvb0985nH4zEJrruprKzEuXPn8PnnnyMgIIBVFx8fj3Xr1mH9+vUQCrskdO3aNa33v76+vqx+TQrRA41GQ6qrq4lGo9HH/D9FYmIiAaB1+fv7E0IIcXd3JzKZjNWmuLiYACBPP/00U5adnc20FQgExNHRkUyZMoXIZDLS2tqq1e+FCxdIbGwscXR0JFZWVsTb25tkZmaSe/fu9TrOGTNmaJUXFhaSoUOH6mwDgOzfv5/1WdeVn59PCCFEoVDorBcIBMw9hoSEEEIIWbp0KRk9erTOflUqFeHz+eTLL7/ss99jx45ptTWVlmiwJGVQocGSFIuGCpfCSahwKZyECpfCSQwSrh7PcRRKn5hKQ3oJt/vY9paWFpN0SrFc2traAOh30GBf6PUDRPfG6du3bwMA7Ozset20TKH0RmdnJ+7cuQM7Ozvmh4uBonfr7j2e3eKlUAYCn8/HqFGjjJ749PoBoicdHR1ob283qlOK5SISibT2KQ8Eg4VLofwXoK/DKJyECpfCSahwKZyECpfCSahwKZyECpfCSahwKZzk/wASffYcfzO+MQAAAABJRU5ErkJggg==", + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
RoundTargetExpChanneltarget_lowerfull_columnmarkerlocalisation
0R0AF488300c2af488AF488_Cell_Intensity_AverageAF488cell
1R0AF488300c2af488AF488_Cytoplasm_Intensity_AverageAF488cytoplasm
2R0AF488300c2af488AF488_Nucleus_Intensity_AverageAF488nucleus
3R0AF5551500c3af555AF555_Cell_Intensity_AverageAF555cell
4R0AF5551500c3af555AF555_Cytoplasm_Intensity_AverageAF555cytoplasm
...........................
103R8Sting1000c4stingSting_Cytoplasm_Intensity_AverageStingcytoplasm
104R8Sting1000c4stingSting_Nucleus_Intensity_AverageStingnucleus
105R8CD11b1500c5cd11bCD11b_Cell_Intensity_AverageCD11bcell
106R8CD11b1500c5cd11bCD11b_Cytoplasm_Intensity_AverageCD11bcytoplasm
107R8CD11b1500c5cd11bCD11b_Nucleus_Intensity_AverageCD11bnucleus
\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": "iVBORw0KGgoAAAANSUhEUgAAAL8AAAEvCAYAAAAU+xDxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAvH0lEQVR4nO3de1yM6f8/8NdUmnRQSURS0UEpOdbGB0Ukh8VKRLaQXeQQi5JDsR3Qxzcf381pdbKUU4UlOZZziHIqsj7FYlrHEEmZ6/eHX/e3MVPNNFNTc1/Px2Mej537vu77vu7ZV7f7nrnf98UhhBBQFAspybsDFCUvNPwUa9HwU6xFw0+xFg0/xVo0/BRr0fBTrEXDT7EWDT/FWjT8FGvR8FOsRcNPsRYNP8VaNPwUa6lIusCXL19QUVHREH2hKLGoqqpCSUn647bY4SeEoLi4GCUlJVJvlKKkoaSkBFNTU6iqqkq1Ho64xSw8Hg8lJSVo27Yt1NXVweFwpNowRdUHn8/Hs2fP0KJFC3Tq1EmqHIp15P/y5QsTfD09vXpvjKJkQV9fH8+ePUNlZSVatGhR7/WIdeJUdY6vrq5e7w1RlKxUne58+fJFqvVIdNVAT3WopkBWOaRfdVKsRcP/jZCQEPTo0YN57+Pjg7Fjxzba9qjGo1DhLy4uxrx589C5c2dwuVwYGRlh9OjROH36tLy7JpWG/gNkK4l/5GqqioqK0L9/f+jo6CAyMhK2traoqKjA8ePH4efnh3v37sm7i1QTozBH/jlz5oDD4eDq1asYP348LCws0K1bNyxatAhZWVlMu5KSEvj6+kJfXx+tWrXC4MGDcfPmzXpv99GjRxg9ejR0dXWhoaGBbt26IS0tDQAQHx8PHR0dgfYHDx4UecG2bds2GBkZQV1dHR4eHnj79i2Ar6dFCQkJOHToEDgcDjgcDjIzMzF48GDMnTtXYB0vXryAqqoq8y+diYkJfv31V3h6ekJDQwOGhoaIjo4WWEbWn0dzohDhf/36NdLT0+Hn5wcNDQ2h+dUDOGHCBDx//hzHjh3D9evX0atXLwwZMgSvX7+u17b9/PxQXl6Oc+fO4fbt21i3bh00NTUlWsdff/2Fffv24c8//0R6ejpycnIwZ84cAMDixYvh4eGB4cOHg8fjgcfjoV+/fvD19UViYiLKy8uZ9ezatQuGhoYYPHgwMy0yMhJ2dnbIyclBYGAgFixYgJMnTzbY59GsEDGUlZWRvLw8UlZWJk7zRnflyhUCgKSkpNTa7vz586RVq1bk06dPAtO7dOlCtm3bRgghJDg4mNjZ2THzvL29yZgxY2pcp62tLQkJCRE5Ly4ujmhrawtMS01NJdU/9uDgYKKsrEyePHnCTDt27BhRUlIiPB6vxj6UlZURXV1dsnfvXmZa9+7dBfpibGxMhg8fLrDcxIkTiZubGyFEvM+jKZJVHhXiyE/EfNzozZs3UVpaCj09PWhqajKvwsJCPHz4sF7bnj9/PkJDQ9G/f38EBwfj1q1bEq+jU6dOMDQ0ZN47OjqCz+fj/v37NS6jpqaGqVOnIjY2FgBw48YN3LlzBz4+PgLtHB0dhd7n5+cDaJjPozlRiAtec3NzcDicOi9qS0tL0b59e2RmZgrN+/bcXFy+vr5wdXXF0aNHceLECURERGDDhg2YN28elJSUhP4wZXlHrK+vL3r06IEnT54gLi4OgwcPhrGxsdjLN8Tn0ZwoxJG/devWcHV1RXR0ND58+CA0v+pO1F69eqG4uBgqKiowMzMTeLVp06be2zcyMsKsWbOQkpKCX375Bb///juAr/egvH//XqBPubm5Qss/fvwYz549Y95nZWVBSUkJlpaWAL7+nC/qp3xbW1v06dMHv//+OxITEzF9+nShNtUv9qveW1lZAWi4z6O5UIjwA0B0dDS+fPkCe3t7JCcn48GDB8jPz8emTZuYf/pdXFzg6OiIsWPH4sSJEygqKsKlS5ewfPlyZGdn12u7/v7+OH78OAoLC3Hjxg1kZGQw4XJwcIC6ujqCgoLw8OFDJCYmIj4+Xmgdampq8Pb2xs2bN3H+/HnMnz8fHh4eMDAwAPD1W5tbt27h/v37ePnypcC/Hr6+vli7di0IIRg3bpzQui9evIj169ejoKAA0dHR2L9/PxYsWNBgn0ez0pgXGA3t2bNnxM/PjxgbGxNVVVViaGhIvv/+e5KRkcG0effuHZk3bx7p0KEDadGiBTEyMiJTpkwhjx8/JoRIfsE7d+5c0qVLF8Llcom+vj6ZOnUqefnyJTM/NTWVmJmZkZYtW5JRo0aR7du3C13w2tnZkc2bN5MOHToQNTU14u7uTl6/fs20ef78ORk6dCjR1NQkAAT25/3790RdXZ3MmTNHqG/GxsZk9erVZMKECURdXZ0YGBiQ//znPwJt6vo8miJZ5VGs+/k/ffqEwsJCmJqaQk1NreH/IimxFRUVoUuXLrh27Rp69eolMM/ExAT+/v7w9/eXT+caiKzyqBAXvGxUUVGBV69eYcWKFfjuu++Egk/VTWHO+dnm4sWLaN++Pa5du4atW7fKuzvNEj3yN1NOTk51/r5RVFTUOJ1ppuiRn2ItGn6KtWj4Kdai4adYi4afYi0afoq1aPgp1pL6e/6knCey6IdYPHt2lHgZHx8fJCQkAABUVFTQunVrdO/eHZ6envDx8RF44GlOTg7Cw8Nx7tw5vH37FkZGRnBycsKSJUtgYWEhs/2gmgZWHPmrSgCLiopw7NgxODs7Y8GCBRg1ahQqKysBAEeOHMF3332H8vJy7N69G/n5+di1axe0tbWxcuVKOe8B1RBY8Qsvl8tlbg82NDREr1698N1332HIkCGIj4/H5MmTMW3aNIwYMQKpqanMcqampnBwcKBPplZQrAi/KIMHD4adnR1SUlKgp6eHly9fYunSpSLbsqGqiY1YcdpTk65du6KoqAgPHjxg3lPswerwE0LA4XDELoCnFAurw5+fnw9TU1Pmmxz6VDd2YW34z5w5g9u3b2P8+PEYNmwY2rRpg/Xr14tsSy94FRMrLnjLy8tRXFyML1++4J9//kF6ejoiIiIwatQo/Pjjj1BWVsaOHTswYcIEfP/995g/fz7MzMzw8uVL7Nu3D48fP8aePXvkvRuUjLEi/Onp6Wjfvj1UVFSgq6sLOzs7bNq0Cd7e3syPXGPGjMGlS5cQERGByZMn4927dzAyMsLgwYMRGhoq5z2gGgItYKeaHVnlkbXn/BRFw0+xFg0/xVo0/BRr0fBTrEXDT7EWDT/FWjT8FGvR8FOsRcNPsZbU9/aYLDsqi36IpShipMTLVC9gB74OYdS3b1+sX78e3bt3l2X3qGaGFUf+6mPYnj59GioqKhg1apS8u0XJGSvCX1XAbmBggB49eiAwMBB///03Xrx4Ie+uUXLEivBXV1pail27dsHMzAx6enry7g4lR6y4n//IkSPQ1NQEAHz48AHt27fHkSNHBB5YRbEPK/7vOzs7Izc3F7m5ubh69SpcXV3h5uaGR48eybtrlByxIvwaGhrM4Mp9+/bFjh078OHDB2awaIqdWBH+b3E4HCgpKaGsrEzeXaHkiBXn/FUF7ADw5s0b/PbbbygtLcXo0aPl3DNKnlgR/qoCdgDQ0tJC165dsX//fjg5Ocm3Y5Rc0QJ2qtmhBewUJSUafoq1aPgp1qLhp1iLhp9iLRp+irVo+CnWouGnWIuGn2ItGn6KtaS+t+fPokhZ9EMso02WiN2Ww+HUOj84OBghISF1jrpeVFQEU1NTZjlNTU106tQJTk5O8Pf3h7m5ucj1X7x4EYMGDYKNjQ1yc3PF7jfVeBT2yF9VsM7j8bBx40a0atVKYNrixYslGnX91KlT4PF4uHnzJsLDw5Gfnw87OzucPn1aaNslJSX48ccfMWTIkMbaXaoeFPauzqoR1wFAW1sbHA5HYNrHjx8lGnVdT0+PWb5z584YPXo0hgwZghkzZuDhw4dQVlZm2s6aNQuTJ0+GsrIyDh482DA7SElNYY/8dTl+/LhUo64rKSlhwYIFePToEa5fv85Mj4uLw3//+18EBwfLsrtUA2Bt+GUx6nrVskVFRcw6AwMDsWvXLqioKOw/qgqDteGXxajrVevgcDj48uULJk+ejNWrVzODWlNNG2sPT9VHXXd0dKzXOvLz8wF8vU54//49srOzkZOTg7lz5wIA+Hw+CCFQUVHBiRMnMHjwYNl0npIJ1oa/+qjr1S94q5SUlNR63s/n87Fp0yaYmpqiZ8+e4HA4uH37tkCbzZs348yZMzhw4IDA16VU08Da8GtoaEg06vqrV69QXFyMjx8/4s6dO9i4cSOuXr2Ko0ePMt/02NjYCGyjbdu2UFNTE5pONQ2sDT8g2ajrLi4uAAB1dXUYGxvD2dkZ27dvh5mZmTy6TskALWCnmh1awE5RUqLhp1iLhp9iLRp+irVo+CnWouGnWIuGn2ItGn6KtWj4Kdai4adYS+p7e/ok2MqiH2LJ9r5dd6P/T14F7Lt378b69evx4MEDaGtrw83NDZGRkXTY0yZIYY/88ihgv3jxIn788UfMmDEDd+/exf79+3H16lXMnDmzsXefEoPC3tUpjwL2y5cvw8TEBPPnz2fW9fPPP2PdunUNuKdUfSnskb8uDVHA7ujoiL///htpaWkghOCff/7BgQMHMGLECFl3n5IB1oa/IQrY+/fvj927d2PixIlQVVWFgYEBtLW1ER0dLXV/KdljbfhlXcAOAHl5eViwYAFWrVqF69evIz09HUVFRZg1a5bU26JkT2HP+esi6wJ2AIiIiED//v2xZMnXxyp2794dGhoaGDBgAEJDQ5nhUKmmgbVH/uoF7KJ8e8H7rW8L2IGvF9FKSoIfaVV9ryz+paFki7VH/oYoYB89ejRmzpyJLVu2wNXVFTweD/7+/rC3t0eHDh3ktatUTYgYysrKSF5eHikrKxOneZMTFxdHtLW1Rc67du0a+eGHH4i+vj7hcrnEzMyM/PTTT+TBgweEEEIKCwsJAOalrq5OrKysyJw5c5g21W3atIlYW1uTli1bkvbt25MpU6aQJ0+eNOTusY6s8kgL2KlmhxawU5SUaPgp1qLhp1iLhp9iLRp+irVo+CnWouGnWIuGn2ItGn6KtWj4KdaS+sa2yt+3y6IfYlGZ+ZPEy/j4+CAhIQE///wztm7dKjDPz88Pmzdvhre3N+Lj43Hu3DlERkbi+vXr4PF4SE1NxdixY2XUe6qpYcWR38jICHv27EFZWRkz7dOnT0hMTESnTp2YaR8+fICdnR2tvGIJVtzS3KtXLzx8+BApKSmYMmUKACAlJQWdOnUSeCyJm5sb3Nzc5NVNqpGx4sgPANOnT0dcXBzzPjY2FtOmTZNjjyh5Y034vby8cOHCBTx69AiPHj3CxYsX4eXlJe9uUXLEitMeANDX18fIkSMRHx8PQghGjhyJNm3ayLtblByxJvzA11OfqtHR6UUtxarwDx8+HJ8/fwaHw4Grq6u8u0PJGavCr6yszDxupKrovLrS0lL89ddfzPvCwkLk5uaidevWAl+JUopB6vDX54cneWrVqlWN87Kzs+Hs7My8X7RoEQAwP4JRioUWsFPNDi1gpygp0fBTrEXDT7EWDT/FWjT8FGvR8FOsRcNPsRYNP8VaNPwUa9HwU6wl9b09TwyNZNEPsXR8+rfEy0hSwB4REYGUlBTcu3cPLVu2RL9+/bBu3TpYWlrKaheoJoQVR35xC9jPnj0LPz8/ZGVl4eTJk6ioqMCwYcPw4cMHeXSbamCsuKVZ3AL29PR0geXi4+PRtm1bXL9+HQMHDmzUPlMNjxVHfqB+Bexv374FALRu3bpB+0bJB2vCL2kBO5/Ph7+/P/r37w8bG5tG7CnVWFhx2gNIXsDu5+eHO3fu4MKFC43YS6oxsSb8gPgF7HPnzsWRI0dw7tw5dOzYsbG6RzUyVoW/rgJ2QgjmzZuH1NRUZGZmClwMU4qHVeGvq4Ddz88PiYmJOHToELS0tFBcXAwA0NbWRsuWLRu1r1TDkzr89fnhSZ5qK2DfsmULAMDJyUlgelxcHHx8fBqwV5Q80AJ2qtmhBewUJSUafoq1aPgp1qLhp1iLhp9iLRp+irVo+CnWouGnWIuGn2ItGn6KtaS+t4ef6S+DbohHyWmj2G05HE6t84ODgxESEiJdh6hmTWHv6uTxeMx/7927F6tWrcL9+/eZaZqamsx/E0Lw5csXqKgo7MdBiaCwpz0GBgbMS1tbGxwOh3l/7949aGlp4dixY+jduze4XC4uXLgAPp+PiIgImJqaomXLlrCzs8OBAwcE1nv48GGYm5tDTU0Nzs7OSEhIAIfDQUlJiXx2lKo3Vh/qAgMD8e9//xudO3eGrq4uIiIisGvXLmzduhXm5uY4d+4cvLy8oK+vj0GDBqGwsBDu7u5YsGABfH19kZOTg8WLF8t7N6h6YnX416xZg6FDhwIAysvLER4ejlOnTsHR0REA0LlzZ1y4cAHbtm3DoEGDsG3bNlhaWiIyMhIAYGlpiTt37iAsLExu+0DVH6vD36dPH+a///rrL3z8+JH5Y6jy+fNn9OzZEwBw//599O3bV2C+vb19w3eUahCsDr+Ghgbz36WlpQCAo0ePwtDQUKAdl8tt1H5RjYPV4a/O2toaXC4Xjx8/xqBBg0S2sbS0RFpamsC0a9euNUb3qAZAw///aWlpYfHixVi4cCH4fD7+9a9/4e3bt7h48SJatWoFb29v/Pzzz/if//kfBAQEYMaMGcjNzWUGp67rdwWqCSJiKCsrI3l5eaSsrEyc5k1OXFwc0dbWZt5nZGQQAOTNmzcC7fh8Ptm4cSOxtLQkLVq0IPr6+sTV1ZWcPXuWaXPo0CFiZmZGuFwucXJyIlu2bCEAmu1n0xzJKo+0gF1KYWFh2Lp1K/7+u3k9xaI5k1Ue6WmPhDZv3oy+fftCT08PFy9eRGRkJPMUOKp5oeGX0IMHDxAaGorXr1+jU6dO+OWXX7Bs2TJ5d4uqB3raQzU79Lk9FCUlGn6KtWj4Kdai4adYi4afYi0afoq1aPgp1pI+/CGcxnvVg4+PD8aOHcv8N4fDwaxZs4Ta+fn5gcPhCAxCIWl7Jycn+Pv7C7WNj4+Hjo7O/31kISEi15ubmwsOh4OioiIAQFFRETgcjshXVlaWWPtfVlaG4OBgWFhYgMvlok2bNpgwYQLu3r3LtDExMalxO9X3kcPh4ODBg0LbqP4ZV70XtZ7hw4eL3Ka6ujpsbW2xY8cOsfZJVlh35Bd3NPb6theXmpoaYmJi8ODBgzrbnjp1CjweT+DVu3fvOpcrLy+Hi4sLYmNjERoaioKCAqSlpaGyshIODg7MH9C1a9eY9SYnJwP4WrhTNe0///mPxPs3fPhwoT4nJSUJtFmzZg14PB7u3LkDLy8vzJw5E8eOHZN4W/XFuvD36tULRkZGSElJYaZVjcZeVbElTXtxWVpawtnZGcuXL6+zrZ6enkBBvoGBAVq0aFHnchs3bsTly5dx5MgReHh4wNjYGPb29khOToaVlRVmzJgBQgj09fWZ9VYNuN22bVuBBwBIisvlCvVZV1dXoI2WlhYMDAzQuXNnBAQEoHXr1jh58qTE26ov1oUfkHw09vqM3i6OtWvXIjk5GdnZ2VKvS5TExEQMHToUdnZ2AtOVlJSwcOFC5OXl4ebNmw2ybUnw+XwkJyfjzZs3UFVVbbTtsjL8ko7GLml7cfXq1QseHh4ICAiotV2/fv2gqakp8BJHQUEBrKysRM6rml5QUCBRnz09PYX6snv3bqF2R44cEWoXHh4u0CYgIACamprgcrlwd3eHrq4ufH19JeqPNFh5V6eko7FL2l4SoaGhsLKywokTJ9C2bVuRbfbu3VtjiOsixn2LEomKioKLi4vAtICAAHz58kVgmrOzMzO6ZZWqU6oqS5YsgY+PD3g8HpYsWYI5c+bAzMxMpv2tDSvDD4g/Grsk7Vu1aoW3b98KTS8pKanxvLlLly6YOXMmAgMDERMTI7KNkZFRvUJhYWHBjDv8rarpFhYWEq3TwMBAqC9aWlpCD+3S0NCos89t2rSBmZkZzMzMsH//ftja2qJPnz6wtraWqE/1xcrTHuD/RmOvqKgQORp7fdpbWlrixo0bQtNv3LhRa8hWrVqFgoIC7NmzR/wdEMOkSZNw6tQpofN6Pp+PqKgoWFtbC10PyIuRkREmTpzYqLURrD3y1zUae33az549G7/99hvmz58PX19fcLlcHD16FElJSfjzzz9rXHe7du2waNEi5mFY33r16hUzGnwVHR2dOu9lX7hwIQ4dOoTRo0djw4YNcHBwwD///IPw8HDk5+fj1KlTDVZ4X15eLtRnFRWVWk8XFyxYABsbG2RnZws8U6mhSB/+ENmeUzam2kZjr0/7zp0749y5c1i+fDlcXFzw+fNndO3aFfv37xf4gUeUxYsXY8uWLfj06ZPQvG/PsQEgKSkJkyZNqnWdampqOHPmDMLDwxEUFIRHjx5BS0sLzs7OyMrKgo2NTa3LSyM9PR3t27cXmGZpaYl79+7VuIy1tTWGDRuGVatWCT0ipiHQSi6q2aGVXBQlJRr+Zqxbt25C36XX9t07JYi1F7yKIC0tDRUVFSLntWvXrpF70/zQ8DdjxsbG8u5Cs0ZPeyjWouGnWIuGn2ItGn6KtWj4Kdai4adYS+qvOq/9KfqW2YbQd3T97mkvLi5GWFgYjh49iqdPn6Jt27bo0aMH/P39MWTIEKZdREQEVqxYgbVr12LJkiUC64iPj8e0adPg6uqK9PR0ZnpJSQl0dXWRkZEBJycnZnpGRgYiIyNx5coVlJWVwcTEBG5ubli0aBEMDQ2RmZkJZ2dnkf3l8XgwMDBASEgIVq9eDeBr9VWHDh3g5uaGtWvXCt0bT0lO4Y/8RUVF6N27N86cOYPIyEjcvn0b6enpcHZ2hp+fn0Db2NhYLF26FLGxsSLXpaKiglOnTiEjI6PWbW7btg0uLi4wMDBAcnIy8vLysHXrVrx9+xYbNmwQaFu9ULzqVb2opVu3buDxeHj8+DHi4uKQnp6O2bNn1/PToKpT+B+55syZAw6Hg6tXrwqMvtitWzdMnz6deX/27FmUlZVhzZo12LlzJy5duoR+/foJrEtDQwMeHh4IDAzElStXRG7vyZMnmD9/PubPn4+oqChmuomJCQYOHChU9NG2bVuBx5p8S0VFBQYGBgAAQ0NDTJgwQaCemKo/hT7yv379Gunp6fDz8xMIfpXqoYuJiYGnpydatGgBT0/PGquqQkJCcPv2bRw4cEDk/P379+Pz589YunSpyPm1Bb0uRUVFOH78eKMWeSsyhQ7/X3/9BUIIunbtWmu7d+/e4cCBA0xRupeXF/bt28eMzVtdhw4dsGDBAixfvhyVlZVC8x88eIBWrVoJ3ctek44dOwrckNatWzeB+bdv34ampiZatmwJU1NT3L17t86Cd0o8Ch1+cYu3k5KS0KVLF6akr0ePHjA2NsbevXtFtg8ICMCLFy9EXhsQQiSqjjp//jxyc3OZ17dFHJaWlsjNzcW1a9cQEBAAV1dXzJs3T+z1UzVT6PCbm5uDw+HUWj0EfD3luXv3LlRUVJhXXl5ejRe+Ojo6WLZsGVavXo2PHz8KzLOwsMDbt2/B4/HE6qOpqSlTxG1mZiZ0s5qqqirMzMxgY2ODtWvXQllZmfkGiJKOQoe/devWcHV1RXR0ND58+CA0v6SkBLdv30Z2djYyMzMFjsCZmZm4fPlyjX848+bNg5KSktCj/Nzd3aGqqor169eLXO7bC15JrVixAv/+97/x7NkzqdZDseDbnujoaPTv3x/29vZYs2YNunfvjsrKSpw8eRJbtmyBq6sr7O3tMXDgQKFl+/bti5iYGJGF5Wpqali9erXQ16VGRkaIiorC3Llz8e7dO/z4448wMTHBkydPsHPnTmhqagp83fn8+XOhul09Pb0aH0fo6OiI7t27Izw8HL/99lt9PhKqSmOOeC0vz549I35+fsTY2JioqqoSQ0ND8v3335Pjx48TPT09sn79epHLrVu3jrRt25Z8/vxZaBR3QgiprKwk1tbWBADJyMgQmHfy5Eni6upKdHV1iZqaGunatStZvHgxefbsGSHk/0aBF/W6fPkyIYSQ4OBgYmdnJ9SvpKQkwuVyyePHj6X+bJojOgI7xVq0gJ2ipETDT7EWDT/FWjT8FGvR8FOsRcNPsRYNP8VaNPwUa9HwU6xFw0+xltQ3tvkN/F0W/RBL9LmZMl/nx48f8euvv2Lfvn14+vQptLS0YG1tjUWLFmHMmDEAvo6sfvbsWURERCAwMFBg+ZEjRyItLQ3BwcEICQkRmJeUlAQvLy/MmjVLrHG/GsO7d++wbt06JCcno6ioCDo6OrCxscGcOXMwbtw4gVqE2vpfUwH+8uXLERoa2uD7IQusP/LPmjULKSkp+N///V/cu3cP6enpcHd3x6tXrwTaGRkZIT4+XmDa06dPcfr06RqrtmJiYrB06VIkJSWJHHGlsZWUlKBfv37YuXMnli1bhhs3buDcuXOYOHEili5dKjSYnjj9/7YA/9uDQ1Om8OEvLS3FtGnToKWlhXbt2iEyMhJPnz6Furo6SktLcfjwYQQFBWHEiBEwMTFB7969MW/ePIHidgAYNWoUXr58iYsXLzLTEhISMGzYMJFDiBYWFuLSpUsIDAyEhYWFwAjudYmPj4eOjg6OHDkCS0tLqKurw93dHR8/fkRCQgJMTEygq6uL+fPnM0OArlmzRuQwQz169MDKlSsBAEFBQSgqKsKVK1fg7e0Na2trWFhYYObMmcjNzRUY31fc/lcfqd3AwEDsMYKbAoUPv4+PDy5duoTMzEzExcVh5cqVCAoKgouLCzQ1NWFgYIC0tDS8f/++1vWoqqpiypQpAk9OiI+PF/ojqRIXF4eRI0dCW1sbXl5eNRbE1+Tjx4/YtGkT9uzZg/T0dGRmZmLcuHFIS0tDWloa/vjjD2zbto0ppJ8+fTry8/Nx7do1Zh05OTm4desWpk2bBj6fjz179mDKlCno0KGD0PY0NTWhovJ/Z8HS9r85UOjwv3z5EikpKQgJCUHv3r0xYsQIjBs3Djt37sTYsWMBANu3b8elS5egp6eHvn37YuHChQJH9+qmT5+Offv24cOHDzh37hzevn2LUaNGCbXj8/mIj49nCuInTZqECxcuoLCwUOy+V1RUYMuWLejZsycGDhwId3d3XLhwATExMbC2tsaoUaPg7OzMPEOoY8eOcHV1FfjjjIuLw6BBg9C5c2e8fPkSb968qbOYX9L+f1uA/+3pYlOm0OGvenqDo6MjM83e3h7Kysr4/vvvAQADBw7Ef//7X5w+fRru7u64e/cuBgwYgF9//VVofXZ2djA3N8eBAwcQGxuLqVOnChwtq5w8eRIfPnzAiBEjAHwdbHno0KE11gSLoq6uji5dujDv27VrBxMTE4HTinbt2uH58+fM+5kzZzLn558/f0ZiYiLzL5MYZRv16v+3Bfi6urpib0feFLqMkcvlAoDAc2709fVhYWEhMB5sixYtMGDAAAwYMAABAQEIDQ3FmjVrEBAQIPSMnOnTpyM6Ohp5eXm4evWqyO3GxMTg9evXaNmyJTONz+fj1q1bWL16NZSU6j7mfFvGyOFwRE7j8/nM+9GjR4PL5SI1NRWqqqqoqKiAu7s7s986Ojp1FvNL2n9TU1OpnkUkTwp95Dc1NYWSkhIePHjATDt8+DAeP35c65HQ2toalZWVIr/hmDx5Mm7fvg0bGxtYW1sLzX/16hUOHTqEPXv2CBwRc3Jy8ObNG5w4cUI2OyeCiooKvL29ERcXh7i4OEyaNIkJsJKSEiZNmoTdu3eLLH4vLS1FZWWlXPvf2BT6yK+jo4MffvgBYWFhsLe3R0FBAdLT09GyZUucOXMGQ4YMgZOTEzw9PdGnTx/o6ekhLy8PQUFBcHZ2FjnotK6uLng8Xo0F5n/88Qf09PTg4eEh9PyeESNGICYmps4BqaXh6+sLK6uvD/T99tolLCwMmZmZcHBwQFhYGPr06YMWLVrg/PnziIiIwLVr1+Te/8Ykdfgb4ocnWYqOjoavry8MDQ2hrKyMjRs3gsvlYsqUKQgLC4OrqysSEhIQFBSEjx8/okOHDhg1ahRWrVpV4zpr+2c+NjZW6MeiKuPHj8fUqVPx8uVLgdMuWTI3N0e/fv3w+vVrODg4CMxr3bo1srKysHbtWoSGhuLRo0fQ1dWFra0tIiMjoa2tLXb/FQEtYFcwhBCYm5tjzpw5WLRokby70yBklUeFPu1hmxcvXmDPnj0oLi7GtGnT5N2dJk+hL3ibKjc3txpHTg8PD6/3etu2bYs1a9Zg+/btzeorR3mhR3452LFjB8rKykTOk2bEFUm+y6do+OXC0NBQ3l2gQE97KBaj4adYi4afYi0afoq1aPgp1qLhp1hLBuHf3ogvyb148QKzZ89Gp06dwOVyYWBgAFdXV4SFhYHD4dT6yszMRHx8PPNeSUkJ7du3x8SJE/H48WOhbd29exceHh7Q19cHl8uFhYUFVq1aJTRul4mJCTgcDvbs2SO0jm7duoHD4QjVCwNfR4hXVlYWOVJMXcrKyhAcHAwLCwtwuVy0adMGEyZMwN27d4X6VdPLx8cHwNdbqQ8ePCi0DR8fH6ZIqOq9qPVUvzGu+jbV1dVha2uLHTt2SLx/9aHwR/7x48cjJycHCQkJKCgowOHDh+Hk5ARbW1uBwmsPDw8MHz5cYFrVINStWrUCj8fD06dPkZycjPv372PChAkC28nKyoKDgwM+f/6Mo0ePoqCgAGFhYYiPj8fQoUPx+fNngfZGRkZCg0lnZWWhuLhY5JjBQN0jxNekvLwcLi4uiI2NRWhoKAoKCpCWlobKyko4ODggKysLAHDt2jVm35OTkwEIFqh/O/6YOL79THk8HpKSkgTarFmzBjweD3fu3IGXlxdmzpyJY8eOSbwtSSn0j1wlJSU4f/48MjMzMWjQIACAsbEx7O3thdq2bNkS5eXlzGjn1XE4HGZ6+/btMWPGDMyfPx/v3r1Dq1atQAjBjBkzYGVlhZSUFKbYw9jYGBYWFujZsyeioqIExs+dMmUKoqKi8Pfff8PIyAjA13BPmTIFO3fuFOqDOCPE12Tjxo24fPkycnJymOFWjY2NkZycDAcHB8yYMQN37tyBvr4+s0zVL811jRBfl6p/bWujpaXFtAkICMD69etx8uRJuLm51Xu74lDoI3/V/TIHDx5EeXm5TNb5/PlzpKamQllZGcrKygCA3Nxc5OXlYdGiRUJVWnZ2dnBxcRE62rVr1465nRr4WrC+d+/eGgvixR0hXpTExEQMHTqUCX4VJSUlLFy4EHl5ebh586bY62sofD4fycnJePPmTaOMMq/Q4VdRUUF8fDwSEhKgo6OD/v37IygoCLdu3ZJoPW/fvoWmpiY0NDTQrl07ZGRkwM/Pjzk9KSgoAACmiORbVlZWTJvqpk+fjvj4eBBCcODAAXTp0gU9evQQaifJCPGiFBQU1Nq36vsgLk9PT6Gb8nbv3i3U7siRI3XevBcQEABNTU1wuVy4u7tDV1cXvr6+EvWnPhQ6/MDXc/5nz57h8OHDGD58ODIzM9GrVy+RF5Q10dLSQm5uLrKzs7Fhwwb06tULYWFhQu0kvbFs5MiRKC0txblz5xAbG1vjUV/SEeJFkfVNb1FRUQJljrm5ucxDAapzdnYWajdr1iyBNkuWLEFubi7OnDkDBwcHREVFwczMTKb9FUWhz/mrqKmpYejQoRg6dChWrlwJX19fBAcHM99e1EVJSYn5n2FlZYWHDx9i9uzZ+OOPPwB8HXUdAPLz89GzZ0+h5fPz85k21amoqGDq1KkIDg7GlStXkJqaKnL71UeIr8Ln8xEbG4sZM2bU2X8LCwvk5+eLnFc1XVT/amNgYCAUUC0tLaFBtjU0NOoMcps2bZgR6Pfv3w9bW1v06dNHZI20LCn8kV8Ua2trkSOyiyswMBB79+7FjRs3AHw9Enft2hVRUVECT1MAgJs3b+LUqVPw9PQUua7p06fj7NmzGDNmjMh78Os7Qnx1kyZNwqlTp4TO6/l8PqKiomBtbS10PSAvRkZGmDhxIpYtW9bg21LoI/+rV68wYcIETJ8+Hd27d4eWlhays7Oxfv165iG09WFkZIRx48Zh1apVOHLkCDgcDmJiYjB06FCMHz8ey5Ytg4GBAa5cuYJffvkFjo6O8Pf3F7kuKysrvHz5Eurq6iLnx8TE1GuE+OoWLlyIQ4cOYfTo0diwYQMcHBzwzz//IDw8HPn5+Th16pTIml1ZKC8vR3FxscA0FRWVWmuYFyxYABsbG2RnZ6NPnz4N0i9AJuH/SfpVNBBNTU3mHPLhw4eoqKiAkZERZs6ciaCgIKnWvXDhQjg6OuLq1auwt7dHv379kJWVhdWrV8PNzQ3v379Hp06d4O3tjWXLljHPEBJFT09P5PTPnz9j165dAl+RVjd+/Hhs2LAB4eHhNT5NAvh62nfmzBmEh4cjKCgIjx49gpaWFpydnZGVlSXyGZ+ykp6eLvQgX0tLy1r/xbK2tsawYcOwatUqpKWlNVjfaAE71ezQEdgpSko0/AqgW7duNRbEi/runfpKoS942SItLQ0VFRUi57Vr166Re9N80PArAGNjY3l3oVmipz0Ua9HwU6xFw0+xFg0/xVo0/BRr0fBTrCX1V52HJ4sukmgI3yeKvi23Nj4+Pky1VHWurq5IT0+HiYkJHj16hMuXL+O7775j5vv7+zN3TwJASEgIVq9eDQBQVlaGjo4OrK2t8cMPP2D27NlC9+7cvXsXq1evRkZGBt69ewdjY2NMmjQJgYGBUFdXr3EE8+oyMjJQVFQEf39/oVuFga/llampqUzReE03pyUlJWHSpEnMNt+8eSOyNDEkJAQHDx5Ebm6uwPQnT56gc+fOsLCwwJ07d+rsR3PBiiN/XUXUampqNd48Vl23bt3A4/Hw+PFjZGRkYMKECYiIiEC/fv0ExvEVp5i9X79+YhfQSyIuLk5oX6UNZXx8PDw8PPDu3TtcuXJFqnU1Jaz4kauuIuqffvoJW7duRVpaGjP8pigqKirMejp06ABbW1umNnbdunUIDQ2VqJi9ep9qK6CXhI6OjtTrqI4Qgri4OGzevBkdO3ZETEyM0HBHzRUrjvx1MTU1xaxZs7Bs2TKhYpS6dO3aFW5ubkhJSQFQv2L2piwjIwMfP36Ei4sLvLy8sGfPHqkKgZoSVoRfnCLqFStWoLCwsF43gnXt2hVFRUUA6l/MXpuqAvpvX6KIKiwX9YAtccXExGDSpElQVlaGjY0NOnfujP3799d7fU0JK057nJ2dsWXLFoFp346Aoq+vj8WLF2PVqlWYOHGiROsnhAhdbMqyYFxLS4spmazO3NxcaFpUVBRcXFwEpnXo0KFe2y0pKUFKSgouXLjATPPy8kJMTIzY9c9NGSvCL04RNQAsWrQImzdvxubNmyVaf35+PkxNTQHUv5i9NtUL6OsiqrC8vhITE/Hp0yeBc3xCCPh8PgoKCiTej6aGFac94tLU1MTKlSsRFhYm8O1Nbe7du4f09HSMHz8egHTF7E1NTEwMfvnlF4HC+Zs3b2LAgAESPzKxKWLFkV+SIuqffvoJUVFRSExMFPpWo7KyEsXFxeDz+Xj16hUyMzMRGhqKHj16YMmSJQAgVTG7LJSUlAjtq5aWlsDzP2/fvg0tLS3mPYfDEXp6Q25uLm7cuIHdu3eja9euAvM8PT2xZs0ahIaGMo9TKSwsFPp9wNzcvMbnjjYJRAxlZWUkLy+PlJWVidO8SfH29iYAhF6WlpaEEEKMjY1JVFSUwDKJiYkEABk0aBAzLTg4mFlWWVmZtG7dmvzrX/8iUVFR5NOnT0LbvXXrFhk/fjxp3bo1adGiBenSpQtZsWIF+fDhQ439HDNmjND0uLg4oq2tLXIZACQ1NVXgvahXREQEIYSQjIwMkfOVlZWZfbSzsyOEEDJ37lxibW0tcrs8Ho8oKSmRQ4cO1brd8+fPi1xeWrLKIy1gp5odWsBOUVKi4adYi4afYi0afoq1JAq/GNfGFNXgZJVDscJf9RzIbwdWoyh5qBrfrGpknPoS60euquKN58+fAwDU1dUb7Km+FFUbPp+PFy9eQF1dXWC8gvoQe+mqe8Sr/gAoSl6UlJTQqVMnqQ/AYv3IVd2XL19qfDQeRTUGVVVVoVqJ+pA4/BSlKOhXnRRr0fBTrEXDT7EWDT/FWjT8FGvR8FOsRcNPsdb/A22CHYqSLKorAAAAAElFTkSuQmCC", + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Nuc_XSample_IDNucleus_RoundnessNuc_Y_InvROI_indexCell_SizeNucleus_SizeAF488_Cell_Intensity_AverageAF488_Cytoplasm_Intensity_AverageAF488_Nucleus_Intensity_Average...r8c2_Nucleus_Intensity_AverageSting_Cell_Intensity_AverageSting_Cytoplasm_Intensity_AverageSting_Nucleus_Intensity_AverageVimentin_Cell_Intensity_AverageVimentin_Cytoplasm_Intensity_AverageVimentin_Nucleus_Intensity_Averagecell_typecell_subtypeimmune_checkpoint
ID
DD3S3_Cell_0823.567871DD3S3.csv0.83532415699.3828120281816.6544966.2771677.586173...11.7856791.3585621.3188351.45665419.08168516.42890025.631769nonenonenone
DD3S3_Cell_1852.840027DD3S3.csv0.52342115690.5332030200758.4106678.1669608.816844...13.0325331.8560051.9543761.69205320.05023320.90330718.628444nonenonenone
DD3S3_Cell_2868.272705DD3S3.csv0.68614715682.99414104251659.5478209.21682010.069394...14.5929701.9695532.1713041.65164213.03458813.99384611.523031nonenonenone
DD3S3_Cell_4704.337280DD3S3.csv0.75762315683.059570041816911.16341310.06294512.784813...17.3259171.3984761.3019321.54072212.41067011.19111114.207534nonenonenone
DD3S3_Cell_5852.893799DD3S3.csv0.71465115683.01757802011137.8871146.9623868.607257...13.0637171.3286021.1446821.4718329.7181758.03901511.025841nonenonenone
..................................................................
DD3S2_Cell_9124111890.440430DD3S2.csv0.6543411231.699951451855011.22288211.6902479.961000...13.3104002.1548592.3322441.67592011.00108111.4422719.809867nonenonenone
DD3S2_Cell_9124311915.123047DD3S2.csv0.8542571228.222168452038110.50607610.9072959.901769...13.5925932.3562562.4322052.24186410.54541910.82595610.122881nonenonenone
DD3S2_Cell_9124411961.339844DD3S2.csv0.6515631230.939941451575011.33730411.76953310.412333...13.6800002.1767072.1055612.32896011.36407611.82859810.370000nonenonenone
DD3S2_Cell_9124511969.869141DD3S2.csv0.7645021230.717407451154610.03979710.5130929.329855...12.8521742.3463562.5265512.07606511.52382612.6726579.800579nonenonenone
DD3S2_Cell_9124711965.208984DD3S2.csv0.8730941224.179077451466710.22598110.38818610.034727...13.6137322.2129382.2295952.19329916.50438321.88607610.158806nonenonenone
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Nuc_XSample_IDNucleus_RoundnessNuc_Y_InvROI_indexCell_SizeNucleus_SizeAF488_Cell_Intensity_AverageAF488_Cytoplasm_Intensity_AverageAF488_Nucleus_Intensity_Average...r8c2_Nucleus_Intensity_AverageSting_Cell_Intensity_AverageSting_Cytoplasm_Intensity_AverageSting_Nucleus_Intensity_AverageVimentin_Cell_Intensity_AverageVimentin_Cytoplasm_Intensity_AverageVimentin_Nucleus_Intensity_Averagecell_typecell_subtypeimmune_checkpoint
ID
DD3S3_Cell_0823.567871DD3S3.csv0.83532415699.3828120281810.00.00.0...4.1995060.6634070.6367380.72925512.42718910.15173318.045597nonenonenone
DD3S3_Cell_1852.840027DD3S3.csv0.52342115690.5332030200750.00.00.0...4.2156891.1073921.2154370.92731611.63956612.7363489.811600nonenonenone
DD3S3_Cell_2868.272705DD3S3.csv0.68614715682.99414104251650.00.00.0...4.5235761.1515641.3707960.8061073.4867684.7770261.453637nonenonenone
DD3S3_Cell_4704.337280DD3S3.csv0.75762315683.05957004181690.00.00.0...4.5411040.5163230.4599960.5993141.2472571.1281661.422721nonenonenone
DD3S3_Cell_5852.893799DD3S3.csv0.71465115683.01757802011130.00.00.0...4.4564600.5912220.4423030.7071951.8310611.0766292.418584nonenonenone
..................................................................
DD3S2_Cell_9124111890.440430DD3S2.csv0.6543411231.69995145185500.00.00.0...3.3494001.2669641.4225600.846853-0.221802-0.247975-0.151134nonenonenone
DD3S2_Cell_9124311915.123047DD3S2.csv0.8542571228.22216845203810.00.00.0...3.6908241.5067361.5521941.4382680.039343-0.0813390.221112nonenonenone
DD3S2_Cell_9124411961.339844DD3S2.csv0.6515631230.93994145157500.00.00.0...3.2676671.2520321.1629811.4426000.0267720.059065-0.042333nonenonenone
DD3S2_Cell_9124511969.869141DD3S2.csv0.7645021230.71740745115460.00.00.0...3.5223191.5088611.6577591.2855141.4840282.1595650.470724nonenonenone
DD3S2_Cell_9124711965.208984DD3S2.csv0.8730941224.17907745146670.00.00.0...3.5790051.3672901.3870041.3440456.27840211.4978900.124080nonenonenone
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RoundTargetExpChanneltarget_lowerfull_columnmarkerlocalisation
0R0AF488300c2af488AF488_Cell_Intensity_AverageAF488cell
1R0AF488300c2af488AF488_Cytoplasm_Intensity_AverageAF488cytoplasm
2R0AF488300c2af488AF488_Nucleus_Intensity_AverageAF488nucleus
3R0AF5551500c3af555AF555_Cell_Intensity_AverageAF555cell
4R0AF5551500c3af555AF555_Cytoplasm_Intensity_AverageAF555cytoplasm
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageCD11c_Cytoplasm_Intensity_AverageB7H4_Cell_Intensity_AverageCD68_Cytoplasm_Intensity_AverageCD4_Cytoplasm_Intensity_AverageCD44_Cytoplasm_Intensity_AveragePDGFR_Cytoplasm_Intensity_AverageaSMA_Cytoplasm_Intensity_AverageCD163_Cytoplasm_Intensity_AverageFibronectin_Cytoplasm_Intensity_Average...Ki67_Nucleus_Intensity_AverageSting_Cytoplasm_Intensity_AverageDesmin_Cytoplasm_Intensity_AverageCD31_Cytoplasm_Intensity_AveragePD1_Cytoplasm_Intensity_AverageColVI_Cytoplasm_Intensity_AverageGATA3_Nucleus_Intensity_AverageVimentin_Cytoplasm_Intensity_AverageCKs_Cytoplasm_Intensity_AverageAXL_Cytoplasm_Intensity_Average
ID
DD3S2_Cell_00.183086-0.109646-0.007868-0.0606520.1813780.1794450.22594423.127993-0.016142-0.002348...0.5697371.505413-0.7104570.064117-0.042649-0.285973-0.0164538.0641296.736799-0.172625
DD3S2_Cell_10.3004460.4679110.0782350.0144230.1577200.0762140.1019703.7333330.0808690.200440...0.7111912.211345-0.2591370.0953870.024518-0.0890770.1619150.13369112.466549-0.104625
DD3S2_Cell_20.2614230.1304800.0404970.0503480.3874160.3295090.46648428.8684050.0750900.119287...0.5202922.198314-0.5489430.1745290.0106380.1644620.04507022.4384421.152088-0.028749
DD3S2_Cell_30.1615730.064504-0.0103070.0021160.2852890.2914790.31811541.1922370.0321750.063606...0.4175730.951068-0.8191260.118600-0.039049-0.124460-0.0106187.5363262.129703-0.145493
DD3S2_Cell_40.302397-0.1617300.052735-0.0307140.1465560.0628000.1617226.5613890.0435480.187722...0.6998751.922095-0.4305550.077284-0.003968-0.1589280.1790023.7373429.608294-0.140294
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Nuc_XSample_IDNucleus_RoundnessNuc_Y_InvROI_indexCell_SizeNucleus_SizeaSMA_Cytoplasm_Intensity_AverageAXL_Cytoplasm_Intensity_AverageB7H4_Cell_Intensity_Average...Ki67_Nucleus_Intensity_AverageMMP9_Cytoplasm_Intensity_AveragePD1_Cytoplasm_Intensity_AveragePDGFR_Cytoplasm_Intensity_AveragePDL1_Cytoplasm_Intensity_AverageSting_Cytoplasm_Intensity_AverageVimentin_Cytoplasm_Intensity_Averagecell_typecell_subtypeimmune_checkpoint
ID
DD3S2_Cell_02033.197510DD3S2.csv0.79231215494.77734403078123.127993-0.172625-0.007868...0.569737-0.054124-0.0426490.2259440.1830861.5054138.064129nonenonenone
DD3S2_Cell_12101.638184DD3S2.csv0.74923615495.5527340159473.733333-0.1046250.078235...0.7111910.0311190.0245180.1019700.3004462.2113450.133691nonenonenone
DD3S2_Cell_22008.148193DD3S2.csv0.83532415492.37011702678128.868405-0.0287490.040497...0.5202920.0139890.0106380.4664840.2614232.19831422.438442nonenonenone
DD3S2_Cell_31992.441162DD3S2.csv0.67195715489.80859402936841.192237-0.145493-0.010307...0.417573-0.017410-0.0390490.3181150.1615730.9510687.536326nonenonenone
DD3S2_Cell_42092.007080DD3S2.csv0.71082915488.48242202251416.561389-0.1402940.052735...0.6998750.001389-0.0039680.1617220.3023971.9220953.737342nonenonenone
..................................................................
DD3S3_Cell_13896714827.791992DD3S3.csv0.9214981648.5139166331872-2.829689-0.316496-0.291786...0.802662-0.068195-0.087062-0.2013170.1147780.673324-3.891558nonenonenone
DD3S3_Cell_13896814520.892578DD3S3.csv0.7406171642.8846446330913010.6664990.0798290.158183...3.5966460.1022680.1319400.8002201.3481495.23882122.863111nonenonenone
DD3S3_Cell_13896914528.000000DD3S3.csv0.6941571640.03845263155528.3909070.0519030.158396...3.0067760.0981230.2033400.6245631.1021235.39936626.146441nonenonenone
DD3S3_Cell_13897014553.461914DD3S3.csv0.8214411629.507690632436516.2005050.1804910.051547...1.7069590.0336740.0682320.7426820.8885735.66729033.745450nonenonenone
DD3S3_Cell_13897114543.513672DD3S3.csv0.8165891628.541626631937213.5253180.0977020.165548...5.4023290.0852510.2015041.1006341.2844194.28857314.974078nonenonenone
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageCD11c_Cytoplasm_Intensity_AverageB7H4_Cell_Intensity_AverageCD68_Cytoplasm_Intensity_AverageCD4_Cytoplasm_Intensity_AverageCD44_Cytoplasm_Intensity_AveragePDGFR_Cytoplasm_Intensity_AverageaSMA_Cytoplasm_Intensity_AverageCD163_Cytoplasm_Intensity_AverageFibronectin_Cytoplasm_Intensity_Average...Ki67_Nucleus_Intensity_AverageSting_Cytoplasm_Intensity_AverageDesmin_Cytoplasm_Intensity_AverageCD31_Cytoplasm_Intensity_AveragePD1_Cytoplasm_Intensity_AverageColVI_Cytoplasm_Intensity_AverageGATA3_Nucleus_Intensity_AverageVimentin_Cytoplasm_Intensity_AverageCKs_Cytoplasm_Intensity_AverageAXL_Cytoplasm_Intensity_Average
ID
DD3S2_Cell_03.7581703.7266153.7376653.7319453.7579883.7577823.7627325.1888623.7367703.738262...3.7988183.8926903.6596063.7454293.7338983.7072703.7367364.4203344.3280083.719735
DD3S2_Cell_13.7706293.7882243.7469473.7400733.7554633.7467303.7494954.0943203.7472303.760019...3.8134073.9596783.7102313.7487893.7411633.7288553.7559113.7528944.6900943.727162
DD3S2_Cell_23.7664983.7525503.7428863.7439473.7797933.7736983.7880755.3997203.7466093.751351...3.7936833.9584693.6779283.7572573.7396653.7561833.7433795.1613283.8579563.735405
DD3S2_Cell_33.7558743.7454713.7374013.7387443.7690263.7696813.7724965.7692403.7419893.745374...3.7829583.8378153.6471463.7512783.7342893.7250003.7373674.3843253.9520883.722703
DD3S2_Cell_43.7708363.7209283.7442043.7351923.7542703.7452873.7558904.3153533.7432153.758664...3.8122463.9326053.6912113.7468453.7380863.7212343.7577344.0946594.5207973.723271
..................................................................
DD3S3_Cell_1389673.7508683.7071013.7066283.7108484.3028373.7439083.7165903.3947853.7373973.733490...3.8227633.8095163.1041813.8410433.7290744.2367463.7606843.2412463.2108963.703895
DD3S3_Cell_1389683.8773333.7859923.7555123.8015413.9209463.8939873.8225144.5858143.8713883.813215...4.0827294.2161823.9074663.7941353.7527063.7302193.7760565.1783474.1376593.747118
DD3S3_Cell_1389693.8529763.7839503.7555353.8097753.8980053.8026923.8044904.4421853.8239603.811463...4.0316104.2285903.8742683.7785913.7603283.7340283.7804505.3035654.0630993.744115
DD3S3_Cell_1389703.8314963.7583853.7440763.7513763.8718423.8420413.8166354.8849973.7850723.799217...3.9121354.2490633.7435873.9393313.7458723.8578943.7767235.5574443.9239553.757893
DD3S3_Cell_1389713.8710633.7864283.7562993.7742493.9767723.9275633.8528284.7480853.7991423.836915...4.2288184.1404713.9176693.7981723.7601323.8163583.8007494.8238384.0407013.749037
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Nuc_Xcell_subtypeROI_indeximmune_checkpointNuc_Y_InvNucleus_RoundnessCell_SizeSample_IDcell_typeNucleus_Size
ID
DD3S2_Cell_02033.197510none0none15494.7773440.792312307DD3S2.csvnone81
DD3S2_Cell_12101.638184none0none15495.5527340.749236159DD3S2.csvnone47
DD3S2_Cell_22008.148193none0none15492.3701170.835324267DD3S2.csvnone81
DD3S2_Cell_31992.441162none0none15489.8085940.671957293DD3S2.csvnone68
DD3S2_Cell_42092.007080none0none15488.4824220.710829225DD3S2.csvnone141
.................................
DD3S3_Cell_13896714827.791992none63none1648.5139160.921498318DD3S3.csvnone72
DD3S3_Cell_13896814520.892578none63none1642.8846440.740617309DD3S3.csvnone130
DD3S3_Cell_13896914528.000000none63none1640.0384520.694157155DD3S3.csvnone52
DD3S3_Cell_13897014553.461914none63none1629.5076900.821441243DD3S3.csvnone65
DD3S3_Cell_13897114543.513672none63none1628.5416260.816589193DD3S3.csvnone72
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageCD11c_Cytoplasm_Intensity_AverageB7H4_Cell_Intensity_AverageCD68_Cytoplasm_Intensity_AverageCD4_Cytoplasm_Intensity_AverageCD44_Cytoplasm_Intensity_AveragePDGFR_Cytoplasm_Intensity_AverageaSMA_Cytoplasm_Intensity_AverageCD163_Cytoplasm_Intensity_AverageFibronectin_Cytoplasm_Intensity_Average...Nuc_Xcell_subtypeROI_indeximmune_checkpointNuc_Y_InvNucleus_RoundnessCell_SizeSample_IDcell_typeNucleus_Size
ID
DD3S2_Cell_03.7581703.7266153.7376653.7319453.7579883.7577823.7627325.1888623.7367703.738262...2033.197510none0none15494.7773440.792312307DD3S2.csvnone81
DD3S2_Cell_13.7706293.7882243.7469473.7400733.7554633.7467303.7494954.0943203.7472303.760019...2101.638184none0none15495.5527340.749236159DD3S2.csvnone47
DD3S2_Cell_23.7664983.7525503.7428863.7439473.7797933.7736983.7880755.3997203.7466093.751351...2008.148193none0none15492.3701170.835324267DD3S2.csvnone81
DD3S2_Cell_33.7558743.7454713.7374013.7387443.7690263.7696813.7724965.7692403.7419893.745374...1992.441162none0none15489.8085940.671957293DD3S2.csvnone68
DD3S2_Cell_43.7708363.7209283.7442043.7351923.7542703.7452873.7558904.3153533.7432153.758664...2092.007080none0none15488.4824220.710829225DD3S2.csvnone141
..................................................................
DD3S3_Cell_1389673.7508683.7071013.7066283.7108484.3028373.7439083.7165903.3947853.7373973.733490...14827.791992none63none1648.5139160.921498318DD3S3.csvnone72
DD3S3_Cell_1389683.8773333.7859923.7555123.8015413.9209463.8939873.8225144.5858143.8713883.813215...14520.892578none63none1642.8846440.740617309DD3S3.csvnone130
DD3S3_Cell_1389693.8529763.7839503.7555353.8097753.8980053.8026923.8044904.4421853.8239603.811463...14528.000000none63none1640.0384520.694157155DD3S3.csvnone52
DD3S3_Cell_1389703.8314963.7583853.7440763.7513763.8718423.8420413.8166354.8849973.7850723.799217...14553.461914none63none1629.5076900.821441243DD3S3.csvnone65
DD3S3_Cell_1389713.8710633.7864283.7562993.7742493.9767723.9275633.8528284.7480853.7991423.836915...14543.513672none63none1628.5416260.816589193DD3S3.csvnone72
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageCD11c_Cytoplasm_Intensity_AverageB7H4_Cell_Intensity_AverageCD68_Cytoplasm_Intensity_AverageCD4_Cytoplasm_Intensity_AverageCD44_Cytoplasm_Intensity_AveragePDGFR_Cytoplasm_Intensity_AverageaSMA_Cytoplasm_Intensity_AverageCD163_Cytoplasm_Intensity_AverageFibronectin_Cytoplasm_Intensity_Average...Nuc_Xcell_subtypeROI_indeximmune_checkpointNuc_Y_InvNucleus_RoundnessCell_SizeSample_IDcell_typeNucleus_Size
ID
TMA_Cell_43.7808123.7496433.7248813.7301033.8087833.7722613.7577574.3599463.7715803.736860...1603.610596none0none12259.1982420.639497307TMA.csvnone131
TMA_Cell_3003.7852473.7509253.7285793.7403593.8334383.9645153.8132205.2774523.7960303.752645...1870.953491none0none12142.1972660.557669271TMA.csvnone86
TMA_Cell_12313.7748463.7489753.7221773.7316723.8368453.7718283.7320714.0354273.7646583.737986...1076.486938none0none11927.4003910.909491215TMA.csvnone115
TMA_Cell_12403.7815903.7244143.7229493.7374323.8241083.8468413.7550645.0299263.7689383.740266...1089.709717none0none11927.3652340.945592198TMA.csvnone93
TMA_Cell_21073.7957243.7258513.7250053.7293013.8597153.8768103.8892496.0130263.7828043.757063...1375.939697none0none11758.5771480.664589167TMA.csvnone116
..................................................................
TMA_Cell_1157553.8218073.7388453.7396143.7440933.7804704.3922013.7383593.8392003.7553513.829806...15564.458008none59none2663.2534180.982196386TMA.csvnone142
TMA_Cell_1157563.8289943.7460763.7422093.7437323.7715724.3432343.7433863.8809953.7666073.845841...15629.680664none59none2661.7658690.775977270TMA.csvnone47
TMA_Cell_1157573.8056703.7406833.7389093.7412623.7649484.5531243.7395063.8388843.7490273.802058...15518.421875none59none2657.0156250.688747202TMA.csvnone64
TMA_Cell_1157583.7940753.7400203.7390983.7407813.7630534.3312893.7385313.8416463.7499903.817734...15539.275391none59none2660.2585450.751402182TMA.csvnone58
TMA_Cell_1157603.8413163.7401803.7407703.7446603.7837844.7443513.7456003.8559803.7584733.850599...15542.961914none59none2654.2924800.674126295TMA.csvnone106
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageCD11c_Cytoplasm_Intensity_AverageB7H4_Cell_Intensity_AverageCD68_Cytoplasm_Intensity_AverageCD4_Cytoplasm_Intensity_AverageCD44_Cytoplasm_Intensity_AveragePDGFR_Cytoplasm_Intensity_AverageaSMA_Cytoplasm_Intensity_AverageCD163_Cytoplasm_Intensity_AverageFibronectin_Cytoplasm_Intensity_Average...Nuc_Xcell_subtypeROI_indeximmune_checkpointNuc_Y_InvNucleus_RoundnessCell_SizeSample_IDcell_typeNucleus_Size
ID
TMA_Cell_40.037975-0.090232-0.192088-0.1706090.1530290.002801-0.0568572.4201620.000000-0.142813...1603.610596none0none12259.1982420.639497307TMA.csvnone131
TMA_Cell_300-0.006220-0.092313-0.148365-0.1188160.1146630.4434550.0639473.7368170.020830-0.087998...1870.953491none0none12142.1972660.557669271TMA.csvnone86
TMA_Cell_12310.061042-0.064835-0.195221-0.1490230.3627010.046357-0.1470791.3289110.011473-0.118299...1076.486938none0none11927.4003910.909491215TMA.csvnone115
TMA_Cell_12400.043759-0.153990-0.159056-0.1089650.1908130.269438-0.0479834.3612850.000000-0.099163...1089.709717none0none11927.3652340.945592198TMA.csvnone93
TMA_Cell_21070.000000-0.144613-0.146364-0.1374740.1324410.1678210.1935654.589084-0.026741-0.080016...1375.939697none0none11758.5771480.664589167TMA.csvnone116
..................................................................
TMA_Cell_1157550.167315-0.161220-0.158175-0.1404360.0036192.426113-0.1631420.236192-0.0958540.198991...15564.458008none59none2663.2534180.982196386TMA.csvnone142
TMA_Cell_1157560.168391-0.231211-0.249849-0.242510-0.1083402.646651-0.2441770.419000-0.1322700.249579...15629.680664none59none2661.7658690.775977270TMA.csvnone47
TMA_Cell_1157570.140926-0.123519-0.130738-0.121163-0.0247813.182450-0.1283100.276081-0.0895670.126228...15518.421875none59none2657.0156250.688747202TMA.csvnone64
TMA_Cell_1157580.072588-0.203340-0.208043-0.199453-0.0857652.814824-0.2109420.315417-0.1524460.193357...15539.275391none59none2660.2585450.751402182TMA.csvnone58
TMA_Cell_1157600.123770-0.187289-0.185475-0.173511-0.0531762.901200-0.1706180.168873-0.1310250.152323...15542.961914none59none2654.2924800.674126295TMA.csvnone106
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageCD11c_Cytoplasm_Intensity_AverageB7H4_Cell_Intensity_AverageCD68_Cytoplasm_Intensity_AverageCD4_Cytoplasm_Intensity_AverageCD44_Cytoplasm_Intensity_AveragePDGFR_Cytoplasm_Intensity_AverageaSMA_Cytoplasm_Intensity_AverageCD163_Cytoplasm_Intensity_AverageFibronectin_Cytoplasm_Intensity_Average...Nuc_Xcell_subtypeROI_indeximmune_checkpointNuc_Y_InvNucleus_RoundnessCell_SizeSample_IDcell_typeNucleus_Size
ID
DD3S2_Cell_00.024960-0.075347-0.040222-0.0584050.0243810.0237260.0394644.572897-0.043068-0.038325...2033.197510none0none15494.7773440.792312307DD3S2.csvnone81
DD3S2_Cell_10.0751360.164953-0.045760-0.080848-0.002287-0.046869-0.0327521.727537-0.0443150.020972...2101.638184none0none15495.5527340.749236159DD3S2.csvnone47
DD3S2_Cell_20.022444-0.011432-0.034903-0.0323260.0547320.0399290.0748453.988960-0.025861-0.014343...2008.148193none0none15492.3701170.835324267DD3S2.csvnone81
DD3S2_Cell_30.011138-0.014071-0.033624-0.0303700.0430050.0445920.0514124.889609-0.022507-0.014305...1992.441162none0none15489.8085940.671957293DD3S2.csvnone68
DD3S2_Cell_40.077567-0.181457-0.060652-0.107426-0.008411-0.0550300.0000002.903647-0.0657870.014397...2092.007080none0none15488.4824220.710829225DD3S2.csvnone141
..................................................................
DD3S3_Cell_1389670.069663-0.105790-0.107686-0.0907682.2823600.041760-0.067749-1.3577800.0156590.000000...14827.791992none63none1648.5139160.921498318DD3S3.csvnone72
DD3S3_Cell_1389680.166680-0.111050-0.203723-0.0637710.2992860.2173160.0000002.3208480.148603-0.028275...14520.892578none63none1642.8846440.740617309DD3S3.csvnone130
DD3S3_Cell_1389690.128945-0.081516-0.168154-0.0027770.266238-0.024371-0.0188901.9254480.0404760.002371...14528.000000none63none1640.0384520.694157155DD3S3.csvnone52
DD3S3_Cell_1389700.065912-0.120796-0.157338-0.1386970.1689460.0928400.0279602.756305-0.052645-0.016522...14553.461914none63none1629.5076900.821441243DD3S3.csvnone65
DD3S3_Cell_1389710.121561-0.179724-0.286979-0.2230790.4978620.3226880.0566453.243583-0.1344640.000000...14543.513672none63none1628.5416260.816589193DD3S3.csvnone72
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageCD11c_Cytoplasm_Intensity_AverageB7H4_Cell_Intensity_AverageCD68_Cytoplasm_Intensity_AverageCD4_Cytoplasm_Intensity_AverageCD44_Cytoplasm_Intensity_AveragePDGFR_Cytoplasm_Intensity_AverageaSMA_Cytoplasm_Intensity_AverageCD163_Cytoplasm_Intensity_AverageFibronectin_Cytoplasm_Intensity_Average...Nuc_Xcell_subtypeROI_indeximmune_checkpointNuc_Y_InvNucleus_RoundnessCell_SizeSample_IDcell_typeNucleus_Size
ID
DD3S2_Cell_0-0.0649170.0768700.0951810.1117200.036713-0.1402690.0603483.0321210.074029-0.142342...2033.197510none0none15494.7773440.792312307DD3S2.csvnone81
DD3S2_Cell_1-0.0147410.3171690.0896420.0892770.010045-0.210864-0.0118680.1867600.072781-0.083045...2101.638184none0none15495.5527340.749236159DD3S2.csvnone47
DD3S2_Cell_2-0.0674340.1407840.1005000.1377990.067064-0.1240660.0957292.4481840.091235-0.118360...2008.148193none0none15492.3701170.835324267DD3S2.csvnone81
DD3S2_Cell_3-0.0787400.1381450.1017780.1397550.055337-0.1194030.0722963.3488320.094589-0.118322...1992.441162none0none15489.8085940.671957293DD3S2.csvnone68
DD3S2_Cell_4-0.012311-0.0292410.0747510.0626990.003921-0.2190260.0208841.3628710.051309-0.089620...2092.007080none0none15488.4824220.710829225DD3S2.csvnone141
..................................................................
DD3S3_Cell_138967-0.0202150.0464270.0277160.0793572.294692-0.122235-0.046865-2.8985570.132755-0.104017...14827.791992none63none1648.5139160.921498318DD3S3.csvnone72
DD3S3_Cell_1389680.0768020.041167-0.0683200.1063540.3116180.0533210.0208840.7800720.265699-0.132292...14520.892578none63none1642.8846440.740617309DD3S3.csvnone130
DD3S3_Cell_1389690.0390680.070701-0.0327520.1673480.278570-0.1883670.0019950.3846720.157572-0.101646...14528.000000none63none1640.0384520.694157155DD3S3.csvnone52
DD3S3_Cell_138970-0.0239660.031420-0.0219350.0314280.181278-0.0711550.0488451.2155290.064451-0.120539...14553.461914none63none1629.5076900.821441243DD3S3.csvnone65
DD3S3_Cell_1389710.031683-0.027507-0.151576-0.0529540.5101930.1586930.0775291.702806-0.017368-0.104017...14543.513672none63none1628.5416260.816589193DD3S3.csvnone72
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageCD11c_Cytoplasm_Intensity_AverageB7H4_Cell_Intensity_AverageCD68_Cytoplasm_Intensity_AverageCD4_Cytoplasm_Intensity_AverageCD44_Cytoplasm_Intensity_AveragePDGFR_Cytoplasm_Intensity_AverageaSMA_Cytoplasm_Intensity_AverageCD163_Cytoplasm_Intensity_AverageFibronectin_Cytoplasm_Intensity_Average...Nuc_Xcell_subtypeROI_indeximmune_checkpointNuc_Y_InvNucleus_RoundnessCell_SizeSample_IDcell_typeNucleus_Size
ID
DD3S2_Cell_0-0.2152330.5903320.9214840.8366140.245243-0.1300290.1809351.8308070.868011-0.355564...2033.197510none0none15494.7773440.792312307DD3S2.csvnone81
DD3S2_Cell_1-0.0488752.4357500.8678670.6685500.067100-0.195470-0.0355810.1127670.853380-0.207442...2101.638184none0none15495.5527340.749236159DD3S2.csvnone47
DD3S2_Cell_2-0.2235771.0811730.9729821.0319070.447987-0.1150090.2870151.4782241.069760-0.295659...2008.148193none0none15492.3701170.835324267DD3S2.csvnone81
DD3S2_Cell_3-0.2610621.0609070.9853611.0465540.369650-0.1106870.2167602.0220391.109085-0.295563...1992.441162none0none15489.8085940.671957293DD3S2.csvnone68
DD3S2_Cell_4-0.040816-0.2245580.7236920.4695170.026192-0.2030360.0626150.8229070.601613-0.223867...2092.007080none0none15488.4824220.710829225DD3S2.csvnone141
..................................................................
DD3S3_Cell_138967-0.0670220.3565410.2683350.59426615.328433-0.113311-0.140511-1.7501611.556596-0.259830...14827.791992none63none1648.5139160.921498318DD3S3.csvnone72
DD3S3_Cell_1389680.2546370.316147-0.6614400.7964302.0815960.0494280.0626150.4710113.115412-0.330460...14520.892578none63none1642.8846440.740617309DD3S3.csvnone130
DD3S3_Cell_1389690.1295290.542958-0.3170831.2531851.860832-0.1746150.0059800.2322671.847584-0.253907...14528.000000none63none1640.0384520.694157155DD3S3.csvnone52
DD3S3_Cell_138970-0.0794590.241296-0.2123650.2353471.210926-0.0659610.1464460.7339410.755714-0.301101...14553.461914none63none1629.5076900.821441243DD3S3.csvnone65
DD3S3_Cell_1389710.105045-0.211245-1.467472-0.3965443.4080680.1471080.2324501.028162-0.203649-0.259830...14543.513672none63none1628.5416260.816589193DD3S3.csvnone72
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RoundTargetExpChanneltarget_lowerfull_columnmarkerlocalisation
0R0AF488300c2af488AF488_Cell_Intensity_AverageAF488cell
1R0AF488300c2af488AF488_Cytoplasm_Intensity_AverageAF488cytoplasm
2R0AF488300c2af488AF488_Nucleus_Intensity_AverageAF488nucleus
3R0AF5551500c3af555AF555_Cell_Intensity_AverageAF555cell
4R0AF5551500c3af555AF555_Cytoplasm_Intensity_AverageAF555cytoplasm
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + "
Sample_IDROI_indexPatientUnique_ROI_index
0DD3S1.csv06161a
1DD3S1.csv16262a
2DD3S1.csv26363a
3DD3S1.csv35959a
4DD3S1.csv46060a
...............
462TMA.csv55c55c55a
463TMA.csv56c56c56a
464TMA.csv57c57c57a
465TMA.csv58c58c58a
466TMA.csv59c59c59a
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageHLA_Cytoplasm_Intensity_AverageCKs_Cytoplasm_Intensity_AverageKi67_Nucleus_Intensity_AverageCD163_Cytoplasm_Intensity_AverageColVI_Cytoplasm_Intensity_AverageCD20_Cytoplasm_Intensity_AveragePD1_Cytoplasm_Intensity_AverageAXL_Cytoplasm_Intensity_AverageCD31_Cytoplasm_Intensity_Average...Nuc_Y_InvNucleus_RoundnessNuc_XROI_indexNucleus_SizeSample_IDimmune_checkpointCell_SizePatientUnique_ROI_index
ID
DD3S1_Cell_0-0.677863-0.417494-0.912537-0.8178760.9300990.232078-0.4831581.5356040.8073391.167755...16632.2050780.9550401484.7717290127DD3S1.csvNone3396161a
DD3S1_Cell_1-0.677863-0.516487-0.838037-0.8696851.1149240.301333-0.3447701.6683680.8754551.643023...16627.3847660.9666431426.2500000112DD3S1.csvNone3446161a
DD3S1_Cell_2-0.677863-0.141921-1.016023-0.7558790.8345770.259216-0.4382921.3363080.7050881.053636...16622.2382810.7215341531.1104740181DD3S1.csvNone4226161a
DD3S1_Cell_3-0.741282-0.460472-0.491711-0.8180840.6482000.107027-0.4448891.2498050.6607071.165861...16623.0078120.5871961518.9075930119DD3S1.csvNone2786161a
DD3S1_Cell_6-0.621521-0.247254-0.867127-0.7425440.8105790.272128-0.5071171.2514340.9471722.545301...16619.9785160.9357161471.914917047DD3S1.csvNone2046161a
..................................................................
TMA_Cell_1157550.4782750.558670-0.9628401.7322910.507434-0.9126410.3113220.8160680.5965200.090397...2663.2534180.98219615564.45800859142TMA.csvNone386c59c59a
TMA_Cell_1157560.2974180.420594-0.9716321.9669550.304365-1.1641120.866636-0.092857-0.241830-0.617835...2661.7658690.77597715629.6806645947TMA.csvNone270c59c59a
TMA_Cell_1157570.3469500.453951-0.6028931.3389560.559435-0.8013330.4470610.9881561.5678690.403878...2657.0156250.68874715518.4218755964TMA.csvNone202c59c59a
TMA_Cell_115758-0.1894150.508840-0.8860410.647980-0.227224-1.022549-0.0992560.2197550.603715-0.219145...2660.2585450.75140215539.2753915958TMA.csvNone182c59c59a
TMA_Cell_1157600.2457770.460219-1.0038400.191158-0.313127-1.1206750.004962-0.3161991.727776-0.495501...2654.2924800.67412615542.96191459106TMA.csvNone295c59c59a
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Patient%_tumor%_necrosisAge_DiagnosisBMICA125RaceOther_CancersBRCAStatusPrimary_chem(1)_vs_surg(0)...Histo_TypeOptimal_DebulkingResidual_DiseasePlatinum_sensitiveDays_surgery_to_recurrenceAvastinDisease_StatDays_from_surgery_to_last_contact_or_deathRecurrenceVital_Status
0180572.035.0NaNCbreast00...HGSOC0.01.01.0506.01.0DOD17761.01.0
1250036.024.0NaNCbreast10...HGSOC1.00.01.0669.01.0DOD22231.01.0
2380555.045.0944.0C0NaN0...HGSOC1.00.01.0596.00.0DOD13551.01.0
3480559.026.050.0C000...HGtubal1.00.0NaNNaNNaNNaN1783NaNNaN
4550070.032.01426.0C0NaN1...CCCNaN0.01.0377.01.0DOD9771.01.0
..................................................................
18218370572.022.0597.0Cbreast01...HGSOC1.00.01.0NaNNaNDOD1036NaN1.0
18318490072.026.03788.0CbreastNaN1...HGSOC1.00.01.0282.00.0NaN4681.0NaN
18418590070.029.01330.0C0NaN0...HGSOC1.00.0NaNNaNNaNDOD1020NaN1.0
18518680084.017.0564.0CsquamouscellcarcinomaNaN0...HGSOC1.00.0NaNNaNNaNDOC18690.01.0
18618780027.022.0922.0C001...serousprimarilylowgradewfociofhighgrade1.01.01.0540.00.0DOD12791.01.0
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageHLA_Cytoplasm_Intensity_AverageCKs_Cytoplasm_Intensity_AverageKi67_Nucleus_Intensity_AverageCD163_Cytoplasm_Intensity_AverageColVI_Cytoplasm_Intensity_AverageCD20_Cytoplasm_Intensity_AveragePD1_Cytoplasm_Intensity_AverageAXL_Cytoplasm_Intensity_AverageCD31_Cytoplasm_Intensity_Average...Nucleus_RoundnessNuc_XROI_indexNucleus_SizeSample_IDimmune_checkpointCell_SizePatientUnique_ROI_indexPrimary_chem(1)_vs_surg(0)
ID
DD3S1_Cell_0-0.677863-0.417494-0.912537-0.8178760.9300990.232078-0.4831581.5356040.8073391.167755...0.9550401484.7717290127DD3S1.csvNone3396161a1.0
DD3S1_Cell_1-0.677863-0.516487-0.838037-0.8696851.1149240.301333-0.3447701.6683680.8754551.643023...0.9666431426.2500000112DD3S1.csvNone3446161a1.0
DD3S1_Cell_2-0.677863-0.141921-1.016023-0.7558790.8345770.259216-0.4382921.3363080.7050881.053636...0.7215341531.1104740181DD3S1.csvNone4226161a1.0
DD3S1_Cell_3-0.741282-0.460472-0.491711-0.8180840.6482000.107027-0.4448891.2498050.6607071.165861...0.5871961518.9075930119DD3S1.csvNone2786161a1.0
DD3S1_Cell_6-0.621521-0.247254-0.867127-0.7425440.8105790.272128-0.5071171.2514340.9471722.545301...0.9357161471.914917047DD3S1.csvNone2046161a1.0
..................................................................
TMA_Cell_1157550.4782750.558670-0.9628401.7322910.507434-0.9126410.3113220.8160680.5965200.090397...0.98219615564.45800859142TMA.csvNone386c59c59aNaN
TMA_Cell_1157560.2974180.420594-0.9716321.9669550.304365-1.1641120.866636-0.092857-0.241830-0.617835...0.77597715629.6806645947TMA.csvNone270c59c59aNaN
TMA_Cell_1157570.3469500.453951-0.6028931.3389560.559435-0.8013330.4470610.9881561.5678690.403878...0.68874715518.4218755964TMA.csvNone202c59c59aNaN
TMA_Cell_115758-0.1894150.508840-0.8860410.647980-0.227224-1.022549-0.0992560.2197550.603715-0.219145...0.75140215539.2753915958TMA.csvNone182c59c59aNaN
TMA_Cell_1157600.2457770.460219-1.0038400.191158-0.313127-1.1206750.004962-0.3161991.727776-0.495501...0.67412615542.96191459106TMA.csvNone295c59c59aNaN
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Patient%_tumor%_necrosisAge_DiagnosisBMICA125RaceOther_CancersBRCAStatusPrimary_chem(1)_vs_surg(0)...Histo_TypeOptimal_DebulkingResidual_DiseasePlatinum_sensitiveDays_surgery_to_recurrenceAvastinDisease_StatDays_from_surgery_to_last_contact_or_deathRecurrenceVital_Status
4550070.032.01426.0C0NaN1...CCCNaN0.01.0377.01.0DOD9771.01.0
6780563.029.010965.0C0NaN1...HGSOCNaN0.00.0516.00.0DOD8141.01.0
101190058.020.072.0C0NaN1...SignetringcellNaN0.00.0203.00.0DOD2631.01.0
141560077.035.0183.0C0NaN1...HGSOC1.00.01.0460.00.0NED25851.00.0
171890075.025.055.0C001...HGSOC1.00.01.0359.01.0DOD4391.01.0
252680069.029.01907.0C001...HGSOC1.00.01.0NaN0.0DOD10850.01.0
303170062.026.011785.0C0NaN1...HGSOC1.00.01.0NaN1.0DOD3280.01.0
313290575.041.04532.0C0NaN1...HGSOC1.00.01.01157.00.0AWD18641.00.0
394070564.0NaN8393.0CNaNNaN1...HGSOC1.00.01.0NaN0.0NaN1310.0NaN
505190055.033.01000.0CrenalcellNaN1...HGSOC1.00.01.02103.00.0NaN21241.0NaN
6061601065.023.0281.0C0NaN1...metastaticadenocarcinomaNaNNaN1.0NaN0.0NaN230.0NaN
848590061.030.0116.0hispanic0NaN1...HGSOC1.00.01.0572.00.0DOD6001.01.0
888990064.028.0855.0C001...HGSOC1.00.01.0540.01.0DOD18201.01.0
949580580.024.02799.0C0NaN1...HGSOC1.00.0NaNNaN0.0NaN960.0NaN
979870079.026.02461.0C0NaN1...HGSOC1.00.01.0343.00.0DOD9231.01.0
10310490060.029.063.0C0NaN1...HGSOC1.00.01.0335.00.0DOD3511.01.0
11011190550.032.01960.0C001...HGSOC1.00.01.0533.01.0DOD18881.01.0
11511680076.034.07453.0C0NaN1...HGSOC1.00.01.0NaN0.0NaN4780.0NaN
11811990057.017.016234.0C0NaN1...HGSOC0.01.01.0655.00.0DOD3741.01.0
12012190564.038.02207.0CmelanomaNaN1...HGSOC1.00.0NaNNaN1.0DOD2445NaN1.0
13613790054.019.02964.0Cneurofibromatosisremotebreast11...HGSOC1.00.01.0575.01.0DOD13301.01.0
13713870570.026.01210.0Asian0NaN1...HGSOC1.00.00.0268.00.0DOD4711.01.0
13914070571.021.01046.0CskincancerNaN1...HGSOC1.00.0NaNNaN0.0NaN206NaNNaN
14014170531.031.0575.0C011...HGSOC1.00.01.0613.01.0DOD16281.01.0
14514670071.021.010824.0C0NaN1...HGSOC1.00.00.0263.00.0DOD3521.01.0
14814970052.026.07363.0CpapillarythyroidNaN1...HGSOC1.00.01.0NaN0.0NED27060.00.0
15215380564.023.0968.0Cothermalignantneoplasmsitenotspecified21...HGSOC1.00.01.0361.01.0DOD23361.01.0
15615780556.036.01971.0C021...ENDOOV1.00.01.0NaN0.0DOD16670.01.0
15916090559.027.089.0Cbreast01...HGSOC0.01.01.0160.01.0DOD3281.01.0
16116280075.020.07482.0C001...serousofMullerianorigin1.00.01.0536.00.0DOD23531.01.0
16816980575.035.0245.0C0NaN1...HGSOC1.00.01.01003.00.0DOD14421.01.0
17017180560.034.0500.0C0NaN1...HGSOC1.00.01.0302.00.0DOD4561.01.0
17317450054.036.08529.0C001...HGSPC1.00.01.0387.00.0DOD6601.01.0
17617790060.032.0919.0Ccolon01...HGSOC1.00.01.0450.01.0DOD17431.01.0
17717880067.027.0107.0Cbasalcellcarcinoma01...HGSOC0.01.01.0416.00.0DOD9771.01.0
17817980083.025.0NaNC0NaN1...HGSOC1.00.01.0NaNNaNDOD1070NaN1.0
18118280081.028.0990.0C0NaN1...HGSOC1.00.00.0381.00.0DOD15521.01.0
18218370572.022.0597.0Cbreast01...HGSOC1.00.01.0NaNNaNDOD1036NaN1.0
18318490072.026.03788.0CbreastNaN1...HGSOC1.00.01.0282.00.0NaN4681.0NaN
18618780027.022.0922.0C001...serousprimarilylowgradewfociofhighgrade1.01.01.0540.00.0DOD12791.01.0
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageHLA_Cytoplasm_Intensity_AverageCKs_Cytoplasm_Intensity_AverageKi67_Nucleus_Intensity_AverageCD163_Cytoplasm_Intensity_AverageColVI_Cytoplasm_Intensity_AverageCD20_Cytoplasm_Intensity_AveragePD1_Cytoplasm_Intensity_AverageAXL_Cytoplasm_Intensity_AverageCD31_Cytoplasm_Intensity_Average...Nucleus_RoundnessNuc_XROI_indexNucleus_SizeSample_IDimmune_checkpointCell_SizePatientUnique_ROI_indexPrimary_chem(1)_vs_surg(0)
ID
DD3S1_Cell_0-0.677863-0.417494-0.912537-0.8178760.9300990.232078-0.4831581.5356040.8073391.167755...0.9550401484.7717290127DD3S1.csvNone3396161a1.0
DD3S1_Cell_1-0.677863-0.516487-0.838037-0.8696851.1149240.301333-0.3447701.6683680.8754551.643023...0.9666431426.2500000112DD3S1.csvNone3446161a1.0
DD3S1_Cell_2-0.677863-0.141921-1.016023-0.7558790.8345770.259216-0.4382921.3363080.7050881.053636...0.7215341531.1104740181DD3S1.csvNone4226161a1.0
DD3S1_Cell_3-0.741282-0.460472-0.491711-0.8180840.6482000.107027-0.4448891.2498050.6607071.165861...0.5871961518.9075930119DD3S1.csvNone2786161a1.0
DD3S1_Cell_6-0.621521-0.247254-0.867127-0.7425440.8105790.272128-0.5071171.2514340.9471722.545301...0.9357161471.914917047DD3S1.csvNone2046161a1.0
..................................................................
TMA_Cell_1157550.4782750.558670-0.9628401.7322910.507434-0.9126410.3113220.8160680.5965200.090397...0.98219615564.45800859142TMA.csvNone386c59c59aCONTROL
TMA_Cell_1157560.2974180.420594-0.9716321.9669550.304365-1.1641120.866636-0.092857-0.241830-0.617835...0.77597715629.6806645947TMA.csvNone270c59c59aCONTROL
TMA_Cell_1157570.3469500.453951-0.6028931.3389560.559435-0.8013330.4470610.9881561.5678690.403878...0.68874715518.4218755964TMA.csvNone202c59c59aCONTROL
TMA_Cell_115758-0.1894150.508840-0.8860410.647980-0.227224-1.022549-0.0992560.2197550.603715-0.219145...0.75140215539.2753915958TMA.csvNone182c59c59aCONTROL
TMA_Cell_1157600.2457770.460219-1.0038400.191158-0.313127-1.1206750.004962-0.3161991.727776-0.495501...0.67412615542.96191459106TMA.csvNone295c59c59aCONTROL
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageHLA_Cytoplasm_Intensity_AverageCKs_Cytoplasm_Intensity_AverageKi67_Nucleus_Intensity_AverageCD163_Cytoplasm_Intensity_AverageColVI_Cytoplasm_Intensity_AverageCD20_Cytoplasm_Intensity_AveragePD1_Cytoplasm_Intensity_AverageAXL_Cytoplasm_Intensity_AverageCD31_Cytoplasm_Intensity_Average...Nucleus_RoundnessNuc_XROI_indexNucleus_SizeSample_IDimmune_checkpointCell_SizePatientUnique_ROI_indexPrimary_chem(1)_vs_surg(0)
ID
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageHLA_Cytoplasm_Intensity_AverageCKs_Cytoplasm_Intensity_AverageKi67_Nucleus_Intensity_AverageCD163_Cytoplasm_Intensity_AverageColVI_Cytoplasm_Intensity_AverageCD20_Cytoplasm_Intensity_AveragePD1_Cytoplasm_Intensity_AverageAXL_Cytoplasm_Intensity_AverageCD31_Cytoplasm_Intensity_Average...Nucleus_RoundnessNuc_XROI_indexNucleus_SizeSample_IDimmune_checkpointCell_SizePatientUnique_ROI_indexPrimary_chem(1)_vs_surg(0)
ID
DD3S1_Cell_0-0.677863-0.417494-0.912537-0.8178760.9300990.232078-0.4831581.5356040.8073391.167755...0.9550401484.7717290127DD3S1.csvNone3396161a1.0
DD3S1_Cell_1-0.677863-0.516487-0.838037-0.8696851.1149240.301333-0.3447701.6683680.8754551.643023...0.9666431426.2500000112DD3S1.csvNone3446161a1.0
DD3S1_Cell_2-0.677863-0.141921-1.016023-0.7558790.8345770.259216-0.4382921.3363080.7050881.053636...0.7215341531.1104740181DD3S1.csvNone4226161a1.0
DD3S1_Cell_3-0.741282-0.460472-0.491711-0.8180840.6482000.107027-0.4448891.2498050.6607071.165861...0.5871961518.9075930119DD3S1.csvNone2786161a1.0
DD3S1_Cell_6-0.621521-0.247254-0.867127-0.7425440.8105790.272128-0.5071171.2514340.9471722.545301...0.9357161471.914917047DD3S1.csvNone2046161a1.0
..................................................................
DD5S3_Cell_62826-0.4460250.4802121.195440-0.081463-0.634343-0.8838151.0509280.1647090.1039860.171579...0.60976413449.42675834103DD5S3.csvNone237187187c1.0
DD5S3_Cell_62828-0.4144400.4166681.542926-0.203248-0.076555-0.7837590.4233460.6383050.3469700.453372...0.73684413469.3535163465DD5S3.csvNone231187187c1.0
DD5S3_Cell_62829-0.7205690.072144-0.311962-0.4814421.236053-0.4688130.2523532.1290421.1118091.340371...0.69131513390.4472663485DD5S3.csvNone224187187c1.0
DD5S3_Cell_62830-0.4425000.368654-1.491754-0.3162700.029502-0.7365220.3908830.8618940.4616850.586409...0.89270713430.1787113456DD5S3.csvNone139187187c1.0
DD5S3_Cell_628310.0408921.166606-1.6767530.249586-1.486438-1.0728782.024627-0.730182-0.355148-0.360887...0.67638813445.4794923448DD5S3.csvNone183187187c1.0
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageHLA_Cytoplasm_Intensity_AverageCKs_Cytoplasm_Intensity_AverageKi67_Nucleus_Intensity_AverageCD163_Cytoplasm_Intensity_AverageColVI_Cytoplasm_Intensity_AverageCD20_Cytoplasm_Intensity_AveragePD1_Cytoplasm_Intensity_AverageAXL_Cytoplasm_Intensity_AverageCD31_Cytoplasm_Intensity_Average...Nucleus_RoundnessNuc_XROI_indexNucleus_SizeSample_IDimmune_checkpointCell_SizePatientUnique_ROI_indexPrimary_chem(1)_vs_surg(0)
ID
DD3S1_Cell_1910-1.137775-0.495306-1.178944-0.8329941.0677651.432729-0.2208351.9523021.0211301.235209...0.8733201143.897461178DD3S1.csvNone2656262a0.0
DD3S1_Cell_1911-1.3997890.7911060.5676680.2151550.518692-0.627981-0.0009231.3756520.7252740.945061...0.5669331396.333252193DD3S1.csvNone2106262a0.0
DD3S1_Cell_1922-1.186023-0.520883-1.104365-0.8941900.9888751.417141-0.3285881.8694490.9786221.185912...0.8863861148.870972162DD3S1.csvNone1966262a0.0
DD3S1_Cell_1928-0.3293970.3965471.7462121.3131601.139536-0.5460201.5869741.7635980.9243141.122929...0.7381591097.823486151DD3S1.csvNone1596262a0.0
DD3S1_Cell_1942-0.970875-0.1263151.0721480.1782761.103388-0.498249-0.0260611.9897141.0403251.257470...0.8901131402.0000001114DD3S1.csvNone2056262a0.0
..................................................................
DD5S3_Cell_64060-0.6778630.887158-0.5281830.5251425.217188-1.300569-0.775098-1.455787-0.908090-0.862636...0.83037913503.91503935106DD5S3.csvNone378186186a0.0
DD5S3_Cell_640610.4799940.4154560.8196580.6236112.082444-1.0538881.6712350.310590-0.309031-0.235059...0.64609813254.2109383590DD5S3.csvNone151186186a0.0
DD5S3_Cell_640620.6607360.4409651.4090100.4068282.082444-0.8493591.6223541.1286030.1876630.290273...0.56623313260.9013673561DD5S3.csvNone146186186a0.0
DD5S3_Cell_640630.2328800.5050080.7980551.7216040.625211-1.0221220.833309-0.489938-0.231888-0.208742...0.78822613292.1445313576DD5S3.csvNone326186186a0.0
DD5S3_Cell_64066-0.1664630.896852-1.9033973.4369841.873290-0.6733522.6130961.1608960.6150910.764317...0.79190713420.0654303546DD5S3.csvB7H4232186186a0.0
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageHLA_Cytoplasm_Intensity_AverageCKs_Cytoplasm_Intensity_AverageKi67_Nucleus_Intensity_AverageCD163_Cytoplasm_Intensity_AverageColVI_Cytoplasm_Intensity_AverageCD20_Cytoplasm_Intensity_AveragePD1_Cytoplasm_Intensity_AverageAXL_Cytoplasm_Intensity_AverageCD31_Cytoplasm_Intensity_Average...Nucleus_RoundnessNuc_XROI_indexNucleus_SizeSample_IDimmune_checkpointCell_SizePatientUnique_ROI_indexPrimary_chem(1)_vs_surg(0)
ID
TMA_Cell_4-0.3670503.386458-2.000166-0.4599722.082444-0.3311270.0745760.3679980.2082852.426724...0.6394971603.6105960131TMA.csvNone307c0c0aCONTROL
TMA_Cell_300-0.7380402.894731-2.027276-0.5363342.4636640.6154130.4340080.1458700.0943200.796244...0.5576691870.953491086TMA.csvNone271c0c0aCONTROL
TMA_Cell_1231-0.1663333.870697-1.953719-0.2899152.276577-0.7604630.8560600.7485740.4035441.869273...0.9094911076.4869380115TMA.csvNone215c0c0aCONTROL
TMA_Cell_1240-0.2937662.246166-1.945873-0.6073282.082444-0.6153450.2435310.8128630.4365292.194035...0.9455921089.709717093TMA.csvNone198c0c0aCONTROL
TMA_Cell_2107-0.6778632.130819-2.035940-0.7465821.5383671.2463040.1799430.0748790.0578980.966884...0.6645891375.9396970116TMA.csvNone167c0c0aCONTROL
..................................................................
TMA_Cell_1157550.4782750.558670-0.9628401.7322910.507434-0.9126410.3113220.8160680.5965200.090397...0.98219615564.45800859142TMA.csvNone386c59c59aCONTROL
TMA_Cell_1157560.2974180.420594-0.9716321.9669550.304365-1.1641120.866636-0.092857-0.241830-0.617835...0.77597715629.6806645947TMA.csvNone270c59c59aCONTROL
TMA_Cell_1157570.3469500.453951-0.6028931.3389560.559435-0.8013330.4470610.9881561.5678690.403878...0.68874715518.4218755964TMA.csvNone202c59c59aCONTROL
TMA_Cell_115758-0.1894150.508840-0.8860410.647980-0.227224-1.022549-0.0992560.2197550.603715-0.219145...0.75140215539.2753915958TMA.csvNone182c59c59aCONTROL
TMA_Cell_1157600.2457770.460219-1.0038400.191158-0.313127-1.1206750.004962-0.3161991.727776-0.495501...0.67412615542.96191459106TMA.csvNone295c59c59aCONTROL
\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", + " \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", + " \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", + " \n", + " \n", + "
countsSample_ID
DD3S1.csv68697DD3S1.csv
DD3S2.csv70850DD3S2.csv
DD3S3.csv116265DD3S3.csv
DD4S1.csv70748DD4S1.csv
DD4S2.csv51745DD4S2.csv
DD4S3.csv70818DD4S3.csv
DD5S1.csv69463DD5S1.csv
DD5S2.csv45403DD5S2.csv
DD5S3.csv45898DD5S3.csv
TMA.csv94742TMA.csv
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
countsSample_IDstromacancerimmuneendothelialstroma_percimmune_perccancer_percendothelial_perc
DD3S1.csv68697DD3S1.csv10690489817360166615.610.771.32.4
DD3S2.csv70850DD3S2.csv12064510595977175017.08.472.12.5
DD3S3.csv116265DD3S3.csv234127700013075277820.111.266.22.4
DD4S1.csv70748DD4S1.csv7249540137433205310.210.576.32.9
DD4S2.csv51745DD4S2.csv6193394704850123212.09.476.32.4
DD4S3.csv70818DD4S3.csv85165059810331137312.014.671.41.9
DD5S1.csv69463DD5S1.csv17067437235878279524.68.562.94.0
DD5S2.csv45403DD5S2.csv11098308392131133524.44.767.92.9
DD5S3.csv45898DD5S3.csv9018300605656116419.612.365.52.5
TMA.csv94742TMA.csv23121599789356228724.49.963.32.4
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
dcbtcd4tcd8m1m2tregimmune_othercancerĪ±sma_mycafstroma_otherendothelialtotal_cells
DD3S1.csv810.02991284931012969944898139676723166668697.0
DD3S2.csv2940.01915235094253812615105947897275175070850.0
DD3S3.csv280138.06857355025296281874770007424159882778116265.0
DD4S1.csv27229.02667195076381223895401331064143205370748.0
DD4S2.csv13014.019381694112102198413947016644529123251745.0
DD4S3.csv115031.0235329401553283833365059836864830137370818.0
DD5S1.csv583139.028405365042828122043723697610091279569463.0
DD5S2.csv16016.0113514513163144673083938767222133545403.0
DD5S3.csv146735.02000687479110138653006048314187116445898.0
TMA.csv1322309.050279521091120960759978487518246228794742.0
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
dcbtcd4tcd8m1m2tregimmune_othercancerĪ±sma_mycaf...tcd8_percm1_percm2_perctreg_percimmune_other_perccancer_percĪ±sma_mycaf_percstroma_other_percendothelial_percSample_ID
DD3S1.csv810.0299128493101296994489813967...4.1471970.4512570.1877810.0087341.44693471.3000575.7746349.7864542.425142DD3S1.csv
DD3S2.csv2940.0191523509425381261510594789...3.3168670.1326750.0352860.0536341.77981772.0663376.75935110.2681722.470007DD3S2.csv
DD3S3.csv280138.06857355025296281874770007424...3.0533690.2167460.0825700.0240831.61183566.2280146.38541313.7513442.389369DD3S3.csv
DD4S1.csv27229.0266719507638122389540133106...2.7562620.1074240.0537120.0169623.37677476.3456214.3902305.8559962.901849DD4S1.csv
DD4S2.csv13014.01938169411210219841394701664...3.2737460.2164460.1971200.0367191.62527876.2779013.2157708.7525362.380906DD4S2.csv
DD4S3.csv115031.023532940155328383336505983686...4.1514870.2188710.4631590.0536594.71066771.4479375.2048916.8203001.938773DD4S3.csv
DD5S1.csv583139.0284053650428281220437236976...0.7716340.7255660.0403090.0403091.75633162.94430110.04275714.5271584.023725DD5S1.csv
DD5S2.csv16016.011351451316314467308393876...0.3193620.2885270.1387570.0308351.02856667.9228248.53688115.9064382.940334DD5S2.csv
DD5S3.csv146735.0200068747911013865300604831...1.4967971.0436180.2396620.0283241.88461465.49305010.5255139.1224022.536058DD5S3.csv
TMA.csv1322309.0502795210911209607599784875...1.0048340.1150490.0116100.2205990.64068763.3066645.14555319.2586182.413924TMA.csv
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageHLA_Cytoplasm_Intensity_AverageCKs_Cytoplasm_Intensity_AverageKi67_Nucleus_Intensity_AverageCD163_Cytoplasm_Intensity_AverageColVI_Cytoplasm_Intensity_AverageCD20_Cytoplasm_Intensity_AveragePD1_Cytoplasm_Intensity_AverageAXL_Cytoplasm_Intensity_AverageCD31_Cytoplasm_Intensity_Average...Nucleus_RoundnessNuc_XROI_indexNucleus_SizeSample_IDimmune_checkpointCell_SizePatientUnique_ROI_indexPrimary_chem(1)_vs_surg(0)
ID
DD3S1_Cell_0-0.677863-0.417494-0.912537-0.8178760.9300990.232078-0.4831581.5356040.8073391.167755...0.9550401484.7717290127DD3S1.csvNone3396161a1.0
DD3S1_Cell_1-0.677863-0.516487-0.838037-0.8696851.1149240.301333-0.3447701.6683680.8754551.643023...0.9666431426.2500000112DD3S1.csvNone3446161a1.0
DD3S1_Cell_2-0.677863-0.141921-1.016023-0.7558790.8345770.259216-0.4382921.3363080.7050881.053636...0.7215341531.1104740181DD3S1.csvNone4226161a1.0
DD3S1_Cell_3-0.741282-0.460472-0.491711-0.8180840.6482000.107027-0.4448891.2498050.6607071.165861...0.5871961518.9075930119DD3S1.csvNone2786161a1.0
DD3S1_Cell_6-0.621521-0.247254-0.867127-0.7425440.8105790.272128-0.5071171.2514340.9471722.545301...0.9357161471.914917047DD3S1.csvNone2046161a1.0
..................................................................
TMA_Cell_1157550.4782750.558670-0.9628401.7322910.507434-0.9126410.3113220.8160680.5965200.090397...0.98219615564.45800859142TMA.csvNone386c59c59aCONTROL
TMA_Cell_1157560.2974180.420594-0.9716321.9669550.304365-1.1641120.866636-0.092857-0.241830-0.617835...0.77597715629.6806645947TMA.csvNone270c59c59aCONTROL
TMA_Cell_1157570.3469500.453951-0.6028931.3389560.559435-0.8013330.4470610.9881561.5678690.403878...0.68874715518.4218755964TMA.csvNone202c59c59aCONTROL
TMA_Cell_115758-0.1894150.508840-0.8860410.647980-0.227224-1.022549-0.0992560.2197550.603715-0.219145...0.75140215539.2753915958TMA.csvNone182c59c59aCONTROL
TMA_Cell_1157600.2457770.460219-1.0038400.191158-0.313127-1.1206750.004962-0.3161991.727776-0.495501...0.67412615542.96191459106TMA.csvNone295c59c59aCONTROL
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + "
dcbtcd4tcd8m1m2tregimmune_othercancerĪ±sma_mycafstroma_otherendothelialTotal_cells
102.00.0900.024.0167.0100.05.028.03981.0388.0530.0335.06460.0
10021.00.092.046.00.03.01.030.01449.030.073.0131.01876.0
1012.00.020.015.03.01.00.024.01896.081.0173.060.02275.0
1021.02.045.024.05.01.00.038.03564.018.091.016.03805.0
10357.00.072.0555.07.00.01.078.02157.017.0131.0117.03192.0
..........................................
920.00.011.0990.03.025.01.0184.0424.0140.022.015.01815.0
960.00.076.02.02.01.00.04.01854.01.016.03.01959.0
970.00.0174.038.00.00.01.056.02193.028.0163.0102.02755.0
600.00.00.0107.09.016.01.057.01979.0107.01.032.02309.0
620.00.00.023.03.015.00.04.0151.091.020.03.0310.0
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
dcbtcd4tcd8m1m2tregimmune_othercancerĪ±sma_mycaf...tcd8_percm1_percm2_perctreg_percimmune_other_perccancer_percĪ±sma_mycaf_percstroma_other_percendothelial_percPatient
102.00.0900.024.0167.0100.05.028.03981.0388.0...0.3715172.5851391.5479880.0773990.43343761.6253876.0061928.2043345.18575910
10021.00.092.046.00.03.01.030.01449.030.0...2.4520260.0000000.1599150.0533051.59914777.2388061.5991473.8912586.982942100
1012.00.020.015.03.01.00.024.01896.081.0...0.6593410.1318680.0439560.0000001.05494583.3406593.5604407.6043962.637363101
1021.02.045.024.05.01.00.038.03564.018.0...0.6307490.1314060.0262810.0000000.99868693.6662290.4730622.3915900.420499102
10357.00.072.0555.07.00.01.078.02157.017.0...17.3872180.2192980.0000000.0313282.44360967.5751880.5325814.1040103.665414103
..................................................................
920.00.011.0990.03.025.01.0184.0424.0140.0...54.5454550.1652891.3774100.05509610.13774123.3608827.7134991.2121210.82644692
960.00.076.02.02.01.00.04.01854.01.0...0.1020930.1020930.0510460.0000000.20418694.6401230.0510460.8167430.15313996
970.00.0174.038.00.00.01.056.02193.028.0...1.3793100.0000000.0000000.0362982.03266879.6007261.0163345.9165153.70235997
600.00.00.0107.09.016.01.057.01979.0107.0...4.6340410.3897790.6929410.0433092.46860185.7080994.6340410.0433091.38588160
620.00.00.023.03.015.00.04.0151.091.0...7.4193550.9677424.8387100.0000001.29032348.70967729.3548396.4516130.96774262
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + "
dcbtcd4tcd8m1m2tregimmune_othercancerĪ±sma_mycafstroma_otherendothelialTotal_cells
102.00.0900.024.0167.0100.05.028.03981388.05303356460.0
111.00.07.05.00.00.00.026.0556409.05103876194.0
141.00.0190.06.02.01.00.053.07142100.0315577867.0
154.00.032.07.07.01.00.019.01823747.0232862958.0
1938.00.0983.0258.03.00.04.064.023221543.010752286518.0
201.00.026.023.00.00.00.0152.0431740.0640945293.0
221.084.05.0416.070.01.00.057.0244788.0163583390.0
2367.01.0239.0750.00.03.01.0155.0337012.0126624786.0
261.00.0159.017.00.00.01.015.0295049.0472463710.0
275.00.045.00.03.02.00.010.0452214.017051236429.0
281.00.026.023.01.00.00.090.0983718.0905562803.0
307.00.0986.0148.03.00.05.074.014041049.013573025335.0
3230.016.01137.0628.052.015.00.0122.063275.061488954.0
3314.00.064.033.00.01.01.026.01187398.02633122299.0
3419.00.034.0435.00.02.00.0219.0142685.04562271.0
3513.00.02.0861.026.013.01.071.01892.02251205.0
36107.00.068.01299.01.00.00.0403.0280593.0233505059.0
372.00.01.060.00.00.00.083.0435636.023734634.0
384.01.020.021.04.04.02.041.0480695.087505135.0
3911.00.0241.035.00.00.00.045.0388922.0145274415.0
431.02.01730.01.01.04.01.023.0145711.0423853769.0
412.00.0153.06.00.00.02.02.0714.086254.0
4250.00.0746.0481.050.012.032.0209.029688.02911645011.0
439.00.044.010.00.00.01.07.098315.0362701501.0
4412.00.048.014.00.00.00.04.0362315.0321304067.0
459.00.0277.024.00.03.00.080.04357446.07162146126.0
469.00.037.022.03.00.00.09.0228121.0153112546.0
51.01.066.040.078.06.00.055.03931845.0124452654.0
502.00.0130.091.05.00.01.066.03155876.06924405458.0
5237.00.091.07.025.01.00.0175.03656668.021241396923.0
53144.00.018.065.00.00.00.075.03079169.0901524503.0
543.00.02.01133.03.02.00.0340.0471492.04001286817.0
576.00.069.062.00.00.00.043.0576530.0194626231.0
581.00.017.039.00.00.01.06.0134122.095147562.0
62.00.0235.05.01.05.00.071.03275129.0619844426.0
635.00.0117.099.03.01.00.058.04629389.058725431.0
71.00.0184.031.00.00.00.011.077124.0531201573.0
82.00.0704.018.00.00.04.028.04514235.012942247023.0
180.027.0328.0395.01.00.02.083.0837123.01922379659.0
250.01.05.053.00.02.00.042.0184422.0219432231.0
290.02.0105.027.0101.03.01.059.0244828.03071513232.0
30.03.06.07.00.00.00.017.010377.0899662042.0
120.00.0318.06.02.00.02.0153.074488.06583838978.0
130.00.039.028.00.01.00.021.018640.0159162128.0
160.00.045.041.00.03.00.0119.05667240.08031167034.0
170.00.0220.035.02.00.01.028.041291400.05381936546.0
210.00.0234.091.00.00.00.0177.07353108.0270828315.0
240.00.03.045.01.00.00.027.04639.0818637.0
400.00.011.06.01.00.00.017.022741562.03111004282.0
470.00.014.010.01.00.01.012.02740235.0189193221.0
480.00.022.051.00.00.00.014.01252310.081451775.0
490.00.05.0206.00.00.00.085.01300113.0291311869.0
510.00.04.01.01.00.01.00.0111.061944.0
550.00.02.0114.03.07.00.058.014593.0282401968.0
560.00.01.012.02.00.00.020.03482199.070533839.0
590.00.024.068.017.06.00.048.05450280.039816013.0
610.00.079.0144.04.019.00.037.0958375.0178751869.0
90.00.0465.082.00.01.01.036.0473367.013132236921.0
600.00.00.0107.09.016.01.057.01979107.01322309.0
620.00.00.023.03.015.00.04.015191.0203310.0
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
dcbtcd4tcd8m1m2tregimmune_othercancerĪ±sma_mycaf...tcd8_percm1_percm2_perctreg_percimmune_other_perccancer_percĪ±sma_mycaf_percstroma_other_percendothelial_percPatient
102.00.0900.024.0167.0100.05.028.03981388.0...0.3715172.5851391.5479880.0773990.43343761.6253876.0061928.2043345.18575910
111.00.07.05.00.00.00.026.0556409.0...0.0807230.0000000.0000000.0000000.4197618.9764296.60316482.3861801.40458511
141.00.0190.06.02.01.00.053.07142100.0...0.0762680.0254230.0127110.0000000.67370090.7842891.2711334.0040680.72454614
154.00.032.07.07.01.00.019.01823747.0...0.2366460.2366460.0338070.0000000.64232661.62947925.2535507.8431372.90737015
1938.00.0983.0258.03.00.04.064.023221543.0...3.9582690.0460260.0000000.0613690.98189635.62442523.67290616.4927893.49800619
201.00.026.023.00.00.00.0152.0431740.0...0.4345360.0000000.0000000.0000002.87171781.5605520.75571512.0914421.77593020
221.084.05.0416.070.01.00.057.0244788.0...12.2713862.0648970.0294990.0000001.68141672.1828912.5958704.8082601.71091422
2367.01.0239.0750.00.03.01.0155.0337012.0...15.6707060.0000000.0626830.0208943.23861370.4137070.2507312.6326791.29544523
261.00.0159.017.00.00.01.015.0295049.0...0.4582210.0000000.0000000.0269540.40431379.5148251.32075512.7223721.23989226
275.00.045.00.03.02.00.010.0452214.0...0.0000000.0466640.0311090.0000000.15554570.3375330.21776326.5204541.91320627
281.00.026.023.01.00.00.090.0983718.0...0.8205490.0356760.0000000.0000003.21084635.06956825.61541232.2868361.99785928
307.00.0986.0148.03.00.05.074.014041049.0...2.7741330.0562320.0000000.0937211.38706726.31677619.66260525.4358015.66073130
3230.016.01137.0628.052.015.00.0122.063275.0...7.0136250.5807460.1675230.0000001.36252070.6611570.0558416.8572700.08934632
3314.00.064.033.00.01.01.026.01187398.0...1.4354070.0000000.0434970.0434971.13092651.63114417.31187511.43975613.57111833
3419.00.034.0435.00.02.00.0219.0142685.0...19.1545570.0000000.0880670.0000009.64332962.7917223.7428451.9815060.26420134
3513.00.02.0861.026.013.01.071.01892.0...71.4522822.1576761.0788380.0829885.89211615.6846470.1659750.1659752.07468935
36107.00.068.01299.01.00.00.0403.0280593.0...25.6770110.0197670.0000000.0000007.96600155.4457401.8383084.6056530.98833836
372.00.01.060.00.00.00.083.0435636.0...1.2947780.0000000.0000000.0000001.79110994.0008630.7768670.4963311.57531337
384.01.020.021.04.04.02.041.0480695.0...0.4089580.0778970.0778970.0389480.79844293.5929891.8500491.6942550.97371038
3911.00.0241.035.00.00.00.045.0388922.0...0.7927520.0000000.0000000.0000001.01925388.0860700.4983013.2842580.61155239
431.02.01730.01.01.04.01.023.0145711.0...0.0265320.0265320.1061290.0265320.61024138.6574690.29185511.2231362.2552404
412.00.0153.06.00.00.02.02.0714.0...2.3622050.0000000.0000000.7874020.78740227.9527561.5748033.1496062.36220541
4250.00.0746.0481.050.012.032.0209.029688.0...9.5988820.9978050.2394730.6385954.17082459.2296950.1596495.8072243.27280042
439.00.044.010.00.00.01.07.098315.0...0.6662230.0000000.0000000.0666220.46635665.4896740.99933424.1172554.66355843
4412.00.048.014.00.00.00.04.0362315.0...0.3442340.0000000.0000000.0000000.09835389.0828620.3688227.8927960.73764444
459.00.0277.024.00.03.00.080.04357446.0...0.3917730.0000000.0489720.0000001.30590971.1230827.28044411.6878883.49330745
469.00.037.022.03.00.00.09.0228121.0...0.8641010.1178320.0000000.0000000.35349689.5915160.8248236.0094270.43205046
51.01.066.040.078.06.00.055.03931845.0...1.5071592.9389600.2260740.0000002.07234414.80783769.5177094.6721931.6955545
502.00.0130.091.05.00.01.066.03155876.0...1.6672770.0916090.0000000.0183221.20923457.80505716.04983512.6786378.06156150
5237.00.091.07.025.01.00.0175.03656668.0...0.1011120.3611150.0144450.0000002.52780652.8094769.64899630.6803412.00780052
53144.00.018.065.00.00.00.075.03079169.0...1.4434820.0000000.0000000.0000001.66555668.3766383.75305420.0088831.15478653
543.00.02.01133.03.02.00.0340.0471492.0...16.6202140.0440080.0293380.0000004.98753169.1506531.3495675.8676841.87765954
576.00.069.062.00.00.00.043.0576530.0...0.9950250.0000000.0000000.0000000.69009892.5212650.4814643.1134650.99502557
581.00.017.039.00.00.01.06.0134122.0...6.9395020.0000000.0000000.1779361.06761623.84341621.70818516.90391526.15658458
62.00.0235.05.01.05.00.071.03275129.0...0.1129690.0225940.1129690.0000001.60415773.9945772.91459613.9855401.8978766
635.00.0117.099.03.01.00.058.04629389.0...1.8228690.0552380.0184130.0000001.06794385.2329227.1625851.0679431.32572363
71.00.0184.031.00.00.00.011.077124.0...1.9707570.0000000.0000000.0000000.69930149.0146221.52574733.7571521.2714567
82.00.0704.018.00.00.04.028.04514235.0...0.2563010.0000000.0000000.0569560.39869064.2745273.34614818.4251743.1895208
180.027.0328.0395.01.00.02.083.0837123.0...4.0894500.0103530.0000000.0207060.85930286.6652860.2381201.9877832.45367018
250.01.05.053.00.02.00.042.0184422.0...2.3756160.0000000.0896460.0000001.88256482.6535190.9861059.8162261.92738725
290.02.0105.027.0101.03.01.059.0244828.0...0.8353963.1250000.0928220.0309411.82549575.7425740.8663379.4987624.67203029
30.03.06.07.00.00.00.017.010377.0...0.3428010.0000000.0000000.0000000.83251750.7835460.34280144.0254653.2321253
120.00.0318.06.02.00.02.0153.074488.0...0.0668300.0222770.0000000.0222771.70416682.9583430.0891077.3290274.26598412
130.00.039.028.00.01.00.021.018640.0...1.3157890.0000000.0469920.0000000.98684287.5939850.0000007.4718050.75188013
160.00.045.041.00.03.00.0119.05667240.0...0.5828830.0000000.0426500.0000001.69178380.5658233.41199911.4159801.64913316
170.00.0220.035.02.00.01.028.041291400.0...0.5346780.0305530.0000000.0152770.42774263.07668821.3871078.2187602.94836517
210.00.0234.091.00.00.00.0177.07353108.0...1.0944080.0000000.0000000.0000002.12868388.4305471.2988573.2471440.98617021
240.00.03.045.01.00.00.027.04639.0...7.0643640.1569860.0000000.0000004.23861972.6844581.41287312.7158561.25588724
400.00.011.06.01.00.00.017.022741562.0...0.1401210.0233540.0000000.0000000.39701153.10602536.4782817.2629612.33535740
470.00.014.010.01.00.01.012.02740235.0...0.3104630.0310460.0000000.0310460.37255585.0667497.2958715.8677430.58987947
480.00.022.051.00.00.00.014.01252310.0...2.8732390.0000000.0000000.0000000.78873270.53521117.4647894.5633802.53521148
490.00.05.0206.00.00.00.085.01300113.0...11.0219370.0000000.0000000.0000004.54788769.5559126.0460141.5516327.00909649
510.00.04.01.01.00.01.00.0111.0...2.2727272.2727270.0000002.2727270.00000025.0000002.27272713.63636443.18181851
550.00.02.0114.03.07.00.058.014593.0...5.7926830.1524390.3556910.0000002.94715474.1361790.15243914.3292682.03252055
560.00.01.012.02.00.00.020.03482199.0...0.3125810.0520970.0000000.0000000.52096990.7007035.1836421.8233921.38056856
590.00.024.068.017.06.00.048.05450280.0...1.1308830.2827210.0997840.0000000.79827090.6369534.6565770.6485951.34708159
610.00.079.0144.04.019.00.037.0958375.0...7.7046550.2140181.0165860.0000001.97966851.25735720.0642059.5238104.01284161
90.00.0465.082.00.01.01.036.0473367.0...1.1848000.0000000.0144490.0144490.52015668.3860710.96806818.9712473.2220789
600.00.00.0107.09.016.01.057.01979107.0...4.6340410.3897790.6929410.0433092.46860185.7080994.6340410.0433091.38588160
620.00.00.023.03.015.00.04.015191.0...7.4193550.9677424.8387100.0000001.29032348.70967729.3548396.4516130.96774262
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageHLA_Cytoplasm_Intensity_AverageCKs_Cytoplasm_Intensity_AverageKi67_Nucleus_Intensity_AverageCD163_Cytoplasm_Intensity_AverageColVI_Cytoplasm_Intensity_AverageCD20_Cytoplasm_Intensity_AveragePD1_Cytoplasm_Intensity_AverageAXL_Cytoplasm_Intensity_AverageCD31_Cytoplasm_Intensity_Average...Nucleus_RoundnessNuc_XROI_indexNucleus_SizeSample_IDimmune_checkpointCell_SizePatientUnique_ROI_indexPrimary_chem(1)_vs_surg(0)
ID
DD3S1_Cell_0-0.677863-0.417494-0.912537-0.8178760.9300990.232078-0.4831581.5356040.8073391.167755...0.9550401484.7717290127DD3S1.csvNone3396161a1.0
DD3S1_Cell_1-0.677863-0.516487-0.838037-0.8696851.1149240.301333-0.3447701.6683680.8754551.643023...0.9666431426.2500000112DD3S1.csvNone3446161a1.0
DD3S1_Cell_2-0.677863-0.141921-1.016023-0.7558790.8345770.259216-0.4382921.3363080.7050881.053636...0.7215341531.1104740181DD3S1.csvNone4226161a1.0
DD3S1_Cell_3-0.741282-0.460472-0.491711-0.8180840.6482000.107027-0.4448891.2498050.6607071.165861...0.5871961518.9075930119DD3S1.csvNone2786161a1.0
DD3S1_Cell_6-0.621521-0.247254-0.867127-0.7425440.8105790.272128-0.5071171.2514340.9471722.545301...0.9357161471.914917047DD3S1.csvNone2046161a1.0
..................................................................
DD5S3_Cell_62826-0.4460250.4802121.195440-0.081463-0.634343-0.8838151.0509280.1647090.1039860.171579...0.60976413449.42675834103DD5S3.csvNone237187187c1.0
DD5S3_Cell_62828-0.4144400.4166681.542926-0.203248-0.076555-0.7837590.4233460.6383050.3469700.453372...0.73684413469.3535163465DD5S3.csvNone231187187c1.0
DD5S3_Cell_62829-0.7205690.072144-0.311962-0.4814421.236053-0.4688130.2523532.1290421.1118091.340371...0.69131513390.4472663485DD5S3.csvNone224187187c1.0
DD5S3_Cell_62830-0.4425000.368654-1.491754-0.3162700.029502-0.7365220.3908830.8618940.4616850.586409...0.89270713430.1787113456DD5S3.csvNone139187187c1.0
DD5S3_Cell_628310.0408921.166606-1.6767530.249586-1.486438-1.0728782.024627-0.730182-0.355148-0.360887...0.67638813445.4794923448DD5S3.csvNone183187187c1.0
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + "
dcbtcd4tcd8m1m2tregimmune_othercancerĪ±sma_mycafstroma_otherendothelialTotal_cells
111.00.075.00.00.00.026.05564095103876194.0
11127.01.0230.010.03.01.039.089913101026.0
1163.00.042.00.00.00.01.01254563198.0
1191.00.0609.03.00.00.017.0428916104344533.0
12115.02.070454.04.00.02.0350.036521832365875789.0
1372.00.02122.01.01.02.028.013024092021012091.0
140402.00.03856.0307.038.03.06.03566293511592.0
14142.00.015821.010.01.00.025.071565154731120.0
1466.00.0803.01.02.00.052.091689331981578.0
14920.00.027025.0275.03.00.0265.073512504251113379.0
154.00.0327.07.01.00.019.01823747232862958.0
1532.01.056724.061.014.03.0283.015804158233484121.0
15712.01.016173.02.07.00.089.0246313245292969.0
1626.01.0763.01.00.01.031.023216099983134360.0
16968.00.020221.01.00.01.017.015642225942212911.0
1741.00.0244.01.00.00.046.02951203224221820.0
1771.00.01310.01.00.00.028.02597682754571920.0
1825.01.0154.00.03.00.080.0610210237859.0
1836.00.0463.00.01.04.08.05571210461731856.0
18439.00.0461.013.011.01.01.01708540131878.0
1874.00.02721.02.08.02.045.0259971652143490.0
261.00.015917.00.00.01.015.0295049472463710.0
3230.016.01137628.052.015.00.0122.06327561488954.0
51.01.06640.078.06.00.055.03931845124452654.0
71.00.018431.00.00.00.011.077124531201573.0
8532.00.021622.041.016.00.0309.0427338247725266.0
8918.00.025317.022.08.05.0194.0249064871343634.0
9537.01.069166.05.044.01.0549.01851835351433484.0
9825.00.079072.073.070.02.081.0215625322943710.0
1040.01.016930.01.02.03.069.016002891801472491.0
180.027.0328395.01.00.02.083.08371231922379659.0
1600.00.052.00.00.00.030.0112133188171396.0
1710.00.09528.025.01.00.067.05231187041431704.0
1780.00.010.00.00.00.03.0161322081371955.0
1790.00.0131.00.00.02.03.031227231811932.0
400.00.0116.01.00.00.017.0227415623111004282.0
510.00.041.01.00.01.00.011161944.0
610.00.079144.04.019.00.037.0958375178751869.0
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
dcbtcd4tcd8m1m2tregimmune_othercancerĪ±sma_mycaf...tcd8_percm1_percm2_perctreg_percimmune_other_perccancer_percĪ±sma_mycaf_percstroma_other_percendothelial_percPatient
111.00.075.00.00.00.026.0556409...0.0807230.0000000.0000000.0000000.4197618.9764296.60316482.3861801.40458511
11127.01.0230.010.03.01.039.08991...2.9239770.9746590.2923980.0974663.80117087.6218320.0974660.2923980.974659111
1163.00.042.00.00.00.01.01254...1.0101010.0000000.0000000.0000000.50505163.1313132.02020228.2828281.515152116
1191.00.0609.03.00.00.017.0428916...0.1985440.0661810.0000000.0000000.37502894.6172510.3529672.2942860.750055119
12115.02.070454.04.00.02.0350.03652183...0.9328040.0690970.0000000.0345486.04594963.0851623.1611684.07669710.139921121
1372.00.02122.01.01.02.028.01302409...1.0521280.0478240.0478240.0956481.33907262.26685819.5600199.6604504.830225137
140402.00.03856.0307.038.03.06.03566...0.37688419.2839202.3869350.1884420.3768842.1984924.14572918.4045233.203518140
14142.00.015821.010.01.00.025.071565...1.8750000.8928570.0892860.0000002.2321436.33928650.44642913.7500006.517857141
1466.00.0803.01.02.00.052.091689...0.1901140.0633710.1267430.0000003.29531158.0481625.64005120.9759196.210393146
14920.00.027025.0275.03.00.0265.07351250...0.7398648.1385030.0887840.0000007.84255721.75199836.99319312.5776863.284996149
154.00.0327.07.01.00.019.01823747...0.2366460.2366460.0338070.0000000.64232661.62947925.2535507.8431372.90737015
1532.01.056724.061.014.03.0283.01580415...0.5823831.4802230.3397230.0727986.86726538.34020910.07037119.9708818.444552153
15712.01.016173.02.07.00.089.02463132...5.8268780.0673630.2357700.0000002.99764282.9572254.4459411.5156620.976760157
1626.01.0763.01.00.01.031.02321609...0.0688070.0229360.0000000.0229360.71100953.23394513.96789022.8899087.178899162
16968.00.020221.01.00.01.017.01564222...0.7214020.0343520.0000000.0343520.58399253.7272417.62624520.4053597.591893169
1741.00.0244.01.00.00.046.02951203...0.2197800.0549450.0000000.0000002.52747316.20879166.09890112.3076921.208791174
1771.00.01310.01.00.00.028.0259768...0.0000000.0520830.0000000.0000001.45833313.48958340.00000014.32291723.802083177
1825.01.0154.00.03.00.080.06102...0.4656580.0000000.3492430.0000009.31315571.0128060.23282911.8742724.307334182
1836.00.0463.00.01.04.08.055712...0.1616380.0000000.0538790.2155170.43103430.0107760.64655256.3577599.321121183
18439.00.0461.013.011.01.01.017085...0.0532480.6922260.5857290.0532480.05324890.9478170.2662412.1299250.692226184
1874.00.02721.02.08.02.045.02599716...0.6017190.0573070.2292260.0573071.28939874.46991420.5157591.4899710.401146187
261.00.015917.00.00.01.015.0295049...0.4582210.0000000.0000000.0269540.40431379.5148251.32075512.7223721.23989226
3230.016.01137628.052.015.00.0122.063275...7.0136250.5807460.1675230.0000001.36252070.6611570.0558416.8572700.08934632
51.01.06640.078.06.00.055.03931845...1.5071592.9389600.2260740.0000002.07234414.80783769.5177094.6721931.6955545
71.00.018431.00.00.00.011.077124...1.9707570.0000000.0000000.0000000.69930149.0146221.52574733.7571521.2714567
8532.00.021622.041.016.00.0309.0427338...0.4177740.7785800.3038360.0000005.86783181.1431830.7216104.6904671.36726285
8918.00.025317.022.08.05.0194.024906...0.4678040.6053940.2201430.1375895.33847068.5195380.16510713.4012113.68739789
9537.01.069166.05.044.01.0549.0185183...4.7646380.1435131.2629160.02870315.75775053.1285882.38231915.3559134.10447895
9825.00.079072.073.070.02.081.0215625...1.9407011.9676551.8867920.0539082.18328858.1132080.6738548.6792452.53369398
1040.01.016930.01.02.03.069.01600289...1.2043360.0401450.0802890.1204342.76997264.23123211.6017667.2260145.901244104
180.027.0328395.01.00.02.083.0837123...4.0894500.0103530.0000000.0207060.85930286.6652860.2381201.9877832.45367018
1600.00.052.00.00.00.030.0112133...0.1432660.0000000.0000000.0000002.14899780.3008602.36389713.4670491.217765160
1710.00.09528.025.01.00.067.0523118...1.6431921.4671360.0586850.0000003.93192530.6924886.92488341.3145548.392019171
1780.00.010.00.00.00.03.01613220...0.0000000.0000000.0000000.0000000.15345382.50639411.2531974.1432231.892583178
1790.00.0131.00.00.02.03.0312272...0.1072960.0000000.0000000.2145920.32188833.47639529.18454934.1201721.180258179
400.00.0116.01.00.00.017.022741562...0.1401210.0233540.0000000.0000000.39701153.10602536.4782817.2629612.33535740
510.00.041.01.00.01.00.0111...2.2727272.2727270.0000002.2727270.00000025.0000002.27272713.63636443.18181851
610.00.079144.04.019.00.037.0958375...7.7046550.2140181.0165860.0000001.97966851.25735720.0642059.5238104.01284161
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + "
dcbtcd4tcd8m1m2tregimmune_othercancerĪ±sma_mycafstroma_otherendothelialTotal_cells
102.00.0900.024.0167.0100.05.028.03981388.0530335.06460.0
10021.00.092.046.00.03.01.030.0144930.073131.01876.0
1012.00.020.015.03.01.00.024.0189681.017360.02275.0
1021.02.045.024.05.01.00.038.0356418.09116.03805.0
10357.00.072.0555.07.00.01.078.0215717.0131117.03192.0
..........................................
920.00.011.0990.03.025.01.0184.0424140.02215.01815.0
960.00.076.02.02.01.00.04.018541.0163.01959.0
970.00.0174.038.00.00.01.056.0219328.0163102.02755.0
600.00.00.0107.09.016.01.057.01979107.0132.02309.0
620.00.00.023.03.015.00.04.015191.0203.0310.0
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
dcbtcd4tcd8m1m2tregimmune_othercancerĪ±sma_mycaf...tcd8_percm1_percm2_perctreg_percimmune_other_perccancer_percĪ±sma_mycaf_percstroma_other_percendothelial_percPatient
102.00.0900.024.0167.0100.05.028.03981388.0...0.3715172.5851391.5479880.0773990.43343761.6253876.0061928.2043345.18575910
10021.00.092.046.00.03.01.030.0144930.0...2.4520260.0000000.1599150.0533051.59914777.2388061.5991473.8912586.982942100
1012.00.020.015.03.01.00.024.0189681.0...0.6593410.1318680.0439560.0000001.05494583.3406593.5604407.6043962.637363101
1021.02.045.024.05.01.00.038.0356418.0...0.6307490.1314060.0262810.0000000.99868693.6662290.4730622.3915900.420499102
10357.00.072.0555.07.00.01.078.0215717.0...17.3872180.2192980.0000000.0313282.44360967.5751880.5325814.1040103.665414103
..................................................................
920.00.011.0990.03.025.01.0184.0424140.0...54.5454550.1652891.3774100.05509610.13774123.3608827.7134991.2121210.82644692
960.00.076.02.02.01.00.04.018541.0...0.1020930.1020930.0510460.0000000.20418694.6401230.0510460.8167430.15313996
970.00.0174.038.00.00.01.056.0219328.0...1.3793100.0000000.0000000.0362982.03266879.6007261.0163345.9165153.70235997
600.00.00.0107.09.016.01.057.01979107.0...4.6340410.3897790.6929410.0433092.46860185.7080994.6340410.0433091.38588160
620.00.00.023.03.015.00.04.015191.0...7.4193550.9677424.8387100.0000001.29032348.70967729.3548396.4516130.96774262
\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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
NACTACT
Patientimmune_checkpoint
104None64.7631580.000000
PDL10.5263160.000000
PD10.2631580.000000
11None161.5263160.000000
PDL11.3157890.000000
............
97B7H40.0000000.014388
99None0.0000007.654676
B7H40.0000001.309353
PD10.0000000.093525
PDL10.0000000.043165
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
cell_typecell_subtypeimmune_checkpointcountpercentage
0CANCERCANCERB7H41082716.317273
1CANCERCANCERB7H4_PD11400.210993
2CANCERCANCERB7H4_PDL1190.028635
3CANCERCANCERNone5277879.541242
4CANCERCANCERPD115532.340512
..................
59STROMAĪ±SMA_myCAFB7H4130.101634
60STROMAĪ±SMA_myCAFB7H4_PD110.007818
61STROMAĪ±SMA_myCAFNone1274699.648190
62STROMAĪ±SMA_myCAFPD1150.117270
63STROMAĪ±SMA_myCAFPDL1160.125088
\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", + " \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", + " \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", + " \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", + " \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", + " \n", + "
cell_typecell_subtypeimmune_checkpointcountpercentagedataset
0CANCERCANCERB7H41082716.317273NACT
1CANCERCANCERB7H4_PD11400.210993NACT
2CANCERCANCERB7H4_PDL1190.028635NACT
3CANCERCANCERNone5277879.541242NACT
4CANCERCANCERPD115532.340512NACT
.....................
66STROMASTROMA_OTHERPDL11600.332226ACT
67STROMAĪ±SMA_myCAFB7H4510.185266ACT
68STROMAĪ±SMA_myCAFNone2720098.808486ACT
69STROMAĪ±SMA_myCAFPD12560.929962ACT
70STROMAĪ±SMA_myCAFPDL1210.076286ACT
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
dcbtcd4tcd8m1m2tregimmune_othercancerĪ±sma_mycafstroma_otherendothelial
DD3S1.csv11.00.05515397322.01110818611432380283
DD3S3.csv27.044.014417286919.022581396323345066321
DD4S1.csv48.03.01087211265.055318862274843778
DD4S2.csv28.01.0807477874.041616999334619268
DD4S3.csv82.01.03731445564.05917547437708178
DD5S1.csv55.01.08616934217.07548652917762269758
DD5S2.csv71.00.041363274.05247596326733198930
DD5S3.csv490.03.090423033269.07312809226571428581
DD3S2.csv0.00.015720.011722851563317119
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
dcbtcd4tcd8m1m2tregimmune_othercancerĪ±sma_mycaf...tcd8_percm1_percm2_perctreg_percimmune_other_perccancer_percĪ±sma_mycaf_percstroma_other_percendothelial_percSample_ID
DD3S1.csv11.00.05515397322.0111081861143...4.0516490.5485720.1653160.0075140.82657161.5080578.54877717.7892292.112465DD3S1.csv
DD3S3.csv27.044.014417286919.02258139632334...2.9985710.2841700.0782490.0082371.06253357.5019359.58908920.8051401.317163DD3S3.csv
DD4S1.csv48.03.01087211265.055318862274...1.6637780.2049880.0394200.0394204.18640169.8448992.1476796.6065286.093973DD4S1.csv
DD4S2.csv28.01.0807477874.041616999334...0.4984690.8272020.7847130.0424131.70713174.1990573.5132256.5086322.816027DD4S2.csv
DD4S3.csv82.01.03731445564.05917547437...1.7902270.6836150.7954120.06213511.39554667.9291230.4553108.7119332.187943DD4S3.csv
DD5S1.csv55.01.08616934217.0754865291776...0.5211902.5831890.1283790.0528614.13828049.28903513.35775917.0486135.688107DD5S1.csv
DD5S2.csv71.00.041363274.0524759632673...0.4633180.1985580.0294160.0367691.81640543.84525119.59110123.4053536.794795DD5S2.csv
DD5S3.csv490.03.090423033269.0731280922657...1.5217432.1963820.4564110.0463012.06370153.51663617.5101599.3999573.822127DD5S3.csv
DD3S2.csv0.00.015720.011722851563...0.1617990.0462270.0000000.0231130.39292052.80830635.6867317.1793102.690697DD3S2.csv
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
dcbtcd4tcd8m1m2tregimmune_othercancerĪ±sma_mycafstroma_otherendothelial
DD3S1.csv700.024402310237107588440795282443431383
DD3S2.csv2940.019002343922537124448774322669581631
DD3S3.csv25394.05416282218377261616630375090109222457
DD4S1.csv22426.01580173950337185845151283233001275
DD4S2.csv10213.0113116473428156803247113303910964
DD4S3.csv106830.01980279610026433241945124364941221195
DD5S1.csv528138.01979467162112167237194520078222037
DD5S2.csv8916.0722821045992202487612034024405
DD5S3.csv97732.010964571474165532196821742759583
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
dcbtcd4tcd8m1m2tregimmune_othercancerĪ±sma_mycaf...tcd8_percm1_percm2_perctreg_percimmune_other_perccancer_percĪ±sma_mycaf_percstroma_other_percendothelial_percSample_ID
DD3S1.csv700.0244023102371075884407952824...4.1694850.4277460.1931160.0090241.59545773.6253225.0898897.8269682.492095DD3S1.csv
DD3S2.csv2940.0190023439225371244487743226...3.5218630.1382820.0375760.0556131.86980473.3080694.84339110.4457112.448158DD3S2.csv
DD3S3.csv25394.05416282218377261616630375090...3.0674160.1989080.0836930.0282601.75647168.5152025.52822711.8616252.668033DD3S3.csv
DD4S1.csv22426.015801739503371858451512832...2.9942410.0860860.0568170.0120523.19896477.7333034.8691395.6733102.191747DD4S1.csv
DD4S2.csv10213.011311647342815680324711330...3.8910470.0803180.0661440.0354341.60634976.7026243.1360299.2187712.272369DD4S2.csv
DD4S3.csv106830.019802796100264332419451243649...4.4533000.1592630.4204520.0525563.85252571.8605515.8044376.5562291.900504DD4S3.csv
DD5S1.csv528138.019794671621121672371945200...0.8304330.2880690.0195600.0373421.19494566.1366899.23554413.8901113.616361DD5S1.csv
DD5S2.csv8916.072282104599220248761203...0.2577680.3269220.1854640.0282910.69155478.1942283.77219112.6163751.269287DD5S2.csv
DD5S3.csv97732.01096457147416553219682174...1.4837740.4772520.1331090.0194791.79534171.3160057.0412828.9339771.887279DD5S3.csv
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageHLA_Cytoplasm_Intensity_AverageCKs_Cytoplasm_Intensity_AverageKi67_Nucleus_Intensity_AverageCD163_Cytoplasm_Intensity_AverageColVI_Cytoplasm_Intensity_AverageCD20_Cytoplasm_Intensity_AveragePD1_Cytoplasm_Intensity_AverageAXL_Cytoplasm_Intensity_AverageCD31_Cytoplasm_Intensity_Average...Nuc_Y_InvNucleus_RoundnessNuc_XROI_indexNucleus_SizeSample_IDimmune_checkpointCell_SizePatientUnique_ROI_index
ID
DD3S1_Cell_0-0.677863-0.417494-0.912537-0.8178760.9300990.232078-0.4831581.5356040.8073391.167755...16632.2050780.9550401484.7717290127DD3S1.csvNone3396161a
DD3S1_Cell_1-0.677863-0.516487-0.838037-0.8696851.1149240.301333-0.3447701.6683680.8754551.643023...16627.3847660.9666431426.2500000112DD3S1.csvNone3446161a
DD3S1_Cell_2-0.677863-0.141921-1.016023-0.7558790.8345770.259216-0.4382921.3363080.7050881.053636...16622.2382810.7215341531.1104740181DD3S1.csvNone4226161a
DD3S1_Cell_3-0.741282-0.460472-0.491711-0.8180840.6482000.107027-0.4448891.2498050.6607071.165861...16623.0078120.5871961518.9075930119DD3S1.csvNone2786161a
DD3S1_Cell_6-0.621521-0.247254-0.867127-0.7425440.8105790.272128-0.5071171.2514340.9471722.545301...16619.9785160.9357161471.914917047DD3S1.csvNone2046161a
..................................................................
TMA_Cell_1157550.4782750.558670-0.9628401.7322910.507434-0.9126410.3113220.8160680.5965200.090397...2663.2534180.98219615564.45800859142TMA.csvNone386c59c59a
TMA_Cell_1157560.2974180.420594-0.9716321.9669550.304365-1.1641120.866636-0.092857-0.241830-0.617835...2661.7658690.77597715629.6806645947TMA.csvNone270c59c59a
TMA_Cell_1157570.3469500.453951-0.6028931.3389560.559435-0.8013330.4470610.9881561.5678690.403878...2657.0156250.68874715518.4218755964TMA.csvNone202c59c59a
TMA_Cell_115758-0.1894150.508840-0.8860410.647980-0.227224-1.022549-0.0992560.2197550.603715-0.219145...2660.2585450.75140215539.2753915958TMA.csvNone182c59c59a
TMA_Cell_1157600.2457770.460219-1.0038400.191158-0.313127-1.1206750.004962-0.3161991.727776-0.495501...2654.2924800.67412615542.96191459106TMA.csvNone295c59c59a
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
total_M1_cellstotal_M2_cellsM2_M1_ratioTreatment_Type
Patient
10167.0100.00.598802ACT
1013.01.00.333333ACT
1025.01.00.200000ACT
1037.00.00.000000ACT
1053.03.01.000000ACT
...............
340.02.0infACT
450.03.0infACT
710.016.0infACT
720.01.0infACT
90.01.0infACT
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
total_M1_cellstotal_M2_cellsM2_M1_ratioTreatment_Type
Patient
1041.02.02.000000NACT
11110.03.00.300000NACT
1193.00.00.000000NACT
1214.00.00.000000NACT
1371.01.01.000000NACT
140307.038.00.123779NACT
14110.01.00.100000NACT
1461.02.02.000000NACT
149275.03.00.010909NACT
157.01.00.142857NACT
15361.014.00.229508NACT
1572.07.03.500000NACT
1621.00.00.000000NACT
1691.00.00.000000NACT
17125.01.00.040000NACT
1741.00.00.000000NACT
1771.00.00.000000NACT
181.00.00.000000NACT
18413.011.00.846154NACT
1872.08.04.000000NACT
3252.015.00.288462NACT
401.00.00.000000NACT
578.06.00.076923NACT
511.00.00.000000NACT
614.019.04.750000NACT
8541.016.00.390244NACT
8922.08.00.363636NACT
955.044.08.800000NACT
9873.070.00.958904NACT
1820.03.0infNACT
1830.01.0infNACT
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
total_M1_cellstotal_M2_cellsM2_M1_ratioTreatment_Type
Patient
10167.0100.00.598802ACT
1000.03.0infACT
1013.01.00.333333ACT
1025.01.00.200000ACT
1037.00.00.000000ACT
...............
923.025.08.333333ACT
955.044.08.800000NACT
962.01.00.500000ACT
9873.070.00.958904NACT
995.05.01.000000ACT
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
total_M1_cellstotal_M2_cellsM2_M1_ratioTreatment_Type
Patient
10167.0100.00.598802ACT
1000.03.0infACT
1013.01.00.333333ACT
1025.01.00.200000ACT
1037.00.00.000000ACT
...............
923.025.08.333333ACT
955.044.08.800000NACT
962.01.00.500000ACT
9873.070.00.958904NACT
995.05.01.000000ACT
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PDL1_Cytoplasm_Intensity_AverageHLA_Cytoplasm_Intensity_AverageCKs_Cytoplasm_Intensity_AverageKi67_Nucleus_Intensity_AverageCD163_Cytoplasm_Intensity_AverageColVI_Cytoplasm_Intensity_AverageCD20_Cytoplasm_Intensity_AveragePD1_Cytoplasm_Intensity_AverageAXL_Cytoplasm_Intensity_AverageCD31_Cytoplasm_Intensity_Average...Nucleus_RoundnessNuc_XROI_indexNucleus_SizeSample_IDimmune_checkpointCell_SizePatientUnique_ROI_indexPrimary_chem(1)_vs_surg(0)
ID
DD3S1_Cell_218281.6097922.5216150.2230231.0841660.338872-1.1123271.3746370.236768-0.450948-0.132787...0.8680003246.4506841191DD3S1.csvPDL12203232a1.0
DD3S1_Cell_218311.5906082.4937210.2317410.2515241.185084-1.2037951.610041-0.700345-0.673078-0.641906...0.5807562951.7856451170DD3S1.csvPDL11533232a1.0
DD3S1_Cell_219371.6112302.1895880.5586930.2493370.313269-1.2485141.501920-0.669547-0.781676-0.848153...0.8291053137.49511711101DD3S1.csvPDL12003232a1.0
DD3S1_Cell_219391.6309442.690321-0.1857651.2589370.552631-1.2235851.519502-0.700822-0.721136-0.785331...0.9256493217.1313481199DD3S1.csvPDL11833232a1.0
DD3S1_Cell_219591.5178872.7190760.000214-0.0395370.431631-1.2575831.471392-0.863404-0.803700-0.732914...0.7772692996.02856411105DD3S1.csvPDL11543232a1.0
\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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
B7H4_cellsPDL1_cells
Patient
11135.01.0
11624.03.0
1192151.018.0
1212361.04.0
13725.04.0
\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
B7H4_cellsPDL1_cells%_B7H4%_PDL1Treatment_Type
Patient
11135.01.00.0005270.000012NACT
11624.03.00.0003620.000037NACT
1192151.018.00.0324180.000225NACT
1212361.04.00.0355820.000050NACT
13725.04.00.0003770.000050NACT
14671.00.00.0010700.000000NACT
149281.01.00.0042350.000012NACT
151008.06.00.0151910.000075NACT
1539.030.00.0001360.000374NACT
1572.07.00.0000300.000087NACT
1601.0198.00.0000150.002471NACT
16240.05.00.0006030.000062NACT
169140.012.00.0021100.000150NACT
17128.01.00.0004220.000012NACT
17447.00.00.0007080.000000NACT
177124.00.00.0018690.000000NACT
1782.06.00.0000300.000075NACT
1796.00.00.0000900.000000NACT
18285.0307.00.0042950.003832NACT
18239.046.00.0005880.000574NACT
183152.02.00.0022910.000025NACT
1841260.03.00.0189890.000037NACT
18714.07.00.0002110.000087NACT
263.019.00.0000450.000237NACT
32215.0126.00.0032400.001573NACT
4090.00.00.0013560.000000NACT
51.034.00.0000150.000424NACT
612.018.00.0000300.000225NACT
715.06.00.0002260.000075NACT
851563.09.00.0235560.000112NACT
89154.05.00.0023210.000062NACT
95207.023.00.0031200.000287NACT
98472.0303.00.0071130.003782NACT
1040.020.00.0000000.000250NACT
1400.03.00.0000000.000037NACT
1410.02.00.0000000.000025NACT
\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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
B7H4_cellsPDL1_cells%_B7H4%_PDL1Treatment_Type
Patient
1018.04.00.0000500.000010ACT
100663.00.00.0018450.000000ACT
10161.041.00.0001700.000100ACT
102135.031.00.0003760.000076ACT
10312.0120.00.0000330.000294ACT
..................
95207.023.00.0031200.000287NACT
96812.00.00.0022590.000000ACT
972.046.00.0000060.000113ACT
98472.0303.00.0071130.003782NACT
99161.02.00.0004480.000005ACT
\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