Calcola il descrittore molecolare e l'impronta digitale da SMILES e memorizzali nel data frame [Python, RDKit]

2020 年 1 月 8 日

Come creare un data frame contenente descrittori molecolari e impronte digitali da SMILES di un dataset composto con RDKit. Anche se ho provato a creare il mio modello QSAR / machine learning, sono incappato nella creazione di descrittori molecolari e impronte digitali, quindi li riassumerò di seguito.

Importanza della memorizzazione nel frame di dati

È possibile creare un tipo di elenco solo per inserirlo nell'apprendimento automatico, ma l'utilizzo di un frame di dati semplifica le operazioni seguenti.

  1. Una vista a volo d'uccello del set di dati composto in base al descrittore / impronta digitale creata
  2. Pre-elaborazione dei dati come la gestione dei valori mancanti e la riduzione delle dimensioni

Inoltre, in RDKit, SMILES viene una volta convertito in un oggetto mol per calcolare il descrittore, ma anche se c'è qualcosa che non può essere convertito bene in quel momento, il data frame è più facile da gestire.

Prova a fare pratica

Preparazione

Per i dati di esempio, utilizzeremo SMIELS dal BBBP (dataset di penetrazione della barriera emato-encefalica) di MoleculeNet.

L'oggetto RDKit mol è memorizzato in una colonna chiamata ROMol, quindi crea un descrittore basato su questo.

Riferimento: elenco di set di dati composti

import numpy as np
import pandas as pd
 
from rdkit import rdBase, Chem
from rdkit.Chem import AllChem, PandasTools, Descriptors
from rdkit.Chem.Draw import IPythonConsole
 
print('rdkit version: ',rdBase.rdkitVersion)  # rdkit version:  2019.03.4
 
# 下準備
# データセットの読み込み
df = pd.read_csv("BBBP.csv")
 
# dfのSMILES列を参照してMolオブジェクト列をデータフレームに加える
PandasTools.AddMoleculeColumnToFrame(df,'smiles')
 
# Molオブジェクトが作成できたか確認
print(df.shape)
print(df.isnull().sum())  
(2050, 4) num 0 nome 0 p_np 0 sorrisi 0 ROMol 11 dtype: int64

Viene visualizzato l'errore "La valenza esplicita per l'atomo n. 1 N, 4, è maggiore del consentito" perché era presente una molecola (ione, ecc.) Con una valenza anormale ("4 atomi in N"). Il valore è superiore al consentito valore. ")Nessuno è stato restituito al ROMol di una tale molecola, e qui c'erano 11 SORRISI di questo tipo.

Puoi gestirli uno per uno, ma se il numero è piccolo, è veloce per rimuoverli per il momento.Pertanto, utilizzare isnull (). Sum () per verificare la presenza di valori mancanti nella colonna ROMol e rimuovere quelle righe, se presenti.

Riferimento: risoluzione dei problemi di lettura dei dati composti

# ROMolが作成できなかったものを確認
print(df[df.ROMol.isnull()])

# 欠損行の除去
df = df.dropna() 
Calcola il descrittore molecolare e l'impronta digitale da SMILES e memorizzalo nel data frame

Se vedi "ATTENZIONE: non rimuovere gli atomi di idrogeno senza vicini", è probabilmente perché i dati contengono sali. RDKit salva H per impostazione predefinita, quindi se c'è una H (come salt) che non è legata al vicino, tale H non può essere rimossa e ti avverte.

 

Creazione di un descrittore molecolare

La funzione Map è utile per applicare una funzione a un oggetto in ogni riga in un data frame.

Poiché i nomi e le funzioni dei descrittori sono elencati in "Descriptors.descList" di RDKit, ci vuole un po 'di tempo, ma sono stato in grado di calcolare tutto in una volta con la funzione for e map e restituirlo al frame di dati.

for i,j in Descriptors.descList:
    df[i] = df.ROMol.map(j)
 
df.shape
# (2039, 205)

df.head()
Creazione di un dataframe per il descrittore molecolare

Sono stati aggiunti i descrittori per 201 colonne.

Se applichi le variabili risultanti a scikit-learn o a un framework di deep learning, potresti ricevere l'errore "Value Error: Input contains NaN, infinity or a value too large for dtype ('float64')". a seguire.

for i,j in Descriptors.descList:
    df[i] = df['ROMol'].map(j)

df['Ipc'] = [Descriptors.Ipc(mol, avg=True) for mol in df['ROMol']]  

Sembra che la causa sia che una parte del valore "IPC" del descrittore viene creata grande quanto infinita.

Riferimento: # 12 Cosa fare se il valore IPC del descrittore RDKit 2D è molto grande
Riferimento: elenco dei descrittori molecolari

Creazione di un'impronta digitale

Può essere calcolato rapidamente utilizzando la funzione di applicazione, ma sembra che l'elenco delle impronte digitali sia memorizzato in una colonna.

Poiché l'impronta digitale viene salvata nel formato dell'oggetto BitVect esplicito, è necessario del tempo per memorizzare ogni valore in una colonna.

# 下準備
df = pd.read_csv("BBBP.csv")
PandasTools.AddMoleculeColumnToFrame(df,'smiles') 
df = df.dropna()
 
# 1列にfingerprintのリストを追加する場合
df['FP'] = df.apply(lambda x: AllChem.GetMorganFingerprintAsBitVect(x.ROMol, 2, 1024), axis=1)

# fingerprintの各値を各列に格納する場合
# 個別に01をデータフレームに格納する
FP = [AllChem.GetMorganFingerprintAsBitVect(mol, 2, 1024) for mol in df.ROMol]
df_FP = pd.DataFrame(np.array(FP)) 

# フィンガープリントをもとのデータフレームに結合
df_FP.index = df.index
df = pd.concat([df, df_FP], axis=1)
Quando si aggiunge un elenco di impronte digitali a una colonna
Quando si memorizza ogni valore dell'impronta digitale in ogni colonna