#はじめに
化合物データのフォーマットであるSDFをサクッとCSVに変換するスクリプトを書いてみた。
#仕様
- SDFの中のプロパティを読み取ってCSVの項目として出力
- 各化合物のプロパティが必ずしも同じプロパティを持っている必要はない(持っていないプロパティは空が出力)。
#ソース
SDF2CSVConvert.py
import pandas as pd
from rdkit import Chem
import argparse
from collections import defaultdict
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-input", type=str, required=True)
parser.add_argument("-output", type=str, required=True)
parser.add_argument("-save_name", action='store_true', help="store header line as _Name")
args = parser.parse_args()
# SDFの読み込み(1回目はパラメータ名を全て読み取る)
sdf_sup = Chem.SDMolSupplier(args.input)
Props = []
if args.save_name:
Props.append("_Name")
for mol in sdf_sup:
for name in mol.GetPropNames():
if name not in Props:
Props.append(name)
# データを格納するディクショナリ
param_dict = defaultdict(list)
# SDFの読み込み(2回目は化合物のパラメータを取得。なければエラー)
sdf_sup = Chem.SDMolSupplier(args.input)
for mol in sdf_sup:
# 名前の取得
for name in Props:
if mol.HasProp(name):
param_dict[name].append(mol.GetProp(name))
else:
param_dict[name].append(None)
# pandasで一気に変換
df = pd.DataFrame(data=param_dict)
df.to_csv(args.output, index=False)
if __name__ == "__main__":
main()
#解説
全化合物のプロパティを知るためにSDFを最初に読み込んでいる。そして2度目の読み込みで各化合物のプロパティの値を読みとっている。化合物がプロパティを持っていなければNoneを入れている。最後にプロパティを格納した辞書型をPandasに放り込んでCSVに出力した。
なお、-save_nameでSDFの1行目を"_Name"というプロパティで保存できるようにした。他の引数はソースを参照。
#出力例
RDKitのSolubilityデータだとこんな感じ。
_Name,ID,NAME,SOL,SMILES,SOL_classification
3-methylpentane,5,3-methylpentane,-3.68,CCC(C)CC,(A) low
"2,4-dimethylpentane",10,"2,4-dimethylpentane",-4.26,CC(C)CC(C)C,(A) low
1-pentene,15,1-pentene,-2.68,CCCC=C,(B) medium
cyclohexene,20,cyclohexene,-2.59,C1CC=CCC1,(B) medium
"1,4-pentadiene",25,"1,4-pentadiene",-2.09,C=CCC=C,(B) medium
cycloheptatriene,30,cycloheptatriene,-2.15,C1=CC=CC=CC1,(B) medium
1-octyne,35,1-octyne,-3.66,CCCCCCC#C,(A) low
ethylbenzene,40,ethylbenzene,-2.77,c1ccccc1CC,(B) medium
"1,3,5-trimethylbenzene",45,"1,3,5-trimethylbenzene",-3.4,c1c(C)cc(C)cc1C,(A) low
indane,50,indane,-3.04,c(c(ccc1)CC2)(c1)C2,(A) low
isobutylbenzene,55,isobutylbenzene,-4.12,c1ccccc1CC(C)C,(A) low
n-hexylbenzene,60,n-hexylbenzene,-5.21,c1ccccc1CCCCCC,(A) low