4. 材料数据库入门:Materials Project、OQMD、AFLOW等公共数据库介绍、API申请与使用、数据下载与预处理

做材料基因工程,说白了就是跟数据打交道。你想想看,没有数据,什么高通量计算、机器学习,全是空中楼阁。我个人习惯,拿到一个新课题,第一件事不是跑计算,而是先去数据库里翻一翻——看看有没有现成的数据能用。

今天咱们就聊聊几个主流的公共材料数据库。我会结合自己踩过的坑,手把手教你申请API、下载数据、做预处理。嗯,这里要注意,每个数据库的脾气都不一样,得顺着来。

4.1 三大主流公共数据库概览

目前学术界用得最多的,就是这三个:Materials Project、OQMD、AFLOW。我当年刚入行时,三个都试了一遍,最后发现各有千秋。

数据库 全称 数据量 特点 我的评价
Materials Project Materials Project ~15万种材料 界面友好,API成熟,社区活跃 新手首选,文档最全
OQMD Open Quantum Materials Database ~100万种材料 数据量大,侧重相图 做相图分析时我常用它
AFLOW Automatic FLOW for Materials Discovery ~300万种材料 自动化流程,数据标准化好 数据量大但检索稍慢

核心观点:别贪多。我建议新手先从Materials Project入手,等熟悉了数据格式和API调用逻辑,再扩展到其他数据库。一口吃不成胖子。

4.2 Materials Project:入门与API申请

Materials Project(简称MP)是劳伦斯伯克利国家实验室搞的。我个人觉得,它最大的优点是——文档写得像教科书一样清楚。

4.2.1 注册与API密钥申请

步骤其实很简单:

  1. 访问 materialsproject.org,用邮箱注册
  2. 登录后,点右上角头像 → "API"
  3. 生成你的API密钥(一串长字符串)
  4. 复制保存好,丢了就得重新生成

注意:我曾经犯过一个低级错误——把API密钥直接写死在代码里,然后不小心把代码上传到了公开的GitHub仓库。结果第二天就收到邮件说密钥被滥用。所以,永远不要把API密钥硬编码在代码里。用环境变量或者配置文件来管理。

4.2.2 使用Python调用MP API

MP官方提供了Python包 pymatgen,用起来非常顺手。我一般这样写:

# 安装:pip install pymatgen

from pymatgen.ext.matproj import MPRester

# 建议用环境变量读取API密钥
import os
API_KEY = os.getenv("MP_API_KEY")

with MPRester(API_KEY) as mpr:
    # 查询二氧化钛的所有结构
    structures = mpr.get_structures("TiO2")
    print(f"找到 {len(structures)} 个TiO2结构")
    
    # 获取具体材料的能带信息
    bandgap = mpr.get_bandgap_by_material_id("mp-1234")
    print(f"带隙: {bandgap} eV")

你看,代码就这么几行。但有个坑——API有频率限制。我刚开始做批量查询时,一口气发了上千个请求,结果直接被封了24小时。后来学乖了,每次请求之间加个 time.sleep(0.5)

4.3 OQMD:相图数据的宝库

OQMD是西北大学搞的。它的特点是数据量大,尤其擅长相图计算。我做合金设计时,经常去OQMD拉数据。

4.3.1 OQMD的API使用

OQMD的API稍微原始一点,没有MP那么优雅。但功能一样强大:

import requests
import json

# OQMD的RESTful API
base_url = "http://oqmd.org/oqmdapi"

# 查询Fe2O3的稳定性
response = requests.get(
    f"{base_url}/composition/Fe2O3",
    params={"stability": "true"}
)

if response.status_code == 200:
    data = response.json()
    print(f"Fe2O3的稳定性数据: {data}")
else:
    print(f"请求失败: {response.status_code}")

小技巧:OQMD返回的数据是JSON格式,但字段名比较晦涩。我建议你先用浏览器访问一次API,看看返回的字段结构,再写解析代码。省得来回调试。

4.4 AFLOW:自动化高通量数据的标杆

AFLOW是杜克大学搞的。它的数据量最大,而且所有数据都经过标准化的自动化流程处理。说白了,就是数据质量比较一致,不会出现「这个结构用这个参数算,那个结构用那个参数算」的情况。

