Source code for geossm.datasets.loader

"""
Loaders for the example datasets bundled with geossm.

Each dataset is a pair of files packaged under
``geossm/datasets/data`` (a Parquet table of observations) and
``geossm/datasets/shapefiles`` (an optional Shapefile describing the
region the observations cover). See `list_datasets` for the currently
available names.
"""

from importlib import resources
import pandas as pd
import geopandas as geopd

_AVAILABLE = {
    "agrimonia": {"data": "agrimonia.parquet", "geometry": "lombardy"},  # optional
    "aqclim_points": {"data": "GRINS_AQCLIM_points_Italy_2023.parquet", "geometry": "italy_boundary_wgs84"}
}


[docs] def load_dataset(name: str, return_geometry: bool = True): """ Load one of the example datasets bundled with geossm. Parameters ---------- name : str Dataset identifier, e.g. ``"agrimonia"``. See `list_datasets` for the full list of names currently bundled with the package. return_geometry : bool, default True If `True`, also return the dataset's region shapefile (e.g. an administrative boundary) as a :class:`geopandas.GeoDataFrame`, when one is available for `name`. If `False`, only the observations table is returned. Returns ------- df : pandas.DataFrame or geopandas.GeoDataFrame The dataset's observations, as stored in its Parquet file. gdf : geopandas.GeoDataFrame The dataset's region shapefile. Only returned when `return_geometry` is `True`. Raises ------ ValueError If `name` is not one of the bundled dataset identifiers. """ if name not in _AVAILABLE: raise ValueError( f"Unknown dataset '{name}'. " f"Available datasets: {list(_AVAILABLE)}" ) base_data = resources.files("geossm.datasets.data") base_shape = resources.files("geossm.datasets.shapefiles") dataset = _AVAILABLE[name] # ---- Load tabular data ---- with base_data.joinpath(dataset["data"]).open("rb") as f: df = geopd.read_parquet(f) if "geometry" in dataset: shp_path = base_shape.joinpath( f"{dataset['geometry']}/{dataset['geometry']}.shp" ) gdf = geopd.read_file(shp_path) if return_geometry: return df, gdf else: return df
[docs] def list_datasets(): """ List available example datasets bundled with the package. Returns ------- str Formatted table with dataset name, file extension and size in MB. """ base_data = resources.files("geossm.datasets.data") base_shape = resources.files("geossm.datasets.shapefiles") header = f"{'Dataset':<15} {'Type':<10} {'Ext':<6} {'Size (MB)':>10}" sep = f"{'-' * len(header)}" rows = [header, sep] # Add a flag if the dataset is larger than 10 MB for name in sorted(_AVAILABLE): filename = _AVAILABLE[name]["data"] path = base_data.joinpath(filename) size_mb = path.stat().st_size / 1024**2 ext = path.suffix.lstrip(".") flag = " *" if size_mb > 10 else "" rows.append(f"{name:<15} {'data':<10} {ext:<6} {size_mb:>10.3f}{flag}") for name in sorted(_AVAILABLE): if "geometry" not in _AVAILABLE[name]: continue filename = _AVAILABLE[name]["geometry"] path = base_shape.joinpath(f"{filename}/{filename}.shp") size_mb = path.stat().st_size / 1024**2 ext = path.suffix.lstrip(".") flag = " *" if size_mb > 10 else "" rows.append(f"{name:<15} {'geometry':<10} {ext:<6} {size_mb:>10.3f}{flag}") return "\n".join(rows)