logo

Materials Project APIからデータをクエリする方法 📂データ確保

Materials Project APIからデータをクエリする方法

説明

Materials Project (MP)は無機物質に関するオープンソースのデータベースである。MP API クライアントを使用すると Python から便利に MP データベースへアクセスしてデータをクエリできる。

idで検索

まず自分のAPI Keyが必要なので会員登録を先に行う。mpr.materials.summary.search() の入力に欲しい物質の id や物性に関する条件を入れてデータを取得できる。以下のようなコードで mp-2209mp-29658 という物質についての概要情報を取得できる。こうして取得した docsMPDataDoc オブジェクトのリストであり、MPDataDoc の属性を通じて各物質の情報にアクセスできる。

from mp_api.client import MPRester

my_key = "asdfsfasdfdsfsafasf"

with MPRester(my_key) as mpr:
    docs = mpr.materials.summary.search(
        material_ids=["mp-2209", "mp-29658"]
    )

>>> type(docs[0])
<class 'mp_api.client.core.client.MPDataDoc'>

>>> [doc.material_id for doc in docs]
[MPID(mp-29658), MPID(mp-2209)]

>>> [doc.formula_pretty for doc in docs]
['ZrNiH3', 'CeGa2']

上の結果を見ると docs[0] は id が mp-29658 の $\ce{ZrNiH_{3}}$ に関する情報を含むドキュメントで、docs[1] は id が mp-2209 の $\ce{CeGa_{2}}$ に関する情報を含むドキュメントである。search に入力した material_ids の順序とは無関係であることに注意。docs[0] が含む全情報は次の通りである。

以下のように各 MPDataDoc から目的の属性にアクセスできる。

>>> doc = docs[0]

>>> doc.formula_pretty #화학식
'ZrNiH3'

>>> doc.nsites #원자수
10

>>> doc.band_gap #밴드갭
0.0

>>> doc.energy_per_atom #원자당 에너지
-5.438467611000001

>>> doc.is_metal #금속여부
True

利用可能なすべてのフィールドを確認するには mpr.materials.summary.available_fields を実行する。

>>> mpr.materials.summary.available_fields
['builder_meta', 'nsites', 'elements', 'nelements', 'composition', 'composition_reduced', 'formula_pretty', 'formula_anonymous', 'chemsys', 'volume', 'density', 'density_atomic', 'symmetry', 'property_name', 'material_id', 'deprecated', 'deprecation_reasons', 'last_updated', 'origins', 'warnings', 'structure', 'task_ids', 'uncorrected_energy_per_atom', 'energy_per_atom', 'formation_energy_per_atom', 'energy_above_hull', 'is_stable', 'equilibrium_reaction_energy_per_atom', 'decomposes_to', 'xas', 'grain_boundaries', 'band_gap', 'cbm', 'vbm', 'efermi', 'is_gap_direct', 'is_metal', 'es_source_calc_id', 'bandstructure', 'dos', 'dos_energy_up', 'dos_energy_down', 'is_magnetic', 'ordering', 'total_magnetization', 'total_magnetization_normalized_vol', 'total_magnetization_normalized_formula_units', 'num_magnetic_sites', 'num_unique_magnetic_sites', 'types_of_magnetic_species', 'bulk_modulus', 'shear_modulus', 'universal_anisotropy', 'homogeneous_poisson', 'e_total', 'e_ionic', 'e_electronic', 'n', 'e_ij_max', 'weighted_surface_energy_EV_PER_ANG2', 'weighted_surface_energy', 'weighted_work_function', 'surface_anisotropy', 'shape_factor', 'has_reconstructed', 'possible_species', 'has_props', 'theoretical', 'database_IDs']
五十音順にソート

band_gap

bandstructure

builder_meta

bulk_modulus

cbm

chemsys

composition

composition_reduced

database_IDs

decomposes_to

density

density_atomic

deprecated

deprecation_reasons

dos

dos_energy_down

dos_energy_up

e_electronic

e_ij_max

e_ionic

e_total

efermi

elements

energy_above_hull

energy_per_atom

equilibrium_reaction_energy_per_atom

es_source_calc_id

formation_energy_per_atom

formula_anonymous

formula_pretty

grain_boundaries

has_props

has_reconstructed

homogeneous_poisson

is_gap_direct

is_magnetic

is_metal

is_stable

last_updated

material_id

n

nelements

nsites

num_magnetic_sites

num_unique_magnetic_sites

ordering

origins

possible_species

property_name

shape_factor

shear_modulus

structure

