{"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":30684,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom scipy import sparse\nimport os, gc\n\nimport warnings\nimport pandas as pd\nfrom pandas.errors import SettingWithCopyWarning\nwarnings.simplefilter(action='ignore', category=(SettingWithCopyWarning))\nwarnings.simplefilter(action='ignore')\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-07-18T14:03:27.418383Z","iopub.execute_input":"2024-07-18T14:03:27.419595Z","iopub.status.idle":"2024-07-18T14:03:27.426888Z","shell.execute_reply.started":"2024-07-18T14:03:27.419538Z","shell.execute_reply":"2024-07-18T14:03:27.425587Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mol_bits=2048\nchunck_size=10**4\nsample_nrows=8*10**6 #plus positive targets. 9,5M*3_Targets rows\ncreate_ecfp=True","metadata":{"execution":{"iopub.status.busy":"2024-07-18T14:03:27.429393Z","iopub.execute_input":"2024-07-18T14:03:27.429817Z","iopub.status.idle":"2024-07-18T14:03:27.442075Z","shell.execute_reply.started":"2024-07-18T14:03:27.429784Z","shell.execute_reply":"2024-07-18T14:03:27.440934Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install rdkit\n!pip install mapply","metadata":{"execution":{"iopub.status.busy":"2024-07-18T14:03:27.443297Z","iopub.execute_input":"2024-07-18T14:03:27.443629Z","iopub.status.idle":"2024-07-18T14:03:52.231445Z","shell.execute_reply.started":"2024-07-18T14:03:27.443602Z","shell.execute_reply":"2024-07-18T14:03:52.230025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from rdkit import Chem\nfrom rdkit.Chem import AllChem\nfrom rdkit.Chem import rdFingerprintGenerator\nmorgan_fp_gen = rdFingerprintGenerator.GetMorganGenerator(radius=2)\n\nimport mapply\n\nmapply.init( n_workers=-1,progressbar=False)\n\n#Coversion to ECFPs  from https://www.kaggle.com/code/andrewdblevins/leash-tutorial-ecfps-and-random-forest\n# Generate ECFPs\ndef gen_ecfp(molecule, radius=2, bits=mol_bits):    \n    if molecule is None:\n        return None\n    #return np.array(AllChem.GetMorganFingerprintAsBitVect(molecule, radius, nBits=bits))\n    return np.array(morgan_fp_gen.GetFingerprint(molecule))\n\ndef gen_molecule(molecule_smiles):\n    if molecule_smiles is None:\n        return None    \n    molecule = Chem.MolFromSmiles(molecule_smiles)\n   # Me = Chem.MolFromSmiles('C')\n   # Dy = Chem.MolFromSmiles('[Dy]')\n   # molecule = AllChem.ReplaceSubstructs(molecule, Dy, Me)    \n   # Chem.SanitizeMol(molecule)\n    return np.array(molecule)\n\ndef generate_ecfp_chunck(df):\n    df['molecule'] = df['molecule_smiles'].mapply(gen_molecule)\n    df['ecfp'] = df['molecule'].mapply(gen_ecfp)\n    return sparse.csr_matrix(np.stack(df['ecfp'], axis=0).astype(np.uint8))\n\ndef generate_ecfp(df):\n    n_chunks = ((len(df) - 1) // chunck_size) + 1\n    df_ecfp=generate_ecfp_chunck(df[0:chunck_size])\n\n    for i in range(1,n_chunks):\n        a=i*chunck_size\n        b=i*chunck_size+chunck_size\n        #print(a,b)\n        #print(df_tmp.shape)\n        df_ecfp=sparse.vstack([df_ecfp,generate_ecfp_chunck(df[a:b].copy())]) \n    return df_ecfp","metadata":{"execution":{"iopub.status.busy":"2024-07-18T14:19:15.825689Z","iopub.execute_input":"2024-07-18T14:19:15.826154Z","iopub.status.idle":"2024-07-18T14:19:15.838222Z","shell.execute_reply.started":"2024-07-18T14:19:15.826118Z","shell.execute_reply":"2024-07-18T14:19:15.837093Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Get unique blocks","metadata":{}},{"cell_type":"code","source":"print('Loading test data')\ntest=pd.read_parquet('/kaggle/input/leash-BELKA/test.parquet', engine = 'pyarrow')\n\nprint('Cheking building block....')\nBBs = pd.read_parquet('/kaggle/input/leash-BELKA/test.parquet', engine = 'pyarrow', columns=['buildingblock1_smiles'])\nblock_unique_1=BBs['buildingblock1_smiles'].unique().tolist() \nprint('Number of buildingblock1: ',len(block_unique_1))\n\nBBs = pd.read_parquet('/kaggle/input/leash-BELKA/test.parquet', engine = 'pyarrow', columns=['buildingblock2_smiles'])\nblock_unique_2=BBs['buildingblock2_smiles'].unique().tolist() \nprint('Number of buildingblock2: ',len(block_unique_2))\n\nBBs = pd.read_parquet('/kaggle/input/leash-BELKA/test.parquet', engine = 'pyarrow', columns=['buildingblock3_smiles'])\nblock_unique_3=BBs['buildingblock3_smiles'].unique().tolist() \nprint('Number of buildingblock3: ',len(block_unique_3))\n\nblock_unique_23=list(set(block_unique_2+block_unique_3))\nprint('Number of buildingblock23 : ',len(block_unique_23))","metadata":{"execution":{"iopub.status.busy":"2024-07-18T14:03:52.702763Z","iopub.execute_input":"2024-07-18T14:03:52.703381Z","iopub.status.idle":"2024-07-18T14:03:55.189442Z","shell.execute_reply.started":"2024-07-18T14:03:52.703346Z","shell.execute_reply":"2024-07-18T14:03:55.188241Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Creating building block dictionary...')\nprint('buildingblock1 in buildingblock2',len([block for block in block_unique_1 if block in block_unique_2]))\nprint('buildingblock1 in buildingblock3',len([block for block in block_unique_1 if block in block_unique_3]))\nprint('buildingblock2 in buildingblock3',len([block for block in block_unique_2 if block in block_unique_3]))\nprint('buildingblock3 in buildingblock2',len([block for block in block_unique_3 if block in block_unique_2]))\n\nblocks_dict_1={list(block_unique_1)[i]:i for i in range(len(block_unique_1))}\nblocks_dict_23={list(block_unique_23)[i]:i for i in range(len(block_unique_23))}\nnp.save('blocks_dict_1.npy', blocks_dict_1) \nnp.save('blocks_dict_23.npy', blocks_dict_23) ","metadata":{"execution":{"iopub.status.busy":"2024-07-18T14:03:55.190629Z","iopub.execute_input":"2024-07-18T14:03:55.190961Z","iopub.status.idle":"2024-07-18T14:03:55.261167Z","shell.execute_reply.started":"2024-07-18T14:03:55.190935Z","shell.execute_reply":"2024-07-18T14:03:55.259601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create Test Data","metadata":{}},{"cell_type":"code","source":"test=pd.read_parquet('/kaggle/input/leash-BELKA/test.parquet')\n\n#blocks_dict = blocks_dict.tolist()\n#blocks_dict = blocks_dict.tolist()\n\ntest['buildingblock1_smiles']=test['buildingblock1_smiles'].map(blocks_dict_1).values.astype('uint16')\ntest['buildingblock2_smiles']=test['buildingblock2_smiles'].map(blocks_dict_23).values.astype('uint16')\ntest['buildingblock3_smiles']=test['buildingblock3_smiles'].map(blocks_dict_23).values.astype('uint16')\n\ntest_preds=pd.DataFrame(test['molecule_smiles'].unique(),columns=['molecule_smiles'])\ntest_preds=test[['molecule_smiles','buildingblock1_smiles','buildingblock2_smiles','buildingblock3_smiles']].copy()\ntest_preds.drop_duplicates(inplace=True)\ntest_preds=test_preds.reset_index(drop=True) \ntest_preds.to_csv('test_preds.csv',index=False)\n\ntest=pd.DataFrame(test['molecule_smiles'].unique(),columns=['molecule_smiles'])\n\ndel BBs,block_unique_1,block_unique_2,block_unique_3,test_preds\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-07-18T14:03:55.262756Z","iopub.execute_input":"2024-07-18T14:03:55.263125Z","iopub.status.idle":"2024-07-18T14:04:01.456160Z","shell.execute_reply.started":"2024-07-18T14:03:55.263091Z","shell.execute_reply":"2024-07-18T14:04:01.455080Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if create_ecfp:\n    print('Generating ecfp from test data')\n    test_ecfp=generate_ecfp(test)\n    sparse.save_npz(\"test_ecfp.npz\", test_ecfp)\n    del test_ecfp\n    gc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-07-18T14:19:22.145842Z","iopub.execute_input":"2024-07-18T14:19:22.146208Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create Train Data.","metadata":{}},{"cell_type":"code","source":"#Encode building block smiles to integers.\nBBs_1=pd.read_parquet('/kaggle/input/leash-BELKA/train.parquet', engine = 'pyarrow', columns=['buildingblock1_smiles'])[::3]['buildingblock1_smiles'].map(blocks_dict_1).values.astype('uint16')\nBBs_2=pd.read_parquet('/kaggle/input/leash-BELKA/train.parquet', engine = 'pyarrow', columns=['buildingblock2_smiles'])[::3]['buildingblock2_smiles'].map(blocks_dict_23).values.astype('uint16')\nBBs_3=pd.read_parquet('/kaggle/input/leash-BELKA/train.parquet', engine = 'pyarrow', columns=['buildingblock3_smiles'])[::3]['buildingblock3_smiles'].map(blocks_dict_23).values.astype('uint16')\n\n#Protein_name bins rows to columns.\nbin_BRD4=pd.read_parquet('/kaggle/input/leash-BELKA/train.parquet', engine = 'pyarrow', columns=['binds'])[::3].values.ravel().astype('uint8')\nbin_HSA=pd.read_parquet('/kaggle/input/leash-BELKA/train.parquet', engine = 'pyarrow', columns=['binds'])[1::3].values.ravel().astype('uint8')\nbin_sEH=pd.read_parquet('/kaggle/input/leash-BELKA/train.parquet', engine = 'pyarrow', columns=['binds'])[2::3].values.ravel().astype('uint8')\n\n#Protein_name bins rows to columns.\nmolecule_smiles=pd.read_csv('/kaggle/input/leash-BELKA/train.csv',usecols=[4], skiprows=lambda x: x%3 != 0).values.ravel()\n\ndata = {'buildingblock1_smiles':BBs_1,\n        'buildingblock2_smiles':BBs_2,\n        'buildingblock3_smiles':BBs_3,\n        'molecule_smiles': molecule_smiles,\n        'binds_BRD4':bin_BRD4, \n        'binds_HSA':bin_HSA, \n        'binds_sEH':bin_sEH}\n\ntrain = pd.DataFrame(data=data)\ntrain.head(3)","metadata":{"execution":{"iopub.status.busy":"2024-07-18T14:04:01.540530Z","iopub.status.idle":"2024-07-18T14:04:01.540955Z","shell.execute_reply.started":"2024-07-18T14:04:01.540746Z","shell.execute_reply":"2024-07-18T14:04:01.540763Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Create Sample Data.\nTARGETS=['binds_BRD4','binds_HSA','binds_sEH']\n\nprint('Original Data')\nprint('Shape :',train.shape)\nprint('block1 :',train.buildingblock1_smiles.nunique())\nprint('block2 :',train.buildingblock2_smiles.nunique())\nprint('block3 :',train.buildingblock3_smiles.nunique())  \nfor target in TARGETS:\n    print(f'Positive Cases Ratio for {target}:',(train[target].sum()/train.shape[0]))\n          \nprint('#**************************#')\n    \ntt1=train[(train.binds_BRD4 != 0) | (train.binds_HSA !=0) | (train.binds_sEH !=0)]\ntt2=train[(train.binds_BRD4 == 0) & (train.binds_HSA ==0) & (train.binds_sEH ==0)].sample(n=sample_nrows,random_state=42)  \ntrain=pd.concat([tt1,tt2]).sample(frac=1,random_state=42).reset_index(drop=True) \ntrain.to_csv('train_sample.csv',index=False)\nprint('Sampled Data 9,5M rows')\nprint('Shape :',train.shape)\nprint('block1 :',train.buildingblock1_smiles.nunique())\nprint('block2 :',train.buildingblock2_smiles.nunique())\nprint('block3 :',train.buildingblock3_smiles.nunique())    \nfor target in TARGETS:\n    print(f'Positive Cases Ratio for {target} :', target,(train[target].sum()/train.shape[0]))","metadata":{"execution":{"iopub.status.busy":"2024-07-18T14:04:01.543120Z","iopub.status.idle":"2024-07-18T14:04:01.543556Z","shell.execute_reply.started":"2024-07-18T14:04:01.543344Z","shell.execute_reply":"2024-07-18T14:04:01.543360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del tt1,tt2,molecule_smiles,BBs_1,BBs_2,BBs_3,bin_BRD4,bin_HSA,bin_sEH\ngc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-07-18T14:04:01.545345Z","iopub.status.idle":"2024-07-18T14:04:01.545922Z","shell.execute_reply.started":"2024-07-18T14:04:01.545651Z","shell.execute_reply":"2024-07-18T14:04:01.545676Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if create_ecfp:\n    print('Generating ecfp from train data')\n    train_ecfp=generate_ecfp(train[['molecule_smiles']])\n    sparse.save_npz(\"train_ecfp.npz\", train_ecfp)\n\n    del train,train_ecfp\n    gc.collect()","metadata":{"execution":{"iopub.status.busy":"2024-07-18T14:04:01.547322Z","iopub.status.idle":"2024-07-18T14:04:01.547878Z","shell.execute_reply.started":"2024-07-18T14:04:01.547608Z","shell.execute_reply":"2024-07-18T14:04:01.547632Z"},"trusted":true},"execution_count":null,"outputs":[]}]}