LoginSignup
7
7

More than 1 year has passed since last update.

【PubChem使いこなし】「CAS番号→SMILES→構造式」変換を行う!

Last updated at Posted at 2022-08-12

はじめに

CAS番号からSMILESへの変換、SMILESから構造式への変換を行いたいと思います。
image.png

※マテリアルズインフォマティクス関係の内容を他にも投稿していますので、よろしければこちらの一覧から他の投稿も見て頂けますと幸いです。

今回の例題

東京化成工業(TCI)様のサイトに紹介されていたおすすめ製品の最初の3つをターゲットに変換を行います。
image.png

環境

  • 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    

image.png
実際の検討ではデータがあると思いますので、手元にあるデータを使っていくことになると思います。
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

image.png

SMILES→構造式への変換

# SMILES→構造可視化
from IPython.display import SVG
from rdkit.Chem import AllChem, Draw, Descriptors, PandasTools

PandasTools.AddMoleculeColumnToFrame(df, "SMILES")
df

image.png
このデータをエクセルに保存します。エクセルだと構造式が一覧で見えて便利ですね。

# エクセルに保存(エラー回避のため欠損値は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

image.png

まとめ

CAS番号からSMILESへの変換、SMILESから構造式への変換に関してご紹介いたしました。

参考

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7