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

## はじめに
**CAS番号からSMILESへの変換、SMILESから構造式への変換**を行いたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/1b92073b-6ce0-7407-e046-657832f7a464.png)

※マテリアルズインフォマティクス関係の内容を他にも投稿していますので、よろしければ[こちら](https://qiita.com/oki_kosuke/items/34b1071224953776c211#%E6%8A%95%E7%A8%BF%E4%B8%80%E8%A6%A7)の一覧から他の投稿も見て頂けますと幸いです。

## 今回の例題
[東京化成工業(TCI)様のサイト](https://www.tcichemicals.com/JP/ja/)に紹介されていたおすすめ製品の最初の3つをターゲットに変換を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/f2fd0496-f78e-b01a-0de4-6aaf67570b8a.png)

### 環境
- python 3.7.13
- rdkit 2022.03.4

## CAS番号→SMILESへの変換
[こちら](https://qiita.com/ottantachinque/items/b9986e676c51a8e2805b)のページを参考に致しました。
まずは変換を行うデータを作っていきます。
```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/f737f684-6e4a-2ff5-b67d-26e04580cf78.png)
実際の検討ではデータがあると思いますので、手元にあるデータを使っていくことになると思います。
CAS番号→SMILESへの変換について詳しく見ていきます。参考サイトより、以下のようにCAS番号はSMILESを含むデータに変換できます。
```python
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を抜く出したかったのですが、手間取ったのでその過程を書いておきます。（最後にまとめコードは載せています）
```python
type(test)
```
```:出力
list
```
```python
test[0]
```
```:出力
{'CID': 10972379, 'CanonicalSMILES': 'CC(CP(C1=CC=CC=C1)C2=CC=CC=C2)N(C)C'}

```
```python
type(test[0])
```
```:出力
dict
```
```python
test[0]["CanonicalSMILES"]
```
```:出力
'CC(CP(C1=CC=CC=C1)C2=CC=CC=C2)N(C)C'
```
このようにしてデータの構造を理解し、以下のようにSMILESを取得しました。
```python
#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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/18e8d83d-227d-c84e-b8d5-aaa74b07bf65.png)

## SMILES→構造式への変換
```python
# SMILES→構造可視化
from IPython.display import SVG
from rdkit.Chem import AllChem, Draw, Descriptors, PandasTools

PandasTools.AddMoleculeColumnToFrame(df, "SMILES")
df
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/5279564b-15de-c54a-7e4f-b935652252b2.png)
このデータをエクセルに保存します。エクセルだと構造式が一覧で見えて便利ですね。
```python
# エクセルに保存（エラー回避のため欠損値は0埋めしておく）
PandasTools.SaveXlsxFromFrame(df.fillna(0), "TCIsample_SMILES_ROMol.xlsx", size=(150, 150))
```

## 「CAS番号→SMILES→構造式」変換をまとめたコード
まずはデータの準備部分です。
```python
import pandas as pd

df = pd.DataFrame(
    data={"code": ["D5819", "M3330", "D5761"], 
          "CAS RN": ["211638-02-7", "247925-28-6", "1239017-80-1"]})
```
次にデータの変換部分です。
```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/60e14c88-e55f-3e8a-9697-76d93ba1853a.png)

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

### 参考
- [pubchem から化合物情報を一気に取得する](https://qiita.com/ottantachinque/items/b9986e676c51a8e2805b)
- [化学の新しいカタチ](https://future-chem.com/pub-chem-py/)