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 primeros10
elementos de la segunda dimension (llamadalat
).[0:1:9]
indica los primeros10
elementos de la tercera dimension (llamadalon
).
#
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#
PyDAP
se 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