Python | SLP | EOF | 去除季节趋势

news2024/10/9 2:30:41
EOF & PC
EOF & PC

前言

在计算EOF(经验正交函数)之前去除季节循环是为了消除数据中的季节变化的影响,使得EOF能够更好地捕捉数据中的空间变化模式。如果不去除季节循环,季节性信号可能会在EOF中占据较大的比例,从而影响对其他空间模态的识别。通过去除季节循环,我们可以更准确地识别和分析数据中的长期趋势和非季节性变化。

数据来源


  • monthly mean of surface pressure
  • 2.5 ° x 2.5°
  • 1948-01-01 ~ 2023-12-01
  • 地址: http://apdrc.soest.hawaii.edu/las/v6/dataset?catitem=17027
<xarray.Dataset>
Dimensions:    (LON41_105: 65, LAT43_65: 23, TIME: 912, bnds: 2)
Coordinates:
  * LON41_105  (LON41_105) float64 100.0 102.5 105.0 107.5 ... 255.0 257.5 260.0
  * LAT43_65   (LAT43_65) float64 15.0 17.5 20.0 22.5 ... 62.5 65.0 67.5 70.0
  * TIME       (TIME) datetime64[ns] 1948-01-01 1948-02-01 ... 2023-12-01
Dimensions without coordinates: bnds
Data variables:
    TIME_bnds  (TIME, bnds) datetime64[ns] ...
    PRES       (TIME, LAT43_65, LON41_105) float32 ...
Attributes:
    history:      FERRET V6.5  31-Mar-24
    Conventions:  CF-1.0

基础概念

EOF(Empirical Orthogonal Function)

EOF是一种用于分析空间场景的统计方法。它可以提取数据中的主要空间变化模式,即数据的主要空间结构。 在EOF分析中,EOFs是空间模式,它们代表了数据在空间上的主要变化模式。通常,EOFs按照其对数据方差的贡献程度进行排序,因此,EOF1代表数据中的主要空间变化模式,EOF2代表次要的空间变化模式,依此类推。

EOFs通常是空间场景的正交函数,即它们之间是相互独立的。这意味着每个EOF捕获数据中不同的空间变化模式,不会出现重叠。

通过观察EOFs,可以了解数据中的主要空间结构,从而推断出数据的空间分布规律和特征。

PS : 个人理解EOF得到的第一模态,即在限定的空间区域内(比如说太平洋中部以及北部),以及在这一限定时间周期内(比如说从1970-2010年内),该空间区域内最显著、主导的空间 Pattern

PC(Principal Component)

PCEOF分析的另一个重要结果,它是每个时间步数据在EOF模式上的投影。换句话说,PC表示了数据随时间变化时,EOF空间模式的权重PC1通常表示数据中的主要时间变化模式,PC2表示次要的时间变化模式,以此类推。通常情况下,PC1会对应数据中的主要变化方向,即数据集的整体趋势或变化方向。

通过观察PC时间序列,可以了解数据在不同时间点上的变化规律,从而推断出数据的时间演变特征和趋势。

代码实现


from typing import Tuple
import os
import xarray as xr
import glob
import numpy as np
import cartopy.feature as cfeature
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import cmaps
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import matplotlib.ticker as mticker
from eofs.standard import Eof
from matplotlib import ticker 
import cartopy.mpl.ticker              as ctk
# ================================================================================================
# Author: %(Jianpu)s | Affiliation: Hohai
# Email : %(email)s
# Last modified: 2024-04-03 12:28:06
# Filename: 
# Description: 
# =================================================================================================
# Your code continues here
  • 定义读取nc文件函数


def read_netcdf(path: str, time_min: str, time_max: str) -> xr.Dataset:
    """
    读取NetCDF文件并返回数据集对象。

    参数:
    path (str): NetCDF文件的路径。
    time_min (str): 起始时间,格式为'YYYY-MM-DD'。
    time_max (str): 结束时间,格式为'YYYY-MM-DD'。

    返回值:
    data (xarray.Dataset): 包含选择时间范围内数据的数据集对象。
    """

    data = xr.open_dataset(path).sel(TIME=slice(time_min, time_max))
    return data
  • 定义前处理函数,计算纬度权重、去除季节趋势、计算EOF和PC

计算纬度权重:

