{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "264679be-eb4c-405f-8ca5-66d0954d1199", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "import analysis_visualization" ] }, { "cell_type": "code", "execution_count": 2, "id": "ac957981-27af-4793-b4e3-eeaec7d1d108", "metadata": {}, "outputs": [], "source": [ "pnd_file='../data/neuro_pnd.csv'" ] }, { "cell_type": "code", "execution_count": 3, "id": "ea21ec1c-f21c-4a1e-a624-7f0caeec91c6", "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", "
IDgds_idDrugsgsm_idPNDClosest distanceDc_zscoreTreatment
0C0002395GDS2519CHEMBL1618018GSM1534041.5868470.400000-2.555190unknown
1C0002395GDS2519CHEMBL1618018GSM1534071.7080650.400000-2.555190unknown
2C0002395GDS2519CHEMBL1618018GSM1534081.6797370.400000-2.555190unknown
3C0002395GDS2519CHEMBL1618018GSM1534101.7127280.400000-2.555190unknown
4C0002395GDS2519CHEMBL1618018GSM1534111.6158550.400000-2.555190unknown
...........................
115323C0002395GDS810CHEMBL285802GSM212271.6505340.142857-5.294708unknown
115324C0002395GDS810CHEMBL285802GSM212281.7175950.142857-5.294708unknown
115325C0002395GDS810CHEMBL285802GSM212291.6437010.142857-5.294708unknown
115326C0002395GDS810CHEMBL285802GSM212301.6031600.142857-5.294708unknown
115327C0002395GDS810CHEMBL285802GSM212331.7050010.142857-5.294708unknown
\n", "

115328 rows × 8 columns

\n", "
" ], "text/plain": [ " ID gds_id Drugs gsm_id PND \\\n", "0 C0002395 GDS2519 CHEMBL1618018 GSM153404 1.586847 \n", "1 C0002395 GDS2519 CHEMBL1618018 GSM153407 1.708065 \n", "2 C0002395 GDS2519 CHEMBL1618018 GSM153408 1.679737 \n", "3 C0002395 GDS2519 CHEMBL1618018 GSM153410 1.712728 \n", "4 C0002395 GDS2519 CHEMBL1618018 GSM153411 1.615855 \n", "... ... ... ... ... ... \n", "115323 C0002395 GDS810 CHEMBL285802 GSM21227 1.650534 \n", "115324 C0002395 GDS810 CHEMBL285802 GSM21228 1.717595 \n", "115325 C0002395 GDS810 CHEMBL285802 GSM21229 1.643701 \n", "115326 C0002395 GDS810 CHEMBL285802 GSM21230 1.603160 \n", "115327 C0002395 GDS810 CHEMBL285802 GSM21233 1.705001 \n", "\n", " Closest distance Dc_zscore Treatment \n", "0 0.400000 -2.555190 unknown \n", "1 0.400000 -2.555190 unknown \n", "2 0.400000 -2.555190 unknown \n", "3 0.400000 -2.555190 unknown \n", "4 0.400000 -2.555190 unknown \n", "... ... ... ... \n", "115323 0.142857 -5.294708 unknown \n", "115324 0.142857 -5.294708 unknown \n", "115325 0.142857 -5.294708 unknown \n", "115326 0.142857 -5.294708 unknown \n", "115327 0.142857 -5.294708 unknown \n", "\n", "[115328 rows x 8 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "neuro_pnd=pd.read_csv(pnd_file)\n", "neuro_pnd" ] }, { "cell_type": "code", "execution_count": 4, "id": "b239262a-ed3a-4d41-99e8-9bb1a0f71be1", "metadata": {}, "outputs": [], "source": [ "filtered_pnd=analysis_visualization.filter_cd_zscore(neuro_pnd)" ] }, { "cell_type": "code", "execution_count": 5, "id": "c384c129-22d5-4165-9ea0-e2a35261460a", "metadata": {}, "outputs": [], "source": [ "# Filter drugs to include only those with a PND smaller than the first quartile (Q1) PND of the known treatments\n", "drugs_with_disease = neuro_pnd[(neuro_pnd['Treatment'] == 'yes')]\n", "q1 = drugs_with_disease['PND'].quantile(0.25)\n", "final_unknown =filtered_pnd[(filtered_pnd['PND'] <= q1)]" ] }, { "cell_type": "code", "execution_count": 6, "id": "ebe8d784-38cf-411b-a1c6-e414a23754bd", "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", "
IDgds_idDrugsgsm_idPNDClosest distanceDc_zscoreTreatment
216C0002395GDS2519CHEMBL279516GSM1534110.0000000.000000-2.064742unknown
242C0002395GDS2519CHEMBL279516GSM1534540.0000000.000000-2.064742unknown
251C0002395GDS2519CHEMBL279516GSM1534900.0000000.000000-2.064742unknown
256C0002395GDS2519CHEMBL279516GSM1534950.0000000.000000-2.064742unknown
259C0002395GDS2519CHEMBL279516GSM1535020.0000000.000000-2.064742unknown
...........................
115278C0002395GDS2795CHEMBL285802GSM1075351.4658460.142857-5.294708unknown
115295C0002395GDS4136CHEMBL285802GSM6973271.4908890.142857-5.294708unknown
115303C0002395GDS4136CHEMBL285802GSM6973351.4605560.142857-5.294708unknown
115308C0002395GDS810CHEMBL285802GSM212051.4849090.142857-5.294708unknown
115310C0002395GDS810CHEMBL285802GSM212071.3887280.142857-5.294708unknown
\n", "

18396 rows × 8 columns

\n", "
" ], "text/plain": [ " ID gds_id Drugs gsm_id PND \\\n", "216 C0002395 GDS2519 CHEMBL279516 GSM153411 0.000000 \n", "242 C0002395 GDS2519 CHEMBL279516 GSM153454 0.000000 \n", "251 C0002395 GDS2519 CHEMBL279516 GSM153490 0.000000 \n", "256 C0002395 GDS2519 CHEMBL279516 GSM153495 0.000000 \n", "259 C0002395 GDS2519 CHEMBL279516 GSM153502 0.000000 \n", "... ... ... ... ... ... \n", "115278 C0002395 GDS2795 CHEMBL285802 GSM107535 1.465846 \n", "115295 C0002395 GDS4136 CHEMBL285802 GSM697327 1.490889 \n", "115303 C0002395 GDS4136 CHEMBL285802 GSM697335 1.460556 \n", "115308 C0002395 GDS810 CHEMBL285802 GSM21205 1.484909 \n", "115310 C0002395 GDS810 CHEMBL285802 GSM21207 1.388728 \n", "\n", " Closest distance Dc_zscore Treatment \n", "216 0.000000 -2.064742 unknown \n", "242 0.000000 -2.064742 unknown \n", "251 0.000000 -2.064742 unknown \n", "256 0.000000 -2.064742 unknown \n", "259 0.000000 -2.064742 unknown \n", "... ... ... ... \n", "115278 0.142857 -5.294708 unknown \n", "115295 0.142857 -5.294708 unknown \n", "115303 0.142857 -5.294708 unknown \n", "115308 0.142857 -5.294708 unknown \n", "115310 0.142857 -5.294708 unknown \n", "\n", "[18396 rows x 8 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_unknown" ] }, { "cell_type": "code", "execution_count": 7, "id": "2484028a-753f-478a-94bb-2cf0f8ea03d5", "metadata": {}, "outputs": [ { "data": { "image/png": "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k5NT5FhOTo527drl4kQA4HyVYkuBq0lOTi50rGvXrvr2229LfF3//v3Vv3//skYDAAAAAABOdLUtA9hSAIAnsHyFKwAAAAAA8A5NmzYt9kaqNptNTZs2dXEiAHA+ClcAAAAAAOAShmEoNDS0yLFatWqxwhWAR6BwBQAAAAAALnH06FH99ttvRY4dPHhQR48edXEiAHA+ClcAAAAAAOASISEhqlq1apFjVatWVUhIiIsTAYDzUbgCAAAAAACXOHbsmM6fP1/k2Pnz53Xs2DEXJwIA56NwBQAAAAAALsEKVwDegMIVAAAAAAC4BCtcAXgDClcAAAAAAOASNWvWlI9P0VWEj4+Patas6eJEAOB8FK4AAAAAAMAl9uzZo/z8/CLH8vPztWfPHhcnAgDno3AFAAAAAAAuUb169XKNA4A7oHAFAAAAAAAuUdx2AqUdBwB3wN9kAAAAAADAJa62Ryt7uALwBBSuAAAAQAVITExU+/btVa1aNYWGhuree+/V3r17S3zNhg0bZBhGoQd7GgLwFN988025xgHAHVC4AgAAABVg48aNGjlypL7++mutWbNGubm56tWrl86dO3fV1+7du1fp6en2R8OGDV2QGAAqXocOHco1DgDuoIrVAQAAAABPtGrVqgLP58+fr9DQUG3btk1dunQp8bWhoaG67rrrKjAdAFjjp59+uup4s2bNXJQGACoGK1wBAAAAFzh9+rQkqUaNGled27p1a4WHhysmJkbr168vcW52drYyMzMLPACgsmrcuHGxN8by8fFR48aNXZwIAJyPwhUAAACoYKZpKi4uTp06dVLz5s2LnRceHq633npLKSkpWrp0qRo1aqSYmBht2rSp2NckJiYqODjY/oiIiKiItwAATnH8+HHl5+cXOZafn6/jx4+7OBEAOB9bCgAAAAAV7Mknn9R3332nL7/8ssR5jRo1UqNGjezPo6OjdfDgQU2fPr3YbQji4+MVFxdnf56ZmUnpCqDSCg0NVaNGjYq8iWDjxo0VGhpqQSoAcC5WuAIAAAAVaNSoUfr000+1fv161alTx+HXR0VFad++fcWO+/v7KygoqMADACorwzDUrVu3Ise6desmwzBcGwgAKgCFKwAAAFABTNPUk08+qaVLl+rf//636tevX6bzbN++XeHh4U5OBwDWME1TGzZsKHJs/fr1Mk3TtYEAoAKwpQAA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wQcfaNITExNVr1691IEDBzTp2dnZClAFBQVm62hsbFT19fUqKytLWVtbq5qaGuOyKVOmKC8vL5N1Tp06pQA1cuRI1djYaEz/3e9+pwAVERGhyb9o0SIFqP/85z9KKaUqKyuVjY2NWrBggSZfbW2t8vDwUNOnT9fsA0Bt27ZNk9dgMKihQ4cav1+8eFEBatWqVWa3U3QdWVlZClCbNm1SSjX1CycnJzVhwgSTvDf/zUtLSxWgSktLW61j1apVytywm56ergB16tQpY5qXl5fS6XSqoqLCmFZXV6dcXV3VvHnzTNY9cOCAKi4uVr1791bR0dGqrq5OU0db+/SmTZvM5ktKSlKAKioqUkopdeLECQWorKwspZRSZWVlClDLli1TgwcPNq4XGhqqxo8fb9Le+fPna8pPTk5WgKqqqjK/87qo5u0196mvrzeOa+np6Sbr3NgfWhoX3377bQWo7du3a9IPHDigALVhwwZjmpeXl7K2tlb//Oc/NXnnzZunnJycNH1NKaVefvllBahjx44ppZTauHGjAlRubq4m39y5c022wRzp/x3v/zdub7NLly4pvV6vDAaDJm9lZaWyt7dXMTExJvshLS2t1Xpaq+9m/fv3V8OHDzd+b/47nzt3TtXX16tLly6pbdu2KUdHRzVjxow21StER0gcK3FsTyRxbJPv+jze1Ugc+y3p/xLH3k4cK1e4ijbr06cPkydP1qTl5eXh6+tLQECA5oxXWFiYydsuDx06REREBG5ublhbW2Nra0tcXByNjY0cP368ze0wGAz06vVt1x0+fDgAU6ZM0eRrTq+srARg165dNDQ0EBcXp2mrTqdj0qRJJm/mtLKyYurUqZo0f39/Kioq2txW0XWkpqai1+t58sknAXBycuLxxx9n7969JmfW7pSAgAAGDRpk/K7T6bj33nvN9sHMzEwMBgMJCQls27YNnU5nkqctfXr37t04OjoSHR2tydd8y8cHH3wAwJAhQ/D29qakpASA4uJi/Pz8iI2N5dSpU5w8eZLr169TVlZm9kHkERERJu0Auu3vKysriwMHDmg+NjYdf4x6Xl4ed911F1OnTtWMawEBAXh4eJiMa/7+/iZnZvPy8ggKCsLT01NTxiOPPALARx99BEBpaSnOzs4mf7uYmJgOb4c50v/bpry8nLq6OpPbgO+55x4mT55sbPONpk2b1u56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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "analysis_visualization.rep_pnd(neuro_pnd,final_unknown)" ] }, { "cell_type": "code", "execution_count": 9, "id": "61a54819-352c-4fe4-85fe-27dd2428ae88", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['CHEMBL282575', 'CHEMBL411', 'CHEMBL941', 'CHEMBL1336']" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Remove rows from `final_unknown` where 'Closest distance' is zero because it is not meaningful\n", "final_unknown = final_unknown[final_unknown['Closest distance'] != 0]\n", "\n", "# Sort the remaining rows of `final_unknown` by 'PND' in ascending order.\n", "sorted_df = final_unknown.sort_values(by='PND')\n", "\n", "# Extract the distinct drugs with the lowest PND values.\n", "#We use `drop_duplicates` to keep only the first occurrence of each drug and `head(4)` to get the top 4 drugs.\n", "#These are the drugs with the lowest PND values after excluding those with a 'Closest distance' of zero.\n", "lowest_pnd_drugs = sorted_df.drop_duplicates(subset='Drugs').head(4)\n", "\n", "# Convert the DataFrame of the lowest PND drugs into a list of drug names.\n", "lowest_pnd_drugs = lowest_pnd_drugs['Drugs'].tolist()\n", "\n", "# Output the list of drugs with the lowest PND values.\n", "lowest_pnd_drugs" ] }, { "cell_type": "code", "execution_count": 10, "id": "add762ec-ec0e-4f77-bedf-3133d494947f", "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", "
IDgds_idDrugsgsm_idPNDClosest distanceDc_zscoreTreatment
55102C0002395GDS810CHEMBL282575GSM212071.0378170.333333-0.668762unknown
55095C0002395GDS4136CHEMBL282575GSM6973351.0885670.333333-0.668762unknown
55065C0002395GDS2795CHEMBL282575GSM1075251.0954170.333333-0.668762unknown
41428C0002395GDS810CHEMBL411GSM212071.0488970.250000-1.602619unknown
41421C0002395GDS4136CHEMBL411GSM6973351.1038970.250000-1.602619unknown
41391C0002395GDS2795CHEMBL411GSM1075251.1068980.250000-1.602619unknown
54466C0002395GDS810CHEMBL941GSM212071.1745580.250000-3.851931unknown
54429C0002395GDS2795CHEMBL941GSM1075251.2305100.250000-3.851931unknown
54459C0002395GDS4136CHEMBL941GSM6973351.2346700.250000-3.851931unknown
6236C0002395GDS810CHEMBL1336GSM212071.1756470.300000-3.897939unknown
6199C0002395GDS2795CHEMBL1336GSM1075251.2267490.300000-3.897939unknown
6198C0002395GDS2795CHEMBL1336GSM1075231.2324940.300000-3.897939unknown
\n", "
" ], "text/plain": [ " ID gds_id Drugs gsm_id PND Closest distance \\\n", "55102 C0002395 GDS810 CHEMBL282575 GSM21207 1.037817 0.333333 \n", "55095 C0002395 GDS4136 CHEMBL282575 GSM697335 1.088567 0.333333 \n", "55065 C0002395 GDS2795 CHEMBL282575 GSM107525 1.095417 0.333333 \n", "41428 C0002395 GDS810 CHEMBL411 GSM21207 1.048897 0.250000 \n", "41421 C0002395 GDS4136 CHEMBL411 GSM697335 1.103897 0.250000 \n", "41391 C0002395 GDS2795 CHEMBL411 GSM107525 1.106898 0.250000 \n", "54466 C0002395 GDS810 CHEMBL941 GSM21207 1.174558 0.250000 \n", "54429 C0002395 GDS2795 CHEMBL941 GSM107525 1.230510 0.250000 \n", "54459 C0002395 GDS4136 CHEMBL941 GSM697335 1.234670 0.250000 \n", "6236 C0002395 GDS810 CHEMBL1336 GSM21207 1.175647 0.300000 \n", "6199 C0002395 GDS2795 CHEMBL1336 GSM107525 1.226749 0.300000 \n", "6198 C0002395 GDS2795 CHEMBL1336 GSM107523 1.232494 0.300000 \n", "\n", " Dc_zscore Treatment \n", "55102 -0.668762 unknown \n", "55095 -0.668762 unknown \n", "55065 -0.668762 unknown \n", "41428 -1.602619 unknown \n", "41421 -1.602619 unknown \n", "41391 -1.602619 unknown \n", "54466 -3.851931 unknown \n", "54429 -3.851931 unknown \n", "54459 -3.851931 unknown \n", "6236 -3.897939 unknown \n", "6199 -3.897939 unknown \n", "6198 -3.897939 unknown " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Get 3 different gsm_id for the given list of drugs with the lowest PND values\n", "gsm_df = analysis_visualization.get_gsm_ids_for_lowest_pnd_drugs(final_unknown, lowest_pnd_drugs, num_gsm=3)\n", "gsm_df" ] }, { "cell_type": "code", "execution_count": 16, "id": "d5359374-e494-4376-9199-9315f8ac5a86", "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", "
gds_idgsm_idid_refgene_symbolz_scoresignificantgene_idprotein_idgene_name
0GDS2519GSM153404200096_s_atATP6V0E12.7422o8992O15342ATPase H+ transporting V0 subunit e1
1GDS2519GSM153404200097_s_atHNRNPK2.9833o3190P61978heterogeneous nuclear ribonucleoprotein K
2GDS2519GSM153404200801_x_atACTB6.3641o60P60709actin beta
3GDS2519GSM153404201925_s_atCD553.1947o1604P08174CD55 molecule (Cromer blood group)
4GDS2519GSM153404201998_atST6GAL12.9949o6480P15907ST6 beta-galactoside alpha-2,6-sialyltransfera...
..............................
16082GDS810GSM21233211000_s_atIL6ST2.6804o3572P40189interleukin 6 signal transducer
16083GDS810GSM21233211587_x_atCHRNA33.0666o1136P32297cholinergic receptor nicotinic alpha 3 subunit
16084GDS810GSM21233211813_x_atDCN3.0475o1634P07585decorin
16085GDS810GSM21233213603_s_atRAC22.6776o5880P15153Rac family small GTPase 2
16086GDS810GSM21233215552_s_atESR13.3458o2099P03372estrogen receptor 1
\n", "

16087 rows × 9 columns

\n", "
" ], "text/plain": [ " gds_id gsm_id id_ref gene_symbol z_score significant \\\n", "0 GDS2519 GSM153404 200096_s_at ATP6V0E1 2.7422 o \n", "1 GDS2519 GSM153404 200097_s_at HNRNPK 2.9833 o \n", "2 GDS2519 GSM153404 200801_x_at ACTB 6.3641 o \n", "3 GDS2519 GSM153404 201925_s_at CD55 3.1947 o \n", "4 GDS2519 GSM153404 201998_at ST6GAL1 2.9949 o \n", "... ... ... ... ... ... ... \n", "16082 GDS810 GSM21233 211000_s_at IL6ST 2.6804 o \n", "16083 GDS810 GSM21233 211587_x_at CHRNA3 3.0666 o \n", "16084 GDS810 GSM21233 211813_x_at DCN 3.0475 o \n", "16085 GDS810 GSM21233 213603_s_at RAC2 2.6776 o \n", "16086 GDS810 GSM21233 215552_s_at ESR1 3.3458 o \n", "\n", " gene_id protein_id gene_name \n", "0 8992 O15342 ATPase H+ transporting V0 subunit e1 \n", "1 3190 P61978 heterogeneous nuclear ribonucleoprotein K \n", "2 60 P60709 actin beta \n", "3 1604 P08174 CD55 molecule (Cromer blood group) \n", "4 6480 P15907 ST6 beta-galactoside alpha-2,6-sialyltransfera... \n", "... ... ... ... \n", "16082 3572 P40189 interleukin 6 signal transducer \n", "16083 1136 P32297 cholinergic receptor nicotinic alpha 3 subunit \n", "16084 1634 P07585 decorin \n", "16085 5880 P15153 Rac family small GTPase 2 \n", "16086 2099 P03372 estrogen receptor 1 \n", "\n", "[16087 rows x 9 columns]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#read the file containing PEEPs data\n", "peep_file='../data/genes_gds_alzheimer_filtered_dup.csv'\n", "peeps=pd.read_csv(peep_file)\n", "peeps" ] }, { "cell_type": "code", "execution_count": 29, "id": "1677a3b1-abb7-47c0-bfbf-dbeefff0c734", "metadata": {}, "outputs": [], "source": [ "#create an empty dataframe to store the final results\n", "final_df = pd.DataFrame()\n", "\n", "# Iterate through each unique drug in the 'Drugs' column of gsm_df\n", "for drug in gsm_df['Drugs'].unique():\n", " # Get the gsm_id values for the current drug\n", " gsm_ids = gsm_df[gsm_df['Drugs'] == drug]['gsm_id'].unique()\n", " \n", " # Filter the peeps dataframe to include only rows with the selected gsm_id values\n", " filtered_peeps = peeps[peeps['gsm_id'].isin(gsm_ids)]\n", " \n", " #Find the gene symbols that are present in all the gsm_id values for the current drug\n", " gene_counts = filtered_peeps['gene_symbol'].value_counts()\n", " common_genes = gene_counts[gene_counts == len(gsm_ids)].index\n", " \n", " # Filter the dataframe to include only the common genes\n", " common_genes_df = filtered_peeps[filtered_peeps['gene_symbol'].isin(common_genes)]\n", " \n", " # Check if the 'significant' column has the same value for each gene_symbol across all gsm_id values\n", " significant_genes = common_genes_df.groupby('gene_symbol').filter(lambda x: x['significant'].nunique() == 1)\n", " \n", " # Add drug and PND information to the significant_genes dataframe\n", " for gsm_id in gsm_ids:\n", " gsm_info = gsm_df[gsm_df['gsm_id'] == gsm_id][['gds_id', 'gsm_id', 'PND']].iloc[0]\n", " subset = significant_genes[significant_genes['gsm_id'] == gsm_id].copy()\n", " subset['Drugs'] = drug\n", " subset['PND'] = gsm_info['PND']\n", " \n", " # Append the results to the final dataframe\n", " final_df = pd.concat([final_df, subset])\n", "\n", "desired_columns = ['Drugs', 'gds_id', 'gsm_id', 'gene_symbol', 'gene_id', 'PND'] + [col for col in peeps.columns if col not in ['gds_id', 'gsm_id', 'gene_symbol', 'gene_id']]\n", "final_df = final_df[desired_columns]\n", "# Reset the index of the final dataframe\n", "final_df.reset_index(drop=True, inplace=True)" ] }, { "cell_type": "code", "execution_count": 81, "id": "741f9ffa-37de-47d0-8ba7-4fa12d859a2e", "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", "
Drugsgds_idgsm_idgene_symbolgene_idPNDid_refz_scoresignificantprotein_idgene_name
0CHEMBL282575GDS810GSM21207MMP1443231.037817160020_at4.7079oP50281matrix metallopeptidase 14
1CHEMBL282575GDS810GSM21207DNM217851.037817202253_s_at3.6879oP50570dynamin 2
2CHEMBL282575GDS810GSM21207BMP16491.037817202701_at5.1284oP13497bone morphogenetic protein 1
3CHEMBL282575GDS810GSM21207PTPN157701.037817202716_at3.4236oP18031protein tyrosine phosphatase non-receptor type 1
4CHEMBL282575GDS810GSM21207IGF1R34801.037817203628_at5.6898oP08069insulin like growth factor 1 receptor
....................................
400CHEMBL1336GDS2795GSM107523IL23A515611.232494220054_at3.9142oQ9NPF7interleukin 23 subunit alpha
401CHEMBL1336GDS2795GSM107523MELTF42411.232494223723_at5.2922oP08582melanotransferrin
402CHEMBL1336GDS2795GSM107523ARRB14081.232494228444_at13.8469oP49407arrestin beta 1
403CHEMBL1336GDS2795GSM107523MBP41551.232494228938_at7.3370oP02686myelin basic protein
404CHEMBL1336GDS2795GSM107523PPARA54651.232494237142_at4.4084oQ07869peroxisome proliferator activated receptor alpha
\n", "

405 rows × 11 columns

\n", "
" ], "text/plain": [ " Drugs gds_id gsm_id gene_symbol gene_id PND \\\n", "0 CHEMBL282575 GDS810 GSM21207 MMP14 4323 1.037817 \n", "1 CHEMBL282575 GDS810 GSM21207 DNM2 1785 1.037817 \n", "2 CHEMBL282575 GDS810 GSM21207 BMP1 649 1.037817 \n", "3 CHEMBL282575 GDS810 GSM21207 PTPN1 5770 1.037817 \n", "4 CHEMBL282575 GDS810 GSM21207 IGF1R 3480 1.037817 \n", ".. ... ... ... ... ... ... \n", "400 CHEMBL1336 GDS2795 GSM107523 IL23A 51561 1.232494 \n", "401 CHEMBL1336 GDS2795 GSM107523 MELTF 4241 1.232494 \n", "402 CHEMBL1336 GDS2795 GSM107523 ARRB1 408 1.232494 \n", "403 CHEMBL1336 GDS2795 GSM107523 MBP 4155 1.232494 \n", "404 CHEMBL1336 GDS2795 GSM107523 PPARA 5465 1.232494 \n", "\n", " id_ref z_score significant protein_id \\\n", "0 160020_at 4.7079 o P50281 \n", "1 202253_s_at 3.6879 o P50570 \n", "2 202701_at 5.1284 o P13497 \n", "3 202716_at 3.4236 o P18031 \n", "4 203628_at 5.6898 o P08069 \n", ".. ... ... ... ... \n", "400 220054_at 3.9142 o Q9NPF7 \n", "401 223723_at 5.2922 o P08582 \n", "402 228444_at 13.8469 o P49407 \n", "403 228938_at 7.3370 o P02686 \n", "404 237142_at 4.4084 o Q07869 \n", "\n", " gene_name \n", "0 matrix metallopeptidase 14 \n", "1 dynamin 2 \n", "2 bone morphogenetic protein 1 \n", "3 protein tyrosine phosphatase non-receptor type 1 \n", "4 insulin like growth factor 1 receptor \n", ".. ... \n", "400 interleukin 23 subunit alpha \n", "401 melanotransferrin \n", "402 arrestin beta 1 \n", "403 myelin basic protein \n", "404 peroxisome proliferator activated receptor alpha \n", "\n", "[405 rows x 11 columns]" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_df" ] }, { "cell_type": "code", "execution_count": 57, "id": "80bf697e-bd65-4a34-9814-afcf499afa5f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Drugs\n", "CHEMBL1336 51\n", "CHEMBL282575 28\n", "CHEMBL411 28\n", "CHEMBL941 28\n", "Name: gene_symbol, dtype: int64" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "unique_gene_symbols = final_df.groupby('Drugs')['gene_symbol'].unique()\n", "\n", "# Get the number of different gene symbols related to each drug\n", "lengths_unique_gene_symbols = unique_gene_symbols.apply(len)\n", "lengths_unique_gene_symbols" ] }, { "cell_type": "code", "execution_count": 36, "id": "38e5ae77-39e7-4888-86a5-51ed6f0cc614", "metadata": {}, "outputs": [], "source": [ "#Read the file containing the pathways and relation bewteen genes and pathways\n", "gen_pat=pd.read_csv('../data/data_00_raw_data_links_gen_pat.tsv',sep='\\t')\n", "pat=pd.read_csv('../data/data_00_raw_data_nodes_pat.tsv',sep='\\t')" ] }, { "cell_type": "code", "execution_count": 78, "id": "a9cd8524-a040-4e4b-b3b0-4f74ea722d73", "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", "
Drugsgds_idgsm_idgene_symbolgene_idPNDid_refz_scoresignificantprotein_idgene_namepathway_idpathway_name
0CHEMBL282575GDS810GSM21207MMP1443231.037817160020_at4.7079oP50281matrix metallopeptidase 14WP4754IL18 signaling
1CHEMBL282575GDS810GSM21207MMP1443231.037817160020_at4.7079oP50281matrix metallopeptidase 14WP5283Chronic hyperglycemia impairment of neuron fun...
2CHEMBL282575GDS810GSM21207MMP1443231.037817160020_at4.7079oP50281matrix metallopeptidase 14WP2324AGE/RAGE pathway
3CHEMBL282575GDS810GSM21207MMP1443231.037817160020_at4.7079oP50281matrix metallopeptidase 14WP129Matrix metalloproteinases
4CHEMBL282575GDS810GSM21207MMP1443231.037817160020_at4.7079oP50281matrix metallopeptidase 14WP3888VEGFA-VEGFR2 signaling
..........................................
1363CHEMBL1336GDS2795GSM107523PPARA54651.232494237142_at4.4084oQ07869peroxisome proliferator activated receptor alphaWP299Nuclear receptors in lipid metabolism and toxi...
1364CHEMBL1336GDS2795GSM107523PPARA54651.232494237142_at4.4084oQ07869peroxisome proliferator activated receptor alphaWP236Adipogenesis
1365CHEMBL1336GDS2795GSM107523PPARA54651.232494237142_at4.4084oQ07869peroxisome proliferator activated receptor alphaWP170Nuclear receptors
1366CHEMBL1336GDS2795GSM107523PPARA54651.232494237142_at4.4084oQ07869peroxisome proliferator activated receptor alphaWP1541Energy metabolism
1367CHEMBL1336GDS2795GSM107523PPARA54651.232494237142_at4.4084oQ07869peroxisome proliferator activated receptor alphaWP4396Nonalcoholic fatty liver disease
\n", "

1368 rows × 13 columns

\n", "
" ], "text/plain": [ " Drugs gds_id gsm_id gene_symbol gene_id PND \\\n", "0 CHEMBL282575 GDS810 GSM21207 MMP14 4323 1.037817 \n", "1 CHEMBL282575 GDS810 GSM21207 MMP14 4323 1.037817 \n", "2 CHEMBL282575 GDS810 GSM21207 MMP14 4323 1.037817 \n", "3 CHEMBL282575 GDS810 GSM21207 MMP14 4323 1.037817 \n", "4 CHEMBL282575 GDS810 GSM21207 MMP14 4323 1.037817 \n", "... ... ... ... ... ... ... \n", "1363 CHEMBL1336 GDS2795 GSM107523 PPARA 5465 1.232494 \n", "1364 CHEMBL1336 GDS2795 GSM107523 PPARA 5465 1.232494 \n", "1365 CHEMBL1336 GDS2795 GSM107523 PPARA 5465 1.232494 \n", "1366 CHEMBL1336 GDS2795 GSM107523 PPARA 5465 1.232494 \n", "1367 CHEMBL1336 GDS2795 GSM107523 PPARA 5465 1.232494 \n", "\n", " id_ref z_score significant protein_id \\\n", "0 160020_at 4.7079 o P50281 \n", "1 160020_at 4.7079 o P50281 \n", "2 160020_at 4.7079 o P50281 \n", "3 160020_at 4.7079 o P50281 \n", "4 160020_at 4.7079 o P50281 \n", "... ... ... ... ... \n", "1363 237142_at 4.4084 o Q07869 \n", "1364 237142_at 4.4084 o Q07869 \n", "1365 237142_at 4.4084 o Q07869 \n", "1366 237142_at 4.4084 o Q07869 \n", "1367 237142_at 4.4084 o Q07869 \n", "\n", " gene_name pathway_id \\\n", "0 matrix metallopeptidase 14 WP4754 \n", "1 matrix metallopeptidase 14 WP5283 \n", "2 matrix metallopeptidase 14 WP2324 \n", "3 matrix metallopeptidase 14 WP129 \n", "4 matrix metallopeptidase 14 WP3888 \n", "... ... ... \n", "1363 peroxisome proliferator activated receptor alpha WP299 \n", "1364 peroxisome proliferator activated receptor alpha WP236 \n", "1365 peroxisome proliferator activated receptor alpha WP170 \n", "1366 peroxisome proliferator activated receptor alpha WP1541 \n", "1367 peroxisome proliferator activated receptor alpha WP4396 \n", "\n", " pathway_name \n", "0 IL18 signaling \n", "1 Chronic hyperglycemia impairment of neuron fun... \n", "2 AGE/RAGE pathway \n", "3 Matrix metalloproteinases \n", "4 VEGFA-VEGFR2 signaling \n", "... ... \n", "1363 Nuclear receptors in lipid metabolism and toxi... \n", "1364 Adipogenesis \n", "1365 Nuclear receptors \n", "1366 Energy metabolism \n", "1367 Nonalcoholic fatty liver disease \n", "\n", "[1368 rows x 13 columns]" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Step 1: Convert pathway_id in gen_pat and pat dataframes to string type\n", "gen_pat['pathway_id'] = gen_pat['pathway_id'].astype(str)\n", "pat['pathway_id'] = pat['pathway_id'].astype(str)\n", "\n", "#Step 2: Rename columns in the pat dataframe\n", "pat.rename(columns={'id': 'pathway_id', 'name': 'pathway_name'}, inplace=True)\n", "\n", "#Step 3: Merge gen_pat with pat to get the complete pathway information\n", "gen_pat_combined = pd.merge(gen_pat, pat, on='pathway_id', how='left')\n", "\n", "#Step 4: Convert gene_id in final_df to string type if necessary\n", "final_df['gene_id'] = final_df['gene_id'].astype(str)\n", "\n", "#Step 5: Merge gen_pat_combined with final_df using gene_id to get pathway_id and pathway_name for each gene_id\n", "final_df_with_pathways = pd.merge(final_df, gen_pat_combined, on='gene_id', how='left')\n", "final_df_with_pathways" ] }, { "cell_type": "code", "execution_count": 52, "id": "1a510926-01b2-4f79-bc61-85b62d334314", "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", "
Drugsgds_idgsm_idgene_symbolgene_idPNDid_refz_scoresignificantprotein_idgene_namepathway_idpathway_name
0CHEMBL282575GDS810GSM21207MMP1443231.037817160020_at4.7079oP50281matrix metallopeptidase 14WP4754IL18 signaling
1CHEMBL282575GDS810GSM21207MMP1443231.037817160020_at4.7079oP50281matrix metallopeptidase 14WP5283Chronic hyperglycemia impairment of neuron fun...
2CHEMBL282575GDS810GSM21207MMP1443231.037817160020_at4.7079oP50281matrix metallopeptidase 14WP2324AGE/RAGE pathway
3CHEMBL282575GDS810GSM21207MMP1443231.037817160020_at4.7079oP50281matrix metallopeptidase 14WP129Matrix metalloproteinases
4CHEMBL282575GDS810GSM21207MMP1443231.037817160020_at4.7079oP50281matrix metallopeptidase 14WP3888VEGFA-VEGFR2 signaling
..........................................
1363CHEMBL1336GDS2795GSM107523PPARA54651.232494237142_at4.4084oQ07869peroxisome proliferator activated receptor alphaWP299Nuclear receptors in lipid metabolism and toxi...
1364CHEMBL1336GDS2795GSM107523PPARA54651.232494237142_at4.4084oQ07869peroxisome proliferator activated receptor alphaWP236Adipogenesis
1365CHEMBL1336GDS2795GSM107523PPARA54651.232494237142_at4.4084oQ07869peroxisome proliferator activated receptor alphaWP170Nuclear receptors
1366CHEMBL1336GDS2795GSM107523PPARA54651.232494237142_at4.4084oQ07869peroxisome proliferator activated receptor alphaWP1541Energy metabolism
1367CHEMBL1336GDS2795GSM107523PPARA54651.232494237142_at4.4084oQ07869peroxisome proliferator activated receptor alphaWP4396Nonalcoholic fatty liver disease
\n", "

1164 rows × 13 columns

\n", "
" ], "text/plain": [ " Drugs gds_id gsm_id gene_symbol gene_id PND \\\n", "0 CHEMBL282575 GDS810 GSM21207 MMP14 4323 1.037817 \n", "1 CHEMBL282575 GDS810 GSM21207 MMP14 4323 1.037817 \n", "2 CHEMBL282575 GDS810 GSM21207 MMP14 4323 1.037817 \n", "3 CHEMBL282575 GDS810 GSM21207 MMP14 4323 1.037817 \n", "4 CHEMBL282575 GDS810 GSM21207 MMP14 4323 1.037817 \n", "... ... ... ... ... ... ... \n", "1363 CHEMBL1336 GDS2795 GSM107523 PPARA 5465 1.232494 \n", "1364 CHEMBL1336 GDS2795 GSM107523 PPARA 5465 1.232494 \n", "1365 CHEMBL1336 GDS2795 GSM107523 PPARA 5465 1.232494 \n", "1366 CHEMBL1336 GDS2795 GSM107523 PPARA 5465 1.232494 \n", "1367 CHEMBL1336 GDS2795 GSM107523 PPARA 5465 1.232494 \n", "\n", " id_ref z_score significant protein_id \\\n", "0 160020_at 4.7079 o P50281 \n", "1 160020_at 4.7079 o P50281 \n", "2 160020_at 4.7079 o P50281 \n", "3 160020_at 4.7079 o P50281 \n", "4 160020_at 4.7079 o P50281 \n", "... ... ... ... ... \n", "1363 237142_at 4.4084 o Q07869 \n", "1364 237142_at 4.4084 o Q07869 \n", "1365 237142_at 4.4084 o Q07869 \n", "1366 237142_at 4.4084 o Q07869 \n", "1367 237142_at 4.4084 o Q07869 \n", "\n", " gene_name pathway_id \\\n", "0 matrix metallopeptidase 14 WP4754 \n", "1 matrix metallopeptidase 14 WP5283 \n", "2 matrix metallopeptidase 14 WP2324 \n", "3 matrix metallopeptidase 14 WP129 \n", "4 matrix metallopeptidase 14 WP3888 \n", "... ... ... \n", "1363 peroxisome proliferator activated receptor alpha WP299 \n", "1364 peroxisome proliferator activated receptor alpha WP236 \n", "1365 peroxisome proliferator activated receptor alpha WP170 \n", "1366 peroxisome proliferator activated receptor alpha WP1541 \n", "1367 peroxisome proliferator activated receptor alpha WP4396 \n", "\n", " pathway_name \n", "0 IL18 signaling \n", "1 Chronic hyperglycemia impairment of neuron fun... \n", "2 AGE/RAGE pathway \n", "3 Matrix metalloproteinases \n", "4 VEGFA-VEGFR2 signaling \n", "... ... \n", "1363 Nuclear receptors in lipid metabolism and toxi... \n", "1364 Adipogenesis \n", "1365 Nuclear receptors \n", "1366 Energy metabolism \n", "1367 Nonalcoholic fatty liver disease \n", "\n", "[1164 rows x 13 columns]" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Filter by the ones without known pathways\n", "final_df_with_pathways_filt=final_df_with_pathways.dropna(subset=['pathway_id'])\n", "final_df_with_pathways_filt" ] }, { "cell_type": "code", "execution_count": 76, "id": "c8793f13-7d45-4201-aed1-d65a60cb8070", "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", "
Drugsgsm_idgene_symbolgds_idpathway_idpathway_namesignificant
0CHEMBL1336GSM107523ARRB1GDS2795WP382MAPK signalingo
1CHEMBL1336GSM107523AVPR2GDS2795WP24Peptide GPCRso
2CHEMBL1336GSM107523BCL2L11GDS2795WP673ErbB signalingo
3CHEMBL1336GSM107523BMP1GDS2795WP236Adipogenesiso
4CHEMBL1336GSM107523CASP2GDS2795WP254Apoptosiso
........................
170CHEMBL941GSM107525NOS1GDS2795WP2447Amyotrophic lateral sclerosis (ALS)o
171CHEMBL941GSM107525PPARAGDS2795WP299Nuclear receptors in lipid metabolism and toxi...o
172CHEMBL941GSM107525PTPN1GDS2795WP2037Prolactin signalingo
173CHEMBL941GSM107525SIRT3GDS2795WP1541Energy metabolismo
174CHEMBL941GSM107525TBX2GDS2795WP304Kit receptor signalingo
\n", "

67 rows × 7 columns

\n", "
" ], "text/plain": [ " Drugs gsm_id gene_symbol gds_id pathway_id \\\n", "0 CHEMBL1336 GSM107523 ARRB1 GDS2795 WP382 \n", "1 CHEMBL1336 GSM107523 AVPR2 GDS2795 WP24 \n", "2 CHEMBL1336 GSM107523 BCL2L11 GDS2795 WP673 \n", "3 CHEMBL1336 GSM107523 BMP1 GDS2795 WP236 \n", "4 CHEMBL1336 GSM107523 CASP2 GDS2795 WP254 \n", ".. ... ... ... ... ... \n", "170 CHEMBL941 GSM107525 NOS1 GDS2795 WP2447 \n", "171 CHEMBL941 GSM107525 PPARA GDS2795 WP299 \n", "172 CHEMBL941 GSM107525 PTPN1 GDS2795 WP2037 \n", "173 CHEMBL941 GSM107525 SIRT3 GDS2795 WP1541 \n", "174 CHEMBL941 GSM107525 TBX2 GDS2795 WP304 \n", "\n", " pathway_name significant \n", "0 MAPK signaling o \n", "1 Peptide GPCRs o \n", "2 ErbB signaling o \n", "3 Adipogenesis o \n", "4 Apoptosis o \n", ".. ... ... \n", "170 Amyotrophic lateral sclerosis (ALS) o \n", "171 Nuclear receptors in lipid metabolism and toxi... o \n", "172 Prolactin signaling o \n", "173 Energy metabolism o \n", "174 Kit receptor signaling o \n", "\n", "[67 rows x 7 columns]" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Define the columns to specify the criteria for grouping the data.\n", "group_columns = ['Drugs', 'gsm_id', 'gene_symbol']\n", "\n", "#Group the final_df_with_pathways_filt DataFrame by the specified columns.\n", "#Within each group, select the first occurrence of each combination of 'gds_id', 'pathway_id', 'pathway_name', and 'significant'.\n", "pathways_by_group = final_df_with_pathways_filt.groupby(group_columns)[['gds_id','pathway_id', 'pathway_name','significant']].first().reset_index()\n", "\n", "# Remove duplicate rows from `pathways_by_group` based on the combination of 'Drugs', 'gene_symbol', and 'pathway_id' to ensure that each drug-gene-pathway combination is unique in the filtered DataFrame.\n", "pathways_by_group_filt = pathways_by_group.drop_duplicates(subset=['Drugs','gene_symbol','pathway_id'])\n", "\n", "#Show the filtered DataFrame that now contains unique rows for each combination of 'Drugs', 'gene_symbol', and 'pathway_id'.\n", "pathways_by_group_filt" ] }, { "cell_type": "code", "execution_count": 70, "id": "533769b2-c106-4ce6-b921-cb7f4bc9daec", "metadata": {}, "outputs": [], "source": [ "pathways_by_group_filt.to_csv('../results/dru_gene_pat_final.csv',index=False)" ] }, { "cell_type": "code", "execution_count": 65, "id": "3b6e8181-7060-4591-b4fa-5faeee61d3d5", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Drugs\n", "CHEMBL1336 28\n", "CHEMBL282575 13\n", "CHEMBL411 13\n", "CHEMBL941 13\n", "Name: gene_symbol, dtype: int64" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Group the dataFrame by the Drugs column and for each drug, count the number of different gene symbols associated with it.\n", "unique_gene_symbols_per_drug = pathways_by_group_filt.groupby('Drugs')['gene_symbol'].nunique()\n", "\n", "#Show the count of unique gene symbols for each drug.\n", "unique_gene_symbols_per_drug" ] } ], "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 }