Вычислить молекулярные дескрипторы и отпечатки пальцев из SMILES и сохранить их во фрейме данных [Python, RDKit]

2020 год 1 месяц 8 день

Как создать фрейм данных, содержащий молекулярные дескрипторы и отпечатки пальцев из SMILES составного набора данных с помощью RDKit. Даже если я попытался создать свою собственную модель QSAR / машинного обучения, я наткнулся на создание молекулярных дескрипторов и отпечатков пальцев, поэтому я резюмирую их ниже.

Значение хранения во фрейме данных

Вы можете создать тип списка только для того, чтобы использовать его в машинном обучении, но использование фрейма данных упрощает выполнение следующих задач.

  1. Составной набор данных с высоты птичьего полета на основе созданного дескриптора / отпечатка пальца
  2. Предварительная обработка данных, такая как обработка пропущенных значений и уменьшение размеров

Кроме того, в RDKit SMILES однажды преобразуется в объект mol для вычисления дескриптора, но даже если есть что-то, что не может быть хорошо преобразовано в то время, с фреймом данных легче справиться.

Попробуй попрактиковаться

Подготовка

Для выборки данных мы будем использовать SMIELS из BBBP MoleculeNet (набор данных о проникновении через гематоэнцефалический барьер).

Объект RDKit mol хранится в столбце с именем ROMol, поэтому создайте дескриптор на его основе.

Ссылка: Список составных наборов данных

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) число 0 имя 0 p_np 0 смайлы 0 ROMol 11 dtype: int64

Отображается ошибка «Явная валентность для атома № 1, N, 4, больше допустимой», поскольку существует молекула (ион и т. Д.) С аномальной валентностью («4 атома в N»). Значение превышает допустимое. значение. ")В ROMol такой молекулы не было возвращено ни одного, а таких УЛЫБКОВ здесь было 11.

Вы можете разбираться с ними по одному, но если количество невелико, их можно быстро удалить на время.Поэтому используйте isnull (). Sum () для проверки отсутствующих значений в столбце ROMol и удалите эти строки, если они есть.

Ссылка: Устранение неполадок при чтении составных данных

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

# 欠損行の除去
df = df.dropna() 
Рассчитайте молекулярный дескриптор и отпечаток пальца из SMILES и сохраните его во фрейме данных

Если вы видите «ВНИМАНИЕ: не удалять атомы водорода без соседей», это, вероятно, потому, что данные содержат соли. RDKit сохраняет H по умолчанию, поэтому, если есть H (например, соль), который не привязан к соседу, такой H нельзя удалить и предупреждает вас.

 

Создание молекулярного дескриптора

Функция Map полезна для применения функции к объекту в каждой строке фрейма данных.

Поскольку имена дескрипторов и функции перечислены в «Descriptors.descList» RDKit, это займет немного времени, но я смог вычислить все сразу с помощью функции for и функции карты и вернуть их во фрейм данных.

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

df.head()
Создание фрейма данных для молекулярного дескриптора

Добавлены дескрипторы для 201 столбца.

Если вы примените полученные переменные к scikit-learn или платформе глубокого обучения, вы можете получить ошибку «Ошибка значения: входные данные содержат NaN, бесконечность или значение, слишком большое для dtype ('float64')». Было бы хорошо, если бы я сделал следующий.

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

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

Кажется, что причина в том, что часть значения дескриптора «IPC» создается до бесконечности.

Ссылка: # 12 Что делать, если значение IPC дескриптора RDKit 2D очень велико
Ссылка: Список молекулярных дескрипторов

Создание отпечатка пальца

Его можно быстро вычислить с помощью функции apply, но кажется, что список отпечатков хранится в одном столбце.

Поскольку отпечаток пальца сохраняется в формате объекта Explicit BitVect, для сохранения каждого значения в одном столбце потребовалось некоторое время.

# 下準備
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)
При добавлении списка отпечатков пальцев в один столбец
При сохранении каждого значения отпечатка пальца в каждом столбце