首先,通过 np.cos(np.deg2rad(lat)) 计算了每个纬度点的纬度值的余弦值,即 $cos(\text{纬度})$。然后,使用 np.sqrt(coslat) 对余弦值进行开方运算,得到了纬度权重。这样做的目的是因为地球在不同纬度上的面积并不相同,通过使用纬度权重,可以对数据进行加权,更准确地反映出不同纬度上的变化情况。

去除季节循环:

首先,获取数据的维度信息,包括时间维度(nt)、纬度维度(nlat)和经度维度(nlon)。然后,将数据按照时间、月份和网格点的顺序进行重塑,使得数据的形状变为 (月份, 年数, 网格点数)。接着,计算每个月份的平均值,得到了季节循环。然后,通过减去季节循环,得到了去除季节循环后的数据 pres_anom。这样做的目的是为了消除数据中的季节性变化,使得后续的EOF分析更加准确。

def preprocess_data(data: xr.Dataset) -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray, np.ndarray]:
    """
    对数据进行预处理,包括计算纬度权重、去除季节循环等。

    参数:
    data (xarray.Dataset): 包含海平面气压数据的数据集对象。

    返回值:
    lon (numpy.ndarray): 经度数据。
    lat (numpy.ndarray): 纬度数据。
    eof (numpy.ndarray): EOF模态。
    pc (numpy.ndarray): PC时间序列。
    var (numpy.ndarray): 解释方差百分比。
    """

    lat = np.array(data.LAT43_65)
    lon = np.array(data.LON41_105)
    pres_data = data.PRES.data

    # 计算纬度权重
    coslat = np.cos(np.deg2rad(lat))
    wgts = np.sqrt(coslat)[..., np.newaxis]

    # 去除季节循环
    nt, nlat, nlon = pres_data.shape
    ngrd = nlon * nlat
    pres_ym = pres_data.reshape((12, round(nt / 12), ngrd), order='F').transpose((102))
    pres_clm = np.mean(pres_ym, axis=0)
    pres_anom = (pres_ym - pres_clm).transpose((102)).reshape((nt, nlat, nlon), order='F')
    # 计算EOF & PC
    solver = Eof(pres_anom, weights=wgts)
    eof = solver.eofsAsCorrelation(neofs=4)
    pc = solver.pcs(npcs=4, pcscaling=1)
    var = solver.varianceFraction(neigs=4)
    return lon, lat, eof, pc, var

solver.eofsAsCorrelation(neofs=4)返回的是主要模态(leading EOF)与输入海表气压(SLP)之间的相关性。

pcscaling=1:表示对主成分时间序列进行缩放,使其具有单位方差。这意味着每个主成分的方差都被归一化为1,因此可以更容易地比较它们的相对重要性,等于0表示不缩放。

solver.eofsAsCorrelation(neofs=4)
solver.eofsAsCorrelation(neofs=4)

修改为solver.eofs(neofs=4)返回的是前4个EOF,即前4个空间模态。这些模态描述了数据集中的主要空间变化模式。

solver.eofs
solver.eofs
  • 定义绘图函数,绘制EOF 和 PC 时间序列

这里绘制 PC 序列时,每12个数值绘制一个点,即每年一个数据


def plot_eof_and_pc(lons, lats, eof, pc, var,  ax1, ax2,EOF,PC):
    """
    绘制 EOF1 和 PC1 时间序列。

    参数:
    lons (numpy.ndarray): 经度数据,表示每个数据点的经度值。
    lats (numpy.ndarray): 纬度数据,表示每个数据点的纬度值。
    eof (numpy.ndarray): 表示 EOF1 的空间模式,表示每个数据点的 EOF1 值。
    pc (numpy.ndarray): 表示 PC1 的时间序列,表示每个时间步的 PC1 值。
    var (float): 表示 EOF1 解释的方差百分比,表示 EOF1 解释的总方差的百分比。
    season (str): 当前季节的字符串表示,用于图表标题。
    ax1 (matplotlib.axes.Axes): 第一个子图的轴对象,带有投影,用于绘制 EOF1 空间模式。
    ax2 (matplotlib.axes.Axes): 第二个子图的轴对象,不带投影,用于绘制 PC1 时间序列。
    """

    clevs = np.linspace(-1141)
    
    fill = ax1.contourf(lons, lats, eof.squeeze(), clevs,
                        transform=ccrs.PlateCarree(), cmap=plt.cm.RdBu_r)
    ax1.add_feature(cfeature.LAND, facecolor='w', edgecolor='k', zorder=1)
    cb = plt.colorbar(fill, ax=ax1,  
                       orientation ='horizontal',
                      shrink=0.75
                     )
    cb.set_label('correlation coefficient', fontsize=12)
    ax1.set_title(f'{EOF}  ', fontsize=16,loc='left')
    gl = ax1.gridlines(draw_labels=True, x_inline=False, y_inline=False, linestyle='dashed')
    gl.top_labels = False
    gl.right_labels = False
    gl.rotate_labels = False
    gl.xlocator = ctk.LongitudeLocator(20)
    gl.ylocator = ctk.LatitudeLocator(8)
    gl.xformatter = ctk.LongitudeFormatter(zero_direction_label=True)
    gl.yformatter = ctk.LatitudeFormatter()

    years = range(int(time_min),int(time_max)+1)
    ax2.plot(years, pc[::12], color='b', linewidth=2)
    ax2.axhline(0, color='k')
    ax2.set_title(f'{PC}  ',loc='left')
    # ax2.set_xlabel('Year')
    ax2.set_ylabel('Normalized Units')
    ax2.set_xlim(int(time_min),int(time_max))
    ax2.set_ylim(-33)
    ax2.set_title(f'Var={var:.2}', loc='right')

  • 主程序:循环绘图