surface_anisotropy

symmetry

task_ids

theoretical

total_magnetization

total_magnetization_normalized_formula_units

total_magnetization_normalized_vol

types_of_magnetic_species

uncorrected_energy_per_atom

universal_anisotropy

vbm

volume

warnings

weighted_surface_energy

weighted_surface_energy_EV_PER_ANG2

weighted_work_function

xas

フィルターで検索

特定の条件を満たす物質データを得たい場合は search の入力に条件を与えればよい。ただし注意点として MPDataDoc の属性名と search に入力する名前が完全に一致しないことがある。

例えば、原子数が4以上でバンドギャップが2 eV以上の物質を探したいなら次のようにコードを書く。結果として下記のように合計36,490件の構造データが得られる。

>>> with MPRester(my_key) as mpr:
...     docs = mpr.materials.summary.search(
...         num_sites=(4, None),
...         band_gap=(2, None)
...     )
Retrieving SummaryDoc documents: 100%|██████████████████████████████████████████| 36490/36490 [01:10<00:00, 517.50it/s]

search に使えるすべてのフィルターの一覧は以下の通りである。

五十音順にソート

band_gap

chemsys

crystal_system

density

deprecated

e_electronic

e_ionic

e_total

efermi

elastic_anisotropy

elements

energy_above_hull

equilibrium_reaction_energy

exclude_elements

formation_energy

formula

g_reuss

g_voigt

g_vrh

has_props

has_reconstructed

is_gap_direct

is_metal

is_stable

k_reuss

k_voigt

k_vrh

magnetic_ordering

material_ids

n

nelements

num_elements

num_sites

num_magnetic_sites

num_unique_magnetic_sites

piezoelectric_modulus

poisson_ratio

possible_species

shape_factor

spacegroup_number

spacegroup_symbol

surface_energy_anisotropy

theoretical

total_energy

total_magnetization

total_magnetization_normalized_formula_units

total_magnetization_normalized_vol

uncorrected_energy

volume

weighted_surface_energy

weighted_work_function

include_gnome

num_chunks

chunk_size

all_fields

fields

このうち fields で取得するデータに含める属性を指定できる。例えば上記の条件で見つかった物質群のうち、原子数、バンドギャップ、原子あたりのエネルギー、id だけを保存するなら次のようにコードを書く。すると MPDataDoc オブジェクトには指定した属性のみが含まれて保存され、残りの属性は fields_not_requested というリストに名前が格納される。

>>> with MPRester(my_key) as mpr:
...     docs = mpr.materials.summary.search(
...         num_sites=(4, None), band_gap=(2, None),
...         fields=["nsites", "band_gap", "energy_per_atom", "material_id"]
...     )
Retrieving SummaryDoc documents: 100%|█████████████████████████████████████████| 36490/36490 [00:11<00:00, 3171.23it/s]

>>> docs[0]
MPDataDoc<SummaryDoc>(
nsites=5,
material_id=MPID(mp-11107),
energy_per_atom=-8.354914895999997,
band_gap=3.522599999999999,
fields_not_requested=['builder_meta', 'elements', 'nelements', 'composition', 'composition_reduced', 'formula_pretty', 'formula_anonymous', 'chemsys', 'volume', 'density', 'density_atomic', 'symmetry', 'property_name', 'deprecated', 'deprecation_reasons', 'last_updated', 'origins', 'warnings', 'structure', 'task_ids', 'uncorrected_energy_per_atom', 'formation_energy_per_atom', 'energy_above_hull', 'is_stable', 'equilibrium_reaction_energy_per_atom', 'decomposes_to', 'xas', 'grain_boundaries', 'cbm', 'vbm', 'efermi', 'is_gap_direct', 'is_metal', 'es_source_calc_id', 'bandstructure', 'dos', 'dos_energy_up', 'dos_energy_down', 'is_magnetic', 'ordering', 'total_magnetization', 'total_magnetization_normalized_vol', 'total_magnetization_normalized_formula_units', 'num_magnetic_sites', 'num_unique_magnetic_sites', 'types_of_magnetic_species', 'bulk_modulus', 'shear_modulus', 'universal_anisotropy', 'homogeneous_poisson', 'e_total', 'e_ionic', 'e_electronic', 'n', 'e_ij_max', 'weighted_surface_energy_EV_PER_ANG2', 'weighted_surface_energy', 'weighted_work_function', 'surface_anisotropy', 'shape_factor', 'has_reconstructed', 'possible_species', 'has_props', 'theoretical', 'database_IDs']
)