diff --git a/app.py b/app.py index 477e1f8..3182486 100644 --- a/app.py +++ b/app.py @@ -260,9 +260,11 @@ def minimal_csv() -> Response: @app.route(f"{base_path}/graph/monthly_averages") @swag_from(monthly_averages_specs.route_specs) def monthly_averages() -> Response: - params: tuple = parse_args(request.args, param.file_name) + params: tuple = parse_args( + request.args, param.file_name, param.begin_year, param.end_year + ) - all_rainfall.bar_rainfall_averages() + all_rainfall.bar_rainfall_averages(begin_year=params[1], end_year=params[2]) plt.savefig(params[0], format="svg") plt.close() @@ -274,7 +276,9 @@ def monthly_averages() -> Response: def seasonal_averages() -> Response: params: tuple = parse_args(request.args, param.file_name) - all_rainfall.bar_rainfall_averages(monthly=False) + all_rainfall.bar_rainfall_averages( + monthly=False, begin_year=params[1], end_year=params[2] + ) plt.savefig(params[0], format="svg") plt.close() diff --git a/src/api/swagger/graph/monthly_averages_specs.py b/src/api/swagger/graph/monthly_averages_specs.py index 6deea43..75ea077 100644 --- a/src/api/swagger/graph/monthly_averages_specs.py +++ b/src/api/swagger/graph/monthly_averages_specs.py @@ -17,6 +17,10 @@ "content": MediaType.IMG_SVG, }, }, - "parameters": [param.file_name], + "parameters": [ + param.file_name, + param.begin_year, + param.end_year, + ], "produces": MediaType.IMG_SVG, } diff --git a/src/api/swagger/graph/seasonal_averages_specs.py b/src/api/swagger/graph/seasonal_averages_specs.py index bf817ec..8d2c3c4 100644 --- a/src/api/swagger/graph/seasonal_averages_specs.py +++ b/src/api/swagger/graph/seasonal_averages_specs.py @@ -17,6 +17,10 @@ "content": MediaType.IMG_SVG, }, }, - "parameters": [param.file_name], + "parameters": [ + param.file_name, + param.begin_year, + param.end_year, + ], "produces": MediaType.IMG_SVG, } diff --git a/src/core/models/all_rainfall.py b/src/core/models/all_rainfall.py index 7c5f197..462a872 100644 --- a/src/core/models/all_rainfall.py +++ b/src/core/models/all_rainfall.py @@ -320,7 +320,12 @@ def get_last_year(self) -> int: return self.yearly_rainfall.get_last_year() - def bar_rainfall_averages(self, monthly: bool | None = True) -> list: + def bar_rainfall_averages( + self, + monthly: bool | None = True, + begin_year: int | None = None, + end_year: int | None = None, + ) -> list: """ Plots a bar graphic displaying average rainfall for each month or each season. @@ -328,11 +333,15 @@ def bar_rainfall_averages(self, monthly: bool | None = True) -> list: if False, plots seasonal rainfall averages. :return: A list of the Rainfall averages for each month or season. """ - label: str = f"Average rainfall (mm) between {self.starting_year} and {self.get_last_year()}" + label: str = f"Average rainfall (mm) between {begin_year or self.starting_year} and {self.get_last_year()}" if monthly: - return plotting.bar_monthly_rainfall_averages(self.monthly_rainfalls, label) + return plotting.bar_monthly_rainfall_averages( + self.monthly_rainfalls, label, begin_year, end_year + ) - return plotting.bar_seasonal_rainfall_averages(self.seasonal_rainfalls, label) + return plotting.bar_seasonal_rainfall_averages( + self.seasonal_rainfalls, label, begin_year, end_year + ) def bar_rainfall_linreg_slopes(self, monthly: bool | None = True) -> list: """ diff --git a/src/core/utils/functions/plotting.py b/src/core/utils/functions/plotting.py index ac517b9..e4cd183 100644 --- a/src/core/utils/functions/plotting.py +++ b/src/core/utils/functions/plotting.py @@ -87,7 +87,10 @@ def bar_column_according_to_year(yearly_rainfall: pd.DataFrame, label: Label) -> def bar_monthly_rainfall_averages( - monthly_rainfalls: dict, label: str | None = "Average rainfall (mm)" + monthly_rainfalls: dict, + label: str | None = "Average rainfall (mm)", + begin_year: int | None = None, + end_year: int | None = None, ) -> list: """ Plots a bar graphic displaying average rainfall for each month passed through the dict. @@ -95,12 +98,20 @@ def bar_monthly_rainfall_averages( :param monthly_rainfalls: A list of instances of MonthlyRainfall. To be purposeful, all instances should have the same time frame in years. :param label: A string to use as a label for bar graphic. (optional) + :param begin_year: An integer representing the year + to start getting our rainfall values (optional). + :param end_year: An integer representing the year + to end getting our rainfall values (optional). :return: A list of the Rainfall averages for each month. """ month_labels, averages = [], [] for monthly_rainfall in monthly_rainfalls.values(): month_labels.append(monthly_rainfall.month.name[:3]) - averages.append(monthly_rainfall.get_average_yearly_rainfall()) + averages.append( + monthly_rainfall.get_average_yearly_rainfall( + begin_year=begin_year, end_year=end_year + ) + ) plt.bar(month_labels, averages, label=label) plt.legend() @@ -128,7 +139,10 @@ def bar_monthly_rainfall_linreg_slopes(monthly_rainfalls: dict) -> list: def bar_seasonal_rainfall_averages( - seasonal_rainfalls: dict, label: str | None = "Average rainfall (mm)" + seasonal_rainfalls: dict, + label: str | None = "Average rainfall (mm)", + begin_year: int | None = None, + end_year: int | None = None, ) -> list: """ Plots a bar graphic displaying average rainfall for each season passed through the dict. @@ -136,12 +150,20 @@ def bar_seasonal_rainfall_averages( :param seasonal_rainfalls: A list of instances of SeasonalRainfall. To be purposeful, all instances should have the same time frame in years. :param label: A string to use as a label for bar graphic. (optional) + :param begin_year: An integer representing the year + to start getting our rainfall values (optional). + :param end_year: An integer representing the year + to end getting our rainfall values (optional). :return: A list of the Rainfall averages for each season. """ season_labels, averages = [], [] for seasonal_rainfall in seasonal_rainfalls.values(): season_labels.append(seasonal_rainfall.season.name) - averages.append(seasonal_rainfall.get_average_yearly_rainfall()) + averages.append( + seasonal_rainfall.get_average_yearly_rainfall( + begin_year=begin_year, end_year=end_year + ) + ) plt.bar(season_labels, averages, label=label) plt.legend()