Agent skill

Owid Catalog

by owid in owid/etl

Access Our World in Data from Python with the owid-catalog library: load chart data, catalog tables or individual indicators as pandas DataFrames that carry their own units, descriptions, sources…

MITAuto-check passedData & Analytics

Install Owid Catalog

skills CLI
$ npx skills add owid/etl --skill owid-catalog -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install owid/etl owid-catalog --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/owid/etl.git skills-src && mkdir -p .claude/skills && cp -r skills-src/lib/catalog/skills/owid-catalog .claude/skills/owid-catalog && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
owid-catalog
GitHub stars
159
Token cost
~2.3k tokens
SKILL.md length
686 words
Files
1
Skills in repo
35
Repo updated
First seen
Licence
MIT

At a glance

Access Our World in Data from Python with the owid-catalog library: load chart data, catalog tables or individual indicators as pandas DataFrames that carry their own units, descriptions, sources…

  • The work happens in Python
  • SKILL.md covers Installation, Quick start, Plain-text output and Charts, plus 5 more sections
  • Calls uv and pip; reaches ourworldindata.org
  • A notebook (pandas

What it does

Owid Catalog is an agent skill from owid/etl. Access Our World in Data from Python with the owid-catalog library: load chart data, catalog tables or individual indicators as pandas DataFrames that carry their own units, descriptions, sources and citations. Use this skill whenever the work happens in Python or a notebook (pandas, a uv script, matplotlib, parquet); whenever you need an indicator's metadata, units or codebook; whenever you need dimensions that published charts flatten away, such as sex, age group or projection variant; or whenever you need to…

Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Data & Analytics, covering DataFrames and Data visualization. It works with Python, pandas, GitHub and Matplotlib. The repository describes itself as: A compute graph for loading and transforming OWID's data. The licence is MIT.

When your agent uses it

  • The work happens in Python
  • A notebook (pandas
  • Whenever you need an indicators metadata
  • Whenever you need dimensions that published charts flatten away

Example prompts

  • “/owid-catalog”

Requirements

  • Python 3

What it can do on your machine

Read from SKILL.md and the folder at commit 70c9705. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • uv
    • pip

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • ourworldindata.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Owid Catalog loads about 2.3k tokens when it runs. Until then it costs about 192 tokens; SKILL.md has 686 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~192
When it runs · the whole SKILL.md, loaded when a task matches
~2.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from owid/etl at commit 70c9705, republished under its MIT licence (© owid). 686 words, ~2,307 tokens.

Download SKILL.mdSave it as .claude/skills/owid-catalog/SKILL.md (or your agent's skills folder).
name
owid-catalog
description
Access Our World in Data from Python with the owid-catalog library: load chart data, catalog tables or individual indicators as pandas DataFrames that carry their own units, descriptions, sources and citations. Use this skill whenever the work happens in Python or a notebook (pandas, a uv script, matplotlib, parquet); whenever you need an indicator's metadata, units or codebook; whenever you need dimensions that published charts flatten away, such as sex, age group or projection variant; or whenever you need to search OWID's full catalog of indicators and tables, including semantic search by meaning, rather than only its published charts. For language-agnostic HTTP access without Python, use the `owid` skill from github.com/owid/skills instead.
metadata.owner
Marigold

The owid-catalog library provides a unified Python API for discovering and loading OWID datasets. It supports three search kinds: charts (published visualizations), tables (catalog datasets), and indicators (semantic search via embeddings).

Charts are the most curated and best-documented uses of the data, so for answering questions about data they are often a better starting point than indicators. One chart can use a single indicator or several.

Indicators give access to the full catalog of time series, with varying levels of curation. Indicators and tables are addressed by ETL catalog paths, for example garden/un/2024-07-12/un_wpp/population#population. The path fragments are:

  • channel: stage of curation
  • namespace: often the data provider (who, un, wb), sometimes a topic area when that is more useful
  • version: the dataset release identifier — the date OWID released the dataset, not the source's release date
  • dataset: the dataset short name
  • table: the table the indicator belongs to
  • column: the indicator's short name (after #)

Channels are levels of curation. meadow is upstream data as a dataframe. garden is where the data is cleaned and processed; garden tables can carry extra dimensions beyond time and entity (sex, age group, projection variant) and tend to be wide. grapher is the data reshaped for OWID's charting tool, which only understands time and entity, so the extra dimensions are flattened into separate columns. For indicator work, grapher or garden is usually what you want: garden when the extra dimensions help, grapher when you want simple series that merge easily.

Tables are whole datasets' worth of indicators. Table search is more primitive and the frames can be large (hundreds of columns, or millions of rows — garden/un/2024-07-12/un_wpp/population is ~13M rows because of its sex × age × variant dimensions), but when you need several indicators from one dataset they save you joining them by hand. Fetching a single indicator with #column still loads every row of its table.

Country names are harmonized across OWID data, so tables join cleanly on entity and time.

Once you know which data you need, always print the codebook to bring units, descriptions and sources into context. It is what keeps an analysis from misreading a percentage as a share or a per-capita value as a total.

Suggest to the user that they credit the data. If an origin has citation_full, suggest that. Otherwise build an acknowledgment like "PROVIDER 1, PROVIDER 2, ... with processing by Our World in Data", using each origin's attribution, or producer as a fallback (see Metadata and citations).

Show full SKILL.md (279 more words)Show less

Installation

If uv is available (preferred), use inline script dependencies — no separate install step:

python
# /// script
# requires-python = ">=3.11"
# dependencies = ["owid-catalog"]
# ///

Run with:

bash
uv run --no-project script.py

Without uv:

bash
pip install owid-catalog

Quick start

python
# /// script
# requires-python = ">=3.11"
# dependencies = ["owid-catalog"]
# ///

from owid.catalog import fetch, search

# Fetch chart data by slug — returns a Table (a DataFrame with metadata)
tb = fetch("life-expectancy")
print(tb.head(30).to_csv())
print(tb.codebook.to_csv())

# Search charts, then fetch the top result
results = search("population")
print(results.to_frame().head(30).to_csv())
tb = results[0].fetch()

Plain-text output

The default display of ResponseSet, Table and the codebook is rich formatting meant for notebooks; printed as text it is truncated to a few columns. Convert to CSV instead:

python
print(search("gdp per capita").to_frame().to_csv())  # search results
print(tb.head(30).to_csv())                          # data
print(tb.codebook.to_csv())                          # column, title, description, unit, source

Charts

Fetch data from any published chart by slug or full URL:

python
from owid.catalog import fetch, search

tb = fetch("life-expectancy")
tb = fetch("https://ourworldindata.org/grapher/life-expectancy")

# Search charts (10 results by default; pass limit= for more)
results = search("child mortality", limit=30)
print(results.to_frame().to_csv())  # titles, descriptions, URLs
tb = results[0].fetch()

Chart tables are indexed by entities and years (not country/year), and their value columns get generated names such as life_expectancy_0. Read tb.columns before referring to a column.

Tables

Search the full data catalog for tables by name, namespace, dataset, version or channel. This covers every dataset in the catalog, not just those behind published charts.

python
from owid.catalog import fetch, search

# Fuzzy, typo-tolerant matching on the table name (default)
results = search("population", kind="table")
print(results.to_frame().head(30).to_csv())

# Filter by data provider
results = search("wdi", kind="table", namespace="worldbank_wdi")

# Matching modes: "fuzzy" (default), "exact", "contains", "regex"
results = search("gdp.*capita", kind="table", match="regex")

# Keep only the latest version of each table
results = search("population", kind="table", latest=True)

# Fetch by catalog path: a whole table, or one indicator from it
tb = fetch("garden/un/2024-07-12/un_wpp/population")
tb = fetch("garden/un/2024-07-12/un_wpp/population#population")

namespace, version, dataset, channel, match and case only apply to table search; chart and indicator search ignore them.

Indicators

Semantic search using vector embeddings — finds indicators by meaning, not just keywords:

python
from owid.catalog import Client, search

results = search("share of energy from renewable sources", kind="indicator", latest=True)
print(results.to_frame().head(30).to_csv())

# All fields: unit, score, n_charts, popularity, channel, namespace, ...
print(results.to_frame(all_fields=True).head(30).to_csv())

tb = results[0].fetch()        # the single indicator column
tb = results[0].fetch_table()  # the full table containing it

Results are ranked by relevance: a blend of semantic similarity (60%) and popularity, i.e. how much the indicator is viewed (40%). Without latest=True the same indicator often appears several times, once per dataset version. latest=True deduplicates after limit is applied, so it can return far fewer than limit results — raise limit (e.g. limit=50) when you use it. search() has no sort argument; re-sort the ResponseSet, or rank by similarity alone through the client:

python
results = results.sort_by("n_charts", reverse=True)  # any result field
results = Client().indicators.search("CO2 emissions per capita", sort_by="similarity")

Metadata and citations

Every column of a fetched Table carries its own metadata, including the origins that the citation guidance above draws on:

python
meta = tb["life_expectancy_0"].metadata
print(meta.unit, meta.short_unit, meta.description_short)
for origin in meta.origins:
    print(origin.producer, origin.attribution, origin.citation_full)

Working with results

Search returns a ResponseSet:

python
results = search("gdp", kind="table")

first = results[0]
for r in results[:5]:
    print(r.title)

filtered = results.filter(lambda r: "worldbank" in r.namespace)
sorted_results = results.sort_by("popularity", reverse=True)

# The single newest result (by version, or last_updated for charts) — not a filtered set
newest = results.latest()

df = results.to_frame()                  # DataFrame of the main fields
df = results.to_frame(all_fields=True)   # every field
records = results.to_dict()              # list of plain dicts

# In Jupyter, for human users only: switch the notebook display
results.set_ui_advanced()
results.set_ui_basic()  # default

Plotting with owid-grapher-py

owid-grapher-py renders OWID-style interactive charts in a notebook. Its plot() expects year and entity columns by default, so name the chart table's columns explicitly:

python
# dependencies = ["owid-catalog", "owid-grapher-py"]
from owid.catalog import fetch
from owid.grapher import plot

tb = fetch("life-expectancy")
df = tb.reset_index()
chart = plot(df, x="years", entity="entities", y="life_expectancy_0", title="Life expectancy", types=["line", "map"])

© owid, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in lib/catalog/skills/owid-catalog of owid/etl.

Open the folder on GitHubat commit 70c9705

Compare with similar skills

Owid Catalog next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Owid Catalog compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Owid Catalog this skillowid/etl159—~2.3kAutomated safety check: PassMIT
Python Executorcortega26/chile-hub1132 repos~1.5kAutomated safety check: PassMIT
Analytics Data AnalysisMindrally/skills271—~1.6kAutomated safety check: PassApache-2.0
SeabornK-Dense-AI/scientific-agent-skills48k1 repos~3.4kAutomated safety check: NotesBSD-3-Clause
Plot ML Figureprobabl-ai/skills138—~796Automated safety check: PassBSD-3-Clause
Release Evidence WorkflowAli-Marandi/ClimateDataAnalyzer107—~1.6kAutomated safety check: PassMIT

Similar skills

  • Python Executor

    cortega26/chile-hub

    Execute Python code in a safe sandboxed environment via [inference.sh](https://inference.sh).

    113 GitHub starsUsed in 2 repos~1.5k tokens
    Data & AnalyticsAuto-check passed
  • Analytics Data Analysis

    Mindrally/skills

    Best practices for analytics, data analysis, and visualization using Python, pandas, matplotlib, seaborn, and Jupyter notebooks.

    271 GitHub stars~1.6k tokensUpdated yesterday
    Data & AnalyticsAuto-check passed
  • Seaborn

    K-Dense-AI/scientific-agent-skills

    Creates Seaborn statistical visualizations with pandas integration for distributions, relationships, categorical comparisons, regression displays, pair plots, and heatmaps.

    48k GitHub starsUsed in 1 repo~3.4k tokens
    Data & AnalyticsAuto-check: notes
  • Plot ML Figure

    probabl-ai/skills

    Pick how to write a figure before custom plot code. An agent skill from probabl-ai/skills.

    138 GitHub stars~796 tokensUpdated today
    Data & AnalyticsAuto-check passed
  • Release Evidence Workflow

    Ali-Marandi/ClimateDataAnalyzer

    Build an auditable release-evidence workflow for a desktop or packaged application.

    107 GitHub stars~1.6k tokensUpdated 1 mo ago
    Data & AnalyticsAuto-check passed
  • Vaex Out-of-Core DataFrames

    davila7/claude-code-templates

    Processes tabular datasets too large for RAM with Vaex: lazy DataFrames, fast aggregations, big-data plots and ML pipelines over CSV, HDF5, Arrow and Parquet.

    33k GitHub starsUsed in 12 repos~1.6k tokens
    Data & AnalyticsAuto-check passed

More from owid/etl

All 35 skills in this repo
  • Find every OWID surface that references a chart, indicator, MDIM, or explorer — articles (links vs embeds), explorers, narrative charts, data insights, static viz, key-chart slots, MDIM views.

    159 GitHub stars~4.8k tokensUpdated today
    Auto-check passed
  • Add a scatter view (with GDP per capita on x) to existing OWID charts via the admin API, mirroring the admin UI's "Add scatter type" defaults, then retire the old standalone "X vs.

    159 GitHub stars~18k tokensUpdated today
    Auto-check passed
  • Add new survey question codes (e.g. An agent skill from owid/etl.

    159 GitHub stars~10k tokensUpdated today
    Auto-check: notes
  • Build or refresh an OWID static visualization end to end — resolve what data it needs from an old static viz image, an indicator, or a grapher chart; check both the ETL catalog and the producer's…

    159 GitHub stars~7.8k tokensUpdated today
    Auto-check passed
  • Propose redirects from (soon-to-sunset) grapher charts to the matching views of published MDIMs.

    159 GitHub stars~9.2k tokensUpdated today
    Auto-check: notes
  • Take (soon-to-sunset) OWID explorers to redirected MDIMs, end to end.

    159 GitHub stars~7.2k tokensUpdated today
    Auto-check: notes

Questions about Owid Catalog

What does Owid Catalog do?

Access Our World in Data from Python with the owid-catalog library: load chart data, catalog tables or individual indicators as pandas DataFrames that carry their own units, descriptions, sources…. Owid Catalog is an agent skill from owid/etl. Access Our World in Data from Python with the owid-catalog library: load chart data, catalog tables or individual indicators as pandas DataFrames that carry their own units, descriptions, sources and citations.

When should I use Owid Catalog?

Owid Catalog fits situations like: the work happens in Python; A notebook (pandas; whenever you need an indicators metadata; whenever you need dimensions that published charts flatten away.

How do I install Owid Catalog in Claude Code?

Run `npx skills add owid/etl --skill owid-catalog -a claude-code`. Or copy the skill folder (lib/catalog/skills/owid-catalog in owid/etl) into .claude/skills/owid-catalog in your project. Claude Code loads it when a task matches its description.

How do I install Owid Catalog in Codex?

Run `npx skills add owid/etl --skill owid-catalog -a codex`. Or copy the skill folder (lib/catalog/skills/owid-catalog in owid/etl) into .agents/skills/owid-catalog in your project. Codex loads it when a task matches its description.

Can I use Owid Catalog in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add owid/etl --skill owid-catalog -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/owid-catalog, .gemini/skills/owid-catalog, .github/skills/owid-catalog and .opencode/skills/owid-catalog in your project.

What does Owid Catalog need to run?

Going by SKILL.md and its folder, Owid Catalog needs the command-line tools its instructions call (uv and pip). Our summary lists: Python 3.

Does Owid Catalog access the network?

SKILL.md names 1 domain. In commands or code: ourworldindata.org; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Owid Catalog safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Owid Catalog use?

Owid Catalog is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Owid Catalog use?

About 2.3k tokens (SKILL.md is roughly 9.2k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Owid Catalog?

Skills that share tags, products or a category with Owid Catalog: Python Executor (cortega26/chile-hub, 113 stars), Analytics Data Analysis (Mindrally/skills, 271 stars), Seaborn (K-Dense-AI/scientific-agent-skills, 48k stars) and Plot ML Figure (probabl-ai/skills, 138 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Owid Catalog?

owid (a GitHub organization) maintains it in owid/etl, which has 159 GitHub stars. The repository holds 35 skills in this directory. The repository was last updated on October 10, 2026.

Source: owid/etl on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.