Air_Quality_Index / functions.py
Temesvári Csanád
revert back
174811d
import requests
import os
import pandas as pd
import datetime
import numpy as np
from sklearn.preprocessing import OrdinalEncoder
from dotenv import load_dotenv
load_dotenv()
## TODO: write function to display the color coding of the categoies both in the df and as a guide.
#sg like:
def color_aq(val):
color = 'green' if val else 'red'
return f'background-color: {color}'
# but better
def get_air_quality_data(station_name):
AIR_QUALITY_API_KEY = os.getenv('AIR_QUALITY_API_KEY')
request_value = f'https://api.waqi.info/feed/{station_name}/?token={AIR_QUALITY_API_KEY}'
answer = requests.get(request_value).json()["data"]
forecast = answer['forecast']['daily']
return [
answer["time"]["s"][:10], # Date
int(forecast['pm25'][0]['avg']), # avg predicted pm25
int(forecast['pm10'][0]['avg']), # avg predicted pm10
max(int(forecast['pm25'][0]['avg']), int(forecast['pm10'][0]['avg'])) # avg predicted aqi
]
def get_air_quality_df(data):
col_names = [
'date',
'pm25',
'pm10',
'aqi'
]
new_data = pd.DataFrame(
data
).T
new_data.columns = col_names
new_data['pm25'] = pd.to_numeric(new_data['pm25'])
new_data['pm10'] = pd.to_numeric(new_data['pm10'])
new_data['aqi'] = pd.to_numeric(new_data['aqi'])
return new_data
def get_weather_data_daily(city):
WEATHER_API_KEY = os.getenv('WEATHER_API_KEY')
answer = requests.get(f'https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/{city}/today?unitGroup=metric&include=days&key={WEATHER_API_KEY}&contentType=json').json()
data = answer['days'][0]
return [
answer['address'].lower(),
data['datetime'],
data['tempmax'],
data['tempmin'],
data['temp'],
data['feelslikemax'],
data['feelslikemin'],
data['feelslike'],
data['dew'],
data['humidity'],
data['precip'],
data['precipprob'],
data['precipcover'],
data['snow'],
data['snowdepth'],
data['windgust'],
data['windspeed'],
data['winddir'],
data['pressure'],
data['cloudcover'],
data['visibility'],
data['solarradiation'],
data['solarenergy'],
data['uvindex'],
data['conditions']
]
def get_weather_data_weekly(city: str, start_date: datetime) -> pd.DataFrame:
WEATHER_API_KEY = os.getenv('WEATHER_API_KEY')
end_date = f"{start_date + datetime.timedelta(days=6):%Y-%m-%d}"
answer = requests.get(f'https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/{city}/{start_date}/{end_date}?unitGroup=metric&include=days&key={WEATHER_API_KEY}&contentType=json').json()
weather_data = answer['days']
final_df = pd.DataFrame()
for i in range(7):
data = weather_data[i]
list_of_data = [
answer['address'].lower(),
data['datetime'],
data['tempmax'],
data['tempmin'],
data['temp'],
data['feelslikemax'],
data['feelslikemin'],
data['feelslike'],
data['dew'],
data['humidity'],
data['precip'],
data['precipprob'],
data['precipcover'],
data['snow'],
data['snowdepth'],
data['windgust'],
data['windspeed'],
data['winddir'],
data['pressure'],
data['cloudcover'],
data['visibility'],
data['solarradiation'],
data['solarenergy'],
data['uvindex'],
data['conditions']
]
weather_df = get_weather_df(list_of_data)
final_df = pd.concat([final_df, weather_df])
return final_df
def get_weather_df(data):
col_names = [
'name',
'date',
'tempmax',
'tempmin',
'temp',
'feelslikemax',
'feelslikemin',
'feelslike',
'dew',
'humidity',
'precip',
'precipprob',
'precipcover',
'snow',
'snowdepth',
'windgust',
'windspeed',
'winddir',
'pressure',
'cloudcover',
'visibility',
'solarradiation',
'solarenergy',
'uvindex',
'conditions'
]
new_data = pd.DataFrame(
data
).T
new_data.columns = col_names
for col in col_names:
if col not in ['name', 'date', 'conditions']:
new_data[col] = pd.to_numeric(new_data[col])
return new_data
def data_encoder(X):
X.drop(columns=['date', 'name'], inplace=True)
X['conditions'] = OrdinalEncoder().fit_transform(X[['conditions']])
return X
def get_aplevel(temps:np.ndarray, table:list):
boundary_list = np.array([0, 50, 100, 150, 200, 300]) # assert temps.shape == [x, 1]
redf = np.logical_not(temps<=boundary_list) # temps.shape[0] x boundary_list.shape[0] ndarray
hift = np.concatenate((np.roll(redf, -1)[:, :-1], np.full((temps.shape[0], 1), False)), axis = 1)
cat = np.nonzero(np.not_equal(redf,hift))
level = [table[el] for el in cat[1]]
return level
def get_color(level:list):
air_pollution_level = ['Good', 'Moderate', 'Unhealthy for sensitive Groups','Unhealthy' ,'Very Unhealthy', 'Hazardous']
color_list = ["Green", "Yellow", "DarkOrange", "Red", "Purple", "DarkRed"]
ind = [air_pollution_level.index(lel) for lel in level]
text = [f"color:{color_list[idex]};" for idex in ind]
return text