Base run
A simple run of xagg, aggregating gridded temperature data over US counties. For a deeper dive into xagg’s functionality, see the Detailed Code Run.
[1]:
import xagg as xa
import xarray as xr
import numpy as np
import geopandas as gpd
Import
The sample data in this example are:
gridded: month-of-year average temperature projections for the end-of-century from a climate model (CCSM4)
shapefiles: US counties
[2]:
# Load some climate data as an xarray dataset
ds = xr.open_dataset('../../data/climate_data/tas_Amon_CCSM4_rcp85_monthavg_20700101-20991231.nc')
ds
[2]:
<xarray.Dataset>
Dimensions: (lon: 288, lat: 192, month: 12, bnds: 2)
Coordinates:
height float64 ...
* lon (lon) float64 0.0 1.25 2.5 3.75 5.0 ... 355.0 356.2 357.5 358.8
* lat (lat) float64 -90.0 -89.06 -88.12 -87.17 ... 88.12 89.06 90.0
* month (month) int64 1 2 3 4 5 6 7 8 9 10 11 12
Dimensions without coordinates: bnds
Data variables:
lat_bnds (month, lat, bnds) float64 ...
lon_bnds (month, lon, bnds) float64 ...
tas (month, lat, lon) float32 ...[3]:
# Load US counties shapefile as a geopandas GeoDataFrame
gdf = gpd.read_file('../../data/geo_data/UScounties.shp')
gdf.head()
[3]:
| NAME | STATE_NAME | STATE_FIPS | CNTY_FIPS | FIPS | geometry | |
|---|---|---|---|---|---|---|
| 0 | Lake of the Woods | Minnesota | 27 | 077 | 27077 | POLYGON ((-95.34283 48.54668, -95.34105 48.715... |
| 1 | Ferry | Washington | 53 | 019 | 53019 | POLYGON ((-118.85163 47.94956, -118.84846 48.4... |
| 2 | Stevens | Washington | 53 | 065 | 53065 | POLYGON ((-117.43883 48.04412, -117.54219 48.0... |
| 3 | Okanogan | Washington | 53 | 047 | 53047 | POLYGON ((-118.97209 47.93915, -118.97406 47.9... |
| 4 | Pend Oreille | Washington | 53 | 051 | 53051 | POLYGON ((-117.43858 48.99992, -117.03205 48.9... |
Aggregate
Now, aggregate the gridded variable in ds onto the polygons in gdf. Use the option silent=True if you’d like to suppress the status updates, or set it as a default using xa.set_defaults(silent=True).
[4]:
# Calculate overlaps
weightmap = xa.pixel_overlaps(ds,gdf)
creating polygons for each pixel...
calculating overlaps between pixels and output polygons...
success!
[5]:
# Aggregate
aggregated = xa.aggregate(ds,weightmap)
adjusting grid... (this may happen because only a subset of pixels were used for aggregation for efficiency - i.e. [subset_bbox=True] in xa.pixel_overlaps())
grid adjustment successful
aggregating tas...
all variables aggregated to polygons!
Convert
Finally, convert the aggregated data back into the format you would like.
[6]:
# Example as an xarray dataset
ds_out = aggregated.to_dataset()
ds_out
[6]:
<xarray.Dataset>
Dimensions: (poly_idx: 3141, month: 12)
Coordinates:
* poly_idx (poly_idx) int64 0 1 2 3 4 5 6 ... 3135 3136 3137 3138 3139 3140
* month (month) int64 1 2 3 4 5 6 7 8 9 10 11 12
Data variables:
NAME (poly_idx) object 'Lake of the Woods' 'Ferry' ... 'Broomfield'
STATE_NAME (poly_idx) object 'Minnesota' 'Washington' ... 'Colorado'
STATE_FIPS (poly_idx) object '27' '53' '53' '53' ... '02' '02' '02' '08'
CNTY_FIPS (poly_idx) object '077' '019' '065' '047' ... '240' '068' '014'
FIPS (poly_idx) object '27077' '53019' '53065' ... '02068' '08014'
tas (poly_idx, month) float64 263.9 268.8 274.0 ... 276.4 270.4[7]:
# Example as a pandas dataframe
df_out = aggregated.to_dataframe()
df_out
[7]:
| NAME | STATE_NAME | STATE_FIPS | CNTY_FIPS | FIPS | tas | ||
|---|---|---|---|---|---|---|---|
| poly_idx | month | ||||||
| 0 | 1 | Lake of the Woods | Minnesota | 27 | 077 | 27077 | 263.918943 |
| 2 | Lake of the Woods | Minnesota | 27 | 077 | 27077 | 268.834073 | |
| 3 | Lake of the Woods | Minnesota | 27 | 077 | 27077 | 273.977533 | |
| 4 | Lake of the Woods | Minnesota | 27 | 077 | 27077 | 283.141960 | |
| 5 | Lake of the Woods | Minnesota | 27 | 077 | 27077 | 290.623952 | |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 3140 | 8 | Broomfield | Colorado | 08 | 014 | 08014 | 297.646820 |
| 9 | Broomfield | Colorado | 08 | 014 | 08014 | 292.368988 | |
| 10 | Broomfield | Colorado | 08 | 014 | 08014 | 283.544708 | |
| 11 | Broomfield | Colorado | 08 | 014 | 08014 | 276.383606 | |
| 12 | Broomfield | Colorado | 08 | 014 | 08014 | 270.444855 |
37692 rows × 6 columns
[ ]: