Case study of prediction performance in Pearl River Estuary
[1]:
import h5py
import scipy
import numpy as np
import torch
[2]:
def load(path):
path = path + "/with_imputation"
preds = []
for i in range(10):
preds.append(np.load(path+"/prediction_{}.npy".format(i)))
return np.stack(preds, axis=1)
[3]:
base_dir = "../log/prediction/PRE/"
prediction_xg_wo = torch.from_numpy(np.load(base_dir+"XGBoost/without_imputation/prediction_0.npy", allow_pickle=True))
prediction_our = torch.from_numpy(load(base_dir+"STIMP"))
prediction_predrnn_wo = torch.from_numpy(np.load(base_dir+"PredRNN/without_imputation/prediction_0.npy", allow_pickle=True))
prediction_pde = np.load("../data/PRE/cmoms.npy")
[4]:
label = np.load("../data/PRE/trues.npy")
label_masks = np.load("../data/PRE/true_masks.npy")
index = [46*i for i in range(306//46)]
label_masks = label_masks.squeeze()
label = label.squeeze()
label = torch.from_numpy(label)
label_masks = torch.from_numpy(label_masks)
Fig 3i: Predicted Chl_a of CMOMS, STIMP and PredRNN at Position 1
[6]:
#CMOMS
from copy import deepcopy
import seaborn as sns
import matplotlib.pyplot as plt
n=803
index = [46*i for i in range(306//46)]
tmp = deepcopy(label[index].reshape(276,-1))
tmp_mask = deepcopy(label_masks[index].reshape(276,-1))
tmp[~tmp_mask.bool()]=np.nan
plt.scatter(np.arange(276), tmp[:,n], c='red', s=10,label="Observed")
predict = deepcopy(prediction_pde[:276])
predict = predict[:,n]
plt.plot(np.arange(276), predict, label="CMOMS")
plt.ylim(-0.5,1.5)
plt.xticks([])
plt.yticks([-0.4,0.5,1.4], fontsize=16)
plt.ylabel("Chl_a (Log(ug/L))", fontsize=20)
plt.show()
[7]:
#STIMP
plt.scatter(np.arange(276), tmp[:,n], c='red', s=10,label="Observed")
predict = deepcopy(prediction_our[index].transpose(1,2).reshape(276,10,4443))
predict = predict[:,:,n]
mean = predict.mean(1)
std = predict.std(1)
plt.plot(np.arange(276), mean, label="STImp")
plt.fill_between(np.arange(276), mean-std, mean+std, alpha=0.3)
plt.xticks(fontsize=14)
plt.yticks([])
plt.ylim(-0.5,1.5)
plt.show()
[8]:
#PredRNN
plt.scatter(np.arange(276), tmp[:,n], c='red', s=10,label="Observed")
predict = deepcopy(prediction_predrnn_wo[index].reshape(276,4443))
predict = predict[:,n]
plt.plot(np.arange(276), predict, label="STImp")
plt.ylim(-0.5,1.5)
plt.yticks([])
plt.xticks([])
plt.show()
Fig 3i: Predicted Chl_a of CMOMS, STIMP and PredRNN at Position 2
[9]:
n=4006
index = [46*i for i in range(306//46)]
tmp = deepcopy(label[index].reshape(276,-1))
tmp_mask = deepcopy(label_masks[index].reshape(276,-1))
tmp[~tmp_mask.bool()]=np.nan
plt.scatter(np.arange(276), tmp[:,n], c='red', s=10,label="Observed")
predict = deepcopy(prediction_pde[:276])
predict = predict[:,n]
plt.plot(np.arange(276), predict, label="CMOMS")
plt.ylim(-2.8,0.1)
plt.xticks([])
plt.yticks(np.arange(-2.5, 0.5, 1), fontsize=16)
plt.ylabel("Chl_a (Log(ug/L))", fontsize=20)
plt.show()
[10]:
#STIMP
plt.scatter(np.arange(276), tmp[:,n], c='red', s=10,label="Observed")
predict = deepcopy(prediction_our[index].transpose(1,2).reshape(276,10,4443))
predict = predict[:,:,n]
mean = predict.mean(1)
std = predict.std(1)
plt.plot(np.arange(276), mean, label="STImp")
plt.fill_between(np.arange(276), mean-std, mean+std, alpha=0.3)
# plt.legend()
plt.xticks([])
plt.yticks([])
plt.ylim(-2.8,0.1)
plt.show()
[11]:
plt.scatter(np.arange(276), tmp[:,n], c='red', s=10,label="Observed")
predict = deepcopy(prediction_predrnn_wo[index].reshape(276,4443))
predict = predict[:,n]
plt.plot(np.arange(276), predict, label="STImp")
# plt.legend()
plt.ylim(-2.8,0.1)
plt.yticks([])
plt.xticks([])
plt.show()
Fig 3i: Predicted Chl_a of CMOMS, STIMP and PredRNN at Position 3
[12]:
n=2667
index = [46*i for i in range(306//46)]
tmp = deepcopy(label[index].reshape(276,-1))
tmp_mask = deepcopy(label_masks[index].reshape(276,-1))
tmp[~tmp_mask.bool()]=np.nan
plt.scatter(np.arange(276), tmp[:,n], c='red', s=10,label="Observed")
predict = deepcopy(prediction_pde[:276])
predict = predict[:,n]
plt.plot(np.arange(276), predict, label="CMOMS")
plt.ylim(-2.2,0.5)
plt.xticks([])
plt.yticks([-2.1,-1.1,0.4], fontsize=16)
plt.ylabel("Chl_a (Log(ug/L))", fontsize=20)
plt.show()
[13]:
plt.scatter(np.arange(276), tmp[:,n], c='red', s=10,label="Observed")
predict = deepcopy(prediction_our[index].transpose(1,2).reshape(276,10,4443))
predict = predict[:,:,n]
mean = predict.mean(1)
std = predict.std(1)
plt.plot(np.arange(276), mean, label="STImp")
plt.fill_between(np.arange(276), mean-std, mean+std, alpha=0.3)
# plt.legend()
plt.xticks([])
plt.yticks([])
plt.ylim(-2.2,0.5)
plt.show()
[14]:
plt.scatter(np.arange(276), tmp[:,n], c='red', s=10,label="Observed")
predict = deepcopy(prediction_predrnn_wo[index].reshape(276,4443))
predict = predict[:,n]
plt.plot(np.arange(276), predict, label="STImp")
# plt.legend()
plt.ylim(-2.2,0.5)
plt.yticks([])
plt.xticks([])
plt.show()
Fig 3j: True Chl_a, predicted Chl_a of STIMP and DINEOF on 2 February 2016
[15]:
from mpl_toolkits import basemap
from sklearn.cluster import KMeans, DBSCAN, SpectralClustering
import cartopy.crs as ccrs
from copy import deepcopy
import h5py
from numpy import meshgrid
import numpy as np
t = 43
is_sea = np.load("../data/PRE/is_sea.npy")
tmp = deepcopy(label[46,t,:])
tmp[~label_masks[0,t,:].bool()] = np.nan
ob = np.zeros((60,96))
ob[is_sea.astype(bool)] = tmp
ob[~is_sea.astype(bool)]= np.nan
lon = np.load("../data/PRE/lon.npy")
lati = np.load("../data/PRE/lati.npy")
lon1, lon2, lati1, lati2 = lon.min(), lon.max(), lati.min(), lati.max()
map = basemap.Basemap(llcrnrlon=lon1, llcrnrlat=lati1,urcrnrlon=lon2, urcrnrlat=lati2, projection='cyl', resolution='f')
# map.fillcontinents(color='white')
map.drawlsmask(land_color='white', ocean_color='lightgray', resolution='f',grid=1.25)
# map.bluemarble()
map.drawcoastlines()
map.contourf(lon, lati, ob, levels=np.linspace(-1.5, 1.5, 40),cmap="rainbow",extend="both")
[15]:
<matplotlib.contour.QuadContourSet at 0x75e3c028ac40>
Fig 3j: Predicted Chl_a of STIMP on 2 February 2016
[16]:
tmp = deepcopy(prediction_our[46,:, t,:].mean(0))
pre = np.zeros((60,96))
pre[is_sea.astype(bool)] = tmp
pre[~is_sea.astype(bool)]= np.nan
lon1, lon2, lati1, lati2 = lon.min(), lon.max(), lati.min(), lati.max()
map = basemap.Basemap(llcrnrlon=lon1, llcrnrlat=lati1,urcrnrlon=lon2, urcrnrlat=lati2, projection='cyl', resolution='f')
# map.fillcontinents(color='white')
map.drawlsmask(land_color='white', ocean_color='lightgray', resolution='f',grid=1.25)
# map.bluemarble()
map.drawcoastlines()
map.contourf(lon, lati, pre, levels=np.linspace(-1.5, 1.5, 40),cmap="rainbow",extend='both')
[16]:
<matplotlib.contour.QuadContourSet at 0x75e6ab736670>
[18]:
tmp = deepcopy(prediction_pde[46+t,:])
pre = np.zeros((60,96))
pre[is_sea.astype(bool)] = tmp
pre[~is_sea.astype(bool)]= np.nan
lon1, lon2, lati1, lati2 = lon.min(), lon.max(), lati.min(), lati.max()
map = basemap.Basemap(llcrnrlon=lon1, llcrnrlat=lati1,urcrnrlon=lon2, urcrnrlat=lati2, projection='cyl', resolution='f')
# map.fillcontinents(color='white')
map.drawlsmask(land_color='white', ocean_color='lightgray', resolution='f',grid=1.25)
# map.bluemarble()
map.drawcoastlines()
map.contourf(lon, lati, pre, levels=np.linspace(-1.5, 1.5, 40),cmap="rainbow",extend='both')
# map.contourf(x, y, tmp2, levels=np.linspace(-1.5, 1.5, 40),cmap="Greys")
map.colorbar(boundaries=np.linspace(-1.5, 1.5, 20), ticks=np.linspace(-1.5, 1.5, 6))
[18]:
<matplotlib.colorbar.Colorbar at 0x75e3ba9111f0>
Fig 3j: True Chl_a, predicted Chl_a of STIMP and DINEOF on 16 July 2016
[19]:
t = 0
is_sea = np.load("../data/PRE/is_sea.npy")
tmp = deepcopy(label[46,t,:])
tmp[~label_masks[0,t,:].bool()] = np.nan
ob = np.zeros((60,96))
ob[is_sea.astype(bool)] = tmp
ob[~is_sea.astype(bool)]= np.nan
lon = np.load("../data/PRE/lon.npy")
lati = np.load("../data/PRE/lati.npy")
lon1, lon2, lati1, lati2 = lon.min(), lon.max(), lati.min(), lati.max()
map = basemap.Basemap(llcrnrlon=lon1, llcrnrlat=lati1,urcrnrlon=lon2, urcrnrlat=lati2, projection='cyl', resolution='f')
# map.fillcontinents(color='white')
map.drawlsmask(land_color='white', ocean_color='lightgray', resolution='f',grid=1.25)
# map.bluemarble()
map.drawcoastlines()
map.contourf(lon, lati, ob, levels=np.linspace(-1.5, 1.5, 40),cmap="rainbow",extend="both")
[19]:
<matplotlib.contour.QuadContourSet at 0x75e3bb3ec700>
[20]:
tmp = deepcopy(prediction_our[46,:, t,:].mean(0))
pre = np.zeros((60,96))
pre[is_sea.astype(bool)] = tmp
pre[~is_sea.astype(bool)]= np.nan
lon1, lon2, lati1, lati2 = lon.min(), lon.max(), lati.min(), lati.max()
map = basemap.Basemap(llcrnrlon=lon1, llcrnrlat=lati1,urcrnrlon=lon2, urcrnrlat=lati2, projection='cyl', resolution='f')
# map.fillcontinents(color='white')
map.drawlsmask(land_color='white', ocean_color='lightgray', resolution='f',grid=1.25)
# map.bluemarble()
map.drawcoastlines()
map.contourf(lon, lati, pre, levels=np.linspace(-1.5, 1.5, 40),cmap="rainbow",extend='both')
[20]:
<matplotlib.contour.QuadContourSet at 0x75e3bb32d700>
[21]:
tmp = deepcopy(prediction_pde[46+t,:])
pre = np.zeros((60,96))
pre[is_sea.astype(bool)] = tmp
pre[~is_sea.astype(bool)]= np.nan
lon1, lon2, lati1, lati2 = lon.min(), lon.max(), lati.min(), lati.max()
map = basemap.Basemap(llcrnrlon=lon1, llcrnrlat=lati1,urcrnrlon=lon2, urcrnrlat=lati2, projection='cyl', resolution='f')
# map.fillcontinents(color='white')
map.drawlsmask(land_color='white', ocean_color='lightgray', resolution='f',grid=1.25)
# map.bluemarble()
map.drawcoastlines()
map.contourf(lon, lati, pre, levels=np.linspace(-1.5, 1.5, 40),cmap="rainbow",extend='both')
# map.contourf(x, y, tmp2, levels=np.linspace(-1.5, 1.5, 40),cmap="Greys")
map.colorbar(boundaries=np.linspace(-1.5, 1.5, 20), ticks=np.linspace(-1.5, 1.5, 6))
[21]:
<matplotlib.colorbar.Colorbar at 0x75e3bb31ab50>
Fig 3j: True Chl_a, predicted Chl_a of STIMP and DINEOF on 8 January 2016
[23]:
t = 20
is_sea = np.load("../data/PRE/is_sea.npy")
tmp = deepcopy(label[46,t,:])
tmp[~label_masks[0,t,:].bool()] = np.nan
ob = np.zeros((60,96))
ob[is_sea.astype(bool)] = tmp
ob[~is_sea.astype(bool)]= np.nan
lon = np.load("../data/PRE/lon.npy")
lati = np.load("../data/PRE/lati.npy")
lon1, lon2, lati1, lati2 = lon.min(), lon.max(), lati.min(), lati.max()
map = basemap.Basemap(llcrnrlon=lon1, llcrnrlat=lati1,urcrnrlon=lon2, urcrnrlat=lati2, projection='cyl', resolution='f')
# map.fillcontinents(color='white')
map.drawlsmask(land_color='white', ocean_color='lightgray', resolution='f',grid=1.25)
# map.bluemarble()
map.drawcoastlines()
map.contourf(lon, lati, ob, levels=np.linspace(-1.5, 1.5, 40),cmap="rainbow",extend="both")
[23]:
<matplotlib.contour.QuadContourSet at 0x75e3bb636160>
[24]:
tmp = deepcopy(prediction_our[46,:, t,:].mean(0))
pre = np.zeros((60,96))
pre[is_sea.astype(bool)] = tmp
pre[~is_sea.astype(bool)]= np.nan
lon1, lon2, lati1, lati2 = lon.min(), lon.max(), lati.min(), lati.max()
map = basemap.Basemap(llcrnrlon=lon1, llcrnrlat=lati1,urcrnrlon=lon2, urcrnrlat=lati2, projection='cyl', resolution='f')
# map.fillcontinents(color='white')
map.drawlsmask(land_color='white', ocean_color='lightgray', resolution='f',grid=1.25)
# map.bluemarble()
map.drawcoastlines()
map.contourf(lon, lati, pre, levels=np.linspace(-1.5, 1.5, 40),cmap="rainbow",extend='both')
[24]:
<matplotlib.contour.QuadContourSet at 0x75e3bb3d45b0>
[25]:
tmp = deepcopy(prediction_pde[46+t,:])
pre = np.zeros((60,96))
pre[is_sea.astype(bool)] = tmp
pre[~is_sea.astype(bool)]= np.nan
lon1, lon2, lati1, lati2 = lon.min(), lon.max(), lati.min(), lati.max()
map = basemap.Basemap(llcrnrlon=lon1, llcrnrlat=lati1,urcrnrlon=lon2, urcrnrlat=lati2, projection='cyl', resolution='f')
# map.fillcontinents(color='white')
map.drawlsmask(land_color='white', ocean_color='lightgray', resolution='f',grid=1.25)
# map.bluemarble()
map.drawcoastlines()
map.contourf(lon, lati, pre, levels=np.linspace(-1.5, 1.5, 40),cmap="rainbow",extend='both')
# map.contourf(x, y, tmp2, levels=np.linspace(-1.5, 1.5, 40),cmap="Greys")
map.colorbar(boundaries=np.linspace(-1.5, 1.5, 20), ticks=np.linspace(-1.5, 1.5, 6))
[25]:
<matplotlib.colorbar.Colorbar at 0x75e3bb3cbd60>