|
import streamlit as st |
|
import requests |
|
from bs4 import BeautifulSoup |
|
import datetime |
|
import pytz |
|
|
|
|
|
indian_timezone = pytz.timezone('Asia/Kolkata') |
|
|
|
|
|
custom_css = """ |
|
<style> |
|
body { |
|
color: orange; |
|
background-color: black; |
|
} |
|
</style> |
|
""" |
|
st.markdown(custom_css, unsafe_allow_html=True) |
|
|
|
|
|
PRESCRIBED_LIMITS = { |
|
'AQI': { |
|
'good': (0, 50), |
|
'moderate': (51, 100), |
|
'unhealthy_sensitive': (101, 150), |
|
'unhealthy': (151, 200), |
|
'very_unhealthy': (201, 300), |
|
'hazardous': (301, 500) |
|
}, |
|
'PM2.5': { |
|
'good': (0, 12.0), |
|
'moderate': (12.1, 35.4), |
|
'unhealthy_sensitive': (35.5, 55.5), |
|
'unhealthy': (55.6, 150.4), |
|
'very_unhealthy': (150.5, 250.4), |
|
'hazardous': (250.5, float('inf')) |
|
}, |
|
'PM10': { |
|
'good': (0, 50), |
|
'moderate': (51, 100), |
|
'unhealthy_sensitive': (101, 250), |
|
'unhealthy': (251, 350), |
|
'very_unhealthy': (351, 430), |
|
'hazardous': (431, float('inf')) |
|
}, |
|
'Temperature': { |
|
'comfortable': (0, 25), |
|
'moderate': (26, 30), |
|
'warm': (31, 35), |
|
'hot': (36, float('inf')) |
|
} |
|
} |
|
|
|
|
|
COLOR_CODES = { |
|
'good': 'green', |
|
'moderate': 'yellow', |
|
'unhealthy_sensitive': 'orange', |
|
'unhealthy': 'red', |
|
'very_unhealthy': 'purple', |
|
'hazardous': 'maroon' |
|
} |
|
|
|
def check_safety_level(value, parameter): |
|
for level, limits in PRESCRIBED_LIMITS[parameter].items(): |
|
if limits[0] <= value <= limits[1]: |
|
return level |
|
return None |
|
|
|
def get_aqi_data(): |
|
url = 'https://www.aqi.in/dashboard/india/jammu-and-kashmir/srinagar' |
|
r = requests.get(url) |
|
soup = BeautifulSoup(r.text, 'html.parser') |
|
meta_tag = soup.find('meta', {'name': 'description'}) |
|
line = meta_tag['content'] |
|
|
|
|
|
aqi_start = line.find("AQI) is") + len("AQI) is") |
|
aqi_end = line.find(" level") |
|
aqi = int(line[aqi_start:aqi_end].strip().split()[0]) |
|
aqi_level = line[aqi_start:aqi_end].strip().split()[1] |
|
|
|
|
|
pm25_start = line.find("PM2.5 (") + len("PM2.5 (") |
|
pm25_end = line.find(" µg/m³)", pm25_start) |
|
pm25 = float(line[pm25_start:pm25_end].strip()) |
|
|
|
|
|
pm10_start = line.find("PM10 (") + len("PM10 (") |
|
pm10_end = line.find(" µg/m³)", pm10_start) |
|
pm10 = float(line[pm10_start:pm10_end].strip()) |
|
|
|
|
|
temp_start = line.find("temperature (") + len("temperature (") |
|
temp_end = line.find("˚C)", temp_start) |
|
temp = float(line[temp_start:temp_end].strip()) |
|
|
|
return aqi, aqi_level, pm25, pm10, temp |
|
|
|
def main(): |
|
|
|
logo = 'LOGO.png' |
|
st.image(logo, width=200) |
|
|
|
st.title('Real Time SXR AQI Dashboard') |
|
st.subheader(f'Real-time Air Quality Monitoring - {datetime.datetime.now(indian_timezone).strftime("%Y-%m-%d %H:%M:%S")}') |
|
|
|
aqi, aqi_level, pm25, pm10, temp = get_aqi_data() |
|
|
|
|
|
st.markdown('### Current Data:') |
|
st.write(f"- **AQI:** {aqi} ({aqi_level})") |
|
aqi_safety = check_safety_level(aqi, 'AQI') |
|
if aqi_safety: |
|
st.write(f"Safety Level: {aqi_safety}") |
|
color_code = COLOR_CODES[aqi_safety] |
|
st.markdown(f'<p style="color:{color_code};">The AQI level is {aqi_safety}.</p>', unsafe_allow_html=True) |
|
|
|
|
|
st.write(f"- **PM2.5:** {pm25} µg/m³") |
|
pm25_safety = check_safety_level(pm25, 'PM2.5') |
|
if pm25_safety: |
|
st.write(f"Safety Level: {pm25_safety}") |
|
color_code = COLOR_CODES[pm25_safety] |
|
st.markdown(f'<p style="color:{color_code};">The PM2.5 level is {pm25_safety}.</p>', unsafe_allow_html=True) |
|
|
|
|
|
st.write(f"- **PM10:** {pm10} µg/m³") |
|
pm10_safety = check_safety_level(pm10, 'PM10') |
|
if pm10_safety: |
|
st.write(f"Safety Level: {pm10_safety}") |
|
color_code = COLOR_CODES[pm10_safety] |
|
st.markdown(f'<p style="color:{color_code};">The PM10 level is {pm10_safety}.</p>', unsafe_allow_html=True) |
|
|
|
|
|
st.write(f"- **Temperature:** {temp}˚C") |
|
|
|
|
|
|
|
st.markdown('### Developer:') |
|
st.text('Adil Aziz') |
|
st.text('Data Scientist') |
|
st.text('adilaziz2013@gmail.com') |
|
|
|
if __name__ == '__main__': |
|
main() |
|
|