python 互相关的实现

互相关在水质分析中经常被使用到,可以用来分析时间序列的滞后、延时相关。

具体实现方法如下:

1.定义互相关函数

import scipy.signal as sg

def ccf(x, y, lag_max = 100): #互相关
    result = sg.correlate(y - np.mean(y), x - np.mean(x), method='direct') / (np.std(y) * np.std(x) * len(x))
    length = int((len(result) - 1) / 2)
    low = length - lag_max
    high = length + (lag_max + 1)
    return result[low:high]

2.数据引用

data = pd.read_excel ('./渝西-滞相关.xlsx', sheet_name='1',parse_dates=["监测时间"])
# data.head()
data.sample(10, random_state=521)

x=data.凤凰湖小学
y=data.渝西水务永川污水处理厂排污口
z=data.一体化站
数据预览

 

 3.分析及制图

# 渝西水务永川污水处理厂排污口 与 一体化站互相关
lag_max = 10
out = ccf(y,z,lag_max = lag_max) # lag_max=n
plt.figure(figsize = (15,4)) 
for i in range(len(out)):
    plt.plot([i,i],[0,out[i]],'k-')
    plt.plot(i,out[i],'ko')
plt.xlabel("lag",fontsize=14)
plt.xticks(range(2*lag_max-1),range(1-lag_max,lag_max,1)) # range=2n-1,range =(-n+1,n,1)
plt.ylabel("ccf",fontsize=14)
plt.show()

4.结果展示

out:  array([ 0.19630422, 0.21340211, 0.07124782, -0.09900923, -0.08383033, 0.18013047, 0.39100573, 0.41395946, 0.15260021, -0.08154993, 0.02466106, 0.48855059, 0.83190174, 0.75444832, 0.32086717, -0.06380702, -0.08965338, 0.19895168, 0.39260021, 0.29002233, 0.02799396])

从图中可以看出,滞后系数为3时相关系数达0.83190174,非常相关。

----

也可以使用matplotlib库中的xcorr函数,计算两个序列z和y的互相关,并将结果可视化展示出来。

其中,normed参数指定是否进行标准化,默认值为False;usevlines参数指定是否绘制垂直线表示延迟位置,默认值为True;maxlags参数指定互相关分析的最大时间滞后,默认值为None(即整个序列)。

代码示例:

import matplotlib.pyplot as plt

z = [1, 2, 3, 4, 5, 6, 7, 8]
y = [4, 6, 3, 9, 10, 2, 5, 7]

plt.xcorr(z, y, normed=True, usevlines=True, maxlags=10)
plt.title("Cross-correlation analysis of z and y")
plt.xlabel("Lags")
plt.ylabel("Normalized correlation coefficient")
plt.show()

其中,normed参数指定是否进行标准化,默认值为False;usevlines参数指定是否绘制垂直线表示延迟位置,默认值为True;maxlags参数指定互相关分析的最大时间滞后,默认值为None(即整个序列)。

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

细节处有神明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值