- Skill ID
- catalyst-cooperative/agent-skills/pudl
- Publisher
- catalyst-cooperative
- Repository
- agent-skills
- Installs
- 0
- Files
- 15
- License
- CC-BY-4.0
- Requires
- |
- Synced
- Sep 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
catalyst-cooperative/agent-skills/pudlInstalls these files- SKILL.md
- assets/cache/.gitignore
- assets/ferc1_schedules.json
- assets/ferc2_schedules.json
- assets/ferc6_schedules.json
- assets/ferc_electricity_accounts.json
- references/data-access.md
- references/data-quality-and-context.md
- references/data-sources.md
- references/ferc-electricity-accounts.md
- references/ferc1-schedules.md
- references/ferc2-schedules.md
- references/metadata-and-querying.md
- references/methodology.md
- scripts/fetch_descriptor.py
What this skill tells the agent
PUDL Data Explorer Guide
This skill is for data users who want to explore, understand, and load PUDL's public energy data products. It assumes no access to the PUDL Python package or source repository — only the publicly distributed data files and their metadata.
PUDL's primary outputs are Apache Parquet files, described by a Frictionless Data Package descriptor. For generic descriptor-querying patterns (jq), use the datapackage skill — this skill provides PUDL-specific knowledge layered on top.
Beyond the main Parquet outputs, PUDL also distributes raw per-form FERC Parquet data (covering Forms 1/2/6/60/714, each with its own datapackage.json) and the FERC EQR (partitioned Parquet, separate from the main build). These have different access patterns and are not covered by the main Frictionless descriptor — see Data Access for the full picture.
Workflow overview
Every step below is inexpensive and should happen by default whenever it's relevant to the question at hand, not only when the user asks for it by name.
- Locate the metadata — the primary PUDL descriptor (Parquet outputs) is at:
- S3:
s3://pudl.catalyst.coop/nightly/pudl_parquet_datapackage.json - HTTPS:
https://s3.us-west-2.amazonaws.com/pudl.catalyst.coop/nightly/pudl_parquet_datapackage.json
Raw per-form FERC data has its own datapackage.json in each form/era directory, e.g. s3://pudl.catalyst.coop/nightly/ferc1_xbrl/datapackage.json and s3://pudl.catalyst.coop/nightly/ferc1_dbf/datapackage.json — see Raw per-form Parquet directories for the full list.
The FERC EQR (Electric Quarterly Reports) is distributed separately due to its size, and only one version is publicly available at a time:
- S3:
s3://pudl.catalyst.coop/ferceqr/ferceqr_parquet_datapackage.json - HTTPS:
https://s3.us-west-2.amazonaws.com/pudl.catalyst.coop/ferceqr/ferceqr_parquet_datapackage.json
For offline or development use, download all descriptors locally with:
python scripts/fetch_descriptor.pyThis populates assets/cache/. The script is cache-aware — a cached file younger than a day is reused with no network call, so it's safe to run this every time you need a descriptor rather than checking assets/cache/ yourself first. Pass --force to bypass the cache and refetch regardless of age (e.g. if you suspect PUDL's schema changed today and need the very latest copy).
Raw input archives (for provenance) live at s3://pudl.catalyst.coop/zenodo/<dataset>/<concrete-doi>/datapackage.json. Prefer the cached S3 archive over the Zenodo website or API for raw metadata and file access. The source docs page usually gives a concept DOI for the whole dataset lineage; the S3 path uses a concrete DOI for one specific archived version. See Data Quality and Context for details.
- Query metadata selectively — use
/datapackageskill patterns (jq) to find relevant tables, read descriptions, and surface warnings.
For "does PUDL have data on X" questions, don't stop at a match you already recognized by reputation — run a broader keyword sweep across relevant description/code fields first (for FERC accounts, see Cross-referencing FERC Form 1 and Form 2 schedules and accounts; the same habit applies to other sources' core_*__codes_* tables). Flag it if an answer came from recalled knowledge rather than the sweep.
- Consult primary-source forms and instructions when metadata alone doesn't fully explain something — don't wait for the user to ask for these by name. See Data Sources: Blank forms and filer instructions.
- Check table tier — see Data Quality and Context. Prefer
out_*tables; warn users about_core_*tables.
- Check keys before joining tables — if the task combines a FERC-sourced table with an EIA-sourced table (or any two tables at all), check
schema.foreignKeyson each first, and route utility/plant joins throughutility_id_pudl/plant_id_pudl, not through name-string matching. See PUDL Datapackage Extensions: Joining PUDL tables.
- Check methodology before implementation details — if the user is asking how PUDL cleans, imputes, allocates, reconciles, estimates, or models data, read Methodology first and fetch the relevant public methodology page (append
.mdto the URL for your own reading — but when pointing the user to it, give them the plain.htmllink) before looking at source code, docstrings, or implementation details. Summarize the public methodology page and point the user to it. Only dive into code-level implementation after the user has seen that write-up or if no methodology page exists for the topic.
- Load the data, efficiently — Loading data doesn't have to mean downloading an entire table.
SELECT ... LIMITin DuckDB,pl.scan_parquet()with.select()/.filter()before.collect()in polars, and acolumns=argument in pandas all push the selection down to the Parquet reader itself. Treat sampling and down-selecting as the normal way to explore a table, not an optimization reserved for when a file turns out to be huge. You should estimate a table's size before a full, unfiltered load, and only load the full table if the job genuinely needs every row; see Data Access for the loading patterns themselves.
Reference index
- Data Sources — how to query the PUDL descriptor's own
sourcesarray (31 datasets, with short codes, names, licensing, and per-source documentation links), and where to find and read each source's blank forms and filer instructions; read when a user asks about a specific source dataset (EIA-860, FERC Form 714, EPA CEMS, etc.) or needs documentation links, when resolving a raw-archive S3 path and you need the short code and have to distinguish between a concept-DOI and a concrete-DOI, or whenever interpreting what a column, code, or schedule actually means. - Data Access — S3 paths, loading patterns (pandas/DuckDB/polars/pure SQL), raw per-form FERC Parquet locations, and EQR access; read whenever generating data-loading code or explaining how to access any PUDL output
- PUDL Datapackage Extensions — PUDL-specific additions to the standard datapackage schema: RST/docstring-formatted descriptions, per-resource provenance fields, the package-level unit registry, and how to join tables across FERC/EIA ID systems via
utility_id_pudl/plant_id_pudl; read before queryingdescriptionor other non-standard fields on a PUDL descriptor, and before joining any two PUDL tables (for generic descriptor-querying mechanics, use thedatapackageskill instead) - Data Quality and Context — table tier naming conventions (
out_*vscore_*vs raw), warning types, and what each tier means for analysis reliability; read when a user asks about data quality, when choosing between table tiers, or when surfacing warnings before providing loading code - Methodology — index of PUDL's data processing and modeling methodology pages (entity resolution, timeseries imputation, ownership
More from catalyst-cooperative
Use this skill in a project
Open any RiverX project, search the Skills panel for catalyst-cooperative/agent-skills/pudl, and install it in one click.
