# 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