def test_dict(self): self.assertIs(to_scalar({}), UNDEFINED) self.assertIs(to_scalar({'a': 1}), UNDEFINED) self.assertIs(to_scalar({'a': 1, 'b': 2}), UNDEFINED) self.assertEqual(to_scalar({ 'a': 1, 'b': 2 }, stringify=True), "{'a': 1, 'b': 2}")
def extract_point(ds: DatasetLike.TYPE, point: PointLike.TYPE, indexers: DictLike.TYPE = None, tolerance_default: float = 0.01) -> Dict: """ Extract data at the given point location. The returned dict will contain scalar values for all variables for which all dimension have been given in ``indexers``. For the dimensions *lon* and *lat* a nearest neighbour lookup is performed. All other dimensions must mach exact. :param ds: Dataset or dataframe to subset :param point: Geographic point given by longitude and latitude :param indexers: Optional indexers into data array of *var*. The *indexers* is a dictionary or a comma-separated string of key-value pairs that maps the variable's dimension names to constant labels. e.g. "layer=4". :param tolerance_default: The default longitude and latitude tolerance for the nearest neighbour lookup. It will only be used, if it is not possible to deduce the resolution of the dataset. :return: A dict with the scalar values of all variables and the variable names as keys. """ ds = DatasetLike.convert(ds) point = PointLike.convert(point) indexers = DictLike.convert(indexers) or {} lon_lat_indexers = {'lon': point.x, 'lat': point.y} tolerance = _get_tolerance(ds, tolerance_default) variable_values = {} var_names = sorted(ds.data_vars.keys()) for var_name in var_names: if not var_name.endswith('_bnds'): variable = ds.data_vars[var_name] effective_indexers = {} used_dims = {'lat', 'lon'} for dim_name, dim_value in indexers.items(): if dim_name in variable.dims: effective_indexers[dim_name] = dim_value used_dims.add(dim_name) if set(variable.dims) == used_dims: try: lon_lat_data = variable.sel(**effective_indexers) except KeyError: # if there is no exact match for the "additional" dims, skip this variable continue try: point_data = lon_lat_data.sel(method='nearest', tolerance=tolerance, **lon_lat_indexers) except KeyError: # if there is no point within the given tolerance, return an empty dict return {} if not variable_values: variable_values['lat'] = float(point_data.lat) variable_values['lon'] = float(point_data.lon) value = to_scalar(point_data.values, ndigits=3) if value is not UNDEFINED: variable_values[var_name] = value return variable_values
def test_primitives(self): self.assertEqual(to_scalar(3456), 3456) self.assertEqual(to_scalar(34.56789), 34.56789) self.assertEqual(to_scalar(34.56789, ndigits=1), 34.6) self.assertEqual(to_scalar(True), True) self.assertEqual(to_scalar("Oh!"), "Oh!") self.assertEqual(to_scalar("Oh!Oh!", nchars=2), "Oh...") self.assertEqual(to_scalar(None), None)
def test_pandas(self): try: import pandas as pd self.assertIs(to_scalar(pd.Series(np.array([]))), UNDEFINED) self.assertEqual(to_scalar(pd.Series(np.array([234]))), 234) self.assertIs(to_scalar(pd.Series(np.array([234, 567]))), UNDEFINED) self.assertEqual(to_scalar(pd.Series(np.array([234.567]))), 234.567) self.assertEqual( to_scalar(pd.Series(np.array([234.567, 567.234]))), UNDEFINED) self.assertEqual( to_scalar(pd.Series(np.array([234.567])), ndigits=2), 234.57) self.assertEqual(to_scalar(pd.Series(np.array([True]))), True) self.assertIs(to_scalar(pd.Series(np.array([True, False]))), UNDEFINED) self.assertIs(to_scalar(pd.Series([])), UNDEFINED) self.assertEqual(to_scalar(pd.Series(234)), 234) self.assertEqual(to_scalar(pd.Series([234])), 234) self.assertIs(to_scalar(pd.Series([234, 567])), UNDEFINED) self.assertEqual(to_scalar(pd.Series(234.567)), 234.567) self.assertEqual(to_scalar(pd.Series([234.567])), 234.567) self.assertEqual(to_scalar(pd.Series([234.567, 567.234])), UNDEFINED) self.assertEqual(to_scalar(pd.Series([234.567]), ndigits=2), 234.57) self.assertEqual(to_scalar(pd.Series([True])), True) self.assertIs(to_scalar(pd.Series([True, False])), UNDEFINED) except ImportError: pass
def test_xarrays(self): try: import xarray as xr self.assertIs(to_scalar(xr.DataArray(np.array([]))), UNDEFINED) self.assertEqual(to_scalar(xr.DataArray(np.array(234))), 234) self.assertEqual(to_scalar(xr.DataArray(np.array(234))), 234) self.assertEqual(to_scalar(xr.DataArray(np.array([234]))), 234) self.assertEqual(to_scalar(xr.DataArray(np.array([[234]]))), 234) self.assertIs(to_scalar(xr.DataArray(np.array([234, 567]))), UNDEFINED) self.assertIs(to_scalar(xr.DataArray(np.array([[234], [567]]))), UNDEFINED) self.assertEqual(to_scalar(xr.DataArray(np.array(234.567))), 234.567) self.assertEqual(to_scalar(xr.DataArray(np.array([234.567]))), 234.567) self.assertEqual(to_scalar(xr.DataArray(np.array([[234.567]]))), 234.567) self.assertEqual( to_scalar(xr.DataArray(np.array([234.567, 567.234]))), UNDEFINED) self.assertEqual( to_scalar(xr.DataArray(np.array([234.567])), ndigits=2), 234.57) self.assertEqual(to_scalar(xr.DataArray(np.array(True))), True) self.assertEqual(to_scalar(xr.DataArray(np.array([True]))), True) self.assertIs(to_scalar(xr.DataArray(np.array([True, False]))), UNDEFINED) self.assertIs(to_scalar(xr.DataArray(np.array([[True], [False]]))), UNDEFINED) except ImportError: pass
def test_ndarrays(self): self.assertIs(to_scalar(np.array([])), UNDEFINED) self.assertEqual(to_scalar(np.array(234)), 234) self.assertEqual(to_scalar(np.array([234])), 234) self.assertEqual(to_scalar(np.array([[234]])), 234) self.assertIs(to_scalar(np.array([234, 567])), UNDEFINED) self.assertIs(to_scalar(np.array([[234], [567]])), UNDEFINED) self.assertEqual(to_scalar(np.array([234.567])), 234.567) self.assertEqual(to_scalar(np.array(234.567)), 234.567) self.assertEqual(to_scalar(np.array([[234.567]])), 234.567) self.assertEqual(to_scalar(np.array([234.567, 567.234])), UNDEFINED) self.assertEqual(to_scalar(np.array([234.567]), ndigits=2), 234.57) self.assertEqual(to_scalar(np.array(True)), True) self.assertEqual(to_scalar(np.array([True])), True) self.assertIs(to_scalar(np.array([True, False])), UNDEFINED) self.assertIs(to_scalar(np.array([[True], [False]])), UNDEFINED) self.assertIs(to_scalar(np.array([None])), UNDEFINED)
def test_list(self): self.assertIs(to_scalar([]), UNDEFINED) self.assertEqual(to_scalar([1]), UNDEFINED) self.assertIs(to_scalar([1, 2, 3]), UNDEFINED) self.assertEqual(to_scalar(["Oh!"]), UNDEFINED) self.assertEqual(to_scalar([1, 2, 3], stringify=True), '[1, 2, 3]')
def test_pandas(self): try: import pandas as pd self.assertIs(to_scalar(pd.Series(np.array([]))), UNDEFINED) self.assertEqual(to_scalar(pd.Series(np.array([234]))), 234) self.assertIs(to_scalar(pd.Series(np.array([234, 567]))), UNDEFINED) self.assertEqual(to_scalar(pd.Series(np.array([234.567]))), 234.567) self.assertEqual(to_scalar(pd.Series(np.array([234.567, 567.234]))), UNDEFINED) self.assertEqual(to_scalar(pd.Series(np.array([234.567])), ndigits=2), 234.57) self.assertEqual(to_scalar(pd.Series(np.array([True]))), True) self.assertIs(to_scalar(pd.Series(np.array([True, False]))), UNDEFINED) self.assertIs(to_scalar(pd.Series([])), UNDEFINED) self.assertEqual(to_scalar(pd.Series(234)), 234) self.assertEqual(to_scalar(pd.Series([234])), 234) self.assertIs(to_scalar(pd.Series([234, 567])), UNDEFINED) self.assertEqual(to_scalar(pd.Series(234.567)), 234.567) self.assertEqual(to_scalar(pd.Series([234.567])), 234.567) self.assertEqual(to_scalar(pd.Series([234.567, 567.234])), UNDEFINED) self.assertEqual(to_scalar(pd.Series([234.567]), ndigits=2), 234.57) self.assertEqual(to_scalar(pd.Series([True])), True) self.assertIs(to_scalar(pd.Series([True, False])), UNDEFINED) except ImportError: pass
def test_xarrays(self): try: import xarray as xr self.assertIs(to_scalar(xr.DataArray(np.array([]))), UNDEFINED) self.assertEqual(to_scalar(xr.DataArray(np.array(234))), 234) self.assertEqual(to_scalar(xr.DataArray(np.array(234))), 234) self.assertEqual(to_scalar(xr.DataArray(np.array([234]))), 234) self.assertEqual(to_scalar(xr.DataArray(np.array([[234]]))), 234) self.assertIs(to_scalar(xr.DataArray(np.array([234, 567]))), UNDEFINED) self.assertIs(to_scalar(xr.DataArray(np.array([[234], [567]]))), UNDEFINED) self.assertEqual(to_scalar(xr.DataArray(np.array(234.567))), 234.567) self.assertEqual(to_scalar(xr.DataArray(np.array([234.567]))), 234.567) self.assertEqual(to_scalar(xr.DataArray(np.array([[234.567]]))), 234.567) self.assertEqual(to_scalar(xr.DataArray(np.array([234.567, 567.234]))), UNDEFINED) self.assertEqual(to_scalar(xr.DataArray(np.array([234.567])), ndigits=2), 234.57) self.assertEqual(to_scalar(xr.DataArray(np.array(True))), True) self.assertEqual(to_scalar(xr.DataArray(np.array([True]))), True) self.assertIs(to_scalar(xr.DataArray(np.array([True, False]))), UNDEFINED) self.assertIs(to_scalar(xr.DataArray(np.array([[True], [False]]))), UNDEFINED) except ImportError: pass
def test_dict(self): self.assertIs(to_scalar({}), UNDEFINED) self.assertIs(to_scalar({'a': 1}), UNDEFINED) self.assertIs(to_scalar({'a': 1, 'b': 2}), UNDEFINED) self.assertEqual(to_scalar({'a': 1, 'b': 2}, stringify=True), "{'a': 1, 'b': 2}")