path = r'G:/code_daily/slp.nc'
time_min,time_max = '1980','2012'
data = read_netcdf(path,time_min,time_max)

# 数据预处理
lon, lat, eof, pc,var = preprocess_data(data)

# 绘制 EOF 和 PC
fig = plt.figure(figsize=(1012),dpi=600)

EOFs = ['EOF1''EOF2','EOF3','EOF4',]
PCs = ['PC1''PC2','PC3','PC4']

for i, EOF in enumerate(EOFs):
    
    print(i,EOF,)
    
    # 第一个子图带投影
    ax1 = fig.add_subplot(422*i+1, projection=ccrs.PlateCarree(central_longitude=180))
    # 第二个子图不带投影
    ax2 = fig.add_subplot(422*i+2)
    plot_eof_and_pc(lon, lat, eof[i], pc[:,i], var[i], ax1, ax2,EOFs[i],PCs[i])
plt.tight_layout()
plt.show()

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1568549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

材料物理 笔记-4

原内容请参考哈尔滨工业大学何飞教授&#xff1a;https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》&#xff08;哈尔滨工业大学出版社&#xff09; 离…

浙大恩特客户资源管理系统 RegulatePriceAction SQL注入漏洞复现

0x01 产品简介 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源,提升销售和市场营销的效果。 0x02 漏洞概述 浙大恩特客户资源管理系统 RegulatePriceAction接口存在 SQL 注入漏洞,攻击者可通过输入恶意 SQL …

信息传播的AI时代:机器学习赋能新闻出版业的数字化之旅

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

layui框架实战案例(26):layui-carousel轮播组件添加多个Echarts图标的效果

在Layui中&#xff0c;使用layui-carousel轮播组件嵌套Echarts图表来实现多个图表的展示。 css层叠样式表 调整轮播图背景色为白色&#xff1b;调整当个Echarts图表显示loading…状态&#xff1b;同一个DIV轮播项目添加多个Echarts的 .layui-carousel {background-color: #f…

黄锈水过滤器 卫生热水工业循环水色度水处理器厂家工作原理动画

​ 1&#xff1a;黄锈水处理器介绍 黄锈水处理器是一种专门用于处理“黄锈水”的设备&#xff0c;它采用机电一体化设计&#xff0c;安装方便&#xff0c;操作简单&#xff0c;且运行费用极低。这种处理器主要由数码射频发生器、射频换能器、活性过滤体三部分组成&#xff0c;…

GPT-3.5开放免费使用,这次OpenAI做到了真的open

本周一&#xff0c;OpenAI宣布&#xff0c;部分地区的ChatGPT网站访问者现在无需登录即可使用人工智能助手。 此前&#xff0c;该公司要求用户创建账户才能使用&#xff0c;即使是目前由GPT-3.5AI语言模型支持的免费版ChatGPT也是如此。 01.GPT-3.5开放免登录使用 众所周知&…

mysql+keepalive+lvs搭建的数据库集群实验

前提条件&#xff1a;准备5台计算机&#xff0c;且网络互通 1、客户端 yum groups -y install mariadb-client ip 192.168.0.5 2、lvs1 yum-y install ipvsadm keepalived ip 192.168.0.1 keepalivedvip 192.168.0.215 /etc/hosts 解析192.168.0.1 主机名 3、lvs2 yum-y i…

