pubchem から化合物情報を一気に取得する

#目的
化合物の基本的な情報（化合物名やCASなど）から、その化合物の情報（カノニカルSMILESや、分子量などの基本的な記述子）を取得する。
（SMILES情報があれば記述子を計算→化合物の物性予測の変数として使用できるが、SMILESを収集するのが面倒なので自動で一気に取得したい）
#前準備
pubchemのモジュールをインストールしておく

```python:
pip install pubchempy
```

#単一化合物情報の取得
とりあえず一つの化合物の情報を取得する方法

```python:
import pubchempy as pcp

#取得したい情報のリストを定義
properties = ['MolecularFormula', 'MolecularWeight', 'CanonicalSMILES', 'IUPACName']

#CAS番号から情報を取得する
result = pcp.get_properties(properties, '64-17-5', 'name')

#化合物ごとにレコードを記録した辞書のリストが返される。
print(result)
"""
output
[{'CID': 702,
  'MolecularFormula': 'C2H6O',
  'MolecularWeight': 46.07,
  'CanonicalSMILES': 'CCO',
  'IUPACName': 'ethanol'}]
"""
```

#複数化合物情報の取得
リストに格納された複数のCAS番から化合物情報を取得してpandasのデータフレームに格納する。

```python:
import pubchempy as pcp
import pandas as pd

#情報を取得したい化合物のCAS番号のリストと取得したい情報のリストを定義
properties = ['MolecularFormula','CanonicalSMILES', 'IUPACName']
cas_list = ['100-21-0','1002-62-6','10028-15-6','1002-84-2','1002-89-7', '999-9-9']

#pubchem に情報のない化合物はエラーとなるので、エラーが発生しても途中で終了させずに処理を継続できるようにtry文を使用
df = pd.DataFrame()
for cas in cas_list:
    try:
        temp = pcp.get_properties(properties, cas, 'name',as_dataframe=True)
        #as_dataframe=True とすることでpandas dataframe として情報を取得可能
        temp['CAS'] = cas
        df = pd.concat([df,temp],axis=0,join='outer',sort=True)
    except:
        pass
```
		
上記コードから取得できたデータフレーム
（CAS:999-9-9 はpubchemにデータがないので省かれている）

| CID     | CAS        | CanonicalSMILES                   | IUPACName             | MolecularFormula |
|:-------:|:----------:|:---------------------------------:|:---------------------:|:----------------:|
| 7489    | 100-21-0   | C1=CC(=CC=C1C(=O)O)C(=O)O         | terephthalic acid     | C8H6O4           |
| 4457968 | 1002-62-6  | CCCCCCCCCC(=O)[O-].[Na+]          | sodium;decanoate      | C10H19NaO2       |
| 24823   | 10028-15-6 | [O-][O+]=O                        | ozone	           | O3               |
| 13849   | 1002-84-2  | CCCCCCCCCCCCCCC(=O)O              | pentadecanoic acid    | C15H30O2         |
| 9861187 | 1002-89-7  | CCCCCCCCCCCCCCCCCC(=O)[O-].[NH4+] | azanium;octadecanoate | C18H39NO2        |

## 付録）検索に使用する情報まとめ
- name：化合物名, CAS番
- formula：分子式
- smiles：SMILES
- inchi：InChI（世界共通で使える化合物の標準名）
- sdf：sdf（化合物の表記法）
- cid：CID（pubchemのデータベース内で化合物に割り当てられているID）

## 付録）取得できる情報まとめ
（*随時、情報を追加していく）
RDKitやmordredで分子記述子や構造記述子を計算しなくても、これらの変数である程度の予測はできそう。

- MolecularFormula：分子式
- MolecularWeight：分子量
- CanonicalSMILES：カノニカルSMILES
- IsomericSMILES ：同位体や不斉中心についての記述を含むSMILES
- InChI：InChI（世界共通で使える化合物の標準名）
- InChIKey：化合物のデジタル表現
- IUPACName：IUPAC名
- XLogP：[水オクタノール分配係数](https://future-chem.com/logp/)
- ExactMass：分子量
- MonoisotopicMass
- TPSA：[Topological Polar Surface Area（トポロジカル極性表面積)](https://future-chem.com/tpsa/)
- Complexity
- Charge
- HBondDonorCount
- HBondAcceptorCount
- RotatableBondCount
- HeavyAtomCount
- IsotopeAtomCount
- AtomStereoCount 
- DefinedAtomStereoCount 
- UndefinedAtomStereoCount
- BondStereoCount
- DefinedBondStereoCount 
- UndefinedBondStereoCount
- CovalentUnitCount
- Volume3D
- XStericQuadrupole3D
- YStericQuadrupole3D 
- ZStericQuadrupole3D 
- FeatureCount3D
- FeatureAcceptorCount3D 
- FeatureDonorCount3D 
- FeatureAnionCount3D
- FeatureCationCount3D
- FeatureRingCount3D
- FeatureHydrophobeCount3D
- ConformerModelRMSD3D
- EffectiveRotorCount3D
- ConformerCount3D


#参考HP
- [公式HP](https://pubchempy.readthedocs.io/en/latest/#)
- [化合物データベースPubChemをpythonで使いこなす（化学のススメ）](https://future-chem.com/pub-chem-py/)