Вычислить молекулярные дескрипторы и отпечатки пальцев из SMILES и сохранить их во фрейме данных [Python, RDKit]
Как создать фрейм данных, содержащий молекулярные дескрипторы и отпечатки пальцев из SMILES составного набора данных с помощью RDKit. Даже если я попытался создать свою собственную модель QSAR / машинного обучения, я наткнулся на создание молекулярных дескрипторов и отпечатков пальцев, поэтому я резюмирую их ниже.
Значение хранения во фрейме данных
Вы можете создать тип списка только для того, чтобы использовать его в машинном обучении, но использование фрейма данных упрощает выполнение следующих задач.
- Составной набор данных с высоты птичьего полета на основе созданного дескриптора / отпечатка пальца
- Предварительная обработка данных, такая как обработка пропущенных значений и уменьшение размеров
Кроме того, в 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()
Если вы видите «ВНИМАНИЕ: не удалять атомы водорода без соседей», это, вероятно, потому, что данные содержат соли. 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)
обсуждение
Список комментариев
Пока нет комментариев