前言
气象上如何去检验观测与预报的关系以及预报效果一直是难题 还好检验库meteva给出一套标准的流程,对于检验小白非常友好
以下内容会讲解
温馨提示
由于可视化代码过长隐藏,可点击以下链接运行Fork查看
【meteva】如何优雅使用观测与预报绘制散点回归和RMSE
🔜🔜若没有成功加载可视化图,点击运行可以查看 ps:隐藏代码在【代码已被隐藏】所在行,点击所在行,可以看到该行的最右角,会出现个三角形,点击查看即可
导入库与读取观测数据
In [1]:
import meteva.base as meb
import meteva.method as mem
import meteva.product as mpd
import pandas as pd
In [2]:
filename = "/home/mw/input/meteva7050/nmc_met_tutorial-master/nmc_met_tutorial-master/meteva/input/meb/m3.000" # 替换为你的micaps文件路径
sta = meb.read_stadata_from_micaps3(filename)
meb.set_stadata_names(sta,["ob"])
sta.head()
In [37]:
sta.describe()
Out[37]:
存在异常值,进行排除 设置观测值大于100的站点数据为0
In [38]:
sta['ob'][sta['ob'] > 100] = 0
In [39]:
sta.describe()
Out[39]:
生成随机数据,命名为EC
In [45]:
import numpy as np
ec = sta.copy()
# 生成随机数据
ec['ob']=sta['ob']**2/25
# 设置数据名称
meb.set_stadata_names(ec,["ec"])
# meteva设置时间与高度的语句,因为是直接复制原数据所以注释了
#meb.set_stadata_coords(sta_ob,level = 0,time = datetime.datetime(2018,7,3,9,0),dtime = 0)
ec.head()
Out[45]:
这里为了方便直接随机生成,实际使用时候可以读取ec数据然后插值到站点,具体过程可以看meteva,这可能是气象萌新最需要的python库
合并观测数据和随机生成的EC数据
In [46]:
sta_merge = meb.combine_on_obTime_id(sta,ec)
sta_merge
Out[46]:
散点回归图
In [55]:
ob = sta_merge["ob"].values
fo = sta_merge["ec"].values
In [56]:
help(mem.scatter_regress)
Help on function scatter_regress in module meteva.method.continuous.plot:
scatter_regress(ob, fo, member_list=None, rtype='linear', vmax=None, vmin=None, ncol=None, save_path=None, show=False, dpi=300, title='散点回归图', sup_fontsize=10, width=None, height=None, ylabel='观测')
绘制观测-预报散点图和线性回归曲线
:param Ob: 实况数据 任意维numpy数组
:param Fo: 预测数据 任意维numpy数组,Fo.shape 和Ob.shape一致
:param save_path:图片保存路径,缺省时不输出图片,而是以默认绘图窗口形式展示
:return:图片,包含散点图和线性回归图,横坐标为观测值,纵坐标为预报值,横坐标很纵轴标取值范围自动设为一致,在图形中间添加了完美预报的参考线。
In [57]:
mem.scatter_regress(ob,fo,show = True,dpi = 300)
In [63]:
help(mpd.plot)
Help on function plot in module meteva.product.program.plot:
plot(sta_ob_and_fos0, method, s=None, g=None, gll=None, save_dir=None, save_path=None, title=None, **kwargs)
In [58]:
mpd.plot(sta_merge,mem.scatter_regress,show = True,dpi = 600)
绘制OB和EC的RMSE分布
In [60]:
help(mpd.rmse_scatter)
Help on function rmse_scatter in module meteva.product.program.error_ana_scatter:
rmse_scatter(sta_ob_and_fos, s=None, g=None, gll=None, group_name_list=None, save_dir=None, save_path=None, show=False, print_max=1, threshold=0, add_county_line=False, map_extend=None, dpi=300, title='均方根误差站点分布', sup_fontsize=10, height=None, width=None)
In [62]:
map_extend=[110,120,20,30]
mpd.rmse_scatter(sta_merge,show = True,map_extend=map_extend)
取值最大的1个站点:
id:51573 lon:89.23 lat:42.95 value:11.72760000000001
Out[62]:
小结
可以看出meteva库无论是绘图还是计算都十分便利,代码量非常少
当然这套检验工具要使用起来还须对pandas库有小小的基础 作图和计算都十分便利,非常推荐大家用起来