4.4.1 AFLOW的数据下载方式

AFLOW支持两种方式:RESTful API和直接下载压缩包。我个人更推荐后者——如果你要下载大量数据的话。

# 使用aflow库(需要安装:pip install aflow)
from aflow import K

# 查询所有含Au的二元合金
entries = K(
    "species(Au)",
    "stoichiometry(2)",
    "catalog(icsd)"
).search()

print(f"找到 {len(entries)} 个含Au的二元合金")
for entry in entries[:5]:
    print(f"材料: {entry.compound}, 空间群: {entry.spacegroup}")

避坑指南:我曾经一次性下载了AFLOW中所有含稀土元素的化合物数据,大概有几十万个结构。结果本地硬盘直接爆了。所以,下载前一定要先估算数据量。AFLOW的API支持分页查询,每次取1000条,这样既不会把服务器搞崩,也不会撑爆你的硬盘。

4.5 数据下载与预处理实战

数据拿到手,不等于就能直接用。我见过太多人,从数据库拉了一堆数据,然后直接扔进机器学习模型——结果一塌糊涂。为什么?因为数据没洗干净。

4.5.1 数据清洗的常见问题

  • 缺失值处理:有些材料的带隙是空的,或者弹性常数只有部分值。我一般会直接剔除缺失严重的条目,或者用插值填充。
  • 单位统一:不同数据库的单位可能不一样。MP用eV,OQMD用kJ/mol。一定要统一。
  • 结构去重:同一个材料,不同数据库可能存了多个版本。需要根据空间群和晶格参数去重。

4.5.2 一个完整的预处理流程

下面是我常用的一个预处理脚本框架:

import pandas as pd
import numpy as np
from pymatgen.core import Structure

def preprocess_materials_data(raw_data):
    """
    材料数据预处理流水线
    """
    df = pd.DataFrame(raw_data)
    
    # 1. 剔除缺失关键字段的数据
    required_cols = ['band_gap', 'formation_energy', 'structure']
    df = df.dropna(subset=required_cols)
    
    # 2. 单位转换:如果能量单位是kJ/mol,转为eV/atom
    if 'energy_unit' in df.columns and df['energy_unit'].iloc[0] == 'kJ/mol':
        df['formation_energy'] = df['formation_energy'] / 96.485
    
    # 3. 提取结构特征
    def extract_features(structure_dict):
        struct = Structure.from_dict(structure_dict)
        return {
            'volume': struct.volume,
            'density': struct.density,
            'num_sites': struct.num_sites
        }
    
    features = df['structure'].apply(extract_features)
    df = pd.concat([df, features.apply(pd.Series)], axis=1)
    
    # 4. 去重:基于化学式和空间群
    df = df.drop_duplicates(subset=['formula', 'spacegroup'])
    
    return df

# 使用示例
clean_data = preprocess_materials_data(raw_data)
print(f"清洗前: {len(raw_data)} 条, 清洗后: {len(clean_data)} 条")

我的经验:预处理这一步,花的时间往往比数据下载还多。但千万别偷懒。数据质量决定了模型的天花板。我有个项目,刚开始用原始数据训练,准确率只有60%。后来花了两天时间做数据清洗,准确率直接跳到85%。

4.6 本章知识体系

下面这张图,是我自己总结的「材料数据库使用流程」。你照着这个思路走,基本不会迷路。

材料数据库使用流程 选择数据库 Materials Project 新手友好,文档齐全 OQMD 相图数据,量大管饱 AFLOW 数据标准化,质量高 注册账号 → 申请API密钥 数据下载(注意频率限制) 数据清洗与预处理

这张图把整个流程串起来了。你从左上角开始,先选数据库,然后申请API,下载数据,最后做预处理。每一步都有坑,但只要你按部就班来,就不会出大问题。

最后说一句:数据库只是工具,不是目的。我见过有人花了好几个月整理数据,结果发现数据本身就不适合他的研究问题。所以,动手之前,先想清楚你要解决什么问题。数据是为问题服务的,别搞反了。


专注资料整理