Skip to main content

publicdata-au

Query and download Australian government open data from publicdata.au. publicdata.au republishes datasets that governments already publish under open licences, keeps every version at a URL that never changes, and serves each one in twelve formats with a query API.

This package works for every dataset the site serves, named by its slug, so a dataset added to the site needs no new release.

pip install publicdata-au            # queries and downloads, no dependencies
pip install "publicdata-au[pandas]"  # adds read() into a pandas DataFrame
pip install "publicdata-au[duckdb]"  # adds connect() and relation(), DuckDB on a version
pip install "publicdata-au[geo]"     # adds read_geo() into a geopandas GeoDataFrame

Find a dataset

import publicdata_au as pd_au

pd_au.datasets("road crashes")  # slug, title, publisher, licence and page of each match
pd_au.datasets(topic="roads", jurisdiction="Qld")
pd_au.datasets(publisher="Bureau of Meteorology")
pd_au.versions("au-road-deaths")  # every version kept, newest first

Query rows and totals

from publicdata_au import gte, in_

deaths = pd_au.rows(
    "au-road-deaths",
    {"state": in_("QLD", "NSW"), "year": gte(2020)},
    select=["state", "year", "road_user"],
    order="year.desc",
    all=True,
)
deaths.version  # the version the rows came from
deaths.attribution  # the attribution the publisher's licence requires
deaths.to_pandas()

pd_au.aggregate("au-road-deaths", group="state", metric="count", where={"year": 2025})

A plain value must match exactly, a list matches any of its values and None matches a blank or suppressed cell. The filters are eq, neq, gt, gte, lt, lte, like, ilike, in_, is_null and not_.

Without version= an answer comes from the newest version and changes when the publisher releases again. Pass a date from versions() for an answer that never changes.

Whole tables

df = pd_au.read("au-road-deaths")  # needs the [pandas] extra
df.attrs["publicdata"]  # the version, licence and attribution the file itself carries
pd_au.download("au-road-deaths", "csv")  # or parquet, csv.gz, json, ndjson, sqlite, duckdb, ...

A version never changes once published, so a downloaded file can be kept and reused. Nothing is kept unless you ask, with cache=True on a call or PUBLICDATA_CACHE=1 for every call:

df = pd_au.read("au-road-deaths", cache=True)  # downloaded once, read from disk after
pd_au.cache_list()  # what is kept, in cache_dir()
pd_au.cache_clear("au-road-deaths")

Query a version in place

Every version has a DuckDB file, and connect() attaches it read-only over HTTPS. Only the blocks a query touches are read, so a count over millions of rows runs without a download.

con = pd_au.connect("au-road-deaths")  # needs the [duckdb] extra
con.sql("SELECT state, count(*) FROM records GROUP BY 1").df()
con.publicdata  # the version, its URL, licence, attribution and citation

r = pd_au.relation("au-road-deaths")  # one table as a lazy DuckDB relation
r.filter("year >= 2020").aggregate("state, count(*) AS n").df()

A database such as G-NAF is one DuckDB file holding every table, the keys between them and the publisher's views, with one Parquet file per table beside it.

pd_au.tables("gnaf")  # every table with its fields, keys and references
con = pd_au.connect("gnaf")
con.sql("SELECT postcode, count(*) AS n FROM address_view GROUP BY 1 ORDER BY 2 DESC LIMIT 10").df()
pd_au.read("gnaf", table="locality")  # one table as a pandas DataFrame
pd_au.download("gnaf", table="state")  # one table as Parquet

For heavy work on a large database, connect("gnaf", cache=True) downloads the file once and queries it from disk. G-NAF's DuckDB file is about 3 GB.

Maps

Datasets with a location or a shape, such as crash points or ABS boundaries, have a GeoPackage, which read_geo() reads in the reference system the publisher used, usually GDA2020 (EPSG:7844).

lga = pd_au.read_geo("abs-lga-2025")  # needs the [geo] extra
lga.plot()

What changed

Each release is compared with the one before it on the dataset's key.

pd_au.changes("rba-money-market-daily")  # one entry per release: added, removed, changed
pd_au.diff("rba-money-market-daily")  # the newest release in full, with the keys

Files have no rate limit. The query API allows 60 requests in 10 seconds from one address, and this package waits and retries when it answers 429 or a passing server error.

Licence and attribution

The data is under each publisher's own licence, which requires the attribution string that every answer carries. Please also name publicdata.au and link to the version you used; cite(slug) gives the citation and cite(slug, format="bibtex") the BibTeX entry. Where a licence sets a condition beyond attribution, such as G-NAF's rule on mail compilation, the package warns once per dataset with a LicenceCondition warning. publicdata.au is an independent republication, and the publishers have not endorsed it.

The package itself is under the MIT licence.

Metadata

Release files for publicdata-au 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for publicdata-au 0.3.0
File Size Uploaded
publicdata_au-0.3.0.tar.gz 19.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for publicdata-au 0.3.0
File Interpreter ABI Platform
publicdata_au-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 33.8 kB

Release files / publicdata_au-0.3.0.tar.gz

Download URL publicdata_au-0.3.0.tar.gz
Size 19.0 kB
Tags Source
SHA-256 checksum
How to use checksums
8f24a84d8cc8ec60ac7cc073015ac3b5202dde1eb94918cd18f9d7e760ba3a20
BLAKE2b-256 checksum
How to use checksums
675db65c3d1a5f859797423e259f77be2a1361593acb1f5866653c3bb6e96e33
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release files / publicdata_au-0.3.0-py3-none-any.whl

Download URL publicdata_au-0.3.0-py3-none-any.whl
Size 14.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c726377c53278a1d7713c0febd81e1352ef26a20f165f25b10b7f14e4d7aa8b1
BLAKE2b-256 checksum
How to use checksums
927665fdbe43f11619b84da971812e4857796516a69511fd91c95b7671db1416
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.

Transparency log

Release history Release notifications | RSS feed

0.4.0

2 release files

This release

0.3.0 This release

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page