Tutorial de 5 minutos#

La manera mas accesible de usar pydap es como cliente de acceso a datos cientificos en servidores de OPeNDAP. Para ello, puedes utilizar pydap de directamente por medio del metodo open_url, or usa pydap como engine por medio de xarray directamente. xarray hace possible el uso de las herramientas del ecosistema de Pangeo.

OPeNDAP - La vision original#

La vision original de OPeNDAP (Cornillion, et al 1993) fue el hacer la equivalencia:

\( \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; \boxed{\text{URL} \approx \text{Dataset Remoto} }\)

Y ademas,

\( \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; \boxed{\text{URL + Restricciones} \approx \text{Subregion de un Dataset Remoto}} \)

En este corto tutorial demostraremos el accesso a informacion cientifica en un servidor de OPeNDAP por medio de

  • pydap

  • xarray

For more information about OPeNDAP and Hyrax you can go to the official OPeNDAP documentation.

El dataset remote que utilizaremos en este tutorial puede ser inspeccionado aqui

from pydap.client import open_url
import xarray as xr
import numpy as np

Ahora definimos el URL que apunta al dataset remoto en el servidor de OPeNDAP.

url = "http://test.opendap.org:8080/opendap/tutorials/20220531090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc"

PyDAP#

Empezamos primero el acceso al archivo usando solamente Pydap

pydap_ds = open_url(url, protocol='dap4')

Note

Ademas del argumento url que define al dataset, tambien definimos el argumento protocol="dap4". Esto hace referencia al Protocol de OPeNDAP. Otra opcion es: protocol='dap2'.

Note

Existen muchos servidores de OPeNDAP,pero solo 2 de ellos implementan el protocolo DAP4. Cualquier servidor que implemente DAP4 tambien implementa DAP2. En este tutorial nos enfocaremos en DAP4.

pydap descarga del servidor OPeNDAP los metadatos, es decir, la informacion que describe los contenidos del archivo remote. Sin embargo, ningun dato numerico or binario a sido descargado hasta este momento. Para visualizar las variables que existen dentro del archivo, executamos el metodo .tree():

pydap_ds.tree()
.20220531090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc
├──time
├──lat
├──lon
├──analysed_sst
├──analysis_error
├──mask
├──sea_ice_fraction
├──dt_1km_data
└──sst_anomaly
pydap_ds['sst_anomaly'].shape
(1, 17999, 36000)
print('La variable numerica `sst_anomaly` ocupa: ', pydap_ds['sst_anomaly'].nbytes/1e9, '[GBs] de memoria')
La variable numerica `sst_anomaly` ocupa:  1.295928 [GBs] de memoria

Note

Solo los metadatos han sido descargados. PyDAP processa estos metadatos del URL remoto para create el Dataset que hace referencia al contenido del archivo remoto.

Cada variable contiene atributos que describen los valores, y algunas de las transformaciones que deben efectuarse para darle sentido fisico a las variables en si. Por ejemplo, scale_factor, offsets and _FillValue.

pydap_ds['sst_anomaly'].attributes
{'long_name': 'SST anomaly from a seasonal SST climatology based on the MUR data over 2003-2014 period',
 'units': 'kelvin',
 '_FillValue': -32768,
 'add_offset': 0.0,
 'scale_factor': 0.001,
 'valid_min': -32767,
 'valid_max': 32767,
 'comment': 'anomaly reference to the day-of-year average between 2003 and 2014',
 'coordinates': 'lon lat',
 'dims': ['time', 'lat', 'lon'],
 'Maps': ('/time', '/lat', '/lon')}

Los metadatos cientificos siguen las convenciones definidas en: NetCDF Climate and Forcasts (CF) Metadata Conventions.

Como Descargar el Arreglo numerico de la variable remota#

Como se menciono, Pydap no ha descargado ningun arreglo numerico. Para descargar los valores de digamos una vbariable de interes, uno debe de indexar la varible de Pydap. Por ejemplo, la variable

 pydap_ds['sst_anomaly']

tiene las siguientes dimensiones: (1, 17999, 36000). Uno puede descarga una fraccion de la variable, por ejemplo el elemento 0 de la primera dimension, los primeros 10 elementos de la segunda dimension, y los primeros 10 de la tercera dimension, de la manera siguiente:

%%time
array = pydap_ds['sst_anomaly'][0, 0:10, 0:10]
CPU times: user 29.2 ms, sys: 3.03 ms, total: 32.3 ms
Wall time: 238 ms
np.shape(array)
(1, 10, 10)

Como se demonstro, el nuevo tamano de la variable array es (1, 10, 10).

