Skip to content

Commit

Permalink
support product as a reducer over time
Browse files Browse the repository at this point in the history
  • Loading branch information
jdries committed Dec 1, 2021
1 parent 35fcd9c commit 7120656
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 2 deletions.
6 changes: 4 additions & 2 deletions openeogeotrellis/geopysparkdatacube.py
Expand Up @@ -253,7 +253,7 @@ def apply_dimension(self, process, dimension: str, target_dimension: str = None,

def reduce(self, reducer: str, dimension: str) -> 'GeopysparkDataCube':
# TODO: rename this to reduce_temporal (because it only supports temporal reduce)?
from .numpy_aggregators import var_composite, std_composite, min_composite, max_composite, sum_composite, median_composite
from .numpy_aggregators import var_composite, std_composite, min_composite, max_composite, sum_composite, median_composite, product_composite

reducer = self._normalize_temporal_reducer(dimension, reducer)

Expand All @@ -267,6 +267,8 @@ def reduce(self, reducer: str, dimension: str) -> 'GeopysparkDataCube':
return self._aggregate_over_time_numpy(max_composite)
elif reducer == 'Sum':
return self._aggregate_over_time_numpy(sum_composite)
elif reducer == 'Product':
return self._aggregate_over_time_numpy(product_composite)
elif reducer == 'Median':
return self._aggregate_over_time_numpy(median_composite)
else:
Expand Down Expand Up @@ -298,7 +300,7 @@ def _apply_bands_dimension(self,pgVisitor):
def _normalize_temporal_reducer(self, dimension: str, reducer: str) -> str:
if dimension != self.metadata.temporal_dimension.name:
raise FeatureUnsupportedException('Reduce on dimension {d!r} not supported'.format(d=dimension))
if reducer.upper() in ["MIN", "MAX", "SUM", "MEAN", "VARIANCE", "MEDIAN", "FIRST", "LAST"]:
if reducer.upper() in ["MIN", "MAX", "SUM", "MEAN", "VARIANCE", "MEDIAN", "FIRST", "LAST", "PRODUCT"]:
reducer = reducer.lower().capitalize()
elif reducer.upper() == "SD":
reducer = "StandardDeviation"
Expand Down
6 changes: 6 additions & 0 deletions openeogeotrellis/numpy_aggregators.py
Expand Up @@ -18,6 +18,12 @@ def fadd(a_cells, b_cells):
return composite(fadd, tiles) # ignores NaN (<=> add)


def product_composite(tiles: Iterable[gps.Tile]):
def fadd(a_cells, b_cells):
return np.multiply(np.nan_to_num(a_cells), np.nan_to_num(b_cells))

return composite(fadd, tiles) # ignores NaN

def var_composite(tiles: Iterable[gps.Tile]) -> gps.Tile:
cube = np.array([tile.cells for tile in tiles])
reduced = np.nanvar(cube, axis=0) # ignores NaN (<=> var)
Expand Down

0 comments on commit 7120656

Please sign in to comment.