生成式人工智能与 LangChain(预览)(下)

原文&#xff1a;Generative AI with LangChain 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 六、开发软件 虽然这本书是关于将生成式人工智能&#xff0c;特别是大型语言模型&#xff08;LLMs&#xff09;集成到软件应用程序中&#xff0c;但在本章中&#xff0c;…

C++模板基础1——定义函数模板

函数模板定义格式 模板函数定义格式如下&#xff1a; template <typename T> 返回类型 函数名(参数列表) {// 函数体 }其中&#xff0c;template<typename T>是模板声明&#xff0c;用于定义模板参数 T。可以使用不同的关键字代替 typename&#xff0c;例如 clas…

4大企业实例解析:为何MongoDB Atlas成为AI服务构建的首选

随着人工智能和生成式AI技术的迅猛发展&#xff0c;众多企业和机构正积极利用自然语言处理&#xff08;NLP&#xff09;、大型语言模型&#xff08;LLM&#xff09;等前沿技术&#xff0c;打造出一系列AI驱动的产品、服务和应用程序。 本文将展示四家已在AI创新领域取得显著成…

【MATLAB】PSO_BP神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 PSO_BP神经网络时序预测算法是一种结合了粒子群优化(PSO)算法和反向传播(BP)神经网络的时序预测方法。它利用了PSO算法的全局搜索能力和BP神经网络的优化能力&#xff0c;能够更准确地预测时序数据。 具体步…

【随笔】Git -- 高级命令(上篇)(六)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

练习 19 Web [BJDCTF2020]Easy MD5

如果你是第一批做这个题的&#xff0c;这道题一点也不easy 打开在前端代码里面看到&#xff0c;输入框输入的内容实际是’password’ 随意输入内容&#xff0c;查看响应header中的内容有一句SQL代码&#xff0c;可知我们要让password在md5后返回值为true 然后尬住&#xff…

3月造车新势力销量出炉:问界继续领跑,哪吒下滑,岚图抢眼

进入4月份&#xff0c;各大造车新势力们纷纷公布了3月份最新销量成绩&#xff0c;根据相关数据显示&#xff0c;问界再度超越理想&#xff0c;夺得造车新势力头名的位置。而零跑、蔚来、小鹏的销量也实现不错的增长&#xff0c;岚图汽车的表现同样十分亮眼。不过日前遭到周鸿祎…

C/C++程序的(编译,链接)翻译与运行

目录 前言&#xff1a; 1.程序环境 2.翻译环境 3.预处理&#xff08;预编译&#xff09; 4.编译 5.汇编 6.链接 7.运行环境 总结&#xff1a; 前言&#xff1a; 本篇来解释c/c程序的翻译环境与运行环境中的过程&#xff0c;不同的编程语言的翻译环境类似&#xff0c;…

[每周一更]-第92期:Go项目中的限流算法

这周五在清明假期内&#xff0c;提前更新文章 很多业务会有限流的场景&#xff0c;比如活动秒杀、社区搜索查询、社区留言功能&#xff1b;保护自身系统和下游系统不被巨型流量冲垮等。 在计算机网络中&#xff0c;限流就是控制网络接口发送或接收请求的速率&#xff0c;它可防…

MyBatis-Plus03

测试自定义功能 首先创建mapper文件夹。 在UserMapper下编写sql语句&#xff08;把namespace改为自己的&#xff09; <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""…

查询SQL server数据库在后台执行过的语句

查询SQL server数据库在后台执行过的语句 SELECT TOP 30000total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数],qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)],last_execution_time AS [最后一次执行时间],min_worker_ti…

Windows系统基于WSL子系统的torchquantum安装记录GPU版本

子系统需要的环境&#xff1a; anaconda/miniconda、pip换源(清华源) 1.准备 torchquantum最新版本可以从github上找到&#xff0c;直接clone/下载整个project&#xff0c;查看环境要求&#xff0c;需要安装pytorch和tensorflow 新建一个conda环境&#xff0c;注意python最…

算法沉淀——动态规划篇(子数组系列问题(下))

算法沉淀——动态规划篇&#xff08;子数组系列问题&#xff08;下&#xff09;&#xff09; 前言一、等差数列划分二、最长湍流子数组三、单词拆分四、环绕字符串中唯一的子字符串 前言 几乎所有的动态规划问题大致可分为以下5个步骤&#xff0c;后续所有问题分析都将基于此 …