def aggregate_ungridded(self, kernel): """ Performs aggregation for ungridded data by first generating a new grid, converting it into a cube, then collocating using the appropriate kernel and a cube cell constraint """ new_cube_coords = [] new_cube_shape = [] i = 0 for coord in self.data.coords(): grid, guessed_axis = self.get_grid(coord) if grid is None: new_coord = self._make_fully_collapsed_coord(coord) if grid is not None and isnan(grid.delta): # Issue a warning and then still collapse fully logging.warning('Coordinate ' + guessed_axis + ' was given without a grid. No need to specify ' 'coordinates for complete collapse, all coordinates without a grid specified are ' 'automatically collapsed for ungridded aggregation.') new_coord = self._make_fully_collapsed_coord(coord) if grid is not None and not isnan(grid.delta): new_coord = self._make_partially_collapsed_coord(coord, grid, guessed_axis) new_cube_coords.append((new_coord, i)) new_cube_shape.append(len(new_coord.points)) i += 1 if len(self._grid) != 0: raise CoordinateNotFoundError('No coordinate found that matches {}. Please check the coordinate ' 'name.'.format(self._grid.keys())) dummy_data = numpy.reshape(numpy.arange(int(numpy.prod(new_cube_shape))) + 1.0, tuple(new_cube_shape)) aggregation_cube = iris.cube.Cube(dummy_data, dim_coords_and_dims=new_cube_coords) collocator = GeneralGriddedCollocator() constraint = BinnedCubeCellOnlyConstraint() aggregated_cube = collocator.collocate(aggregation_cube, self.data, constraint, kernel) self._add_max_min_bounds_for_collapsed_coords(aggregated_cube, self.data) # We need to rename any variables which clash with coordinate names otherwise they will not output correctly, we # prepend it with 'aggregated_' to make it clear which variable has been aggregated (the original coordinate # value will not have been.) for idx, d in enumerate(aggregated_cube): if d.var_name in [coord.var_name for coord in aggregation_cube.coords()]: new_name = "aggregated_" + d.var_name aggregated_cube[idx].rename(new_name) aggregated_cube[idx].var_name = new_name logging.warning("Variable {} clashes with a coordinate variable name and has been renamed to: {}" .format(d.var_name, new_name)) return aggregated_cube
def aggregate_gridded(self, kernel): # Make sure all coordinate have bounds - important for weighting and aggregating # Only try and guess bounds on Dim Coords for coord in self.data.coords(dim_coords=True): if not coord.has_bounds() and len(coord.points) > 1: coord.guess_bounds() logging.warning("Creating guessed bounds as none exist in file") new_coord_number = self.data.coord_dims(coord) self.data.remove_coord(coord.name()) self.data.add_dim_coord(coord, new_coord_number) coords = [] for coord in self.data.coords(): grid, guessed_axis = self.get_grid(coord) if grid is not None: if isnan(grid.delta): logging.info('Aggregating on ' + coord.name() + ', collapsing completely and using ' + kernel.cell_method + ' kernel.') coords.append(coord) else: raise NotImplementedError("Aggregation using partial collapse of " "coordinates is not supported for GriddedData") output = GriddedDataList([]) if isinstance(kernel, MultiKernel): for sub_kernel in kernel.sub_kernels: sub_kernel_out = self._gridded_full_collapse(coords, sub_kernel) output.append_or_extend(sub_kernel_out) else: output.append_or_extend(self._gridded_full_collapse(coords, kernel)) return output