基于连续小波变换的厄尔尼诺海平面周期变化数据集分析

news2024/9/21 15:02:44

基于连续小波变换的厄尔尼诺海平面周期变化数据集分析

  • 1. 厄尔尼诺海平面周期变化数据集介绍
  • 2. 基于连续小波变换的信号分析
    • 2.1 原始信号读取可视化
    • 2.2 傅里叶变换结果可视化
    • 2.3 小波变换结果可视化
  • 参考资料
  • 后记

1. 厄尔尼诺海平面周期变化数据集介绍

这些数据是通过国际热带海洋全球大气(TOGA)计划开发的热带大气海洋(TAO)阵列收集的。TAO阵列由横跨赤道太平洋的近70个系泊浮标组成,用于测量海洋学和地面气象变量,这些变量对于改进热带地区的季节性到年际气候变化的探测、理解和预测至关重要,最明显的是与厄尔尼诺/南方涛动(ENSO)周期有关的变化。

系泊系统由国家海洋和大气管理局(NOAA)太平洋海洋环境实验室(PMEL)开发。每个系泊装置测量500米深处的空气温度、相对湿度、表面风、海面温度和地下温度,少数浮标测量海流、降雨量和太阳辐射。阵列中的数据和当前更新可以在此地址的web上查看。

1982-1983年的厄尔尼诺/南方涛动(ENSO)周期是本世纪最强的一次,在全世界造成了许多问题。秘鲁和美国等世界部分地区因降雨量增加而遭受破坏性洪水,而西太平洋地区则遭遇干旱和毁灭性森林火灾。ENSO周期在接近峰值之前既没有被预测,也没有被探测到。这突出了海洋观测系统(即TAO阵列)的必要性,以支持季节到年际时间尺度上大规模海洋-大气相互作用的研究。

TAO阵列为世界各地的气候研究人员、天气预报中心和科学家提供实时数据。使用ENSO周期数据可以提前一到两年预测热带太平洋温度。这些预测是可能的,因为系泊浮标、漂流浮标、自愿船舶温度探测器和海平面测量。

此处用到的厄尔尼诺数据集是一个用于跟踪厄尔尼诺的时间序列数据集,包含1871年至1997年的每季度海面温度测量值。

2. 基于连续小波变换的信号分析

2.1 原始信号读取可视化

import matplotlib.pyplot as plt
import pywt
import numpy as np
import pandas as pd
from scipy import fftpack

