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 이상이고 밴드갭이 2eV 이상인 물질을 찾고 싶다면 다음과 같이 코드를 작성한다. 그 결과 아래와 같이 총 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']
)