CEDA DataPoint - Basic Usage

This page/notebook demonstrates some basic usage and functionality for CEDA’s DataPoint package, installable with pip install ceda-datapoint. To begin we can import the datapoint module and start using the search client.

>>> from ceda_datapoint import DataPointClient
>>> client = DataPointClient(org='CEDA', hash_token='lonestar')

The hash token and organisation are optional parameters. By default the organisation will be CEDA and the hash token will be auto-generated to help the user keep track of client, search and item objects and which are their parent objects. All objects contain a few basic methods, like help and info to get the set of public methods and some info about the object respectively.

General Info

All DataPoint objects have some standard methods for retrieving information, like the .help() and .info() methods below. They’re also all designed for use with a Jupyter notebook, in the way that they will display information when listed at the end of a cell. See below for example

>>> # DataPointClient contains a __repr__ method which enables us to do the below:
>>> client
<DataPointClient: CEDA-333146>
 - url: https://api.stac.ceda.ac.uk
 - organisation: CEDA

Simple dataset access example

Here we present a very basic search across the cmip6 STAC collection which returns 10 items, from which we can pull a specific dataset.

>>> search_basic = client.search(
>>>     collections=['cmip6'],
>>>     query=[
>>>         'experiment_id=ssp585',
>>>         'activity_id=ScenarioMIP',
>>>         'institution_id=KIOST',
>>>     ],
>>>     max_items = 10
>>> )
>>> search_basic
<DataPointSearch: CEDA-333146-139631 ({'collections': ['cmip6'], 'max_items': 10, 'query': 3})>
 - url: https://api.stac.ceda.ac.uk
 - organisation: CEDA
 - search_terms: {'collections': ['cmip6'], 'query': ['experiment_id=ssp585', 'activity_id=ScenarioMIP', 'institution_id=KIOST'], 'max_items': 10}

From our search we can collect the cloud assets into a cluster, index the cluster to get a specific cloud product, then open that cloud product into an xarray dataset.

>>> # Collect the cloud products from this search into a single cluster
>>> cluster = search_basic.collect_cloud_assets()
>>> product = cluster[2] # Index the cluster to find the 3rd product (Note: you can also use the ID)
>>>
>>> # Note: Here we have used a specific item which is known to exist.
>>> ds = product.open_dataset()
>>> ds
<xarray.Dataset> Size: 76MB
Dimensions:    (lat: 96, bnds: 2, lon: 192, time: 1032)
Coordinates:
  * lat        (lat) float64 768B -90.0 -88.11 -86.21 ... 86.21 88.11 90.0
  * lon        (lon) float64 2kB 0.9375 2.812 4.688 6.563 ... 355.3 357.2 359.1
  * time       (time) object 8kB 2015-01-17 12:00:00 ... 2100-12-17 12:00:00
Dimensions without coordinates: bnds
Data variables:
    lat_bnds   (lat, bnds) float64 2kB dask.array<chunksize=(96, 2), meta=np.ndarray>
    lon_bnds   (lon, bnds) float64 3kB dask.array<chunksize=(192, 2), meta=np.ndarray>
    time_bnds  (time, bnds) object 17kB dask.array<chunksize=(1, 2), meta=np.ndarray>
    vas        (time, lat, lon) float32 76MB dask.array<chunksize=(1, 96, 192), meta=np.ndarray>
Attributes: (12/47)
    Conventions:            CF-1.7 CMIP-6.2
    activity_id:            ScenarioMIP
    branch_method:          standard
    branch_time_in_child:   60266.0
    branch_time_in_parent:  60266.0
    cmor_version:           3.5.0
    ...                     ...
    table_id:               Amon
    table_info:             Creation Date:(30 April 2019) MD5:cc2ae51c23960ce...
    title:                  KIOST-ESM output prepared for CMIP6
    tracking_id:            hdl:21.14100/7640f386-9b1b-4803-a489-ab4f524b9eba
    variable_id:            vas
    variant_label:          r1i1p1f1

Alternatively we can open the dataset directly from the search if we already know the ID of the specific dataset.

