Skip to content

Commit 6b3df9d

Browse files
committed
feat[DEI-263]: two separate functions for handling grouping and aggregation
1 parent 0b18e99 commit 6b3df9d

1 file changed

Lines changed: 38 additions & 12 deletions

File tree

decoimpact/business/entities/rules/time_aggregation_rule.py

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -116,21 +116,14 @@ def execute(self, value_array: _xr.DataArray, logger: ILogger) -> _xr.DataArray:
116116

117117
# perform aggregations in case of multi-year monthly average
118118
if TimeOperationType.MULTI_YEAR_MONTHLY_AVERAGE == settings.operation_type:
119-
filtered_values = self.filter_years(time_dim_name, value_array)
120-
grouped_values = filtered_values.groupby(f"{time_dim_name}.month")
121-
result = self._perform_grouping_operation(grouped_values)
122-
# create a new aggregated time dimension based on original time dimension
123-
result_time_dim_name = f"{time_dim_name}_monthly"
124-
result = result.rename({"month": result_time_dim_name})
119+
result, result_time_dim_name = self._handle_grouping_operation(
120+
time_dim_name, value_array
121+
)
125122
# perform the operation in case of other operation types
126123
else:
127-
aggregated_values = value_array.resample(
128-
{time_dim_name: dim_name}, skipna=True
124+
result, result_time_dim_name = self._handle_aggregation_operation(
125+
settings, dim_name, time_dim_name, value_array
129126
)
130-
# create a new aggregated time dimension based on original time dimension
131-
result = self._perform_operation(aggregated_values, settings.operation_type)
132-
result_time_dim_name = f"{time_dim_name}_{settings.time_scale}"
133-
result = result.rename({time_dim_name: result_time_dim_name})
134127

135128
for key, value in value_array[time_dim_name].attrs.items():
136129
if value:
@@ -144,6 +137,39 @@ def execute(self, value_array: _xr.DataArray, logger: ILogger) -> _xr.DataArray:
144137

145138
return result
146139

140+
def _handle_grouping_operation(
141+
self,
142+
time_dim_name: str,
143+
value_array: _xr.DataArray,
144+
) -> tuple[_xr.DataArray, str]:
145+
"""Handles the grouping operation for multi-year monthly average"""
146+
filtered_values = self.filter_years(time_dim_name, value_array)
147+
grouped_values = filtered_values.groupby(f"{time_dim_name}.month")
148+
grouping_result = self._perform_grouping_operation(grouped_values)
149+
# create a new aggregated time dimension based on original time dimension
150+
_result_time_dim_name = f"{time_dim_name}_monthly"
151+
grouping_result = grouping_result.rename({"month": _result_time_dim_name})
152+
return grouping_result, _result_time_dim_name
153+
154+
def _handle_aggregation_operation(
155+
self,
156+
settings: TimeOperationSettings,
157+
dim_name: str,
158+
time_dim_name: str,
159+
value_array: _xr.DataArray,
160+
) -> tuple[_xr.DataArray, str]:
161+
"""Handles the aggregation operation for other operation types"""
162+
aggregated_values = value_array.resample({time_dim_name: dim_name}, skipna=True)
163+
# create a new aggregated time dimension based on original time dimension
164+
aggregation_result = self._perform_operation(
165+
aggregated_values, settings.operation_type
166+
)
167+
_result_time_dim_name = f"{time_dim_name}_{settings.time_scale}"
168+
aggregation_result = aggregation_result.rename(
169+
{time_dim_name: _result_time_dim_name}
170+
)
171+
return aggregation_result, _result_time_dim_name
172+
147173
def _perform_grouping_operation(
148174
self,
149175
grouped_values,

0 commit comments

Comments
 (0)