meteva

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


中间数据准备

<p>[TOC]</p> <pre><code class="language-python">import pandas as pd import meteva.method as mem import meteva.base as meb import meteva.product as mpd import meteva.perspact as mps # 透视分析模块 import datetime import meteva import numpy as np import os</code></pre> <h1>基于站点实况</h1> <h2>检验中间量统计_df_sta</h2> <p><strong><font face="黑体" color=blue size = 3>middle_df_sta(sta_all,method,grade_list = None,compare = None,gid = None)</font></strong> </p> <p>输入匹配好的观测预报数据表,计算出每个预报(模式或方法)、每个起报时间、每个预报时效、每个等级(如果检验算法需要等级参数)和每个空间分类对应的检验中间量。</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;">匹配好的观测和预报数据表,sta_data格式</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中的用于统计中间量的函数名称,暂时支持mem.hfmc、mem.tase、mem.tc_count、mem.tmmsss、mem.hfmc_of_sun_rain等选项</td> </tr> <tr> <td style="text-align: left;"><strong>grade_list</strong></td> <td style="text-align: left;">当method=mem.hfmc时,该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据。&lt;\b&gt;当method = mem.tc_count时,判断为准确的误差阈值列表,误差绝对值小于等于阈值的样本记为正确,可以在grade_list 同时设置多个阈值进行检验</td> </tr> <tr> <td style="text-align: left;"><strong>compare</strong></td> <td style="text-align: left;">当method=mem.hfmc时,该参数可用。它表示比较方法,可选项包括&quot;&gt;=&quot;,&quot;&gt;&quot;,&quot;&lt;=&quot;,&quot;&lt;&quot;, 是要素原始值和阈值对比的方法,默认方法为&quot;&gt;=&quot;,即原始值大于等于阈值记为1,否则记为0,compare 为&quot;&lt;=&quot;时,原始值小于等于阈值的站点记为1, 这在基于能见度标记大雾事件、低温事件或降温事件等场景中可以用到</td> </tr> <tr> <td style="text-align: left;"><strong>gid</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;">返回一个DataFrame,其中记录了时间、时效、模式名称、等级、空间分类和统计的中间量</td> </tr> </tbody> </table> <p><strong>调用示例:</strong></p> <pre><code class="language-python">#加载整理好的观测预报数据 path = r"H:\test_data\input\mps\rain24.h5" sta_all = pd.read_hdf(path) print(sta_all)</code></pre> <pre><code> level time dtime id lon lat OBS \ 200113 0 2022-07-11 08:00:00 24 50136 122.52 52.97 0.0 200114 0 2022-07-11 08:00:00 24 50137 122.37 53.47 1.1 200115 0 2022-07-11 08:00:00 24 50246 124.72 52.35 7.1 200116 0 2022-07-11 08:00:00 24 50247 123.57 52.03 1.0 200117 0 2022-07-11 08:00:00 24 50349 124.40 51.67 1.3 ... ... ... ... ... ... ... ... 96435 0 2022-07-20 08:00:00 72 59945 109.70 18.65 0.0 96436 0 2022-07-20 08:00:00 72 59948 109.58 18.22 0.0 96437 0 2022-07-20 08:00:00 72 59951 110.33 18.80 0.0 96438 0 2022-07-20 08:00:00 72 59954 110.03 18.55 0.0 96439 0 2022-07-20 08:00:00 72 59981 112.33 16.83 0.0 ECMWF SCMOC 200113 5.447 0.96 200114 2.250 1.06 200115 4.791 0.51 200116 6.302 0.77 200117 0.961 0.68 ... ... ... 96435 999999.000 0.97 96436 999999.000 1.36 96437 999999.000 1.52 96438 999999.000 1.32 96439 999999.000 0.00 [126128 rows x 9 columns]</code></pre> <p>上面的样例数据是包含了7月10日至20日期间24 - 60H时效的ECMWF、SCMOC预报和对应的观测,合并这张数据表时,选用了how_fo=&quot;outer&quot;参数,即当某个预报缺少时以999999填充。在后续的中间量统计时,允许这些缺省值存在。</p> <pre><code class="language-python">#加载水平站点的分组方式。 #分组参数需要是一个包含两列的DataFrame,第一列是站号,第二列是每个站号的分类标签 #例如,当需要将站点按省分类时,每个站点的分类标签就是省份名称。 path = r"H:\test_data\input\mps\station_id_province_name.dat" id_province = pd.read_csv(path, sep="\\s+", header=None, usecols=[3, 4]) id_province.columns = ["id", "province"] print(id_province)</code></pre> <pre><code> id province 0 54398 北京 1 54399 北京 2 54406 北京 3 54416 北京 4 54419 北京 ... ... ... 37139 899209 新疆 37140 899211 新疆 37141 899223 新疆 37142 899233 新疆 37143 899533 新疆 [37144 rows x 2 columns]</code></pre> <pre><code class="language-python">#统计检验中间量 df_hfmc = mps.middle_df_sta(sta_all,meteva.method.hfmc,grade_list=[0.1,10,25,50,100,250],gid=id_province) print(df_hfmc) # 结果中H\F\M\C分别代表命中、空报、漏报、报无未出的样本数。</code></pre> <pre><code> time dtime member province grade H F M C 0 2022-07-11 08:00:00 24 ECMWF 北京 0.1 15.0 0.0 0.0 0.0 1 2022-07-11 08:00:00 24 ECMWF 北京 10.0 0.0 0.0 6.0 9.0 2 2022-07-11 08:00:00 24 ECMWF 北京 25.0 0.0 0.0 0.0 15.0 3 2022-07-11 08:00:00 24 ECMWF 北京 50.0 0.0 0.0 0.0 15.0 4 2022-07-11 08:00:00 24 ECMWF 北京 100.0 0.0 0.0 0.0 15.0 .. ... ... ... ... ... ... ... ... ... 181 2022-07-20 08:00:00 72 SCMOC 新疆 10.0 0.0 0.0 0.0 88.0 182 2022-07-20 08:00:00 72 SCMOC 新疆 25.0 0.0 0.0 0.0 88.0 183 2022-07-20 08:00:00 72 SCMOC 新疆 50.0 0.0 0.0 0.0 88.0 184 2022-07-20 08:00:00 72 SCMOC 新疆 100.0 0.0 0.0 0.0 88.0 185 2022-07-20 08:00:00 72 SCMOC 新疆 250.0 0.0 0.0 0.0 88.0 [16740 rows x 9 columns]</code></pre> <pre><code class="language-python">#统计检验中间量,不设置grade_list时,统计时grade_list会默认设置成[1e-30] df_hfmc = mps.middle_df_sta(sta_all,meteva.method.hfmc,gid=id_province) print(df_hfmc) # 结果中H\F\M\C分别代表命中、空报、漏报、报无未出的样本数。 </code></pre> <pre><code> time dtime member province H F M C 0 2022-07-11 08:00:00 24 ECMWF 北京 15.0 0.0 0.0 0.0 1 2022-07-11 08:00:00 24 ECMWF 天津 11.0 0.0 0.0 0.0 2 2022-07-11 08:00:00 24 ECMWF 河北 131.0 11.0 0.0 0.0 3 2022-07-11 08:00:00 24 ECMWF 山西 106.0 1.0 0.0 0.0 4 2022-07-11 08:00:00 24 ECMWF 辽宁 6.0 14.0 0.0 35.0 .. ... ... ... ... ... ... ... ... 26 2022-07-20 08:00:00 72 SCMOC 内蒙古 56.0 17.0 5.0 29.0 27 2022-07-20 08:00:00 72 SCMOC 西藏 12.0 11.0 0.0 16.0 28 2022-07-20 08:00:00 72 SCMOC 青海 0.0 3.0 0.0 40.0 29 2022-07-20 08:00:00 72 SCMOC 宁夏 0.0 0.0 1.0 18.0 30 2022-07-20 08:00:00 72 SCMOC 新疆 4.0 0.0 3.0 81.0 [2790 rows x 8 columns]</code></pre> <pre><code class="language-python">df_hfmc = mps.middle_df_sta(sta_all,meteva.method.hfmc,grade_list = [0.1,10,25,50,100,250]) print(df_hfmc) # 结果中H\F\M\C分别代表命中、空报、漏报、报无未出的样本数。 </code></pre> <pre><code> time dtime member grade H F M C 0 2022-07-11 08:00:00 24 ECMWF 0.1 817.0 833.0 22.0 739.0 1 2022-07-11 08:00:00 24 ECMWF 10.0 292.0 134.0 69.0 1916.0 2 2022-07-11 08:00:00 24 ECMWF 25.0 160.0 88.0 39.0 2124.0 3 2022-07-11 08:00:00 24 ECMWF 50.0 64.0 44.0 36.0 2267.0 4 2022-07-11 08:00:00 24 ECMWF 100.0 0.0 5.0 20.0 2386.0 .. ... ... ... ... ... ... ... ... 1 2022-07-20 08:00:00 72 SCMOC 10.0 320.0 114.0 182.0 1760.0 2 2022-07-20 08:00:00 72 SCMOC 25.0 98.0 62.0 130.0 2086.0 3 2022-07-20 08:00:00 72 SCMOC 50.0 6.0 17.0 58.0 2295.0 4 2022-07-20 08:00:00 72 SCMOC 100.0 0.0 6.0 4.0 2366.0 5 2022-07-20 08:00:00 72 SCMOC 250.0 0.0 0.0 0.0 2376.0 [540 rows x 8 columns]</code></pre> <pre><code class="language-python">df_hfmc_of_sun_rain = mps.middle_df_sta(sta_all,meteva.method.hfmc_of_sun_rain,gid=id_province) print(df_hfmc_of_sun_rain) # 结果中Hsr\Fsr\Msr\Csr分别代表0.1mm等级的命中、空报、漏报、报无未出的样本数。 </code></pre> <pre><code> time dtime member province Hsr Fsr Msr Csr 0 2022-07-11 08:00:00 24 ECMWF 北京 15.0 0.0 0.0 0.0 1 2022-07-11 08:00:00 24 ECMWF 天津 11.0 0.0 0.0 0.0 2 2022-07-11 08:00:00 24 ECMWF 河北 129.0 11.0 2.0 0.0 3 2022-07-11 08:00:00 24 ECMWF 山西 106.0 1.0 0.0 0.0 4 2022-07-11 08:00:00 24 ECMWF 辽宁 4.0 8.0 2.0 41.0 .. ... ... ... ... ... ... ... ... 26 2022-07-20 08:00:00 72 SCMOC 内蒙古 56.0 17.0 5.0 29.0 27 2022-07-20 08:00:00 72 SCMOC 西藏 12.0 11.0 0.0 16.0 28 2022-07-20 08:00:00 72 SCMOC 青海 0.0 3.0 0.0 40.0 29 2022-07-20 08:00:00 72 SCMOC 宁夏 0.0 0.0 1.0 18.0 30 2022-07-20 08:00:00 72 SCMOC 新疆 4.0 0.0 3.0 81.0 [2790 rows x 8 columns]</code></pre> <pre><code class="language-python">df_tc_count = mps.middle_df_sta(sta_all,meteva.method.tc_count,gid=id_province) print(df_tc_count) # 结果中T\C分别代表总样本数,和正确样本数数</code></pre> <pre><code> time dtime member province T C 0 2022-07-11 08:00:00 24 ECMWF 北京 15 2 1 2022-07-11 08:00:00 24 ECMWF 天津 11 2 2 2022-07-11 08:00:00 24 ECMWF 河北 142 36 3 2022-07-11 08:00:00 24 ECMWF 山西 107 8 4 2022-07-11 08:00:00 24 ECMWF 辽宁 55 55 .. ... ... ... ... ... .. 26 2022-07-20 08:00:00 72 SCMOC 内蒙古 107 69 27 2022-07-20 08:00:00 72 SCMOC 西藏 39 25 28 2022-07-20 08:00:00 72 SCMOC 青海 43 43 29 2022-07-20 08:00:00 72 SCMOC 宁夏 19 19 30 2022-07-20 08:00:00 72 SCMOC 新疆 88 86 [2790 rows x 6 columns]</code></pre> <pre><code class="language-python">df_tase = mps.middle_df_sta(sta_all,meteva.method.tase,gid=id_province) print(df_tase) # 结果中T\E\A\S分别代表总样本数,误差总和、绝对误差总和、误差平方和</code></pre> <pre><code> time dtime member province T E A \ 0 2022-07-11 08:00:00 24 ECMWF 北京 15.0 -57.290 64.394 1 2022-07-11 08:00:00 24 ECMWF 天津 11.0 236.114 254.426 2 2022-07-11 08:00:00 24 ECMWF 河北 142.0 517.643 1761.689 3 2022-07-11 08:00:00 24 ECMWF 山西 107.0 642.745 1827.355 4 2022-07-11 08:00:00 24 ECMWF 辽宁 55.0 2.689 7.621 .. ... ... ... ... ... ... ... 26 2022-07-20 08:00:00 72 SCMOC 内蒙古 107.0 -239.270 381.790 27 2022-07-20 08:00:00 72 SCMOC 西藏 39.0 68.820 86.900 28 2022-07-20 08:00:00 72 SCMOC 青海 43.0 0.930 0.930 29 2022-07-20 08:00:00 72 SCMOC 宁夏 19.0 -1.700 1.700 30 2022-07-20 08:00:00 72 SCMOC 新疆 88.0 -8.390 9.930 S 0 326.258558 1 9374.976760 2 45901.448617 3 55506.393427 4 6.624533 .. ... 26 6130.694300 27 560.525200 28 0.349100 29 2.890000 30 25.391500 [2790 rows x 8 columns]</code></pre> <pre><code class="language-python">df_tmmsss = mps.middle_df_sta(sta_all,meteva.method.tmmsss,gid=id_province) print(df_tmmsss) # 结果中T\MX\MY\SX\SY\SXY分别表示总样本数,观测平均、预报平均、观测方差、预报方差、观测预报协方差</code></pre> <pre><code> time dtime member province T MX MY \ 0 2022-07-11 08:00:00 24 ECMWF 北京 15.0 8.580000 4.760667 1 2022-07-11 08:00:00 24 ECMWF 天津 11.0 13.054545 34.519455 2 2022-07-11 08:00:00 24 ECMWF 河北 142.0 27.397183 31.042556 3 2022-07-11 08:00:00 24 ECMWF 山西 107.0 31.512150 37.519112 4 2022-07-11 08:00:00 24 ECMWF 辽宁 55.0 0.069091 0.117982 .. ... ... ... ... ... ... ... 26 2022-07-20 08:00:00 72 SCMOC 内蒙古 107.0 3.779439 1.543271 27 2022-07-20 08:00:00 72 SCMOC 西藏 39.0 1.756410 3.521026 28 2022-07-20 08:00:00 72 SCMOC 青海 43.0 0.000000 0.021628 29 2022-07-20 08:00:00 72 SCMOC 宁夏 19.0 0.089474 0.000000 30 2022-07-20 08:00:00 72 SCMOC 新疆 88.0 0.170455 0.075114 SX SY SXY 0 9.590933 3.599770 3.013720 1 27.453388 512.127872 74.026484 2 627.142668 677.666985 497.424380 3 1105.536955 681.324876 652.097045 4 0.083226 0.087628 0.026399 .. ... ... ... 26 52.432474 3.447757 1.792235 27 22.583997 24.258666 17.792045 28 0.000000 0.007651 0.000000 29 0.144100 0.000000 0.000000 30 0.497309 0.127011 0.172435 [2790 rows x 10 columns]</code></pre> <h2>检验中间量统计_ds_sta</h2> <p><strong><font face="黑体" color=blue size = 3>middle_ds(sta_all,method,grade_list = None,compare = None,gid = None)</font></strong> </p> <p>输入匹配好的观测预报数据表,计算出每个预报(模式或方法)、每个起报时间、每个预报时效、每个等级(如果检验算法需要等级参数)和每个空间分类对应的检验中间量。</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;">匹配好的观测和预报数据表,sta_data格式</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中的用于统计中间量的函数名称,暂时支持mem.hfmc、mem.tase、mem.tc_count、mem.tmmsss、mem.hfmc_of_sun_rain等选项</td> </tr> <tr> <td style="text-align: left;"><strong>grade_list</strong></td> <td style="text-align: left;">当method=mem.hfmc时,该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据。&lt;\b&gt;当method = mem.tc_count时,判断为准确的误差阈值列表,误差绝对值小于等于阈值的样本记为正确,可以在grade_list 同时设置多个阈值进行检验</td> </tr> <tr> <td style="text-align: left;"><strong>compare</strong></td> <td style="text-align: left;">当method=mem.hfmc时,该参数可用。它表示比较方法,可选项包括&quot;&gt;=&quot;,&quot;&gt;&quot;,&quot;&lt;=&quot;,&quot;&lt;&quot;, 是要素原始值和阈值对比的方法,默认方法为&quot;&gt;=&quot;,即原始值大于等于阈值记为1,否则记为0,compare 为&quot;&lt;=&quot;时,原始值小于等于阈值的站点记为1, 这在基于能见度标记大雾事件、低温事件或降温事件等场景中可以用到</td> </tr> <tr> <td style="text-align: left;"><strong>gid</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;">返回一个xarray.DataArray,其中记录了时间、时效、模式名称、等级、空间分类和统计的中间量</td> </tr> </tbody> </table> <p><strong>调用示例:</strong></p> <pre><code class="language-python">#统计检验中间量,以xarray的DataSet形式返回 ds_hfmc = mps.middle_ds_sta(sta_all,meteva.method.hfmc,grade_list=[0.1,10,25,50,100,250],gid=id_province) print(ds_hfmc) # 结果中的Data variables中的H\F\M\C分别记录了命中、空报、漏报、报无未出的样本数据。</code></pre> <pre><code> H F M C time dtime member province grade 2022-07-11 08:00:00 24 ECMWF 北京 0.1 15.0 0.0 0.0 0.0 10.0 0.0 0.0 6.0 9.0 25.0 0.0 0.0 0.0 15.0 天津 0.1 11.0 0.0 0.0 0.0 10.0 6.0 1.0 1.0 3.0 ... ... ... ... ... 2022-07-20 08:00:00 72 SCMOC 内蒙古 25.0 0.0 0.0 3.0 104.0 西藏 0.1 12.0 11.0 0.0 16.0 10.0 3.0 2.0 0.0 34.0 青海 0.1 0.0 3.0 0.0 40.0 新疆 0.1 4.0 0.0 3.0 81.0 [4951 rows x 4 columns] &lt;xarray.Dataset&gt; Dimensions: (dtime: 3, grade: 6, member: 2, province: 31, time: 19) Coordinates: * time (time) datetime64[ns] 2022-07-11T08:00:00 ... 2022-07-20T08:00:00 * dtime (dtime) int64 24 48 72 * member (member) object 'ECMWF' 'SCMOC' * province (province) object '上海' '云南' '内蒙古' '北京' ... '重庆' '陕西' '青海' '黑龙江' * grade (grade) float64 0.1 10.0 25.0 50.0 100.0 250.0 Data variables: H (time, dtime, member, province, grade) float64 1.0 0.0 ... nan nan F (time, dtime, member, province, grade) float64 7.0 1.0 ... nan nan M (time, dtime, member, province, grade) float64 0.0 0.0 ... nan nan C (time, dtime, member, province, grade) float64 2.0 9.0 ... nan nan</code></pre> <p>在DataSet形式的中间结果中,如果某些模式的某些时间或时效没有统计值,就会以nan填充。</p> <pre><code class="language-python">#统计检验中间量,以xarray的DataSet形式返回 ds_tase = mps.middle_ds_sta(sta_all,meteva.method.tase,gid=id_province) print(ds_tase) # 结果中的Data variables中的H\F\M\C分别记录了命中、空报、漏报、报无未出的样本数据。</code></pre> <pre><code> T E A \ time dtime member province 2022-07-11 08:00:00 24 ECMWF 北京 15.0 -57.290 64.394 天津 11.0 236.114 254.426 河北 142.0 517.643 1761.689 山西 107.0 642.745 1827.355 辽宁 55.0 2.689 7.621 ... ... ... ... 2022-07-20 08:00:00 72 SCMOC 内蒙古 107.0 -239.270 381.790 西藏 39.0 68.820 86.900 青海 43.0 0.930 0.930 宁夏 19.0 -1.700 1.700 新疆 88.0 -8.390 9.930 S time dtime member province 2022-07-11 08:00:00 24 ECMWF 北京 326.258558 天津 9374.976760 河北 45901.448617 山西 55506.393427 辽宁 6.624533 ... ... 2022-07-20 08:00:00 72 SCMOC 内蒙古 6130.694300 西藏 560.525200 青海 0.349100 宁夏 2.890000 新疆 25.391500 [2547 rows x 4 columns] &lt;xarray.Dataset&gt; Dimensions: (dtime: 3, member: 2, province: 31, time: 19) Coordinates: * time (time) datetime64[ns] 2022-07-11T08:00:00 ... 2022-07-20T08:00:00 * dtime (dtime) int64 24 48 72 * member (member) object 'ECMWF' 'SCMOC' * province (province) object '上海' '云南' '内蒙古' '北京' ... '重庆' '陕西' '青海' '黑龙江' Data variables: T (time, dtime, member, province) float64 10.0 125.0 ... 43.0 77.0 E (time, dtime, member, province) float64 23.39 106.8 ... -149.8 A (time, dtime, member, province) float64 23.39 343.5 ... 0.93 181.3 S (time, dtime, member, province) float64 152.5 ... 4.071e+03</code></pre> <pre><code class="language-python">#统计检验中间量,以xarray的DataSet形式返回 ds_hfmc_of_sun_rain = mps.middle_ds_sta(sta_all,meteva.method.hfmc_of_sun_rain,gid=id_province) print(ds_hfmc_of_sun_rain) # 结果中的Data variables中Hsr\Fsr\Msr\Csr分别代表0.1mm等级的命中、空报、漏报、报无未出的样本数。 </code></pre> <pre><code> Hsr Fsr Msr Csr time dtime member province 2022-07-11 08:00:00 24 ECMWF 北京 15.0 0.0 0.0 0.0 天津 11.0 0.0 0.0 0.0 河北 129.0 11.0 2.0 0.0 山西 106.0 1.0 0.0 0.0 辽宁 4.0 8.0 2.0 41.0 ... ... ... ... ... 2022-07-20 08:00:00 72 SCMOC 甘肃 0.0 10.0 11.0 54.0 内蒙古 56.0 17.0 5.0 29.0 西藏 12.0 11.0 0.0 16.0 青海 0.0 3.0 0.0 40.0 新疆 4.0 0.0 3.0 81.0 [2056 rows x 4 columns] &lt;xarray.Dataset&gt; Dimensions: (dtime: 3, member: 2, province: 31, time: 19) Coordinates: * time (time) datetime64[ns] 2022-07-11T08:00:00 ... 2022-07-20T08:00:00 * dtime (dtime) int64 24 48 72 * member (member) object 'ECMWF' 'SCMOC' * province (province) object '上海' '云南' '内蒙古' '北京' ... '重庆' '陕西' '青海' '黑龙江' Data variables: Hsr (time, dtime, member, province) float64 1.0 34.0 36.0 ... 0.0 10.0 Fsr (time, dtime, member, province) float64 7.0 80.0 19.0 ... 3.0 24.0 Msr (time, dtime, member, province) float64 0.0 0.0 2.0 ... 0.0 11.0 Csr (time, dtime, member, province) float64 2.0 11.0 ... 40.0 32.0</code></pre> <pre><code class="language-python">ds_tmmsss = mps.middle_ds_sta(sta_all,meteva.method.tmmsss,gid=id_province) print(ds_tmmsss) # Data variables中T\MX\MY\SX\SY\SXY分别表示总样本数,观测平均、预报平均、观测方差、预报方差、观测预报协方差</code></pre> <pre><code> T MX MY \ time dtime member province 2022-07-11 08:00:00 24 ECMWF 北京 15.0 8.580000 4.760667 天津 11.0 13.054545 34.519455 河北 142.0 27.397183 31.042556 山西 107.0 31.512150 37.519112 辽宁 55.0 0.069091 0.117982 ... ... ... ... 2022-07-20 08:00:00 72 SCMOC 内蒙古 107.0 3.779439 1.543271 西藏 39.0 1.756410 3.521026 青海 43.0 0.000000 0.021628 宁夏 19.0 0.089474 0.000000 新疆 88.0 0.170455 0.075114 SX SY SXY time dtime member province 2022-07-11 08:00:00 24 ECMWF 北京 9.590933 3.599770 3.013720 天津 27.453388 512.127872 74.026484 河北 627.142668 677.666985 497.424380 山西 1105.536955 681.324876 652.097045 辽宁 0.083226 0.087628 0.026399 ... ... ... ... 2022-07-20 08:00:00 72 SCMOC 内蒙古 52.432474 3.447757 1.792235 西藏 22.583997 24.258666 17.792045 青海 0.000000 0.007651 0.000000 宁夏 0.144100 0.000000 0.000000 新疆 0.497309 0.127011 0.172435 [2549 rows x 6 columns] &lt;xarray.Dataset&gt; Dimensions: (dtime: 3, member: 2, province: 31, time: 19) Coordinates: * time (time) datetime64[ns] 2022-07-11T08:00:00 ... 2022-07-20T08:00:00 * dtime (dtime) int64 24 48 72 * member (member) object 'ECMWF' 'SCMOC' * province (province) object '上海' '云南' '内蒙古' '北京' ... '重庆' '陕西' '青海' '黑龙江' Data variables: T (time, dtime, member, province) float64 10.0 125.0 ... 43.0 77.0 MX (time, dtime, member, province) float64 0.01 1.331 ... 0.0 2.388 MY (time, dtime, member, province) float64 2.349 2.186 ... 0.4434 SX (time, dtime, member, province) float64 0.0009 27.19 ... 0.0 55.36 SY (time, dtime, member, province) float64 9.937 6.659 ... 0.751 SXY (time, dtime, member, province) float64 0.08019 1.213 ... 0.0 3.51</code></pre> <h1>基于格点实况</h1> <h2>检验中间量统计_df_grd</h2> <p><strong><font face="黑体" color=blue size = 3>middle_df_grd(grd_ob, grd_fo, method, grade_list=None, compare=None, marker=None, marker_name=None)</font></strong> </p> <p>输入观测和预报数据,计算出每个等级(如果检验算法需要等级参数)和每个空间分类对应的检验中间量。</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>grd_ob </font></strong></td> <td style="text-align: left;">网格观测数据,暂时只支持1个平面场</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>method </font></strong></td> <td style="text-align: left;">网格预报数据,网格范围和分辨率需和观测一致</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中的用于统计中间量的函数名称,暂时支持mem.hfmc、mem.tase、mem.tc_count、mem.tmmsss、mem.hfmc_of_sun_rain等选项</td> </tr> <tr> <td style="text-align: left;"><strong>grade_list</strong></td> <td style="text-align: left;">当method=mem.hfmc时,该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据。&lt;\b&gt;当method = mem.tc_count时,判断为准确的误差阈值列表,误差绝对值小于等于阈值的样本记为正确,可以在grade_list 同时设置多个阈值进行检验</td> </tr> <tr> <td style="text-align: left;"><strong>compare</strong></td> <td style="text-align: left;">当method=mem.hfmc时,该参数可用。它表示比较方法,可选项包括&quot;&gt;=&quot;,&quot;&gt;&quot;,&quot;&lt;=&quot;,&quot;&lt;&quot;, 是要素原始值和阈值对比的方法,默认方法为&quot;&gt;=&quot;,即原始值大于等于阈值记为1,否则记为0,compare 为&quot;&lt;=&quot;时,原始值小于等于阈值的站点记为1, 这在基于能见度标记大雾事件、低温事件或降温事件等场景中可以用到</td> </tr> <tr> <td style="text-align: left;"><strong>marker</strong></td> <td style="text-align: left;">网格数据,网格范围和分辨率和观测数据一致,通过它可以将整个网格区域分割成不同的区域,进行分类检验。同一种区域内,marker网格值是相同的</td> </tr> <tr> <td style="text-align: left;"><strong>marker_name</strong></td> <td style="text-align: left;">DataFrame,用来记录不同编号的区域的名称</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">返回一个DataFrame,其中记录了时间、时效、模式名称、等级、空间分类和统计的中间量</td> </tr> </tbody> </table> <p><strong>调用示例:</strong></p> <pre><code class="language-python">#读取网格区域划分标签数据 marker = meteva.base.read_griddata_from_micaps4(r"H:\test_data\input\mps\mask_005.dat",data_name="region") meb.pcolormesh_2d_grid(marker)</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=5ffb1b9d942756c514dd1b6f727f58cf&amp;file=file.png" alt="" /></p> <pre><code class="language-python">#读取区域的名称数据 marker_name = pd.read_csv(r"H:\test_data\input\mps\mark_name.txt",sep = ",",header=None) print(marker_name) # 第0列是区域的数字标签,第1列是区域的名称</code></pre> <pre><code> 0 1 0 31 上海 1 53 云南 2 15 内蒙古 3 11 北京 4 22 吉林 5 51 四川 6 12 天津 7 64 宁夏 8 34 安徽 9 37 山东 10 14 山西 11 44 广东 12 45 广西 13 65 新疆 14 32 江苏 15 36 江西 16 13 河北 17 41 河南 18 33 浙江 19 46 海南 20 42 湖北 21 43 湖南 22 62 甘肃 23 35 福建 24 54 西藏 25 52 贵州 26 21 辽宁 27 50 重庆 28 61 陕西 29 63 青海 30 23 黑龙江</code></pre> <pre><code class="language-python">grid_mark = meteva.base.get_grid_of_data(marker) path_ob = r"H:\test_data\input\mps\cldas\rain01\20220731\22073108.000.nc" grd_ob = meteva.base.read_griddata_from_nc(path_ob, grid=grid_mark) path_fo = r"H:\test_data\input\mps\cldas\ruc\20220731\22073108.001.nc" grd_fo = meteva.base.read_griddata_from_nc(path_fo, grid=grid_mark,data_name="RUC") meb.plot_tools.plot_2d_grid_list([grd_ob,grd_fo],ncol = 2,cmap = "rain_1h")</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=11142a912344e99d7dc444e902261cf7&amp;file=file.png" alt="" /></p> <pre><code class="language-python">df = mps.middle_df_grd(grd_ob, grd_fo,meteva.method.hfmc,grade_list=[0.1,5], marker = marker,marker_name = marker_name) print(df) #结果中区域为other的列是marker的取值不在marker_name标签列当中的区域</code></pre> <pre><code> time dtime member region grade H F M \ 0 2022-07-31 08:00:00 1 RUC other 0.1 106.0 45.0 369578.0 1 2022-07-31 08:00:00 1 RUC other 5.0 0.0 0.0 19290.0 0 2022-07-31 08:00:00 1 RUC 北京 0.1 0.0 0.0 0.0 1 2022-07-31 08:00:00 1 RUC 北京 5.0 0.0 0.0 0.0 0 2022-07-31 08:00:00 1 RUC 天津 0.1 0.0 5.0 8.0 .. ... ... ... ... ... ... ... ... 1 2022-07-31 08:00:00 1 RUC 青海 5.0 0.0 0.0 5479.0 0 2022-07-31 08:00:00 1 RUC 宁夏 0.1 0.0 5.0 0.0 1 2022-07-31 08:00:00 1 RUC 宁夏 5.0 0.0 0.0 0.0 0 2022-07-31 08:00:00 1 RUC 新疆 0.1 952.0 442.0 20189.0 1 2022-07-31 08:00:00 1 RUC 新疆 5.0 0.0 0.0 18316.0 C 0 929377.0 1 1279816.0 0 687.0 1 687.0 0 476.0 .. ... 1 22296.0 0 2101.0 1 2106.0 0 48484.0 1 51751.0 [64 rows x 9 columns]</code></pre> <pre><code class="language-python">df = mps.middle_df_grd(grd_ob, grd_fo,meteva.method.hfmc,grade_list=[0.1,5]) print(df) #如果不添加marker参数,则返回结果不会按区域进行分类统计</code></pre> <pre><code> time dtime member grade H F M \ 0 2022-07-31 08:00:00 1 RUC 0.1 6853.0 4950.0 416871.0 1 2022-07-31 08:00:00 1 RUC 5.0 116.0 260.0 58245.0 C 0 1253927.0 1 1623980.0 </code></pre> <pre><code class="language-python">dir_ob = r"H:\test_data\input\mps\cldas\rain01\YYYYMMDD\YYMMDDHH.000.nc" dir_fo = r"H:\test_data\input\mps\cldas\ruc\YYYYMMDD\YYMMDDHH.TTT.nc" time_ob_begin = datetime.datetime(2022, 8,1,8) time_ob_end = datetime.datetime(2022, 8, 2, 21) time_ob = time_ob_begin df_list=[] while time_ob &lt; time_ob_end: path_ob = meteva.base.get_path(dir_ob, time_ob) grd_ob = meteva.base.read_griddata_from_nc(path_ob,time= time_ob,grid=grid_mark) if grd_ob is not None: for dh in range(1,25): time_fo = time_ob - datetime.timedelta(hours=dh) path_fo = meteva.base.get_path(dir_fo, time_fo, dh) grd_fo = meteva.base.read_griddata_from_nc(path_fo,grid=grid_mark,time=time_fo,dtime=dh,data_name="RUC") if grd_fo is not None: df = mps.middle_df_grd(grd_ob, grd_fo,meteva.method.hfmc,grade_list=[0.1,5],marker = marker,marker_name = marker_name) df_list.append(df) time_ob = time_ob + datetime.timedelta(hours=1) df_all = pd.concat(df_list,axis = 0) # 将一段时间内所有时效的中间量拼接成一个DataFrame print(df_all) </code></pre> <pre><code> time dtime member region grade H F M \ 0 2022-08-01 07:00:00 1 RUC other 0.1 14.0 18.0 374006.0 1 2022-08-01 07:00:00 1 RUC other 5.0 0.0 0.0 16913.0 0 2022-08-01 07:00:00 1 RUC 北京 0.1 0.0 0.0 0.0 1 2022-08-01 07:00:00 1 RUC 北京 5.0 0.0 0.0 0.0 0 2022-08-01 07:00:00 1 RUC 天津 0.1 0.0 0.0 1.0 .. ... ... ... ... ... ... ... ... 1 2022-08-01 20:00:00 24 RUC 青海 5.0 0.0 0.0 5297.0 0 2022-08-01 20:00:00 24 RUC 宁夏 0.1 0.0 0.0 11.0 1 2022-08-01 20:00:00 24 RUC 宁夏 5.0 0.0 0.0 0.0 0 2022-08-01 20:00:00 24 RUC 新疆 0.1 620.0 2657.0 20252.0 1 2022-08-01 20:00:00 24 RUC 新疆 5.0 0.0 0.0 18367.0 C 0 925068.0 1 1282193.0 0 687.0 1 687.0 0 488.0 .. ... 1 22478.0 0 2095.0 1 2106.0 0 46538.0 1 51700.0 [56832 rows x 9 columns]</code></pre> <h2>检验中间量统计_ds_grd</h2> <p><strong><font face="黑体" color=blue size = 3>middle_ds_grd(grd_ob, grd_fo, method, grade_list=None, compare=None, marker=None, marker_name=None)</font></strong> </p> <p>输入观测和预报数据,计算出每个等级(如果检验算法需要等级参数)和每个空间分类对应的检验中间量。</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>grd_ob </font></strong></td> <td style="text-align: left;">网格观测数据,暂时只支持1个平面场</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>method </font></strong></td> <td style="text-align: left;">网格预报数据,网格范围和分辨率需和观测一致</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中的用于统计中间量的函数名称,暂时支持mem.hfmc、mem.tase、mem.tc_count、mem.tmmsss、mem.hfmc_of_sun_rain等选项</td> </tr> <tr> <td style="text-align: left;"><strong>grade_list</strong></td> <td style="text-align: left;">当method=mem.hfmc时,该参数用于对连续变量做多种等级阈值的二分类检验,其中包含多个事件是否记录为发生的判断阈值,记其中一个阈值为g,则判断为事件发生的条件是要素值 &gt;= g。该参数缺省时列表中只包含一个取值为1e-30的阈值,由于气象要素精度通常比该缺省值大,因此它相当于将 &gt;0 作为事件发生的判据。&lt;\b&gt;当method = mem.tc_count时,判断为准确的误差阈值列表,误差绝对值小于等于阈值的样本记为正确,可以在grade_list 同时设置多个阈值进行检验</td> </tr> <tr> <td style="text-align: left;"><strong>compare</strong></td> <td style="text-align: left;">当method=mem.hfmc时,该参数可用。它表示比较方法,可选项包括&quot;&gt;=&quot;,&quot;&gt;&quot;,&quot;&lt;=&quot;,&quot;&lt;&quot;, 是要素原始值和阈值对比的方法,默认方法为&quot;&gt;=&quot;,即原始值大于等于阈值记为1,否则记为0,compare 为&quot;&lt;=&quot;时,原始值小于等于阈值的站点记为1, 这在基于能见度标记大雾事件、低温事件或降温事件等场景中可以用到</td> </tr> <tr> <td style="text-align: left;"><strong>marker</strong></td> <td style="text-align: left;">网格数据,网格范围和分辨率和观测数据一致,通过它可以将整个网格区域分割成不同的区域,进行分类检验。同一种区域内,marker网格值是相同的</td> </tr> <tr> <td style="text-align: left;"><strong>marker_name</strong></td> <td style="text-align: left;">DataFrame,用来记录不同编号的区域的名称</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">返回一个DataFrame,其中记录了时间、时效、模式名称、等级、空间分类和统计的中间量</td> </tr> </tbody> </table> <p><strong>调用示例:</strong></p> <pre><code class="language-python">ds = mps.middle_ds_grd(grd_ob, grd_fo,meteva.method.hfmc,grade_list=[0.1,5], marker = marker,marker_name = marker_name) print(ds) #结果中region ="other"的是marker的取值不在marker_name标签列当中的区域</code></pre> <pre><code>&lt;xarray.Dataset&gt; Dimensions: (dtime: 1, grade: 2, member: 1, region: 32, time: 1) Coordinates: * time (time) datetime64[ns] 2022-08-01T20:00:00 * dtime (dtime) int64 24 * member (member) object 'RUC' * region (region) object 'other' '上海' '云南' '内蒙古' ... '重庆' '陕西' '青海' '黑龙江' * grade (grade) float64 0.1 5.0 Data variables: H (time, dtime, member, region, grade) float64 1.473e+05 34.0 ... 0.0 F (time, dtime, member, region, grade) float64 1.65e+05 ... 0.0 M (time, dtime, member, region, grade) float64 2.429e+05 ... 225.0 C (time, dtime, member, region, grade) float64 7.439e+05 ... 2.159...</code></pre> <pre><code class="language-python">ds = mps.middle_ds_grd(grd_ob, grd_fo,meteva.method.hfmc,grade_list=[0.1,5]) print(ds) #如果不添加marker参数,则返回结果不会按区域进行分类统计</code></pre> <pre><code>&lt;xarray.Dataset&gt; Dimensions: (dtime: 1, grade: 2, member: 1, time: 1) Coordinates: * time (time) datetime64[ns] 2022-08-01T20:00:00 * dtime (dtime) int64 24 * member (member) object 'RUC' * grade (grade) float64 0.1 5.0 Data variables: H (time, dtime, member, grade) float64 1.577e+05 37.0 F (time, dtime, member, grade) float64 1.876e+05 2.425e+03 M (time, dtime, member, grade) float64 2.972e+05 5.12e+04 C (time, dtime, member, grade) float64 1.04e+06 1.629e+06</code></pre> <pre><code class="language-python">dir_ob = r"H:\test_data\input\mps\cldas\rain01\YYYYMMDD\YYMMDDHH.000.nc" dir_fo = r"H:\test_data\input\mps\cldas\ruc\YYYYMMDD\YYMMDDHH.TTT.nc" time_ob_begin = datetime.datetime(2022, 8,1,8) time_ob_end = datetime.datetime(2022, 8, 2,21) time_ob = time_ob_begin ds_merge=None while time_ob &lt; time_ob_end: path_ob = meteva.base.get_path(dir_ob, time_ob) grd_ob = meteva.base.read_griddata_from_nc(path_ob,time= time_ob,grid=grid_mark) if grd_ob is not None: for dh in range(1,25): time_fo = time_ob - datetime.timedelta(hours=dh) path_fo = meteva.base.get_path(dir_fo, time_fo, dh) grd_fo = meteva.base.read_griddata_from_nc(path_fo,grid=grid_mark,time=time_fo,dtime=dh,data_name="RUC") if grd_fo is not None: ds = mps.middle_ds_grd(grd_ob, grd_fo,meteva.method.hfmc,grade_list=[0.1,5],marker = marker,marker_name = marker_name) if ds_merge is None: ds_merge = ds else: ds_merge = ds_merge.merge(ds) time_ob = time_ob + datetime.timedelta(hours=1) print(ds_merge) </code></pre> <pre><code>&lt;xarray.Dataset&gt; Dimensions: (dtime: 24, grade: 2, member: 1, region: 32, time: 60) Coordinates: * dtime (dtime) int64 1 2 3 4 5 6 7 8 9 10 ... 16 17 18 19 20 21 22 23 24 * time (time) datetime64[ns] 2022-07-31T08:00:00 ... 2022-08-02T19:00:00 * member (member) object 'RUC' * region (region) object 'other' '上海' '云南' '内蒙古' ... '重庆' '陕西' '青海' '黑龙江' * grade (grade) float64 0.1 5.0 Data variables: H (time, dtime, member, region, grade) float64 nan nan ... nan nan F (time, dtime, member, region, grade) float64 nan nan ... nan nan M (time, dtime, member, region, grade) float64 nan nan ... nan nan C (time, dtime, member, region, grade) float64 nan nan ... nan nan</code></pre> <h1>等距网格分区</h1> <p><strong><font face="黑体" color=blue size = 3>get_grid_marker(grid,step = 10)</font></strong><br /> 根据输入的网格信息类变量,生成一个包含网格分区编号的场,在该场中,面积为step * step的正方形区域内具有相同的区域编号数值。在调用middle_df_grd函数生成中间量时可以将该函数的返回结果作为 marker参数值。</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>grid </font></strong></td> <td style="text-align: left;"><a href="https://www.showdoc.com.cn/meteva/3975600815874861">网格信息类变量</a></td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>step </font></strong></td> <td style="text-align: left;">等距分割的步长,默认值是10,可以支持1-10的整数,或0.1、0.2、...0.9等小数,更复杂的间距不支持。分区时采用就近取值的方案,例如,当step=10时,[105,115)°E,[25,35)°N的正方形范围具有相同的区域编号数值。在网格边缘附近部分相同编号的区域可能是长方形</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">返回一个网格数据,其中记录了每个格点的区域编号值</td> </tr> </tbody> </table> <p><strong>调用示例:</strong></p> <pre><code class="language-python">grid_marker = meb.get_grid_of_data(grd_ob) marker = mps.get_grid_marker(grid_marker) print(marker)</code></pre> <pre><code>&lt;xarray.DataArray 'data0' (member: 1, level: 1, time: 1, dtime: 1, lat: 1201, lon: 1401)&gt; array([[[[[[ 70, 80, 80, ..., 140, 140, 140], [100070, 100080, 100080, ..., 100140, 100140, 100140], [100070, 100080, 100080, ..., 100140, 100140, 100140], ..., [600070, 600080, 600080, ..., 600140, 600140, 600140], [600070, 600080, 600080, ..., 600140, 600140, 600140], [600070, 600080, 600080, ..., 600140, 600140, 600140]]]]]]) Coordinates: * member (member) &lt;U2 'id' * level (level) float64 0.0 * time (time) datetime64[ns] 2022-08-01T08:00:00 * dtime (dtime) int32 0 * lat (lat) float64 0.0 0.05 0.1 0.15 0.2 ... 59.8 59.85 59.9 59.95 60.0 * lon (lon) float64 70.0 70.05 70.1 70.15 ... 139.9 139.9 139.9 140.0</code></pre> <pre><code class="language-python">df = mps.middle_df_grd(grd_ob, grd_fo,meteva.method.hfmc,grade_list=[0.1,5], marker = marker) print(df) # 在id列记录的是每个方块区域的编号。</code></pre> <pre><code> level time dtime member id grade H F \ 0 0.0 2022-07-31 08:00:00 24 RUC 130 0.1 42.0 61.0 1 0.0 2022-07-31 08:00:00 24 RUC 130 5.0 0.0 15.0 0 0.0 2022-07-31 08:00:00 24 RUC 400130 0.1 8276.0 6309.0 1 0.0 2022-07-31 08:00:00 24 RUC 400130 5.0 0.0 0.0 0 0.0 2022-07-31 08:00:00 24 RUC 100100 0.1 10744.0 15458.0 .. ... ... ... ... ... ... ... ... 1 0.0 2022-07-31 08:00:00 24 RUC 500090 5.0 0.0 0.0 0 0.0 2022-07-31 08:00:00 24 RUC 120 0.1 8.0 0.0 1 0.0 2022-07-31 08:00:00 24 RUC 120 5.0 0.0 0.0 0 0.0 2022-07-31 08:00:00 24 RUC 100090 0.1 17467.0 16815.0 1 0.0 2022-07-31 08:00:00 24 RUC 100090 5.0 0.0 437.0 M C 0 39.0 58.0 1 0.0 185.0 0 5968.0 19447.0 1 665.0 39335.0 0 5042.0 8756.0 .. ... ... 1 2907.0 37093.0 0 26.0 166.0 1 0.0 200.0 0 1864.0 3854.0 1 247.0 39316.0 [112 rows x 10 columns]</code></pre> <h1>两种检验中间量转换</h1> <p>meteva提供了pandas.DataFrame 和xarray.DataSet两种形式的中间量数据结构,两种数据结构使用方法非常相似。但相比而言DataSet形式的中间结果更节省存储资源。在实践中如果需要在两种形式的中间结果之间进行转换,可以使用下面的方法:</p> <pre><code class="language-python">ds_hfmc1 = mps.tran_middle_df_to_ds(df_hfmc) print(ds_hfmc1)</code></pre> <pre><code>&lt;xarray.Dataset&gt; Dimensions: (dtime: 3, grade: 6, member: 2, time: 19) Coordinates: * time (time) datetime64[ns] 2022-07-11T08:00:00 ... 2022-07-20T08:00:00 * dtime (dtime) int64 24 48 72 * member (member) object 'ECMWF' 'SCMOC' * grade (grade) float64 0.1 10.0 25.0 50.0 100.0 250.0 Data variables: H (time, dtime, member, grade) float64 817.0 292.0 160.0 ... 0.0 0.0 F (time, dtime, member, grade) float64 833.0 134.0 88.0 ... 6.0 0.0 M (time, dtime, member, grade) float64 22.0 69.0 39.0 ... 4.0 0.0 C (time, dtime, member, grade) float64 739.0 1.916e+03 ... 2.376e+03</code></pre> <pre><code class="language-python">df_hfmc1 = mps.tran_middle_ds_to_df(ds_hfmc1) print(df_hfmc1)</code></pre> <pre><code> time dtime member grade H F M C 0 2022-07-11 08:00:00 24 ECMWF 0.1 817.0 833.0 22.0 739.0 1 2022-07-11 08:00:00 24 ECMWF 10.0 292.0 134.0 69.0 1916.0 2 2022-07-11 08:00:00 24 ECMWF 25.0 160.0 88.0 39.0 2124.0 3 2022-07-11 08:00:00 24 ECMWF 50.0 64.0 44.0 36.0 2267.0 4 2022-07-11 08:00:00 24 ECMWF 100.0 0.0 5.0 20.0 2386.0 .. ... ... ... ... ... ... ... ... 679 2022-07-20 08:00:00 72 SCMOC 10.0 320.0 114.0 182.0 1760.0 680 2022-07-20 08:00:00 72 SCMOC 25.0 98.0 62.0 130.0 2086.0 681 2022-07-20 08:00:00 72 SCMOC 50.0 6.0 17.0 58.0 2295.0 682 2022-07-20 08:00:00 72 SCMOC 100.0 0.0 6.0 4.0 2366.0 683 2022-07-20 08:00:00 72 SCMOC 250.0 0.0 0.0 0.0 2376.0 [441 rows x 8 columns]</code></pre>

页面列表

ITEM_HTML