/
app.py
123 lines (97 loc) · 3.78 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
import io
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
from flask import Flask, render_template, Response, request
import covid19india as ind
import covid19api as world
app = Flask(__name__)
#covid19india endpoints
state_wise_summary = "https://api.covid19india.org/csv/latest/state_wise.csv"
state_wise_time_series = "https://api.covid19india.org/csv/latest/state_wise_daily.csv"
case_time_series = "https://api.covid19india.org/csv/latest/case_time_series.csv"
#covid19api endpoints
country_summary = "https://api.covid19api.com/total/country/{}/status/confirmed"
#apify endpoints
#korea_summary = "https://api.apify.com/v2/datasets/Lc0Hoa8MgAbscJA4w/items?format=csv&clean=1"
#spain_summary = "https://api.apify.com/v2/datasets/hxwow9BB75z8RV3JT/items?format=csv&clean=1"
#endpoint for totals
india_summary = "https://coronavirus-19-api.herokuapp.com/countries/india"
def load_csv_data(uri):
data = pd.read_csv(uri)
# print(data.dtypes)
return data
def load_json_Data(uri):
data = pd.read_json(uri)
return data
def chartImage(ax):
for tick in ax.get_xticklabels():
tick.set_rotation(45)
output = io.BytesIO()
FigureCanvas(ax.figure).print_png(output)
return Response(output.getvalue(), mimetype='image/png')
# compare confirmed case curve with other countries
@app.route('/compare-active.png')
def vs_country():
comp_nt_phrase = request.args.get('country')
comp_nt = load_json_Data(country_summary.format(comp_nt_phrase))
comp_nt = world.active_summary(comp_nt)
comp_nt = comp_nt[comp_nt['Active'] >= 1000].reset_index()
comp_nt[comp_nt_phrase] = comp_nt['Active']
comp_nt = comp_nt.loc[:,[comp_nt_phrase]]
india = load_csv_data(case_time_series)
compared = ind.cases_confirmed_total_chart(india)
compared['India'] = compared['Total Confirmed']
compared = compared[compared['India'] >=1000].reset_index()
compared = compared.loc[:,['India']]
# compared['Active (KOR)'] = comp_nt['Active'].to_numpy()
compared = pd.concat([compared, comp_nt], axis=1)
ax = compared.plot(figsize=(10,5))
ax.set_xlabel('Days from 1000 cases')
return chartImage(ax)
@app.route('/death.png')
def death_rate():
data = load_csv_data(state_wise_summary)
death_rate = ind.state_wise_death_ratio(data)
death_rate = death_rate.set_index('State')
ax = death_rate.plot(figsize=(10,7), kind='bar')
ax.set_ylabel('Percentage')
return chartImage(ax)
@app.route('/state-top.png')
def state_top():
data = load_csv_data(state_wise_time_series)
top_states = ind.top_growing_states(data)
ax = top_states.plot(figsize=(10,7), kind='bar')
ax.set_ylabel('Avg. New Cases / day')
return chartImage(ax)
@app.route('/new.png')
def new_cases():
data = load_csv_data(case_time_series)
data = data.tail(90)
growth_rates = ind.new_and_recovered(data)
growth_rates = growth_rates.set_index('Date')
ax = growth_rates.plot(figsize=(10,5))
return chartImage(ax)
@app.route('/growth.png')
def growth_rate():
data = load_csv_data(case_time_series)
data = data.tail(180)
#data = data.head(45)
growth_rates = ind.cases_growth_chart(data)
growth_rates = growth_rates.set_index('Date')
ax = growth_rates.plot(figsize=(10,8), grid=True)
ax.set_ylabel('Growth %age')
return chartImage(ax)
@app.route('/total.png')
def total():
data = load_csv_data(case_time_series)
data = data.tail(90)
growth_rates = ind.cases_total_chart(data)
growth_rates = growth_rates.set_index('Date')
ax = growth_rates.plot(figsize=(10,5), grid=True)
return chartImage(ax)
@app.route('/', methods=['GET', 'POST'])
def home():
return render_template('home.htm')