>>> ds = search_basic.open_dataset(2)
>>> ds
<xarray.Dataset> Size: 76MB
Dimensions:    (lat: 96, bnds: 2, lon: 192, time: 1032)
Coordinates:
  * lat        (lat) float64 768B -90.0 -88.11 -86.21 ... 86.21 88.11 90.0
  * lon        (lon) float64 2kB 0.9375 2.812 4.688 6.563 ... 355.3 357.2 359.1
  * time       (time) object 8kB 2015-01-17 12:00:00 ... 2100-12-17 12:00:00
Dimensions without coordinates: bnds
Data variables:
    lat_bnds   (lat, bnds) float64 2kB dask.array<chunksize=(96, 2), meta=np.ndarray>
    lon_bnds   (lon, bnds) float64 3kB dask.array<chunksize=(192, 2), meta=np.ndarray>
    time_bnds  (time, bnds) object 17kB dask.array<chunksize=(1, 2), meta=np.ndarray>
    vas        (time, lat, lon) float32 76MB dask.array<chunksize=(1, 96, 192), meta=np.ndarray>
Attributes: (12/47)
    Conventions:            CF-1.7 CMIP-6.2
    activity_id:            ScenarioMIP
    branch_method:          standard
    branch_time_in_child:   60266.0
    branch_time_in_parent:  60266.0
    cmor_version:           3.5.0
    ...                     ...
    table_id:               Amon
    table_info:             Creation Date:(30 April 2019) MD5:cc2ae51c23960ce...
    title:                  KIOST-ESM output prepared for CMIP6
    tracking_id:            hdl:21.14100/7640f386-9b1b-4803-a489-ab4f524b9eba
    variable_id:            vas
    variant_label:          r1i1p1f1

More about Searches

Note: The id for this search object contains the parent id of the client (in this case 333146) plus an additional 6-digit code for this search. Child objects of this search will contain both sets of 6-digit ids, plus another one for the child. We can also see the searched terms in the representation of this object.

>>> search_basic
<DataPointSearch: CEDA-333146-139631 ({'collections': ['cmip6'], 'max_items': 10, 'query': 3})>
 - url: https://api.stac.ceda.ac.uk
 - organisation: CEDA
 - search_terms: {'collections': ['cmip6'], 'query': ['experiment_id=ssp585', 'activity_id=ScenarioMIP', 'institution_id=KIOST'], 'max_items': 10}
 - products: 10

We can again use the standard methods to get some insight into this object.

>>> search_basic.info()
>>> search_basic.help()
<DataPointSearch: CEDA-333146-139631 ({'collections': ['cmip6'], 'max_items': 10, 'query': 3})>
 - url: https://api.stac.ceda.ac.uk
 - organisation: CEDA
 - search_terms: {'collections': ['cmip6'], 'query': ['experiment_id=ssp585', 'activity_id=ScenarioMIP', 'institution_id=KIOST'], 'max_items': 10}
 - products: 10
DataPointSearch Help:
 > search.info() - General information about this search
 > search.collect_cloud_assets() - Collect the cloud products into a `cluster`
 > search.display_assets() - List the names of assets for each item in this search
 > search.display_cloud_assets() - List the cloud format types for each item in this search
Properties:  id, meta, collection, items, assets
See the documentation at https://cedadev.github.io/datapoint/

We can try some of these public methods listed via the help method for this search.

>>> search_basic.display_assets()
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106 (Collection: cmip6)>
 - reference_file, data0001
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.uas.gr1.v20210319 (Collection: cmip6)>
 - reference_file, data0001
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.tas.gr1.v20191106 (Collection: cmip6)>
 - reference_file, data0001
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.sfcWind.gr1.v20191106 (Collection: cmip6)>
 - reference_file, data0001
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rsus.gr1.v20191106 (Collection: cmip6)>
 - reference_file, data0001
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rsds.gr1.v20191106 (Collection: cmip6)>
 - reference_file, data0001
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rlus.gr1.v20191106 (Collection: cmip6)>
 - reference_file, data0001
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rlds.gr1.v20191106 (Collection: cmip6)>
 - reference_file, data0001
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.psl.gr1.v20191106 (Collection: cmip6)>
 - reference_file, data0001
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.prsn.gr1.v20210928 (Collection: cmip6)>
 - reference_file, data0001

