文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python如何实现MK突变检验方法,代码复制修改可用

2023-05-19 09:05

关注

需求

已知年份和历年最大冻土深度,计算最大冻土深度Mk突变检验。

原理

请添加图片描述

请添加图片描述

请添加图片描述

工具和语言

代码过程

定义函数

def mktest(inputdata):
    import numpy as np
    inputdata = np.array(inputdata)
    n=inputdata.shape[0]
    Sk = np.zeros(n)
    UFk = np.zeros(n)
    r = 0
    for i in range(1,n):
        for j in range(i):
            if inputdata[i] > inputdata[j]:
                r = r+1
        Sk[i] = r
        E = (i+1)*i/4
        Var = (i+1)*i*(2*(i+1)+5)/72
        UFk[i] = (Sk[i] - E)/np.sqrt(Var)
    Sk2 = np.zeros(n)
    UBk = np.zeros(n)
    inputdataT = inputdata[::-1]
    r = 0
    for i in range(1,n):
        for j in range(i):
            if inputdataT[i] > inputdataT[j]:
                r = r+1
        Sk2[i] = r
        E = (i+1)*(i/4)
        Var = (i+1)*i*(2*(i+1)+5)/72
        UBk[i] = -(Sk2[i] - E)/np.sqrt(Var)
    UBk2 = UBk[::-1]
    return UFk, UBk2
定义函数计算变量
```python
def mktest(inputdata):
    import numpy as np
    inputdata = np.array(inputdata)
    n=inputdata.shape[0]
    s              =  0
    Sk = np.zeros(n)
    UFk = np.zeros(n)
    for i in range(1,n):
        for j in range(i):
            if inputdata[i] > inputdata[j]:
                s = s+1
            else:
                s = s+0
        Sk[i] = s
        E = (i+1)*(i/4)
        Var = (i+1)*i*(2*(i+1)+5)/72
        UFk[i] = (Sk[i] - E)/np.sqrt(Var)
    Sk2 = np.zeros(n)
    UBk = np.zeros(n)
    s  =  0
    inputdataT = inputdata[::-1]
    for i in range(1,n):
        for j in range(i):
            if inputdataT[i] > inputdataT[j]:
                s = s+1
            else:
                s = s+0
        Sk2[i] = s
        E = (i+1)*(i/4)
        Var = (i+1)*i*(2*(i+1)+5)/72
        UBk[i] = -(Sk2[i] - E)/np.sqrt(Var)
    UBk2 = UBk[::-1]
    return UFk, UBk2

导入变量 ,形成突变检验图

import matplotlib.dates as mdates    #處理日期
import matplotlib.pyplot as plt
import numpy as np
from pylab import mpl
from matplotlib.pyplot import MultipleLocator
mpl.rcParams['font.sans-serif'] = ['SimHei'] #防止出现乱码。
plt.rcParams['axes.unicode_minus'] = False   #防止出现图上的负数为方框。
# y值和x值   分别输入六个站点的最大冻土深度值,将值以列表的方式导入
a = [150,150,114,109,96,95,83,76,109,80,115,80,94,86,133,91,110,116,114,128,172,172,
162,121,175,151,110,92,116,156,134,110,89,97,109,157,153,105,76,87,122,78,97,93,141,162,
123,133,161,128,138,104,133,102,140,109,118,86,126,92,121,149,116]  #这个部分值可以替换成为要检验的气温、水文等值
x_values=list(range(1961,2022))
uf,ub = mktest(a)
plt.figure(figsize=(8,4))   #图片的大小
plt.plot(uf,'r',label='UFk')
plt.plot(ub,'b',label='UBk')
plt.xticks([0,5,10,15,20,25,30,35,40,45,50,55,60],['1960','1965','1970','1975','1980','1985','1990','1995','2000','2005','2010','2015','2020',])
#将默认的x轴数值替换为年份的X轴,默认是0-61,一共62个值,代表X轴内容。
# 0.01显著性检验
plt.legend()
plt.axhline(1.96)
plt.axhline(-1.96)
#设置图片的标签()
plt.title("富蕴点最大冻土深度突变检验结果")#x轴上的名字
plt.xlabel("年份(1960年-2022年)")#x轴上的名字
plt.ylabel("突变值波动参数")#y轴上的名字
plt.grid() #形成网格线输出
x_major_locator=MultipleLocator(5)
plt.show()

最后成图以后的样子。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