From 4e53b54332ae55e1a086304a24d54a333bf41386 Mon Sep 17 00:00:00 2001 From: Nuclear03020704 <52926983+lahdjirayhan@users.noreply.github.com> Date: Sat, 23 Apr 2022 08:29:15 +0700 Subject: [PATCH 1/3] fix: Add helper method to convert into float, or numpy.nan if fails --- src/ozone/ozone.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/ozone/ozone.py b/src/ozone/ozone.py index 320f87e..e9ee5b2 100644 --- a/src/ozone/ozone.py +++ b/src/ozone/ozone.py @@ -31,6 +31,16 @@ RATE_LIMIT: int = 1 +def as_float(x: Any) -> float: + """Convert x into a float. If unable, convert into numpy.nan instead. + + Naming and functionality inspired by R function as.numeric()""" + try: + return float(x) + except (TypeError, ValueError): + return numpy.nan + + class Ozone: """Primary class for Ozone API @@ -196,14 +206,14 @@ def _extract_live_data( try: if param == "aqi": # This is in different part of JSON object. - row["aqi"] = float(data_obj["aqi"]) + row["aqi"] = as_float(data_obj["aqi"]) # This adds AQI_meaning and AQI_health_implications data ( row["AQI_meaning"], row["AQI_health_implications"], - ) = self._AQI_meaning(float(data_obj["aqi"])) + ) = self._AQI_meaning(as_float(data_obj["aqi"])) else: - row[param] = float(data_obj["iaqi"][param]["v"]) + row[param] = as_float(data_obj["iaqi"][param]["v"]) except KeyError: # Gets triggered if the parameter is not provided by station. row[param] = numpy.nan @@ -569,7 +579,7 @@ def get_specific_parameter( row = self._extract_live_data(data_obj, [air_param]) try: - result = float(row[air_param]) + result = as_float(row[air_param]) except KeyError: raise Exception( f'Missing air quality parameter "{air_param}"\n' From bb34bd285170fffda1ea9383003b0dfab6fdce58 Mon Sep 17 00:00:00 2001 From: Nuclear03020704 <52926983+lahdjirayhan@users.noreply.github.com> Date: Sat, 23 Apr 2022 08:38:15 +0700 Subject: [PATCH 2/3] fix: Return invalid description instead of raising exception This will allow for invalid AQIs (e.g., np.nan) to be passed without raising exception. This can better handle cases where WAQI data is out of bound. I've personally seen cases of AQI values '999' and '-'. --- src/ozone/ozone.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ozone/ozone.py b/src/ozone/ozone.py index e9ee5b2..18323f0 100644 --- a/src/ozone/ozone.py +++ b/src/ozone/ozone.py @@ -341,10 +341,8 @@ def _AQI_meaning(self, aqi: float) -> Tuple[str, str]: "Health alert: everyone may experience more serious health effects." ) else: - raise Exception( - f"{aqi} is not valid air quality index value. " - "Should be between 0 to 500." - ) + AQI_meaning = "Invalid AQI value" + AQI_health_implications = "Invalid AQI value" return AQI_meaning, AQI_health_implications From 1873323def0762a2085fc14999593849bf58f70b Mon Sep 17 00:00:00 2001 From: Nuclear03020704 <52926983+lahdjirayhan@users.noreply.github.com> Date: Sat, 23 Apr 2022 16:50:05 +0700 Subject: [PATCH 3/3] fix: Make _as_float private --- src/ozone/ozone.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ozone/ozone.py b/src/ozone/ozone.py index 18323f0..d929ca3 100644 --- a/src/ozone/ozone.py +++ b/src/ozone/ozone.py @@ -31,7 +31,7 @@ RATE_LIMIT: int = 1 -def as_float(x: Any) -> float: +def _as_float(x: Any) -> float: """Convert x into a float. If unable, convert into numpy.nan instead. Naming and functionality inspired by R function as.numeric()""" @@ -206,14 +206,14 @@ def _extract_live_data( try: if param == "aqi": # This is in different part of JSON object. - row["aqi"] = as_float(data_obj["aqi"]) + row["aqi"] = _as_float(data_obj["aqi"]) # This adds AQI_meaning and AQI_health_implications data ( row["AQI_meaning"], row["AQI_health_implications"], - ) = self._AQI_meaning(as_float(data_obj["aqi"])) + ) = self._AQI_meaning(_as_float(data_obj["aqi"])) else: - row[param] = as_float(data_obj["iaqi"][param]["v"]) + row[param] = _as_float(data_obj["iaqi"][param]["v"]) except KeyError: # Gets triggered if the parameter is not provided by station. row[param] = numpy.nan @@ -577,7 +577,7 @@ def get_specific_parameter( row = self._extract_live_data(data_obj, [air_param]) try: - result = as_float(row[air_param]) + result = _as_float(row[air_param]) except KeyError: raise Exception( f'Missing air quality parameter "{air_param}"\n'