Al descargar la variable sst_anomaly y assignarla al objecto: array, este objeto no es todavia un arreglo NumPy, sino es un BaseType del model de pydap:

type(array)
pydap.model.BaseType

Para extraer el arreglo NumPy de cada BaseType, uno tiene que executar la siguiente instruccion:

data = array.data
type(data)
numpy.ndarray

Utiliza el Servidor Remoto#

Cuando el usuario hace la siguiente operacion:

pydap_ds['sst_anomaly'][0, 0:10, 0:10]
``

Lo que `Pydap` hace internamente es generar el URL con la Expression de Restriccion. EL Servidor de OPeNDAP reconoce este URL y manda la informacion numerica especificada en el resultante URL. Eso significa que el archivo completo nunca fue descargado! Solo parte espeficidada en el URL. En este caso, Pydap incluyo la siguiente informacion al URL:

```python
<OPeNDAP_URL> + "?dap4.ce=\sst_anomaly[0][0:1:9][0:1:9]"

Un usuario puede realizar esta operacion manual, pero pydap facilita y automatiza este procedimiento. El URL de arriba implica que de todo el dataset original, solo la variable sst_anomaly es requerida, y de todo el dominio de la variable, solo la region especificada por las indexes [0][0:1:9][0:1:9] debe ser mandada por el servidor OPeNDAP. ENtonces, es el Servidor OPeNDAP remote el que realiza la operacion de abrir y mandar la informacion numerica al usuario. Lo indexes en el URL implican

  • El primer elemento dela primera dimension (en este caso, time).

  • [0:1:9] indica los primeros 10 elementos de la segunda dimension (llamada lat).

  • [0:1:9] indica los primeros 10 elementos de la tercera dimension (llamada lon).

#

A continuacion, utilizamos pydap con el URL que incluye la condicion de Restriccion (CE) para descargar las variables lat y sst_anomaly

CE = "?dap4.ce=/lat;/sst_anomaly[0][0:1:9][0:1:9]"
pydap_ds = open_url(url+CE, protocol='dap4')
pydap_ds.tree()
.20220531090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc
├──lat
└──sst_anomaly
pydap_ds['sst_anomaly'].shape
(1, 10, 10)
pydap_ds['lat'].shape
(17999,)

Note

El servidor de OPeNDAP solo applico la restriccion espacial a la variable sst_anomaly, mientras que lat (y cualquier otra) mantuvo su tamano original. Para asegurar que tambien la variable lat mantenga el mismo tamano en la dimension compartida con sst_anomaly, uno puede especicar en el URL que lat tambien debe ser restringida espacialmente.

Xarray#

PyDAPse puede utilizar internamente desde xarray, al definir el parametro

engine='pydap'

Tip

Para especificar que protocolo dap2 o dap4 se debe usar en xarray cuando se especifica engine=pydap, hay que reemplazar el esquema del URL https con dap2 o dap4.

'dap4'+url[4:]
'dap4://test.opendap.org:8080/opendap/tutorials/20220531090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc'
dataset = xr.open_dataset('dap4'+url[4:], engine='pydap')
dataset
<xarray.Dataset> Size: 29GB
Dimensions:           (/time: 1, /lat: 17999, /lon: 36000)
Coordinates:
    lat               (/lat) float32 72kB ...
    lon               (/lon) float32 144kB ...
Dimensions without coordinates: /time, /lat, /lon
Data variables:
    time              (/time) datetime64[ns] 8B ...
    analysed_sst      (/time, /lat, /lon) float64 5GB ...
    analysis_error    (/time, /lat, /lon) float64 5GB ...
    mask              (/time, /lat, /lon) float32 3GB ...
    sea_ice_fraction  (/time, /lat, /lon) float64 5GB ...
    dt_1km_data       (/time, /lat, /lon) timedelta64[ns] 5GB ...
    sst_anomaly       (/time, /lat, /lon) float64 5GB ...
Attributes: (12/47)
    Conventions:                CF-1.7
    title:                      Daily MUR SST, Final product
    summary:                    A merged, multi-sensor L4 Foundation SST anal...
    references:                 http://podaac.jpl.nasa.gov/Multi-scale_Ultra-...
    institution:                Jet Propulsion Laboratory
    history:                    created at nominal 4-day latency; replaced nr...
    ...                         ...
    project:                    NASA Making Earth Science Data Records for Us...
    publisher_name:             GHRSST Project Office
    publisher_url:              http://www.ghrsst.org
    publisher_email:            ghrsst-po@nceo.ac.uk
    processing_level:           L4
    cdm_data_type:              grid