#はじめに
SymPyで関数のハードコーディングから解放されるでは、cos, sin, expなど単純な関数式を外出しにして、関数のハードコーディングをせずに済む方法について記載した。
今回条件分岐をやってみる。
#やり方
Piecewise関数を使えばよい。
例えば、値が0より小さければ、0、0以上であれば1にするという処理を考えて見る。SymPyでは、こんな式で定義することができるようだ。
Piecewise((0, x < 0), (1, x >= 0))
#前回のコマンドを使ってできるか確認
入力データ
前回と一緒
CMPD_CHEMBLID,exp,smiles
CHEMBL596271,3.54,Cn1c(CN2CCN(CC2)c3ccc(Cl)cc3)nc4ccccc14
CHEMBL1951080,-1.18,COc1cc(OC)c(cc1NC(=O)CSCC(=O)O)S(=O)(=O)N2C(C)CCc3ccccc23
CHEMBL1771,3.69,COC(=O)[C@@H](N1CCc2sccc2C1)c3ccccc3Cl
CHEMBL234951,3.37,OC[C@H](O)CN1C(=O)C(Cc2ccccc12)NC(=O)c3cc4cc(Cl)sc4[nH]3
CHEMBL565079,3.1,Cc1cccc(C[C@H](NC(=O)c2cc(nn2C)C(C)(C)C)C(=O)NCC#N)c1
CHEMBL317462,3.14,OC1(CN2CCC1CC2)C#Cc3ccc(cc3)c4ccccc4
CHEMBL1951182,-.72,COc1cc(OC)c(cc1NC(=O)CCC(=O)O)S(=O)(=O)NCc2ccccc2N3CCCCC3
##関数定義ファイル
こんな感じ。記載方法は前回を参照してほしい。
exp,"Piecewise((0, x < 0), (1, x >= 0))",CLASS
出力結果
CMPD_CHEMBLID,exp,smiles,CLASS
CHEMBL596271,3.54,Cn1c(CN2CCN(CC2)c3ccc(Cl)cc3)nc4ccccc14,1.0
CHEMBL1951080,-1.18,COc1cc(OC)c(cc1NC(=O)CSCC(=O)O)S(=O)(=O)N2C(C)CCc3ccccc23,0.0
CHEMBL1771,3.69,COC(=O)[C@@H](N1CCc2sccc2C1)c3ccccc3Cl,1.0
CHEMBL234951,3.37,OC[C@H](O)CN1C(=O)C(Cc2ccccc12)NC(=O)c3cc4cc(Cl)sc4[nH]3,1.0
CHEMBL565079,3.1,Cc1cccc(C[C@H](NC(=O)c2cc(nn2C)C(C)(C)C)C(=O)NCC#N)c1,1.0
CHEMBL317462,3.14,OC1(CN2CCC1CC2)C#Cc3ccc(cc3)c4ccccc4,1.0
CHEMBL1951182,-0.72,COc1cc(OC)c(cc1NC(=O)CCC(=O)O)S(=O)(=O)NCc2ccccc2N3CCCCC3,0.0
ちゃんと計算できているようだ。
#おわりに
今回は1変数のみからなる条件式だったが、x1の値に応じてx2、x3、x4のいずれかを返すといった複数の変数による複雑な演算も可能だ。可能性は無限大なので試してみよう。