-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
265 lines (217 loc) · 9.6 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
import pandas as pd
import os
import db_connector
import plotly.express as px
import sqlite3
def total_confirmed_cases_figure_object(dataframe):
""" Function creates a plotly Express timeseries figure object
:returns fig:
"""
country_name = dataframe["Country/Region"].values[1]
fig = px.line(dataframe, x='ObservationDate', y='Confirmed', title=f"""Confirmed Cases in {country_name}""")
return fig
def new_cases_figure_object(dataframe):
""" Function creates a plotly Express timeseries figure object
:returns fig:
"""
country_name = dataframe["Country/Region"].values[1]
fig = px.line(dataframe, x='ObservationDate', y='New_Cases',width=1000, height=800, title=f"""New Cases per day in {country_name}""", color='Province/State')
return fig
def change_in_newcases_figure_object(dataframe):
""" Function creates a plotly Express timeseries figure object
:returns fig:
"""
country_name = dataframe["Country/Region"].values[1]
fig = px.line(dataframe, x='ObservationDate', y='Change_In_Cases_Added',width=1000, height=800, title=f"""Change in new cases per day {country_name}""")
return fig
def get_states_in_data(dataframe):
"""Function returns a list of all states present in a country
"""
try:
country_name = dataframe["Country/Region"].values[1]
sql_string = f"""SELECT DISTINCT [Province/State],[Country/Region] FROM [daily_change] WHERE [Country/Region] = '{country_name}' ORDER BY [Province/State] ASC; """
engine,meta = db_connector.db_engine()
conn = engine.connect()
df = pd.read_sql_query(sql_string,conn)
return df
except Exception as e:
print(e)
def query_state_data(Country,state):
"""Function Queries data by a state or province within a country
"""
sql_string = f"""SELECT * FROM [daily_change] WHERE [Country/Region] = '{Country}' and [Province/State] = '{state}' ORDER BY [Province/State] ASC, [ObservationDate] ASC;"""
engine,meta = db_connector.db_engine()
conn = engine.connect()
df = pd.read_sql_query(sql_string,conn)
return df
def query_country_data(country):
""" Function queries data by a countries name
"""
try:
engine, meta = db_connector.db_engine()
conn = engine.connect()
df_select = pd.read_sql_query(f"""SELECT * FROM [daily_change] WHERE [Country/Region] = '{country}' ORDER BY [Province/State] ASC, [ObservationDate] ASC; """,conn)
if len(df_select) == 0:
list_country = [country]
initlize_db(list_country)
try:
engine, meta = db_connector.db_engine()
conn = engine.connect()
sql_string = f"""SELECT * FROM [daily_change] WHERE [Country/Region] = '{country}' ORDER BY [Province/State] ASC, [ObservationDate] ASC; """
df_select = pd.read_sql_query(sql_string,conn)
return df_select
except Exception as e:
print(e)
print("Country Data Present")
return df_select
else:
return df_select
except Exception as e:
print(e)
class sqldatabase:
""" Class which fills the SQlite database with data
Args:
Countries: list of strings which are country names
"""
def df_to_sql(self):
try:
parent_dir = os.getcwd()
data_folder_dir = os.path.join(parent_dir, "data")
data_path = os.path.join(data_folder_dir, "covid_19_data.csv")
df = pd.read_csv(data_path)
engine, meta = db_connector.db_engine()
df.to_sql("covid19basic", engine, if_exists="replace")
except Exception as e:
print(e)
def select_data_by_country(self, country_name: str):
""" Queries the Covid19 SQLite database by country name.
:returns Dataframe:
"""
engine, meta = db_connector.db_engine()
query_string = f"""SELECT * FROM 'covid19basic' WHERE [Country/Region] = '{country_name}' ORDER BY [Province/State] ASC, [ObservationDate] ASC;"""
df = pd.read_sql_query(query_string, engine)
return df
def generate_new_cases_per_day(self, dataframe):
"""Takes the derivative of confirmed cases per day and saves it in a dataframe
Args:
dataframe: Dataframe containing the columns New_Cases, ObservationDate.
Returns:
A dataframe containing Columns Change_in_cases_added, ObservationDate.
"""
length = len(dataframe)
df = pd.DataFrame(columns=["SNo","New_Cases"])
counter = 0
try:
dataframe = dataframe.rename(columns={'Province/State': 'Province_State'})
for row in dataframe.itertuples():
index = row.SNo
if counter == 0:
x1 =row.Confirmed
state_1 = row.Province_State
counter += 1
else:
state_2 = row.Province_State
if state_2 == state_1:
x2 = row.Confirmed
date = row.ObservationDate
derivative = (x2 - x1)/1
print(derivative)
df2 = pd.DataFrame({"SNo":[index],'New_Cases': [derivative]})
df = pd.concat([df,df2])
x1 = row.Confirmed
counter += 1
else:
counter = 1
state_1 = state_2
x1 = row.Confirmed
print(df)
return df
except Exception as e:
print("Generate New Cases Data Failed")
print(e)
def generate_change_in_cases_added(self, dataframe):
"""Takes the derivative of New cases per day and saves it in a dataframe
Args:
dataframe: Dataframe containing the columns New_Cases, ObservationDate.
Returns:
A dataframe containing Columns Change_in_cases_added, ObservationDate.
"""
length = len(dataframe)
df = pd.DataFrame(columns=["SNo","Change_In_Cases_Added"])
counter = 0
try:
dataframe = dataframe.rename(columns={'Province/State': 'Province_State'})
for row in dataframe.itertuples():
index = row.SNo
if counter == 0:
x1 =row.New_Cases
state_1 = row.Province_State
counter += 1
else:
state_2 = row.Province_State
if state_2 == state_1:
x2 = row.New_Cases
date = row.ObservationDate
derivative = (x2 - x1)/1
df2 = pd.DataFrame({"SNo":[index],'Change_In_Cases_Added': [derivative]})
df = pd.concat([df,df2])
x1 = row.New_Cases
counter += 1
else:
counter = 1
state_1 = state_2
x1 = row.New_Cases
print(df)
return df
except Exception as e:
print("Generate Change in new cases Data Failed")
print(e)
def merge_newcases_change_in_cases_dataframes(self, dataframe_confirmed):
""" Combines dataframes containing new cases, and the change in new cases, and inserts the dataframe to the SQLite database
Args:
dataframe_confirmed: The first parameter.
Returns:
df: A dataframe containing Columns Change_in_cases_added, ObservationDate.
"""
try:
df_newcases = self.generate_new_cases_per_day(dataframe_confirmed)
df = pd.merge(dataframe_confirmed,df_newcases, how='outer', on='SNo')
df_changeinnewcases = self.generate_change_in_cases_added(df)
df = pd.merge(df_changeinnewcases,df, how='outer', on='SNo')
except Exception as e:
print(e)
try:
engine, meta = db_connector.db_engine()
df.to_sql("daily_change", engine, if_exists="replace")
except Exception as e:
print(e)
def __init__(self, countries: list):
"""
"""
# try:
# sql_string = "SELECT DISTINCT * FROM [daily_change] ORDER by ObservationDate Desc"
# df = db_connector.df_sql_query(sql_string)
# except sqlite3.OperationalError as e:
# print(e)
if type(countries) is list:
for country in countries:
try:
df = self.select_data_by_country(country)
self.merge_newcases_change_in_cases_dataframes(df)
print(f"Succesfully generated and inserted data for {country}")
except Exception as e:
print(e)
else:
if type(countries) is str:
try:
df = self.select_data_by_country(countries)
self.merge_newcases_change_in_cases_dataframes(df)
print(f"Succesfully generated and inserted data for {countries}")
except Exception as e:
print(e)
else:
raise TypeError("Values given is not a String")
sql_string = "SELECT DISTINCT * FROM [daily_change]"
df = db_connector.df_sql_query(sql_string)
engine = db_connector.db_engine()
df.to_sql("daily_change",engine, if_exists="replace")