예제 #1
0
파일: test_misc.py 프로젝트: whigg/cate
 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}")
예제 #2
0
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
예제 #3
0
파일: test_misc.py 프로젝트: whigg/cate
 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)
예제 #4
0
 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)
예제 #5
0
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
예제 #6
0
파일: test_misc.py 프로젝트: whigg/cate
    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
예제 #7
0
파일: test_misc.py 프로젝트: whigg/cate
 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
예제 #8
0
파일: test_misc.py 프로젝트: whigg/cate
 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)
예제 #9
0
파일: test_misc.py 프로젝트: whigg/cate
 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]')
예제 #10
0
    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
예제 #11
0
 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
예제 #12
0
 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)
예제 #13
0
 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}")
예제 #14
0
 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]')