Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【附代码】时间序列与时间序列的相关、时间序列与空间场的相关、空间场与空间场的相关、显著性检验打点

【附代码】时间序列与时间序列的相关、时间序列与空间场的相关、空间场与空间场的相关、显著性检验打点

作者头像
自学气象人
发布于 2023-06-21 07:06:06
发布于 2023-06-21 07:06:06
2.2K01
代码可运行
举报
文章被收录于专栏:自学气象人自学气象人
运行总次数:1
代码可运行

在气象科研与业务经常使用的相关有:时间序列与时间序列的相关、时间序列与空间场的相关、空间场与空间场的相关。其中最常使用的就是皮尔逊相关系数。

什么是皮尔逊相关系数

该相关系数是由卡尔·皮尔逊在前人的研究基础上所提出的相关统计量,可以用来度量两个变量之间的简单线性关系。它的计算公式如下:

通过该公式计算得到的相关系数r,取值范围为[-1,1]。

  • • 当r=0时,表明两个变量X和Y之间无线性关系(注意,r=0并不代表X和Y一定相互独立,可能存在非线性等其他关系,具体可以自行带入 进行体会);
  • • 当0<r<1时,表明两个变量X和Y之间存在正相关关系,即当X的值增大(减小)时,Y的值也增大(减小);
  • • 当-1<r<0时,表明两个变量X和Y之间存在负相关关系,即当X的值增大(减小)时,Y的值减小(增大)。

由于Pearson相关系数的形式简单,因此其应用十分广泛。但其也存在缺点,即:

  • • 该相关系数只能识别简单的线性相关关系,无法处理非线性相关关系;
  • • 对异常值(或离群点)和样本容量较为敏感;
  • • 要求研究的变量是数值变量,且变量符合或较为接近正态分布。

气象实例

时间序列与时间序列的相关系数计算

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#导入库
import xarray as xr   #读取、处理nc数据的包
import numpy as np    #进行数学处理的包
from scipy.stats import pearsonr   #进行Pearson相关系数计算的包
from scipy.stats import normaltest #检验数据是否符合正态分布的包

import cartopy.crs as ccrs         #进行画图的cartopy和matplotlib包
import cartopy.feature as cfeature
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import matplotlib.pyplot as plt

#原始的T2RAIN气象变量是具有时间一维、空间二维的三维变量,为了将其变为仅有时间维度的一维时间序列,我们分别对这两个变量用 mean() 方法沿着 south_north 和 south_north 两个空间维度求平均,并赋值给新变量 T2_series, RAIN_series

T2_series=data['T2'].mean('south_north').mean('west_east')
RAIN_series=data['RAIN'].mean('south_north').mean('west_east')

#用 normaltest() 方法检验两个气象变量是否符合或接近正态分布(当pvalue>0.05时,即表示数据接近正态分布),判断这两个变量是否适合使用Pearson相关系数

normaltest(T2_series)
normaltest(RAIN_series)

# 由于Pearson相关系数对于异常值和缺省值比较敏感,所以一般需要用 np.isnan 来检测数据是否存在缺省值(存在为True,不存在为False),并通过绘制散点图等方式观察是否存在显著的离群点。如果存在需要剔除,比如可以用均值进行替代或直接去掉。

True in np.isnan(T2_series) #即不存在异常值nan值
True in np.isnan(RAIN_series) #即不存在异常值nan值
plt.scatter(T2_series,RAIN_series)  #未观察到显著的离群点

#对两个时间序列 T2_series 和 RAIN_series 使用 pearsonr() 方法计算相关系数,返回值为 (r, p)。其中 r 为相关系数,p 为显著性检验结果(小于0.05即为显著)

r,p=pearsonr(T2_series,RAIN_series)
print('r=',np.round(r,3),'p=',np.round(p,3))  #np.round(x,3)表示将x保留3位小数

空间场与空间场的相关系数计算

计算场与场之间相关系数的思路是:将场中的每一个格点都看作为一条时间序列,对两个场的对应格点分别做序列与序列的相关,再将计算结果赋给该格点即可。这样得到的是一个相关场(2维的)。

如果想得到一个相关序列,则可以将时间作为循环,将每一个时刻的两个空间场reshape成一个1维的空间序列,再对这两个序列做相关性计算。

p.s. 可以看到,计算场与场之间相关系数最终还是回到了对序列和序列的关系进行处理。

相关场(空间2D)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#定义两个空数组 r2 和 p2,并将数组的大小设置为 (south_north, west_east),r2 和 p2 会用来存放每个格点对应的 r (Pearson相关系数) 及 p (显著性检验结果)

