diff --git a/availability.py b/availability.py index 9bd80f2..e841cb3 100644 --- a/availability.py +++ b/availability.py @@ -6,6 +6,7 @@ from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from typing import List +from collections import defaultdict import cachetools.func import pandas as pd @@ -36,34 +37,27 @@ def get_data(URL): data = json.loads(response.text)['centers'] return data -def get_availability(district_ids: List[int], min_age_limit: int): - INP_DATE = datetime.datetime.today().strftime("%d-%m-%Y") - - all_date_df = None - - for district_id in district_ids: - print(f"checking for INP_DATE:{INP_DATE} & DIST_ID:{district_id}") - URL = "https://cdn-api.co-vin.in/api/v2/appointment/sessions/public/calendarByDistrict?district_id={}&date={}".format(district_id, INP_DATE) - data = get_data(URL) - df = pd.DataFrame(data) - if len(df): - df = df.explode("sessions") - df['min_age_limit'] = df.sessions.apply(lambda x: x['min_age_limit']) - df['available_capacity'] = df.sessions.apply(lambda x: x['available_capacity']) - df['date'] = df.sessions.apply(lambda x: x['date']) - df = df[["date", "min_age_limit", "available_capacity", "pincode", "name", "state_name", "district_name", "block_name", "fee_type"]] - if all_date_df is not None: - all_date_df = pd.concat([all_date_df, df]) - else: - all_date_df = df - - if all_date_df is not None: - all_date_df = all_date_df.drop(["block_name"], axis=1).sort_values(["min_age_limit", "available_capacity", "date", "district_name"], ascending=[True, False, True, True]) - all_date_df = all_date_df[all_date_df.min_age_limit >= min_age_limit] - all_date_df = all_date_df[all_date_df.available_capacity>0] - all_date_df.set_index('date', inplace=True) - return all_date_df - return pd.DataFrame() +def getDetails(district_id, age_limit): + d = defaultdict(list) + data = requests.get("https://cdn-api.co-vin.in/api/v2/appointment/sessions/public/calendarByDistrict?district_id={}&date=05-05-2021".format(district_id)).json() + + for i in range(len(data['centers'])): + for j in range(len(data['centers'][i]['sessions'])): + if data['centers'][i]['sessions'][j]['available_capacity'] > 0 and data['centers'][i]['sessions'][j]['min_age_limit'] == age_limit: + d['center_id'].append(data['centers'][i]['center_id']) + d['center_name'].append(data['centers'][i]['name']) + d['center_address'].append(data['centers'][i]['address']) + d['district_name'].append(data['centers'][i]['district_name']) + d['pincode'].append(data['centers'][i]['pincode']) + d['available vaccines'].append(data['centers'][i]['sessions'][j]['available_capacity']) + + if len(d) == 0 or d == None: + msg = "Vaccine currently unavaible for {}+ age limit. Please try after some time".format(age_limit) + return msg + + df = pd.DataFrame(d) + + return df def send_email(data_frame, age): diff --git a/streamlit_app.py b/streamlit_app.py index f339f86..49f7eec 100644 --- a/streamlit_app.py +++ b/streamlit_app.py @@ -1,7 +1,7 @@ import pandas as pd import streamlit as st - -from availability import get_availability +from availability import getDetails +import base64 st.title('Vaccine Availability') st.markdown('Contribute on [GitHub](https://github.com/bhavsarpratik/vaccine_availability)') @@ -10,17 +10,35 @@ def get_data(): return pd.read_csv('districts.csv') +def get_table_download_link(df): + csv = df.to_csv(index=False) + b64 = base64.b64encode( + csv.encode() + ).decode() + + return f'Download availabile vaccine table in the form of csv' + data = get_data() -mapper = dict(data.values) -avail_districts = list(mapper.keys()) -min_age_limit = st.radio('Min age limit', [18, 45]) -option = st.multiselect('District', avail_districts, "Ahmedabad Corporation") +age_limit = st.radio('Select',["18-44","45+"]) +age_limit_ = int() +if age_limit == "18-44": + age_limit_ = 18 +else: + age_limit_ = 45 + +district_name = st.selectbox(label='',options=data['district_name'].values) + +district_id = data[data['district_name'] == district_name]['district_id'].values[0] + +df = getDetails(district_id, age_limit_) + +if isinstance(df, pd.DataFrame): + st.markdown(get_table_download_link(df), unsafe_allow_html=True) + st.table(df) +else: + st.error(df) + + -district_ids = [mapper[val] for val in option] -try: - df = get_availability(district_ids, min_age_limit) - st.table(df) -except: - st.error('Unable to fetch data. Try after a few minutes')