Note: The above assets are listed with names as they appear in the STAC assets list. This does not showcase which assets represent cloud datasets which can be opened via DataPoint. To see the datasets we can access, you can use the display_cloud_assets method:

>>> search_basic.display_cloud_assets()
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106 (Collection: cmip6)>
 - kerchunk
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.uas.gr1.v20210319 (Collection: cmip6)>
 - kerchunk
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.tas.gr1.v20191106 (Collection: cmip6)>
 - kerchunk
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.sfcWind.gr1.v20191106 (Collection: cmip6)>
 - kerchunk
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rsus.gr1.v20191106 (Collection: cmip6)>
 - kerchunk
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rsds.gr1.v20191106 (Collection: cmip6)>
 - kerchunk
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rlus.gr1.v20191106 (Collection: cmip6)>
 - kerchunk
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rlds.gr1.v20191106 (Collection: cmip6)>
 - kerchunk
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.psl.gr1.v20191106 (Collection: cmip6)>
 - kerchunk
<DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.prsn.gr1.v20210928 (Collection: cmip6)>
 - kerchunk

So from the above, we can see the 10 items returned by this search all contain a kerchunk asset which is one we can use to open the set of data for the item.

We can get a dictionary of DataPointItems represented by this search from the items property.

>>> search_basic.items
{'CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106': <DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106 (Collection: cmip6)>
  - url: https://api.stac.ceda.ac.uk
  - organisation: CEDA
  - search_terms: {'collections': ['cmip6'], 'query': ['experiment_id=ssp585', 'activity_id=ScenarioMIP', 'institution_id=KIOST'], 'max_items': 10}
  - collection: cmip6
  - item: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106
  - assets: 2
  - cloud_assets: 1
  - attributes: 34
  - stac_attributes: 8
 Properties:
  - datetime: 2058-01-01T12:00:00Z
  - start_datetime: 2015-01-17T12:00:00Z
  - end_datetime: 2100-12-17T12:00:00Z
  - access: ['HTTPServer']
  - index_node: None
  - latest: True
  - pid: None
  - replica: False
  - retracted: False
  - instance_id: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106
  - citation_url: http://cera-www.dkrz.de/WDCC/meta/CMIP6/CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106.json
  - variable_long_name: Northward Near-Surface Wind
  - variable_units: m s-1
  - cf_standard_name: northward_wind
  - activity_id: ScenarioMIP
  - data_specs_version: 01.00.30
  - experiment_title: update of RCP8.5 based on SSP5
  - frequency: mon
  - further_info_url: https://furtherinfo.es-doc.org/CMIP6.KIOST.KIOST-ESM.ssp585.none.r1i1p1f1
  - grid: atmos data regridded from Cubed-sphere (c48) to 94X192
  - grid_label: gr1
  - institution_id: KIOST
  - mip_era: CMIP6
  - source_id: KIOST-ESM
  - source_type: AGCM
  - experiment_id: ssp585
  - sub_experiment_id: none
  - nominal_resolution: 250 km
  - table_id: Amon
  - variable_id: vas
  - variant_label: r1i1p1f1
  - levels: None
  - updated: 2024-02-20T22:14:50.735178Z
  - created: 2024-02-20T22:14:50.735178Z,
 'CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.uas.gr1.v20210319': <DataPointItem: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.uas.gr1.v20210319 (Collection: cmip6)>
  - url: https://api.stac.ceda.ac.uk
  - organisation: CEDA
  - search_terms: {'collections': ['cmip6'], 'query': ['experiment_id=ssp585', 'activity_id=ScenarioMIP', 'institution_id=KIOST'], 'max_items': 10}
  - collection: cmip6
  - item: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.uas.gr1.v20210319
...}

Clustering Datasets

We can also specifically select the datasets which can be opened into something called a DataPointCluster which is just a grouping of datasets which are linked in some way (e.g having the same institution_id.) This grouping is entirely arbitrary and is only used in place of a list of datasets, enabling lazy loading of as many datasets as is needed.

>>> cluster = search_basic.collect_cloud_assets()

The warning displayed here indicates that one of the items did not have a dataset that could be opened. This cluster contains the recipes to open all the cloud datasets of different types.

