# Procesar Datos de Tablas/Matrices
# Que son las librerias y para que se usan
# Seleccionar valores específicos de una matriz
# Leer archivos netcdf
# Realizar operaciones matemáticas/estadísticas en matrices/tablas
import numpy as np # numerical python
import netCDF4 as nc

Numpy arrays#

# Ver presentación
spy = np.array([1, 4, 5.0, 6])
type(spy) # variable es un numpy arrray pero no dice que hay dentro de spy
numpy.ndarray
# Podemos utilizar el punto spy.dtype ya que dtype es una función de numpy
print(spy.dtype) # Tipo de datos dentro del array spy
float64
print(spy.shape) # tamaño de variable spy
print(np.shape(spy))
print(spy[3])
print(spy[-1])
(4,)
(4,)
6.0
6.0
print('primer valor en los datos:', spy[0]) # 0 es el indice 1 en Python
primer valor en los datos: 1.0

Slicing data#

Podemos seleccionar un indíce o una sección del vector

print(spy)
[1. 4. 5. 6.]
print(spy[2:]) # empieza en el índice 2 hasta el final
print(spy[1:3]) # empieza en el índice 1 pero no incluye el 3
[5. 6.]
[4. 5.]
# No tenemos que incluir el límite inferior ni superior
print(spy[:2]) # significa desde el índice 0 hasta el 4
[1. 4.]
print(np.mean(spy)) # numpy tiene funciones que realizan operaciones en el vector
4.0
print(spy.mean())
print(spy.std())
4.0
1.8708286933869707

Reading netCDF#

# Ahora utilizemos datos atmósfericos para algo más complicado
fileobj = nc.Dataset('shared/ERA5/ERA5_Coarse.nc') # Lee el archivo netcdf nc la extension
# netCDF network Common Data Form formato que guarda datos MULTIDIMENSIONALES
print(fileobj)
<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF4 data model, file format HDF5):
    dimensions(sizes): time(756), latitude(180), longitude(360)
    variables(dimensions): int16 u10(time, latitude, longitude), int16 v10(time, latitude, longitude), int16 sst(time, latitude, longitude), int16 sp(time, latitude, longitude), int16 t2m(time, latitude, longitude), int16 tp(time, latitude, longitude), float32 t2m_F(time, latitude, longitude), float32 longitude(longitude), float32 latitude(latitude), int32 time(time)
    groups: 
print(fileobj.variables.keys())
dict_keys(['u10', 'v10', 'sst', 'sp', 't2m', 'tp', 't2m_F', 'longitude', 'latitude', 'time'])
print(fileobj.variables.keys()) # siempre revisar que variables hay en el archivo
dict_keys(['u10', 'v10', 'sst', 'sp', 't2m', 'tp', 't2m_F', 'longitude', 'latitude', 'time'])
# Guarda en la memoria virtual estas variables
lon = fileobj['longitude']
lat = fileobj['latitude']
time = fileobj['time']
print(lon)
<class 'netCDF4._netCDF4.Variable'>
float32 longitude(longitude)
    _FillValue: nan
    units: degrees_east
    long_name: longitude
unlimited dimensions: 
current shape = (360,)
filling on
print(lat) # nos da una explicación sobre la variable
<class 'netCDF4._netCDF4.Variable'>
float32 latitude(latitude)
    _FillValue: nan
    units: degrees_north
    long_name: latitude
unlimited dimensions: 
current shape = (180,)
filling on
sst = fileobj['sst'] 
print(sst) # cuantas dimensiones tiene esta variable
<class 'netCDF4._netCDF4.Variable'>
int16 sst(time, latitude, longitude)
    _FillValue: -32767
    units: K
    long_name: Sea surface temperature
    add_offset: 289.4649014722902
    scale_factor: 0.0006169772945977599
    missing_value: -32767
unlimited dimensions: 
current shape = (756, 180, 360)
filling on
sst = fileobj['sst'][:] # que son los dos puntitos
print(np.shape(sst))
(756, 180, 360)
print(sst.shape) # cuantas dimensiones tiene esta variable
(756, 180, 360)

Numpy tiene funciones útiles para analizar datos!

print(sst.std())
print(np.std(sst))
11.668331290394544
11.668331290394544
print(sst.mean()) # Si quieres el promedio de todos los datos
286.63940498273524
sst_C = sst - 273.15
print(sst_C.mean())
13.489404982734603
maxval, minval, stdval = np.max(sst_C), np.min(sst_C), np.std(sst_C)
print('Max SST:', maxval)
print('Min SST:', minval)
print('Desviación Standard:', stdval)
Max SST: 36.185889199400265
Min SST: -3.7553699209748856
Desviación Standard: 11.668331290394526

Como saber que funciones tiene numpy. Escribir np y después tab. Intentálo!

Cuando analizamos datos oceanográficos generalmente queremos saber el promedio sobre un area o tiempo específico

# Ir a la presentación
print(np.mean(sst_C, axis=0))
[[-1.690020472943193 -1.690020472943193 -1.690020472943193 ...
  -1.690020472943193 -1.690020472943193 -1.690020472943193]
 [-1.6900188407281278 -1.6900196568356602 -1.6900196568356602 ...
  -1.6900172085130627 -1.6900180246205951 -1.6900188407281278]
 [-1.6900188407281278 -1.6900188407281278 -1.6900188407281278 ...
  -1.69001639240553 -1.6900180246205951 -1.6900188407281278]
 ...
 [-- -- -- ... -- -- --]
 [-- -- -- ... -- -- --]
 [-- -- -- ... -- -- --]]
