{"id":18847864,"url":"https://github.com/zmoon/epa-regions-python","last_synced_at":"2025-04-11T15:52:28.359Z","repository":{"id":220009342,"uuid":"748359020","full_name":"zmoon/epa-regions-python","owner":"zmoon","description":"EPA regions with GeoPandas / regionmask","archived":false,"fork":false,"pushed_at":"2025-02-24T16:05:51.000Z","size":66,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-25T12:03:32.164Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zmoon.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-25T20:05:21.000Z","updated_at":"2025-02-24T16:05:55.000Z","dependencies_parsed_at":"2025-02-20T05:40:29.948Z","dependency_job_id":"08567c3d-8b9f-41ca-bb69-283a515cd93f","html_url":"https://github.com/zmoon/epa-regions-python","commit_stats":null,"previous_names":["zmoon/epa-regions-python"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zmoon%2Fepa-regions-python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zmoon%2Fepa-regions-python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zmoon%2Fepa-regions-python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zmoon%2Fepa-regions-python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zmoon","download_url":"https://codeload.github.com/zmoon/epa-regions-python/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248435405,"owners_count":21103020,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T03:09:54.889Z","updated_at":"2025-04-11T15:52:28.343Z","avatar_url":"https://github.com/zmoon.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# epa-regions-python\n\n[EPA regions](https://www.epa.gov/aboutepa/regional-and-geographic-offices)\nfrom [Natural Earth](https://www.naturalearthdata.com) data\nwith [GeoPandas](https://geopandas.org) / [regionmask](https://regionmask.readthedocs.io).\n\n[![Version on PyPI](https://img.shields.io/pypi/v/epa-regions.svg)](https://pypi.org/project/epa-regions/)\n\n![regions](https://github.com/zmoon/epa-regions-python/assets/15079414/003d3c54-bb78-4d44-9c78-5717a935dd41)\n\n\u003cdetails\u003e\u003csummary\u003eCode\u003c/summary\u003e\n\n```sh\npython -m epa_regions -r 50m --states-only --save\n```\n\u003c/details\u003e\n\n## Installation\n\nWith `conda` (recommended):\n\n\u003c!--pytest.mark.skip--\u003e\n\n```\nconda activate ...\nconda install -c conda-forge geopandas regionmask pooch pyogrio\npip install epa-regions\n```\n\n`pip install epa-regions` does not install any dependencies,\nas it is expected that you will have installed them with `conda`.\n\n* `geopandas`: needed if you want to use `epa_regions.get()`\n* `pooch`: for downloading/caching the shapefiles for `epa_regions.get()`\n* `pyogrio`: for faster reading of shapefiles\n* `regionmask`: needed if you want to use `epa_regions.to_regionmask()`\n\nNote that `epa_regions.look_up()` requires only `pandas`,\nand you can access the region definitions\n(region number, office, and state/territory constituents)\nat `epa_regions.REGIONS` without any 3rd-party dependencies.\n\n`python -m epa_regions` needs `matplotlib`.\n\n## Usage\n\n```python\nimport epa_regions\n\n# GeoPandas GeoDataFrame\nepa = epa_regions.get(resolution=\"50m\")\n\n# Convert to regionmask Regions for use with gridded data\nepa = epa_regions.to_regionmask(epa)\n```\n\n### Point data\n\n![points](https://github.com/zmoon/epa-regions-python/assets/15079414/990dccc8-096b-4eb1-9e90-ec3920518aed)\n\n\u003cdetails\u003e\u003csummary\u003eCode\u003c/summary\u003e\n\n```python\nimport geopandas as gpd\nimport matplotlib.pyplot as plt\nimport numpy as np\n\nimport epa_regions\n\nrng = np.random.default_rng(seed=123)\n\nepa = epa_regions.get(resolution=\"50m\")\n\n# CONUS\nlonmin, lonmax = -125, -66\nlatmin, latmax = 24, 50\nn = 250\nlon = rng.uniform(lonmin, lonmax, n)\nlat = rng.uniform(latmin, latmax, n)\npoints = gpd.GeoDataFrame(\n    geometry=gpd.points_from_xy(lon, lat, crs=\"EPSG:4326\")\n)\n\nfig, ax = plt.subplots(constrained_layout=True, figsize=(4, 2.5))\n\nepa.plot(column=\"number\", ax=ax, alpha=0.6)\npoints.sjoin(epa, predicate=\"within\").plot(column=\"number\", ax=ax, ec=\"0.3\", lw=1)\n\nax.set(xlim=(lonmin, lonmax), ylim=(latmin, latmax))\nax.axis(\"off\")\n\nfig.savefig(\"points.png\", dpi=\"figure\", bbox_inches=\"tight\")\n```\n\u003c/details\u003e\n\n### Gridded data\n\n![gridded](https://github.com/zmoon/epa-regions-python/assets/15079414/832087e1-456a-4cd5-8fd7-15342e12f73f)\n\n\u003cdetails\u003e\u003csummary\u003eCode\u003c/summary\u003e\n\n```python\nimport cartopy.crs as ccrs\nimport cartopy.feature as cfeature\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport xarray as xr\n\nimport epa_regions\n\nepa = epa_regions.to_regionmask(epa_regions.get(resolution=\"50m\"))\n\n# CONUS\nlonmin, lonmax = -125, -66\nlatmin, latmax = 24, 50\n\nds = (\n    xr.tutorial.open_dataset(\"air_temperature\")\n    .sel(lon=slice(lonmin + 360, lonmax + 360), lat=slice(latmax, latmin))\n)\nmask = epa.mask(ds.isel(time=0))\n\nproj = ccrs.LambertConformal(central_longitude=-100)\ntran = ccrs.PlateCarree()\n\nfig = plt.figure(figsize=(6, 6), constrained_layout=True)\n\nax = fig.add_subplot(3, 1, (1, 2), projection=proj)\n\nmask.plot.pcolormesh(\n    levels=np.arange(mask.min() - 0.5, mask.max() + 1),\n    ax=ax,\n    transform=ccrs.PlateCarree(),\n    cmap=\"tab10\",\n    cbar_kwargs=dict(\n        orientation=\"horizontal\",\n        fraction=0.075,\n        pad=0.05,\n        ticks=np.arange(mask.min(), mask.max() + 1),\n        format=\"R{x:.0f}\",\n        label=\"EPA Region\",\n    ),\n)\n\nax.add_feature(cfeature.STATES, linewidth=0.7, edgecolor=\"0.3\")\nax.coastlines()\nax.set_extent([lonmin, lonmax - 2, latmin, latmax], crs=tran)\nax.set_title(\"\")\n\nax = fig.add_subplot(3, 1, 3)\n\n(dt,) = np.unique(ds.time.diff(\"time\"))\n\nwindow = pd.Timedelta(\"30D\")\n(\n    ds[\"air\"].groupby(mask)\n    .mean()\n    .rolling(time=int(window / dt), center=True)\n    .mean()\n    .plot(\n        hue=\"mask\",\n        ax=ax,\n        add_legend=False,\n    )\n)\n\nax.set_xlabel(\"\")\nax.text(\n    0.01,\n    0.97,\n    f\"{window.total_seconds() / 86400:g}-day rolling mean\",\n    ha=\"left\",\n    va=\"top\",\n    transform=ax.transAxes,\n    fontsize=11,\n)\n\nfig.savefig(\"gridded.png\", dpi=\"figure\", bbox_inches=\"tight\")\n```\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzmoon%2Fepa-regions-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzmoon%2Fepa-regions-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzmoon%2Fepa-regions-python/lists"}