r2=np.nan*np.zeros((len(data.south_north),len(data.west_east)))
p2=np.nan*np.zeros((len(data.south_north),len(data.west_east)))

#通过 i * j 对二维空间场中的每个格点进行循环,分别计算 T2RAIN 两个场对应格点上时间序列的相关系数,并存储在 r2 和 p2 中

for i in range(len(data.south_north)):
    for j in range(len(data.west_east)):
        r2[i,j],p2[i,j]=pearsonr(data['T2'][:,i,j],data['RAIN'][:,i,j])

相关序列(时间1D)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#定义两个空数组 r2 和 p2

r2=np.nan*np.zeros((len(data.Time)))
p2=np.nan*np.zeros((len(data.Time)))

#通过 i * j 对二维空间场中的每个格点进行循环,分别计算 T2RAIN 两个场对应格点上时间序列的相关系数,并存储在 r2 和 p2 中

for i in range(len(data.Time)):
    r2[i],p2[i]=pearsonr(np.reshape(data['T2'][i,:,:],len(data.south_north)*len(data.west_east)),np.reshape(data['RAIN'][i,:,:],len(data.south_north)*len(data.west_east)))

显著性检验打点

在完成场与场之间相关的计算以后,我们就可以根据显著性检验的结果了——使用Matplotlib中的 scatter() 方法绘制打点图。

打点图可以呈现出:哪些区域的相关性是通过显著性检验的,而哪些区域是没有通过显著性检验的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#先根据显著性检验结果 p2,使用Numpy中的 where() 方法选择出 p值小于0.05的格点 所对应的索引。

p2 = np.where(p2<0.05)

#使用 Cartopy 绘制地图底图,并用 Matplotlib 中的 scatter() 方法将显著检验结果p2可视化。

fig = plt.figure(figsize=(4, 4), dpi=200)                           #设置画布
ax = plt.axes(projection=ccrs.PlateCarree(central_longitude=180))   #设置投影方式
ax.add_feature(cfeature.LAND)                                        #添加陆地
ax.add_feature(cfeature.OCEAN)                                       #添加海洋

lon=np.linspace(-179.5,179.5,360)                         
lat=np.linspace(-67.5,76.5,145)
mesh_lon,mesh_lat=np.meshgrid(lon,lat)                              #生成经纬度网格
ax.scatter(mesh_lon[p2],mesh_lat[p2],color='k',s=0.2,linewidths=0.1,transform=ccrs.PlateCarree()) #绘制散点图(即打点)
ax.set_extent([70,140,0,55],crs = ccrs.PlateCarree())           #为了方便大家看的更清楚,我们限制显示的区域为70°E-140°E,纬度为0°-55°N

时间序列与空间场的相关系数计算

要想计算计算温度时间序列数据 T2_series 与降水场数据 RAIN 的相关系数,就是将降水场 RAIN 中的每个格点看作为一条时间序列,计算每个格点的降水时间序列与温度时间序列 T2_series 之间的相关系数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import xarray as xr   #读取、处理nc数据的包
import numpy as np    #进行数学处理的包
from scipy.stats import pearsonr   #进行Pearson相关系数计算的包
from scipy.stats import normaltest #检验数据是否符合正态分布的包

import cartopy.crs as ccrs         #进行画图的cartopy和matplotlib包
import cartopy.feature as cfeature
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import matplotlib.pyplot as plt

#计算相关系数
r3=np.nan*np.zeros((len(data.south_north),len(data.west_east)))
p3=np.nan*np.zeros((len(data.south_north),len(data.west_east)))
for i in range(len(data.south_north)):
    for j in range(len(data.west_east)):
          r3[i,j],p3[i,j]=pearsonr(T2_series,data['RAIN'][:,i,j])
          
#画图
fig = plt.figure(figsize=(6, 4), dpi=200)
ax = plt.axes(projection=ccrs.PlateCarree())   #设置投影方式
ax.coastlines(lw=0.3)                          #设置海岸线
ax.set_xticks([ -120,-60,0,60,120], crs=ccrs.PlateCarree())    #设置x轴坐标刻度
ax.set_yticks([ -60, -30, 0, 30, 60], crs=ccrs.PlateCarree())  #设置y轴坐标刻度

lon_formatter = LongitudeFormatter(zero_direction_label=False)  #给经度加上EW0°不标
lat_formatter = LatitudeFormatter()                             #给经度加上SN0°不标
ax.xaxis.set_major_formatter(lon_formatter) 
ax.yaxis.set_major_formatter(lat_formatter)
c1= ax.contourf(data.XLONG[0],data.XLAT[0],r3,cmap='rainbow',transform=ccrs.PlateCarree())
plt.colorbar(c1,shrink=0.45)  