>>> cluster.info()
>>> cluster.help()
<DataPointCluster: CEDA-333146-139631-409864 (Datasets: 10)>
 - url: https://api.stac.ceda.ac.uk
 - organisation: CEDA
 - search_terms: {'collections': ['cmip6'], 'query': ['experiment_id=ssp585', 'activity_id=ScenarioMIP', 'institution_id=KIOST'], 'max_items': 10}
 - products: 10
Products:
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.uas.gr1.v20210319-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.tas.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.sfcWind.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rsus.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rsds.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rlus.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rlds.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.psl.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.prsn.gr1.v20210928-reference_file: kerchunk
DataPointCluster Help:
 > cluster.info() - basic cluster information
 > cluster.open_dataset(index/id) - open a specific dataset in xarray
Properties:  id, meta, collection, products
See the documentation at https://cedadev.github.io/datapoint/
>>> # Again the cluster has a representation that effectively just calls the `info` method.
>>> cluster
<DataPointCluster: CEDA-333146-139631-409864 (Datasets: 10)>
 - url: https://api.stac.ceda.ac.uk
 - organisation: CEDA
 - search_terms: {'collections': ['cmip6'], 'query': ['experiment_id=ssp585', 'activity_id=ScenarioMIP', 'institution_id=KIOST'], 'max_items': 10}
 - products: 10
Products:
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.uas.gr1.v20210319-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.tas.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.sfcWind.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rsus.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rsds.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rlus.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.rlds.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.psl.gr1.v20191106-reference_file: kerchunk
 - CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.prsn.gr1.v20210928-reference_file: kerchunk

We can obtain the set of DataPointCloudProducts contained within this cluster from the products property, similar to items in the search object.

>>> cluster.products
[<DataPointCloudProduct: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106-reference_file (Format: kerchunk)>
  - url: https://api.stac.ceda.ac.uk
  - organisation: CEDA
  - search_terms: {'collections': ['cmip6'], 'query': ['experiment_id=ssp585', 'activity_id=ScenarioMIP', 'institution_id=KIOST'], 'max_items': 10}
  - collection: cmip6
  - item: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106
  - assets: 2
  - cloud_assets: 1
  - attributes: 34
  - stac_attributes: 8
  - asset_id: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106-reference_file
  - cloud_format: kerchunk
 Attributes:
  - datetime: 2058-01-01T12:00:00Z
  - start_datetime: 2015-01-17T12:00:00Z
  - end_datetime: 2100-12-17T12:00:00Z
  - access: ['HTTPServer']
  - index_node: None
  - latest: True
  - pid: None
  - replica: False
  - retracted: False
  - instance_id: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106
  - citation_url: http://cera-www.dkrz.de/WDCC/meta/CMIP6/CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106.json
  - variable_long_name: Northward Near-Surface Wind
  - variable_units: m s-1
  - cf_standard_name: northward_wind
  - activity_id: ScenarioMIP
  - data_specs_version: 01.00.30
  - experiment_title: update of RCP8.5 based on SSP5
  - frequency: mon
  - further_info_url: https://furtherinfo.es-doc.org/CMIP6.KIOST.KIOST-ESM.ssp585.none.r1i1p1f1
  - grid: atmos data regridded from Cubed-sphere (c48) to 94X192
  - grid_label: gr1
  - institution_id: KIOST
  - mip_era: CMIP6
  - source_id: KIOST-ESM
  - source_type: AGCM
  - experiment_id: ssp585
  - sub_experiment_id: none
  - nominal_resolution: 250 km
  - table_id: Amon
  - variable_id: vas
  - variant_label: r1i1p1f1
  - levels: None
  - updated: 2024-02-20T22:14:50.735178Z
  - created: 2024-02-20T22:14:50.735178Z,
...]

Getting Datasets - Cloud Products

We can select a specific CloudProduct from the cluster simply by indexing the cluster, or selecting the ID (which can be seen from the representation above):