# El promedio de la temperatura en cada lat y lon de todo el tiempo
print(np.mean(sst_C, axis=0).shape)  # axis =0 es sobre dimensión 0 (tiempo)
(180, 360)
# El promedio de la temperatura sobre todos los renglones (latitud)
print(np.mean(sst_C, axis=1).shape) # axis = 1 es sobre dimensión renglones (rows latitud)
(756, 360)
np.mean(sst_C, axis=0).mean(axis=1)
masked_array(data=[-1.6900181379688635, -1.690006760069681,
                   -1.6899877243614847, -1.6899144991131279,
                   -1.6899064513860709, -1.6896772067801817,
                   -1.6884178440431403, -1.6823770204799693,
                   -1.6489731771821603, -1.5816772256881508,
                   -1.4771803220097532, -1.3479930015591848,
                   -1.182235642307473, -0.9939801886754818,
                   -0.7373676366667153, -0.5040172492606008,
                   -0.26965351854671754, 0.09446895101639383,
                   0.4336198428509824, 0.8837989185510522,
                   1.0174925322963926, 1.1327164454932175,
                   1.6139704045547965, 2.1984112278902455,
                   2.718583477733101, 3.1846600108358323,
                   3.919262133697807, 3.9705070618289255,
                   4.317240345330061, 4.673977128405407,
                   5.0296964536867925, 5.5145073541889404,
                   5.818161982028872, 6.122005792976584,
                   6.357286307900196, 6.698262968414926, 6.76358540180476,
                   7.240890160611007, 7.514439800294637,
                   7.8130902083881795, 8.263033293152104,
                   8.439452499326954, 8.803072657945508,
                   9.594178302820403, 10.389353000293163,
                   11.268988810893404, 12.26357344536613,
                   13.071534492997367, 14.157506472518037,
                   15.330075151798367, 16.389892732217113,
                   17.189522311583517, 18.033297459564388,
                   18.752127476796122, 19.35107592315887,
                   19.835805361674115, 20.462167822792946,
                   20.982455859116513, 21.350112474809325,
                   21.701947761863433, 22.439357099006177,
                   22.923373974508387, 23.523208511302965,
                   24.014823522225225, 24.516835423586233,
                   24.84081779589453, 25.1246568797575,
                   25.413527500737956, 25.70519033320649,
                   25.982744715951547, 26.295153343538253,
                   26.524745738710948, 26.760850942338067,
                   26.984901176322214, 27.178847064601282,
                   27.32670109538924, 27.473530177548927,
                   27.58818219454823, 27.667606347619078,
                   27.781885987319857, 27.942765864681146,
                   28.048944040893407, 28.12912726984836,
                   28.201063104132917, 28.174411518957804,
                   28.134804308368945, 28.097507673164746,
                   27.977594994083063, 27.75894354336433,
                   27.46125471288095, 27.30234341526245,
                   27.30329100157845, 27.387579888318072,
                   27.41628785299799, 27.47991015299138,
                   27.45452788623761, 27.426351393397297,
                   27.337179301888796, 27.24485500024314,
                   27.159752158915904, 27.023895177748543,
                   26.891526902095325, 26.715642144077616,
                   26.49928726905775, 26.230276529555447,
                   25.90408461700788, 25.558853295052106,
                   25.342357772571688, 25.025825834625735,
                   24.72872830643171, 24.438028442756085,
                   24.067554498440263, 23.7388313220877,
                   23.412171190917682, 23.08220995753288,
                   22.74097156354641, 22.347648892592737,
                   21.953197579539374, 21.490999318822144,
                   20.986984581661304, 20.481335038062543,
                   19.897564444390103, 19.328976374695134,
                   18.74759216969734, 18.16499190510353,
                   17.58717599476669, 16.96613230351236,
                   16.32711002686899, 15.638052721841344,
                   14.935252847709545, 14.140982409567343,
                   13.288524069476008, 12.346274338783608,
                   11.408118783501955, 10.489186734472739,
                   9.613138560329782, 8.851594976837715,
                   8.077582037974743, 7.340193578053533,
                   6.576840517722451, 5.912081311025313,
                   5.336482145540234, 4.7913230128964654,
                   4.2465665007530715, 3.7307410571518314,
                   3.2377557176479717, 2.663734184084183,
                   2.11479494703165, 1.6088955414237651,
                   1.1168191135688328, 0.6531749857640199,
                   0.21425257322596983, -0.1769660734681487,
                   -0.5405649503733324, -0.8542330989373138,
                   -1.113105142560139, -1.2886685512452507,
                   -1.3715486419977305, -1.4611978621455668,
                   -1.5462684829986444, -1.6011792725711507,
                   -1.630589715665575, -1.6430794478170205,
                   -1.641895355189927, -1.6401971418052792,
                   -1.6323259918765443, -1.6139779899952689,
                   -1.6103907780922724, -1.6106058650595783, --, --, --,
                   --, --, --, --, --, --, --, --],
             mask=[False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False, False, False, False, False, False, False, False,
                   False,  True,  True,  True,  True,  True,  True,  True,
                    True,  True,  True,  True],
       fill_value=1e+20)

y que es axis=2?

a = np.array([[1, 2], [3, 4]], float) # crear una matriz de dos dimensiones tipo float
b = np.array([[5, 6], [7,8]], float)

print('Matrix A')
print(a)
print('Matrix B')
print(b)
Matrix A
[[1. 2.]
 [3. 4.]]
Matrix B
[[5. 6.]
 [7. 8.]]
np.concatenate((a,b)) # unir las dos matrices
array([[1., 2.],
       [3., 4.],
       [5., 6.],
       [7., 8.]])
np.concatenate((a,b), axis=1) # unir las dos matrices
array([[1., 2., 5., 6.],
       [3., 4., 7., 8.]])
import xarray as xr # Libreria para procesar datos de gran tamaño