Python 小波分析

python 小波分析和小波相干

写在前面

这个东西单纯为了记录一下用Python做小波分析和小波相干的过程,以及怎么理解得的的结果。MATLAB中有很成熟的小波工具包,python中也有好几个可以做小波分析的包。我自己使用了Pyleoclim,这个包主要是用来做古气候数据处理和分析的,主要的功能如下图。这个文章只涉及小波分析部分,代码在链接的教程中都要。Pyleoclim包目前支持Python 3.9以上版本。再次强调,代码都来自于链接教程!!!
图1

小波分析

例子中用到了两个古气候数据,一个是同位素氘,另一个是 C O 2 CO_2 CO2

首先加载需要用到的包

import matplotlib.pyplot as plt
import pandas as pd
import pyleoclim as pyleo
import numpy as np

然后读取数据,并将数据存入pyleoclim包中的 Series类型,主要给定序列的名称和时间。

dDdf = pd.read_csv('../data/edc3deuttemp2007.csv')
dDdf.head()

dDts = pyleo.Series(time=dDdf['Age']/1000,value=dDdf['Deuterium'],time_name='Age',
					time_unit='kyr BP',value_name = r'$\deltaD$', 
					value_unit=u'\u2030',label=r'EPICA Dome C $\delta D$')
dDts.plot()

同位素氘数据
同位素氘时间序列
需要注意的是,这个数据的采样点在时间上并不平均,即相邻两个数据点的时间间隔并不一致。

这不满足一些分析的基本要求,或者会增加一些分析的难度和不确定性。

fig, ax = plt.subplots()
plt.hist(np.diff(dDts.time))
plt.xlabel(r'$\Delta t (kyr)$')
plt.ylabel('# occurrences')
plt.title('Distribution of age increments',weight='bold')

同位素氘数据的时间间隔分布
因此,需要在时间上以500年的时间分辨率进行插值,并对序列进行标准化。

dD05 = dDts.interp(step=0.5).standardize() 

小波分析 直接通过调用 wavelet 方法来实现

scal = dD05.wavelet()
scal.plot()

同位素氘小波分析图
pyleoclim给了两种计算显著性的方式,分别是参数化逼近方法 ar1asym,另一种是模拟方法 ar1sim

ar1asym方法

scal_sig = scal.signif_test(method='ar1asym')
scal_sig.plot()

ar1asym方法求显著性
ar1sim方法

scal_sig2 = scal.signif_test(method='ar1sim', number = 1000)
scal_sig2.plot()

ar1sim方法求显著性
这个结果显示该时间序列在300-600 kyr BP存在显著的100kyr周期。

小波相干

同位素氘可以作为指示温度变化的指标, 接下来读入 C O 2 CO_2 CO2序列,并使用小波相干分析两者关系。

url = 'ftp://ftp.ncdc.noaa.gov/pub/data/paleo/icecore/antarctica/antarctica2015co2composite.txt'
co2df = pd.read_csv(url,skiprows=137,sep='\t')
co2df.head()

co2数据

co2ts = pyleo.Series(time=co2df['age_gas_calBP']/1000,value= co2df['co2_ppm'],
					time_name='Age',time_unit='kyr BP',value_name = r'$CO_2$',
					value_unit='ppm',label='EPICA Dome C CO2')
co2ts.plot(color='C1')

co2序列变化图
从变化图中可以明显看到和同位素氘序列类似的冰期间冰期循环,以及工业革命后的快速爬升。

将两者画在一张图上

ms = pyleo.MultipleSeries([dDts,co2ts])
ms.plot()

co2和氘变化
对两者都进行标准化

ms.standardize().plot()

标准化后的co2和氘
调用wavelet_coherence方法进行小波相干分析

coh = co2ts.wavelet_coherence(dDts,method='wwz')
fig, ax = coh.plot()

co2和氘的小波相干
小波相干-wavelet transform coherency (WTC) 的结果可以理解为两个变量在时频域的相关性的平方,0表示不相关,1表示相关; 箭头表示两个变量在某个时频上的相位关系,根据三角函数转换,右 = 0度, 上 = 90度, 左 = 180度, 下 = -90 or + 270度。

图中基本向右的箭头表示 C O 2 CO_2 CO2和 氘 的变化在相应的时间和频域上的相位角接近零。

可以计算一定频率区间内的平均相位角。

coh.phase_stats(scales=[80,100])

结果为:

Results(mean_angle=0.2855352895679047, kappa=25.30163136494105, sigma=0.20083246106901098, kappa_hi=486.4211381097546, sigma_lo=0.045364651843896514)

这个结果说明,在80-100kyr的轨道周期上,这两个序列的变化基本是同相位的,两者之间不存在显著的提前或者滞后。

同样,也可以计算小波想干的显著性。

coh_sig = coh.signif_test(number=100)
fig, ax = coh_sig.plot()

小波相干显著性

借用matab小波工具箱文档 来解释箭头方向的意义。

下面图片是matlab文档中 nino3指数(热带太平洋某区域的海温,ENSO)与印度降水的小波相干图。
nino3和降水
图中表示nino3指数和印度降水在2-7年周期上(ENSO的主要周期)具有较强的相关,箭头的方向说明两者之前存在3/8到1/2(箭头向左) 周期的滞后(即1-3.5年)。这张图就说明热带太平洋海温(ENSO)与印度的降水存在相关,但是这影响存在1-3.5年的滞后。

小结

本文主要是记录一下学习小波分析和小波相干分析的笔记。相关原始内容在文中的链接中都可以找到,当然我个人的理解可能存在一定问题,希望大家有自己的认识。再次强调,虽然本人已经使用pyleoclim包做了自己的分析,但是为了方便,本文中使用的代码和图片均来自于官方文档。

http://linked.earth/PyleoTutorials/notebooks/L2_wavelet_analysis.html
https://ww2.mathworks.cn/help/wavelet/ug/compare-time-frequency-content-in-signals-with-wavelet-coherence.html

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python小波分析是一种用于时间序列分析的方法,它可以对信号进行频域分析和时域分解。小波分析基于相似性原理,通过比较原信号与小波基函数的相似性来计算小波系数。这些系数反映了原信号与每个小波基函数在不同尺度上的相似程度。 在Python中进行小波分析可以使用Matplotlib库中的add_subplot和subplots_adjust方法来绘制小波分解图和功率谱图。add_subplot方法用于创建子图,subplots_adjust方法用于调整子图之间的间距。这些方法可以帮助我们更好地可视化小波分析的结果。 同时,默认的小波基函数为morlet小波,在小波分析中起到了重要的作用。通过对信号进行小波分解和小波重构,我们可以得到信号的频域信息和时域分解结果。这样可以帮助我们更好地理解和分析时间序列数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [基于python进行小波分析,频率谱分析](https://blog.csdn.net/qq_32832803/article/details/111866444)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [python连续小波分析CWT](https://blog.csdn.net/weixin_46713695/article/details/127234673)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值