GHCNh climate, ASOS archive, NWS CLI products, and deterministic settlement backtests, fetched on demand and written byte-stable to an optional local cache on first call, so research and backtest are identical, run after run.
1from mostlyright import weather 2 3# one row per LST settlement date 4df = weather.pairs("KNYC", "2025-01-06", "2025-01-12") 5df[["cli_high_f", "obs_high_f"]].describe()
NCEI hourly historical observations: the long record behind the climate normals.
Iowa Mesonet's full ASOS archive: every reported cycle, parsed and normalized.
Official daily climate text products: the source many contracts settle on.
Join climate + observations against the contract spec for a deterministic decision.
Calls fetch and normalize the upstream sources in your own runtime. The first call can
write a parquet (Python) or JSON envelope (Node) to an optional local cache at
~/.mostlyright. Subsequent calls in the same window are
local-only: no network, no drift. Your backtest in March reproduces exactly in September.
iem.archive, cli…). # written on first call, reused after cache/ ├─ NYC/2025-01.parquet # obs + cli ├─ AUS/2025-01.parquet └─ _manifest.json # schema + source ids # pin a single source (provenance) train = weather.obs("KNYC", ..., source="iem") validate_dataframe(train, "schema.observation.v1")
| Concern | Hand-rolled scrapers | Mostly Right |
|---|---|---|
| Reproducibility | drifts with live endpoints | byte-stable cache |
| Schema discipline | ad-hoc per source | schema.*.v1 + validator |
| Train / infer parity | silent corruption | fails loudly on mismatch |
| Python ↔ TypeScript | two codebases | byte-equivalent peers |