def get_ave_values(xvalues, yvalues, n = 5):
    signal_length = len(xvalues)
    if signal_length % n == 0:
        padding_length = 0
    else:
        padding_length = n - signal_length//n % n
    xarr = np.array(xvalues)
    yarr = np.array(yvalues)
    xarr.resize(signal_length//n, n)
    yarr.resize(signal_length//n, n)
    xarr_reshaped = xarr.reshape((-1,n))
    yarr_reshaped = yarr.reshape((-1,n))
    x_ave = xarr_reshaped[:,0]
    y_ave = np.nanmean(yarr_reshaped, axis=1)
    return x_ave, y_ave

def plot_signal_plus_average(time, signal, average_over=5):
    fig, ax = plt.subplots(figsize=(15, 3))
    time_ave, signal_ave = get_ave_values(time, signal, average_over)
    ax.plot(time, signal, label='signal')
    ax.plot(time_ave, signal_ave, label='time average (n={})'.format(5))
    ax.set_xlim([time[0], time[-1]])
    ax.set_ylabel('Signal Amplitude', fontsize=18)
    ax.set_title('Signal + Time Average', fontsize=18)
    ax.set_xlabel('Time', fontsize=18)
    ax.legend()
    plt.show()
dataset = "http://paos.colorado.edu/research/wavelets/wave_idl/sst_nino3.dat"
df_nino = pd.read_table(dataset)
N = df_nino.shape[0]
t0 = 1871
dt = 0.25
time = np.arange(0, N) * dt + t0
signal = df_nino.values.squeeze()
plot_signal_plus_average(time, signal)

在这里插入图片描述

2.2 傅里叶变换结果可视化

def plot_fft_plus_power(time, signal):
    dt = time[1] - time[0]
    N = len(signal)
    fs = 1 / dt

    fig, ax = plt.subplots(figsize=(15, 3))
    variance = np.std(signal) ** 2
    f_values, fft_values = get_fft_values(signal, dt, N, fs)
    fft_power = variance * abs(fft_values) ** 2  # FFT power spectrum
    ax.plot(f_values, fft_values, 'r-', label='Fourier Transform')
    ax.plot(f_values, fft_power, 'k--', linewidth=1, label='FFT Power Spectrum')
    ax.set_xlabel('Frequency [Hz / year]', fontsize=18)
    ax.set_ylabel('Amplitude', fontsize=18)
    ax.legend()
    plt.show()

在这里插入图片描述

2.3 小波变换结果可视化

def plot_wavelet(time, signal, scales,
                 waveletname='cmor',
                 cmap=plt.cm.seismic,
                 title='Wavelet Transform (Power Spectrum) of signal',
                 ylabel='Period (years)',
                 xlabel='Time'):
    dt = time[1] - time[0]
    [coefficients, frequencies] = pywt.cwt(signal, scales, waveletname, dt)
    power = (abs(coefficients)) ** 2
    period = 1. / frequencies
    levels = [0.0625, 0.125, 0.25, 0.5, 1, 2, 4, 8]
    contourlevels = np.log2(levels)

    fig, ax = plt.subplots(figsize=(15, 10))
    im = ax.contourf(time, np.log2(period), np.log2(power), contourlevels, extend='both', cmap=cmap)

    ax.set_title(title, fontsize=20)
    ax.set_ylabel(ylabel, fontsize=18)
    ax.set_xlabel(xlabel, fontsize=18)

    yticks = 2 ** np.arange(np.ceil(np.log2(period.min())), np.ceil(np.log2(period.max())))
    ax.set_yticks(np.log2(yticks))
    ax.set_yticklabels(yticks)
    ax.invert_yaxis()
    ylim = ax.get_ylim()
    ax.set_ylim(ylim[0], -1)

    cbar_ax = fig.add_axes([0.95, 0.5, 0.03, 0.25])
    fig.colorbar(im, cax=cbar_ax, orientation="vertical")
    plt.show()
    
plot_wavelet(time, signal, scales)

在这里插入图片描述

参考资料

【1】 数据集来源

后记

最后,大家希望了解的内容,欢迎评论建议!

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

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

相关文章

文件上传的multipart/form-data属性,你理解了吗

form表单经常用于前端发送请求,比如:用户填写信息、选择数据、上传文件,对于不同的场景,上传数据的格式也会有些区别。 action action 表示该请求的 url 地址,定义在form上,请求的URI,可以写完…

【Python自然语言处理】文本向量化的六种常见模型讲解(独热编码、词袋模型、词频-逆文档频率模型、N元模型、单词-向量模型、文档-向量模型)

觉得有帮助请点赞关注收藏~~~ 一、文本向量化 文本向量化:将文本信息表示成能够表达文本语义的向量,是用数值向量来表示文本的语义。 词嵌入(Word Embedding):一种将文本中的词转换成数字向量的方法,属于文本向量化处理的范畴。 …

Linux操作系统~基于systemV共享内存的进程间通信

目录 一.进程间通信有哪些方式 二.什么是systemV 三.共享内存-双向通信-大致实现思路 四.4个函数about共享内存 1.shmget函数-创建 ftok函数 ​编辑 e.g. ipcs/ipcrm指令(ipc资源会被回收吗) 2.shmctl函数-删除/释放 3.shmat函数-挂接 4.shmdt…

汽车以太网简史

一、为啥需要新车载总线 在一个行业中,当一种新技术被开发和启用时,影响该技术成功的因素有很多。其中最重要的是该技术带来的益处以及自身成本。 第一个吃螃蟹的 2004年宝马决定从2008年起在其开始量产(SOP)的汽车中引入一个中…

c++ 指针

目录 1.指针的基本概念 2.定义指针,使用指针 3.指针所占的内存空间 4.空指针和野指针 4.1空指针 4.2野指针 5.const修饰指针 5.1常量指针 5.2指针常量 5.3const既修饰指针又修饰常量 6.指针和数组,利用指针访问数组 6.1概述 6.2使用数组名和下表访问 6.3使用…

【LIN总线测试】——LIN主节点数据链路层测试

系列文章目录 📒【LIN总线测试】——LIN主节点物理层测试 📒【LIN总线测试】——LIN从节点物理层测试 📒【LIN总线测试】——LIN主节点数据链路层测试 📒【LIN总线测试】——LIN主节点网络管理测试 📒【LIN总线测试】…

Docker consul的容器服务更新与发现

1)什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构,起初…

一软一硬:记录我的工作电脑两次出现性能问题的分析思路和解决过程

作为一个程序员,每天工作中糟心的事情之一,莫过于自己用来编码的计算机,运行速度忽然变得奇慢无比。尤其像我这种年过四旬仍然在一线从事编码工作的老程序员来说,只有靠不断提高单位时间的产出效率,来弥补和年轻程序员…

网课搜题接口

网课搜题接口 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 题库:题库后台(点击跳转) 题库…

【leetcode】 盛最多水的容器

一、题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾…

移动通信:数字调制技术(BPSK, DPSK, QPSK, Π/4 QPSK,BFSK, MSK, GMSK, M-ary)学习笔记

文章目录Factors That Influence the Choice of Digital ModulationBandwidth and Power Spectral Density of Digital SignalsPulse Shaping TechniquesGeometric Representation of Modulation SignalsLinear Modulation TechniquesBPSKDifferential Phase Shift Keying (DPS…

软件定义汽车的关键—车载操作系统

文章目录 前言一、车载系统是什么?二、车载系统在智能汽车中的应用总结前言 智能网联大环境变革情况下,软件定义汽车理念已成行业共识。 传统分布式E/E架构因如下原因: 计算能力不足(车规芯片);通讯带宽不…

树和二叉树

目录 1.树的概念及结构 1.1树的概念 1.2.树的表示 1.2.1孩子兄弟表示法 2.2双亲表示法 1.3二叉树在实际中的应用 2.二叉树的概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树的实现及其的一些接口(链式) 2.4.1二叉树的…

配置 4G 模块为WAN口上网

配置 4G 模块为WAN口上网 将Linux板卡配置为交换机,提供类似路由器的上网功能。这里以4G网卡作为WAN进行上网。 1. 配置4G模块为默认网关 先配置好4G模块为默认路由网关。 这里需要先将4G模块配置为路由模式。 断开板卡的有线和无限网络连接,使用pi…

Redis配置与优化

1 关系数据库与非关系型数据库概述 1.1 关系型数据库 一个结构化的数据库,创建在关系模型(二维表格模型)基础上 一般面向于记录 SQL 语句(标准数据查询语言)就是一种基于关系型数据库的语言 用于执行对关系型数据库中…

后渗透之流量转发实验

目录 一、实验项目名称 二、实验目的 三、实验内容 四、实验环境 五、实验步骤 六、实验结果 七、实验总结 一、实验项目名称 后渗透之流量转发实验 二、实验目的 1.掌握ssh进行流量转发的方法 2.掌握proxychains代理软件的使用方法 3.掌握Burpsuite工具的全局代…

Java 基础之锁

Java 基础之线程_禽兽先生不禽兽的博客-CSDN博客 上一篇博客中记录了线程的一些概念,那多线程既然能与人方便必然也会带来一些问题,这些问题主要与线程的三大特性有关,Java 的一些关键字和锁机制,可以帮助我们解决这些问题。 一…

如何高效管理自己的电脑?文件再多也不乱!

视频教程:https://www.bilibili.com/video/BV18M41167jd/?share_sourcecopy_web&vd_source58093f138338062a30d9fe854824a90f 如何高效管理自己的电脑?文件再多也不乱!1. 盘符管理C盘只装系统软件,其他软件装到D盘绿色软件就是解压就能用&#xff…

[go学习笔记.第十八章.数据结构] 1.基本介绍,稀疏数组,队列(数组实现),链表

一.基本介绍 1.数据结构(算法)的介绍 (1).数据结构是一门研究算法的学科,自从有了编程语言也就有了数据结构,学好数据结构可以编写出更加漂亮,更加有效率的代码 (2).要学习好数据结构就要多多考虑如何将生活中遇到的问题用程序去实现解决 (3).程序&…

一 H5游戏的种类

游戏类型(各举一个例子): 休闲益智:开心消消乐 角色扮演:阴阳师 动作冒险:神庙逃亡 棋牌游戏:欢乐斗地主 体育竞技:最强NBA 射击游戏:绝地求生 音乐游戏:节奏大师 模拟经营:模拟城市 策略游戏:植物大战僵尸 塔防游戏:保卫萝卜 游戏付费方式…