meteva

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


台风路径和强度

<p>[TOC]</p> <pre><code class="language-python"> import meteva.base as meb import meteva.method as mem import meteva.product as mpd import os</code></pre> <h1>台风数据形式转换</h1> <p><strong><font face="黑体" color=blue size = 3>tran_typhoon_report(typhoons)</font></strong> </p> <p>将在读入的台风报文数据中,观测对应的预报数据不在同一行,没有对应关系,为了开展检验,需根据预报时效将观测对应成同一行。根据台风检验的规范,在台风报文中起编前的TD阶段数据样本会被删除。</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_all</font></strong></td> <td style="text-align: left;">观测预报匹配前的台风数据</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">返回一个元组,其包含2个元素,第0个元素是匹配后的台风强度(风速)的观测预报数据,第1个元素是匹配后的台风中心位置的观测预报数据</td> </tr> </tbody> </table> <p><strong>调用示例:</strong></p> <pre><code class="language-python">#读取单个台风报文数据,并进行转换 path = r"H:\test_data\input\meb\typhoon\babj_2201.dat" one_typhoon = meb.read_cyclone_trace(path,id_cyclone = 2201, column=meb.m7_element_column.最大风速,data_name="max_wind_speed") print(one_typhoon)</code></pre> <pre><code> level time dtime id lon lat max_wind_speed 0 0 2022-04-08 08:00:00 0 2201 146.1 4.6 18 1 0 2022-04-08 08:00:00 12 2201 145.6 5.4 20 2 0 2022-04-08 08:00:00 24 2201 144.7 6.4 23 3 0 2022-04-08 08:00:00 36 2201 143.6 7.4 25 4 0 2022-04-08 08:00:00 48 2201 142.2 8.7 30 .. ... ... ... ... ... ... ... 341 0 2022-04-15 14:00:00 0 2201 142.1 28.3 33 342 0 2022-04-15 14:00:00 12 2201 146.6 32.5 28 343 0 2022-04-15 14:00:00 24 2201 153.0 38.5 23 344 0 2022-04-15 17:00:00 0 2201 142.8 29.0 30 345 0 2022-04-15 17:00:00 12 2201 147.4 33.2 28 [346 rows x 7 columns]</code></pre> <pre><code class="language-python">sta_all_speed,sta_all_position = mpd.tran_typhoon_report(one_typhoon) print(sta_all_speed) print("___________________________________________________________") print(sta_all_position)</code></pre> <pre><code> level time dtime id lon lat obs fst 84 0 2022-04-08 08:00:00 12 2201 144.9 5.9 20 20 174 0 2022-04-08 08:00:00 24 2201 143.9 6.9 20 23 21 0 2022-04-08 08:00:00 36 2201 142.6 8.2 23 25 141 0 2022-04-08 08:00:00 48 2201 139.8 10.6 23 30 213 0 2022-04-08 08:00:00 60 2201 137.3 11.9 25 35 .. ... ... ... ... ... ... ... ... 122 0 2022-04-14 17:00:00 12 2201 141.2 25.0 35 40 212 0 2022-04-14 17:00:00 24 2201 142.8 29.0 30 35 123 0 2022-04-14 20:00:00 12 2201 140.9 26.1 35 35 124 0 2022-04-15 02:00:00 12 2201 142.1 28.3 33 33 125 0 2022-04-15 05:00:00 12 2201 142.8 29.0 30 30 [243 rows x 8 columns] ___________________________________________________________ level time dtime id lon lat lon_obs lat_obs \ 84 0 2022-04-08 08:00:00 12 2201 144.9 5.9 144.9 5.9 174 0 2022-04-08 08:00:00 24 2201 143.9 6.9 143.9 6.9 21 0 2022-04-08 08:00:00 36 2201 142.6 8.2 142.6 8.2 141 0 2022-04-08 08:00:00 48 2201 139.8 10.6 139.8 10.6 213 0 2022-04-08 08:00:00 60 2201 137.3 11.9 137.3 11.9 .. ... ... ... ... ... ... ... ... 122 0 2022-04-14 17:00:00 12 2201 141.2 25.0 141.2 25.0 212 0 2022-04-14 17:00:00 24 2201 142.8 29.0 142.8 29.0 123 0 2022-04-14 20:00:00 12 2201 140.9 26.1 140.9 26.1 124 0 2022-04-15 02:00:00 12 2201 142.1 28.3 142.1 28.3 125 0 2022-04-15 05:00:00 12 2201 142.8 29.0 142.8 29.0 lon_fo lat_fo 84 145.6 5.4 174 144.7 6.4 21 143.6 7.4 141 142.2 8.7 213 140.8 10.4 .. ... ... 122 140.5 25.1 212 143.1 28.8 123 141.3 25.8 124 143.4 28.1 125 144.2 28.4 [243 rows x 10 columns]</code></pre> <pre><code class="language-python"># 批量读取台风报文数据,并进行转换 typhoon_list = [] for year in range(18,23): for num in range(1,100): path = r"H:\test_data\input\meb\typhoon\babj_"+str(year)+str(num).zfill(2)+".dat" if os.path.exists(path): sta1 = meb.read_cyclone_trace(path,id_cyclone = year *100 + num, column=meb.m7_element_column.最大风速,data_name="max_wind_speed") typhoon_list.append(sta1) all_typhoon = meb.concat(typhoon_list) #将多个台风的数据合并成一个sta_data print(all_typhoon)</code></pre> <pre><code> level time dtime id lon lat max_wind_speed 0 0 2018-01-02 05:00:00 0 1801 123.3 9.4 15 1 0 2018-01-02 05:00:00 12 1801 119.4 9.4 15 2 0 2018-01-02 05:00:00 24 1801 115.3 9.9 18 3 0 2018-01-02 05:00:00 36 1801 112.4 10.5 20 4 0 2018-01-02 05:00:00 48 1801 110.4 10.9 23 .. ... ... ... ... ... ... ... 80 0 2022-04-12 11:00:00 24 2202 128.6 10.6 15 81 0 2022-04-12 14:00:00 0 2202 125.5 11.0 16 82 0 2022-04-12 14:00:00 12 2202 126.1 10.8 16 83 0 2022-04-12 17:00:00 0 2202 125.3 10.9 16 84 0 2022-04-12 17:00:00 12 2202 126.0 10.5 16 [31178 rows x 7 columns]</code></pre> <pre><code class="language-python"># 将多个台风数据同时转换成检验所需格式 sta_all_speed,sta_all_position = mpd.tran_typhoon_report(all_typhoon) print(sta_all_speed) print("___________________________________________________________") print(sta_all_position)</code></pre> <pre><code> level time dtime id lon lat obs fst 0 0 2018-01-02 05:00:00 36 1801 114.1 11.2 18 20 16 0 2018-01-02 05:00:00 48 1801 111.8 11.6 18 23 1 0 2018-01-02 08:00:00 36 1801 113.0 11.0 18 23 17 0 2018-01-02 08:00:00 48 1801 111.0 12.3 16 20 19 0 2018-01-02 11:00:00 24 1801 115.4 10.6 18 23 .. ... ... ... ... ... ... ... ... 39 0 2022-04-11 17:00:00 24 2202 125.3 10.9 16 18 20 0 2022-04-11 20:00:00 12 2202 125.5 11.1 18 18 21 0 2022-04-11 23:00:00 12 2202 125.8 11.0 18 18 22 0 2022-04-12 02:00:00 12 2202 125.5 11.0 16 18 23 0 2022-04-12 05:00:00 12 2202 125.3 10.9 16 18 [19754 rows x 8 columns] ___________________________________________________________ level time dtime id lon lat lon_obs lat_obs \ 0 0 2018-01-02 05:00:00 36 1801 114.1 11.2 114.1 11.2 16 0 2018-01-02 05:00:00 48 1801 111.8 11.6 111.8 11.6 1 0 2018-01-02 08:00:00 36 1801 113.0 11.0 113.0 11.0 17 0 2018-01-02 08:00:00 48 1801 111.0 12.3 111.0 12.3 19 0 2018-01-02 11:00:00 24 1801 115.4 10.6 115.4 10.6 .. ... ... ... ... ... ... ... ... 39 0 2022-04-11 17:00:00 24 2202 125.3 10.9 125.3 10.9 20 0 2022-04-11 20:00:00 12 2202 125.5 11.1 125.5 11.1 21 0 2022-04-11 23:00:00 12 2202 125.8 11.0 125.8 11.0 22 0 2022-04-12 02:00:00 12 2202 125.5 11.0 125.5 11.0 23 0 2022-04-12 05:00:00 12 2202 125.3 10.9 125.3 10.9 lon_fo lat_fo 0 112.4 10.5 16 110.4 10.9 1 112.5 10.2 17 110.5 10.6 19 113.6 10.3 .. ... ... 39 125.5 11.0 20 125.0 11.1 21 125.0 10.9 22 125.4 10.7 23 125.9 10.6 [19754 rows x 10 columns]</code></pre> <p>当台风数据已经整理成了观测预报匹配的格式之和,就可以使用mpd.score 等检验功能对台风预报加以检验</p> <h1>单个台风检验</h1> <pre><code class="language-python"># 根据编号选取一个台风加以检验,并绘制成图形 result = mpd.score_tdt(sta_all_speed,mem.me,s = {"id":2201},x_y = "time_dtime")</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=95dcf3d00cc0e9e4d1285e4a88fe807a" alt="" /></p> <pre><code class="language-python"># 根据编号选取一个台风加以检验,并绘制成图形 result = mpd.score_tdt(sta_all_position,mem.distance,s = {"id":2201},x_y = "time_dtime", multiple = 0.1,title = ["台风的路径误差(单位10km)"])</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=a0b63697d04df7c6204a046ae016b2e0" alt="" /></p> <pre><code class="language-python"># 根据编号选取一个台风加以检验,并绘制成图形 result = mpd.score(sta_all_speed,mem.rmse,s = {"id":2201},g = "dtime",plot = "line", title = "台风强度预报偏差随时效变化",ylabel = "强度预报偏差(单位:m/s)",tag = 1)</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=039d168fb82310f94d9b3137c6410346" alt="" /></p> <pre><code class="language-python">print("分组统计结果:") print(result[0]) print("----------------------") print("分组统计时效:") print(result[1])</code></pre> <pre><code>分组统计结果: [2.24069175 3.71007006 3.77936589 5.33238052 6.45183744 6.97722042 7.35520121 7.32508489 8.10735263 8.08539945] ---------------------- 分组统计时效: [6, 12, 18, 24, 36, 48, 60, 72, 96, 120]</code></pre> <pre><code class="language-python"># 根据编号选取一个台风加以检验,并绘制成图形 result = mpd.score(sta_all_position,mem.distance,s = {"id":2201},g = "dtime",plot = "line", title = "台风位置预报偏差随时效变化",ylabel = "位置预报偏差(km)",tag = 0,vmin = 0)</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=f33770121412972b67ce8ae533a47d1f" alt="" /></p> <h1>多个台风统计检验</h1> <p>基于mpd.score 函数可以对台风路径和强度的偏差做各种分类的统计</p> <pre><code class="language-python">result = mpd.score(sta_all_speed,mem.rmse,g = "dtime",plot = "line", title = "台风强度预报偏差随时效变化",ylabel = "强度预报偏差(单位:m/s)",tag = 1)</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=0459990c4208821d0440c1ea89fbb173" alt="" /></p> <pre><code class="language-python">result = mpd.score(sta_all_position,mem.distance,s = {"dtime":24},g = "year",plot = "line", title = "不同年份的24小时时效台风位置预报偏差",ylabel = "位置预报偏差(km)",tag = 0,vmin = 0)</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=b18ec0ac8e24a1c8782889f8a9d40018" alt="" /></p> <pre><code class="language-python">result = mpd.score(sta_all_position,mem.distance,s = {"year":2021},g = "id",plot = "line", title = "2021年不同编号的台风位置预报所有时效的平均偏差",ylabel = "位置预报偏差(km)",tag = 0,vmin = 0)</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=4be62dc37eb2f21eb042cc7ff21476b3" alt="" /></p>

页面列表

ITEM_HTML