RDKitのPandasToolsでデータ分析を加速する

当サイトでは「有機合成化学者のためのケモインフォマティクス入門」を掲げています.高価なソフトを使うこと無く学習をはじめられるように,これまでpythonのケモインフォマティクスライブラリである「RDKit」の解説を,「RDKitでケモインフォマティクスに入門」という記事から10回以上に渡って行ってきました.

すでにRDKitの基本的な使い方から,ケモインフォマティクスで用いられる色々なコンセプトを見てきました.その過程で扱った化合物データは,pythonの基本データ型であるリストや辞書型の変数,またはnumpy配列に格納して取り扱うことがほとんどでした.

一方で,pythonを用いたデータサイエンス・探索的なデータ分析ではpandasのSeriesやDataFrameというデータ型を用いるのが主流です.今回はRDKitのMolオブジェクトをpandasのDataFrameでどのように扱うかについて学んでいくことで,このギャップを埋めていきます.

pandasとは

pandas(読み方:パンダス)」はパネルデータを扱うためのpythonライブラリで,pythonデータサイエンスの中心となるデータ型とそれに付随する様々な操作を提供するライブラリになります.特に数値データと時系列データにおける異常値・欠損値の扱いに長けています.またnumpyでは均一な数値データの配列のみしか扱えないのに対し,pandasは不均一なデータを取り扱える点が特長になります.

とても多機能で巨大なライブラリになりますので,全ての機能を把握するのは困難です.必要なところから徐々に慣れていくのがよいと思います.

RDKitのPandasToolsについて

pandasでは数値データや時系列データの扱いは得意ですが,化合物データを扱うためのライブラリではありませんので,当然ですが分子を扱う際に便利な機能は提供されていません.RDKitの「Chem.PandasTools」は,MolオブジェクトをpandasのDataFrameで扱うための拡張機能を提供するものになります.

まずは必要なライブラリのimportを行い,それから具体的にPandasToolsの使い方を見ていきましょう.

from rdkit import rdBase, Chem, DataStructs
from rdkit.Chem import AllChem, Draw, Descriptors, PandasTools
import pandas as pd

print('rdkit version: ',rdBase.rdkitVersion)
print('pandas version: ', pd.__version__)
### rdkit version:  2018.03.3
### pandas version:  0.23.4

Molオブジェクトのデータフレームへの読み込み

PandasToolsを使ったMolオブジェクトのデータフレームへの読み込み方法には大きく

  • SDFからMolオブジェクトを構築
  • SMILESからMolオブジェクトを構築

の2つの方法があります.前者はデータフレームを1から作る方法,後者はSMILESを含む既存のデータフレームにMOLオブジェクトを格納するカラムを追加する方法です.

SDFのpandasデータフレームへの読み込み

LoadSDF(filename)

SDFを直接pandasのデータフレームとして読み込むにはPandasTools.LoadSDFの利用が最も便利です.このメソッドを用いるとSDFに設定されているプロパティがカラムに登録されます.肝心のMolオブジェクトは「ROMol」というカラムに格納されます.

デフォルト設定ではROMolに登録された分子はプロパティを保持していませんが,embedPropsオプションTrueにすることでプロパティを付加できます.

またMolオブジェクトを作成せずに,SDF中のプロパティだけを取り込んだデータフレームを作成したい場合には,molColName=Noneオプションを設定します.

下の例では東京化成より入手したサリチル酸誘導体のSDFを読み込んでいます.

SDF TCI

df = PandasTools.LoadSDF('./sdf_20180716131641.sdf')
df.MOLECULAR_WEIGHT = df.MOLECULAR_WEIGHT.astype(float)
df.columns

CAS番号,分子式,カタログ番号をはじめとしたプロパティがデータフレームに読み込まれているのがわかります.またプロパティは全て「文字列」として認識されていますので,分子量だけはastypeを用いてfloat型へと変換しました.

Index(['CAS_NUMBER', 'FREEZING_POINT', 'ID', 'MDL_NUMBER', 'MELTING_POINT',
 'MOLECULAR_FORMULA', 'MOLECULAR_WEIGHT', 'PRODUCT_NAME', 'PRODUCT_NUMBER',
 'ROMol'], dtype='object')
SDFの入手方法については「MOLファイル・SDFとはどんな化学情報ファイルなのか?」という記事で解説していますので,参照してみてください.

SMILESからMolオブジェクトを構築する

AddMoleculeColumnToFrame(frame, smilesCol)

既にSMILESを含めて化合物データが色々と登録されているデータフレームにMolオブジェクトを登録したい場合には,PandasTools.AddMoleculeColumnToFrameを使います.このメソッドは名前のとおり,SMILESカラムを指定することでMolオブジェクトを生成し,既存のデータフレームに追加します.

データフレームを用いた分子の操作

それでは実際に分子を使った操作をしてみたいと思います.特にPandasTools特有の機能に限定することなく説明していきます.

mapまたはapplyを用いた記述子の一括計算

Series.map(function or dictionary)
DataFrame.apply(function or dictionary, axis)

データフレーム中のMolオブジェクトに対して,一括で記述子を計算する場合などにはpandasのmapまたはapplyメソッドを使うとよいです.mapはSeriesに対して,applyはデータフレームの行または列に対して使います.

以下の例ではmapを使ってFsp3を,applyを使ってMorganフィンガープリントを計算しています.その後,タニモト係数を計算し,いずれも新しいカラムに保存しています.

