Materials Project API에서 데이터 쿼리하는 법
설명
Materials Project (MP)는 무기물질에 대한 오픈소스 데이터베이스이다. MP API 클라이언트를 사용하면 Python에서 편리하게 MP 데이터베이스에 접근하여 데이터를 쿼리할 수 있다.
id로 찾기
우선 본인의 API Key가 필요하므로 회원가입을 먼저 진행한다. mpr.materials.summary.search()의 입력으로 원하는 물질의 id나 물성에 관한 조건을 넣어 데이터를 가져올 수 있다. 이제 다음과 같은 코드로 mp-2209와 mp-29658라는 물질에 대한 요약 정보를 가져올 수 있다. 이렇게 불러온 docs는 MPDataDoc 객체들의 리스트이며, 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']
)

저희들의 저서 「줄리아 프로그래밍」이 2024 세종도서 학술부문에 선정되었습니다!

