| 
 
	积分404贡献 精华在线时间 小时注册时间2015-5-1最后登录1970-1-1 
 | 
 
| 
本帖最后由 Anonymous888 于 2020-3-17 17:23 编辑
x
登录后查看更多精彩内容~您需要 登录 才可以下载或查看,没有帐号?立即注册 
  
 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   
 
data.txt
 1.24 KB, 下载次数: 159, 下载积分: 金钱 -5  
 
 
mk.py
 1.74 KB, 下载次数: 124, 下载积分: 金钱 -5  
 评分
查看全部评分
 |