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

## はじめに
**XenonPyのチュートリアルのDescriptor calculationについて解説します。**

- XenonPyの概要とチュートリアルの一部（Sample dataとData access）の解説については[こちら](https://qiita.com/oki_kosuke/items/516bd425bcf1edfb81b6)
- 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)の一覧から他の投稿も見て頂けますと幸いです。

## 記述子計算
[公式ドキュメント](https://xenonpy.readthedocs.io/en/latest/tutorials/2-descriptor.html)の"Descriptor calculation"に沿って解説します。

- XenonPyには記述子計算のインターフェイスが含まれています
- 4つのタイプに分類される計15個のFeaturizerを計算することができる

この投稿では"Composition"と"Structure"タイプの記述子計算について解説いたします。


### 環境

- conda 4.9.2
- python 3.7.1
- xenonpy 0.4.4


### Compositional descriptors（組成に関する記述子）
XenonPyでは58個の元素レベルの特徴量（"elements_completed"）から290個の組成に関する特徴量（compositional features）を計算することが可能です。

```python
from xenonpy.descriptor import Compositions
cal = Compositions()
cal
```
```:出力結果
Compositions:
  |- composition:
  |  |- Counting
  |  |- WeightedAverage
  |  |- WeightedSum
  |  |- WeightedVariance
  |  |- GeometricMean
  |  |- HarmonicMean
  |  |- MaxPooling
  |  |- MinPooling
```

Compositionsには、Countingをはじめとする8つのfeaturizerが含まれていることが分かります。それぞれのfeaturizerの定義は[こちら](https://xenonpy.readthedocs.io/en/latest/features.html#descriptor-calculation)を参考にして下さい。この計算機を使うことで化合物の組成に関する情報を得ることができます。
サンプルデータを例に使い方を以下に示します。

```python
from xenonpy.datatools import preset
samples = preset.mp_samples
comps = samples['composition']
descriptor = cal.transform(comps)
descriptor
```

![descripter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/115ccca6-876d-39da-4919-a73ea4364dfc.png)


807個の化合物それぞれに対して、290個の記述子が得られたことが分かります。
ここで、変換前のサンプルデータを確認してみます。

```python
samples
```

![samples.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/f3445248-f156-9979-24b2-38148206d32d.png)


次に.transformに入力したデータを確認してみます。

```python
samples['composition']
```
```:出力結果
mp-1008807                {'Rb': 1.0, 'Cu': 1.0, 'O': 1.0}
mp-1009640                           {'Pr': 1.0, 'N': 1.0}
mp-1016825                {'Hf': 1.0, 'Mg': 1.0, 'O': 3.0}
mp-1017582                {'La': 1.0, 'Pt': 3.0, 'C': 1.0}
mp-1021511                           {'Cd': 1.0, 'S': 1.0}
                                  ...                     
mp-9846                  {'Rb': 2.0, 'Ca': 2.0, 'Sb': 2.0}
mvc-4727                 {'Ca': 4.0, 'Te': 2.0, 'O': 10.0}
mvc-6767        {'Zn': 2.0, 'Ni': 1.0, 'W': 1.0, 'O': 6.0}
mvc-6973                 {'Cu': 6.0, 'W': 12.0, 'O': 42.0}
mvc-89        {'Ca': 4.0, 'Nb': 4.0, 'Cu': 2.0, 'O': 16.0}
Name: composition, Length: 807, dtype: object
```

transformメソッドはpymatgen.Structureオブジェクトか上記のような組成の辞書形式のデータ（例：{‘H’:2,‘O’:1}）を受け取ることができます。ですので、以下のように自ら指定する任意の化合物に関して記述子を得ることが可能です。例として、H<sub>2</sub>o、LiF、CO<sub>2</sub>の記述子を取得してみます。

```python
# 任意の化合物を定義
H2O = {'H': 2.0, 'O': 1.0}
LiF = {'Li': 1.0, 'F': 1.0}
CO2 = {'C': 1.0, 'O': 2.0}
# 辞書形式データをtransformメソッドに受け渡す
df = cal.transform([H2O, LiF, CO2])
df.index = ["H2O", "LiF", "CO2"]
df
```

![df.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/3992ede9-70b9-7ad2-630f-068cf484c7cc.png)


### Structural descriptors（構造に関する記述子）
XenonPyでは構造に関する特徴量も計算可能です。

```python
from xenonpy.descriptor import Structures
cal = Structures()
cal
```
```:出力結果
Structures:
  |- structure:
  |  |- RadialDistributionFunction
  |  |- OrbitalFieldMatrix
```

Structuresには、RadialDistributionFunction(RDF:動径分布関数)とOrbitalFieldMatrix(OFM)の2つのfeaturizerが含まれていることが分かります。Compositional descriptorsと同様にサンプルデータに対して適用してみます。

```python
descriptor = cal.transform(samples)
descriptor
```

![descripter2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/a9c1c9ec-2fbc-4b20-db67-3d022db0c455.png)


公式ドキュメントを参照すると[matminer](https://hackingmaterials.lbl.gov/matminer/)と互換性があると記述があります。


## まとめ
**XenonPyのチュートリアルのDescriptor calculationについて解説しました。**続編は[こちら](https://qiita.com/oki_kosuke/items/9fbfd5179897282d120b)です。