参考: https://www.heywhale.com/home/competition/62c25ec80123ec8270e742af(去年给和鲸社区写的一个气象统计训练营,感兴趣的可以去报名学习)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 自学气象人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python中纬向平均、经向平均、水平流场、水汽柱浓度计算、坐标刻度朝向、label上下角标示例
一次课程作业画图的code记录。 import pandas as pd import numpy as np import xarray as xr from wrf import to_np,interpz3d,destagger import glob import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature from cartopy.mpl.ticker import
自学气象人
2022/11/14
1.5K2
python中纬向平均、经向平均、水平流场、水汽柱浓度计算、坐标刻度朝向、label上下角标示例
EOF分解原理及Python实现
大三上课第一次听到EOF可以把时空变化场分解为空间函数和时间函数时,我很迷惑,为什么可以把空间和时间分离开,那么空间随时间的偏导数怎么处理?正交说明时间和空间函数没有直接的依赖关系,而空间在随时间变化,空间与时间是彼此关联的,为什么可以正交呢?为什么可以降维呢?总之,就是不理解这样操作的可行性和物理意义。故从原理入手,去理解该分解。
阿巴阿巴-
2025/02/25
1820
气候统计界的瑞士军刀——sacpy
最近收到读者的一封信,表达了对Python在气象数据分析领域应用的兴趣,尤其是气象归因分析方面。我认为读者可能是指气象数据的统计分析和模型验证,其中“归因分析”通常指的是确定气候变化原因的科学方法。考虑到这一点,我深入探索了相关的资源,并在众多开源社区中发现了一个引人注目的项目——sacpy。
用户11172986
2024/08/14
2010
气候统计界的瑞士军刀——sacpy
Satpy基础系列教程(2)-TROPOMI L2数据处理
1.使用Satpy读取TROPOMI数据;2.讨论使用pcolormesh和imshow画图的区别和注意事项。
气象学家
2020/02/26
2.5K0
【附jupyter代码】经验正交分解EOF详解及案例
0.导言 我们都知道,气候研究的时间跨度一般都较长,基本都在30年以上,这就意味着对应的数据集十分庞大,既不能简单地对数据进行描述,也无法轻易地从数据中提取特征。那么面对如此庞大的数据集,我们如何才能
自学气象人
2023/06/21
1.3K0
【附jupyter代码】经验正交分解EOF详解及案例
python绘图 | salem一招解决所有可视化中的掩膜(Mask)问题
对于空间数据,我们感兴趣的往往是其中的某一部分,对于不需要的部分需要做一些掩膜(Mask)。 比如只关注海洋的数值变化,那么陆地上的数值对我其实是一种干扰,就要想办法掩盖掉。又比如我有全国的数据变量,但是只想研究其中某几个省份,那也需要对非相关省份进行掩盖。
气象学家
2020/09/22
12.5K57
python绘图 | salem一招解决所有可视化中的掩膜(Mask)问题
Python绘制气象实用地图(附代码和测试数据)
前面的推文对于常用的Python绘图工具都有了一些介绍,在这里就不赘述了。本文主要就以下几个方面:“中国区域绘图”、“包含南海”、“兰伯特投影带经纬度标签”、“基于salem的mask方法”、“进阶中国区域mask方法”、“进阶省份mask方法”。对日常的实用需求能够在一定程度上满足。后续就Python在气象常用的统计方法(显著性检验)、合成分析、多变量叠加绘图再进行推送,敬请期待!
MeteoAI
2019/08/12
16.1K3
Python绘制气象实用地图(附代码和测试数据)
利用python绘制EC数据全国降水图
Python的绘图功能非常强大,在大气和海洋常常用来绘制一些有关地理方面的图。本片主要介绍python绘制EC数据(grib格式)的的全国降水分布图。
郭好奇同学
2021/11/10
6.2K9
利用python绘制EC数据全国降水图
GPM 卫星三级产品的简单可视化
之前GPM数据写了下载教程,现在简单试试可视化,毕竟是nc格式数据(下载可选),用起来相对简单
用户11172986
2024/06/20
1600
GPM 卫星三级产品的简单可视化
气象绘图——白化杂谈
什么是白化?我在一年前也是头一次接触到这个词语,其实就是将你不需要的部分的等值线、等值线填色、风场、流场等挖去。目前气象领域流行的是花式利用地图shp文件进行操作,达到白化的目的。
自学气象人
2023/06/21
1.3K0
气象绘图——白化杂谈
读者答疑 | python怎么计算流函数
由于可视化代码过长隐藏,可点击运行Fork查看 若没有成功加载可视化图,点击运行可以查看 ps:隐藏代码在【代码已被隐藏】所在行,点击所在行,可以看到该行的最右角,会出现个三角形,点击查看即可
用户11172986
2024/08/29
2240
读者答疑 | python怎么计算流函数
matplotlib:怎么画带白色框的等值线
用户11172986
2024/06/20
1240
matplotlib:怎么画带白色框的等值线
在WRF中怎么算风能密度
2022 年,全国风能资源为正常略偏小年景。10 米高度年平均风速较近 10 年(2012 ~ 2021 年,下同)平均值偏小 0.82%,较2021 年偏小 0.96%。70 米高度年平均风速约 5.4m/s,年平均风功率密度约 193.1W/m2;100 米高度年平均风速约 5.7m/s,年平均风功率密度约 227.4W/m2。其中,湖北、江西、湖南、重庆较近 10 年平均值偏大,贵州、山西、宁夏、江苏、山东、河北、天津、内蒙古、西藏、河南、云南偏小,其他地区与近 10 年平均值接近。————《2022年中国风能太阳能资源年景公报》
用户11172986
2024/06/20
1450
在WRF中怎么算风能密度
算法复现 | 使用KMEAN算法对印度洋台风路径进行分类
本文根据《K-均值聚类法用于西北太平洋热带气旋路径分类》文献中的聚类方法,对印度洋的台风路径进行聚类分析。 其核心原理就是通过计算每条台风路径的经、纬向质心,以及经、纬、对角向的方差,作为聚类的依据,使用KMEAN算法将上述5个特征进行分类。 最后将分类后的结构进行可视化展示。
郭好奇同学
2022/11/15
1.8K0
算法复现 | 使用KMEAN算法对印度洋台风路径进行分类
Python 空间绘图 - 等值线绘制
等值线是气象上比较常用的一种图形,特别是分析天气形势时,常用的地面气压、位势高度、气温等以等值线展示效果最好;在某些时候,我们还需要对等值线填色图进行进一步的美化。兹分别介绍之。
DataCharm
2021/02/22
6.1K2
Python 空间绘图 - 等值线绘制
气象数据分析 | 经验正交分解EOF
经验正交函数分析方法(empirical orthogonal function,缩写EOF)也称特征向量分析(eigenvector analysis),或者主成分分析(principal component analysis),是一种分析矩阵数据中的结构特征,提取主要数据特征量的一种方法。
郭好奇同学
2021/07/30
3.4K0
Python可视化 | 中尺度对流系统反射率截面
中尺度对流系统,简称MCS(Mesoscale Convective System),是造成暴雨 、冰雹 、雷雨大风和龙卷等灾害性天气的重要系统。
郭好奇同学
2021/08/26
1.1K0
Python可视化 | 中尺度对流系统反射率截面
数据处理与可视化 | 站点插值格点+空间区域掩膜
前两天写了插值+空间掩膜的推文,不过因为数据问题删除了。 后台很多朋友留言说有需要,还是想学习一下,因此自己造了个数据再把这篇文章推一遍。
郭好奇同学
2021/02/12
2.1K0
数据处理与可视化 | 站点插值格点+空间区域掩膜
聊一聊我常用的6种绘制地图的方法
今天来讲一讲在日常工作生活中我常用的几种绘制地图的方法,下面我将介绍下面这些可视化库的地图绘制方法,当然绘制漂亮的可视化地图还有很多优秀的类库,没有办法一一列举
周萝卜
2021/12/08
3.7K0
聊一聊我常用的6种绘制地图的方法
轻磅!Python风场流线图与三种滤波方法
感谢读者【摸鱼大佬】来信提供程序与文件 九点平滑的工作原理是将风速数据中的每个值替换为该值及其八个相邻值的平均值。这具有平滑数据和消除任何高频噪声的效果。 解释九点平滑器是如何工作的: 创建一个新数组来存储平滑后的值。 迭代风速数据数组。 对于数组中的每个值,获取八个相邻值。 计算九个值的平均值。 在新数组中存储平均值。 平滑过程完成后,新阵列将包含平滑后的风速数据。
用户11172986
2024/06/20
2690
轻磅!Python风场流线图与三种滤波方法
推荐阅读
相关推荐
python中纬向平均、经向平均、水平流场、水汽柱浓度计算、坐标刻度朝向、label上下角标示例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验