{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# CytoTRACE runtime comparison" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Library imports" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Global seed set to 0\n" ] } ], "source": [ "import os\n", "import sys\n", "\n", "import numpy as np\n", "import pandas as pd\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "from cr2 import running_in_notebook\n", "\n", "sys.path.extend([\"../../../\", \".\"])\n", "from paths import DATA_DIR, FIG_DIR # isort: skip # noqa: E402" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## General settings" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "SAVE_FIGURES = True\n", "if SAVE_FIGURES:\n", " os.makedirs(FIG_DIR / \"cytotrace_kernel\" / \"benchmarks\", exist_ok=True)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Data loading" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "data = []\n", "for fname in os.listdir(DATA_DIR / \"cytotrace_benchmark\" / \"out\"):\n", " algo, subset, split = fname.split(\".\")[0].split(\"_\")\n", " if algo == \"cr\":\n", " df = pd.read_csv(DATA_DIR / \"cytotrace_benchmark\" / \"out\" / fname, index_col=\"sample\")\n", " time_s = df[\"ct_time\"].iloc[0]\n", " time_p = df[\"preprocess_time\"].iloc[0]\n", " else:\n", " df = pd.read_csv(DATA_DIR / \"cytotrace_benchmark\" / \"out\" / fname, index_col=0)\n", " time_s = df.loc[\"time\"][0]\n", " time_p = 0\n", " data.append((algo, subset, split, time_s, time_p))" ] }, { "cell_type": "code", "execution_count": 4, "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", "
algorithmsubsetsplittime
0CytoTRACE (CellRank)3021.546217
1CytoTRACE (CellRank)2021.139597
2CytoTRACE (CellRank)2071.095124
3CytoTRACE (original)10352.885000
4CytoTRACE (CellRank)1100361.587730
\n", "
" ], "text/plain": [ " algorithm subset split time\n", "0 CytoTRACE (CellRank) 30 2 1.546217\n", "1 CytoTRACE (CellRank) 20 2 1.139597\n", "2 CytoTRACE (CellRank) 20 7 1.095124\n", "3 CytoTRACE (original) 10 3 52.885000\n", "4 CytoTRACE (CellRank) 1100 3 61.587730" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(data, columns=[\"algorithm\", \"subset\", \"split\", \"time\", \"preprocess\"])\n", "df[\"algorithm\"] = df[\"algorithm\"].astype(\"category\")\n", "df[\"subset\"] = (df[\"subset\"].astype(int) / 1000).astype(int)\n", "df[\"time\"] += df.pop(\"preprocess\")\n", "df[\"algorithm\"] = df[\"algorithm\"].cat.rename_categories({\"cr\": \"CytoTRACE (CellRank)\", \"ct\": \"CytoTRACE (original)\"})\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwUAAAGICAYAAAAQ1ExWAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAACHJElEQVR4nOzdeVhU5dsH8O/MMMM67CCCCwqKGwpqGoRbmpna4paZu+aSuZRbaguY5pJWplaa+ZZb4m6m/mw1tTQtd8sNFRcUWQeGdbbn/QPn6IgL4MCAfD/XxcXMWe/zAMNzn/Oc+8iEEAJERERERFRpyW0dABERERER2RaTAiIiIiKiSo5JARERERFRJcekgIiIiIiokmNSQERERERUyTEpICIiIiKq5JgUEBERERFVckwKiIiIiIgqOTtbB1AemEwmGAwGyOVyyGQyW4dDRERERPTIhBAwmUyws7ODXP7gawFMCgAYDAacPHnS1mEQEREREVldaGgoVCrVA5dhUgBImVNoaCgUCoWNoyEiIiIienRGoxEnT5586FUCgEkBAEhDhhQKBZMCIiIiInqsFGV4PG80JiIiIiKq5JgUEBERERFVckwKiIiIiIgqOd5TQESPtYSEBGi1Wmi1WqjVaqjVagQEBNg6LCIionKFSQERPbY0Gg169uwJk8kkTVMoFNi5cyfc3d1tFxgREVE5w+FDRPTYcnd3x8aNGzF9+nQAwPTp07FhwwYmBERERHfhlQIieqwFBARAq9UCAAIDAzl0iIiI6B54pYCIiIiIqJJjUkBEREREVMkxKSAiIiIiquSYFBARERERVXJMCoiIiIiIKjkmBURERERElRyTAiIiIiKiSo5JARERERFRJcekgIiIiIiokmNSQERERERUyTEpICIiIiKq5JgUEBERERFVcjZNCp5++mmEhIQU+po+fToAID8/H9OnT0fLli0RHh6OMWPGICUlxWIb169fx/Dhw9GkSRNERERg7ty5MBgMtjgcIiIiIqIKyc6WO9+4cSOMRqP0/vz58xg8eDA6deoEAJg1axb27NmDBQsWQK1WY8aMGRg9ejRiY2MBAEajESNGjIC3tzdiY2ORlJSEt99+G0qlEuPHj7fJMRERERERVTQ2vVLg6ekJHx8f6Wv37t2oUaMGWrRoAa1Wi02bNmHKlCmIiIhAo0aNMGvWLBw9ehTHjh0DAPzxxx+Ii4vDvHnzUL9+fbRp0wbjxo3DmjVroNPpbHloREREREQVRrm5p0Cn02Hbtm3o0aMHZDIZTp06Bb1ej8jISGmZoKAg+Pv7S0nBsWPHULduXXh7e0vLREVFISsrC3FxcWV9CEREREREFZJNhw/d6ZdffoFWq0W3bt0AACkpKVAqlXB1dbVYzsvLC8nJydIydyYEAKT35mWK486hTET0+DCZTNJ3/p0TEVFlUZz/eeUmKdi0aRNat26NKlWq2CyGkydP2mzfRFR6rly5AgA4e/YscnNzbRwNERFR+VMukoKEhATs378fixYtkqZ5e3tDr9cjMzPT4mpBamoqfHx8pGVOnDhhsS1zdSLzMsURGhoKhUJRkkMgonImMTERGRkZAAB7e3vpu6OjIwDAzc0Nfn5+NouPiIiotBmNxiKf9C4XScHmzZvh5eWFtm3bStMaNWoEpVKJAwcO4NlnnwUAXLx4EdevX0dYWBgAICwsDEuWLEFqaiq8vLwAAPv374eLiwuCg4OLHYdCoWBSQPQYSExMxKt9eiMvX28x3VzuGAAc7JVYt34jEwMiIiKUg6TAZDJh8+bNeOmll2BndzsctVqNHj16YM6cOXBzc4OLiwtmzpyJ8PBwKSmIiopCcHAwJk+ejEmTJiE5ORkLFixA3759oVKpbHRERGRrGo0Gefl6jI6IR4BrHgAgW6eAs6pgbGVCpgMWHwiERqNhUkBERIRykBTs378f169fR48ePQrNmzZtGuRyOcaOHQudToeoqChER0dL8xUKBZYsWYKYmBj07t0bjo6O6NatG8aOHVuWh0BE5VSAax5qefIeAiIiooexeVIQFRWFs2fP3nOevb09oqOjLRKBuwUEBGDZsmWlFR4RERER0WOv3DyngIiIiIiIbINJARERERFRJcekgIiIiIiokmNSQERERERUyTEpICIiIiKq5JgUEBERERFVckwKiIiIiIgqOSYFRERERESVHJMCIiIiIqJKjkkBEREREVElx6SAiIiIiKiSY1JARERERFTJMSkgIiIiIqrkmBQQEREREVVyTAqIiIiIiCo5JgVERERERJUckwIiIiIiokqOSQERERERUSXHpICIiIiIqJJjUkBEREREVMkxKSAiIiIiquSYFBARERERVXJMCoiIiIiIKjkmBURERERElRyTAiIiIiKiSo5JARERERFR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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "colors = [sns.palettes.color_palette(\"colorblind\")[i] for i in range(len(df[\"algorithm\"].cat.categories))]\n", "\n", "if running_in_notebook:\n", " sns.set_style(\"whitegrid\")\n", "\n", " fig, ax = plt.subplots(figsize=(9, 4))\n", " sns.boxplot(\n", " data=df,\n", " x=\"subset\",\n", " y=\"time\",\n", " hue=\"algorithm\",\n", " width=0.25,\n", " saturation=1,\n", " dodge=False,\n", " flierprops={\"marker\": \"o\", \"markersize\": 2, \"markerfacecolor\": \"none\", \"linestyle\": \"none\"},\n", " linewidth=1,\n", " palette=\"colorblind\",\n", " ax=ax,\n", " )\n", "\n", " data = df.groupby([\"algorithm\", \"subset\"]).median()[[\"time\"]]\n", " for i, cat in enumerate(df[\"algorithm\"].cat.categories):\n", " med = data.loc[cat].values.squeeze()\n", " med = med[med == med]\n", " ax.plot(np.arange(len(med)), med, c=colors[i], zorder=-1, ls=\"--\", lw=2)\n", "\n", " ax.set_xlabel(\"Number of cells in thousands\")\n", " ax.set_ylabel(\"Runtime (s)\")\n", " ax.legend()\n", " ax.margins(0.025)\n", " _ = ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha=\"center\")\n", "\n", " ax.set_title(\"\")\n", " ax.get_legend().remove()\n", "\n", " if SAVE_FIGURES:\n", " fig.savefig(\n", " FIG_DIR / \"cytotrace_kernel\" / \"benchmarks\" / \"runtime_cr_vs_cytotrace.eps\",\n", " format=\"eps\",\n", " transparent=True,\n", " bbox_inches=\"tight\",\n", " )" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "cr2-py38", "language": "python", "name": "cr2-py38" }, "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.8.16" } }, "nbformat": 4, "nbformat_minor": 2 }