def test_read_filter_2(): tuv_all_levs = mv.read(file_in_testdir('tuv_pl.grib')) u_all_levs = mv.read(data=tuv_all_levs, param='u') assert (mv.grib_get_long(u_all_levs, 'level') == [1000, 850, 700, 500, 400, 300]) assert (mv.grib_get_string(u_all_levs, 'shortName') == ['u', 'u', 'u', 'u', 'u', 'u']) u_2levs = mv.read(data=u_all_levs, levelist=[700, 400]) assert (mv.grib_get_long(u_2levs, 'level') == [700, 400])
def test_read_filter_to_dataset(): tuv_all_levs = mv.read(file_in_testdir('tuv_pl.grib')) u_all_levs = mv.read(data=tuv_all_levs, param='u') assert (mv.grib_get_long(u_all_levs, 'level') == [1000, 850, 700, 500, 400, 300]) assert (mv.grib_get_string(u_all_levs, 'shortName') == ['u', 'u', 'u', 'u', 'u', 'u']) x = u_all_levs.to_dataset() x_keys = x.keys() assert ('u' in x_keys) # only 'u' should be there assert ('v' not in x_keys) # only 'u' should be there assert ('t' not in x_keys) # only 'u' should be there
def test_mvl_ml2hPa(): ml_data = mv.read(file_in_testdir('ml_data.grib')) assert mv.type(ml_data) == 'fieldset' ml_t = mv.read(data=ml_data, param='t') ml_lnsp = mv.read(data=ml_data, param='lnsp') desired_pls = [1000, 900, 850, 500, 300, 100, 10, 1, 0.8, 0.5, 0.3, 0.1] pl_data = mv.mvl_ml2hPa(ml_lnsp, ml_t, desired_pls) assert mv.type(pl_data) == 'fieldset' pls = mv.grib_get_long(pl_data, 'level') lev_types = mv.grib_get_string(pl_data, 'typeOfLevel') lev_divisors = [1 if x == 'isobaricInhPa' else 100 for x in lev_types] pl_in_hpa = [a / b for a, b in zip(pls, lev_divisors)] assert (pl_in_hpa == desired_pls)
def plot_rmse(*args, ref=None, area=None, title_font_size=0.4, y_max=None): """ Plot RMSE curve """ desc = [] if not isinstance(ref, mv.Fieldset): raise Exception(f"Missing or invalid ref argument!") layers = _make_layers(*args, form_layout=False) # compute the rmse for each input layer data = [] # list of tuples rmse_data = [] title_data = [] has_ef = False for layer in layers: if isinstance(layer["data"], mv.Fieldset): # determine ens number members = layer["data"]._unique_metadata("number") # print(f"members={members}") # ens forecast if len(members) > 1: if has_ef: raise Exception( "Only one ENS fieldset can be used in plot_rmse()!") has_ef = True em_d = None # ens mean for m in members: pf_d = layer["data"].select(number=m) ref_d, pf_d = _prepare_grid(ref, pf_d) data.append(("cf" if m == "0" else "pf", layer["data"])) rmse_data.append(mv.sqrt(mv.average((pf_d - ref_d)**2))) em_d = pf_d if em_d is None else em_d + pf_d # compute rmse for ens mean data.append(("em", layer["data"])) rmse_data.append( mv.sqrt(mv.average((em_d / len(members) - ref_d)**2))) # deterministic forecast else: ref_d, dd = _prepare_grid(ref, layer["data"]) data.append(("fc", layer["data"])) rmse_data.append(mv.sqrt(mv.average((dd - ref_d)**2))) title_data.append(layer["data"]) # define x axis params dates = ref.valid_date() x_min = dates[0] x_max = dates[-1] x_tick = 1 x_title = "" # define y axis params y_min = 0 if y_max is None: y_tick, _, y_max = Layout.compute_axis_range(0, _y_max(rmse_data)) else: y_tick, _, _ = Layout.compute_axis_range(0, y_max) y_title = "RMSE [" + mv.grib_get_string(ref[0], "units") + "]" # print(f"y_tick={y_tick} y_max={y_max}") # define the view view = Layout().build_rmse(x_min, x_max, y_min, y_max, x_tick, y_tick, x_title, y_title) desc.append(view) # define curves ef_label = {"cf": "ENS cf", "pf": "ENS pf", "em": "ENS mean"} ef_colour = {"cf": "black", "pf": "red", "em": "kelly_green"} fc_colour = [ "red", "blue", "green", "black", "cyan", "evergreen", "gold", "pink" ] if has_ef: fc_colour = [x for x in fc_colour if x not in list(ef_colour.values())] pf_label_added = False colour_idx = -1 legend_item_count = 0 for i, d in enumerate(rmse_data): vis = mv.input_visualiser(input_x_type="date", input_date_x_values=dates, input_y_values=d) vd = {"graph_type": "curve"} line_colour = "black" line_width = 1 if data[i][0] == "fc": line_width = 3 colour_idx = (colour_idx + 1) % len(fc_colour) line_colour = fc_colour[colour_idx] # print(f"label={data[i][1][0].label}") vd["legend_user_text"] = data[i][1].label vd["legend"] = "on" legend_item_count += 1 elif data[i][0] == "pf": line_width = 1 line_colour = ef_colour["pf"] if not pf_label_added: pf_label_added = True vd["legend_user_text"] = ef_label.get("pf", "") vd["legend"] = "on" legend_item_count += 1 elif data[i][0] in ["cf", "em"]: line_width = 3 line_colour = ef_colour[data[i][0]] vd["legend_user_text"] = ef_label.get(data[i][0], "") vd["legend"] = "on" legend_item_count += 1 vd["graph_line_colour"] = line_colour vd["graph_line_thickness"] = line_width desc.append(vis) desc.append(mv.mgraph(**vd)) # add title title = Title(font_size=title_font_size) t = title.build_rmse(ref, title_data) if t is not None: desc.append(t) # add legend leg_left = 3.5 # legY = 14 leg_height = legend_item_count * (0.35 + 0.5) + (legend_item_count + 1) * 0.1 leg_bottom = 17.5 - leg_height # Legend legend = mv.mlegend( legend_display_type="disjoint", legend_entry_plot_direction="column", # "row", legend_text_composition="user_text_only", legend_border="on", legend_border_colour="black", legend_box_mode="positional", legend_box_x_position=leg_left, legend_box_y_position=leg_bottom, legend_box_x_length=4, legend_box_y_length=leg_height, legend_text_font_size=0.35, legend_box_blanking="on", ) desc.append(legend) mv.plot(desc, animate=False)
def name(self) -> str: return metview.grib_get_string(self, "name")
def units(self): return metview.grib_get_string(self, "units")
def test_read(): gg = mv.read({'SOURCE': file_in_testdir('test.grib'), 'GRID': 80}) assert mv.grib_get_string(gg, 'typeOfGrid') == 'regular_gg'