>>> cloud1 = cluster['CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106-reference_file']
>>> cloud1
<DataPointCloudProduct: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106-reference_file (Format: kerchunk)>
 - url: https://api.stac.ceda.ac.uk
 - organisation: CEDA
 - search_terms: {'collections': ['cmip6'], 'query': ['experiment_id=ssp585', 'activity_id=ScenarioMIP', 'institution_id=KIOST'], 'max_items': 10}
 - collection: cmip6
 - item: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106
 - assets: 2
 - cloud_assets: 1
 - attributes: 34
 - stac_attributes: 8
 - asset_id: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106-reference_file
 - cloud_format: kerchunk
Attributes:
 - datetime: 2058-01-01T12:00:00Z
 - start_datetime: 2015-01-17T12:00:00Z
 - end_datetime: 2100-12-17T12:00:00Z
 - access: ['HTTPServer']
 - index_node: None
 - latest: True
 - pid: None
 - replica: False
 - retracted: False
 - instance_id: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106
 - citation_url: http://cera-www.dkrz.de/WDCC/meta/CMIP6/CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106.json
 - variable_long_name: Northward Near-Surface Wind
 - variable_units: m s-1
 - cf_standard_name: northward_wind
 - activity_id: ScenarioMIP
 - data_specs_version: 01.00.30
 - experiment_title: update of RCP8.5 based on SSP5
 - frequency: mon
 - further_info_url: https://furtherinfo.es-doc.org/CMIP6.KIOST.KIOST-ESM.ssp585.none.r1i1p1f1
 - grid: atmos data regridded from Cubed-sphere (c48) to 94X192
 - grid_label: gr1
 - institution_id: KIOST
 - mip_era: CMIP6
 - source_id: KIOST-ESM
 - source_type: AGCM
 - experiment_id: ssp585
 - sub_experiment_id: none
 - nominal_resolution: 250 km
 - table_id: Amon
 - variable_id: vas
 - variant_label: r1i1p1f1
 - levels: None
 - updated: 2024-02-20T22:14:50.735178Z
 - created: 2024-02-20T22:14:50.735178Z

The CloudProduct object wraps a single dataset meaning we don’t have to load the data file into xarray until needed. We can get some information from the STAC index about this product from this object, including all the attributes belonging to the parent Item.

>>> cloud1.info()
>>> cloud1.help()
<DataPointCloudProduct: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106-reference_file (Format: kerchunk)>
 - url: https://api.stac.ceda.ac.uk
 - organisation: CEDA
 - search_terms: {'collections': ['cmip6'], 'query': ['experiment_id=ssp585', 'activity_id=ScenarioMIP', 'institution_id=KIOST'], 'max_items': 10}
 - collection: cmip6
 - item: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106
 - assets: 2
 - cloud_assets: 1
 - attributes: 34
 - stac_attributes: 8
 - asset_id: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106-reference_file
 - cloud_format: kerchunk
Attributes:
 - datetime: 2058-01-01T12:00:00Z
 - start_datetime: 2015-01-17T12:00:00Z
 - end_datetime: 2100-12-17T12:00:00Z
 - access: ['HTTPServer']
 - index_node: None
 - latest: True
 - pid: None
 - replica: False
 - retracted: False
 - instance_id: CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106
 - citation_url: http://cera-www.dkrz.de/WDCC/meta/CMIP6/CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106.json
 - variable_long_name: Northward Near-Surface Wind
 - variable_units: m s-1
 - cf_standard_name: northward_wind
 - activity_id: ScenarioMIP
 - data_specs_version: 01.00.30
 - experiment_title: update of RCP8.5 based on SSP5
 - frequency: mon
 - further_info_url: https://furtherinfo.es-doc.org/CMIP6.KIOST.KIOST-ESM.ssp585.none.r1i1p1f1
 - grid: atmos data regridded from Cubed-sphere (c48) to 94X192
 - grid_label: gr1
 - institution_id: KIOST
 - mip_era: CMIP6
 - source_id: KIOST-ESM
 - source_type: AGCM
 - experiment_id: ssp585
 - sub_experiment_id: none
 - nominal_resolution: 250 km
 - table_id: Amon
 - variable_id: vas
 - variant_label: r1i1p1f1
 - levels: None
 - updated: 2024-02-20T22:14:50.735178Z
 - created: 2024-02-20T22:14:50.735178Z
