XenonPyをゼロから理解していく①

## はじめに
**XenonPyの概要とチュートリアルの一部（Sample dataとData access）について解説します。**

- XenonPyのチュートリアルのDescriptor calculationの解説について[こちら](https://qiita.com/oki_kosuke/items/99c37cfb67b46c2fbb1b)
- XenonPyのチュートリアルのVisualizationの解説について[こちら](https://qiita.com/oki_kosuke/items/9fbfd5179897282d120b)

※マテリアルズインフォマティクス関係の内容を他にも投稿していますので、よろしければ[こちら](https://qiita.com/oki_kosuke/items/34b1071224953776c211#%E6%8A%95%E7%A8%BF%E4%B8%80%E8%A6%A7)の一覧から他の投稿も見て頂けますと幸いです。

## XenonPyとは？
**様々な化合物のデータベースかつMIに有用な予測モデルが含まれたツールで、MaterialsProjectで取得した記述子から新たに記述子を生成する際に使用することができます。**

[XenonPy](https://xenonpy.readthedocs.io/en/latest/index.html)には、低分子、高分子、無機材料の45種類の特性を対象に約14万個の機械学習の予測モデルが構築されています。マテリアルズインフォマティクスの様々なタスクを実行する機械学習アルゴリズムが実装されており、ユーザーはAPI経由でXenonPy.MDLの訓練済みモデルを再利用（転移学習）し、材料設計の様々なワークフローを構築可能です。

## インストール方法
インストール方法は[こちら](https://xenonpy.readthedocs.io/en/latest/installation.html)に記載があります。XenonPyはPyTorch,pymatgen,rdkitの3つライブラリと依存関係にあるので、XenonPyインストール前にはこれら3つのインストールが必要となります。

## 使い方
[公式チュートリアル](https://xenonpy.readthedocs.io/en/latest/tutorial.html)に従って、XenonPyの使い方を解説していきます。

### 環境
- conda 4.9.2
- python 3.7.1
- xenonpy 0.4.4

### Sample data
まずはサンプルデータを取得していきます。[Materials Project](https://materialsproject.org/)から1000個の無機化合物をランダムに選び出します。Materials Projectからデータを取得するにはAPIキーが必要となります。なお、Materials Projectに関しては[こちら](https://qiita.com/oki_kosuke/items/6be3d1dbe1c7e16a5276)の投稿に概要を記載しています。

```python
from xenonpy.datatools import preset
preset.build('mp_samples', api_key='Your API')
```

![sample_data.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/ee55f97a-3627-a8be-73f7-4f13b0ea4c52.png)


### Data access
データはDatasetオブジェクトとして容易に取り扱うことができます。（実例がないとどんな感じでデータを取り扱っていくのかいまいちイメージできませんでした…）

#### Dataset
set1にdata1.csv, data1.pd.xz, data1.pkl.zが存在し、set2にata2.csv, data2.pd.xz, data2.pkl.zが存在するとします。以下のコードでset1とset2の全てのファイルを含むDatasetオブジェクトが作成可能です。

```python
from xenonpy.datatools import Dataset
dataset = Dataset('/set1', '/set2')
dataset
```
```:出力結果
<Dataset> includes:
"data1": C:\set1\data1.pd.xz
"data2": C:\set2\data2.pd.xz
```

公式ページでは以下のコードでデータの取り扱いが可能とのことですが、エラーが出て実行できずでした。

```python
dataset.dataframe.data1
```
```:出力結果
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-10-bdc1f28a8254> in <module>
----> 1 dataset.dataframe.data1

~\AppData\Local\Continuum\anaconda3\lib\site-packages\xenonpy\datatools\dataset.py in __getattr__(self, name)
    175         if name in self.__extension__:
    176             return self.__class__(*self._paths, backend=name, prefix=self._prefix)
--> 177         raise AttributeError("'%s' object has no attribute '%s'" % (self.__class__.__name__, name))

AttributeError: 'Dataset' object has no attribute 'dataframe'
```

以下のコードでdata1を読み込むことができました。

```python
dataset.data1
```

![data1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/d8267c2d-ac86-4939-5de6-187edc4c87b6.png)

pd, csv, xlsx(xls), pklのファイル形式を読み込むことが可能であり、backendのパラメータで以下のように指定します。

```python
dataset = Dataset('set1', 'set2', backend='csv')
dataset.data1
```

![data1_csv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/86d94231-4d1b-4161-14fa-b413a59366d7.png)

### Preset
XenonPyでは"elements"と"elements_completed"の2つの特性データが使用可能です。これらのデータはmendeleev,pymatgen,CRC Hand Book,Magpieから収集されています。

- elements：118元素、74個の特徴量が含まれたデータ
- elements_completed：94元素（HからPu）、58個の特徴量が含まれたデータ

2021年5月現在、存在が確認されている元素の種類は118個であり、**"elements"は欠損値や計算値もありながら全ての元素の情報を含んでいるデータと言えます。**elementsやelements_completedの詳細やデータに含まれる特徴量についての詳細は[こちら](https://xenonpy.readthedocs.io/en/latest/features.html#data-access)を参考にして下さい。

では、まずelementsについて見ていきます。

```python
from xenonpy.datatools import preset
preset.elements
```

![elements.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/aae2a016-dacb-80a2-6156-f6fa6b2dee59.png)

elementsデータに含まれる特徴量を確認します。

```python
preset.elements.columns
```
```:出力結果
Index(['atomic_number', 'atomic_radius', 'atomic_radius_rahm', 'atomic_volume',
       'atomic_weight', 'boiling_point', 'brinell_hardness', 'bulk_modulus',
       'c6', 'c6_gb', 'covalent_radius_bragg', 'covalent_radius_cordero',
       'covalent_radius_pyykko', 'covalent_radius_pyykko_double',
       'covalent_radius_pyykko_triple', 'covalent_radius_slater', 'density',
       'dipole_polarizability', 'electron_negativity', 'electron_affinity',
       'en_allen', 'en_ghosh', 'en_pauling', 'first_ion_en', 'fusion_enthalpy',
       'gs_bandgap', 'gs_energy', 'gs_est_bcc_latcnt', 'gs_est_fcc_latcnt',
       'gs_mag_moment', 'gs_volume_per', 'hhi_p', 'hhi_r',
       'heat_capacity_mass', 'heat_capacity_molar', 'icsd_volume',
       'evaporation_heat', 'gas_basicity', 'heat_of_formation',
       'lattice_constant', 'linear_expansion_coefficient', 'mendeleev_number',
       'melting_point', 'metallic_radius', 'metallic_radius_c12',
       'molar_volume', 'num_unfilled', 'num_valance', 'num_d_unfilled',
       'num_d_valence', 'num_f_unfilled', 'num_f_valence', 'num_p_unfilled',
       'num_p_valence', 'num_s_unfilled', 'num_s_valence', 'period',
       'poissons_ratio', 'proton_affinity', 'specific_heat',
       'thermal_conductivity', 'vdw_radius', 'vdw_radius_alvarez',
       'vdw_radius_batsanov', 'vdw_radius_bondi', 'vdw_radius_dreiding',
       'vdw_radius_mm3', 'vdw_radius_rt', 'vdw_radius_truhlar',
       'vdw_radius_uff', 'sound_velocity', 'vickers_hardness',
       'Polarizability', 'youngs_modulus'],
      dtype='object')
```

<br>
次に、elements_completedについて見ていきます。

```python
preset.elements_completed
```

![elements_completed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/744f88f7-7559-10ec-5590-18f442a3c157.png)

elements_completedデータに含まれる元素を確認します。95番目のAm（アメリシウム）～118番目のOg（オガネソン）が含まれていないことが分かります。

```python
preset.elements_completed.index
```
```：出力結果
Index(['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne', 'Na', 'Mg', 'Al',
       'Si', 'P', 'S', 'Cl', 'Ar', 'K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn',
       'Fe', 'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br', 'Kr', 'Rb',
       'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Tc', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In',
       'Sn', 'Sb', 'Te', 'I', 'Xe', 'Cs', 'Ba', 'La', 'Ce', 'Pr', 'Nd', 'Pm',
       'Sm', 'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er', 'Tm', 'Yb', 'Lu', 'Hf', 'Ta',
       'W', 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At',
       'Rn', 'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'U', 'Np', 'Pu'],
      dtype='object')
```

<br>
elements_completedデータに含まれる元素を確認します。'brinell_hardness'や'covalent_radius_bragg'などのelementsには含まれていた特徴量がないことが分かります。

```python
preset.elements_completed.columns
```
```：出力結果
Index(['atomic_number', 'atomic_radius', 'atomic_radius_rahm', 'atomic_volume',
       'atomic_weight', 'boiling_point', 'bulk_modulus', 'c6_gb',
       'covalent_radius_cordero', 'covalent_radius_pyykko',
       'covalent_radius_pyykko_double', 'covalent_radius_pyykko_triple',
       'covalent_radius_slater', 'density', 'dipole_polarizability',
       'electron_negativity', 'electron_affinity', 'en_allen', 'en_ghosh',
       'en_pauling', 'first_ion_en', 'fusion_enthalpy', 'gs_bandgap',
       'gs_energy', 'gs_est_bcc_latcnt', 'gs_est_fcc_latcnt', 'gs_mag_moment',
       'gs_volume_per', 'hhi_p', 'hhi_r', 'heat_capacity_mass',
       'heat_capacity_molar', 'icsd_volume', 'evaporation_heat',
       'heat_of_formation', 'lattice_constant', 'mendeleev_number',
       'melting_point', 'molar_volume', 'num_unfilled', 'num_valance',
       'num_d_unfilled', 'num_d_valence', 'num_f_unfilled', 'num_f_valence',
       'num_p_unfilled', 'num_p_valence', 'num_s_unfilled', 'num_s_valence',
       'period', 'specific_heat', 'thermal_conductivity', 'vdw_radius',
       'vdw_radius_alvarez', 'vdw_radius_mm3', 'vdw_radius_uff',
       'sound_velocity', 'Polarizability'],
      dtype='object')
```

このように各元素に対する様々な特徴量を取得できることが分かりました。この特徴量をインプット情報として材料探索に活用できそうですね。

## まとめ
**XenonPyの概要とチュートリアルの一部（Sample dataとData access）について解説しました。**続編は[こちら](https://qiita.com/oki_kosuke/items/99c37cfb67b46c2fbb1b)です。

### 参考
- [XenonPy公式ページ](https://xenonpy.readthedocs.io/en/latest/index.html)
- [国立研究開発法人 物質・材料研究機構(NIMS)](https://www.nims.go.jp/news/press/2019/09/201910010.html)