はじめに
以前、mordredで1分子1記述子の計算を行うにより、mordredで1分子毎に記述子を計算する方法を調べた。これにより使いたい記述子だけを計算することができるようになった。
しかし、この方法で、大量に分子がある場合に特定の記述子だけを計算させようとすると以下の点で都合が悪い。
計算が並列化されずに遅い。CalculatorクラスのpandasメソッドはCPUコア数を指定すると、いい感じで並列計算をしてくれる。
計算結果をDataFrameの形式で得ることができないため、余計な手間がかかる
今回は大量に分子がある場合に、使いたい記述子だけを指定して、Calculatorクラスのpandasメソッドにより記述子計算を行う方法を調べた。
環境
- mordred 1.1.2
ソース
こんな感じで行ける。
from mordred import Calculator, descriptors
calc_dummy = Calculator(descriptors, ignore_3D=False)
my_desc_names = ["SpAD_A", "SRW10"]
my_descs = []
for i, desc in enumerate(calc_dummy.descriptors):
if desc.__str__() in my_desc_names:
my_descs.append(desc)
calc_real = Calculator(my_descs, ignore_3D=False)
df = calc_real.pandas(mols, nproc=3)
df.to_csv(args.output + "/mordred.csv")
解説
Calculatorクラスのソースをよく読んでみると、コンストラクタの引数に、descriptorsではなく、Descriptorクラスのインスタンスのリストを指定できるようになっている。
これを利用し、自分の計算させたい記述子の名前(my_desc_namesに記載)から、そのインスタンスをピックアップしてリストに入れる。
calc_dummyでダミーのCalculatorオブジェクトを生成している理由は、記述子のインスタンスの一覧を取得するためだ。(もっとエレガントなやり方が絶対あるはずなのでソースをハックしてみてほしい)。
次に記述子のインスタンスのリストを、Calculatorクラスのコンストラクタの引数に与えてCalculatorオブジェクトを作成する。
最後に、このCalculatorオブジェクトにより計算を行うと、指定した記述子のみの計算結果が格納されたDataFrameが得られる。
おわりに
今回のノウハウは、予測モデルを作成した後、予測だけを行う場合にかなり有用だ。というのも予測だけを行う場合は、予測モデルに利用された記述子のみを計算すればよいからだ。特に数万、数十万といった化合物のリストに対して計算する場合、処理時間に大きな差がでると考えている。