DataPointCloudProduct Help:
 > product.info() - Get information about this cloud product.
 > product.open_dataset() - Open the dataset for this cloud product (in xarray)
Properties:  id, meta, collection, href, cloud_format, bbox, start_datetime, end_datetime, attributes, stac_attributes, variables, units
See the documentation at https://cedadev.github.io/datapoint/
>>> cloud1.attributes
{'datetime': '2058-01-01T12:00:00Z',
 'start_datetime': '2015-01-17T12:00:00Z',
 'end_datetime': '2100-12-17T12:00:00Z',
 'access': ['HTTPServer'],
 'index_node': None,
 'latest': True,
 'pid': None,
 'replica': False,
 'retracted': False,
 'instance_id': 'CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106',
 'citation_url': 'http://cera-www.dkrz.de/WDCC/meta/CMIP6/CMIP6.ScenarioMIP.KIOST.KIOST-ESM.ssp585.r1i1p1f1.Amon.vas.gr1.v20191106.json',
 'variable_long_name': 'Northward Near-Surface Wind',
 'variable_units': 'm s-1',
 'cf_standard_name': 'northward_wind',
 'activity_id': 'ScenarioMIP',
 'data_specs_version': '01.00.30',
 'experiment_title': 'update of RCP8.5 based on SSP5',
 'frequency': 'mon',
 'further_info_url': 'https://furtherinfo.es-doc.org/CMIP6.KIOST.KIOST-ESM.ssp585.none.r1i1p1f1',
 'grid': 'atmos data regridded from Cubed-sphere (c48) to 94X192',
 'grid_label': 'gr1',
 'institution_id': 'KIOST',
 'mip_era': 'CMIP6',
 'source_id': 'KIOST-ESM',
 'source_type': 'AGCM',
 'experiment_id': 'ssp585',
 'sub_experiment_id': 'none',
 'nominal_resolution': '250 km',
 'table_id': 'Amon',
 'variable_id': 'vas',
 'variant_label': 'r1i1p1f1',
 'levels': None,
 'updated': '2024-02-20T22:14:50.735178Z',
 'created': '2024-02-20T22:14:50.735178Z'}

We can now use the open_dataset method of this cloud product to obtain an Xarray representation of the data. In the future it will be possible to get a cf-python representation instead, but this is not yet implemented.

>>> ds = cloud1.open_dataset()
>>> print(ds)
<xarray.Dataset> Size: 76MB
Dimensions:    (lat: 96, bnds: 2, lon: 192, time: 1032)
Coordinates:
  * lat        (lat) float64 768B -90.0 -88.11 -86.21 ... 86.21 88.11 90.0
  * lon        (lon) float64 2kB 0.9375 2.812 4.688 6.563 ... 355.3 357.2 359.1
  * time       (time) object 8kB 2015-01-17 12:00:00 ... 2100-12-17 12:00:00
Dimensions without coordinates: bnds
Data variables:
    lat_bnds   (lat, bnds) float64 2kB dask.array<chunksize=(96, 2), meta=np.ndarray>
    lon_bnds   (lon, bnds) float64 3kB dask.array<chunksize=(192, 2), meta=np.ndarray>
    time_bnds  (time, bnds) object 17kB dask.array<chunksize=(1, 2), meta=np.ndarray>
    vas        (time, lat, lon) float32 76MB dask.array<chunksize=(1, 96, 192), meta=np.ndarray>
Attributes: (12/47)
    Conventions:            CF-1.7 CMIP-6.2
    activity_id:            ScenarioMIP
    branch_method:          standard
    branch_time_in_child:   60266.0
    branch_time_in_parent:  60266.0
    cmor_version:           3.5.0
    ...                     ...
    table_id:               Amon
    table_info:             Creation Date:(30 April 2019) MD5:cc2ae51c23960ce...
    title:                  KIOST-ESM output prepared for CMIP6
    tracking_id:            hdl:21.14100/7640f386-9b1b-4803-a489-ab4f524b9eba
    variable_id:            vas
    variant_label:          r1i1p1f1

From this point we are dealing with a single specific Xarray Dataset object, meaning all standard xarray methods can be applied. For help with using Xarray datasets, see the xarray documentation at https://docs.xarray.dev/en/stable/.