はじめに
CAS番号からSMILESへの変換、SMILESから構造式への変換を行いたいと思います。
※マテリアルズインフォマティクス関係の内容を他にも投稿していますので、よろしければこちらの一覧から他の投稿も見て頂けますと幸いです。
今回の例題
東京化成工業(TCI)様のサイトに紹介されていたおすすめ製品の最初の3つをターゲットに変換を行います。
環境
- python 3.7.13
- rdkit 2022.03.4
CAS番号→SMILESへの変換
こちらのページを参考に致しました。
まずは変換を行うデータを作っていきます。
import pandas as pd
df = pd.DataFrame(
data={"code": ["D5819", "M3330", "D5761"],
"CAS RN": ["211638-02-7", "247925-28-6", "1239017-80-1"]})
df
実際の検討ではデータがあると思いますので、手元にあるデータを使っていくことになると思います。
CAS番号→SMILESへの変換について詳しく見ていきます。参考サイトより、以下のようにCAS番号はSMILESを含むデータに変換できます。
import pubchempy as pcp
properties = ['CanonicalSMILES']
test = pcp.get_properties(properties, '211638-02-7', 'name')
test
出力
[{'CID': 10972379, 'CanonicalSMILES': 'CC(CP(C1=CC=CC=C1)C2=CC=CC=C2)N(C)C'}]
ここからSMILESを抜く出したかったのですが、手間取ったのでその過程を書いておきます。(最後にまとめコードは載せています)
type(test)
出力
list
test[0]
出力
{'CID': 10972379, 'CanonicalSMILES': 'CC(CP(C1=CC=CC=C1)C2=CC=CC=C2)N(C)C'}
type(test[0])
出力
dict
test[0]["CanonicalSMILES"]
出力
'CC(CP(C1=CC=CC=C1)C2=CC=CC=C2)N(C)C'
このようにしてデータの構造を理解し、以下のようにSMILESを取得しました。
#CAS番号をSMILESを含む情報に変換する
infos = []
for i in df["CAS RN"]:
info = pcp.get_properties(properties, i, 'name')
infos.append(info)
#SMILESのみを抜き出す
import numpy as np
smileses = []
for i in np.arange(len(infos)):
try:
smiles = infos[i][0]["CanonicalSMILES"]
smileses.append(smiles)
except:
smiles = "NaN" #SMILESが定義されない化合物はNaN埋めする
smileses.append(smiles)
df["SMILES"] = smileses
df
SMILES→構造式への変換
# SMILES→構造可視化
from IPython.display import SVG
from rdkit.Chem import AllChem, Draw, Descriptors, PandasTools
PandasTools.AddMoleculeColumnToFrame(df, "SMILES")
df
このデータをエクセルに保存します。エクセルだと構造式が一覧で見えて便利ですね。
# エクセルに保存(エラー回避のため欠損値は0埋めしておく)
PandasTools.SaveXlsxFromFrame(df.fillna(0), "TCIsample_SMILES_ROMol.xlsx", size=(150, 150))
「CAS番号→SMILES→構造式」変換をまとめたコード
まずはデータの準備部分です。
import pandas as pd
df = pd.DataFrame(
data={"code": ["D5819", "M3330", "D5761"],
"CAS RN": ["211638-02-7", "247925-28-6", "1239017-80-1"]})
次にデータの変換部分です。
import numpy as np
import pubchempy as pcp
from IPython.display import SVG
from rdkit.Chem import AllChem, Draw, Descriptors, PandasTools
#CAS番号をSMILESを含む情報に変換する
infos = []
properties = ['CanonicalSMILES']
for i in df["CAS RN"]:
info = pcp.get_properties(properties, i, 'name')
infos.append(info)
#SMILESのみを抜き出し、データフレームに追加する
smileses = []
for i in np.arange(len(infos)):
try:
smiles = infos[i][0]["CanonicalSMILES"]
smileses.append(smiles)
except:
smiles = "NaN" #SMILESが定義されない化合物はNaN埋めする
smileses.append(smiles)
df["SMILES"] = smileses
# SMILES→構造可視化
PandasTools.AddMoleculeColumnToFrame(df, "SMILES")
# データの保存
PandasTools.SaveXlsxFromFrame(df.fillna(0), "TCIsample_SMILES_ROMol.xlsx", size=(150, 150))
# データの表示
df
まとめ
CAS番号からSMILESへの変換、SMILESから構造式への変換に関してご紹介いたしました。