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