【Python】化合物名からIUPAC名・InChIKey・CAS番号を取得【pubchempy】

pandas

本記事では、alanineのような化合物名からIUPAC名などの他の情報を取得する方法を説明します。

具体的には以下の内容の取得について取り扱います。

  • synonyms:別名
  • CID
  • InChI
  • InChIKey
  • canonical SMILES
  • isomeric SMILES
  • IUPAC名
  • 分子式
  • 分子量
  • CAS番号

1. pubchempyのインストール

化合物データベースであるPubChemをPythonから利用できるライブラリpubchempyをインストールします。

pip3 install pubchempy

2. 慣用名からIUPAC名などの他の情報を取得: get_compounds()

get_compounds()の引数に検索したい名称(alanineやNIJJYAXOARWZEE-UHFFFAOYSA-N)と名称のフォーマット(nameinchikey)などを指定することで、IUPAC名などの他の属性が一括で取得できます。

import pubchempy as pcp
res = pcp.get_compounds('ValproicAcid', 'name')

get_compounds()による検索結果は複数になることがあるため、返り値はリストになっています。

リストの要素について、以下のように各種属性に対応したメソッドを用いて情報を取得します。

print(f'''
{res[0].synonyms[:3]},
{res[0].cid},
{res[0].inchi},
{res[0].inchikey},
{res[0].isomeric_smiles},
{res[0].iupac_name},
{res[0].molecular_formula},
{res[0].molecular_weight},
{res[0].iupac_name},
''')
['VALPROIC ACID', '2-Propylpentanoic acid', '99-66-1'],
3121,
InChI=1S/C8H16O2/c1-3-5-7(6-4-2)8(9)10/h7H,3-6H2,1-2H3,(H,9,10),
NIJJYAXOARWZEE-UHFFFAOYSA-N,
CCCC(CCC)C(=O)O,
2-propylpentanoic acid,
C8H16O2,
144.21,
2-propylpentanoic acid,

3. 慣用名からIUPAC名などの他の情報を取得: get_properties()

前節のget_compounds()は全ての属性を取得するため、少々時間がかかります。

取得した属性が決まっている場合はget_proparties()を利用した方がかかる時間が少なくなります。

大量の化合物を処理する際などはget_proparties()の利用を勧めます。

get_propaties()を使い方は以下です。

properties = [
    'MolecularFormula',
    'MolecularWeight',
    'CanonicalSMILES',
    'IsomericSMILES',
    'InChI',
    'InChIKey',
    'IUPACName',
    'XLogP'
]

pcp.get_properties(properties, 'Tranylcypromine', 'name')
[{'CID': 19493,
  'MolecularFormula': 'C9H11N',
  'MolecularWeight': '133.19',
  'CanonicalSMILES': 'C1C(C1N)C2=CC=CC=C2',
  'IsomericSMILES': 'C1[C@H]([C@@H]1N)C2=CC=CC=C2',
  'InChI': 'InChI=1S/C9H11N/c10-9-6-8(9)7-4-2-1-3-5-7/h1-5,8-9H,6,10H2/t8-,9+/m0/s1',
  'InChIKey': 'AELCINSCMGFISI-DTWKUNHWSA-N',
  'IUPACName': '(1R,2S)-2-phenylcyclopropan-1-amine',
  'XLogP': 1.5},
 {'CID': 5530,
  'MolecularFormula': 'C9H11N',
  'MolecularWeight': '133.19',
  'CanonicalSMILES': 'C1C(C1N)C2=CC=CC=C2',
  'IsomericSMILES': 'C1C(C1N)C2=CC=CC=C2',
  'InChI': 'InChI=1S/C9H11N/c10-9-6-8(9)7-4-2-1-3-5-7/h1-5,8-9H,6,10H2',
  'InChIKey': 'AELCINSCMGFISI-UHFFFAOYSA-N',
  'IUPACName': '2-phenylcyclopropan-1-amine',
  'XLogP': 1.5},
 {'CID': 441233,
  'MolecularFormula': 'C9H11N',
  'MolecularWeight': '133.19',
  'CanonicalSMILES': 'C1C(C1N)C2=CC=CC=C2',
  'IsomericSMILES': 'C1[C@H](C1C2=CC=CC=C2)N',
  'InChI': 'InChI=1S/C9H11N/c10-9-6-8(9)7-4-2-1-3-5-7/h1-5,8-9H,6,10H2/t8?,9-/m1/s1',
  'InChIKey': 'AELCINSCMGFISI-YGPZHTELSA-N',
  'IUPACName': '(1R)-2-phenylcyclopropan-1-amine',
  'XLogP': 1.5},
 {'CID': 26070,
  'MolecularFormula': 'C9H11N',
  'MolecularWeight': '133.19',
  'CanonicalSMILES': 'C1C(C1N)C2=CC=CC=C2',
  'IsomericSMILES': 'C1[C@@H]([C@H]1N)C2=CC=CC=C2',
  'InChI': 'InChI=1S/C9H11N/c10-9-6-8(9)7-4-2-1-3-5-7/h1-5,8-9H,6,10H2/t8-,9+/m1/s1',
  'InChIKey': 'AELCINSCMGFISI-BDAKNGLRSA-N',
  'IUPACName': '(1S,2R)-2-phenylcyclopropan-1-amine',
  'XLogP': 1.5}]

