diff --git a/src/ozone/ozone.py b/src/ozone/ozone.py index 320f87e..d929ca3 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 @@ -331,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 @@ -569,7 +577,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'