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 pandas as pd import datetime</code></pre> <pre><code>配置文件设置成功</code></pre> <p>基于对2020年3月制定的《智能预报技术方法竞赛检验方案》中关于雷暴大风检验部分的理解开发的检验功能,在使用前请阅读该模块前请先仔细阅读其有关<a href="https://www.showdoc.com.cn/meteva?page_id=5229500776612325">概述</a>。</p> <p>根据雷暴大风的检验标准,其中雷暴大风的检验涉及到的检验功能包括以下2个部分:</p> <ol> <li>雷暴大风的实况获取,其中又包括闪电条件判断和大风条件判断两个部分。闪电条件判断又包括闪电定位数据转站点形式的闪电次数数据,以及闪电次数是否达到阈值的判断,大风条件判断只包含风速是否达到阈值的判断。</li> <li>雷暴大风预报技巧计算。首先对雷暴大风实况的邻域法处理,将原始值转换成事件实况,进一步按照二分类检验指标中的空报率命中率进行检验,最终根据评分结果计算相关的技巧。</li> </ol> <h1>闪电定位—&gt;闪电次数(2020_1版)</h1> <p><font face="黑体" color=blue size = 5><strong>mpd.edition_2020_1_lightning_ob_to_count(lightning_ob, station, dlon_dlat = 0.25)</strong></font> </p> <p>该算法根据邻域法将闪电定位仪记录的闪电定位数据转换成站点形式的逐小时闪电次数。具体为经过如下步骤</p> <ul> <li>步骤1,因统计结果是逐小时闪电次数,首先闪电记录的精确时间,转换成其对应的整点时间,例如闪电发生时间为 19时20份15秒,则其对应的整点时间为20点。然后步骤2、3中每个小时的闪电数分别统计。</li> <li>步骤2,对每条闪电记录,根据经纬度坐标判断其最近的网格点,在相应的网格点上+1。</li> <li>步骤3,将步骤2所得结果经临近点插值算法,插值到指定站表上。</li> <li>步骤4, 将每个小时步骤3的结果拼接在一起返回</li> </ul> <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>lightning_ob</font></strong></td> <td style="text-align: left;"><a href="https://www.showdoc.com.cn/meteva?page_id=3975600580125986">站点数据</a>格式的观测数据,内容为闪电记录数据,其中包括闪电发生的时间,经度和纬度数据,分别记录在time,lon,lat列,其它列可以为任意值, 其内容可以示多个小时的闪电记录数据拼接起来的DataFrame</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>station</font></strong></td> <td style="text-align: left;">雷暴大风检验的站点表,它是<a href="https://www.showdoc.com.cn/meteva?page_id=3975600580125986">站点数据</a>格式的数据,其中id,lon,lat列分别是站号、经度、纬度、最后一列为type,代表站点类型,国家站的取值为1,其它站为2</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>dlon_dlat</font></strong></td> <td style="text-align: left;">经度和纬度的网格距,其缺省值根据检验规范文档设置为0.25</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">站点数据](<a href="https://www.showdoc.com.cn/meteva?page_id=3975600580125986)格式的闪电发生次数">https://www.showdoc.com.cn/meteva?page_id=3975600580125986)格式的闪电发生次数</a></td> </tr> </tbody> </table> <h1>闪电次数—&gt;闪电条件(2020_1版)</h1> <p><font face="黑体" color=blue size = 5><strong>mpd.edition_2020_1_lightning_count_to_01(sta_ob_linghtning_count,station)</strong></font><br /> 考虑到检验规范文档中规定国家站发生1次闪电记为符合条件,区域站闪电次数达到4次记为满足条件,根据该阈值判据将站点形式的闪电次数数据转换成闪电条件是否满足的结果,满足的站取值记为1,不满足的记为0.</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_linghtning_count</font></strong></td> <td style="text-align: left;"><a href="https://www.showdoc.com.cn/meteva?page_id=3975600580125986">站点数据</a>格式的闪电次数观测数据,其内容可根据闪电定位—&gt;闪电次数(2020_1版)函数模块计算得来</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>station</font></strong></td> <td style="text-align: left;">雷暴大风检验的站点表,它是<a href="https://www.showdoc.com.cn/meteva?page_id=3975600580125986">站点数据</a>格式的数据,其中id,lon,lat列分别是站号、经度、纬度、最后一列为type,代表站点类型,国家站的取值为1,其它站为2</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;"><a href="https://www.showdoc.com.cn/meteva?page_id=3975600580125986">站点数据</a>格式的数据,闪电条件达到阈值条件的站点取值为1,其它取值为0</td> </tr> </tbody> </table> <h1>闪电&amp;风速—&gt;雷暴大风观测(2020_1版)</h1> <p><font face="黑体" color=blue size = 5><strong>mpd.edition_2020_1_light01_maxwind_to_ob01(sta_lightning_01,sta_ob_max_wind)</strong></font><br /> 根据检验规范中规定的地面风速大于17.2m/s的条件满足情况 同 闪电条件满足情况(由 闪电次数—&gt;闪电条件(2020_1版)函数模块计算得来) 相乘获得雷暴大风的观测,取值为1代表站点发生了雷暴大风,否则代表未发生.</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_lightning_01</font></strong></td> <td style="text-align: left;"><a href="https://www.showdoc.com.cn/meteva?page_id=3975600580125986">站点数据</a>格式的闪电条件满足情况,其内容可根据闪电次数—&gt;闪电条件(2020_1版)函数模块计算得来</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta_ob_max_wind</font></strong></td> <td style="text-align: left;">站点形式1小时最大风。 其内容可以示多个小时的风速数据拼接起来的DataFrame</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;"><a href="https://www.showdoc.com.cn/meteva?page_id=3975600580125986">站点数据</a>格式的数据,发生了雷暴大风的站点及时刻的取值为1,其它取值为0</td> </tr> </tbody> </table> <h1>雷暴大风预报技巧(2020_1版)</h1> <p><font face="黑体" color=blue size = 5><strong>edition_2020_1_skill_caculation(sta_ob01,sta_fo_list,pcapital_fo_list)</strong></font><br /> 根据站点形式的雷暴大风观测结果(发生了记为1,未发生记为0)同 国省站点形式的雷暴大风预报以及省会城市雷暴大风预报结果进行检验,返回预报技巧评分。其中步骤包括:</p> <ul> <li>步骤1. 采用<a href="ttps://www.showdoc.com.cn/meteva?page_id=5225225007079073">点对面转换</a>将原始的雷暴大风实况原始值转变为事件实况。</li> <li>步骤2. 将雷暴大风事件实况同国省预报(已由格点插值到站点)进行匹配合并</li> <li>步骤3. 按时效分组计算国省的所有站和省会站的空报率和命中率,并进一步计算技巧。</li> </ul> <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_ob01</font></strong></td> <td style="text-align: left;"><a href="https://www.showdoc.com.cn/meteva?page_id=3975600580125986">站点数据</a>格式雷暴大风观察,发生了记为1,未发生记为0,可根据闪电+风速—&gt;雷暴大风观测(2020_1版) 函数模块计算得到</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta_fo_list</font></strong></td> <td style="text-align: left;">列表,其第0个元素为中央台对所有站的预报,第1个元素为省台对所有站预报,它们分别都是站点形式数据,内容可以示多个时次起报的预报数据拼接起来的DataFrame,每个起报时间和预报时效的数据是根据网格预报采用临近点插值获得</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>pcapital_fo_list</font></strong></td> <td style="text-align: left;">列表,其第0个元素为中央台对省会城市的预报,第1个元素为省台对省会城市的预报,它们分别都是站点形式数据,内容可以示多个时次起报的预报数据拼接起来的DataFrame</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">元组,包含4个元素,内容分别是 格点1小时命中率预报技巧、格点1小时空报率预报技巧、单站1小时命中率预报技巧、单站1小时空报率预报技巧</td> </tr> </tbody> </table> <h1>综合计算(2020_1版)</h1> <p><font face="黑体" color=blue size = 5><strong>edtion_2020_1(lightning_ob,station,sta_ob_max_wind,sta_fo_list,pcapital_fo_list)</strong></font><br /> 根据闪电定位数据、风速观测数据以及雷暴大风预报数据计算雷暴大风预报技巧,其中依次调用了</p> <ul> <li>闪电定位—&gt;闪电次数(2020_1版) </li> <li>闪电次数—&gt;闪电条件(2020_1版)</li> <li>闪电+风速—&gt;雷暴大风观测(2020_1版) </li> <li>雷暴大风预报技巧(2020_1版) 等模块。其中报告了根据闪电定位和风速观测计算雷暴大风实况的模块,如果竞赛中有现成的雷暴大风实况数据可以读取,则可以采用雷暴大风预报技巧(2020_1版)进行计算即可。 </li> </ul> <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_ob01</font></strong></td> <td style="text-align: left;"><a href="https://www.showdoc.com.cn/meteva?page_id=3975600580125986">站点数据</a>格式雷暴大风观察,发生了记为1,未发生记为0,可根据闪电+风速—&gt;雷暴大风观测(2020_1版) 函数模块计算得到</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta_fo_list</font></strong></td> <td style="text-align: left;">列表,其第0个元素为中央台对所有站的预报,第1个元素为省台对所有站预报,它们分别都是站点形式数据,内容可以示多个时次起报的预报数据拼接起来的DataFrame,每个起报时间和预报时效的数据是根据网格预报采用临近点插值获得</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>pcapital_fo_list</font></strong></td> <td style="text-align: left;">列表,其第0个元素为中央台对省会城市的预报,第1个元素为省台对省会城市的预报,它们分别都是站点形式数据,内容可以示多个时次起报的预报数据拼接起来的DataFrame</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">元组,包含4个元素,内容分别是 格点1小时命中率预报技巧、格点1小时空报率预报技巧、单站1小时命中率预报技巧、单站1小时空报率预报技巧</td> </tr> </tbody> </table> <p><strong> 调用示例 </strong></p> <pre><code class="language-python">meb.set_io_config(r"H:\test_data\ip_port.txt") # 读取自动站的站号和经纬度信息的文件,其中需包含站号,经度、纬度和站点类型,读入后分别存储在id,lon,lat,type列 # type列中国家站取值需为1,其它站取值不为1 # 实际业务中站点信息文件以预报司下发的为准 station_file = r"H:\resource\infomation-dat\station_3w.dat" station_all = meb.read_stadata_from_micaps3(station_file,data_name= "type") time_start = datetime.datetime(2021,4,1,2,0) time_end = datetime.datetime(2021,10,31,20,0) #暂时不能确定实际竞赛中用到的观测数据是原始的闪电数据,还是处理好的站点形式的闪电数据,亦或者是处理好的雷暴大风实况数据 #以下只能假定检从最原始的闪电数据处理开始,编写数据收集的示例代码,以供参考 ###读取收集micaps分布式服务器上逐小时闪电观测数据 dir_ob = r"mdfs:///SURFACE/LIGHTNING_1H/YYYYMMDDHH0000.000" sta_list = [] time0 = time_start while time0 &lt;= time_end: path = meb.get_path(dir_ob,time0) #meb.print_gds_file_values_names(path) sta = meb.read_stadata_from_gds(path,meb.gds_element_id.电流强度_闪电定位, time = time0,dtime = 0,level = 0,data_name = "lightning") sta_list.append(sta) time0 += datetime.timedelta(hours = 1) lightning_ob = pd.concat(sta_list,axis = 0) #数据拼接 sta1 = mpd.regulation.thunderstrom_gale.edition_2020_1_lightning_ob_to_count(lightning_ob,station_all) ###读取收集micaps分布式服务器上逐小时最大风速观测数据 dir_ob = r"mdfs:///SURFACE/MAX_WIND/YYYYMMDDHH0000.000" sta_list = [] time0 = time_start while time0 &lt;= time_end: path = meb.get_path(dir_ob,time0) #meb.print_gds_file_values_names(path) sta = meb.read_stadata_from_gds(path,meb.gds_element_id.极大风速, time = time0,dtime = 0,level = 0,data_name = "maxwind") sta_list.append(sta) time0 += datetime.timedelta(hours = 1) max_wind_ob = pd.concat(sta_list,axis = 0) #数据拼接 # 收集中央台预报数据,格点的数值为1代表预报强对流事件发生,0代表预报强对流事件不发生 dir_na = r"O:\data\grid\scmoc\YYYYMMDD\YYMMDDHH.TTT.nc" sta_list = [] time0 = time_start while time0 &lt; time_end: for dh in range(1, 13): # 预报时效包含 1,2,3,。。。,12 path = meb.get_path(dir_na, time0, dh) grd = meb.read_griddata_from_nc(path,time=time0,dtime = dh,level = 0,data_name="scmoc") if grd is not None: sta = meb.interp_gs_linear(grd, station_all) sta_list.append(sta) time0 += datetime.timedelta(hours=6) #起报时间包含 02,08,14,20 scmoc_sta_all = pd.concat(sta_list, axis=0) # 数据拼接 # 收集省台预报数据,格点的数值为1代表预报强对流事件发生,0代表预报强对流事件不发生 dir_pr = r"O:\data\grid\smerge\YYYYMMDD\YYMMDDHH.TTT.nc" sta_list = [] time0 = time_start while time0 &lt; time_end: for dh in range(1, 13): # 预报时效包含 1,2,3,。。。,12 path = meb.get_path(dir_pr, time0, dh) grd = meb.read_griddata_from_nc(path,time=time0,dtime = dh,level = 0,data_name="smerge") if grd is not None: sta = meb.interp_gs_linear(grd, station_all) sta_list.append(sta) time0 += datetime.timedelta(hours=6) #起报时间包含 02,08,14,20 smerge_sta_all = pd.concat(sta_list, axis=0) # 数据拼接 #读取城镇预报,原则上从其它文件中读取,但为了简化示例,此处从网格预报中提取 pcapital_id = [54511] scmoc_sta_pcapital = meb.in_id_list(scmoc_sta_all,pcapital_id) smerge_sta_pcapital = meb.in_id_list(smerge_sta_all,pcapital_id) #调用计算模块计算相关技巧 spo, sfa, spo_pcapital, sfa_pcapital = mpd.regulation.thunderstrom_gale.edtion_2020_1(lightning_ob,station_all,max_wind_ob,[scmoc_sta_all,smerge_sta_all], [scmoc_sta_pcapital,smerge_sta_pcapital]) </code></pre> <pre><code class="language-python"></code></pre>

页面列表

ITEM_HTML