df['Fsp3'] = df.ROMol.map(Descriptors.FractionCSP3)
df['FP'] = df.apply(lambda x: AllChem.GetMorganFingerprintAsBitVect(x['ROMol'], 2, 2048), axis=1)
df['Tanimoto'] = DataStructs.BulkTanimotoSimilarity(df.FP[0], df.FP)
df[['CAS_NUMBER', 'MOLECULAR_WEIGHT', 'ROMol', 'Tanimoto', 'Fsp3']].head(3)

ここまでのデータフレームの中身は下のようになっています.

Df 01

Fsp3については「RDKitで立体的な分子の形を記述する」という記事で,RDKitで用いられるフィンガープリントについては「RDKitでフィンガープリントを使った分子類似性の判定」という記事で解説していますので,参照してみてください.

ge比較演算子を用いた部分構造検索

PandasToolsの一番の拡張機能は,>=(ge比較演算子)」を用いることで部分構造マッチが行える点にあります.Mol.HasSubstructMatchを用いるよりも,ずっと簡単に分子構造のスクリーニングが可能になります.

下の例ではスルホン部位を有する分子を取り出してみました.

CSO2C = Chem.MolFromSmiles('CS(=O)(=O)C')
df[df.ROMol >= CSO2C][['CAS_NUMBER', 'ROMol', 'Tanimoto']]

Df 02

Bemis・Murcko骨格の追加

AddMurckoToFrame(dataframe, MurckoCol=’Murcko_SMILES’, Generic=False)

データフレーム中のMolオブジェクトを基にBemis・Murckoらによる方法を使って分子の主骨格をSMILES形式で取り出したカラムを追加します.Generic=Tureオプションを設定することでへテロ元素を炭素に置換した骨格に変更可能です.

下の例では,

  1. 主骨格のSMILESを格納したカラムをAddMurckoToFrameを用いて作成
  2. AddMoleculeColumnToFrameによってMolオブジェクトへと変換
  3. FrameToGridImageメソッドを用いて,データフレーム中のMolオブジェクトの構造を描画

という3ステップを行っています.

PandasTools.AddMurckoToFrame(df, MurckoCol='Murcko_SMILES')
PandasTools.AddMurckoToFrame(df, MurckoCol='Murcko_generic_SMILES', Generic=True)
PandasTools.AddMoleculeColumnToFrame(df, molCol='Murcko_Mol', smilesCol='Murcko_SMILES')
PandasTools.AddMoleculeColumnToFrame(df, molCol='Murcko_generic_Mol', smilesCol='Murcko_generic_SMILES')
PandasTools.FrameToGridImage(df[:8], column='Murcko_generic_Mol', legendsCol='Tanimoto', molsPerRow=4)

Df 03

BM Scaffoldについては「RDKitを用いた部分構造検索とMCSアルゴリズム」という記事の中でも説明していますので,参照してみてください.

データフレームからファイルへの書き出し

PandasToolsではデータフレームから分子情報の他のファイルへの書き出しも可能です.

  • SDF
  • SMILES
  • XLS(エクセルファイル)

という3形式に対応しています.

SDF

WriteSDF(dataframe, output_file, idName=None, properties=None)

SDFへの書き出しにはWriteSDFを用います.データフレームと書き出すSDFのファイル名を引数にとり,さらに追加の設定として,

  • idNameでカラム名を指定することでSDFのタイトル
  • propertiesでSDFに追加するプロパティのリスト

をオプションで設定可能です.

SMILES

SaveSMILESFromFrame(dataframe, output_file)

SaveSMILESFromFrameを使うことで,データフレーム中のMolオブジェクトカラムからSMILESを生成して保存することが可能です.

エクセル形式

SaveXlsxFromFrame(dataframe, output_file, size=(300, 300))

Molオブジェクトの構造を画像ファイルとして埋め込んだ上で,データフレームをエクセル形式で保存します.xlsxwriter」に依存していますので,利用に先立ってインストールしておきましょう.

下の例ではまずは不要なカラムを削除した後に,主骨格をMolオブジェクトに指定して,画像ファイルをやや小さめにして保存しています.

ddf = df.drop(['FREEZING_POINT', 'ID', 'MELTING_POINT', 'ROMol', 'FP', 'Murcko_generic_Mol'], axis=1)
PandasTools.SaveXlsxFromFrame(ddf, './sample.xls', molCol='Murcko_Mol', size=(150,150))

このようなExcelファイルが作成されました.

Df 04

ありがちだと思いますが私の周りでは「Excel最強」ですので,他人との化合物データのやり取りにエクセルを扱うことが多々あります.特にChemDrawで描いた構造をExcelのセルに貼り付ける作業を繰り返して化合物管理をしているようなプロジェクトでは非常に重宝するのではないかと思います.10年前の自分に是非とも教えてあげたい機能です.

終わりに

今回はpythonにおけるデータ分析作業の中心をなすpandasとRDKitとの架け橋となるPandasToolsについて説明してきました.PandasToolsを使うことで,Molオブジェクトが簡単にデータフレームに取り込めること,および部分構造検索が容易に行えることなどを見てきました.

pandas自体は非常に多機能なライブラリですので,今回紹介できなかった役立つ機能がたくさんあります.是非とも公式サイト「Python Data Analysis Library」を読み込んで,理解を深めていってください.

これまで本サイトでpythonの基本データ型を使って行ってきた作業を,pandasのデータフレームに置き換えてみるのもよい練習になるかもしれません.

>>次の記事:「RDKitの分子Molオブジェクトを扱う

シェアする

  • このエントリーをはてなブックマークに追加

フォローする