爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 41870|回复: 19

[源代码] Python实现MK突变检验算法

[复制链接]

新浪微博达人勋

发表于 2018-7-28 14:29:39 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 Anonymous888 于 2020-3-17 17:23 编辑

MK突变检验
根据《现在气候统计诊断与预测计数》(第2版)P63中算法编写Python代码,并绘图。测试数据集是P65中数据。

# @Author        DFY
# @Time                2020-3-17

import matplotlib
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
matplotlib.rcParams['xtick.direction'] = 'in'  #in, out, inout
matplotlib.rcParams['ytick.direction'] = 'in'

def get_uf(data):
    index = np.linspace(1,len(data), len(data), True, dtype=int)
    data = pd.Series(data, index=range(1,92))
    s = pd.Series(0, index=index, dtype=np.float)
    uf = pd.Series(0, index=index, dtype=np.float)
    rsum = 0
    for k in index:
        for j in range(1,k):
            if data[k] > data[j]:
                rsum = rsum + 1
        s[k] = rsum
        if k > 1:
            e = (k*(k-1))/4
            var = (k*(k-1)*(2*k+5))/72
            uf[k]= (s[k] - e)/np.sqrt(var)
    return uf

def get_ub(data):
    data = data[::-1]
    uf_temp = get_uf(data)
    ub = uf_temp * -1
    ub = ub[::-1]
    return ub

#准备数据
datas = np.loadtxt("data.txt")
data = datas[:, 1]
year = datas[:, 0]
year = year.astype(np.int)

uf = get_uf(data)
ub = get_ub(data)
line0 = pd.Series(0, index=year)
line1 = pd.Series(1.96, index=year)

#绘图
fig = plt.figure(figsize=(16,12), dpi=80)
ax = fig.add_subplot()
print(ax)
plt.ylim(-4,8)
plt.xlim(1900,1990)
x_major_locator = MultipleLocator(10)
ax.xaxis.set_major_locator(x_major_locator)
x_minor_locator = MultipleLocator(1)
ax.xaxis.set_minor_locator(x_minor_locator)

ax.plot(year,uf, c="black", ls="-", label="uf")
ax.plot(year,ub, c="black", ls="--", label="ub")
ax.plot(year, line0, c="black")
ax.plot(year, line1,c="black")
ax.plot(year, line1*-1, c="black")
ax.legend(ncol=2, framealpha=0)
plt.savefig("mk_fig.png", bbox_inches = 'tight')
plt.show()

mk_fig

mk_fig

data.txt

1.24 KB, 下载次数: 157, 下载积分: 金钱 -5

mk.py

1.74 KB, 下载次数: 122, 下载积分: 金钱 -5

评分

参与人数 2金钱 +3 收起 理由
列治文 + 1 赞一个!
470004510 + 2

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-31 09:50:11 | 显示全部楼层
666666  膜拜方有
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-7-31 18:05:50 | 显示全部楼层
123肆 发表于 2018-7-31 09:50
666666  膜拜方有

完了完了, 被发现啦!!!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-9-5 09:21:01 | 显示全部楼层
不知道出图和Matlab哪个爽?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-11-5 10:23:14 | 显示全部楼层
挺好的,谢谢
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-12-13 16:26:22 | 显示全部楼层
楼主,为什么同样的程序,我报错了:
无标题.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-7-5 12:37:50 | 显示全部楼层
本帖最后由 东方的一条虫 于 2019-7-5 16:35 编辑

for i in range(1,l):
8.        r = 0
9.        for j in range(i):
10.            if(data > data[j]):
11.                r = r + 1
12.        s = s[i-1] + r
13.        index = i + 1
14.        e = (index * (index-1)) / 4
15.        v = index * (index - 1) * (2 * index + 5) / 72
16.        uf = (s - e) / np.sqrt(v)
17.        uf = round(uf,2)
代码有点问题
第十行 应该是data>data[j](第一个data加上索引i,可能是论坛编辑器自动删除了,因为我这里也加不上去)
第十二行会提示错误:标量变量索引无效,应该是s[i-1]=s[i-1]+r
第十三行index=i+1的话,e的计算应该是index*(index+1)/4

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-9-10 12:11:08 | 显示全部楼层
楼主,本人完全的小白,想了解用fortran得到的结果是一致的么?还有这段代码能加上作图的吗?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-5-27 15:12:55 | 显示全部楼层
想请教一下楼主,2和-2两条参考线是什么意义呢?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-4-16 10:46:25 | 显示全部楼层
Dannyqiu 发表于 2020-5-27 15:12
想请教一下楼主,2和-2两条参考线是什么意义呢?

好像是95%的显著水平?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表