🧪
【化学でPython】PubChemPy:データベースから化合物の情報を取得する
はじめに
この「化学でPython」シリーズでは、化学の分野で有用な Python ライブラリを紹介しています。
今回紹介するのは、PubChemPy です。
PubChem とは?
PubChem は米国 NIH が提供するオープンアクセスの化合物データベースで、1 億件を超える分子情報(構造、物性、バイオアッセイ、文献リンクなど)を無料で参照できます。
PubChemPy とは?
PubChem REST API(PUG REST)をPythonicに包んだ軽量ライブラリで、化合物の検索・物性取得・同義語リストや構造式のダウンロードまで一気通貫で扱えます。
実験ノートなどに貼る化合物情報を取得して整形したり、スクリーニングの前処理など、日常的なデータ取得の自動化作業に使えそうです。
インストール
pip で簡単に導入できます。
terminal
pip install pubchempy
基本的な使い方
まずは化合物名から CID(PubChem Compound ID; 化合物固有のID)を取得し、主要な物性を確認してみましょう。
import pubchempy as pcp
# Aspirin (CID 2244) を名前検索で取得
aspirin = pcp.get_compounds("aspirin", "name")[0]
print(f"CID: {aspirin.cid}")
print(f"Molecular formula: {aspirin.molecular_formula}")
print(f"Molecular weight: {aspirin.molecular_weight:.2f}")
print(f"IUPAC: {aspirin.iupac_name}")
print(f"Canonical SMILES: {aspirin.canonical_smiles}")
print(f"XLogP: {aspirin.xlogp}")
実行結果
CID: 2244
Molecular formula: C9H8O4
Molecular weight: 180.16
IUPAC: 2-acetyloxybenzoic acid
Canonical SMILES: CC(=O)OC1=CC=CC=C1C(=O)O
XLogP: 1.2
実践例: 鎮痛薬候補のLipinskiルールを一括チェック
疼痛治療でよく使われる分子を例に、PubChem から物性を取得して経口薬らしさ(Lipinski の Rule of Five)を確認します。
1. PubChemPyで主要物性をテーブル化
import pubchempy as pcp
import pandas as pd
import math
analgesics = ["aspirin", "ibuprofen", "naproxen", "acetaminophen"] # Typical oral analgesics
def safe_float(value):
"""Convert PubChem fields to float while keeping missing values."""
try:
return float(value)
except (TypeError, ValueError):
return math.nan
records = []
for name in analgesics:
compounds = pcp.get_compounds(name, "name")
if not compounds:
continue # Skip if the name is not found
compound = compounds[0]
data = {
"Drug": name.title(),
"CID": compound.cid,
"MW": safe_float(compound.molecular_weight), # Molecular weight guides permeability
"HBA": safe_float(compound.h_bond_acceptor_count), # Hydrogen-bond acceptors
"HBD": safe_float(compound.h_bond_donor_count), # Hydrogen-bond donors
"TPSA(A^2)": safe_float(compound.tpsa), # Polar surface area relates to absorption
"XLogP3": safe_float(compound.xlogp), # LogP approximates lipophilicity
"RotBonds": safe_float(compound.rotatable_bond_count) # Flexibility metric
}
constraints = [
data["MW"] <= 500,
data["HBA"] <= 10,
data["HBD"] <= 5,
(data["XLogP3"] <= 5) if not math.isnan(data["XLogP3"]) else False,
]
data["Lipinski_OK"] = all(constraints)
records.append(data)
df = pd.DataFrame(records).sort_values("MW")
print(df.to_string(index=False))
実行結果
Drug CID MW HBA HBD TPSA(A^2) XLogP3 RotBonds Lipinski_OK
Acetaminophen 1983 151.16 2.0 2.0 49.3 0.5 1.0 True
Aspirin 2244 180.16 4.0 1.0 63.6 1.2 3.0 True
Ibuprofen 3672 206.28 2.0 1.0 37.3 3.5 4.0 True
Naproxen 156391 230.26 3.0 1.0 46.5 3.3 3.0 True
2. 物性フィルタで用途を切り分ける
import pubchempy as pcp
import pandas as pd
import math
def build_dataframe(names):
"""Fetch PubChem properties and return a tidy DataFrame."""
records = []
for name in names:
compound = pcp.get_compounds(name, "name")[0]
records.append({
"Drug": name.title(),
"MW": float(compound.molecular_weight),
"TPSA": float(compound.tpsa),
"XLogP3": float(compound.xlogp),
"RotBonds": float(compound.rotatable_bond_count)
})
return pd.DataFrame(records)
df = build_dataframe(["aspirin", "ibuprofen", "naproxen", "acetaminophen"])
# High-polar molecules may suit intravenous formulations due to lower permeability
high_polar = df[df["TPSA"] >= 60]
# Lipophilic molecules (XLogP3 ≥ 3) often demand solubilizers for oral dosage
lipophilic = df[df["XLogP3"] >= 3]
print("High-polar set:")
print(high_polar.to_string(index=False))
print("\nLipophilic set:")
print(lipophilic.to_string(index=False))
実行結果
High-polar set:
Drug MW TPSA XLogP3 RotBonds
Aspirin 180.16 63.6 1.2 3.0
Lipophilic set:
Drug MW TPSA XLogP3 RotBonds
Ibuprofen 206.28 37.3 3.5 4.0
Naproxen 230.26 46.5 3.3 3.0
上の結果から、TPSA が高めのアスピリンはプロドラッグ戦略との相性を、XLogP が高いイブプロフェンとナプロキセンは助溶剤設計の必要性を示唆しています。
PubChemPy で素早く分子群指標を洗い出すだけで、製剤や ADME 検討の初手が整いますね。
まとめ
今回は PubChemPy を紹介しました。
- Point 1: PubChemのREST APIをPythonオブジェクトにそのまま落とし込み、名称・CID・SMILESなど任意のキーでハイスピード検索できます。
- Point 2: 物性・構造・同義語・外部IDを一度に取得できるので、pandasや機械学習の前処理が一気に進みます。
- Point 3: レート制限と欠損値に注意しながら、Lipinskiチェックや候補分子のフィルタリングをノートブック内で完結できます。
PubChem という信頼性の高いデータ源を最短ルートで手軽に扱えるようになるので、ぜひ試してみてください。
Discussion