From 4fb90b0833e724a1021455521ddeaefda4e0d541 Mon Sep 17 00:00:00 2001 From: danielfromearth Date: Thu, 12 Dec 2024 16:21:47 -0500 Subject: [PATCH 1/6] include dimensions in variable property comparisons --- ncompare/core.py | 65 +++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/ncompare/core.py b/ncompare/core.py index bae3629..626dd90 100644 --- a/ncompare/core.py +++ b/ncompare/core.py @@ -43,7 +43,9 @@ from ncompare.sequence_operations import common_elements, count_diffs from ncompare.utils import ensure_valid_path_exists, ensure_valid_path_with_suffix -VarProperties = namedtuple("VarProperties", "varname, variable, dtype, shape, chunking, attributes") +VarProperties = namedtuple( + "VarProperties", "varname, variable, dtype, dimensions, shape, chunking, attributes" +) GroupPair = namedtuple( "GroupPair", @@ -443,7 +445,7 @@ def _print_group_details_side_by_side( def _print_var_properties_side_by_side( - out, + out: Outputter, v_a: VarProperties, v_b: VarProperties, num_attribute_diffs: SummaryDifferencesDict, @@ -455,6 +457,7 @@ def _print_var_properties_side_by_side( # so we can decide whether to highlight the variable header. pairs_to_check_and_show = [ (v_a.dtype, v_b.dtype), + (v_a.dimensions, v_b.dimensions), (v_a.shape, v_b.shape), ] if show_chunks: @@ -487,48 +490,32 @@ def _print_var_properties_side_by_side( force_display_even_if_same=True, ) - # Data type - diff_condition: SummaryDifferenceKeys = out.side_by_side( - "dtype:", v_a.dtype, v_b.dtype, highlight_diff=True - ) - num_attribute_diffs[diff_condition] += 1 - if diff_condition in ("left", "right", "both"): - num_attribute_diffs["difference_types"].add("dtype") - # Shape - diff_condition = out.side_by_side("shape:", v_a.shape, v_b.shape, highlight_diff=True) - num_attribute_diffs[diff_condition] += 1 - if diff_condition in ("left", "right", "both"): - num_attribute_diffs["difference_types"].add("shape") - # Chunking - if show_chunks: - diff_condition = out.side_by_side( - "chunksize:", v_a.chunking, v_b.chunking, highlight_diff=True + # Go through each attribute, show differences, and add differences to running tally. + def _var_attribute_side_by_side(attribute_name, attribute_a, attribute_b): + diff_condition: SummaryDifferenceKeys = out.side_by_side( + f"{attribute_name}:", attribute_a, attribute_b, highlight_diff=True ) num_attribute_diffs[diff_condition] += 1 if diff_condition in ("left", "right", "both"): - num_attribute_diffs["difference_types"].add("chunksize") - # Attributes + num_attribute_diffs["difference_types"].add("dtype") + + _var_attribute_side_by_side("dtype", v_a.dtype, v_b.dtype) + _var_attribute_side_by_side("dimensions", v_a.dimensions, v_b.dimensions) + _var_attribute_side_by_side("shape", v_a.shape, v_b.shape) + # Chunking + if show_chunks: + _var_attribute_side_by_side("chunksize", v_a.chunking, v_b.chunking) + # Scale Factor + scale_factor_pair = _get_and_check_variable_scale_factor(v_a, v_b) + if scale_factor_pair: + _var_attribute_side_by_side("scale_factor", scale_factor_pair[0], scale_factor_pair[1]) + # Other attributes if show_attributes: for attr_a_key, attr_a, attr_b_key, attr_b in _get_and_check_variable_attributes(v_a, v_b): # Check whether attr_a_key is empty, # because it might be if the variable doesn't exist in File A. attribute_key = attr_a_key if attr_a_key else attr_b_key - diff_condition = out.side_by_side( - f"{attribute_key}:", attr_a, attr_b, highlight_diff=True - ) - num_attribute_diffs[diff_condition] += 1 - if diff_condition in ("left", "right", "both"): - num_attribute_diffs["difference_types"].add(attribute_key) - - # Scale Factor - scale_factor_pair = _get_and_check_variable_scale_factor(v_a, v_b) - if scale_factor_pair: - diff_condition = out.side_by_side( - "sf:", scale_factor_pair[0], scale_factor_pair[1], highlight_diff=True - ) - num_attribute_diffs[diff_condition] += 1 - if diff_condition in ("left", "right", "both"): - num_attribute_diffs["difference_types"].add("scale_factor") + _var_attribute_side_by_side(attribute_key, attr_a, attr_b) def _get_and_check_variable_scale_factor( @@ -584,6 +571,7 @@ def _var_properties(group: Union[netCDF4.Dataset, netCDF4.Group], varname: str) if varname: the_variable = group.variables[varname] v_dtype = str(the_variable.dtype) + v_dimensions = str(the_variable.dimensions) v_shape = str(the_variable.shape).strip() v_chunking = str(the_variable.chunking()).strip() @@ -598,11 +586,14 @@ def _var_properties(group: Union[netCDF4.Dataset, netCDF4.Group], varname: str) else: the_variable = None v_dtype = "" + v_dimensions = "" v_shape = "" v_chunking = "" v_attributes = None - return VarProperties(varname, the_variable, v_dtype, v_shape, v_chunking, v_attributes) + return VarProperties( + varname, the_variable, v_dtype, v_dimensions, v_shape, v_chunking, v_attributes + ) def _get_attribute_value_as_str(varprops: VarProperties, attribute_key: str) -> str: From bc2b34d17a36931a62548650f3007ecf41df86df Mon Sep 17 00:00:00 2001 From: danielfromearth Date: Thu, 12 Dec 2024 16:22:58 -0500 Subject: [PATCH 2/6] update example notebook to include dimensions in variable comparisons --- docs/example/ncompare-example-usage.ipynb | 48 +++++++++++++++++++---- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/docs/example/ncompare-example-usage.ipynb b/docs/example/ncompare-example-usage.ipynb index fcd4f21..d9f1644 100644 --- a/docs/example/ncompare-example-usage.ipynb +++ b/docs/example/ncompare-example-usage.ipynb @@ -200,27 +200,35 @@ "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", "\u001b[0m -----VARIABLE-----: lat_bounds lat_bounds\u001b[0m\n", "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m dimensions: ('latitude', 'nv') ('latitude', 'nv')\u001b[0m\n", "\u001b[0m shape: (72, 2) (72, 2)\u001b[0m\n", "\u001b[0m -----VARIABLE-----: latitude latitude\u001b[0m\n", "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m dimensions: ('latitude',) ('latitude',)\u001b[0m\n", "\u001b[0m shape: (72,) (72,)\u001b[0m\n", "\u001b[0m -----VARIABLE-----: lon_bounds lon_bounds\u001b[0m\n", "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m dimensions: ('longitude', 'nv') ('longitude', 'nv')\u001b[0m\n", "\u001b[0m shape: (144, 2) (144, 2)\u001b[0m\n", "\u001b[0m -----VARIABLE-----: longitude longitude\u001b[0m\n", "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m dimensions: ('longitude',) ('longitude',)\u001b[0m\n", "\u001b[0m shape: (144,) (144,)\u001b[0m\n", "\u001b[0m -----VARIABLE-----: precip precip\u001b[0m\n", "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m dimensions: ('time', 'latitude', 'longitude') ('time', 'latitude', 'longitude')\u001b[0m\n", "\u001b[0m shape: (1, 72, 144) (1, 72, 144)\u001b[0m\n", "\u001b[0m -----VARIABLE-----: precip_error precip_error\u001b[0m\n", "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m dimensions: ('time', 'latitude', 'longitude') ('time', 'latitude', 'longitude')\u001b[0m\n", "\u001b[0m shape: (1, 72, 144) (1, 72, 144)\u001b[0m\n", "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m dimensions: ('time',) ('time',)\u001b[0m\n", "\u001b[0m shape: (1,) (1,)\u001b[0m\n", "\u001b[0m -----VARIABLE-----: time_bounds time_bounds\u001b[0m\n", "\u001b[0m dtype: float32 float32\u001b[0m\n", + "\u001b[0m dimensions: ('time', 'nv') ('time', 'nv')\u001b[0m\n", "\u001b[0m shape: (1, 2) (1, 2)\u001b[0m\n", "\u001b[0m - -------------------------- --------------------------\u001b[0m\n", "\u001b[0m SUMMARY -------------------------- --------------------------\u001b[0m\n", @@ -228,7 +236,7 @@ "\u001b[0m Total # of non-shared variables: 0 0\u001b[0m\n", "\u001b[0m Total # of shared groups: 0 0\u001b[0m\n", "\u001b[0m Total # of non-shared groups: 0 0\u001b[0m\n", - "\u001b[0m Total # of shared attributes: 16 16\u001b[0m\n", + "\u001b[0m Total # of shared attributes: 24 24\u001b[0m\n", "\u001b[0m Total # of non-shared attributes: 0 0\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m\n", "Done.\u001b[0m\n", @@ -287,42 +295,55 @@ "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", "\u001b[0m -----VARIABLE-----: lat\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('lat',)\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480,)\u001b[0m\n", "\u001b[0m -----VARIABLE-----: lat_bnds\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('lat', 'nv')\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480, 2)\u001b[0m\n", "\u001b[0m -----VARIABLE-----: lat_bounds \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('latitude', 'nv') \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72, 2) \u001b[0m\n", "\u001b[0m -----VARIABLE-----: latitude \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('latitude',) \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72,) \u001b[0m\n", "\u001b[0m -----VARIABLE-----: lon\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('lon',)\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440,)\u001b[0m\n", "\u001b[0m -----VARIABLE-----: lon_bnds\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('lon', 'nv')\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440, 2)\u001b[0m\n", "\u001b[0m -----VARIABLE-----: lon_bounds \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('longitude', 'nv') \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144, 2) \u001b[0m\n", "\u001b[0m -----VARIABLE-----: longitude \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('longitude',) \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144,) \u001b[0m\n", "\u001b[0m -----VARIABLE-----: precip \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('time', 'latitude', 'longitude') \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", "\u001b[0m -----VARIABLE-----: precip_error \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('time', 'latitude', 'longitude') \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", "\u001b[0m -----VARIABLE-----: precipitation\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('time', 'lon', 'lat')\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 1440, 480)\u001b[0m\n", "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 int32\u001b[0m\n", + "\u001b[0m dimensions: ('time',) ('time',)\u001b[0m\n", "\u001b[0m shape: (1,) (1,)\u001b[0m\n", "\u001b[0m -----VARIABLE-----: time_bounds \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('time', 'nv') \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 2) \u001b[0m\n", "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", "\u001b[0m SUMMARY ------------------------------ ------------------------------\u001b[0m\n", @@ -330,12 +351,12 @@ "\u001b[0m Total # of non-shared variables: 7 5\u001b[0m\n", "\u001b[0m Total # of shared groups: 0 0\u001b[0m\n", "\u001b[0m Total # of non-shared groups: 0 0\u001b[0m\n", - "\u001b[0m Total # of shared attributes: 1 1\u001b[0m\n", - "\u001b[0m Total # of non-shared attributes: 15 11\u001b[0m\n", + "\u001b[0m Total # of shared attributes: 2 2\u001b[0m\n", + "\u001b[0m Total # of non-shared attributes: 22 16\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", "Differences were found in these attributes:\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "['dtype', 'shape']\u001b[0m\n", + "['dtype']\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m\n", "Done.\u001b[0m\n", "\u001b[0m\u001b[0m" @@ -392,6 +413,7 @@ "\u001b[0m - ------------------------------ ------------------------------\u001b[0m\n", "\u001b[0m -----VARIABLE-----: lat\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('lat',)\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480,)\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lat_bnds\u001b[0m\n", @@ -402,15 +424,18 @@ "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: -60.0\u001b[0m\n", "\u001b[0m -----VARIABLE-----: lat_bnds\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('lat', 'nv')\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (480, 2)\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", "\u001b[0m -----VARIABLE-----: lat_bounds \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('latitude', 'nv') \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72, 2) \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: latitude values at the north and south bounds of each pixel. \u001b[0m\n", "\u001b[0m -----VARIABLE-----: latitude \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('latitude',) \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (72,) \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: Y \u001b[0m\n", @@ -421,6 +446,7 @@ "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [-90.0, 90.0, ...] \u001b[0m\n", "\u001b[0m -----VARIABLE-----: lon\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('lon',)\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440,)\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mbounds: lon_bnds\u001b[0m\n", @@ -431,15 +457,18 @@ "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: 0.0\u001b[0m\n", "\u001b[0m -----VARIABLE-----: lon_bnds\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('lon', 'nv')\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1440, 2)\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous\u001b[0m\n", "\u001b[0m -----VARIABLE-----: lon_bounds \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('longitude', 'nv') \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144, 2) \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: longitude values at the west and east bounds of each pixel. \u001b[0m\n", "\u001b[0m -----VARIABLE-----: longitude \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('longitude',) \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (144,) \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: X \u001b[0m\n", @@ -450,6 +479,7 @@ "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 360.0, ...] \u001b[0m\n", "\u001b[0m -----VARIABLE-----: precip \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('time', 'latitude', 'longitude') \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcell_methods: area: mean time: mean \u001b[0m\n", @@ -461,6 +491,7 @@ "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 100.0, ...] \u001b[0m\n", "\u001b[0m -----VARIABLE-----: precip_error \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('time', 'latitude', 'longitude') \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 72, 144) \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcoordinates: time latitude longitude \u001b[0m\n", @@ -470,6 +501,7 @@ "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_range: [0.0, 100.0, ...] \u001b[0m\n", "\u001b[0m -----VARIABLE-----: precipitation\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32\u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('time', 'lon', 'lat')\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 1440, 480)\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: [1, 1440, 480]\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31m_FillValue: -1.0\u001b[0m\n", @@ -482,6 +514,7 @@ "\u001b[0m\u001b[37m\u001b[0m \u001b[31mvalid_min: 0.0\u001b[0m\n", "\u001b[0m -----VARIABLE-----: time time\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 int32\u001b[0m\n", + "\u001b[0m dimensions: ('time',) ('time',)\u001b[0m\n", "\u001b[0m shape: (1,) (1,)\u001b[0m\n", "\u001b[0m chunksize: contiguous contiguous\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31maxis: T \u001b[0m\n", @@ -492,6 +525,7 @@ "\u001b[0m\u001b[37m\u001b[0m \u001b[31munits: days since 1970-01-01 00:00:00 0:00 days since 1979-01-01 0:0:0\u001b[0m\n", "\u001b[0m -----VARIABLE-----: time_bounds \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdtype: float32 \u001b[0m\n", + "\u001b[0m\u001b[37m\u001b[0m \u001b[31mdimensions: ('time', 'nv') \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mshape: (1, 2) \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mchunksize: contiguous \u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m \u001b[31mcomment: time bounds for each time value \u001b[0m\n", @@ -501,12 +535,12 @@ "\u001b[0m Total # of non-shared variables: 7 5\u001b[0m\n", "\u001b[0m Total # of shared groups: 0 0\u001b[0m\n", "\u001b[0m Total # of non-shared groups: 0 0\u001b[0m\n", - "\u001b[0m Total # of shared attributes: 4 4\u001b[0m\n", - "\u001b[0m Total # of non-shared attributes: 53 37\u001b[0m\n", + "\u001b[0m Total # of shared attributes: 5 5\u001b[0m\n", + "\u001b[0m Total # of non-shared attributes: 60 42\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", "Differences were found in these attributes:\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "['_FillValue', 'axis', 'bounds', 'calendar', 'cell_method', 'cell_methods', 'chunksize', 'comment', 'coordinates', 'dtype', 'long_name', 'missing_value', 'shape', 'standard_name', 'units', 'valid_max', 'valid_min', 'valid_range']\u001b[0m\n", + "['dtype']\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m\n", "Done.\u001b[0m\n", "\u001b[0m\u001b[0m" From 7992a4c058afec5b2df690fdfa1e9ef1ba959c09 Mon Sep 17 00:00:00 2001 From: danielfromearth Date: Thu, 12 Dec 2024 16:26:39 -0500 Subject: [PATCH 3/6] fix inadvertent hard-coding of a single attribute --- ncompare/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncompare/core.py b/ncompare/core.py index 626dd90..2ee559f 100644 --- a/ncompare/core.py +++ b/ncompare/core.py @@ -497,7 +497,7 @@ def _var_attribute_side_by_side(attribute_name, attribute_a, attribute_b): ) num_attribute_diffs[diff_condition] += 1 if diff_condition in ("left", "right", "both"): - num_attribute_diffs["difference_types"].add("dtype") + num_attribute_diffs["difference_types"].add(attribute_name) _var_attribute_side_by_side("dtype", v_a.dtype, v_b.dtype) _var_attribute_side_by_side("dimensions", v_a.dimensions, v_b.dimensions) From dba38b4102cf3e07d00cffe30b527051ebab3990 Mon Sep 17 00:00:00 2001 From: danielfromearth Date: Thu, 12 Dec 2024 16:27:16 -0500 Subject: [PATCH 4/6] update example notebook --- docs/example/ncompare-example-usage.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/example/ncompare-example-usage.ipynb b/docs/example/ncompare-example-usage.ipynb index d9f1644..bfdc285 100644 --- a/docs/example/ncompare-example-usage.ipynb +++ b/docs/example/ncompare-example-usage.ipynb @@ -356,7 +356,7 @@ "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", "Differences were found in these attributes:\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "['dtype']\u001b[0m\n", + "['dimensions', 'dtype', 'shape']\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m\n", "Done.\u001b[0m\n", "\u001b[0m\u001b[0m" @@ -540,7 +540,7 @@ "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", "Differences were found in these attributes:\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m\u001b[94m\n", - "['dtype']\u001b[0m\n", + "['_FillValue', 'axis', 'bounds', 'calendar', 'cell_method', 'cell_methods', 'chunksize', 'comment', 'coordinates', 'dimensions', 'dtype', 'long_name', 'missing_value', 'shape', 'standard_name', 'units', 'valid_max', 'valid_min', 'valid_range']\u001b[0m\n", "\u001b[0m\u001b[37m\u001b[0m\n", "Done.\u001b[0m\n", "\u001b[0m\u001b[0m" From a64ba3d6ea84c4d18b036f11e898f8f17ae85869 Mon Sep 17 00:00:00 2001 From: danielfromearth Date: Thu, 12 Dec 2024 16:30:09 -0500 Subject: [PATCH 5/6] update golden files --- tests/data/a-b_test_golden_file.csv | 17 ++++++++++++++--- tests/data/a-b_test_golden_file.txt | 17 ++++++++++++++--- tests/data/a-b_test_golden_file.xlsx | Bin 7328 -> 7563 bytes 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/tests/data/a-b_test_golden_file.csv b/tests/data/a-b_test_golden_file.csv index ae0451d..b3bb60a 100644 --- a/tests/data/a-b_test_golden_file.csv +++ b/tests/data/a-b_test_golden_file.csv @@ -13,10 +13,12 @@ num variables in group:,2,2, -,-,-, -----VARIABLE-----:,conditions,conditions, dtype:,int32,int32, +dimensions:,"('conditions',)","('conditions',)", shape:,"(2,)","(2,)", chunksize:,contiguous,contiguous, -----VARIABLE-----:,time,time, dtype:,float64,float64, +dimensions:,"('time',)","('time',)", shape:,"(5,)","(5,)", chunksize:,[512],[512], calendar:,gregorian,gregorian, @@ -29,6 +31,7 @@ num variables in group:,1,1, -,-,-, -----VARIABLE-----:,level,level, dtype:,int32,int32, +dimensions:,"('level',)","('level',)", shape:,"(2,)","(2,)", chunksize:,[1024],[1024], units:,hPa,hPa, @@ -38,11 +41,13 @@ num variables in group:,2,2, -,-,-, -----VARIABLE-----:,lat,lat, dtype:,float32,float32, +dimensions:,"('lat',)","('lat',)", shape:,"(3,)","(2,)",*** chunksize:,contiguous,contiguous, units:,degrees north,degrees north, -----VARIABLE-----:,lon,lon, dtype:,float32,float32, +dimensions:,"('lon',)","('lon',)", shape:,"(4,)","(2,)",*** chunksize:,contiguous,contiguous, units:,degrees east,degrees east, @@ -52,12 +57,14 @@ num variables in group:,1,1, -,-,-, -----VARIABLE-----:,mean_value,, dtype:,float32,,*** +dimensions:,"('time',)",,*** shape:,"(5,)",,*** chunksize:,[1024],,*** coordinates:,time,,*** long_name:,average value for each time,,*** -----VARIABLE-----:,,std_value, dtype:,,float32,*** +dimensions:,,"('time',)",*** shape:,,"(5,)",*** chunksize:,,[1024],*** coordinates:,,time,*** @@ -68,6 +75,7 @@ num variables in group:,1,1, -,-,-, -----VARIABLE-----:,temp,temp, dtype:,float32,float32, +dimensions:,"('time', 'level', 'lat', 'lon')","('time', 'level', 'lat', 'lon')", shape:,"(5, 2, 3, 4)","(5, 2, 2, 2)",*** chunksize:,"[1, 1, 3, 4]","[1, 1, 2, 2]",*** long_name:,temperature,temperature, @@ -78,6 +86,7 @@ num variables in group:,1,1, -,-,-, -----VARIABLE-----:,quality_flag,quality_flag, dtype:,int32,int32, +dimensions:,"('time', 'level', 'lat', 'lon')","('time', 'level', 'lat', 'lon')", shape:,"(5, 2, 3, 4)","(5, 2, 2, 2)",*** chunksize:,"[1, 1, 3, 4]","[1, 1, 2, 2]",*** units:,unitless,unitless, @@ -87,6 +96,7 @@ num variables in group:,0,1,*** -,-,-, -----VARIABLE-----:,,supplemental_flag, dtype:,,int32,*** +dimensions:,,"('time', 'conditions')",*** shape:,,"(5, 2)",*** chunksize:,,"[1, 2]",*** units:,,unitless,*** @@ -96,6 +106,7 @@ num variables in group:,0,1,*** -,-,-, -----VARIABLE-----:,,condition_details, dtype:,,float64,*** +dimensions:,,"('conditions',)",*** shape:,,"(2,)",*** chunksize:,,contiguous,*** -,-,-, @@ -104,7 +115,7 @@ Total # of shared variables:,7,7, Total # of non-shared variables:,1,3, Total # of shared groups:,5,5, Total # of non-shared groups:,0,2, -Total # of shared attributes:,24,24, -Total # of non-shared attributes:,12,19, +Total # of shared attributes:,31,31, +Total # of non-shared attributes:,13,22, Differences were found in these attributes: -"['chunksize', 'coordinates', 'dtype', 'long_name', 'shape', 'units']" +"['chunksize', 'coordinates', 'dimensions', 'dtype', 'long_name', 'shape', 'units']" diff --git a/tests/data/a-b_test_golden_file.txt b/tests/data/a-b_test_golden_file.txt index 6aa6838..a661ee4 100644 --- a/tests/data/a-b_test_golden_file.txt +++ b/tests/data/a-b_test_golden_file.txt @@ -19,10 +19,12 @@ All variables: - ------------------------------------------------ ------------------------------------------------ -----VARIABLE-----: conditions conditions dtype: int32 int32 + dimensions: ('conditions',) ('conditions',) shape: (2,) (2,) chunksize: contiguous contiguous -----VARIABLE-----: time time dtype: float64 float64 + dimensions: ('time',) ('time',) shape: (5,) (5,) chunksize: [512] [512] calendar: gregorian gregorian @@ -35,6 +37,7 @@ All variables: - ------------------------------------------------ ------------------------------------------------ -----VARIABLE-----: level level dtype: int32 int32 + dimensions: ('level',) ('level',) shape: (2,) (2,) chunksize: [1024] [1024] units: hPa hPa @@ -44,11 +47,13 @@ All variables: - ------------------------------------------------ ------------------------------------------------ -----VARIABLE-----: lat lat dtype: float32 float32 + dimensions: ('lat',) ('lat',) shape: (3,) (2,) chunksize: contiguous contiguous units: degrees north degrees north -----VARIABLE-----: lon lon dtype: float32 float32 + dimensions: ('lon',) ('lon',) shape: (4,) (2,) chunksize: contiguous contiguous units: degrees east degrees east @@ -58,12 +63,14 @@ All variables: - ------------------------------------------------ ------------------------------------------------ -----VARIABLE-----: mean_value dtype: float32 + dimensions: ('time',) shape: (5,) chunksize: [1024] coordinates: time long_name: average value for each time -----VARIABLE-----: std_value dtype: float32 + dimensions: ('time',) shape: (5,) chunksize: [1024] coordinates: time @@ -74,6 +81,7 @@ All variables: - ------------------------------------------------ ------------------------------------------------ -----VARIABLE-----: temp temp dtype: float32 float32 + dimensions: ('time', 'level', 'lat', 'lon') ('time', 'level', 'lat', 'lon') shape: (5, 2, 3, 4) (5, 2, 2, 2) chunksize: [1, 1, 3, 4] [1, 1, 2, 2] long_name: temperature temperature @@ -84,6 +92,7 @@ All variables: - ------------------------------------------------ ------------------------------------------------ -----VARIABLE-----: quality_flag quality_flag dtype: int32 int32 + dimensions: ('time', 'level', 'lat', 'lon') ('time', 'level', 'lat', 'lon') shape: (5, 2, 3, 4) (5, 2, 2, 2) chunksize: [1, 1, 3, 4] [1, 1, 2, 2] units: unitless unitless @@ -93,6 +102,7 @@ All variables: - ------------------------------------------------ ------------------------------------------------ -----VARIABLE-----: supplemental_flag dtype: int32 + dimensions: ('time', 'conditions') shape: (5, 2) chunksize: [1, 2] units: unitless @@ -102,6 +112,7 @@ All variables: - ------------------------------------------------ ------------------------------------------------ -----VARIABLE-----: condition_details dtype: float64 + dimensions: ('conditions',) shape: (2,) chunksize: contiguous - ------------------------------------------------ ------------------------------------------------ @@ -110,11 +121,11 @@ All variables: Total # of non-shared variables: 1 3 Total # of shared groups: 5 5 Total # of non-shared groups: 0 2 - Total # of shared attributes: 24 24 - Total # of non-shared attributes: 12 19 + Total # of shared attributes: 31 31 + Total # of non-shared attributes: 13 22 Differences were found in these attributes: -['chunksize', 'coordinates', 'dtype', 'long_name', 'shape', 'units'] +['chunksize', 'coordinates', 'dimensions', 'dtype', 'long_name', 'shape', 'units'] Done. diff --git a/tests/data/a-b_test_golden_file.xlsx b/tests/data/a-b_test_golden_file.xlsx index 8e29abce1427a6280cf59dfc492cd354dc96a0e4..a5426d38783e9afcd5d0393df7f5bf44c1911a8f 100644 GIT binary patch delta 3660 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 delta 3434 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 BZiWB= From 8244a498b943b6ac0eb4101d5467e123f4add5a0 Mon Sep 17 00:00:00 2001 From: danielfromearth Date: Thu, 12 Dec 2024 16:32:11 -0500 Subject: [PATCH 6/6] update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd6c435..8881712 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Categorize counts of differences (including attributes) in a summary ([#276](https://github.com/nasa/ncompare/pull/276)) ([**@danielfromearth**](https://github.com/danielfromearth)) +- Include dimensions in variable attribute comparisons. ([#277](https://github.com/nasa/ncompare/pull/277)) ([**@danielfromearth**](https://github.com/danielfromearth)) ### Changed