出力をpandasのdataframeにすることも可能です。

pcp.get_properties(properties, 'Tranylcypromine', 'name', as_dataframe=True)
CIDMolecularFormulaMolecularWeightCanonicalSMILESIsomericSMILESInChIInChIKeyIUPACNameXLogP
19493C9H11N133.19C1C(C1N)C2=CC=CC=C2C1[C@H]([C@@H]1N)C2=CC=CC=C2InChI=1S/C9H11N/c10-9-6-8(9)7-4-2-1-3-5-7/h1-5…AELCINSCMGFISI-DTWKUNHWSA-N(1R,2S)-2-phenylcyclopropan-1-amine1.5
5530C9H11N133.19C1C(C1N)C2=CC=CC=C2C1C(C1N)C2=CC=CC=C2InChI=1S/C9H11N/c10-9-6-8(9)7-4-2-1-3-5-7/h1-5…AELCINSCMGFISI-UHFFFAOYSA-N2-phenylcyclopropan-1-amine1.5
441233C9H11N133.19C1C(C1N)C2=CC=CC=C2C1[C@H](C1C2=CC=CC=C2)NInChI=1S/C9H11N/c10-9-6-8(9)7-4-2-1-3-5-7/h1-5…AELCINSCMGFISI-YGPZHTELSA-N(1R)-2-phenylcyclopropan-1-amine1.5
26070C9H11N133.19C1C(C1N)C2=CC=CC=C2C1[C@@H]([C@H]1N)C2=CC=CC=C2InChI=1S/C9H11N/c10-9-6-8(9)7-4-2-1-3-5-7/h1-5…AELCINSCMGFISI-BDAKNGLRSA-N(1S,2R)-2-phenylcyclopropan-1-amine1.5

3. CAS番号を取得

get_compounds()get_proparties()ではCAS番号を直接取得できません。

CAS番号は他のデータベースでの検索に利用することもあるため、CAS番号を取得できるようにしておきます。

具体的にはget_synonyms()の中に含まれるCAS番号を正規表現によるマッチで取得します。

以下のように関数を定義します。

import re

# CIDへ変換
def to_cids(value, namespace='inchikey'):
    _ = pcp.get_compounds(value, namespace=namespace)
    cids = [c.cid for c in _]
    return cids


# CIDからCAS番号を調べる
def cid_to_casno(cid):
    raws, casnos = [], []
    _ = pcp.get_synonyms(cid, namespace="cid")
    for r in _:
        syno = r.get("Synonym", [])
        for s in syno:
            m = re.match("(\d{2,7}-\d\d-\d)", s)
            if m:
                casnos.append(m.group(1))
                raws.append(r)
                break
    return {"raw": raws, "casno": casnos}


# 上記2つの関数を組み合わせる
def to_casnos(value, namespace='inchikey'):
    cids = to_cids(value, namespace=namespace)
    casnos = {}
    for cid in cids:
        cas = cid_to_casno(cid)['casno']
        casnos[cid] = cas
    return casnos

実行例は以下の通りです。

(A) InChIKeyからCAS番号

to_casnos('AELCINSCMGFISI-DTWKUNHWSA-N')
{19493: ['155-09-9']}

(B) 名称からCAS番号

to_casnos('Tranylcypromine', namespace='name')
{19493: ['155-09-9'], 5530: ['54-97-7'], 441233: [], 26070: ['3721-28-6']}

4. まとめ

本記事では、pubchempyというライブラリを用いて、化合物のデータベースであるPubChemの検索方法を示しました。

以下の記事などで実際の使用例がありますので、参考にしてみて下さい。

以上になります。

コメント