python天气预报课程设计报告(python天气预报系统)
Python气象数据处理与绘图(5):气候突变检验(年代际突变检验)
长时间尺度的气候研究中通常涉及到年际变化和年代际变化。文献中也经常出现所谓年代际突变这类的描述,这次便介绍两个用来检验年代际变化的方法, 其一是滑动t检验(sliding t-test),另一个则是曼肯德尔检验(Man-Kendall test)。
滑动t检验是考察两组样本平均值的差异是否显著来检验突变。
滑动t检验的基本思想是:把一气候序列中两段子序列均值有无显著差异看为来自两个总体均值有无显著差异的问题来检验。如果两段子序列的均值差异超过了一定的显著性水平,可以认为均值发生了质变,有突变发生。
原文也提到了该方法的局限性,需要人为设置滑动步长,具有一定主观性,需反复设置不同步长最终确定合适的突变点。
自由度n1+n2-2,根据置信度检验表查找对应显著性阈值。
曼肯检验是一种非参检验方法,避免了滑动t检验的局限性,在年代际变化研究中受到广泛应用。
以下是计算步骤:
对于同一组数据:
分别使用两种方法进行检验,首先是滑动t检验:
存在多个突变点,这时便需要调整滑动补偿,选取合适的步长。
而利用MK检验:
对于该组数据,相比之下,MK检验的效果要优于滑动t检验。
两种检验的分析方法如下:
滑动t检验:
M-K检验:
用python编写的获取天气预报的代码总是有错误,求解
weatherinfo=r.json() #在json后面加上括号才能返回结果。否则只能返回函数地址。
以下python3通过:
import?requests
ApiUrl=""
r=requests.get(ApiUrl)
weatherinfo=r.json()
print?(weatherinfo["weatherinfo"]["ptime"])
print?(weatherinfo["weatherinfo"]["temp2"])
08:00
5℃
python气象绘图windrose
#导入包
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib.ticker import FuncFormatter
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']? #设置简黑字体
mpl.rcParams['axes.unicode_minus'] = False? #设置负号正常显示
#----获取数据DataFrames,index*columns。index表示不同值范围,columns表示十六个风向
data = pd.DataFrame(wind_d_max_num_per,
? ? ? ? ? ? ? ? ? ? index=['15', '15~25', '25~35', '35~45',"≥45"],
? ? ? ? ? ? ? ? ? ? columns='N NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW'.split())
N = 16 # 风速分布为16个方向
theta = np.linspace(0, 2*np.pi, N, endpoint=False) # 获取16个方向的角度值
width = np.pi / 4 * 0.4? # 绘制扇型的宽度,可以自行调整0.5时是360,充满,有间隔的话小于0.5即可
labels = list(data.columns) # 自定义坐标标签为 N , NSN, ……# 开始绘图
plt.figure(figsize=(6,6),dpi=600)
ax = plt.subplot(111, projection='polar')
#----自定义颜色
mycolor =['cornflowerblue','orange','mediumseagreen','lightcoral','cyan']
#----循环画风玫瑰图
i=0
for idx in data.index:
? ? print(idx)
? ? # 每一行绘制一个扇形
? ? radii = data.loc[idx] # 每一行数据
? ? if i == 0:
? ? ? ? ax.bar(theta, radii, width=width, bottom=0.0, label=idx, tick_label=labels,
? ? ? ? ? color=mycolor[i])
? ? else:
? ? ? ? ax.bar(theta, radii, width=width, bottom=np.sum(data.loc[data.index[0:i]]), label=idx, tick_label=labels,
? ? ? ? ? color=mycolor[i])
? ? i=i+1
#此种画法,注意bottom设置,第一个bottom为0,后续bottom需要在前一个基础上增加。
ax.set_xticks(theta)
ax.set_xticklabels(labels,fontdict={'weight':'bold','size':15,'color':'k'})
ax.set_theta_zero_location('N') #设置零度方向北
ax.set_theta_direction(-1)? ? # 逆时针方向绘图
#----设置y坐标轴以百分数显示
plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda s, position: '{:.0f}%'.format(100*s)))
plt.legend(loc=4, bbox_to_anchor=(0.05, -0.25),fontsize=12) # 将label显示出来, 并调整位置
#----保存图片
plt.savefig("./windrose1.svg")
Python气象数据处理进阶之Xarray(5):数据整合(分组,合并...)
这部分同pandas的gorupby函数基本相同,实现对数据的分组归类等等。
split·将数据分为多个独立的组。
apply·对各个组进行操作。
combine·将各个组合并为一个数据对象。
创建一个dataset
我对官网的例子加以修改以便更好的理解。
解释下数据结构,创建了一个二维数据u(lat, lon),坐标数据为latitude 和country ,强调一下这里创建的是dataset,而不是dataArray,分不清的可以再看看本系列的第一篇文章。坐标数据不等于u的坐标。创建coords部分都指明了latitude 和 country 都是针对lat的扩展。
我们可以这样理解,对于纬度的分类,我们可以按纬度的大小分,也就是"latitude": [10, 20, 30, 40] ; 我们也可以对纬度所在的国家分,"country": ("x", list("abba") ,那比如我们想求某个国家的数据的平均时就十分方便。
下边我们进行分组:
说明第0和第4个数是国家a的,第2和第3是国家b的。
.groups换成.mean() 则就是对分组求平均,以此类推。
必须添加一个list才可以将其分类结果打印出来。直接打印DatasetGroupBy object是不能输出结果的。
那么针对经纬度的坐标的分组怎么实现呢,比如说选出区间在多少到多少之间的?
.groupby_bins() 函数可以解决这一问题。
还是这个数据,"latitude": [10, 20, 30, 40]
那我们想以25为界,分为两组,0-25,25-50
在进行了分组后,要对各个分组进行计算。
我们先从dataset 中取出 u 这个dataarray
比如是实现前边提到的按国家进行数据平均,或者标准化
也可以通过map()函数使用一些自定义的函数,比如说标准化,
这个用法是官方提供的,但是我的Xarray版本过低,还不支持这种用法(Xarray会定期更新,以至于可能我介绍过的一些方法有了更简便的操作,大家可以在评论区留言)。
强调一句,Xarray官方的更新是比较快的,很可能我写在这里的函数官方又给出了更新的版本,但是我没办法做到时刻与官方最新同步,所以如果遇到问题,最好的解决办法还是去查阅官方文档的对应部分。