meteva

提供气象产品检验相关python程序


数值型检验指标

<p>[TOC]</p> <pre><code class="language-python">%matplotlib inline %load_ext autoreload %autoreload 2 import meteva.base as meb import meteva.method as mem import meteva.product as mpd import numpy as np import datetime import copy import matplotlib.pyplot as plt import pandas as pd</code></pre> <p>本模块的函数族旨在提供各类数值型检验指标的分组统计方法。在浏览本模块函数说明之前可先参阅函数设计的<a href="https://www.showdoc.cc/meteva?page_id=4072178802924517">关键技术思想</a>。本模块包含数值型检验指标的计算方法,为对其进行介绍,以下先对测试数据进行一个简单的介绍。</p> <p><strong><font face="黑体" color=blue size = 5> 测试数据集</font>:</strong><br />  <strong>观测数据</strong> : 2019年全年2m温度观测数据,时间间隔3小时(1月1日02时),每个时刻包含6个站点(54398,54410,54416,54419,54499,54412) </p> <p> <strong>预报数据</strong> :<br />     <strong>ECMWF:</strong> 2019年全年2m温度温度预报数据(少部分缺失),起报时刻北京时间08和20时,预报时效0-72小时内逐3小时间隔,网格范围115 - 118° E,39 - 42°N,格距 0.5° </p> <p>    <strong>GRAPES_GFS:</strong> 2019年全年2m温度温度预报数据(少部分缺失),起报时刻北京时间08和20时,预报时效0-72小时内逐3小时间隔,网格范围115 - 118° E,39 - 42°N,格距 0.5° </p> <p>-########################################################- 以下先通过打印和图片的方式简单预览一下部分数据内容</p> <pre><code class="language-python">#设置数据路径的通配格式 dir_ob = r"H:\test_data\input\mpd\ob\temp_2m\BTYYMMDDHH.000" dir_ec = r"H:\test_data\input\mpd\ec\temp_2m\YYMMDD\BTYYMMDDHH.TTT" dir_grapes = r"H:\test_data\input\mpd\grapes\temp_2m\YYMMDD\BTYYMMDDHH.TTT"</code></pre> <pre><code class="language-python">time0 = datetime.datetime(2019,7,1,20,0) dh = 12 path = meb.get_path(dir_ob,time0) sta_ob= meb.read_stadata_from_micaps3(path) #读取一个时刻的观测数据示例,并打印显示 print(sta_ob)</code></pre> <pre><code> level time dtime id lon lat data0 0 0 2019-07-01 20:00:00 0 54398 116.6 40.1 31.400000 1 0 2019-07-01 20:00:00 0 54410 116.1 40.6 20.400000 2 0 2019-07-01 20:00:00 0 54416 116.9 40.4 29.500000 3 0 2019-07-01 20:00:00 0 54419 116.6 40.4 28.500000 4 0 2019-07-01 20:00:00 0 54499 116.2 40.2 31.200001 5 0 2019-07-01 20:00:00 0 54412 116.6 40.7 27.900000</code></pre> <pre><code class="language-python">path = meb.get_path(dir_ec,time0,dh) grd_ec = meb.read_griddata_from_micaps4(path) #读取一个ec预报数据场示例 meb.set_griddata_coords(grd_ec,name = "t2m",gtime = [time0],dtime_list = [dh],member_list = ["ecmwf"]) print(grd_ec) #打印显示</code></pre> <pre><code>&lt;xarray.DataArray 't2m' (member: 1, level: 1, time: 1, dtime: 1, lat: 7, lon: 7)&gt; array([[[[[[25.2, 26.9, 26.2, 27. , 26.3, 26.2, 25.3], [21.1, 23.9, 26.4, 25.9, 25.8, 25. , 25.5], [19.7, 19.7, 21.6, 25.6, 25.7, 24.6, 24.5], [20.1, 20.7, 20.9, 19.1, 22.4, 19.1, 19.7], [18.8, 15.4, 17.6, 16.6, 19.4, 18.7, 19.1], [16.4, 16.3, 15.1, 15.8, 16.1, 17. , 16.4], [16.1, 15.7, 15.7, 16.2, 14.9, 16.2, 16.1]]]]]]) Coordinates: * member (member) &lt;U5 'ecmwf' * level (level) float64 -2.147e+09 * time (time) datetime64[ns] 2019-07-01T20:00:00 * dtime (dtime) int32 12 * lat (lat) float64 39.0 39.5 40.0 40.5 41.0 41.5 42.0 * lon (lon) float64 115.0 115.5 116.0 116.5 117.0 117.5 118.0 Attributes: dtime_type: hour</code></pre> <pre><code class="language-python">meb.plot_tools.contourf_2d_grid(grd_ec) #以图片形式显示</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/e1f7909ed058b206b313107ec8a31e29?showdoc=.jpg" alt="" /></p> <pre><code class="language-python">path = meb.get_path(dir_grapes,time0,dh) grd_grapes = meb.read_griddata_from_micaps4(path) meb.set_griddata_coords(grd_grapes,name = "t2m",gtime = [time0],dtime_list = [dh],member_list = ["grapes"]) meb.plot_tools.contourf_2d_grid(grd_grapes) #以图片形式显示一个grapes预报场</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/df47fc7b06436571007e4673fda401ac?showdoc=.jpg" alt="" /></p> <p>以上先通过打印和图片的方式简单预览了部分数据内容 -########################################################</p> <pre><code class="language-python">###################以下开始为数据收集部分的程序 #设置关注的起始时段 time_start = datetime.datetime(2019,1,1,8,0) time_end = datetime.datetime(2020,1,1,8,0) #读取站点列表,并将站点内容为缺省值,当其作为读取站点数据的参数时,如果站点文件中某个站号不存在时,返回结果中该站点保持为缺省值 station = meb.read_stadata_from_micaps3(r"H:\test_data\input\mpd\ob\temp_2m\BT19010102.000") station.iloc[:,-1] = meb.IV ##读取收集观测数据 dir_ob = r"H:\test_data\input\mpd\ob\temp_2m\BTYYMMDDHH.000" sta_list = [] time0 = time_start while time0 &lt; time_end: path = meb.get_path(dir_ob,time0) sta = meb.read_stadata_from_micaps3(path,station = station,time = time0,dtime = 0,level = 0,data_name = "ob",show = True) sta_list.append(sta) time0 += datetime.timedelta(hours = 3) ob_sta_all = pd.concat(sta_list,axis = 0) #数据拼接 #读取收集ec预报数据 dir_ec = r"H:\test_data\input\mpd\ec\temp_2m\YYMMDD\BTYYMMDDHH.TTT" sta_list =[] time0 = time_start while time0 &lt;= time_end: for dh in range(0,73,3): path = meb.get_path(dir_ec,time0,dh) grd = meb.read_griddata_from_micaps4(path,show = True) if grd is not None: sta = meb.interp_gs_linear(grd,station) meb.set_stadata_coords(sta,time = time0,dtime = dh,level = 0) meb.set_stadata_names(sta,["ecmwf"]) sta_list.append(sta) time0 += datetime.timedelta(hours = 12) ec_sta_all = pd.concat(sta_list,axis = 0) #数据拼接 #读取收集grapes预报数据 dir_grapes = r"H:\test_data\input\mpd\grapes\temp_2m\YYMMDD\BTYYMMDDHH.TTT" sta_list =[] time0 = time_start while time0 &lt;= time_end: for dh in range(0,49,6): path = meb.get_path(dir_grapes,time0,dh) grd = meb.read_griddata_from_micaps4(path,show = True) if grd is not None: sta = meb.interp_gs_linear(grd,station) meb.set_stadata_coords(sta,time = time0,dtime = dh,level = 0) meb.set_stadata_names(sta,["grapes"]) sta_list.append(sta) time0 += datetime.timedelta(hours = 12) grapes_sta_all = pd.concat(sta_list,axis = 0) #数据拼接 #将观测和预报数据按时空坐标进行匹配,合并成一个DataFrame sta_all = meb.combine_on_obTime_id(ob_sta_all,[ec_sta_all,grapes_sta_all],need_match_ob=True) #每一行记录必须要求所有预报都存在 sta_all.to_hdf(r"H:\test_data\input\mpd\Example_data\sta_all.h5","df") #允许一行记录中部分预报缺失,以缺省值填充 sta_all_out = meb.combine_on_obTime_id(ob_sta_all,[ec_sta_all,grapes_sta_all],need_match_ob=True,how_fo="outer") sta_all_out.to_hdf(r"H:\test_data\input\mpd\Example_data\sta_all_out.h5","df") ###################以上为数据收集部分的程序</code></pre> <pre><code>success read from H:\test_data\input\mpd\ob\temp_2m\BT19010108.000 success read from H:\test_data\input\mpd\ob\temp_2m\BT19010111.000 success read from H:\test_data\input\mpd\ob\temp_2m\BT19010114.000 success read from H:\test_data\input\mpd\ob\temp_2m\BT19010117.000 。。。 。。。 success read from H:\test_data\input\mpd\ob\temp_2m\BT19010120.000 success read from H:\test_data\input\mpd\ob\temp_2m\BT19010123.000 success read from H:\test_data\input\mpd\ob\temp_2m\BT19010202.000 success read from H:\test_data\input\mpd\grapes\temp_2m\191230\BT19123008.072</code></pre> <p><strong>在以上的代码中,通过调用base中的函数完成了对观测数据和模式预报资料的收集,数据的对齐,缺省数据的删除等操作,这些代码均具有较好的可复用性,用户也可以根据需要将上述代码经过一定修改后进一步封装成一个函数。 </strong></p> <h1>数值型检验指标计算</h1> <p><strong><font face="黑体" color=blue size = 3>score(sta_ob_and_fos,method,s = None,g = None,gll = None,group_name_list = None,plot = None,vmax = None,vmin = None,bar_width = None,save_path = None,show = False,dpi = 300,title = &quot;&quot;,excel_path = None,** kwargs)</font></strong><br /> 根据输入的站点数据和检验方法,选择部分数据,将选择的数据进行进行分组检验,计算各种数值型检验指标(不包括检验中间量)</p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta_ob_and_fos </font></strong></td> <td style="text-align: left;">实况和预报合并对齐后的数据,形式为站点数据格式如上述例子中的sta_all</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>method </font></strong></td> <td style="text-align: left;">method中的各类数值型检验指标的函数名称,例如在本页面中已经import meteva.method as mem ,则ts评分的函数名称可以写为mem.ts ,均方根误差计算函数的名称可以写为 mem.rmse。这些函数选项包括<a href="https://www.showdoc.cc/nmc?page_id=2858658548509727">连续型预报</a>,<a href="https://www.showdoc.cc/nmc?page_id=2860336958932349">二分类预报</a>,<a href="https://www.showdoc.cc/nmc?page_id=2859693269266585">多分类预报</a>,<a href="https://www.showdoc.cc/nmc?page_id=3651805946039771">概率预报</a>,<a href="https://www.showdoc.cc/nmc?page_id=3629735872716279">集合预报</a>等类别中的评分函数</td> </tr> <tr> <td style="text-align: left;"><strong>s</strong></td> <td style="text-align: left;">用于选择数据样本的字典参数,具体的参数说明可参见meb.sele_by_dict中的<a href="https://www.showdoc.cc/meteva?page_id=3975604785954540"><font face="黑体" color=red size=5>s</font></a>参数</td> </tr> <tr> <td style="text-align: left;"><strong>g</strong></td> <td style="text-align: left;">用于分组检验的参数,具体用法可参见meb.group中的<a href="https://www.showdoc.cc/meteva?page_id=4071849185300418"><font face="黑体" color=red size=5>g</font></a>参数</td> </tr> <tr> <td style="text-align: left;"><strong>gll</strong></td> <td style="text-align: left;">用于分组检验的参数,具体用法可参见meb.group中的<a href="https://www.showdoc.cc/meteva?page_id=4071849185300418"><font face="黑体" color=red size=5>gll</font></a>参数</td> </tr> <tr> <td style="text-align: left;"><strong>group_name_list</strong></td> <td style="text-align: left;">分组名称的列表</td> </tr> <tr> <td style="text-align: left;"><strong>plot</strong></td> <td style="text-align: left;">是否需要直接将检验结果绘制图片,该参数为None时不绘制,当参数为&quot;bar&quot;时绘制柱状图,当参数为&quot;line&quot;时绘制线条图</td> </tr> <tr> <td style="text-align: left;"><strong>vmax</strong></td> <td style="text-align: left;">绘制的检验指标图片中y轴坐标的范围的最大值,如果只有一个子图,vmax 应该为一个实数;当有多个子图时,如果vmax为实数,则每个子图y轴的最大值相同,如果vmax为一个实数列表,则每个子图中y轴最大值根据列表中对应值进行设置</td> </tr> <tr> <td style="text-align: left;"><strong>vmin</strong></td> <td style="text-align: left;">绘制的检验指标图片中y轴坐标的范围的最小值,如果只有一个子图,vmin 应该为一个实数;当有多个子图时,如果vmin为实数,则每个子图y轴的最小值相同,如果vmin为一个实数列表,则每个子图中y轴最小值根据列表中对应值进行设置</td> </tr> <tr> <td style="text-align: left;"><strong>bar_width</strong></td> <td style="text-align: left;">如果plot =&quot;bar&quot;时,通过bar_width可以调节 bar的宽度</td> </tr> <tr> <td style="text-align: left;"><strong>save_path</strong></td> <td style="text-align: left;">该参数不为None时将图片结果输出值save_path</td> </tr> <tr> <td style="text-align: left;"><strong>show</strong></td> <td style="text-align: left;">该参数不为None时在屏幕显示图片,如果生成了图片save_path又为None,则该参数会自动切换为True</td> </tr> <tr> <td style="text-align: left;"><strong>dpi</strong></td> <td style="text-align: left;">绘图的dpi参数,用法同matplotlib中dpi参数</td> </tr> <tr> <td style="text-align: left;"><strong>title</strong></td> <td style="text-align: left;">图片标题的确定分为1、全自动,2、半自动,3手动三种方式。<br>1、全自动:不设置title参数,系统自动采用title的缺省值+自动补齐的其它信息来确定每一幅图的标题;<br> 2、半自动:title 为字符串类型,系统会采用title + 自动补齐的其它信息来确定每一幅图的标题;<br>3、手动:title为一个包含多个字符串的列表,且列表的长度必须和要绘制的图的数量一致,每一幅图会依次采用列表中的字符串作为标题</td> </tr> <tr> <td style="text-align: left;"><strong>excel_path</strong></td> <td style="text-align: left;">该参数不为None时将数值结果输出至路径为excel_path的excel文件</td> </tr> <tr> <td style="text-align: left;">**kwargs</td> <td style="text-align: left;">检验方法 meteva.method 和meteva.base.bar或meteva.base.plot 中的可选参数,具体用法参见下面的示例</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">返回一个元组,其包含2个元素,分别是包含数值检验指标的numpy数组和group_list_list,如果group_by不为None。检验指标数组的shape = (分组数目 , 预报(模式)数目 , 参数列表长度) 的数组经删除size= 1的维度后的结果。其中集合预报情况相对特殊,在sta_ob_and_fos中后面几列数据为不同集合成员的结果,而返回的评分则只返回集合预报整体的评分,而不区分各成员的评分,因此集合预报评分时预报(模式)数目相当于等于1.</td> </tr> </tbody> </table> <p><strong>调用示例:</strong></p> <pre><code class="language-python">sta_all = meb.sele_by_para(sta_all,value = [-100,100]) #选取合理取值范围的数据,即进行简单的阈值质控</code></pre> <pre><code class="language-python">result = mpd.score(sta_all,mem.me) print(result) #result[0]中包含2个模式的结果,由于没有分组所以 result[1] 里元素为None</code></pre> <pre><code>(array([-1.1911513, -2.4201992], dtype=float32), None)</code></pre> <pre><code class="language-python">result = mpd.score(sta_all,mem.mae) print(result) #将检验指标切换为rmse</code></pre> <pre><code>(array([2.6599662, 3.4411268], dtype=float32), None)</code></pre> <pre><code class="language-python">result= mpd.score(sta_all,mem.mae,s = {"dtime":24}) print(result) #通过s参数选择部分数据,在本例中选择了时效为24的数据进行检验</code></pre> <pre><code>(array([2.5120938, 3.651695 ], dtype=float32), None)</code></pre> <pre><code class="language-python">result = mpd.score(sta_all,mem.mae,g= "hour") #g = "hour"代表将预报按起报时间(日周期中的小时)进行分组 print(result) #result[0]中包含2种起报时间 * 2个模式 的结果, result[1]中包含把数据分为两组的依据 :即 hour = 8 和 hour = 20</code></pre> <pre><code>(array([[2.5817587, 3.1089883], [2.7356095, 3.7623775]], dtype=float32), [8, 20])</code></pre> <pre><code class="language-python">result = mpd.score(sta_all,mem.mae,g= "hour",gll = [8,20,[8,20]]) #gll代表将预报按指定方式分组,第一组是hour = 8,第二组是hour = 20,第三组是 前两种的并集 print(result) #result[0]中包含3组起报时间 * 2个模式 的结果, result[1]中包含把数据分为3组的依据</code></pre> <pre><code>(array([[2.5817587, 3.1089883], [2.7356095, 3.7623775], [2.6599662, 3.4411268]], dtype=float32), [[8], [20], [8, 20]])</code></pre> <pre><code class="language-python">result = mpd.score(sta_all,mem.mae,g= "hour",gll = [8,20,[8,20]],plot = "bar") #plot = "bar"代表将结果同时以柱状图的形式输出 print(result) </code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/4d4525e3cb95b488ba2e48a46c97a0a8?showdoc=.jpg" alt="" /></p> <pre><code>(array([[2.5817587, 3.1089883], [2.7356095, 3.7623775], [2.6599662, 3.4411268]], dtype=float32), [[8], [20], [8, 20]])</code></pre> <pre><code class="language-python">result = mpd.score(sta_all,mem.mae,g= "hour",gll = [8,20,[8,20]],plot = "line") #plot = "line"代表将结果同时以线条的形式输出 print(result) </code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/bceced25893bcd23fe2ab1077581814b?showdoc=.jpg" alt="" /></p> <pre><code>(array([[2.5817587, 3.1089883], [2.7356095, 3.7623775], [2.6599662, 3.4411268]], dtype=float32), [[8], [20], [8, 20]])</code></pre> <pre><code class="language-python">result = mpd.score(sta_all,mem.mae,g= "hour",gll = [8,20,[8,20]],group_name_list = ["08时","20时","ALL"],plot = "line") print(result) #group_name_list 是给gll中每个元素取一个名字,否则系统会自动生成,在不生成图片或表格时并不起什么作用</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/f3038c2e07d79f5cb945fe7a6949260f?showdoc=.jpg" alt="" /></p> <pre><code>(array([[2.5817587, 3.1089883], [2.7356095, 3.7623775], [2.6599662, 3.4411268]], dtype=float32), [[8], [20], [8, 20]])</code></pre> <pre><code class="language-python">result = mpd.score(sta_all,mem.mae,g= "month",plot = "bar") #改变g的参数,就切换了分组对比的方式,在本例中是按月分组检验 print(result) </code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/638ae801811752cfe6070d7f84253669?showdoc=.jpg" alt="" /></p> <pre><code>(array([[2.8249524, 2.8323264], [3.2048826, 4.1073327], [3.232286 , 4.6219287], [2.7828076, 3.3794649], [2.306571 , 3.54016 ], [2.444566 , 2.9754698], [2.4502914, 2.886426 ], [2.3026464, 3.446947 ], [2.5522623, 3.429648 ], [2.8287828, 3.990504 ], [2.518351 , 2.7032976]], dtype=float32), [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])</code></pre> <pre><code class="language-python">result = mpd.score(sta_all,mem.mae,g= "month",plot = "bar",save_path = r"H:\test_data\output\mpd\program\s1.png") print(result) #在本例中设置了save_path,检验结果将会保持到图片文件中,而不是在屏幕上显示 </code></pre> <pre><code>检验结果已以图片形式保存至H:\test_data\output\mpd\program\s1.png (array([[2.8249524, 2.8323264], [3.2048826, 4.1073327], [3.232286 , 4.6219287], [2.7828076, 3.3794649], [2.306571 , 3.54016 ], [2.444566 , 2.9754698], [2.4502914, 2.886426 ], [2.3026464, 3.446947 ], [2.5522623, 3.429648 ], [2.8287828, 3.990504 ], [2.518351 , 2.7032976]], dtype=float32), [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])</code></pre> <pre><code class="language-python">result = mpd.score(sta_all,mem.mae,g= "month",plot = "bar",save_path = r"H:\test_data\output\mpd\program\s1.png",show = True) print(result) #如果既要输出到文件中,又要在屏幕上打印,需要设置参数show </code></pre> <pre><code>检验结果已以图片形式保存至H:\test_data\output\mpd\program\s1.png</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/ba147630292da671f79ac651be1c1a07?showdoc=.jpg" alt="" /></p> <pre><code>(array([[2.8249524, 2.8323264], [3.2048826, 4.1073327], [3.232286 , 4.6219287], [2.7828076, 3.3794649], [2.306571 , 3.54016 ], [2.444566 , 2.9754698], [2.4502914, 2.886426 ], [2.3026464, 3.446947 ], [2.5522623, 3.429648 ], [2.8287828, 3.990504 ], [2.518351 , 2.7032976]], dtype=float32), [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])</code></pre> <pre><code class="language-python">result = mpd.score(sta_all,mem.mae,g= "month",excel_path = r"H:\test_data\output\mpd\program\s1.xlsx") #通过设置excel_path参数可以将结果输出到表格文件中</code></pre> <pre><code>列联表已以excel表格形式保存至H:\test_data\output\mpd\program\s1.xlsx</code></pre> <p>上述表格的形式如下: <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/3014cbf64032200625c2077364e9d79d?showdoc=.jpg" alt="" /></p> <pre><code class="language-python">result = mpd.score(sta_all,mem.ts,grade_list = [0,10,15,20,30],g = "hour",plot = "bar") #当mothod 参数为 mem.ts这类可以带等级的函数时,mpd。score就可以接受grade_list,因为mpd_score有个 **kwargs参数可以接受mem.ts的参数 print(result) #reuslt[0]。shape = (2 ,2,5),(分组数,预报数,等级数), result[1] 为分组方式</code></pre> <p><img src="https://www.showdoc.cc/server/api/attachment/visitfile/sign/cdecded6147d1cef72cc6982030ab545?showdoc=.jpg" alt="" /></p> <pre><code>(array([[[0.9413643 , 0.89973108, 0.8646789 , 0.75480451, 0.29213483], [0.92840444, 0.8775589 , 0.83722015, 0.68144611, 0.22099448]], [[0.94731268, 0.88559614, 0.84479032, 0.78593653, 0.39747634], [0.91784476, 0.83257761, 0.76157205, 0.65872505, 0.26332288]]]), [8, 20])</code></pre> <pre><code class="language-python">result = mpd.score(sta_all,mem.ts,grade_list = [0,10,15,20,30,35,50,45],g = "hour",plot = "bar",title ="TS评分") #半自动方式设置每个子图的title</code></pre> <p><img src="https://www.showdoc.cc/server/api/attachment/visitfile/sign/cbf692e4a7601eae4c844f191802a929?showdoc=.jpg" alt="" /></p> <pre><code class="language-python">result = mpd.score(sta_all,mem.ts,grade_list = [0,10,15,20,30,35,50,45],g = "hour",plot = "bar",title ="TS评分",ncol = 2) # ncol 是 meb.bar 的参数,用于控制子图的列数</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/f0c32a792fe896167904d91250930494?showdoc=.jpg" alt="" /></p> <pre><code class="language-python">result = mpd.score(sta_all,mem.ts,grade_list = [0,10,15,20,30],g = "hour",plot = "bar",title = ["小雨","中雨","大雨","暴雨","大暴雨"]) #手动设置每个子图的title</code></pre> <p><img src="https://www.showdoc.cc/server/api/attachment/visitfile/sign/562ad56164512d213d6f93c32392f324?showdoc=.jpg" alt="" /></p> <pre><code class="language-python">result = mpd.score(sta_all,mem.ts,grade_list = [0,10,15,20,30],g = "hour",excel_path = r"H:\test_data\output\mpd\program\s2.xlsx") </code></pre> <pre><code>列联表已以excel表格形式保存至H:\test_data\output\mpd\program\s2.xlsx</code></pre> <p>上述表格形式如下,其中不同等级的结果位于不同的sheet上 <img src="https://www.showdoc.cc/server/api/common/visitfile/sign/8fe2a9f2f3c58438aefc740772de168c?showdoc=.jpg" alt="" /></p> <pre><code class="language-python">result = mpd.score(sta_all,mem.mae, g = "id",plot ="bar") #以站号分组</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/96da6a7420f9be7ac92fe98096621b53?showdoc=.jpg" alt="" /></p> <pre><code class="language-python">result = mpd.score(sta_all,mem.rmse, g = "time",plot = "plot") #以起报时间分组,由于分组较多x轴不能完全显示,因此自动采用了跳点显示的方式,同时为了定位方便,自动增加了网格线</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/fa0b48aa0937f1133414dcd832296d0b?showdoc=.jpg" alt="" /></p> <pre><code class="language-python"># 以dayofyear 作为分组方式, #其中不同年份相关dayofyear值的样本会分为同一组,闰年的2月29日会跳过,横坐标上不会出现年份 result = mpd.score(sta_all,mem.rmse, g = "dayofyear",plot = "plot") </code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/30298d7a68cd2d405bb216e7e767d245" alt="" /></p> <pre><code class="language-python">result = mpd.score(sta_all,mem.mae,g= "dtime",plot = "line",marker = ".",title = "平均绝对误差随时效(各个模式交集)变化",width = 6) result = mpd.score(sta_all_out,mem.mae,g= "dtime",plot = "line",marker = ".",title = "平均绝对误差随时效(各个模式并集)变化",width = 6) </code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=61307aa8c3923059dfebde4d654da2f1" alt="" /></p> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=ef97523d16053c212574382af7219e1f" alt="" /></p> <p>在上面的图形中由于GRAPES模式只收集了逐6小时的数据,因此在3和9 等时效是没有数据的,在绘制图形是为了避免线条断成碎片,自动的采用虚线将不同的线条进行了连接。</p> <pre><code class="language-python">#上面的折线图如果用柱状图形式表示,则会以黑色三角形表示没有取值(缺省),如下图效果 result = mpd.score(sta_all_out,mem.mae,g= "dtime",plot = "bar",marker = ".",title = "平均绝对误差随时效(各个模式并集)变化",width = 6) </code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=66074d4a6e02d02b2e9a4e1bec76245f" alt="" /></p> <h2>对风预报的评分</h2> <p>采用mpd.score函数同样可以对风的预报进行检验,和其它变量检验不同的是,输入的sta_ob_fos里面需同时包含u和v变量列,列顺序如下面的例子所示。另外可以选择的检验指标包括acd_uv,scd_uv,acs_uv,scs_uv,acz_uv,它们分别对应基于uv风计算的风向预报准确率、风向预报评分,风速预报准确率,风速预报评分,风预报综合准确率,当然mpd.score也可以接受上述几个检验函数的可选参数。 以下采用已经组织好的风场数据的检验作为示例:</p> <pre><code class="language-python">ob_wind10m = pd.read_hdf(r"H:\test_data\input\mpd\time_compair\ob_wind10m.h5","df") #读取读取露点观测 ob_uv = meb.speed_angle_to_wind(ob_wind10m) #观测数据中原始数据为风速风向,则可以通过该函数转换为u,v ec_uv = pd.read_hdf(r"H:\test_data\input\mpd\time_compair\ec_wind10m.h5","df") #读露点预报 wind_all =meb.combine_on_obTime_id(ob_uv,[ec_uv],need_match_ob=True) #合并预报观测数据,need_match_ob为缺省参数False print(wind_all) #绘制风场检验的数据以u、v、...、u、v的形式排列,前两列默认为是观测,之后是预报 </code></pre> <pre><code> level time dtime id lon lat u v \ 0 0.0 2020-04-06 08:00:00 3 54511 119 40 1.394383 0.125288 1 0.0 2020-04-06 20:00:00 3 54511 119 40 -0.154433 -0.475553 2 0.0 2020-04-07 08:00:00 3 54511 119 40 -0.172479 3.195349 3 0.0 2020-04-07 20:00:00 3 54511 119 40 -1.628287 1.624402 4 0.0 2020-04-08 08:00:00 3 54511 119 40 -1.191180 0.145221 .. ... ... ... ... ... ... ... ... 337 0.0 2020-04-08 08:00:00 120 54511 119 40 1.165081 -0.287380 338 0.0 2020-04-06 08:00:00 126 54511 119 40 3.698046 -0.120228 339 0.0 2020-04-06 20:00:00 126 54511 119 40 0.818901 -1.824664 340 0.0 2020-04-07 08:00:00 126 54511 119 40 1.738523 1.177938 341 0.0 2020-04-07 20:00:00 126 54511 119 40 -0.738476 -0.945861 u_ecmwf v_ecmwf 0 0.239926 -0.012376 1 -1.186846 -0.657165 2 -1.340084 0.247622 3 -1.006525 1.442748 4 -2.370218 0.372719 .. ... ... 337 -0.346077 -3.494583 338 -0.958621 -1.002192 339 1.204885 -2.738038 340 -1.205878 -2.645335 341 -0.119772 -4.037322 [342 rows x 10 columns]</code></pre> <pre><code class="language-python">result = mpd.score(wind_all,mem.acd_uv,plot = "bar",g = "time",title = "风向预报准确率")</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/c44ad796aa0d0073e79c8c3a0eaa5374" alt="" /></p> <pre><code class="language-python">result = mpd.score(wind_all,mem.acs_uv,plot = "bar",g = "time",title = "风速预报准确率")</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/80233f28f306315bdd747979a901859f" alt="" /></p> <pre><code class="language-python">result = mpd.score(wind_all,mem.acz_uv,plot = "bar",g = "time",title = "风预报综合准确率")</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/809455861324ad828cdb489001ec8382" alt="" /></p> <h1>数值型检验指标的空间分布</h1> <p><strong><font face="黑体" color=blue size = 3>score_id(sta_ob_and_fos,method,s = None,g = None,gll = None,group_name_list = None,plot = None,save_dir = None,save_path = None,show = False, add_county_line = False,map_extend= None,print_max=0,print_min=0,dpi = 300,title = None,</strong>kwargs)</font>**<br /> 根据输入的站点数据和检验方法,选择部分数据,将选择的数据进行进行分组检验,计算各种数值型检验指标(不包括检验中间量)</p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta_ob_and_fos </font></strong></td> <td style="text-align: left;">实况和预报合并对齐后的数据,形式为站点数据格式如上述例子中的sta_all</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>method </font></strong></td> <td style="text-align: left;">method中的各类数值型检验指标的函数名称,例如在本页面中已经import meteva.method as mem ,则ts评分的函数名称可以写为mem.ts ,均方根误差计算函数的名称可以写为 mem.rmse。这些函数选项包括<a href="https://www.showdoc.cc/nmc?page_id=2858658548509727">连续型预报</a>,<a href="https://www.showdoc.cc/nmc?page_id=2860336958932349">二分类预报</a>,<a href="https://www.showdoc.cc/nmc?page_id=2859693269266585">多分类预报</a>,<a href="https://www.showdoc.cc/nmc?page_id=3651805946039771">概率预报</a>,<a href="https://www.showdoc.cc/nmc?page_id=3629735872716279">集合预报</a>等类别中的评分函数</td> </tr> <tr> <td style="text-align: left;"><strong>s</strong></td> <td style="text-align: left;">用于选择数据样本的字典参数,具体的参数说明可参见meb.sele_by_dict中的<a href="https://www.showdoc.cc/meteva?page_id=3975604785954540"><font face="黑体" color=red size=5>s</font></a>参数</td> </tr> <tr> <td style="text-align: left;"><strong>g</strong></td> <td style="text-align: left;">用于分组检验的参数,具体用法可参见meb.group中的<a href="https://www.showdoc.cc/meteva?page_id=4071849185300418"><font face="黑体" color=red size=5>g</font></a>参数</td> </tr> <tr> <td style="text-align: left;"><strong>gll</strong></td> <td style="text-align: left;">用于分组检验的参数,具体用法可参见meb.group中的<a href="https://www.showdoc.cc/meteva?page_id=4071849185300418"><font face="黑体" color=red size=5>gll</font></a>参数</td> </tr> <tr> <td style="text-align: left;"><strong>group_name_list</strong></td> <td style="text-align: left;">分组名称的列表</td> </tr> <tr> <td style="text-align: left;"><strong>plot</strong></td> <td style="text-align: left;">是否需要直接将检验结果绘制图片,该参数为None时不绘制,当参数为&quot;scatter&quot;时绘制散点图,当参数为&quot;micaps&quot;时,结果将会被推送到micaps中显示(需相应版本的micaps软件支持,且需要安装Mpython包)</td> </tr> <tr> <td style="text-align: left;"><strong>save_dir</strong></td> <td style="text-align: left;">图片输出文件夹,文件的路径将据此自动生成</td> </tr> <tr> <td style="text-align: left;"><strong>save_path</strong></td> <td style="text-align: left;">指定图片输出的文件路径,当批量生成多张图片时save_path为包含所有图片的输出路径的列表</td> </tr> <tr> <td style="text-align: left;"><strong>show</strong></td> <td style="text-align: left;">该参数不为None时在屏幕显示图片,如果plot不为None,但save_dir和save_path又都为None,则该参数会自动切换为True</td> </tr> <tr> <td style="text-align: left;"><strong>add_county_line</strong></td> <td style="text-align: left;">是否在图中添加县界</td> </tr> <tr> <td style="text-align: left;"><strong>map_extend</strong></td> <td style="text-align: left;">底图的范围,缺省时自动根据站点数据的范围确定底图范围,不缺省时采用[slon,elon,slat,elat] 列表作为参数,也可也接受<a href="https://www.showdoc.cc/meteva?page_id=3975600815874861">网格信息类变量</a>作为地图范围的参数</td> </tr> <tr> <td style="text-align: left;"><strong>print_max</strong></td> <td style="text-align: left;">在屏幕上打印评分指标最大的print_max的站点的信息</td> </tr> <tr> <td style="text-align: left;"><strong>print_min</strong></td> <td style="text-align: left;">在屏幕上打印评分指标最小的print_min的站点的信息</td> </tr> <tr> <td style="text-align: left;"><strong>dpi</strong></td> <td style="text-align: left;">绘图的dpi参数,用法同matplotlib中dpi参数</td> </tr> <tr> <td style="text-align: left;"><strong>title</strong></td> <td style="text-align: left;">图片标题的确定分为1、全自动,2、半自动,3手动三种方式。<br>1、全自动:不设置title参数,系统自动采用title的缺省值+自动补齐的其它信息来确定每一幅图的标题; <br>2、半自动:title 为字符串类型,系统会采用title + 自动补齐的其它信息来确定每一幅图的标题;<br>3、手动:title为一个包含多个字符串的列表,且列表的长度必须和要绘制的图的数量一致,每一幅图会依次采用列表中的字符串作为标题</td> </tr> <tr> <td style="text-align: left;">**kwargs</td> <td style="text-align: left;">检验方法 meteva.method 和meteva.base.scatter_sta 中的可选参数,具体用法参见下面的示例</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">返回一个元组,其包含2个元素,result[0]是包含数值检验指标结果。如没有分组检验,也没有分多种等级检验,则result[0]是一个<a href="https://www.showdoc.cc/meteva?page_id=3975600580125986">站点数据</a>形式的数据,其中数据列中包含了检验的结果,不同预报成员(或观测)的检验(或统计)属性位于不同的列;如果有分组检验,或者有多种等级的检验,则result[0]是一个列表,其中包含不同等级或分组的结果,每个结果是一个<a href="https://www.showdoc.cc/meteva?page_id=3975600580125986">站点数据</a>形式的数据;如果既包含分组,又包含多个等级,则result[0]是一个双层列表,外层代表多个分组的集合,内层代表多个等级的集合。result[1]是实际的分组方式</td> </tr> </tbody> </table> <p><strong>调用示例:</strong></p> <pre><code class="language-python">sta_all = pd.read_hdf(r"H:\test_data\input\mpd\temp_data.h5") #加载一周的预报数据, #meb.set_stadata_names(sta_all,["ob","grapes","ECMWF"]) print(sta_all) #其中包括grapes,ecmwf模式7天内多个时效的预报和对应的观测。</code></pre> <pre><code> level time dtime id lon lat ob \ 1425 0.0 2020-06-29 08:00:00 3 57197 114.35 32.97 27.500000 1434 0.0 2020-06-29 08:00:00 3 57231 108.53 32.53 28.799999 1436 0.0 2020-06-29 08:00:00 3 57233 108.50 32.90 27.200001 1437 0.0 2020-06-29 08:00:00 3 57237 108.03 32.07 30.600000 1439 0.0 2020-06-29 08:00:00 3 57242 109.37 32.85 28.400000 ... ... ... ... ... ... ... ... 742220 0.0 2020-06-23 08:00:00 156 58510 116.23 29.73 25.000000 742221 0.0 2020-06-23 08:00:00 156 58512 116.55 29.90 24.100000 742222 0.0 2020-06-23 08:00:00 156 58514 116.05 29.45 25.799999 742223 0.0 2020-06-23 08:00:00 156 58517 116.20 29.27 26.200001 742224 0.0 2020-06-23 08:00:00 156 58519 116.68 29.00 26.700001 grapes ecmwf 1425 27.690479 25.520103 1434 25.489040 25.833244 1436 25.497000 25.108383 1437 25.887096 25.408495 1439 26.357519 26.479502 ... ... ... 742220 23.838448 28.369730 742221 23.832800 28.175653 742222 23.332600 28.041468 742223 22.905279 29.219957 742224 22.700199 30.072720 [51880 rows x 9 columns]</code></pre> <pre><code class="language-python">#没有分组,也不用区分多个等级的情况,第二个参数mem.me代表统计sta_all数据中的平均误差 result = mpd.score_id(sta_all,mem.me, save_dir = r"H:\test_data\output\mpd\program") print(result) #result 一个包含两个元素的元组,第0个元素是检验结果,它一个sta_data格式数据, #result 第二个元素为实际分组方式,因为本例中没有分组参数,所以其 reulst[1]=[None]。 #其中result[0]元素中的数据列分别是grapes和ecmwf模式在每个站点上的平均误差, #每个站点上的统计样本包括不同起报时间,不同预报时效的(预报,观测)数据对 #result[0]中的time 和dtime列的数据内容并不代表实际的时间时效含义</code></pre> <pre><code>图片已保存至H:\test_data\output\mpd\program/grapes.png 图片已保存至H:\test_data\output\mpd\program/ecmwf.png ( level time dtime id lon lat grapes \ 0 0.0 2020-06-29 08:00:00 3 57197 114.35 32.97 -1.126051 1 0.0 2020-06-29 08:00:00 3 57231 108.53 32.53 -3.645028 2 0.0 2020-06-29 08:00:00 3 57233 108.50 32.90 -2.947213 3 0.0 2020-06-29 08:00:00 3 57237 108.03 32.07 -3.504351 4 0.0 2020-06-29 08:00:00 3 57242 109.37 32.85 -4.662575 .. ... ... ... ... ... ... ... 164 0.0 2020-06-29 08:00:00 3 58510 116.23 29.73 -0.290467 165 0.0 2020-06-29 08:00:00 3 58512 116.55 29.90 -0.406633 166 0.0 2020-06-29 08:00:00 3 58514 116.05 29.45 -0.434255 167 0.0 2020-06-29 08:00:00 3 58517 116.20 29.27 -0.022070 168 0.0 2020-06-29 08:00:00 3 58519 116.68 29.00 -0.878438 ecmwf 0 -0.232724 1 -1.013992 2 -0.423975 3 -2.781958 4 -2.109641 .. ... 164 0.517295 165 0.740169 166 -0.325598 167 0.812808 168 -0.072978 [169 rows x 8 columns], [None])</code></pre> <pre><code class="language-python">result = mpd.score_id(sta_all,mem.me,subplot = "member",ncol=2,print_max = 2,print_min = 1 ) #如果plot参数设置为"scatter" 就会以散点图的形式将检验结果绘制出来,subplot =“member”用于指定将不同预报设置成多个子图,ncol是子图的列数 #增加参数print_max = 2,意思是在屏幕上打印检验指标取值最大的2个站点信息。 #增加参数print_min = 1,意思是在屏幕上打印检验指标取值最小的1个站点信息。\ #下图所示的结果中显示,在统计数据sta_all所涉及的时间和时效范围内grapes在湖北西部附近的预报明显偏低</code></pre> <pre><code>grapes 取值最大的2个站点: id:57197 lon:114.35 lat:32.97 value:-1.1260508298873901 id:57197 lon:114.35 lat:32.97 value:-1.1260508298873901 取值最小的1个站点: id:57197 lon:114.35 lat:32.97 value:-1.1260508298873901 ______________ ecmwf 取值最大的2个站点: id:57197 lon:114.35 lat:32.97 value:-0.23272372782230377 id:57197 lon:114.35 lat:32.97 value:-0.23272372782230377 取值最小的1个站点: id:57197 lon:114.35 lat:32.97 value:-0.23272372782230377 ______________</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=f2216aceb5d8ea6bd858f96d0fd9e393" alt="" /></p> <pre><code class="language-python">result = mpd.score_id(sta_all,mem.me,s = {"dtime_range":[0,24],"member":["ob","grapes"]},print_min = 1) #增加s参数,选择预报时效在0-24小时范围内的样本,同时在数据中只保留“ob”和“grapes”,因此也就只对grapes进行检验</code></pre> <pre><code>取值最小的1个站点: id:57359 lon:110.73 lat:31.35 value:-5.4762096</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=99ee397f4f1c266fac3d61dca18e1ab2" alt="" /></p> <pre><code class="language-python">result = mpd.score_id(sta_all,mem.me,s = {"member":["ob","grapes"]},g = "hour",print_min = 1) #数据中只保留“ob”和“grapes”,增加分组参数g = "hour",意思是按起报时间分组检验 print(result) #由于按起报时间将预报分成了两组,所以result[0]中是包含两组检验结果的列表</code></pre> <pre><code>取值最小的1个站点: id:57359 lon:110.73 lat:31.35 value:-5.8377275</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=4a21f9c435d6a6d06651f2622cbe9770" alt="" /></p> <pre><code>取值最小的1个站点: id:57359 lon:110.73 lat:31.35 value:-5.922942</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=612aa819eb293d830ba357e848528093" alt="" /></p> <pre><code>([ level time dtime id lon lat grapes 0 0.0 2020-06-29 08:00:00 3 57197 114.35 32.97 -1.013217 1 0.0 2020-06-29 08:00:00 3 57231 108.53 32.53 -3.599082 2 0.0 2020-06-29 08:00:00 3 57233 108.50 32.90 -2.844562 3 0.0 2020-06-29 08:00:00 3 57237 108.03 32.07 -3.369653 4 0.0 2020-06-29 08:00:00 3 57242 109.37 32.85 -4.496546 .. ... ... ... ... ... ... ... 164 0.0 2020-06-29 08:00:00 3 58510 116.23 29.73 -0.173258 165 0.0 2020-06-29 08:00:00 3 58512 116.55 29.90 -0.297697 166 0.0 2020-06-29 08:00:00 3 58514 116.05 29.45 -0.291208 167 0.0 2020-06-29 08:00:00 3 58517 116.20 29.27 0.149798 168 0.0 2020-06-29 08:00:00 3 58519 116.68 29.00 -0.729456 [169 rows x 7 columns], level time dtime id lon lat grapes 0 0.0 2020-06-29 08:00:00 3 57197 114.35 32.97 -1.254556 1 0.0 2020-06-29 08:00:00 3 57231 108.53 32.53 -3.697356 2 0.0 2020-06-29 08:00:00 3 57233 108.50 32.90 -3.064120 3 0.0 2020-06-29 08:00:00 3 57237 108.03 32.07 -3.657758 4 0.0 2020-06-29 08:00:00 3 57242 109.37 32.85 -4.851664 .. ... ... ... ... ... ... ... 164 0.0 2020-06-29 08:00:00 3 58510 116.23 29.73 -0.423955 165 0.0 2020-06-29 08:00:00 3 58512 116.55 29.90 -0.530698 166 0.0 2020-06-29 08:00:00 3 58514 116.05 29.45 -0.597170 167 0.0 2020-06-29 08:00:00 3 58517 116.20 29.27 -0.217809 168 0.0 2020-06-29 08:00:00 3 58519 116.68 29.00 -1.048112 [169 rows x 7 columns]], [8, 20])</code></pre> <pre><code class="language-python">result = mpd.score_id(sta_all,mem.me,s = {"member":["ob","grapes"]},g = "hour",gll= [8,20,[8,20]],print_min = 1) #增加了gll参数,将数据分成3组,分别包括08时起报的、20时起报的、08或20时起报的(即所有) 样本</code></pre> <pre><code>取值最小的1个站点: id:57359 lon:110.73 lat:31.35 value:-5.8377275</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=7e2d277aef6a679facf3fd526a099095" alt="" /></p> <pre><code>取值最小的1个站点: id:57359 lon:110.73 lat:31.35 value:-5.922942</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=e8ea35cbcff49c7cacd7d5bad10dcea0" alt="" /></p> <pre><code>取值最小的1个站点: id:57359 lon:110.73 lat:31.35 value:-5.8776984</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=5c825922d242ca6ac5fdfe4ada111225" alt="" /></p> <pre><code class="language-python">result = mpd.score_id(sta_all,mem.me,s = {"member":["ob","grapes"]},g = "hour",gll= [8,20,[8,20]], save_dir = r"H:\test_data\output\mpd\program\score_id") #将结果输出至save_dir目录,程序会自动创建相应的文件夹</code></pre> <pre><code>图片已保存至H:\test_data\output\mpd\program\score_id/grapes(hour=[8]).png 图片已保存至H:\test_data\output\mpd\program\score_id/grapes(hour=[20]).png 图片已保存至H:\test_data\output\mpd\program\score_id/grapes(hour=[8, 20]).png</code></pre> <pre><code class="language-python">result = mpd.score_id(sta_all,mem.me,s = {"member":["ob","grapes"]},g = "hour",gll= [8,20,[8,20]], save_path = [r"H:\test_data\output\mpd\program\score_id\08时.png", r"H:\test_data\output\mpd\program\score_id\20时.png", r"H:\test_data\output\mpd\program\score_id\所有起报时间.png"], title = ["TS(08时起报)","TS(20时起报)","TS(所有起报时间)"],show = True) #手动设置各张图片的报存路径和tilte.</code></pre> <pre><code>图片已保存至H:\test_data\output\mpd\program\score_id\08时.png</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=11ee62b77278f788a977680d220126b1" alt="" /></p> <pre><code>图片已保存至H:\test_data\output\mpd\program\score_id\20时.png</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=50e3f3c412c52be1837411a9b7f43077" alt="" /></p> <pre><code>图片已保存至H:\test_data\output\mpd\program\score_id\所有起报时间.png</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=d5eafb0c41659d39c7df262ba3ec106b" alt="" /></p> <pre><code class="language-python">result = mpd.score_id(sta_all,mem.ts,grade_list = [25,30],subplot = "member",ncol = 2,print_max = 1) #将检验指标切换成mem.ts,mem.ts有时需要等级参数,这个参数可以直接加载score_id函数里如上所示 #本示例中grade_list = [25,30]表示对sta_all中的样本采用两种等级阈值对预报进行检验 #result[0]中是包含两种等级检验结果的列表。</code></pre> <pre><code>grapes(grade_25) 取值最大的1个站点: id:57197 lon:114.35 lat:32.97 value:0.8 ______________ ecmwf(grade_25) 取值最大的1个站点: id:57197 lon:114.35 lat:32.97 value:0.6425531914893617 ______________</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=bfaf6346d79531c2a7a35dafce73aa08" alt="" /></p> <pre><code>grapes(grade_30) 取值最大的1个站点: id:57197 lon:114.35 lat:32.97 value:0.6216216216216216 ______________ ecmwf(grade_30) 取值最大的1个站点: id:57197 lon:114.35 lat:32.97 value:0.6164383561643836 ______________</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=74279a4bf4cbad38573b5259a6de606c" alt="" /></p> <pre><code class="language-python">result = mpd.score_id(sta_all,mem.ts,g = "hour",grade_list = [25,30],plot = None) #如果既有分组,又有多种等级 print(result) #result[0]中是包含双层的列表。内层是不同等级,外层是不同分组</code></pre> <pre><code>([[ level time dtime id lon lat grapes \ 0 0.0 2020-06-29 08:00:00 3 57197 114.35 32.97 0.841584 1 0.0 2020-06-29 08:00:00 3 57231 108.53 32.53 0.453333 2 0.0 2020-06-29 08:00:00 3 57233 108.50 32.90 0.463768 3 0.0 2020-06-29 08:00:00 3 57237 108.03 32.07 0.529412 4 0.0 2020-06-29 08:00:00 3 57242 109.37 32.85 0.351351 .. ... ... ... ... ... ... ... 164 0.0 2020-06-29 08:00:00 3 58510 116.23 29.73 0.718121 165 0.0 2020-06-29 08:00:00 3 58512 116.55 29.90 0.666667 166 0.0 2020-06-29 08:00:00 3 58514 116.05 29.45 0.732484 167 0.0 2020-06-29 08:00:00 3 58517 116.20 29.27 0.734177 168 0.0 2020-06-29 08:00:00 3 58519 116.68 29.00 0.793750 ecmwf 0 0.669355 1 0.707317 2 0.645570 3 0.632353 4 0.639640 .. ... 164 0.893333 165 0.817568 166 0.919463 167 0.921053 168 0.892405 [169 rows x 8 columns], level time dtime id lon lat grapes \ 0 0.0 2020-06-29 08:00:00 3 57197 114.35 32.97 0.619048 1 0.0 2020-06-29 08:00:00 3 57231 108.53 32.53 0.074074 2 0.0 2020-06-29 08:00:00 3 57233 108.50 32.90 0.125000 3 0.0 2020-06-29 08:00:00 3 57237 108.03 32.07 0.000000 4 0.0 2020-06-29 08:00:00 3 57242 109.37 32.85 0.294118 .. ... ... ... ... ... ... ... 164 0.0 2020-06-29 08:00:00 3 58510 116.23 29.73 0.233333 165 0.0 2020-06-29 08:00:00 3 58512 116.55 29.90 0.230769 166 0.0 2020-06-29 08:00:00 3 58514 116.05 29.45 0.218750 167 0.0 2020-06-29 08:00:00 3 58517 116.20 29.27 0.363636 168 0.0 2020-06-29 08:00:00 3 58519 116.68 29.00 0.339286 ecmwf 0 0.634146 1 0.346154 2 0.391304 3 0.038462 4 0.323529 .. ... 164 0.166667 165 0.250000 166 0.352941 167 0.354839 168 0.547170 [169 rows x 8 columns]], [ level time dtime id lon lat grapes \ 0 0.0 2020-06-29 08:00:00 3 57197 114.35 32.97 0.750000 1 0.0 2020-06-29 08:00:00 3 57231 108.53 32.53 0.466667 2 0.0 2020-06-29 08:00:00 3 57233 108.50 32.90 0.471698 3 0.0 2020-06-29 08:00:00 3 57237 108.03 32.07 0.433962 4 0.0 2020-06-29 08:00:00 3 57242 109.37 32.85 0.290323 .. ... ... ... ... ... ... ... 164 0.0 2020-06-29 08:00:00 3 58510 116.23 29.73 0.731343 165 0.0 2020-06-29 08:00:00 3 58512 116.55 29.90 0.688525 166 0.0 2020-06-29 08:00:00 3 58514 116.05 29.45 0.766423 167 0.0 2020-06-29 08:00:00 3 58517 116.20 29.27 0.759124 168 0.0 2020-06-29 08:00:00 3 58519 116.68 29.00 0.753521 ecmwf 0 0.612613 1 0.701493 2 0.630769 3 0.698113 4 0.645161 .. ... 164 0.969231 165 0.815385 166 0.946154 167 0.954545 168 0.903704 [169 rows x 8 columns], level time dtime id lon lat grapes \ 0 0.0 2020-06-29 08:00:00 3 57197 114.35 32.97 0.625000 1 0.0 2020-06-29 08:00:00 3 57231 108.53 32.53 0.000000 2 0.0 2020-06-29 08:00:00 3 57233 108.50 32.90 0.058824 3 0.0 2020-06-29 08:00:00 3 57237 108.03 32.07 0.000000 4 0.0 2020-06-29 08:00:00 3 57242 109.37 32.85 0.240000 .. ... ... ... ... ... ... ... 164 0.0 2020-06-29 08:00:00 3 58510 116.23 29.73 0.190476 165 0.0 2020-06-29 08:00:00 3 58512 116.55 29.90 0.250000 166 0.0 2020-06-29 08:00:00 3 58514 116.05 29.45 0.272727 167 0.0 2020-06-29 08:00:00 3 58517 116.20 29.27 0.333333 168 0.0 2020-06-29 08:00:00 3 58519 116.68 29.00 0.400000 ecmwf 0 0.593750 1 0.526316 2 0.588235 3 0.000000 4 0.440000 .. ... 164 0.300000 165 0.333333 166 0.333333 167 0.379310 168 0.545455 [169 rows x 8 columns]]], [8, 20])</code></pre> <pre><code class="language-python">result = mpd.score_id(sta_all,mem.ob_fo_hr,s = {"member":["ob","grapes"]},grade_list = [25],subplot = "member",ncol = 2) #将统计指标切换成ob_fo_hr 并选择参数 grade_list=[25],意思是分别统计观测和预报样本中取值大于25的比例。 #该函数的功能用于对比观测和预报的频率分别情况。</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=2d8a4fa95c37c863464a2965d7348f36" alt="" /></p> <h1>数值型检验指标随时间_时效的分布</h1> <p><strong><font face="黑体" color=blue size = 3>score_tdt(sta_ob_and_fos0,method,s = None,g = None,gll = None,group_name_list = None, x_y = &quot;obtime_time&quot;,save_dir = None,save_path = None,show = False, dpi = 300,title = None,</strong>kwargs)</font>**<br /> 根据输入的站点数据和检验方法,选择部分数据,将选择的数据进行进行分组检验,计算各种数值型检验指标(不包括检验中间量)</p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta_ob_and_fos </font></strong></td> <td style="text-align: left;">实况和预报合并对齐后的数据,形式为站点数据格式如上述例子中的sta_all</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>method </font></strong></td> <td style="text-align: left;">method中的各类数值型检验指标的函数名称,例如在本页面中已经import meteva.method as mem ,则ts评分的函数名称可以写为mem.ts ,均方根误差计算函数的名称可以写为 mem.rmse。这些函数选项包括<a href="https://www.showdoc.cc/nmc?page_id=2858658548509727">连续型预报</a>,<a href="https://www.showdoc.cc/nmc?page_id=2860336958932349">二分类预报</a>,<a href="https://www.showdoc.cc/nmc?page_id=2859693269266585">多分类预报</a>,<a href="https://www.showdoc.cc/nmc?page_id=3651805946039771">概率预报</a>,<a href="https://www.showdoc.cc/nmc?page_id=3629735872716279">集合预报</a>等类别中的评分函数</td> </tr> <tr> <td style="text-align: left;"><strong>s</strong></td> <td style="text-align: left;">用于选择数据样本的字典参数,具体的参数说明可参见meb.sele_by_dict中的<a href="https://www.showdoc.cc/meteva?page_id=3975604785954540"><font face="黑体" color=red size=5>s</font></a>参数</td> </tr> <tr> <td style="text-align: left;"><strong>g</strong></td> <td style="text-align: left;">用于分组检验的参数,具体用法可参见meb.group中的<a href="https://www.showdoc.cc/meteva?page_id=4071849185300418"><font face="黑体" color=red size=5>g</font></a>参数</td> </tr> <tr> <td style="text-align: left;"><strong>gll</strong></td> <td style="text-align: left;">用于分组检验的参数,具体用法可参见meb.group中的<a href="https://www.showdoc.cc/meteva?page_id=4071849185300418"><font face="黑体" color=red size=5>gll</font></a>参数</td> </tr> <tr> <td style="text-align: left;"><strong>group_name_list</strong></td> <td style="text-align: left;">分组名称的列表</td> </tr> <tr> <td style="text-align: left;"><strong>x_y</strong></td> <td style="text-align: left;">检验结果的绘图方式。<br> 1、当x_y = &quot;obtime_time&quot;时, 检验结果将以观测时间作为横坐标,预报起报时间作为纵坐标,<br> 2、 当x_y = &quot;obtime_dtime&quot;时,检验结果将以观测时间作为横坐标,预报时效作为纵坐标;<br> 3、 当x_y = &quot;time_dtime&quot;时,检验结果将以预报起报时间作为横坐标,预报时效作为纵坐标。<br> 每一个色块代表所有观测时间和预报起报时间相同的样本的集合中统计的检验指标</td> </tr> <tr> <td style="text-align: left;"><strong>save_dir</strong></td> <td style="text-align: left;">图片输出文件夹,文件的路径将据此自动生成</td> </tr> <tr> <td style="text-align: left;"><strong>save_path</strong></td> <td style="text-align: left;">指定图片输出的文件路径,当批量生成多张图片时save_path为包含所有图片的输出路径的列表</td> </tr> <tr> <td style="text-align: left;"><strong>show</strong></td> <td style="text-align: left;">该参数不为None时在屏幕显示图片,如果plot不为None,但save_dir和save_path又都为None,则该参数会自动切换为True</td> </tr> <tr> <td style="text-align: left;"><strong>dpi</strong></td> <td style="text-align: left;">绘图的dpi参数,用法同matplotlib中dpi参数</td> </tr> <tr> <td style="text-align: left;"><strong>title</strong></td> <td style="text-align: left;">图片标题的确定分为1、全自动,2、半自动,3手动三种方式。<br>1、全自动:不设置title参数,系统自动采用title的缺省值+自动补齐的其它信息来确定每一幅图的标题; <br>2、半自动:title 为字符串类型,系统会采用title + 自动补齐的其它信息来确定每一幅图的标题;<br>3、手动:title为一个包含多个字符串的列表,且列表的长度必须和要绘制的图的数量一致,每一幅图会依次采用列表中的字符串作为标题</td> </tr> <tr> <td style="text-align: left;">**kwargs</td> <td style="text-align: left;">检验方法 meteva.method 中的可选参数,具体用法参见下面的示例</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">返回一个元组,其包含2个元素,result[0]是包含数值检验指标结果。如没有分组检验,也没有分多种等级检验,则result[0]是一个<a href="https://www.showdoc.cc/meteva?page_id=3975600580125986">站点数据</a>形式的数据,其中数据列中包含了检验的结果,不同预报成员(或观测)的检验(或统计)属性位于不同的列;如果有分组检验,或者有多种等级的检验,则result[0]是一个列表,其中包含不同等级或分组的结果,每个结果是一个<a href="https://www.showdoc.cc/meteva?page_id=3975600580125986">站点数据</a>形式的数据;如果既包含分组,又包含多个等级,则result[0]是一个双层列表,外层代表多个分组的集合,内层代表多个等级的集合。result[1]是实际的分组方式</td> </tr> </tbody> </table> <p><strong>调用示例:</strong></p> <pre><code class="language-python">sta_all = pd.read_hdf(r"H:\test_data\input\mpd\temp_data_15.h5") #加载2周的预报数据, print(sta_all) #其中包括观测和ecmwf模式7天内多个时效的预报和对应的观测。</code></pre> <pre><code> level time dtime id lon lat ob \ 1867 0.0 2020-08-06 08:00:00 3 58112 116.45 30.73 22.200001 1915 0.0 2020-08-06 08:00:00 3 58238 118.90 31.93 32.200001 1936 0.0 2020-08-06 08:00:00 3 58301 115.38 31.82 32.099998 1937 0.0 2020-08-06 08:00:00 3 58306 115.88 31.68 31.700001 1938 0.0 2020-08-06 08:00:00 3 58311 116.50 31.73 31.799999 ... ... ... ... ... ... ... ... 2393722 0.0 2020-07-24 20:00:00 240 58443 119.90 31.02 31.600000 2393723 0.0 2020-07-24 20:00:00 240 58446 119.70 30.63 32.000000 2393724 0.0 2020-07-24 20:00:00 240 58448 119.70 30.22 31.700001 2393725 0.0 2020-07-24 20:00:00 240 58449 119.95 30.05 31.700001 2393730 0.0 2020-07-24 20:00:00 240 58454 119.97 30.53 30.799999 ECMWF 1867 27.946589 1915 31.602612 1936 31.192728 1937 31.288666 1938 32.220997 ... ... 2393722 29.184551 2393723 29.072453 2393724 28.466028 2393725 29.579990 2393730 28.972569 [63404 rows x 8 columns]</code></pre> <pre><code class="language-python">result = mpd.score_tdt(sta_all,mem.mae,save_dir = r"H:\test_data\output\mpd\program\score_tdt", show = True, x_y = "obtime_time") </code></pre> <pre><code>图片已保存至H:\test_data\output\mpd\program\score_tdt/ECMWF.png</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=b641131dd7c0b080f44f42bd4bc4ba0b" alt="" /></p> <pre><code class="language-python">result = mpd.score_tdt(sta_all,mem.mae,save_dir = r"H:\test_data\output\mpd\program\score_tdt", show = True, x_y = "obtime_dtime")</code></pre> <pre><code>图片已保存至H:\test_data\output\mpd\program\score_tdt/ECMWF.png</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=d9c2d7f54799e56f262973ca40fec558" alt="" /></p> <pre><code class="language-python">result = mpd.score_tdt(sta_all,mem.me,s = {"dtime_range":[0,72]},save_dir = r"H:\test_data\output\mpd\program\score_tdt", show = True, x_y = "time_dtime")</code></pre> <pre><code>图片已保存至H:\test_data\output\mpd\program\score_tdt/ECMWF{'dtime_range' [0, 72]}.png</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=e6831ee64b99add060c67b2542bdb195" alt="" /></p> <pre><code class="language-python">result = mpd.score_tdt(sta_all,mem.ob_fo_mean,s = {"ob_time_range":["2020072408","2020073008"]}, save_dir = r"H:\test_data\output\mpd\program\score_tdt", show = True, x_y = "obtime_time")</code></pre> <pre><code>图片已保存至H:\test_data\output\mpd\program\score_tdt/ECMWF{'ob_time_range' ['2020072408', '2020073008']}.png</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=4735b490f5a77b9a5c56b8bdd753e47a" alt="" /></p> <pre><code class="language-python"></code></pre>

页面列表

ITEM_HTML