Spaces:
Sleeping
Sleeping
Upload 5 files
Browse files- README.md +4 -5
- app.py +159 -0
- etl.py +159 -0
- heliumhealth-a05d595e5991.json +12 -0
- requirements.txt +88 -0
README.md
CHANGED
@@ -1,13 +1,12 @@
|
|
1 |
---
|
2 |
-
title: Qa
|
3 |
-
emoji:
|
4 |
colorFrom: yellow
|
5 |
-
colorTo:
|
6 |
sdk: gradio
|
7 |
-
sdk_version:
|
8 |
app_file: app.py
|
9 |
pinned: false
|
10 |
-
license: apache-2.0
|
11 |
---
|
12 |
|
13 |
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
1 |
---
|
2 |
+
title: Overlap Qa Check
|
3 |
+
emoji: π
|
4 |
colorFrom: yellow
|
5 |
+
colorTo: green
|
6 |
sdk: gradio
|
7 |
+
sdk_version: 3.29.0
|
8 |
app_file: app.py
|
9 |
pinned: false
|
|
|
10 |
---
|
11 |
|
12 |
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
app.py
ADDED
@@ -0,0 +1,159 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from datetime import datetime
|
2 |
+
|
3 |
+
import gradio as gr
|
4 |
+
import gspread
|
5 |
+
import validators
|
6 |
+
from validators import ValidationFailure
|
7 |
+
from google.oauth2.service_account import Credentials
|
8 |
+
from pydrive.auth import GoogleAuth
|
9 |
+
from pydrive.drive import GoogleDrive
|
10 |
+
|
11 |
+
import etl
|
12 |
+
|
13 |
+
# test sheet - https://docs.google.com/spreadsheets/d/1iJ0-882HsWkAth0e0P_kf21aL6583Z7m1LwloaRCVEc/edit#gid=0
|
14 |
+
week_list = [f"week_{i}" for i in range(1, 51)]
|
15 |
+
|
16 |
+
# credentials file
|
17 |
+
cred_file_path = 'heliumhealth-a05d595e5991.json'
|
18 |
+
|
19 |
+
# google auth scopes
|
20 |
+
scopes = ['https://www.googleapis.com/auth/spreadsheets',
|
21 |
+
'https://www.googleapis.com/auth/drive']
|
22 |
+
|
23 |
+
# create credentials
|
24 |
+
credentials = Credentials.from_service_account_file(
|
25 |
+
cred_file_path, scopes=scopes )
|
26 |
+
|
27 |
+
# authorize google spreadsheet
|
28 |
+
gc = gspread.authorize(credentials)
|
29 |
+
|
30 |
+
gauth = GoogleAuth()
|
31 |
+
drive = GoogleDrive(gauth)
|
32 |
+
|
33 |
+
def overlap_matching(row, d_type):
|
34 |
+
"""
|
35 |
+
matching overlap
|
36 |
+
"""
|
37 |
+
match_cols = {
|
38 |
+
"prescription": ['RX Norm [Super Generic]_x', 'RX Norm [Super Generic]_y'],
|
39 |
+
"diagnosis": ['ICD10 Diagnosis_x','ICD10 Diagnosis_y']
|
40 |
+
}
|
41 |
+
cols = match_cols[d_type]
|
42 |
+
row['match_status'] = 'match' if row[cols[0]] == row[cols[1]] else 'no match'
|
43 |
+
return row
|
44 |
+
|
45 |
+
def overlap_check(gs, start_date, end_date, week_no, d_type):
|
46 |
+
"""
|
47 |
+
load, preprocess, check overlap, postprocess and output data to google sheet
|
48 |
+
|
49 |
+
Args:
|
50 |
+
gs (GSheet instance): Gsheet instance access to google sheet
|
51 |
+
start_date (str): Date str format(YYYY-mm-dd)
|
52 |
+
end_date (_type_): Date str format(YYYY-mm-dd)
|
53 |
+
d_type (_type_): sheet type (prescription or diagnosis)
|
54 |
+
"""
|
55 |
+
# load data
|
56 |
+
all_data = etl.load_data(gs, start_date, end_date, d_type)
|
57 |
+
|
58 |
+
# preprocess and return overlap data
|
59 |
+
overlap_data = etl.preprocess_data(all_data, d_type)
|
60 |
+
|
61 |
+
# do overlap matching
|
62 |
+
overlap_data = overlap_data.apply(overlap_matching, axis=1, args=[d_type])
|
63 |
+
|
64 |
+
# post process
|
65 |
+
overlap_data = etl.post_process(overlap_data, d_type)
|
66 |
+
|
67 |
+
# write to sheet
|
68 |
+
etl.output_data(gc, overlap_data, week_no, d_type)
|
69 |
+
|
70 |
+
|
71 |
+
def overlap_check_main(sheet_type, start_date_str, end_date_str, week_str, sheet_url):
|
72 |
+
"""
|
73 |
+
overlap check main function
|
74 |
+
|
75 |
+
Args:
|
76 |
+
sheet_type (str): sheet type (prescription or diagnosis)
|
77 |
+
start_date_str (str): start date string: e.g. 2023-03-21
|
78 |
+
end_date_str (str): end date string: e.g. 2023-03-24
|
79 |
+
week_str (str): week string e.g. week_1
|
80 |
+
sheet_url (url): _description_
|
81 |
+
|
82 |
+
Raises:
|
83 |
+
gr.exceptions.Error: Date Format Error - either start_date or end date are bad format
|
84 |
+
gr.exceptions.Error: Date Error - when start_date is greater than end date
|
85 |
+
gr.exceptions.Error: URL Error - Bad url format
|
86 |
+
"""
|
87 |
+
# format date from string
|
88 |
+
try:
|
89 |
+
start_date = datetime.strptime(start_date_str.strip(), "%Y-%m-%d").date()
|
90 |
+
end_date = datetime.strptime(end_date_str.strip(), "%Y-%m-%d").date()
|
91 |
+
except:
|
92 |
+
raise gr.Error(message="Wrong date format")
|
93 |
+
|
94 |
+
# raise error when start date is greater end date
|
95 |
+
if start_date >= end_date:
|
96 |
+
raise gr.Error(message="Start date cannot be greater end date")
|
97 |
+
|
98 |
+
# Check if the input is valid url
|
99 |
+
# ToDO: Error message displayed is not explanatory - Fix it
|
100 |
+
url_check = validators.url(sheet_url)
|
101 |
+
if isinstance(url_check, ValidationFailure):
|
102 |
+
raise gr.Error(message="Please enter a valid URL")
|
103 |
+
|
104 |
+
|
105 |
+
# open the google sheet for reading
|
106 |
+
|
107 |
+
gs = gc.open_by_url(sheet_url)
|
108 |
+
|
109 |
+
|
110 |
+
# if sheet_type == 'prescription':
|
111 |
+
try:
|
112 |
+
overlap_check(gs, start_date_str, end_date_str, week_str, sheet_type)
|
113 |
+
except:
|
114 |
+
gr.Error(message="Permission denied. Please add IAM user to the sheet and try again")
|
115 |
+
|
116 |
+
|
117 |
+
return f"Successfully ran {sheet_type} overlap check for {week_str.replace('_', ' ').title()} ({start_date_str} - {end_date_str})"
|
118 |
+
|
119 |
+
with gr.Blocks() as demo:
|
120 |
+
gr.Markdown(
|
121 |
+
"""
|
122 |
+
## Overlap Check App
|
123 |
+
|
124 |
+
* Add IAM User to sheet you want to test
|
125 |
+
* Gsheet tabs required for diagnosis:
|
126 |
+
* Diagnosis
|
127 |
+
* Gsheet tabs required for prescription:
|
128 |
+
* Prescriptions
|
129 |
+
* Data headers required for diagnosis
|
130 |
+
* Unstructured Name, ICD10 Diagnosis, Intern
|
131 |
+
* Data headers required for prescription
|
132 |
+
* Unstructured Name, RX Norm [Super Generic], Intern
|
133 |
+
"""
|
134 |
+
)
|
135 |
+
# inputs
|
136 |
+
sheet_type = gr.Dropdown(['prescription', 'diagnosis'], label="QA Type")
|
137 |
+
start_date = gr.Textbox(label="Start Date", placeholder="YYYY-MM-DD")
|
138 |
+
end_date = gr.Textbox(label="End Date", placeholder="YYYY-MM-DD")
|
139 |
+
week_input = gr.Dropdown(week_list, label="Week")
|
140 |
+
url = gr.Textbox(label="URL", placeholder="Enter sheet url ...")
|
141 |
+
|
142 |
+
# outputs
|
143 |
+
output = gr.Textbox(label="Output Box")
|
144 |
+
|
145 |
+
run_btn = gr.Button("Run")
|
146 |
+
run_btn.click(
|
147 |
+
fn=overlap_check_main,
|
148 |
+
inputs=[
|
149 |
+
sheet_type,
|
150 |
+
start_date,
|
151 |
+
end_date,
|
152 |
+
week_input,
|
153 |
+
url
|
154 |
+
],
|
155 |
+
outputs=output,
|
156 |
+
api_name="Overlap_check"
|
157 |
+
)
|
158 |
+
|
159 |
+
demo.launch()
|
etl.py
ADDED
@@ -0,0 +1,159 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import pandas as pd
|
3 |
+
from gspread_dataframe import set_with_dataframe
|
4 |
+
|
5 |
+
def load_data(gs, start_date, end_date, d_type):
|
6 |
+
"""
|
7 |
+
load data from google sheet
|
8 |
+
|
9 |
+
Args:
|
10 |
+
gs (Gsheet instance ): GSheet instance with access to google sheet
|
11 |
+
start_date (str): Date str format(YYYY-mm-dd)
|
12 |
+
end_date (str): Date str format(YYYY-mm-dd)
|
13 |
+
d_type (str):sheet type (prescription or diagnosis)
|
14 |
+
|
15 |
+
Raises:
|
16 |
+
gr.Error: 403 permission denied
|
17 |
+
|
18 |
+
Returns:
|
19 |
+
data (DataFrame): loaded data from google sheet
|
20 |
+
"""
|
21 |
+
sheets_dict = {
|
22 |
+
"diagnosis": "Diagnosis",
|
23 |
+
"prescription": "Prescriptions"
|
24 |
+
}
|
25 |
+
|
26 |
+
# open data and super sheet
|
27 |
+
try:
|
28 |
+
data_sheet = gs.worksheet(sheets_dict[d_type])
|
29 |
+
except:
|
30 |
+
raise gr.Error(message='Permission denied. Please add IAM user to the sheet and try again')
|
31 |
+
|
32 |
+
# read data from sheets
|
33 |
+
all_data = pd.DataFrame(data_sheet.get_all_records())
|
34 |
+
all_data.columns = all_data.columns.str.strip()
|
35 |
+
|
36 |
+
# transform date fields
|
37 |
+
all_data['date_cleaned'] = pd.to_datetime(all_data['date_cleaned'], infer_datetime_format=True)
|
38 |
+
all_data['date_reviewed'] = pd.to_datetime(all_data['date_reviewed'], infer_datetime_format=True)
|
39 |
+
|
40 |
+
data = all_data[(all_data['date_cleaned'] >= start_date) & (all_data['date_cleaned'] <= end_date)]
|
41 |
+
|
42 |
+
return data
|
43 |
+
|
44 |
+
def preprocess_data(data, d_type):
|
45 |
+
"""
|
46 |
+
preprocess loaded data from google sheet
|
47 |
+
|
48 |
+
Args:
|
49 |
+
data (DataFrame): google sheet data as a dataframe
|
50 |
+
d_type (Str): sheet type (prescription or diagnosis)
|
51 |
+
|
52 |
+
Raises:
|
53 |
+
gr.Error (ValueError): Wrong column
|
54 |
+
|
55 |
+
Returns:
|
56 |
+
Overlap (DataFrame): Overlap data
|
57 |
+
"""
|
58 |
+
|
59 |
+
data.columns = data.columns.str.strip()
|
60 |
+
|
61 |
+
overlap_cols = {
|
62 |
+
"prescription": ["RX Norm [Super Generic]_x", "RX Norm [Super Generic]_y" ],
|
63 |
+
"diagnosis": ["ICD10 Diagnosis_x", "ICD10 Diagnosis_y"]
|
64 |
+
}
|
65 |
+
|
66 |
+
try:
|
67 |
+
# extract the interns
|
68 |
+
intern_1 = data['Intern'].unique()[0]
|
69 |
+
intern_2 = data['Intern'].unique()[1]
|
70 |
+
|
71 |
+
# intern 1 and intern 2 data
|
72 |
+
intern_1_data = data[data['Intern'] == intern_1.strip()]
|
73 |
+
intern_2_data = data[data['Intern'] == intern_2.strip()]
|
74 |
+
|
75 |
+
# extract the overlap
|
76 |
+
overlap = pd.merge(intern_1_data, intern_2_data, on='Unstructured Name')
|
77 |
+
|
78 |
+
# remove all white spaces
|
79 |
+
col = overlap_cols[d_type]
|
80 |
+
overlap[col[0]] = overlap[col[0]].str.strip()
|
81 |
+
overlap[col[1]] = overlap[col[1]].str.strip()
|
82 |
+
except:
|
83 |
+
raise gr.Error(message="No Intern Column")
|
84 |
+
|
85 |
+
return overlap
|
86 |
+
|
87 |
+
def post_process(data, d_type):
|
88 |
+
"""
|
89 |
+
post process data
|
90 |
+
|
91 |
+
Args:
|
92 |
+
data (DataFrame): matched data as dataframe
|
93 |
+
d_type (str): sheet type (prescription or diagnosis)
|
94 |
+
|
95 |
+
Returns:
|
96 |
+
data (DataFrame): postprocessed data as dataframe
|
97 |
+
"""
|
98 |
+
drop_cols = {
|
99 |
+
"prescription": ['Type_y','Supervisor_y', 'date_cleaned_y', 'date_reviewed_y'],
|
100 |
+
"diagnosis": ['Supervisor_y', 'date_cleaned_y', 'date_reviewed_y']
|
101 |
+
}
|
102 |
+
post_cols = {
|
103 |
+
"prescription": ['Unstructured Name', 'Intern_x', 'Status_x', 'RX Norm [Super Generic]_x',
|
104 |
+
'Intern_y', 'Status_y', 'RX Norm [Super Generic]_y', 'match_status', 'Type_x',
|
105 |
+
'Supervisor_x', 'date_cleaned_x', 'date_reviewed_x'],
|
106 |
+
"diagnosis": ['Unstructured Name', 'Intern_x', 'Status_x', 'ICD10 Diagnosis_x',
|
107 |
+
'Intern_y', 'Status_y', 'ICD10 Diagnosis_y', 'match_status',
|
108 |
+
'Supervisor_x', 'date_cleaned_x', 'date_reviewed_x']
|
109 |
+
}
|
110 |
+
|
111 |
+
d_cols = drop_cols[d_type]
|
112 |
+
p_cols = post_cols[d_type]
|
113 |
+
|
114 |
+
data = data.drop(columns=d_cols)
|
115 |
+
data = data[p_cols]
|
116 |
+
|
117 |
+
data = data.rename(columns={
|
118 |
+
'date_cleaned_x': 'date_cleaned',
|
119 |
+
'date_reviewed_x': 'date_reviewed'
|
120 |
+
})
|
121 |
+
|
122 |
+
return data
|
123 |
+
|
124 |
+
def output_data(gc, data, week_no, dtype):
|
125 |
+
"""
|
126 |
+
outputs data to a google sheet
|
127 |
+
|
128 |
+
Args:
|
129 |
+
gc (GSheet instance): Gsheet permission instance
|
130 |
+
data (DataFrame): Data to write to google sheet
|
131 |
+
week_no (str): Week no e.g. week_1
|
132 |
+
d_type (str): sheet type (prescription or diagnosis)
|
133 |
+
|
134 |
+
Raises:
|
135 |
+
gr.exception.Error: Sheet Error
|
136 |
+
"""
|
137 |
+
out_sheet_dict = {
|
138 |
+
"diagnosis": "https://docs.google.com/spreadsheets/d/1UJ2PHR62mcz11D2qeX-Wk2fs1357BW78o8g76lwG93w/edit#gid=2123373592",
|
139 |
+
"prescription": "https://docs.google.com/spreadsheets/d/1Fo9V6J_L9eWX3qEScITP2L8nI9exk_VslGMgk-1jCJw/edit#gid=1287467149"
|
140 |
+
}
|
141 |
+
|
142 |
+
outsheet_url = out_sheet_dict[dtype]
|
143 |
+
out_gs = gc.open_by_url(outsheet_url)
|
144 |
+
|
145 |
+
# write output to sheet
|
146 |
+
try:
|
147 |
+
out_worksheet = out_gs.worksheet(week_no)
|
148 |
+
# clear the worksheet
|
149 |
+
out_worksheet.clear()
|
150 |
+
except:
|
151 |
+
raise gr.Error(f"Result sheet for {week_no} does not exist")
|
152 |
+
|
153 |
+
# write dataframe to work sheet
|
154 |
+
set_with_dataframe(
|
155 |
+
worksheet=out_worksheet,
|
156 |
+
dataframe=data,
|
157 |
+
include_index=False,
|
158 |
+
include_column_header=True,
|
159 |
+
resize=True)
|
heliumhealth-a05d595e5991.json
ADDED
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"type": "service_account",
|
3 |
+
"project_id": "heliumhealth",
|
4 |
+
"private_key_id": "a05d595e59911b601cf718b32e967a0f4e1f463d",
|
5 |
+
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCzJJ2dCd32LwAc\njoTiCB2shYwGRFvApmF3/RUkT9BZDg5S+imfuXSsHBgueKIEAW7E0UBGVbioKQC0\nEzKh/+aLVdZEYdqyNdrx4g5HmuDn4sQyd/zP0J3cUa/LlF/cND6HsExJcdkjL9rV\nVZEQZhpVrgB9J6Ui5dZsrN9RWHguP8awI6JFqsfF2aKWJ4Z+Gl9YlxMhCqcwBalF\nf4MUOwnXSK1t0QMXdEAg9zA+wwySYjCz/nVOIrEBB1lHp1mEiwpv2KtuX3f2GGRt\nSGwOThDWJPn6EuLcX2mlxEs7ylEs1hYcKfROPzBMSRX5g/m5lKkRuZLsBpqKZj5G\nrB62FasXAgMBAAECggEADIMutRTG2Zaf0d7MfkMl23J6fMeShwq3/RsCuoYOneHC\n813AwYTBFvJhaAGKA3CcLYgWDrOXEbvHbkx2+WS31BybOiyBi3gCgmmRKMQzGE84\n9/N0h4lhNU3JUxVaerV1dqHEOk8G5RPHG6Z92uDezwQ3yYYW3TCjgPS0JmjhAA3b\nAnAgATuiY4ivscR28xSTDsexQhDnVGdM0ms4hrAUV0nM+sGLbXil6hTBoRi/iEmq\nGESeFsDOcdJKhIAvs94FwhHGLljCniP+2/jN6Wg8+wTFwUpaH0NpV6tfHYvGe8Bp\natfVZwCqwP5+J3dXHuaNUwe/cUK6HSVcGARXp5vubQKBgQD7xXVg2WoMONpGHWnD\nxk3T085JiC+MgBK+y5MzNLTtVxCNzsv3I70lu8ilv7ytfy35bnQ2dx8Ych1Jjc7z\n5kQs9rRxtY5iZvyTRaBB4Zfyr2uGxrR/lMJizsH+M0my48zPiHWLdqJSTupBmufr\n2kFeRIbphEl6u5fir9s5c/+EGwKBgQC2JuCQXrYHryn2vs6qf+Zf/RgzK5+3irHy\nEeYbedEpe6dCy5dWjlh7sXR23938XTXtnwmKWMuovdnLybBXvuWacOsqz5wYuXAn\nK6V8oBPpV9Aj+nVSft26E8nMzNX1lXbvxBgq1GvOUk7Mbi9p4nm6gjKNKYo1/U9P\nH+S9VHQMtQKBgAxqkH9WOYSgySLsEGs3PF9V8rZtoOqs5j/Cil/cGZAa2xYjPKvT\nd2CFAkAqVIO54eqLJ/AHr+Dkv80A0VP15ybQg9WXvo3bxlj89gpJtdSiEgtzgTNJ\ngsycpbSDkv7ffRo/AI0ALMEiYysZGJbpDJA5kO2zOGx1E+h6A7WxoshBAn8UolLO\nB+yW8kDOss62gcaXGRSkt0xgflWqFlz6v9Hx4RARgP6jz3w2huOqk7GR5P027c0m\n3ugzNU52x2Iyjm10EVaSgvIr2tXZmhglBf07cbciXDzuG3ECozs49/tE1qmif5Q9\nRdLwjGJgxhqY5A7mEdmoJAyEES3qyLIgwHBlAoGAS0sA8A5Ay+BbaAGufqSaBnxt\nQgMGNYUgyeG6edksXMRPMqTWbQ5xdjEmv38nQ8AT9RVMZ9TfZqCts1fCD+FgTcAU\niAasrJMvd4mCBhWZWPwGJN+yaeZHvdbrXsSEo3kkyiwjFip03CCJtDJO3MwyowOb\nIxC34Nn4A6XUGjaF7Io=\n-----END PRIVATE KEY-----\n",
|
6 |
+
"client_email": "test-gs@heliumhealth.iam.gserviceaccount.com",
|
7 |
+
"client_id": "102772078802762265627",
|
8 |
+
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
9 |
+
"token_uri": "https://oauth2.googleapis.com/token",
|
10 |
+
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
11 |
+
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/test-gs%40heliumhealth.iam.gserviceaccount.com"
|
12 |
+
}
|
requirements.txt
ADDED
@@ -0,0 +1,88 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
aiofiles==23.1.0
|
2 |
+
aiohttp==3.8.4
|
3 |
+
aiosignal==1.3.1
|
4 |
+
altair==4.2.2
|
5 |
+
anyio==3.6.2
|
6 |
+
async-timeout==4.0.2
|
7 |
+
attrs==23.1.0
|
8 |
+
beautifulsoup4==4.12.2
|
9 |
+
cachetools==5.3.0
|
10 |
+
certifi==2023.5.7
|
11 |
+
charset-normalizer==3.1.0
|
12 |
+
click==8.1.3
|
13 |
+
contourpy==1.0.7
|
14 |
+
cycler==0.11.0
|
15 |
+
decorator==5.1.1
|
16 |
+
entrypoints==0.4
|
17 |
+
fastapi==0.95.1
|
18 |
+
ffmpy==0.3.0
|
19 |
+
filelock==3.12.0
|
20 |
+
fonttools==4.39.3
|
21 |
+
frozenlist==1.3.3
|
22 |
+
fsspec==2023.5.0
|
23 |
+
google==3.0.0
|
24 |
+
google-api-core==2.11.0
|
25 |
+
google-api-python-client==2.86.0
|
26 |
+
google-auth==2.17.3
|
27 |
+
google-auth-httplib2==0.1.0
|
28 |
+
google-auth-oauthlib==1.0.0
|
29 |
+
googleapis-common-protos==1.59.0
|
30 |
+
gradio==3.28.3
|
31 |
+
gradio_client==0.2.0
|
32 |
+
gspread==5.8.0
|
33 |
+
gspread-dataframe==3.3.0
|
34 |
+
h11==0.14.0
|
35 |
+
httpcore==0.17.0
|
36 |
+
httplib2==0.22.0
|
37 |
+
httpx==0.24.0
|
38 |
+
huggingface-hub==0.14.1
|
39 |
+
idna==3.4
|
40 |
+
Jinja2==3.1.2
|
41 |
+
jsonschema==4.17.3
|
42 |
+
kiwisolver==1.4.4
|
43 |
+
linkify-it-py==2.0.2
|
44 |
+
markdown-it-py==2.2.0
|
45 |
+
MarkupSafe==2.1.2
|
46 |
+
matplotlib==3.7.1
|
47 |
+
mdit-py-plugins==0.3.3
|
48 |
+
mdurl==0.1.2
|
49 |
+
multidict==6.0.4
|
50 |
+
numpy==1.24.3
|
51 |
+
oauth2client==4.1.3
|
52 |
+
oauthlib==3.2.2
|
53 |
+
orjson==3.8.12
|
54 |
+
packaging==23.1
|
55 |
+
pandas==2.0.1
|
56 |
+
Pillow==9.5.0
|
57 |
+
protobuf==4.22.4
|
58 |
+
pyasn1==0.5.0
|
59 |
+
pyasn1-modules==0.3.0
|
60 |
+
pydantic==1.10.7
|
61 |
+
PyDrive==1.3.1
|
62 |
+
pydub==0.25.1
|
63 |
+
Pygments==2.15.1
|
64 |
+
pyparsing==3.0.9
|
65 |
+
pyrsistent==0.19.3
|
66 |
+
python-dateutil==2.8.2
|
67 |
+
python-multipart==0.0.6
|
68 |
+
pytz==2023.3
|
69 |
+
PyYAML==6.0
|
70 |
+
requests==2.30.0
|
71 |
+
requests-oauthlib==1.3.1
|
72 |
+
rsa==4.9
|
73 |
+
semantic-version==2.10.0
|
74 |
+
six==1.16.0
|
75 |
+
sniffio==1.3.0
|
76 |
+
soupsieve==2.4.1
|
77 |
+
starlette==0.26.1
|
78 |
+
toolz==0.12.0
|
79 |
+
tqdm==4.65.0
|
80 |
+
typing_extensions==4.5.0
|
81 |
+
tzdata==2023.3
|
82 |
+
uc-micro-py==1.0.2
|
83 |
+
uritemplate==4.1.1
|
84 |
+
urllib3==2.0.2
|
85 |
+
uvicorn==0.22.0
|
86 |
+
validators==0.20.0
|
87 |
+
websockets==11.0.3
|
88 |
+
yarl==1.9.2
|