Py学习  »  Python

代码共享 | 基于Python的网格数据MK分析和相关性分析

happy科研 • 1 年前 • 220 次点击  

这次使用的数据是网格数据,netCDF老演员了,使用了两个数据,分别是PM2.5和气温TEM,对二者先进行相关性分析,然后分别进行MK分析,并且为了防止遇到nan和inf值,在自定义函数中进行了限制,应该适用性还是可以的,应该可以很方便地用于自己的数据集中。

首先读取两个数据集,由于网格较多,这里只选择一小部分来执行,在选择制定范围数据的时候,使用isel趋选择,不要用sel,在我用sel去选择数据的时候发现lat显示是0。

接下来对PM2.5和TEM数据进行相关性分析:

from scipy import stats
def corr_3d(x,y): nlat=y.shape[1] nlon=y.shape[2] corr=np.full([nlat,nlon],np.nan) pval=np.full([nlat,nlon],np.nan) for i in range(nlat): for j in range(nlon): t_x = np.isnan(x[:,i,j]) t_y = np.isnan(y[:,i,j]) if True in t_x or True in t_y: continue else: r,p=stats.pearsonr(x[:,i,j],y[:,i,j]) corr[i,j]=r pval[i,j]=p lat = y.coords['lat'] lon = y.coords['lon'] corr=xr.DataArray(corr,coords=[lat,lon],dims=['latitude','longitude']) pval=xr.DataArray(pval,coords=[lat,lon],dims=['latitude','longitude']) return corr,pval
corr,pval=corr_3d(PM25,TEM['tmp'])

然后绘制出相关系数图

第二部分是分别对PM2.5和TEM数据进行MK趋势分析,只需要简单修改一下上述定义好的函数即可使用

然后绘制出来看看,由于数据是每月的,因此slope那里乘了12表示年的趋势,绘图结果如下

同样的,对TEM气温数据也进行MK测试,slope乘了120表示十年的趋势,TEM的趋势数值没想到这么大

在具体的使用中,如果网格较大的话运行可能比较慢。


申根区牛逼!过几天就去维也纳参加EGU2023啦!

A)联系小编获取原价100刀的谢尚平新书电子版《海气耦合动力学:从厄尔尼诺到气候变化》 & 公众号不定期送书活动
B)提前联系号主委托录制所需报告 & 公众号主页右上角放大镜即可搜索往期上万录屏
C)中国气象背景数据集(点击蓝字跳转)
D)全国气象局、民航空管、考研升学等面试真题
E)Python、Linux、Endnote、Fortran等干货专题(菜单栏)
F)头条免费宣传课题组科研进展,旨在促进学科交流,欢迎供稿!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/153816
 
220 次点击