Install & Quickstart

Python client for the Aesops dataset API — install it and inspect a dataset's schema and summary stats in a few lines of Python, no API key required.

Browse the full catalog without any credentials. Load datasets directly into pandas, polars, or a DuckDB connection (with range-request pushdown, so only the row-groups you query are fetched).

Install

uv add aesops                  # core: httpx + duckdb
uv add 'aesops[pandas]'        # + pandas
uv add 'aesops[polars]'        # + polars
uv add 'aesops[pandas,polars]' # both

Requires Python 3.9+.

Quickstart

list() and load_dataset() always work without an API key — see Full catalog. Loading actual rows requires a key unless the dataset is keyless — see Loading data and the API's Authentication page.

Browse the catalog

from aesops import Client

# No key needed to browse — the full catalog is public
client = Client()

datasets = client.list(query="housing", license="MIT")
for ds in datasets:
    print(ds.slug, ds.row_count, ds.keyless)

Inspect a dataset's schema

# Fetch metadata + schema (works for any dataset, keyless or not)
ds = client.load_dataset("kenya-housing-prices")
print(ds.name, ds.row_count, ds.column_count)
for col in ds.detail.columns:
    print(col.name, col.dtype)

Summary statistics

describe() builds per-column summary stats from the metadata already fetched by load_dataset() — no extra network call, no API key needed.

print(ds.describe())
# ┌────────┬────────┬───────┬────────────┬────────┬────────┬─────────┬──────┬────────┬────────┬────────┐
# │ column │  dtype │ count │ null_count │ null_% │ unique │    mean │  std │    min │ median │    max │
# ├────────┼────────┼───────┼────────────┼────────┼────────┼─────────┼──────┼────────┼────────┼────────┤
# │   year │ number │   178 │          0 │    0.0 │     16 │ 2018.50 │ 4.30 │ 2011.0 │ 2018.50 │ 2026.0 │
# │  month │ string │   178 │          0 │    0.0 │     12 │     NaN │  NaN │    NaN │    NaN │    NaN │
# └────────┴────────┴───────┴────────────┴────────┴────────┴─────────┴──────┴────────┴────────┴────────┘

In a Jupyter/IPython notebook (or Zed's REPL), the same call renders as a bordered HTML table instead when it's the last expression in a cell. Want a real pandas.DataFrame for further chaining (.loc, filtering, etc.)?

ds.describe().to_frame()

Dataset summary

A compact overview — name, slug, description, AI insights, link to the dataset's Aesops page, and any linked community discussions. Also no network call, no API key needed.

print(ds.summary())

On this page