Overview

This started as the first stage of economicspace, my asteroid-mining profitability pipeline, which needs to know what every asteroid is, how big it is, and what it is made of. Nothing in the catalog knows what a mine is, though, and a merged asteroid table with honest provenance is useful to anyone doing population statistics or target selection, so I split it out as its own Python package. Each build is published as a frozen release: a gzipped CSV and a Parquet file of the same rows, plus a manifest with checksums. A result can name the exact release it used, which matters because JPL adds bodies every day and no two live builds are the same length. My asteroid-belt paper analysis runs on one of these releases.

Pipeline

A build runs five stages, and every rejected row is logged with its reason.

Build stages
Stage What happens
Fetch JPL SBDB, IMCCE SsODNet, NEOWISE V2.0 and MP3C
Merge Every row re-keyed onto JPL's designation for that body, duplicates combined, sources tagged
Derive A diameter from absolute magnitude and an estimated albedo for bodies nobody has measured
Validate Quality gates and physical limits, with every rejection counted
Enrich Bulk density, mass fractions and mineral phases per spectral class

Key highlights

The parts that took the most care.