{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":67356,"databundleVersionId":8006601,"sourceType":"competition"}],"dockerImageVersionId":30674,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## Making models for different protein targets","metadata":{}},{"cell_type":"markdown","source":"##### Installing required packages","metadata":{}},{"cell_type":"code","source":"!pip install rdkit\n!pip install duckdb","metadata":{"execution":{"iopub.status.busy":"2024-04-13T18:32:35.348462Z","iopub.execute_input":"2024-04-13T18:32:35.348873Z","iopub.status.idle":"2024-04-13T18:33:04.041582Z","shell.execute_reply.started":"2024-04-13T18:32:35.348843Z","shell.execute_reply":"2024-04-13T18:33:04.039902Z"},"trusted":true},"execution_count":1,"outputs":[{"name":"stdout","text":"Collecting rdkit\n  Downloading rdkit-2023.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.9 kB)\nRequirement already satisfied: numpy in /opt/conda/lib/python3.10/site-packages (from rdkit) (1.26.4)\nRequirement already satisfied: Pillow in /opt/conda/lib/python3.10/site-packages (from rdkit) (9.5.0)\nDownloading rdkit-2023.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (34.4 MB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m34.4/34.4 MB\u001b[0m \u001b[31m39.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m00:01\u001b[0m\n\u001b[?25hInstalling collected packages: rdkit\nSuccessfully installed rdkit-2023.9.5\nCollecting duckdb\n  Downloading duckdb-0.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (763 bytes)\nDownloading duckdb-0.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.1 MB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m18.1/18.1 MB\u001b[0m \u001b[31m67.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m00:01\u001b[0m\n\u001b[?25hInstalling collected packages: duckdb\nSuccessfully installed duckdb-0.10.1\n","output_type":"stream"}]},{"cell_type":"markdown","source":"##### Setting up the dataset","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport duckdb\nfrom rdkit import Chem\nfrom rdkit.Chem import AllChem\nfrom rdkit.Chem.Fingerprints import FingerprintMols\nfrom tqdm import tqdm","metadata":{"execution":{"iopub.status.busy":"2024-04-13T18:33:04.043861Z","iopub.execute_input":"2024-04-13T18:33:04.044237Z","iopub.status.idle":"2024-04-13T18:33:05.545008Z","shell.execute_reply.started":"2024-04-13T18:33:04.044204Z","shell.execute_reply":"2024-04-13T18:33:05.543576Z"},"trusted":true},"execution_count":2,"outputs":[]},{"cell_type":"code","source":"train_path = '/kaggle/input/leash-BELKA/train.parquet'\ntest_path = '/kaggle/input/leash-BELKA/test.parquet'\n\ncon = duckdb.connect()\n\ndf = con.query(f\"\"\"(SELECT id,molecule_smiles,binds\n                        FROM parquet_scan('{train_path}')\n                        WHERE protein_name = 'HSA' AND binds = 0\n                        \n                        \n                        )\"\"\").df()\n\ncon.close()","metadata":{"execution":{"iopub.status.busy":"2024-04-13T18:33:16.536593Z","iopub.execute_input":"2024-04-13T18:33:16.537283Z","iopub.status.idle":"2024-04-13T18:34:40.074814Z","shell.execute_reply.started":"2024-04-13T18:33:16.537238Z","shell.execute_reply":"2024-04-13T18:34:40.07221Z"},"trusted":true},"execution_count":3,"outputs":[{"output_type":"display_data","data":{"text/plain":"FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"72d46996a25348afb996276836d5f5a2"}},"metadata":{}}]},{"cell_type":"code","source":"","metadata":{"execution":{"iopub.status.busy":"2024-04-13T18:27:52.054252Z","iopub.execute_input":"2024-04-13T18:27:52.054595Z","iopub.status.idle":"2024-04-13T18:27:52.064752Z","shell.execute_reply.started":"2024-04-13T18:27:52.054568Z","shell.execute_reply":"2024-04-13T18:27:52.063906Z"},"trusted":true},"execution_count":6,"outputs":[]},{"cell_type":"code","source":"mols = [Chem.MolFromSmiles(smi) for smi in tqdm(df['molecule_smiles'], desc='Converting SMILES to RDKit molecules')]\n","metadata":{"execution":{"iopub.status.busy":"2024-04-13T18:34:40.082784Z","iopub.execute_input":"2024-04-13T18:34:40.083835Z"},"trusted":true},"execution_count":null,"outputs":[{"name":"stderr","text":"Converting SMILES to RDKit molecules:   1%|          | 667799/98007200 [31:27<5607137:54:52, 207.37s/it]","output_type":"stream"}]},{"cell_type":"code","source":"import pickle\nimport os\nsave_path = '/kaggle/working/'\n\n# Pickle dump the mols\nwith open(os.path.join(save_path, 'mols.pkl'), 'wb') as f:\n    pickle.dump(mols, f)\n\nprint(f\"Pickled {len(mols)} molecules to {save_path}mols.pkl\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"get_ipython().kernel.do_shutdown(restart=True)","metadata":{"execution":{"iopub.status.busy":"2024-04-13T13:44:16.151309Z","iopub.execute_input":"2024-04-13T13:44:16.151707Z","iopub.status.idle":"2024-04-13T13:44:16.162733Z","shell.execute_reply.started":"2024-04-13T13:44:16.151674Z","shell.execute_reply":"2024-04-13T13:44:16.161574Z"},"trusted":true},"execution_count":3,"outputs":[{"execution_count":3,"output_type":"execute_result","data":{"text/plain":"{'status': 'ok', 'restart': True}"},"metadata":{}}]},{"cell_type":"code","source":"import cudf\nimport dask.dataframe as dd\nimport pandas as pd\n#import dask_cudf\nfrom rdkit import Chem\n####################################\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-04-13T16:37:25.129413Z","iopub.execute_input":"2024-04-13T16:37:25.129801Z","iopub.status.idle":"2024-04-13T16:37:25.135501Z","shell.execute_reply.started":"2024-04-13T16:37:25.129771Z","shell.execute_reply":"2024-04-13T16:37:25.134397Z"},"trusted":true},"execution_count":6,"outputs":[]},{"cell_type":"code","source":"from dask.distributed import Client\nclient = Client(n_workers=1, threads_per_worker=1, processes=False, memory_limit='16GB', resources={'GPU': 1})\nclient","metadata":{"execution":{"iopub.status.busy":"2024-04-12T14:53:49.105644Z","iopub.execute_input":"2024-04-12T14:53:49.106459Z","iopub.status.idle":"2024-04-12T14:53:49.204736Z","shell.execute_reply.started":"2024-04-12T14:53:49.106423Z","shell.execute_reply":"2024-04-12T14:53:49.203847Z"},"trusted":true},"execution_count":9,"outputs":[{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/distributed/node.py:182: UserWarning: Port 8787 is already in use.\nPerhaps you already have a cluster running?\nHosting the HTTP server on port 33431 instead\n  warnings.warn(\n","output_type":"stream"},{"execution_count":9,"output_type":"execute_result","data":{"text/plain":"<Client: 'inproc://172.19.2.2/102/1' processes=1 threads=1, memory=14.90 GiB>","text/html":"<div>\n    <div style=\"width: 24px; height: 24px; background-color: #e1e1e1; border: 3px solid #9D9D9D; border-radius: 5px; position: absolute;\"> </div>\n    <div style=\"margin-left: 48px;\">\n        <h3 style=\"margin-bottom: 0px;\">Client</h3>\n        <p style=\"color: #9D9D9D; margin-bottom: 0px;\">Client-785f8570-f8dc-11ee-8066-0242ac130202</p>\n        <table style=\"width: 100%; text-align: left;\">\n\n        <tr>\n        \n            <td style=\"text-align: left;\"><strong>Connection method:</strong> Cluster object</td>\n            <td style=\"text-align: left;\"><strong>Cluster type:</strong> distributed.LocalCluster</td>\n        \n        </tr>\n\n        \n            <tr>\n                <td style=\"text-align: left;\">\n                    <strong>Dashboard: </strong> <a href=\"http://172.19.2.2:33431/status\" target=\"_blank\">http://172.19.2.2:33431/status</a>\n                </td>\n                <td style=\"text-align: left;\"></td>\n            </tr>\n        \n\n        </table>\n\n        \n\n        \n            <details>\n            <summary style=\"margin-bottom: 20px;\"><h3 style=\"display: inline;\">Cluster Info</h3></summary>\n            <div class=\"jp-RenderedHTMLCommon jp-RenderedHTML jp-mod-trusted jp-OutputArea-output\">\n    <div style=\"width: 24px; height: 24px; background-color: #e1e1e1; border: 3px solid #9D9D9D; border-radius: 5px; position: absolute;\">\n    </div>\n    <div style=\"margin-left: 48px;\">\n        <h3 style=\"margin-bottom: 0px; margin-top: 0px;\">LocalCluster</h3>\n        <p style=\"color: #9D9D9D; margin-bottom: 0px;\">32c22097</p>\n        <table style=\"width: 100%; text-align: left;\">\n            <tr>\n                <td style=\"text-align: left;\">\n                    <strong>Dashboard:</strong> <a href=\"http://172.19.2.2:33431/status\" target=\"_blank\">http://172.19.2.2:33431/status</a>\n                </td>\n                <td style=\"text-align: left;\">\n                    <strong>Workers:</strong> 1\n                </td>\n            </tr>\n            <tr>\n                <td style=\"text-align: left;\">\n                    <strong>Total threads:</strong> 1\n                </td>\n                <td style=\"text-align: left;\">\n                    <strong>Total memory:</strong> 14.90 GiB\n                </td>\n            </tr>\n            \n            <tr>\n    <td style=\"text-align: left;\"><strong>Status:</strong> running</td>\n    <td style=\"text-align: left;\"><strong>Using processes:</strong> False</td>\n</tr>\n\n            \n        </table>\n\n        <details>\n            <summary style=\"margin-bottom: 20px;\">\n                <h3 style=\"display: inline;\">Scheduler Info</h3>\n            </summary>\n\n            <div style=\"\">\n    <div>\n        <div style=\"width: 24px; height: 24px; background-color: #FFF7E5; border: 3px solid #FF6132; border-radius: 5px; position: absolute;\"> </div>\n        <div style=\"margin-left: 48px;\">\n            <h3 style=\"margin-bottom: 0px;\">Scheduler</h3>\n            <p style=\"color: #9D9D9D; margin-bottom: 0px;\">Scheduler-76596d08-6230-47bd-ac24-adabc8f3e1ea</p>\n            <table style=\"width: 100%; text-align: left;\">\n                <tr>\n                    <td style=\"text-align: left;\">\n                        <strong>Comm:</strong> inproc://172.19.2.2/102/1\n                    </td>\n                    <td style=\"text-align: left;\">\n                        <strong>Workers:</strong> 1\n                    </td>\n                </tr>\n                <tr>\n                    <td style=\"text-align: left;\">\n                        <strong>Dashboard:</strong> <a href=\"http://172.19.2.2:33431/status\" target=\"_blank\">http://172.19.2.2:33431/status</a>\n                    </td>\n                    <td style=\"text-align: left;\">\n                        <strong>Total threads:</strong> 1\n                    </td>\n                </tr>\n                <tr>\n                    <td style=\"text-align: left;\">\n                        <strong>Started:</strong> Just now\n                    </td>\n                    <td style=\"text-align: left;\">\n                        <strong>Total memory:</strong> 14.90 GiB\n                    </td>\n                </tr>\n            </table>\n        </div>\n    </div>\n\n    <details style=\"margin-left: 48px;\">\n        <summary style=\"margin-bottom: 20px;\">\n            <h3 style=\"display: inline;\">Workers</h3>\n        </summary>\n\n        \n        <div style=\"margin-bottom: 20px;\">\n            <div style=\"width: 24px; height: 24px; background-color: #DBF5FF; border: 3px solid #4CC9FF; border-radius: 5px; position: absolute;\"> </div>\n            <div style=\"margin-left: 48px;\">\n            <details>\n                <summary>\n                    <h4 style=\"margin-bottom: 0px; display: inline;\">Worker: 0</h4>\n                </summary>\n                <table style=\"width: 100%; text-align: left;\">\n                    <tr>\n                        <td style=\"text-align: left;\">\n                            <strong>Comm: </strong> inproc://172.19.2.2/102/4\n                        </td>\n                        <td style=\"text-align: left;\">\n                            <strong>Total threads: </strong> 1\n                        </td>\n                    </tr>\n                    <tr>\n                        <td style=\"text-align: left;\">\n                            <strong>Dashboard: </strong> <a href=\"http://172.19.2.2:36949/status\" target=\"_blank\">http://172.19.2.2:36949/status</a>\n                        </td>\n                        <td style=\"text-align: left;\">\n                            <strong>Memory: </strong> 14.90 GiB\n                        </td>\n                    </tr>\n                    <tr>\n                        <td style=\"text-align: left;\">\n                            <strong>Nanny: </strong> None\n                        </td>\n                        <td style=\"text-align: left;\"></td>\n                    </tr>\n                    <tr>\n                        <td colspan=\"2\" style=\"text-align: left;\">\n                            <strong>Local directory: </strong> /tmp/dask-scratch-space/worker-5329n7pu\n                        </td>\n                    </tr>\n\n                    \n                    <tr>\n                        <td style=\"text-align: left;\">\n                            <strong>GPU: </strong>Tesla P100-PCIE-16GB\n                        </td>\n                        <td style=\"text-align: left;\">\n                            <strong>GPU memory: </strong> 16.00 GiB\n                        </td>\n                    </tr>\n                    \n\n                    \n\n                </table>\n            </details>\n            </div>\n        </div>\n        \n\n    </details>\n</div>\n\n        </details>\n    </div>\n</div>\n            </details>\n        \n\n    </div>\n</div>"},"metadata":{}}]},{"cell_type":"code","source":"client.close()","metadata":{"execution":{"iopub.status.busy":"2024-04-12T14:59:34.680394Z","iopub.execute_input":"2024-04-12T14:59:34.887664Z","iopub.status.idle":"2024-04-12T15:00:19.744295Z","shell.execute_reply.started":"2024-04-12T14:59:34.887612Z","shell.execute_reply":"2024-04-12T15:00:19.554062Z"},"trusted":true},"execution_count":11,"outputs":[{"name":"stderr","text":"\nKeyboardInterrupt\n\n","output_type":"stream"}]},{"cell_type":"code","source":"data = dd.read_parquet(\"/kaggle/input/leash-BELKA/train.parquet\", columns=['protein_name','binds'])","metadata":{"execution":{"iopub.status.busy":"2024-04-13T16:37:55.149093Z","iopub.execute_input":"2024-04-13T16:37:55.149501Z","iopub.status.idle":"2024-04-13T16:37:55.174041Z","shell.execute_reply.started":"2024-04-13T16:37:55.149472Z","shell.execute_reply":"2024-04-13T16:37:55.173072Z"},"trusted":true},"execution_count":8,"outputs":[]},{"cell_type":"code","source":"a = data.shape\nprint('The shape of the dataframe is', a[0].compute(),a[1])","metadata":{"execution":{"iopub.status.busy":"2024-04-12T14:24:50.521335Z","iopub.execute_input":"2024-04-12T14:24:50.52167Z","iopub.status.idle":"2024-04-12T14:24:50.940623Z","shell.execute_reply.started":"2024-04-12T14:24:50.521645Z","shell.execute_reply":"2024-04-12T14:24:50.939727Z"},"trusted":true},"execution_count":5,"outputs":[{"name":"stdout","text":"The shape of the dataframe is 295246830.0 7\n","output_type":"stream"}]},{"cell_type":"code","source":"data.columns","metadata":{"execution":{"iopub.status.busy":"2024-04-13T13:06:54.138224Z","iopub.execute_input":"2024-04-13T13:06:54.138939Z","iopub.status.idle":"2024-04-13T13:06:54.146234Z","shell.execute_reply.started":"2024-04-13T13:06:54.138905Z","shell.execute_reply":"2024-04-13T13:06:54.145265Z"},"trusted":true},"execution_count":6,"outputs":[{"execution_count":6,"output_type":"execute_result","data":{"text/plain":"Index(['protein_name'], dtype='object')"},"metadata":{}}]},{"cell_type":"code","source":"data.dtypes","metadata":{"execution":{"iopub.status.busy":"2024-04-13T12:01:12.188234Z","iopub.execute_input":"2024-04-13T12:01:12.188931Z","iopub.status.idle":"2024-04-13T12:01:12.196331Z","shell.execute_reply.started":"2024-04-13T12:01:12.188897Z","shell.execute_reply":"2024-04-13T12:01:12.19536Z"},"trusted":true},"execution_count":15,"outputs":[{"execution_count":15,"output_type":"execute_result","data":{"text/plain":"id                                 int64\nbuildingblock1_smiles    string[pyarrow]\nbuildingblock2_smiles    string[pyarrow]\nbuildingblock3_smiles    string[pyarrow]\nmolecule_smiles          string[pyarrow]\nprotein_name             string[pyarrow]\nbinds                              int64\ndtype: object"},"metadata":{}}]},{"cell_type":"code","source":"data = data.astype({'id':'int32' ,\n                'binds': 'int8'})\n","metadata":{"execution":{"iopub.status.busy":"2024-04-13T12:01:20.067834Z","iopub.execute_input":"2024-04-13T12:01:20.068216Z","iopub.status.idle":"2024-04-13T12:01:20.077892Z","shell.execute_reply.started":"2024-04-13T12:01:20.068182Z","shell.execute_reply":"2024-04-13T12:01:20.076927Z"},"trusted":true},"execution_count":16,"outputs":[]},{"cell_type":"code","source":"print(data['protein_name'].value_counts().compute())","metadata":{"execution":{"iopub.status.busy":"2024-04-13T16:30:40.275682Z","iopub.execute_input":"2024-04-13T16:30:40.276562Z"},"trusted":true},"execution_count":null,"outputs":[{"name":"stdout","text":"protein_name\nsEH     98415610\nHSA     98415610\nBRD4    98415610\nName: count, dtype: int64\n","output_type":"stream"}]},{"cell_type":"code","source":"print(data[data['protein_name'] == 'sEH']['binds'].value_counts().compute())","metadata":{"execution":{"iopub.status.busy":"2024-04-13T16:43:32.767831Z","iopub.execute_input":"2024-04-13T16:43:32.768783Z","iopub.status.idle":"2024-04-13T16:44:46.809688Z","shell.execute_reply.started":"2024-04-13T16:43:32.768746Z","shell.execute_reply":"2024-04-13T16:44:46.808686Z"},"trusted":true},"execution_count":13,"outputs":[{"name":"stdout","text":"binds\n1      724532\n0    97691078\nName: count, dtype: int64\n","output_type":"stream"}]},{"cell_type":"code","source":"print(data['protein_name'].unique().compute())","metadata":{"execution":{"iopub.status.busy":"2024-04-13T13:13:49.982846Z","iopub.execute_input":"2024-04-13T13:13:49.983833Z","iopub.status.idle":"2024-04-13T13:14:32.061247Z","shell.execute_reply.started":"2024-04-13T13:13:49.9838Z","shell.execute_reply":"2024-04-13T13:14:32.060276Z"},"trusted":true},"execution_count":7,"outputs":[{"name":"stdout","text":"0     sEH\n0     HSA\n0    BRD4\nName: protein_name, dtype: object\n","output_type":"stream"}]},{"cell_type":"code","source":"data.categorize()\nencoded_df = dd.get_dummies(data['protein_name'])\n","metadata":{"execution":{"iopub.status.busy":"2024-04-13T13:16:18.158657Z","iopub.execute_input":"2024-04-13T13:16:18.159431Z","iopub.status.idle":"2024-04-13T13:17:30.58032Z","shell.execute_reply.started":"2024-04-13T13:16:18.1594Z","shell.execute_reply":"2024-04-13T13:17:30.579092Z"},"trusted":true},"execution_count":10,"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mNotImplementedError\u001b[0m                       Traceback (most recent call last)","Cell \u001b[0;32mIn[10], line 2\u001b[0m\n\u001b[1;32m      1\u001b[0m data\u001b[38;5;241m.\u001b[39mcategorize()\n\u001b[0;32m----> 2\u001b[0m encoded_df \u001b[38;5;241m=\u001b[39m \u001b[43mdd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget_dummies\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mprotein_name\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/dask_expr/_dummies.py:128\u001b[0m, in \u001b[0;36mget_dummies\u001b[0;34m(data, prefix, prefix_sep, dummy_na, columns, sparse, drop_first, dtype, **kwargs)\u001b[0m\n\u001b[1;32m    126\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(data, Series):\n\u001b[1;32m    127\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m methods\u001b[38;5;241m.\u001b[39mis_categorical_dtype(data):\n\u001b[0;32m--> 128\u001b[0m         \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m(not_cat_msg)\n\u001b[1;32m    129\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m has_known_categories(data):\n\u001b[1;32m    130\u001b[0m         \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mNotImplementedError\u001b[39;00m(unknown_cat_msg)\n","\u001b[0;31mNotImplementedError\u001b[0m: `get_dummies` with non-categorical dtypes is not supported. Please use `df.categorize()` beforehand to convert to categorical dtype."],"ename":"NotImplementedError","evalue":"`get_dummies` with non-categorical dtypes is not supported. Please use `df.categorize()` beforehand to convert to categorical dtype.","output_type":"error"}]},{"cell_type":"code","source":"data.categorize()\ndata = dd.get_dummies(data, columns=['protein_name'])","metadata":{"execution":{"iopub.status.busy":"2024-04-13T12:08:25.475081Z","iopub.execute_input":"2024-04-13T12:08:25.4758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Let's see if there are any NA/missing values in the DF\nna_counts = data.isna().sum().compute()\nprint(na_counts)","metadata":{"execution":{"iopub.status.busy":"2024-04-08T17:53:42.481645Z","iopub.execute_input":"2024-04-08T17:53:42.482044Z","iopub.status.idle":"2024-04-08T17:58:48.711192Z","shell.execute_reply.started":"2024-04-08T17:53:42.482014Z","shell.execute_reply":"2024-04-08T17:58:48.709961Z"},"trusted":true},"execution_count":33,"outputs":[{"name":"stdout","text":"id                       0\nbuildingblock1_smiles    0\nbuildingblock2_smiles    0\nbuildingblock3_smiles    0\nmolecule_smiles          0\nprotein_name             0\nbinds                    0\ndtype: int64\n","output_type":"stream"}]},{"cell_type":"code","source":"#to check the memory usage\ndata.memory_usage(deep=True).compute()\n","metadata":{"execution":{"iopub.status.busy":"2024-04-08T17:58:48.713157Z","iopub.execute_input":"2024-04-08T17:58:48.713616Z","iopub.status.idle":"2024-04-08T18:08:23.351639Z","shell.execute_reply.started":"2024-04-08T17:58:48.71356Z","shell.execute_reply":"2024-04-08T18:08:23.350713Z"},"trusted":true},"execution_count":34,"outputs":[{"execution_count":34,"output_type":"execute_result","data":{"text/plain":"Index                          15104\nid                        2361974640\nbuildingblock1_smiles    31773510075\nbuildingblock2_smiles    22347820746\nbuildingblock3_smiles    22319463030\nmolecule_smiles          38869173753\nprotein_name             17813225410\nbinds                     2361974640\ndtype: int64"},"metadata":{}}]},{"cell_type":"code","source":"data.describe().compute()","metadata":{"execution":{"iopub.status.busy":"2024-04-08T17:27:24.268051Z","iopub.execute_input":"2024-04-08T17:27:24.268805Z","iopub.status.idle":"2024-04-08T17:27:40.264739Z","shell.execute_reply.started":"2024-04-08T17:27:24.268771Z","shell.execute_reply":"2024-04-08T17:27:40.263767Z"},"trusted":true},"execution_count":14,"outputs":[{"execution_count":14,"output_type":"execute_result","data":{"text/plain":"                 id         binds\ncount  2.952468e+08  2.952468e+08\nmean   1.476234e+08  5.385006e-03\nstd    8.523042e+07  7.318475e-02\nmin    0.000000e+00  0.000000e+00\n25%    7.340032e+07  0.000000e+00\n50%    1.460142e+08  0.000000e+00\n75%    2.202010e+08  0.000000e+00\nmax    2.952468e+08  1.000000e+00","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>id</th>\n      <th>binds</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>count</th>\n      <td>2.952468e+08</td>\n      <td>2.952468e+08</td>\n    </tr>\n    <tr>\n      <th>mean</th>\n      <td>1.476234e+08</td>\n      <td>5.385006e-03</td>\n    </tr>\n    <tr>\n      <th>std</th>\n      <td>8.523042e+07</td>\n      <td>7.318475e-02</td>\n    </tr>\n    <tr>\n      <th>min</th>\n      <td>0.000000e+00</td>\n      <td>0.000000e+00</td>\n    </tr>\n    <tr>\n      <th>25%</th>\n      <td>7.340032e+07</td>\n      <td>0.000000e+00</td>\n    </tr>\n    <tr>\n      <th>50%</th>\n      <td>1.460142e+08</td>\n      <td>0.000000e+00</td>\n    </tr>\n    <tr>\n      <th>75%</th>\n      <td>2.202010e+08</td>\n      <td>0.000000e+00</td>\n    </tr>\n    <tr>\n      <th>max</th>\n      <td>2.952468e+08</td>\n      <td>1.000000e+00</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"cell_type":"code","source":"data = dd.read_parquet(\"/kaggle/input/leash-BELKA/train.parquet\", columns=['molecule_smiles'])","metadata":{"execution":{"iopub.status.busy":"2024-04-13T11:38:31.539614Z","iopub.execute_input":"2024-04-13T11:38:31.540463Z","iopub.status.idle":"2024-04-13T11:38:31.565882Z","shell.execute_reply.started":"2024-04-13T11:38:31.540422Z","shell.execute_reply":"2024-04-13T11:38:31.56506Z"},"trusted":true},"execution_count":4,"outputs":[]},{"cell_type":"code","source":"data['binds'].value_counts().compute()","metadata":{"execution":{"iopub.status.busy":"2024-04-08T20:02:43.269792Z","iopub.execute_input":"2024-04-08T20:02:43.270149Z","iopub.status.idle":"2024-04-08T20:02:49.77458Z","shell.execute_reply.started":"2024-04-08T20:02:43.270123Z","shell.execute_reply":"2024-04-08T20:02:49.773712Z"},"trusted":true},"execution_count":6,"outputs":[{"execution_count":6,"output_type":"execute_result","data":{"text/plain":"binds\n1      1589906\n0    293656924\nName: count, dtype: int64"},"metadata":{}}]},{"cell_type":"code","source":"smi_data=data['molecule_smiles'].compute()","metadata":{"execution":{"iopub.status.busy":"2024-04-13T11:27:44.420548Z","iopub.execute_input":"2024-04-13T11:27:44.421405Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"smiles_five = data.head(5)","metadata":{"execution":{"iopub.status.busy":"2024-04-13T11:39:05.325886Z","iopub.execute_input":"2024-04-13T11:39:05.327017Z","iopub.status.idle":"2024-04-13T11:39:24.309698Z","shell.execute_reply.started":"2024-04-13T11:39:05.326981Z","shell.execute_reply":"2024-04-13T11:39:24.308641Z"},"trusted":true},"execution_count":6,"outputs":[]},{"cell_type":"code","source":"smiles_five.molecule_smiles[0]","metadata":{"execution":{"iopub.status.busy":"2024-04-13T11:40:10.382982Z","iopub.execute_input":"2024-04-13T11:40:10.383378Z","iopub.status.idle":"2024-04-13T11:40:10.391016Z","shell.execute_reply.started":"2024-04-13T11:40:10.383347Z","shell.execute_reply":"2024-04-13T11:40:10.389983Z"},"trusted":true},"execution_count":9,"outputs":[{"execution_count":9,"output_type":"execute_result","data":{"text/plain":"'C#CCOc1ccc(CNc2nc(NCC3CCCN3c3cccnn3)nc(N[C@@H](CC#C)CC(=O)N[Dy])n2)cc1'"},"metadata":{}}]},{"cell_type":"code","source":"m = Chem.MolFromSmiles('C#CCOc1ccc(CNc2nc(NCC3CCCN3c3cccnn3)nc(N[C@@H](CC#C)CC(=O)N[Dy])n2)cc1')","metadata":{"execution":{"iopub.status.busy":"2024-04-13T11:40:52.530721Z","iopub.execute_input":"2024-04-13T11:40:52.531113Z","iopub.status.idle":"2024-04-13T11:40:52.536226Z","shell.execute_reply.started":"2024-04-13T11:40:52.531084Z","shell.execute_reply":"2024-04-13T11:40:52.535184Z"},"trusted":true},"execution_count":12,"outputs":[]},{"cell_type":"code","source":"m","metadata":{"execution":{"iopub.status.busy":"2024-04-13T11:40:59.54437Z","iopub.execute_input":"2024-04-13T11:40:59.545068Z","iopub.status.idle":"2024-04-13T11:40:59.609534Z","shell.execute_reply.started":"2024-04-13T11:40:59.545036Z","shell.execute_reply":"2024-04-13T11:40:59.608623Z"},"trusted":true},"execution_count":13,"outputs":[{"execution_count":13,"output_type":"execute_result","data":{"text/plain":"<rdkit.Chem.rdchem.Mol at 0x781589497760>","image/png":"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"},"metadata":{}}]}]}