"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"print('Proteins as amino-acid counts performances:')\n",
"plot_performance_metrics(\n",
" df_cv=reports['aminoacidcnt_cv_train'],\n",
" df_test=reports['aminoacidcnt_test'],\n",
" df_test_majority=reports['aminoacidcnt_majority_vote'],\n",
" title=f'aminoacidcnt_performance',\n",
" show_plot=False,\n",
" metrics_to_plot = {\n",
" 'val_acc': 'Validation Accuracy',\n",
" 'val_roc_auc': 'Validation ROC AUC',\n",
" 'val_f1_score': 'Validation F1 Score',\n",
" 'val_precision': 'Validation Precision',\n",
" 'val_recall': 'Validation Recall',\n",
" 'test_acc': 'Test Accuracy',\n",
" 'test_roc_auc': 'Test ROC AUC',\n",
" 'test_f1_score': 'Test F1 Score',\n",
" 'test_precision': 'Test Precision',\n",
" 'test_recall': 'Test Recall',\n",
" },\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Compare Performance"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_1899217/2462072186.py:5: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" tmp['Experiment'] = r\n",
"/tmp/ipykernel_1899217/2462072186.py:5: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" tmp['Experiment'] = r\n",
"/tmp/ipykernel_1899217/2462072186.py:5: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" tmp['Experiment'] = r\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"| Experiment | Study | Test Accuracy | Test ROC AUC |\n",
"|:------------------------------|:-----------|----------------:|---------------:|\n",
"| Baseline | Standard | 0.782051 | 0.845847 |\n",
"| Baseline | Target | 0.526316 | 0.595819 |\n",
"| Baseline | Similarity | 0.779221 | 0.854336 |\n",
"| Cells as one-hot | Standard | 0.820513 | 0.875083 |\n",
"| Cells as one-hot | Target | 0.618421 | 0.61324 |\n",
"| Cells as one-hot | Similarity | 0.74026 | 0.842141 |\n",
"| Proteins as amino-acid counts | Standard | 0.705128 | 0.828571 |\n",
"| Proteins as amino-acid counts | Target | 0.605263 | 0.543554 |\n",
"| Proteins as amino-acid counts | Similarity | 0.74026 | 0.815718 |\n",
"--------------------------------------------------------------------------------\n",
"Comparison of the best models majority vote:\n"
]
},
{
"data": {
"image/png": "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Tk6SZddsbGzQpUuXXOX99NNPaNeuHWrXrg0A8PT0xOTJkzF48GD88ccf8PT0LM7TIyIqNXx9fTFw4EC4u7ujXr16WL58OZKTkzF48GAAwIABA2Bra4uFC3OeDNWxY0csXboUtWvXlgyZmDlzJjp27ChJjImIyopSnRCvXLkSM2fOxJgxY/D27VvY2Nhg5MiRmDVrluSYKVOmSG7TxcXFoVGjRjh58iS0tLSkyrp//z727t2L4OBgybYePXrgwoULaNy4MSpXroydO3cW16kREZUqvXv3xrt37zBr1ixERUWhVq1aOHnypGSiXUREhNQV4RkzZkAkEmHGjBl4/fo1zM3NJRcxiIjKGpHAe1tFkpCQAENDQ8THx3NSXSm08kycwusY18pI4XWQcvva40xBz+9r+Xte/3SawusAgOGOC+VSDvu94OTV5wD7vTAK0u8FjTOl+grx1+Br+WATERERfa2YEFOBlJZvekRERETyVqpXmSAiIiIiUjQmxERERESk1JgQExEREZFSY0JMREREREqNCTERERERKTUmxERERESk1JgQExEREZFSY0JMREREREqNCTERERERKTUmxERERESk1JgQExEREZFSY0JMREREREqNCTERERERKTUmxERERESk1NRKugFElL/1T6cpvI7hjgsVXkdZw34nIlIuvEJMREREREqNCTERERERKTUmxERERESk1JgQExEREZFSY0JMREREREqNCTERERERKTUmxERERESk1JgQExEREZFSY0JMREREREqNCTERERERKTUmxERERESk1JgQExEREZFSUyvpBhDR12PlmTiF1zGulZHC6yAiIuXCK8REREREpNSYEBMRERGRUmNCTERERERKjQkxERERESk1JsREREREpNSYEBMRERGRUmNCTERERERKjQkxERERESk1JsREREREpNSYEBMRERGRUmNCTERERERKjQkxERERESk1JsREREREpNSYEBMRERGRUmNCTERERERKjQkxERERESk1JsREREREpNSYEBMRERGRUmNCTERERERKjQkxERERESk1JsREREREpNSYEBMRERGRUmNCTERERERKjQkxERERESk1JsREREREpNSYEBMRERGRUmNCTERERERKjQkxERERESk1JsREREREpNSYEBMRERGRUmNCTERERERKjQkxERERESk1JsRE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",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df = []\n",
"for r in ['majority_vote', 'cellsonehot_majority_vote', 'aminoacidcnt_majority_vote']:\n",
" tmp = reports[r]\n",
" tmp = tmp[tmp['cv_models'].isna()]\n",
" tmp['Experiment'] = r\n",
" df.append(tmp)\n",
"df = pd.concat(df)\n",
"# Rename split_type to paper names\n",
"df['split_type'] = df['split_type'].replace({\n",
" 'random': 'Standard',\n",
" 'uniprot': 'Target',\n",
" 'tanimoto': 'Similarity',\n",
" 'standard': 'Standard',\n",
" 'target': 'Target',\n",
" 'similarity': 'Similarity',\n",
"})\n",
"# Rename columns to paper names\n",
"df.rename(columns={\n",
" 'split_type': 'Study',\n",
" 'test_acc': 'Test Accuracy',\n",
" 'test_roc_auc': 'Test ROC AUC',\n",
"}, inplace=True)\n",
"# Rename experiment names to paper names\n",
"df['Experiment'] = df['Experiment'].replace({\n",
" 'majority_vote': 'Baseline',\n",
" 'cellsonehot_majority_vote': 'Cells as one-hot',\n",
" 'aminoacidcnt_majority_vote': 'Proteins as amino-acid counts',\n",
"})\n",
"print(df[['Experiment', 'Study', 'Test Accuracy', 'Test ROC AUC']].to_markdown(index=False))\n",
"df['Experiment'] = df['Experiment'] = df['Experiment'].replace({\n",
" 'Cells as one-hot': 'Cells as\\none-hot',\n",
" 'Proteins as amino-acid counts': 'Proteins as\\nAA counts',\n",
"})\n",
"\n",
"def plot_comparison_df(df, filename=None):\n",
" # Plot the test accuracy and ROC AUC in two bar-plots side by side, with Study as hue\n",
" _, axes = plt.subplots(1, 2, figsize=(8, 5))\n",
" sns.barplot(\n",
" data=df,\n",
" x='Experiment',\n",
" y='Test Accuracy',\n",
" hue='Study',\n",
" errorbar=('sd', 1),\n",
" palette=palette[:3],\n",
" ax=axes[0])\n",
" # Set ax[0] y-axis to percentage\n",
" axes[0].yaxis.set_major_formatter(plt.matplotlib.ticker.PercentFormatter(1, decimals=0))\n",
" # Set ax[0] y-axis limit from 0 to 100\n",
" axes[0].set_ylim(0, 1.0)\n",
" # Remove the x-axis label\n",
" axes[0].set_xlabel('')\n",
" axes[0].grid(axis='y', alpha=0.5, linewidth=0.5)\n",
"\n",
" sns.barplot(\n",
" data=df,\n",
" x='Experiment',\n",
" y='Test ROC AUC',\n",
" hue='Study',\n",
" errorbar=('sd', 1),\n",
" palette=palette[:3],\n",
" ax=axes[1])\n",
" axes[1].set_ylim(0, 1.0)\n",
" # Remove the legend from the first plot\n",
" axes[0].legend().remove()\n",
" # Set the legend outside the plot in the middle of the two subplots (3 columns)\n",
" axes[1].legend(loc='upper center', bbox_to_anchor=(-0.15, -0.12), ncol=3)\n",
" # Remove the x-axis label\n",
" axes[1].set_xlabel('')\n",
" axes[1].grid(axis='y', alpha=0.5, linewidth=0.5)\n",
"\n",
" # Add values to the bar plots rotated 90 degrees at 0.5 height\n",
" for i, ax in enumerate(axes):\n",
" for p in ax.patches:\n",
" if p.get_height() < 0.01:\n",
" continue\n",
" if i % 2 == 0:\n",
" value = f'{p.get_height():.1%}'\n",
" else:\n",
" value = f'{p.get_height():.3f}'\n",
" \n",
" x = p.get_x() + p.get_width() / 2\n",
" y = 0.3\n",
" ax.annotate(value, (x, y), ha='center', va='center', color='black', fontsize=10, rotation=90, alpha=0.8)\n",
"\n",
" if filename is not None:\n",
" plt.savefig(f'plots/{filename}.pdf', bbox_inches='tight')\n",
" # plt.savefig(f'plots/{filename}.png', bbox_inches='tight')\n",
" plt.show()\n",
"\n",
"print('-' * 80)\n",
"print('Comparison of the best models majority vote:')\n",
"plot_comparison_df(df, 'embedding_comparison_majority_vote')"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"| Experiment | Study | Test Accuracy | Test ROC AUC |\n",
"|:------------------------------|:-----------|----------------:|---------------:|\n",
"| Baseline | Similarity | 0.800866 | 0.857498 |\n",
"| Baseline | Standard | 0.786325 | 0.851163 |\n",
"| Baseline | Target | 0.618421 | 0.588386 |\n",
"| Cells as one-hot | Similarity | 0.748918 | 0.826107 |\n",
"| Cells as one-hot | Standard | 0.807692 | 0.864895 |\n",
"| Cells as one-hot | Target | 0.622807 | 0.604413 |\n",
"| Proteins as amino-acid counts | Similarity | 0.753247 | 0.810298 |\n",
"| Proteins as amino-acid counts | Standard | 0.747863 | 0.831672 |\n",
"| Proteins as amino-acid counts | Target | 0.578947 | 0.540999 |\n",
"--------------------------------------------------------------------------------\n",
"Comparison of the best models mean values:\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAsQAAAHoCAYAAABO0/lTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACVGklEQVR4nOzdd1QUVxsG8GfpvXdEQYoKKiqIInZRrLH3xBqNihpDNMbEnqhRv1hijT32EruxF6zYUKyIqCA2UJQOUnbn+4O4kVAEdpeF7PM7h5PszOy8dy7j5Z2Ze++IBEEQQERERESkotSUXQAiIiIiImViQkxEREREKo0JMRERERGpNCbERERERKTSmBATERERkUpjQkxEREREKo0JMRERERGpNCbERERERKTSmBATERERkUpjQkxEREREKk2pCfG5c+fQqVMn2NnZQSQSYd++fXnWC4KAqVOnwtbWFrq6uvD390dkZGSebd69e4f+/fvDyMgIJiYmGDp0KFJTU6Xro6Oj0bRpU+jr66Np06aIjo7O8/2OHTti9+7dijpEIqIK4VPtcUGCg4NRr149aGtrw8XFBRs2bFB4OYmIFEGpCXFaWho8PT2xbNmyAtfPmzcPv/32G1auXIkrV65AX18fAQEBeP/+vXSb/v374969ezhx4gQOHTqEc+fOYfjw4dL13377Lezt7REWFgZbW1uMHz9eum7Hjh1QU1ND9+7dFXeQREQVwKfa43+LiopChw4d0KJFC4SFhWHcuHH48ssvcezYMQWXlIhIAYRyAoCwd+9e6WeJRCLY2NgI8+fPly5LTEwUtLW1hW3btgmCIAj3798XAAjXrl2TbnPkyBFBJBIJL168EARBEGrUqCEcOXJEEARBOHz4sODu7i4IgiAkJCQILi4uQkxMjKIPjYioQvl3e1yQ7777TvDw8MizrHfv3kJAQIACS0ZEpBgaSs7HCxUVFYXY2Fj4+/tLlxkbG6NBgwYICQlBnz59EBISAhMTE3h7e0u38ff3h5qaGq5cuYKuXbvC09MTJ0+eRJs2bXD8+HHUrl0bADBhwgQEBgbCwcGhWOXJzMxEZmam9LNEIsG7d+9gbm4OkUgkp6MmIvqHIAhISUmBnZ0d1NTK15CPkJCQPO0zAAQEBGDcuHGFfoftKBGVteK2o+U2IY6NjQUAWFtb51lubW0tXRcbGwsrK6s86zU0NGBmZibd5n//+x+++uorODo6onbt2vj9999x7tw5hIWFYe7cuejVqxeuX7+ONm3a4LfffoOWllaB5ZkzZw5mzJgh78MkIvqkZ8+eoVKlSsouRh6xsbEFts/JycnIyMiArq5uvu+wHSUiZflUO1puE2J5sbe3x6FDh6SfMzMzERAQgD/++AM///wzDA0NERERgbZt2+L333/HmDFjCtzPpEmTEBQUJP2clJSEypUr49mzZzAyMlL4cRCR6klOToaDgwMMDQ2VXRS5YDtKRGWtuO1ouU2IbWxsAABxcXGwtbWVLo+Li0OdOnWk27x+/TrP93JycvDu3Tvp9/9t9uzZaNOmDby8vDBs2DD8/PPP0NTURLdu3XD69OlCE2JtbW1oa2vnW25kZMSGnIgUqjx2J7CxsUFcXFyeZXFxcTAyMirw7jDAdpSIlOdT7Wj56pT2EScnJ9jY2ODUqVPSZcnJybhy5Qp8fX0BAL6+vkhMTERoaKh0m9OnT0MikaBBgwb59hkeHo6tW7fip59+AgCIxWJkZ2cDALKzsyEWixV5SERE/xm+vr552mcAOHHihLR9JiKqSJR6hzg1NRWPHj2Sfo6KikJYWBjMzMxQuXJljBs3Dj///DNcXV3h5OSEKVOmwM7ODl26dAEA1KhRA23btsWwYcOwcuVKZGdnY/To0ejTpw/s7OzyxBIEAcOHD8fChQuhr68PAPDz88Pq1avh5uaGjRs3om/fvmV27ERE5cmn2uNJkybhxYsX2LhxIwBgxIgRWLp0Kb777jsMGTIEp0+fxs6dO/HXX38p6xCIiEpPmVNcnDlzRgCQ72fgwIGCIOROvTZlyhTB2tpa0NbWFlq1aiVERETk2cfbt2+Fvn37CgYGBoKRkZEwePBgISUlJV+slStXCt27d8+zLC4uTmjVqpVgaGgo9OzZU0hLSyt22ZOSkgQAQlJSUskPnIioGMqynflUezxw4EChWbNm+b5Tp04dQUtLS6hataqwfv36EsVkO0pEilbcdkYkCIKgjES8oktOToaxsTGSkpLY942IFOK/3s7814+PiJSvuO1Mue1DTERERERUFpgQExEREZFKY0JMRERERCqNCTERERERqTQmxERERESk0pgQExEREZFKY0JMRERERCqNCTERERERqTQmxERERESk0pgQExEREZFKY0JMRERERCqNCTERERERqTQmxERERESk0pgQExEREZFKY0JMRERERCqNCTERERERqTQmxERERESk0pgQExEREZFKY0JMRERERCqNCTERERERqTQmxERERESk0pgQExEREZFKY0JMRERERCqNCTERERERqTQmxERERESk0pgQExEREZFKY0JMRERERCqNCTERERERqTQmxERERESk0pgQExEREZFKY0JMRERERCqNCTERERERqTQmxERERESk0pgQExEREZFKY0JMRERERCqNCTERERERqTQmxERERESk0pgQExEREZFKY0JMRERERCqNCTERERERqTQmxERERESk0pgQExEREZFKY0JMRERERCqNCTERERERqTQmxERERESk0jSUXQAiIiIqf5acSFR4jDGtTRQeg6g4eIeYiIiIiFQaE2IiIiIiUmnsMkFERFQGVj+eVCZxhjnPKZM4RP8lvENMRERERCqNd4iJiKhc4+AuIlI03iEmIiIiIpXGhJiIiIiIVBoTYiIiIiJSaUyIiYiIiEilMSEmIiIiIpXGhJiIiIiIVBoTYiIiIiJSaZyHmIiIiKic4LzbysE7xERERESk0niHmIiIiP6zVj+epPAYw5znKDwGKRbvEBMRERGRSmNCTEREREQqjQkxEREREak0JsREREREpNKYEBMRERGRSivXs0yIxWJMnz4dmzdvRmxsLOzs7DBo0CBMnjwZIpEIACAIAqZNm4bVq1cjMTERfn5+WLFiBVxdXQEAmZmZ+PLLL7F//37Y2Nhg+fLl8Pf3l8aYP38+YmJisGTJEqUcIxFRebFs2TLMnz8fsbGx8PT0xJIlS+Dj41Po9osWLcKKFSsQExMDCwsL9OjRA3PmzIGOjk4ZlpqIyqOKNrtHuU6I586dixUrVuCPP/6Ah4cHrl+/jsGDB8PY2Bhjx44FAMybNw+//fYb/vjjDzg5OWHKlCkICAjA/fv3oaOjg1WrViE0NBQhISE4cuQI+vXrh7i4OIhEIkRFRWH16tW4fv26ko+U5I0TmxOVzI4dOxAUFISVK1eiQYMGWLRoEQICAhAREQErK6t822/duhXff/891q1bh0aNGuHhw4cYNGgQRCIRFixYoIQjICIqvXLdZeLSpUvo3LkzOnToAEdHR/To0QNt2rTB1atXAeTeHV60aBEmT56Mzp07o3bt2ti4cSNevnyJffv2AQDCw8Px2WefwcPDA4GBgXjz5g3i4+MBACNHjsTcuXNhZGSkrEMkIioXFixYgGHDhmHw4MFwd3fHypUroaenh3Xr1hW4/aVLl+Dn54d+/frB0dERbdq0Qd++faXtMxFRRVKu7xA3atQIq1atwsOHD+Hm5oZbt27hwoUL0rsPUVFRiI2NzdMFwtjYGA0aNEBISAj69OkDT09PbNq0CRkZGTh27BhsbW1hYWGBLVu2QEdHB127di1WWTIzM5GZmSn9nJycLN+DLecq2qMPIiq+rKwshIaGYtKkf/6dq6mpwd/fHyEhIQV+p1GjRti8eTOuXr0KHx8fPHnyBIcPH8YXX3xRaBxVb0eJqPwq1wnx999/j+TkZFSvXh3q6uoQi8WYNWsW+vfvDwCIjY0FAFhbW+f5nrW1tXTdkCFDcPv2bbi7u8PCwgI7d+5EQkICpk6diuDgYEyePBnbt2+Hs7Mz1q1bB3t7+wLLMmfOHMyYMSPf8hcvXqhEo66daK7wGM+fP5fbvvRy0uW2r8I8f56q8Bik2lJSUsokTnx8PMRicYFt6YMHDwr8Tr9+/RAfH4/GjRtDEATk5ORgxIgR+OGHHwqNU9p29L/y77ks2lFAfm0p6734+Pcrv/JS78VtR8t1Qrxz505s2bIFW7duhYeHB8LCwjBu3DjY2dlh4MCBxdqHpqYmli1blmfZ4MGDMXbsWNy8eRP79u3DrVu3MG/ePIwdOxa7d+8ucD+TJk1CUFCQ9HNycjIcHBxgb2+vEl0uMjPfKjxGpUqV5Lav9PBEue2rMJUqmSg8Bqm28nyxHRwcjNmzZ2P58uVo0KABHj16hK+//ho//fQTpkyZUuB3StuO/lf+PZdFOwrIry1lvRcf/37lV17qvbjtaLlOiCdMmIDvv/8effr0AQDUqlULT58+xZw5czBw4EDY2NgAAOLi4mBrayv9XlxcHOrUqVPgPs+cOYN79+5hzZo1mDBhAtq3bw99fX306tULS5cuLbQs2tra0NbWlt/BERGVExYWFlBXV0dcXFye5XFxcdJ29t+mTJmCL774Al9++SWA3PY5LS0Nw4cPx48//gg1tfxDVNiOElF5Va4H1aWnp+drVNXV1SGRSAAATk5OsLGxwalTp6Trk5OTceXKFfj6+ubb3/v37xEYGIjff/9d2gUjOzsbAJCdnQ2xWKzAoyEiKp+0tLTg5eWVpy2VSCQ4depUgW0pUHj7DOQOeCYiqkjK9R3iTp06YdasWahcuTI8PDxw8+ZNLFiwAEOGDAEAiEQijBs3Dj///DNcXV2l067Z2dmhS5cu+fb3008/oX379qhbty4AwM/PDxMmTMDgwYOxdOlS+Pn5leXhERGVG0FBQRg4cCC8vb3h4+ODRYsWIS0tDYMHDwYADBgwAPb29pgzJ3fwa6dOnbBgwQLUrVtX2mViypQp6NSpkzQxJiKqKMp1QrxkyRJMmTIFo0aNwuvXr2FnZ4evvvoKU6dOlW7z3XffSR/TJSYmonHjxjh69Gi+ieHv3r2LnTt3IiwsTLqsR48eCA4ORpMmTVCtWjVs3bpV/sfA+XCJqALo3bs33rx5g6lTpyI2NhZ16tTB0aNHpQPtYmJi8twR/vCCpMmTJ+PFixewtLSU3sQgIqpoynVCbGhoiEWLFmHRokWFbiMSiTBz5kzMnDmzyH3VrFkTkZGReZapqalh+fLlWL58uTyKS0RUoY0ePRqjR48ucF1wcHCezxoaGpg2bRqmTZtWBiUjIlKsct2HmIiIiIhI0ZgQExEREZFKY0JMRERERCqNCTERERERqTQmxERERESk0pgQExEREZFKY0JMRERERCqNCTERERERqTQmxERERESk0pgQExEREZFKY0JMRERERCpNQ9kFICIqb1Y/nqTwGMOc5yg8BhERFQ8TYqJyjIkZERGR4jEhJiK5WXIiUeExxrQ2UXgMIiJSLexDTEREREQqjQkxEREREak0JsREREREpNKYEBMRERGRSmNCTEREREQqjQkxEREREak0JsREREREpNKYEBMRERGRSmNCTEREREQqjQkxEREREak0JsREREREpNKYEBMRERGRSmNCTEREREQqjQkxEREREak0JsREREREpNKYEBMRERGRSmNCTEREREQqjQkxEREREak0JsREREREpNKYEBMRERGRSmNCTEREREQqjQkxEREREak0JsREREREpNKYEBMRERGRSmNCTEREREQqjQkxEREREak0JsREREREpNKYEBMRERGRSmNCTEREREQqjQkxEREREak0JsREREREpNKYEBMRERGRSmNCTEREREQqjQkxEREREak0JsREREREpNKYEBMRERGRSmNCTEREREQqjQkxEREREak0JsREREREpNKYEBMRERGRSmNCTEREREQqjQkxEREREak0JsREREREpNKYEBMRERGRSmNCTEREREQqjQkxEREREak0JsREREREpNI0lF0Aoorq9dahig/SwErxMYiIiFQc7xATERERkUor8R3iadOmYciQIahSpYoiykOlwDuVRKolNDQU48ePx/79+2FkZJRnXVJSErp06YJFixbB09NTSSUkIqpYSnyHeP/+/XB2dkarVq2wdetWZGZmKqJcRERUiF9//RUtW7bMlwwDgLGxMVq3bo358+croWRERBVTiRPisLAwXLt2DR4eHvj6669hY2ODkSNH4tq1a4ooHxER/cuVK1fQuXPnQtd36tQJly5dKsMSERFVbKXqQ1y3bl389ttvePnyJdauXYvnz5/Dz88PtWvXxuLFi5GUlCS3Ar548QKff/45zM3Noauri1q1auH69evS9YIgYOrUqbC1tYWuri78/f0RGRkpXZ+ZmYkvvvgCRkZGcHNzw8mTJ/Psf/78+RgzZozcyktEpGgvXryAoaFhoesNDAzw6tWrEu932bJlcHR0hI6ODho0aICrV68WuX1iYiICAwNha2sLbW1tuLm54fDhwyWOS0SkbDINqhMEAdnZ2cjKyoIgCDA1NcXSpUvh4OCAHTt2yFy4hIQE+Pn5QVNTE0eOHMH9+/fx66+/wtTUVLrNvHnz8Ntvv2HlypW4cuUK9PX1ERAQgPfv3wMAVq1ahdDQUISEhGD48OHo168fBEEAAERFRWH16tWYNWuWzGUlIiorlpaWiIiIKHT9gwcPYGFhUaJ97tixA0FBQZg2bRpu3LgBT09PBAQE4PXr1wVun5WVhdatWyM6Ohp//vknIiIisHr1atjb25coLhFReVCqaddCQ0Oxfv16bNu2Ddra2hgwYACWLVsGFxcXAMCSJUswduxY9O7dW6bCzZ07Fw4ODli/fr10mZOTk/T/BUHAokWLMHnyZOnjw40bN8La2hr79u1Dnz59EB4ejs8++wweHh6oWrUqJkyYgPj4eFhaWmLkyJGYO3dugf3wiIjKK39/f8yaNQtt27bNt04QBMyaNQv+/v4l2ueCBQswbNgwDB48GACwcuVK/PXXX1i3bh2+//77fNuvW7cO7969w6VLl6CpqQkAcHR0LPnBkErjoHAqL0p8h7hWrVpo2LAhoqKisHbtWjx79gy//PKLNBkGgL59++LNmzcyF+7AgQPw9vZGz549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O+9YjOxFRkYiJycHq1evxvr16yGXy/H0008jNjZWStPSuWdLHXlQhi1Z034fNg8PD2RmZmLFihXYsmUL1Go10tLSpNu+tUdcXBwKCwsREhKC2tpanDhxAmFhYQCAqKgoLFmyBFFRUZxSQ48UmXgYj60hekzdunULFRUVGDJkCDtrohbExcXh4sWLKCoqsndV6DFkNBoxdOhQ6HQ6qNXq/0zL/phsiSPERETUqrS0NERERMDV1RV5eXnYtWsXtm7dau9q0WPGbDajuroaiYmJeP7559sMholsjQExERG16vTp09iwYQP++ecf6d60TadDEFmjuLgYEyZMwIgRI/DFF1/YuzpEzTAgJiKiVj34NEGijggLCwNnaNKjjHeZICIiIiKHxoCYqAUcySAisi/2w2RLDIiJmnBycgLQ/MlMRERkW42P/n7wSZlEDwPnEBM14ezsjB49eqCqqgpyuRzduvE7IxGRLQkhUFdXh+vXr8Pd3V0aqCB6mHgfYqIH1NfXo6Kiot1PbCMioq7j7u4OT09PiycjEj0sDIiJWtDQ0MBpE0REdiKXyzkyTDbFgJiIiIiIHBonSBIRERGRQ2NATEREREQOjQExERERETk0BsRERERE5NAYEBMRERGRQ2NATEREREQOjQExERERETm0/wFQkSJgzVWlGQAAAABJRU5ErkJggg==",
"text/plain": [
"
"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df = []\n",
"for r in ['test', 'cellsonehot_test', 'aminoacidcnt_test']:\n",
" tmp = reports[r]\n",
" tmp['Experiment'] = r\n",
" df.append(tmp)\n",
"df = pd.concat(df)\n",
"# Rename split_type to paper names\n",
"df['split_type'] = df['split_type'].replace({\n",
" 'random': 'Standard',\n",
" 'uniprot': 'Target',\n",
" 'tanimoto': 'Similarity',\n",
" 'standard': 'Standard',\n",
" 'target': 'Target',\n",
" 'similarity': 'Similarity',\n",
"})\n",
"# Rename columns to paper names\n",
"df.rename(columns={\n",
" 'split_type': 'Study',\n",
" 'test_acc': 'Test Accuracy',\n",
" 'test_roc_auc': 'Test ROC AUC',\n",
"}, inplace=True)\n",
"# Group by experiment and split type then get the mean\n",
"df = df.groupby(['Experiment', 'Study']).mean(['Test Accuracy', 'Test ROC AUC']).reset_index()\n",
"# Rename experiment names to paper names\n",
"df['Experiment'] = df['Experiment'].replace({\n",
" 'test': 'Baseline',\n",
" 'cellsonehot_test': 'Cells as one-hot',\n",
" 'aminoacidcnt_test': 'Proteins as amino-acid counts',\n",
"})\n",
"# Order df by Experiment\n",
"df = df.sort_values(['Experiment'])\n",
"# Order Study by ['Standard', 'Target', 'Similarity']\n",
"df['Study'] = pd.Categorical(df['Study'], ['Standard', 'Target', 'Similarity'])\n",
"\n",
"print(df[['Experiment', 'Study', 'Test Accuracy', 'Test ROC AUC']].to_markdown(index=False))\n",
"df['Experiment'] = df['Experiment'] = df['Experiment'].replace({\n",
" 'Cells as one-hot': 'Cells as\\none-hot',\n",
" 'Proteins as amino-acid counts': 'Proteins as\\nAA counts',\n",
"})\n",
"\n",
"print('-' * 80)\n",
"print('Comparison of the best models mean values:')\n",
"plot_comparison_df(df, 'embedding_comparison_mean')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Ablation Studies"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------------------------------------------------------\n",
"Plotting ablation study for standard CV split\n",
"--------------------------------------------------------------------------------\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_1899217/2296657062.py:75: UserWarning: The palette list has more values (4) than needed (1), which may not be intended.\n",
" sns.barplot(data=final_df,\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------------------------------------------------------\n",
"Plotting ablation study for target CV split\n",
"--------------------------------------------------------------------------------\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_1899217/2296657062.py:75: UserWarning: The palette list has more values (4) than needed (1), which may not be intended.\n",
" sns.barplot(data=final_df,\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------------------------------------------------------\n",
"Plotting ablation study for similarity CV split\n",
"--------------------------------------------------------------------------------\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_1899217/2296657062.py:75: UserWarning: The palette list has more values (4) than needed (1), which may not be intended.\n",
" sns.barplot(data=final_df,\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------------------------------------------------------\n",
"Plotting ablation study for standard CV split\n",
"--------------------------------------------------------------------------------\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_1899217/2296657062.py:75: UserWarning: The palette list has more values (4) than needed (1), which may not be intended.\n",
" sns.barplot(data=final_df,\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------------------------------------------------------\n",
"Plotting ablation study for target CV split\n",
"--------------------------------------------------------------------------------\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_1899217/2296657062.py:75: UserWarning: The palette list has more values (4) than needed (1), which may not be intended.\n",
" sns.barplot(data=final_df,\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------------------------------------------------------\n",
"Plotting ablation study for similarity CV split\n",
"--------------------------------------------------------------------------------\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_1899217/2296657062.py:75: UserWarning: The palette list has more values (4) than needed (1), which may not be intended.\n",
" sns.barplot(data=final_df,\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------------------------------------------------------\n",
"Plotting ablation study for standard CV split\n",
"--------------------------------------------------------------------------------\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_1899217/2296657062.py:75: UserWarning: The palette list has more values (4) than needed (1), which may not be intended.\n",
" sns.barplot(data=final_df,\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------------------------------------------------------\n",
"Plotting ablation study for target CV split\n",
"--------------------------------------------------------------------------------\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_1899217/2296657062.py:75: UserWarning: The palette list has more values (4) than needed (1), which may not be intended.\n",
" sns.barplot(data=final_df,\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------------------------------------------------------\n",
"Plotting ablation study for similarity CV split\n",
"--------------------------------------------------------------------------------\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_1899217/2296657062.py:75: UserWarning: The palette list has more values (4) than needed (1), which may not be intended.\n",
" sns.barplot(data=final_df,\n"
]
}
],
"source": [
"def plot_ablation_study(report, title=''):\n",
" # Define the ablation study combinations\n",
" ablation_study_combinations = [\n",
" 'disabled smiles',\n",
" 'disabled poi',\n",
" 'disabled e3',\n",
" 'disabled cell',\n",
" 'disabled poi e3',\n",
" 'disabled poi e3 smiles',\n",
" 'disabled poi e3 cell',\n",
" ]\n",
"\n",
" for group in report['split_type'].unique():\n",
" print('-' * 80)\n",
" print(f'Plotting ablation study for {group} CV split')\n",
" print('-' * 80)\n",
" baseline = report[report['disabled_embeddings'].isna()].copy()\n",
" baseline = baseline[baseline['split_type'] == group]\n",
" baseline['disabled_embeddings'] = 'all embeddings enabled'\n",
" # metrics_to_show = ['val_acc', 'test_acc']\n",
" metrics_to_show = ['test_acc']\n",
" # baseline = baseline.melt(id_vars=['fold', 'disabled_embeddings'], value_vars=metrics_to_show, var_name='metric', value_name='score')\n",
" baseline = baseline.melt(id_vars=['disabled_embeddings'], value_vars=metrics_to_show, var_name='metric', value_name='score')\n",
"\n",
" ablation_dfs = []\n",
" for disabled_embeddings in ablation_study_combinations:\n",
" tmp = report[report['disabled_embeddings'] == disabled_embeddings].copy()\n",
" tmp = tmp[tmp['split_type'] == group]\n",
" # tmp = tmp.melt(id_vars=['fold', 'disabled_embeddings'], value_vars=metrics_to_show, var_name='metric', value_name='score')\n",
" tmp = tmp.melt(id_vars=['disabled_embeddings'], value_vars=metrics_to_show, var_name='metric', value_name='score')\n",
" ablation_dfs.append(tmp)\n",
" ablation_df = pd.concat(ablation_dfs)\n",
"\n",
" dummy_test_df = pd.DataFrame()\n",
" tmp = report[report['split_type'] == group]\n",
" dummy_test_df['score'] = tmp[['test_active_perc', 'test_inactive_perc']].max(axis=1)\n",
" dummy_test_df['metric'] = 'test_acc'\n",
" dummy_test_df['disabled_embeddings'] = 'dummy'\n",
"\n",
" # dummy_df = pd.concat([dummy_val_df, dummy_test_df])\n",
" dummy_df = dummy_test_df\n",
"\n",
" final_df = pd.concat([dummy_df, baseline, ablation_df])\n",
"\n",
" final_df['metric'] = final_df['metric'].map({\n",
" 'val_acc': 'Validation Accuracy',\n",
" 'test_acc': 'Test Accuracy',\n",
" 'val_roc_auc': 'Val ROC-AUC',\n",
" 'test_roc_auc': 'Test ROC-AUC',\n",
" })\n",
"\n",
" final_df['disabled_embeddings'] = final_df['disabled_embeddings'].map({\n",
" 'all embeddings enabled': 'All embeddings enabled',\n",
" 'dummy': 'Dummy model',\n",
" 'disabled smiles': 'Disabled PROTAC information',\n",
" 'disabled e3': 'Disabled E3 information',\n",
" 'disabled poi': 'Disabled POI information',\n",
" 'disabled cell': 'Disabled cell information',\n",
" 'disabled poi e3': 'Disabled E3 and POI info',\n",
" 'disabled poi e3 smiles': 'Disabled compound, E3, and POI info\\n(only cell information left)',\n",
" 'disabled poi e3 cell': 'Disabled cell, E3, and POI info\\n(only PROTAC information left)',\n",
" })\n",
"\n",
" # Print final_df to latex\n",
" tmp = final_df.groupby(['disabled_embeddings', 'metric']).mean().round(3)\n",
" # Remove fold column to tmp\n",
" tmp = tmp.reset_index() #.drop('fold', axis=1)\n",
"\n",
" # print('DF to plot:\\n', tmp.to_markdown(index=False))\n",
"\n",
" fig, ax = plt.subplots(figsize=(3, 5))\n",
" \n",
" # fig, ax = plt.subplots()\n",
"\n",
" sns.barplot(data=final_df,\n",
" y='disabled_embeddings',\n",
" x='score',\n",
" hue='metric',\n",
" ax=ax,\n",
" errorbar=('sd', 1),\n",
" palette=sns.color_palette(palette, len(palette)),\n",
" saturation=1,\n",
" )\n",
"\n",
" # ax.set_title(f'{group.replace(\"random\", \"standard\")} CV split')\n",
" ax.grid(axis='x', alpha=0.5)\n",
" ax.tick_params(axis='y', rotation=0)\n",
" ax.set_xlim(0, 1.0)\n",
" ax.xaxis.set_major_formatter(plt.matplotlib.ticker.PercentFormatter(1, decimals=0))\n",
" ax.set_ylabel('')\n",
" ax.set_xlabel('')\n",
"\n",
" # Plot the legend below the x-axis, outside the plot\n",
" ax.legend(loc='upper center', bbox_to_anchor=(0.02, -0.1))\n",
"\n",
" # For each bar, add the rotated value (as percentage), inside the bar\n",
" for i, p in enumerate(plt.gca().patches):\n",
" # TODO: For some reasons, there is an additional bar being added at\n",
" # the end of the plot... it's not in the dataframe\n",
" if i == len(plt.gca().patches) - 1:\n",
" continue\n",
" value = '{:.1f}%'.format(100 * p.get_width())\n",
" y = p.get_y() + p.get_height() / 2\n",
" x = 0.2 # p.get_height() - p.get_height() / 2\n",
" plt.annotate(value, (x, y), ha='center', va='center', color='black', fontsize=10, alpha=0.8)\n",
"\n",
" plt.savefig(f'plots/{title}{group}.pdf', bbox_inches='tight')\n",
" plt.close()\n",
"\n",
"for experiment in ['', 'cellsonehot_', 'aminoacidcnt_']:\n",
" reports[f'{experiment}test']['disabled_embeddings'] = pd.NA\n",
" experiment_name = 'pytorch_' if experiment == '' else experiment\n",
" plot_ablation_study(\n",
" pd.concat([\n",
" reports[f'{experiment}ablation'],\n",
" reports[f'{experiment}test'],\n",
" ]),\n",
" title=f'{experiment_name}ablation_study_'\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Others"
]
},
{
"cell_type": "code",
"execution_count": 166,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/cephyr/users/ribes/Alvis/PROTAC-Degradation-Predictor\n"
]
}
],
"source": [
"!pwd"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Compound ID
\n",
"
Uniprot
\n",
"
Smiles
\n",
"
E3 Ligase
\n",
"
InChI
\n",
"
InChI Key
\n",
"
Molecular Weight
\n",
"
Heavy Atom Count
\n",
"
Ring Count
\n",
"
Rotatable Bond Count
\n",
"
...
\n",
"
Name
\n",
"
Assay (DC50/Dmax)
\n",
"
Exact Mass
\n",
"
XLogP3
\n",
"
Target (Parsed)
\n",
"
POI Sequence
\n",
"
E3 Ligase Uniprot
\n",
"
E3 Ligase Sequence
\n",
"
Cell Line Identifier
\n",
"
Active - OR
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C73H88ClF3N10O10S4/c1-47(49-13-15-51(...
\n",
"
SXPDUCVNMGMWBJ-FMZBIETASA-N
\n",
"
1486.282
\n",
"
101
\n",
"
10
\n",
"
24
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1
\n",
"
2
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C74H90ClF3N10O10S4/c1-48(50-13-15-52(...
\n",
"
HQKUMELJMUNTTF-NMKDNUEVSA-N
\n",
"
1500.309
\n",
"
102
\n",
"
10
\n",
"
25
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
NaN
\n",
"
\n",
"
\n",
"
2
\n",
"
3
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C75H92ClF3N10O10S4/c1-49(51-16-18-53(...
\n",
"
ATQCEJKUPSBDMA-QARNUTPLSA-N
\n",
"
1514.336
\n",
"
103
\n",
"
10
\n",
"
26
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
NaN
\n",
"
\n",
"
\n",
"
3
\n",
"
4
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C76H94ClF3N10O10S4/c1-50(52-17-19-54(...
\n",
"
FNKQAGMHNFFSEI-DTTPTBRMSA-N
\n",
"
1528.363
\n",
"
104
\n",
"
10
\n",
"
27
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
NaN
\n",
"
\n",
"
\n",
"
4
\n",
"
5
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C77H96ClF3N10O10S4/c1-51(53-18-20-55(...
\n",
"
PXVFFBGSTYQHRO-REQIQPEASA-N
\n",
"
1542.390
\n",
"
105
\n",
"
10
\n",
"
28
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
True
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
2136
\n",
"
2342
\n",
"
O60885
\n",
"
Cc1ncsc1-c1ccc(CNC(=O)[C@@H]2C[C@@H](O)CN2C(=O...
\n",
"
VHL
\n",
"
InChI=1S/C50H61ClN8O8S2/c1-29-31(3)69-49-42(29...
\n",
"
VRVWHAZIBGEPEK-DPSJZEHMSA-N
\n",
"
1001.673
\n",
"
69
\n",
"
7
\n",
"
20
\n",
"
...
\n",
"
NaN
\n",
"
Degradation of BRD4 long in HEK293 cells after...
\n",
"
1000.374231
\n",
"
6.76
\n",
"
BRD4 long
\n",
"
MSAESGPGTRLRNLPVMGDGLETSQMSTTQAQAQPQPANAASTNPP...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
HEK293
\n",
"
True
\n",
"
\n",
"
\n",
"
2137
\n",
"
2887
\n",
"
Q05397
\n",
"
CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCOCCOCCOCCO...
\n",
"
VHL
\n",
"
InChI=1S/C58H75F3N10O10S/c1-37(39-12-14-40(15-...
\n",
"
FOOHAGZPIHCYKX-ZSFXBAAMSA-N
\n",
"
1161.359
\n",
"
82
\n",
"
7
\n",
"
27
\n",
"
...
\n",
"
NaN
\n",
"
Degradation of FAK in A549 cells after 24 h tr...
\n",
"
1160.534044
\n",
"
6.81
\n",
"
FAK
\n",
"
MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
A549 Cas9
\n",
"
False
\n",
"
\n",
"
\n",
"
2138
\n",
"
2889
\n",
"
Q05397
\n",
"
CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCOCCOCC(=O)...
\n",
"
VHL
\n",
"
InChI=1S/C54H67F3N10O8S/c1-33(35-12-14-36(15-1...
\n",
"
RDCVMTUYWQXPEC-FSHOLZCKSA-N
\n",
"
1073.253
\n",
"
76
\n",
"
7
\n",
"
21
\n",
"
...
\n",
"
NaN
\n",
"
Degradation of FAK in A549 cells after 24 h tr...
\n",
"
1072.481615
\n",
"
7.11
\n",
"
FAK
\n",
"
MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
A549 Cas9
\n",
"
False
\n",
"
\n",
"
\n",
"
2139
\n",
"
2890
\n",
"
Q05397
\n",
"
CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCOCC(=O)N[C...
\n",
"
VHL
\n",
"
InChI=1S/C52H63F3N10O7S/c1-31(33-12-14-34(15-1...
\n",
"
SLSLLSIRBMAERC-MGVZSLQJSA-N
\n",
"
1029.200
\n",
"
73
\n",
"
7
\n",
"
18
\n",
"
...
\n",
"
NaN
\n",
"
Degradation of FAK in A549 cells after 24 h tr...
\n",
"
1028.455400
\n",
"
7.26
\n",
"
FAK
\n",
"
MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
A549 Cas9
\n",
"
True
\n",
"
\n",
"
\n",
"
2140
\n",
"
2891
\n",
"
Q05397
\n",
"
CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCC(=O)N[C@H...
\n",
"
VHL
\n",
"
InChI=1S/C51H61F3N10O6S/c1-30(32-12-14-33(15-1...
\n",
"
ASRIXACKPXMNKY-FCFVTTBASA-N
\n",
"
999.174
\n",
"
71
\n",
"
7
\n",
"
16
\n",
"
...
\n",
"
NaN
\n",
"
Degradation of FAK in A549 cells after 24 h tr...
\n",
"
998.444835
\n",
"
7.31
\n",
"
FAK
\n",
"
MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
A549 Cas9
\n",
"
True
\n",
"
\n",
" \n",
"
\n",
"
2141 rows × 35 columns
\n",
"
"
],
"text/plain": [
" Compound ID Uniprot Smiles \\\n",
"0 1 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"1 2 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"2 3 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"3 4 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"4 5 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"... ... ... ... \n",
"2136 2342 O60885 Cc1ncsc1-c1ccc(CNC(=O)[C@@H]2C[C@@H](O)CN2C(=O... \n",
"2137 2887 Q05397 CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCOCCOCCOCCO... \n",
"2138 2889 Q05397 CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCOCCOCC(=O)... \n",
"2139 2890 Q05397 CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCOCC(=O)N[C... \n",
"2140 2891 Q05397 CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCC(=O)N[C@H... \n",
"\n",
" E3 Ligase InChI \\\n",
"0 VHL InChI=1S/C73H88ClF3N10O10S4/c1-47(49-13-15-51(... \n",
"1 VHL InChI=1S/C74H90ClF3N10O10S4/c1-48(50-13-15-52(... \n",
"2 VHL InChI=1S/C75H92ClF3N10O10S4/c1-49(51-16-18-53(... \n",
"3 VHL InChI=1S/C76H94ClF3N10O10S4/c1-50(52-17-19-54(... \n",
"4 VHL InChI=1S/C77H96ClF3N10O10S4/c1-51(53-18-20-55(... \n",
"... ... ... \n",
"2136 VHL InChI=1S/C50H61ClN8O8S2/c1-29-31(3)69-49-42(29... \n",
"2137 VHL InChI=1S/C58H75F3N10O10S/c1-37(39-12-14-40(15-... \n",
"2138 VHL InChI=1S/C54H67F3N10O8S/c1-33(35-12-14-36(15-1... \n",
"2139 VHL InChI=1S/C52H63F3N10O7S/c1-31(33-12-14-34(15-1... \n",
"2140 VHL InChI=1S/C51H61F3N10O6S/c1-30(32-12-14-33(15-1... \n",
"\n",
" InChI Key Molecular Weight Heavy Atom Count \\\n",
"0 SXPDUCVNMGMWBJ-FMZBIETASA-N 1486.282 101 \n",
"1 HQKUMELJMUNTTF-NMKDNUEVSA-N 1500.309 102 \n",
"2 ATQCEJKUPSBDMA-QARNUTPLSA-N 1514.336 103 \n",
"3 FNKQAGMHNFFSEI-DTTPTBRMSA-N 1528.363 104 \n",
"4 PXVFFBGSTYQHRO-REQIQPEASA-N 1542.390 105 \n",
"... ... ... ... \n",
"2136 VRVWHAZIBGEPEK-DPSJZEHMSA-N 1001.673 69 \n",
"2137 FOOHAGZPIHCYKX-ZSFXBAAMSA-N 1161.359 82 \n",
"2138 RDCVMTUYWQXPEC-FSHOLZCKSA-N 1073.253 76 \n",
"2139 SLSLLSIRBMAERC-MGVZSLQJSA-N 1029.200 73 \n",
"2140 ASRIXACKPXMNKY-FCFVTTBASA-N 999.174 71 \n",
"\n",
" Ring Count Rotatable Bond Count ... Name \\\n",
"0 10 24 ... NaN \n",
"1 10 25 ... NaN \n",
"2 10 26 ... NaN \n",
"3 10 27 ... NaN \n",
"4 10 28 ... NaN \n",
"... ... ... ... ... \n",
"2136 7 20 ... NaN \n",
"2137 7 27 ... NaN \n",
"2138 7 21 ... NaN \n",
"2139 7 18 ... NaN \n",
"2140 7 16 ... NaN \n",
"\n",
" Assay (DC50/Dmax) Exact Mass XLogP3 \\\n",
"0 NaN NaN NaN \n",
"1 NaN NaN NaN \n",
"2 NaN NaN NaN \n",
"3 NaN NaN NaN \n",
"4 NaN NaN NaN \n",
"... ... ... ... \n",
"2136 Degradation of BRD4 long in HEK293 cells after... 1000.374231 6.76 \n",
"2137 Degradation of FAK in A549 cells after 24 h tr... 1160.534044 6.81 \n",
"2138 Degradation of FAK in A549 cells after 24 h tr... 1072.481615 7.11 \n",
"2139 Degradation of FAK in A549 cells after 24 h tr... 1028.455400 7.26 \n",
"2140 Degradation of FAK in A549 cells after 24 h tr... 998.444835 7.31 \n",
"\n",
" Target (Parsed) POI Sequence \\\n",
"0 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"1 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"2 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"3 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"4 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"... ... ... \n",
"2136 BRD4 long MSAESGPGTRLRNLPVMGDGLETSQMSTTQAQAQPQPANAASTNPP... \n",
"2137 FAK MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN... \n",
"2138 FAK MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN... \n",
"2139 FAK MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN... \n",
"2140 FAK MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN... \n",
"\n",
" E3 Ligase Uniprot E3 Ligase Sequence \\\n",
"0 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"1 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"2 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"3 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"4 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"... ... ... \n",
"2136 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"2137 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"2138 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"2139 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"2140 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"\n",
" Cell Line Identifier Active - OR \n",
"0 MOLT-4 NaN \n",
"1 MOLT-4 NaN \n",
"2 MOLT-4 NaN \n",
"3 MOLT-4 NaN \n",
"4 MOLT-4 True \n",
"... ... ... \n",
"2136 HEK293 True \n",
"2137 A549 Cas9 False \n",
"2138 A549 Cas9 False \n",
"2139 A549 Cas9 True \n",
"2140 A549 Cas9 True \n",
"\n",
"[2141 rows x 35 columns]"
]
},
"execution_count": 95,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sys\n",
"import protac_degradation_predictor as pdp\n",
"\n",
"protac_df = pdp.load_curated_dataset()\n",
"protac_df"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from rdkit import Chem\n",
"\n",
"def canon_smiles(smi):\n",
" mol = Chem.MolFromSmiles(smi)\n",
" if mol is None:\n",
" return None\n",
" return Chem.MolToSmiles(mol)\n",
"\n",
"# Canonicalize SMILES\n",
"protac_df['canon_smiles'] = protac_df['Smiles'].apply(lambda x: canon_smiles(x))\n",
"# Check that all canon_smiles is equal to the Smiles column\n",
"protac_df['canon_smiles'].equals(protac_df['Smiles'])"
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Compound ID
\n",
"
Uniprot
\n",
"
Smiles
\n",
"
E3 Ligase
\n",
"
InChI
\n",
"
InChI Key
\n",
"
Molecular Weight
\n",
"
Heavy Atom Count
\n",
"
Ring Count
\n",
"
Rotatable Bond Count
\n",
"
...
\n",
"
Name
\n",
"
Assay (DC50/Dmax)
\n",
"
Exact Mass
\n",
"
XLogP3
\n",
"
Target (Parsed)
\n",
"
POI Sequence
\n",
"
E3 Ligase Uniprot
\n",
"
E3 Ligase Sequence
\n",
"
Cell Line Identifier
\n",
"
Active - OR
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C73H88ClF3N10O10S4/c1-47(49-13-15-51(...
\n",
"
SXPDUCVNMGMWBJ-FMZBIETASA-N
\n",
"
1486.282
\n",
"
101
\n",
"
10
\n",
"
24
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1
\n",
"
2
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C74H90ClF3N10O10S4/c1-48(50-13-15-52(...
\n",
"
HQKUMELJMUNTTF-NMKDNUEVSA-N
\n",
"
1500.309
\n",
"
102
\n",
"
10
\n",
"
25
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
NaN
\n",
"
\n",
"
\n",
"
2
\n",
"
3
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C75H92ClF3N10O10S4/c1-49(51-16-18-53(...
\n",
"
ATQCEJKUPSBDMA-QARNUTPLSA-N
\n",
"
1514.336
\n",
"
103
\n",
"
10
\n",
"
26
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
NaN
\n",
"
\n",
"
\n",
"
3
\n",
"
4
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C76H94ClF3N10O10S4/c1-50(52-17-19-54(...
\n",
"
FNKQAGMHNFFSEI-DTTPTBRMSA-N
\n",
"
1528.363
\n",
"
104
\n",
"
10
\n",
"
27
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
NaN
\n",
"
\n",
"
\n",
"
4
\n",
"
5
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C77H96ClF3N10O10S4/c1-51(53-18-20-55(...
\n",
"
PXVFFBGSTYQHRO-REQIQPEASA-N
\n",
"
1542.390
\n",
"
105
\n",
"
10
\n",
"
28
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
True
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
2136
\n",
"
2342
\n",
"
O60885
\n",
"
Cc1ncsc1-c1ccc(CNC(=O)[C@@H]2C[C@@H](O)CN2C(=O...
\n",
"
VHL
\n",
"
InChI=1S/C50H61ClN8O8S2/c1-29-31(3)69-49-42(29...
\n",
"
VRVWHAZIBGEPEK-DPSJZEHMSA-N
\n",
"
1001.673
\n",
"
69
\n",
"
7
\n",
"
20
\n",
"
...
\n",
"
NaN
\n",
"
Degradation of BRD4 long in HEK293 cells after...
\n",
"
1000.374231
\n",
"
6.76
\n",
"
BRD4 long
\n",
"
MSAESGPGTRLRNLPVMGDGLETSQMSTTQAQAQPQPANAASTNPP...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
HEK293
\n",
"
True
\n",
"
\n",
"
\n",
"
2137
\n",
"
2887
\n",
"
Q05397
\n",
"
CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCOCCOCCOCCO...
\n",
"
VHL
\n",
"
InChI=1S/C58H75F3N10O10S/c1-37(39-12-14-40(15-...
\n",
"
FOOHAGZPIHCYKX-ZSFXBAAMSA-N
\n",
"
1161.359
\n",
"
82
\n",
"
7
\n",
"
27
\n",
"
...
\n",
"
NaN
\n",
"
Degradation of FAK in A549 cells after 24 h tr...
\n",
"
1160.534044
\n",
"
6.81
\n",
"
FAK
\n",
"
MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
A549 Cas9
\n",
"
False
\n",
"
\n",
"
\n",
"
2138
\n",
"
2889
\n",
"
Q05397
\n",
"
CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCOCCOCC(=O)...
\n",
"
VHL
\n",
"
InChI=1S/C54H67F3N10O8S/c1-33(35-12-14-36(15-1...
\n",
"
RDCVMTUYWQXPEC-FSHOLZCKSA-N
\n",
"
1073.253
\n",
"
76
\n",
"
7
\n",
"
21
\n",
"
...
\n",
"
NaN
\n",
"
Degradation of FAK in A549 cells after 24 h tr...
\n",
"
1072.481615
\n",
"
7.11
\n",
"
FAK
\n",
"
MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
A549 Cas9
\n",
"
False
\n",
"
\n",
"
\n",
"
2139
\n",
"
2890
\n",
"
Q05397
\n",
"
CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCOCC(=O)N[C...
\n",
"
VHL
\n",
"
InChI=1S/C52H63F3N10O7S/c1-31(33-12-14-34(15-1...
\n",
"
SLSLLSIRBMAERC-MGVZSLQJSA-N
\n",
"
1029.200
\n",
"
73
\n",
"
7
\n",
"
18
\n",
"
...
\n",
"
NaN
\n",
"
Degradation of FAK in A549 cells after 24 h tr...
\n",
"
1028.455400
\n",
"
7.26
\n",
"
FAK
\n",
"
MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
A549 Cas9
\n",
"
True
\n",
"
\n",
"
\n",
"
2140
\n",
"
2891
\n",
"
Q05397
\n",
"
CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCC(=O)N[C@H...
\n",
"
VHL
\n",
"
InChI=1S/C51H61F3N10O6S/c1-30(32-12-14-33(15-1...
\n",
"
ASRIXACKPXMNKY-FCFVTTBASA-N
\n",
"
999.174
\n",
"
71
\n",
"
7
\n",
"
16
\n",
"
...
\n",
"
NaN
\n",
"
Degradation of FAK in A549 cells after 24 h tr...
\n",
"
998.444835
\n",
"
7.31
\n",
"
FAK
\n",
"
MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
A549 Cas9
\n",
"
True
\n",
"
\n",
" \n",
"
\n",
"
2141 rows × 35 columns
\n",
"
"
],
"text/plain": [
" Compound ID Uniprot Smiles \\\n",
"0 1 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"1 2 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"2 3 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"3 4 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"4 5 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"... ... ... ... \n",
"2136 2342 O60885 Cc1ncsc1-c1ccc(CNC(=O)[C@@H]2C[C@@H](O)CN2C(=O... \n",
"2137 2887 Q05397 CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCOCCOCCOCCO... \n",
"2138 2889 Q05397 CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCOCCOCC(=O)... \n",
"2139 2890 Q05397 CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCOCC(=O)N[C... \n",
"2140 2891 Q05397 CNC(=O)c1ccccc1Nc1cc(Nc2ccc(N3CCN(CCC(=O)N[C@H... \n",
"\n",
" E3 Ligase InChI \\\n",
"0 VHL InChI=1S/C73H88ClF3N10O10S4/c1-47(49-13-15-51(... \n",
"1 VHL InChI=1S/C74H90ClF3N10O10S4/c1-48(50-13-15-52(... \n",
"2 VHL InChI=1S/C75H92ClF3N10O10S4/c1-49(51-16-18-53(... \n",
"3 VHL InChI=1S/C76H94ClF3N10O10S4/c1-50(52-17-19-54(... \n",
"4 VHL InChI=1S/C77H96ClF3N10O10S4/c1-51(53-18-20-55(... \n",
"... ... ... \n",
"2136 VHL InChI=1S/C50H61ClN8O8S2/c1-29-31(3)69-49-42(29... \n",
"2137 VHL InChI=1S/C58H75F3N10O10S/c1-37(39-12-14-40(15-... \n",
"2138 VHL InChI=1S/C54H67F3N10O8S/c1-33(35-12-14-36(15-1... \n",
"2139 VHL InChI=1S/C52H63F3N10O7S/c1-31(33-12-14-34(15-1... \n",
"2140 VHL InChI=1S/C51H61F3N10O6S/c1-30(32-12-14-33(15-1... \n",
"\n",
" InChI Key Molecular Weight Heavy Atom Count \\\n",
"0 SXPDUCVNMGMWBJ-FMZBIETASA-N 1486.282 101 \n",
"1 HQKUMELJMUNTTF-NMKDNUEVSA-N 1500.309 102 \n",
"2 ATQCEJKUPSBDMA-QARNUTPLSA-N 1514.336 103 \n",
"3 FNKQAGMHNFFSEI-DTTPTBRMSA-N 1528.363 104 \n",
"4 PXVFFBGSTYQHRO-REQIQPEASA-N 1542.390 105 \n",
"... ... ... ... \n",
"2136 VRVWHAZIBGEPEK-DPSJZEHMSA-N 1001.673 69 \n",
"2137 FOOHAGZPIHCYKX-ZSFXBAAMSA-N 1161.359 82 \n",
"2138 RDCVMTUYWQXPEC-FSHOLZCKSA-N 1073.253 76 \n",
"2139 SLSLLSIRBMAERC-MGVZSLQJSA-N 1029.200 73 \n",
"2140 ASRIXACKPXMNKY-FCFVTTBASA-N 999.174 71 \n",
"\n",
" Ring Count Rotatable Bond Count ... Name \\\n",
"0 10 24 ... NaN \n",
"1 10 25 ... NaN \n",
"2 10 26 ... NaN \n",
"3 10 27 ... NaN \n",
"4 10 28 ... NaN \n",
"... ... ... ... ... \n",
"2136 7 20 ... NaN \n",
"2137 7 27 ... NaN \n",
"2138 7 21 ... NaN \n",
"2139 7 18 ... NaN \n",
"2140 7 16 ... NaN \n",
"\n",
" Assay (DC50/Dmax) Exact Mass XLogP3 \\\n",
"0 NaN NaN NaN \n",
"1 NaN NaN NaN \n",
"2 NaN NaN NaN \n",
"3 NaN NaN NaN \n",
"4 NaN NaN NaN \n",
"... ... ... ... \n",
"2136 Degradation of BRD4 long in HEK293 cells after... 1000.374231 6.76 \n",
"2137 Degradation of FAK in A549 cells after 24 h tr... 1160.534044 6.81 \n",
"2138 Degradation of FAK in A549 cells after 24 h tr... 1072.481615 7.11 \n",
"2139 Degradation of FAK in A549 cells after 24 h tr... 1028.455400 7.26 \n",
"2140 Degradation of FAK in A549 cells after 24 h tr... 998.444835 7.31 \n",
"\n",
" Target (Parsed) POI Sequence \\\n",
"0 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"1 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"2 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"3 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"4 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"... ... ... \n",
"2136 BRD4 long MSAESGPGTRLRNLPVMGDGLETSQMSTTQAQAQPQPANAASTNPP... \n",
"2137 FAK MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN... \n",
"2138 FAK MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN... \n",
"2139 FAK MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN... \n",
"2140 FAK MAAAYLDPNLNHTPNSSTKTHLGTGMERSPGAMERVLKVFHYFESN... \n",
"\n",
" E3 Ligase Uniprot E3 Ligase Sequence \\\n",
"0 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"1 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"2 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"3 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"4 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"... ... ... \n",
"2136 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"2137 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"2138 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"2139 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"2140 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"\n",
" Cell Line Identifier Active - OR \n",
"0 MOLT-4 NaN \n",
"1 MOLT-4 NaN \n",
"2 MOLT-4 NaN \n",
"3 MOLT-4 NaN \n",
"4 MOLT-4 True \n",
"... ... ... \n",
"2136 HEK293 True \n",
"2137 A549 Cas9 False \n",
"2138 A549 Cas9 False \n",
"2139 A549 Cas9 True \n",
"2140 A549 Cas9 True \n",
"\n",
"[2141 rows x 35 columns]"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Compound ID
\n",
"
Uniprot
\n",
"
Smiles
\n",
"
E3 Ligase
\n",
"
InChI
\n",
"
InChI Key
\n",
"
Molecular Weight
\n",
"
Heavy Atom Count
\n",
"
Ring Count
\n",
"
Rotatable Bond Count
\n",
"
...
\n",
"
Name
\n",
"
Assay (DC50/Dmax)
\n",
"
Exact Mass
\n",
"
XLogP3
\n",
"
Target (Parsed)
\n",
"
POI Sequence
\n",
"
E3 Ligase Uniprot
\n",
"
E3 Ligase Sequence
\n",
"
Cell Line Identifier
\n",
"
Active - OR
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
1
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C73H88ClF3N10O10S4/c1-47(49-13-15-51(...
\n",
"
SXPDUCVNMGMWBJ-FMZBIETASA-N
\n",
"
1486.282
\n",
"
101.0
\n",
"
10.0
\n",
"
24.0
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1
\n",
"
2
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C74H90ClF3N10O10S4/c1-48(50-13-15-52(...
\n",
"
HQKUMELJMUNTTF-NMKDNUEVSA-N
\n",
"
1500.309
\n",
"
102.0
\n",
"
10.0
\n",
"
25.0
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
NaN
\n",
"
\n",
"
\n",
"
2
\n",
"
3
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C75H92ClF3N10O10S4/c1-49(51-16-18-53(...
\n",
"
ATQCEJKUPSBDMA-QARNUTPLSA-N
\n",
"
1514.336
\n",
"
103.0
\n",
"
10.0
\n",
"
26.0
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
NaN
\n",
"
\n",
"
\n",
"
3
\n",
"
4
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C76H94ClF3N10O10S4/c1-50(52-17-19-54(...
\n",
"
FNKQAGMHNFFSEI-DTTPTBRMSA-N
\n",
"
1528.363
\n",
"
104.0
\n",
"
10.0
\n",
"
27.0
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
NaN
\n",
"
\n",
"
\n",
"
4
\n",
"
6
\n",
"
Q07817
\n",
"
Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)...
\n",
"
VHL
\n",
"
InChI=1S/C78H98ClF3N10O10S4/c1-52(54-19-21-56(...
\n",
"
DKBAKHBUQPFQDO-PXKQGBTKSA-N
\n",
"
1556.417
\n",
"
106.0
\n",
"
10.0
\n",
"
29.0
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
NaN
\n",
"
MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME...
\n",
"
P40337
\n",
"
MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE...
\n",
"
MOLT-4
\n",
"
NaN
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
1896
\n",
"
384
\n",
"
Q07820
\n",
"
O=C(CCCCC(=O)NCCN1C(=O)c2cccc3c(Sc4ccc(Br)cc4)...
\n",
"
CRBN
\n",
"
InChI=1S/C45H45BrN6O8S/c46-27-15-17-28(18-16-2...
\n",
"
BORXNUWYWZOREQ-UHFFFAOYSA-N
\n",
"
909.860
\n",
"
61.0
\n",
"
7.0
\n",
"
19.0
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
908.220296
\n",
"
5.98
\n",
"
NaN
\n",
"
MFGLKRNAVIGLNLYCGGAGLGAGSGGATRPGGRLLATEKEASARR...
\n",
"
Q96SW2
\n",
"
MAGEGDQQDAAHNMGNHLPLLPAESEEEDEMEVEDQDSKEAKKPNI...
\n",
"
HeLa
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1897
\n",
"
910
\n",
"
Q9UBN7
\n",
"
O=C(CCCCCCC(=O)N/N=C/c1ccc(OCCOCCOCCn2cc(CNc3c...
\n",
"
CRBN
\n",
"
InChI=1S/C37H45N9O10/c47-31-15-14-30(35(50)40-...
\n",
"
MHILTYZXXFOWJH-WVKHYPTHSA-N
\n",
"
775.820
\n",
"
56.0
\n",
"
5.0
\n",
"
23.0
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
775.328939
\n",
"
1.00
\n",
"
NaN
\n",
"
MTSTGQDSTTTRQRRSRQNPQSPPQDSSVTSKRNIKKGAVPRSIPN...
\n",
"
Q96SW2
\n",
"
MAGEGDQQDAAHNMGNHLPLLPAESEEEDEMEVEDQDSKEAKKPNI...
\n",
"
MM1.S
\n",
"
NaN
\n",
"
\n",
"
\n",
"
1898
\n",
"
2544
\n",
"
O60760
\n",
"
O=C1CCC(N2C(=O)c3cccc(N4CCN(C(=O)C5CCN(c6ccc(N...
\n",
"
CRBN
\n",
"
InChI=1S/C40H38N8O7/c49-33-14-13-32(36(51)44-3...
\n",
"
KQNXUQJGOJWQGL-UHFFFAOYSA-N
\n",
"
742.793
\n",
"
55.0
\n",
"
8.0
\n",
"
8.0
\n",
"
...
\n",
"
PROTAC(H-PGDS)-7
\n",
"
Degradation of HPGDS in KU812 cells after 6/24...
\n",
"
742.286346
\n",
"
2.77
\n",
"
HPGDS
\n",
"
MPNYKLTYFNMRGRAEIIRYIFAYLDIQYEDHRIEQADWPEIKSTL...
\n",
"
Q96SW2
\n",
"
MAGEGDQQDAAHNMGNHLPLLPAESEEEDEMEVEDQDSKEAKKPNI...
\n",
"
Ku812
\n",
"
True
\n",
"
\n",
"
\n",
"
1899
\n",
"
1214
\n",
"
P14174
\n",
"
O=C1CCC(N2C(=O)c3cccc(NCCCCCCCC(=O)Nc4ccc(N5Cc...
\n",
"
CRBN
\n",
"
InChI=1S/C35H35N5O8/c41-24-15-10-21-20-39(35(4...
\n",
"
HAHDZDUOFHMMEA-UHFFFAOYSA-N
\n",
"
653.692
\n",
"
48.0
\n",
"
6.0
\n",
"
12.0
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
653.248563
\n",
"
4.16
\n",
"
NaN
\n",
"
MPMFIVNTNVPRASVPDGFLSELTQQLAQATGKPPQYIAVHVVPDQ...
\n",
"
Q96SW2
\n",
"
MAGEGDQQDAAHNMGNHLPLLPAESEEEDEMEVEDQDSKEAKKPNI...
\n",
"
A549 Cas9
\n",
"
False
\n",
"
\n",
"
\n",
"
1900
\n",
"
136
\n",
"
P00533
\n",
"
O=C1CCC(N2Cc3c(NC(=O)CCCCCCCN4CCN(c5ccc(Nc6cc7...
\n",
"
CRBN
\n",
"
InChI=1S/C49H57FN12O5/c50-33-10-12-34(13-11-33...
\n",
"
ZWLPWTDAYPOQGR-UHFFFAOYSA-N
\n",
"
913.072
\n",
"
67.0
\n",
"
9.0
\n",
"
17.0
\n",
"
...
\n",
"
NaN
\n",
"
NaN
\n",
"
912.455891
\n",
"
5.26
\n",
"
NaN
\n",
"
MRPSGTAGAALLALLAALCPASRALEEKKVCQGTSNKLTQLGTFED...
\n",
"
Q96SW2
\n",
"
MAGEGDQQDAAHNMGNHLPLLPAESEEEDEMEVEDQDSKEAKKPNI...
\n",
"
HCC827
\n",
"
True
\n",
"
\n",
" \n",
"
\n",
"
1901 rows × 35 columns
\n",
"
"
],
"text/plain": [
" Compound ID Uniprot Smiles \\\n",
"0 1 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"1 2 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"2 3 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"3 4 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"4 6 Q07817 Cc1ncsc1-c1ccc([C@H](C)NC(=O)[C@@H]2C[C@@H](O)... \n",
"... ... ... ... \n",
"1896 384 Q07820 O=C(CCCCC(=O)NCCN1C(=O)c2cccc3c(Sc4ccc(Br)cc4)... \n",
"1897 910 Q9UBN7 O=C(CCCCCCC(=O)N/N=C/c1ccc(OCCOCCOCCn2cc(CNc3c... \n",
"1898 2544 O60760 O=C1CCC(N2C(=O)c3cccc(N4CCN(C(=O)C5CCN(c6ccc(N... \n",
"1899 1214 P14174 O=C1CCC(N2C(=O)c3cccc(NCCCCCCCC(=O)Nc4ccc(N5Cc... \n",
"1900 136 P00533 O=C1CCC(N2Cc3c(NC(=O)CCCCCCCN4CCN(c5ccc(Nc6cc7... \n",
"\n",
" E3 Ligase InChI \\\n",
"0 VHL InChI=1S/C73H88ClF3N10O10S4/c1-47(49-13-15-51(... \n",
"1 VHL InChI=1S/C74H90ClF3N10O10S4/c1-48(50-13-15-52(... \n",
"2 VHL InChI=1S/C75H92ClF3N10O10S4/c1-49(51-16-18-53(... \n",
"3 VHL InChI=1S/C76H94ClF3N10O10S4/c1-50(52-17-19-54(... \n",
"4 VHL InChI=1S/C78H98ClF3N10O10S4/c1-52(54-19-21-56(... \n",
"... ... ... \n",
"1896 CRBN InChI=1S/C45H45BrN6O8S/c46-27-15-17-28(18-16-2... \n",
"1897 CRBN InChI=1S/C37H45N9O10/c47-31-15-14-30(35(50)40-... \n",
"1898 CRBN InChI=1S/C40H38N8O7/c49-33-14-13-32(36(51)44-3... \n",
"1899 CRBN InChI=1S/C35H35N5O8/c41-24-15-10-21-20-39(35(4... \n",
"1900 CRBN InChI=1S/C49H57FN12O5/c50-33-10-12-34(13-11-33... \n",
"\n",
" InChI Key Molecular Weight Heavy Atom Count \\\n",
"0 SXPDUCVNMGMWBJ-FMZBIETASA-N 1486.282 101.0 \n",
"1 HQKUMELJMUNTTF-NMKDNUEVSA-N 1500.309 102.0 \n",
"2 ATQCEJKUPSBDMA-QARNUTPLSA-N 1514.336 103.0 \n",
"3 FNKQAGMHNFFSEI-DTTPTBRMSA-N 1528.363 104.0 \n",
"4 DKBAKHBUQPFQDO-PXKQGBTKSA-N 1556.417 106.0 \n",
"... ... ... ... \n",
"1896 BORXNUWYWZOREQ-UHFFFAOYSA-N 909.860 61.0 \n",
"1897 MHILTYZXXFOWJH-WVKHYPTHSA-N 775.820 56.0 \n",
"1898 KQNXUQJGOJWQGL-UHFFFAOYSA-N 742.793 55.0 \n",
"1899 HAHDZDUOFHMMEA-UHFFFAOYSA-N 653.692 48.0 \n",
"1900 ZWLPWTDAYPOQGR-UHFFFAOYSA-N 913.072 67.0 \n",
"\n",
" Ring Count Rotatable Bond Count ... Name \\\n",
"0 10.0 24.0 ... NaN \n",
"1 10.0 25.0 ... NaN \n",
"2 10.0 26.0 ... NaN \n",
"3 10.0 27.0 ... NaN \n",
"4 10.0 29.0 ... NaN \n",
"... ... ... ... ... \n",
"1896 7.0 19.0 ... NaN \n",
"1897 5.0 23.0 ... NaN \n",
"1898 8.0 8.0 ... PROTAC(H-PGDS)-7 \n",
"1899 6.0 12.0 ... NaN \n",
"1900 9.0 17.0 ... NaN \n",
"\n",
" Assay (DC50/Dmax) Exact Mass XLogP3 \\\n",
"0 NaN NaN NaN \n",
"1 NaN NaN NaN \n",
"2 NaN NaN NaN \n",
"3 NaN NaN NaN \n",
"4 NaN NaN NaN \n",
"... ... ... ... \n",
"1896 NaN 908.220296 5.98 \n",
"1897 NaN 775.328939 1.00 \n",
"1898 Degradation of HPGDS in KU812 cells after 6/24... 742.286346 2.77 \n",
"1899 NaN 653.248563 4.16 \n",
"1900 NaN 912.455891 5.26 \n",
"\n",
" Target (Parsed) POI Sequence \\\n",
"0 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"1 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"2 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"3 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"4 NaN MSQSNRELVVDFLSYKLSQKGYSWSQFSDVEENRTEAPEGTESEME... \n",
"... ... ... \n",
"1896 NaN MFGLKRNAVIGLNLYCGGAGLGAGSGGATRPGGRLLATEKEASARR... \n",
"1897 NaN MTSTGQDSTTTRQRRSRQNPQSPPQDSSVTSKRNIKKGAVPRSIPN... \n",
"1898 HPGDS MPNYKLTYFNMRGRAEIIRYIFAYLDIQYEDHRIEQADWPEIKSTL... \n",
"1899 NaN MPMFIVNTNVPRASVPDGFLSELTQQLAQATGKPPQYIAVHVVPDQ... \n",
"1900 NaN MRPSGTAGAALLALLAALCPASRALEEKKVCQGTSNKLTQLGTFED... \n",
"\n",
" E3 Ligase Uniprot E3 Ligase Sequence \\\n",
"0 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"1 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"2 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"3 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"4 P40337 MPRRAENWDEAEVGAEEAGVEEYGPEEDGGEESGAEESGPEESGPE... \n",
"... ... ... \n",
"1896 Q96SW2 MAGEGDQQDAAHNMGNHLPLLPAESEEEDEMEVEDQDSKEAKKPNI... \n",
"1897 Q96SW2 MAGEGDQQDAAHNMGNHLPLLPAESEEEDEMEVEDQDSKEAKKPNI... \n",
"1898 Q96SW2 MAGEGDQQDAAHNMGNHLPLLPAESEEEDEMEVEDQDSKEAKKPNI... \n",
"1899 Q96SW2 MAGEGDQQDAAHNMGNHLPLLPAESEEEDEMEVEDQDSKEAKKPNI... \n",
"1900 Q96SW2 MAGEGDQQDAAHNMGNHLPLLPAESEEEDEMEVEDQDSKEAKKPNI... \n",
"\n",
" Cell Line Identifier Active - OR \n",
"0 MOLT-4 NaN \n",
"1 MOLT-4 NaN \n",
"2 MOLT-4 NaN \n",
"3 MOLT-4 NaN \n",
"4 MOLT-4 NaN \n",
"... ... ... \n",
"1896 HeLa NaN \n",
"1897 MM1.S NaN \n",
"1898 Ku812 True \n",
"1899 A549 Cas9 False \n",
"1900 HCC827 True \n",
"\n",
"[1901 rows x 35 columns]"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import numpy as np\n",
"\n",
"# Remove duplicates with a custom function\n",
"def merge_numerical_cols(group):\n",
" key_cols = [\n",
" 'Smiles',\n",
" 'Uniprot',\n",
" 'E3 Ligase Uniprot',\n",
" 'Cell Line Identifier',\n",
" ]\n",
" class_cols = ['DC50 (nM)', 'Dmax (%)']\n",
" # Loop over all numerical columns\n",
" for col in group.select_dtypes(include=[np.number]).columns:\n",
" if col == 'Compound ID':\n",
" continue\n",
" # Compute the geometric mean for the column\n",
" values = group[col].dropna()\n",
" if not values.empty:\n",
" group[col] = np.prod(values) ** (1 / len(values))\n",
"\n",
" row = group.drop_duplicates(subset=key_cols + class_cols).reset_index(drop=True)\n",
"\n",
" assert len(row) == 1\n",
"\n",
" return row\n",
"\n",
"\n",
"def remove_duplicates(df):\n",
" key_cols = [\n",
" 'Smiles',\n",
" 'Uniprot',\n",
" 'E3 Ligase Uniprot',\n",
" 'Cell Line Identifier',\n",
" ]\n",
" class_cols = ['DC50 (nM)', 'Dmax (%)']\n",
" # Check if there are any duplicated entries having the same key columns, if\n",
" # so, merge them by applying a geometric mean to their DC50 and Dmax columns\n",
" duplicated = df[df.duplicated(subset=key_cols, keep=False)]\n",
"\n",
" # NOTE: Reset index to remove the multi-index\n",
" merged = duplicated.groupby(key_cols).apply(lambda x: merge_numerical_cols(x))\n",
" merged = merged.reset_index(drop=True)\n",
"\n",
" # Remove the duplicated entries from the original dataframe df\n",
" df = df[~df.duplicated(subset=key_cols, keep=False)]\n",
" # Concatenate the merged dataframe with the original dataframe\n",
" return pd.concat([df, merged], ignore_index=True)\n",
"\n",
"\n",
"display(protac_df)\n",
"display(remove_duplicates(protac_df))"
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {},
"outputs": [],
"source": [
"pDC50_threshold = 6.0\n",
"Dmax_threshold = 0.6\n",
"protac_df['Active'] = protac_df.apply(\n",
" lambda x: pdp.is_active(x['DC50 (nM)'], x['Dmax (%)'], pDC50_threshold=pDC50_threshold, Dmax_threshold=Dmax_threshold), axis=1\n",
")\n",
"protac_df['E3 Ligase'] = protac_df['E3 Ligase'].str.replace('Iap', 'IAP')"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Smiles
\n",
"
Uniprot
\n",
"
Cell Line Identifier
\n",
"
E3 Ligase Uniprot
\n",
"
Active
\n",
"
Database
\n",
"
\n",
" \n",
" \n",
" \n",
"
\n",
"
"
],
"text/plain": [
"Empty DataFrame\n",
"Columns: [Smiles, Uniprot, Cell Line Identifier, E3 Ligase Uniprot, Active, Database]\n",
"Index: []"
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Get all entries with same ['Smiles', 'Uniprot', 'Cell Line Identifier', 'E3 Ligase Uniprot'] columns\n",
"tmp = protac_df.dropna(subset=['Smiles', 'Uniprot', 'Cell Line Identifier', 'E3 Ligase Uniprot', 'Active'])[['Smiles', 'Uniprot', 'Cell Line Identifier', 'E3 Ligase Uniprot', 'Active', 'Database']]\n",
"\n",
"# Get entries with duplicates\n",
"duplicates = tmp[tmp.duplicated(subset=['Smiles', 'Uniprot', 'Cell Line Identifier', 'E3 Ligase Uniprot', 'Active'], keep=False)]\n",
"# Sort duplicates, so that they appear close to each other\n",
"duplicates = duplicates.sort_values(['Smiles', 'Uniprot', 'Cell Line Identifier', 'E3 Ligase Uniprot', 'Active'])\n",
"duplicates.to_csv('duplicates.csv', index=False)\n",
"duplicates"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"