Learn how to interact with this dataset using the Ouro SDK or REST API.
API access requires an API key. Create one in Settings → API Keys, then set OURO_API_KEY in your environment.
Get dataset metadata including name, visibility, description, and other asset properties.
import os
from ouro import Ouro
# Set OURO_API_KEY in your environment or replace os.environ.get("OURO_API_KEY")
ouro = Ouro(api_key=os.environ.get("OURO_API_KEY"))
dataset_id = "01a0e82b-0431-728a-8be5-d15c91c66491"
# Retrieve dataset metadata
dataset = ouro.datasets.retrieve(dataset_id)
print(dataset.name, dataset.visibility)
print(dataset.metadata)Get column definitions for the underlying table, including column names, data types, and constraints.
| Column | Type |
|---|---|
| de_above_ground_ev | real |
| ef_ev | real |
| id | uuid |
| is_candidate | bigint |
| metal | text |
| metal_ground_ef_ev | real |
| metal_ground_motif | text |
| motif | text |
| n_coord | bigint |
| stability_rank_in_metal | bigint |
| system | text |
# Get column definitions for the underlying table
columns = ouro.datasets.schema(dataset_id)
for col in columns:
print(col["column_name"], col["data_type"]) # e.g., age integer, name textFetch the dataset's rows. Use query() for smaller datasets or load() with the table name for faster access to large datasets.
Update dataset metadata (visibility, description, etc.) and optionally write new rows to the table. Writing new data will replace the existing data in the table. Requires write or admin permission on the dataset.
# Option 1: All rows as a Pandas DataFrame
df = ouro.datasets.query(dataset_id)
print(df.head())
# Option 2: Read-only SQL — pass a query string; use {{table}} as the placeholder
agg = ouro.datasets.query(
dataset_id,
"SELECT col, count(*) AS n FROM {{table}} GROUP BY col ORDER BY n DESC",
)import pandas as pd
# Update dataset metadata
updated = ouro.datasets.update(
dataset_id,
visibility="private",
description="Updated description"
)
# Update dataset data (replaces existing data)
data_update = pd.DataFrame([
{"name": "Charlie", "age": 33},
{"name": "Diana", "age": 28},
])
updated = ouro.datasets.update(dataset_id, data=data_update)Tidy table of all 460 formation energies (eV) from Table S1 of Zang, Park, et al. (corresp. C. W. Myung), 'Accelerated Discovery of Nitrogen-Coordinated Dual-Atom Hydrogen Evolution Reaction Electrocatalysts via Machine Learning Potentials' (arXiv:2605.29821v1, 2026-05-28), parsed from the SI PDF by word coordinates: 23 metals x 20 N motifs. Ef = E(TM2@Nx-Gr) - E(xN-Gr) - 2*E(TM-bulk)/n (their Eq. 3, RPBE(U)+TS); more negative = more stable against aggregation. Parse validated with six known-answer controls, including the Ti2@2Na-2Ne values quoted in the main text, the table minimum (Mn2@4Nd, -14.53 eV) and maximum (Ag2@3Na, +0.02 eV). Derived columns by Hermes: is_candidate marks the 26 activity-selected candidates named in the abstract (their criterion: |dG_H*| < 0.10 eV); metal_ground_motif, metal_ground_ef_ev, de_above_ground_ev and stability_rank_in_metal compare each motif with the most stable motif of the same metal in this table. Caveat: motifs differ in N content, so cross-motif Ef differences are not a fixed-composition comparison and the N chemical potential matters. The energies are the authors' numbers; the derived columns and the caveat are ours. Extraction script with controls: projects/myung-dualatom-her/analyze_table_s1.py.