Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Breaking Change]: Remove save file func #159

Merged
merged 10 commits into from
May 25, 2022
61 changes: 8 additions & 53 deletions src/ozone/ozone.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,21 +126,16 @@ def reset_token(self, token: str) -> None:
self.token = token
self._check_token_validity()

def _extract_live_data(
self, data_obj: Any, params: List[str] = [""]
) -> Dict[str, Union[str, float]]:
def _extract_live_data(self, data_obj: Any) -> Dict[str, Union[str, float]]:
"""Extract live AQI data from API response's 'data' part.

Args:
data_obj (JSON object returned by json.loads): The 'data' part from
the API's response.
params (List[str]): The parameters to parse.

Returns:
dict: Dictionary containing the data.
"""
if params == [""]:
params = self._default_params

# This dict will become a single row of data for the dataframe.
row: Dict[str, Union[str, float]] = {}
Expand All @@ -157,7 +152,7 @@ def _extract_live_data(
row["timestamp"] = data_obj["time"]["s"]
row["timestamp_timezone"] = data_obj["time"]["tz"]

for param in params:
for param in self._default_params:
try:
if param == "aqi":
# This is in different part of JSON object.
Expand Down Expand Up @@ -349,7 +344,6 @@ def get_coordinate_air(
lat: float,
lon: float,
df: pandas.DataFrame = pandas.DataFrame(),
params: List[str] = [""],
) -> pandas.DataFrame:
"""Get a location's air quality data by latitude and longitude

Expand All @@ -358,55 +352,38 @@ def get_coordinate_air(
lon (float): Longitude
df (pandas.DataFrame, optional): An existing dataframe to
append the data to.
params (List[str], optional): A list of parameters to get data for.
Choose from the following values:
["aqi", "pm2.5", "pm10", "o3", "co", "no2", "so2", "dew", "h",
"p", "t", "w", "wg"]
Gets all parameters by default.

Returns:
pandas.DataFrame: The dataframe containing the data.
"""
if params == [""]:
params = self._default_params

r = self._make_api_request(
f"{self._search_aqi_url}/geo:{lat};{lon}/?token={self.token}"
)
data_obj = self._check_and_get_data_obj(r)

row = self._extract_live_data(data_obj, params=params)
row = self._extract_live_data(data_obj)
df = pandas.concat([df, pandas.DataFrame([row])], ignore_index=True)
return df

def get_city_air(
self,
city: str,
df: pandas.DataFrame = pandas.DataFrame(),
params: List[str] = [""],
) -> pandas.DataFrame:
"""Get a city's air quality data

Args:
city (str): The city to get data for.
df (pandas.DataFrame, optional): An existing dataframe to
append the data to.
params (List[str], optional): A list of parameters to get data for.
Choose from the following values:
["aqi", "pm2.5", "pm10", "o3", "co", "no2", "so2", "dew", "h",
"p", "t", "w", "wg"]
Gets all parameters by default.

Returns:
pandas.DataFrame: The dataframe containing the data.
"""
if params == [""]:
params = self._default_params

r = self._make_api_request(f"{self._search_aqi_url}/{city}/?token={self.token}")
data_obj = self._check_and_get_data_obj(r, city=city) # City is for traceback

row = self._extract_live_data(data_obj, params=params)
row = self._extract_live_data(data_obj)
row["city"] = city

df = pandas.concat([df, pandas.DataFrame([row])], ignore_index=True)
Expand All @@ -416,19 +393,13 @@ def get_multiple_coordinate_air(
self,
locations: List[Tuple],
df: pandas.DataFrame = pandas.DataFrame(),
params: List[str] = [""],
) -> pandas.DataFrame:
"""Get multiple locations air quality data

Args:
locations (list): A list of pair (latitude,longitude) to get data for.
df (pandas.DataFrame, optional): An existing dataframe to
append the data to.
params (List[str], optional): A list of parameters to get data for.
Choose from the following values:
["aqi", "pm2.5", "pm10", "o3", "co", "no2", "so2", "dew", "h",
"p", "t", "w", "wg"]
Gets all parameters by default..

Returns:
pandas.DataFrame: The dataframe containing the data.
Expand All @@ -437,9 +408,7 @@ def get_multiple_coordinate_air(
try:
# This just makes sure that it's always a returns a pandas.DataFrame.
# Makes mypy happy.
df = pandas.DataFrame(
self.get_coordinate_air(loc[0], loc[1], df=df, params=params)
)
df = pandas.DataFrame(self.get_coordinate_air(loc[0], loc[1], df=df))
except Exception:
# NOTE: If we have custom exception we can catch it instead.
empty_row = pandas.DataFrame(
Expand All @@ -455,7 +424,6 @@ def get_range_coordinates_air(
lower_bound: Tuple[float, float],
upper_bound: Tuple[float, float],
df: pandas.DataFrame = pandas.DataFrame(),
params: List[str] = [""],
) -> pandas.DataFrame:
"""Get air quality data for range of coordinates between lower_bound and upper_bound

Expand All @@ -464,35 +432,24 @@ def get_range_coordinates_air(
upper_bound (tuple): end coordinate
df (pandas.DataFrame, optional): An existing dataframe to
append the data to.
params (List[str], optional): A list of parameters to get data for.
Choose from the following values:
["aqi", "pm2.5", "pm10", "o3", "co", "no2", "so2", "dew", "h",
"p", "t", "w", "wg"]
Gets all parameters by default.

Returns:
pandas.DataFrame: The dataframe containing the data.
"""
locations = self._locate_all_coordinates(
lower_bound=lower_bound, upper_bound=upper_bound
)
return self.get_multiple_coordinate_air(locations, df=df, params=params)
return self.get_multiple_coordinate_air(locations, df=df)

def get_multiple_city_air(
self,
cities: List[str],
df: pandas.DataFrame = pandas.DataFrame(),
params: List[str] = [""],
) -> pandas.DataFrame:
"""Get multiple cities' air quality data

Args:
cities (list): A list of cities to get data for.
params (List[str], optional): A list of parameters to get data for.
Choose from the following values:
["aqi", "pm2.5", "pm10", "o3", "co", "no2", "so2", "dew", "h",
"p", "t", "w", "wg"]
Gets all parameters by default.
df (pandas.DataFrame, optional): An existing dataframe to
append the data to.

Expand All @@ -503,9 +460,7 @@ def get_multiple_city_air(
try:
# This just makes sure that it's always a returns a pandas.DataFrame.
# Makes mypy happy.
df = pandas.DataFrame(
self.get_city_air(city=city, df=df, params=params)
)
df = pandas.DataFrame(self.get_city_air(city=city, df=df))
except Exception:
# NOTE: If we have custom exception we can catch it instead.
empty_row = pandas.DataFrame({"city": [city]})
Expand Down Expand Up @@ -535,7 +490,7 @@ def get_specific_parameter(
r = self._make_api_request(f"{self._search_aqi_url}/{city}/?token={self.token}")
data_obj = self._check_and_get_data_obj(r)

row = self._extract_live_data(data_obj, [air_param])
row = self._extract_live_data(data_obj)

try:
result = _as_float(row[air_param])
Expand Down
76 changes: 0 additions & 76 deletions tests/cassettes/test_get_city_air/test_excluded_params.yaml

This file was deleted.

This file was deleted.

Loading