احسب الواصف الجزيئي وبصمة الإصبع من SMILES وقم بتخزينها في إطار البيانات [Python ، RDKit]

2020 1 年 月 日 8

كيفية إنشاء إطار بيانات يحتوي على واصفات جزيئية وبصمات أصابع من SMILES لمجموعة بيانات مركبة باستخدام RDKit. حتى لو حاولت إنشاء نموذج QSAR / التعلم الآلي الخاص بي ، فقد عثرت على واصفات جزيئية وبصمات أصابع ، لذلك سألخصها أدناه.

أهمية التخزين في إطار البيانات

يمكنك إنشاء نوع قائمة فقط لوضعه في التعلم الآلي ، ولكن استخدام إطار البيانات يجعل من السهل القيام بما يلي.

  1. عرض شامل لمجموعة البيانات المركبة بناءً على الواصف / بصمة الإصبع التي تم إنشاؤها
  2. المعالجة المسبقة للبيانات مثل معالجة القيمة المفقودة وتقليل الأبعاد

بالإضافة إلى ذلك ، يقوم RDKit مرة واحدة بتحويل SMILES إلى كائن mol من أجل حساب الواصف ، ولكن حتى إذا كان هناك شيء لا يمكن تحويله جيدًا في ذلك الوقت ، فإن إطار البيانات يكون أسهل في التعامل معه.

حاول أن تتدرب

تحضير

للحصول على بيانات العينة ، سوف نستخدم SMIELS من MoleculeNet's BBBP (مجموعة بيانات اختراق الحاجز الدموي الدماغي).

يتم تخزين كائن 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) num 0 name 0 p_np 0 smiles 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 وتحذيرك.

 

إنشاء واصف جزيئي

تُعد وظيفة الخريطة مفيدة لتطبيق دالة على كائن في كل صف في إطار البيانات.

نظرًا لأن أسماء الواصفات والوظائف مدرجة في "Descriptors.descList" لـ RDKit ، فقد استغرق الأمر بعض الوقت ، لكنني تمكنت من حساب الكل مرة واحدة باستخدام دالة for و map وإعادتها إلى إطار البيانات.

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 كبيرة جدًا
المرجع: قائمة الواصفات الجزيئية

إنشاء بصمة

يمكن حسابها بسرعة باستخدام وظيفة التطبيق ، ولكن يبدو أن قائمة بصمات الأصابع مخزنة في عمود واحد.

نظرًا لأنه يتم حفظ بصمة الإصبع بتنسيق كائن 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)
عند إضافة قائمة بصمات الأصابع إلى عمود واحد
عند تخزين كل قيمة بصمة في كل عمود