Skip to content
This repository has been archived by the owner on Mar 29, 2022. It is now read-only.

Dados por município e/ou cidade (algo mais granular que estado). #55

Merged
merged 7 commits into from
Mar 22, 2020
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 20 additions & 17 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
query_params,
load_uf_pop_data,
load_uf_covid_data,
query_ufs
query_uf_city
)
import matplotlib.pyplot as plt

Expand Down Expand Up @@ -56,28 +56,29 @@ def _run_SEIR_BAYES_model(N, E0, I0, R0,
st.sidebar.title('Seleção de parâmetros')
st.sidebar.markdown('Para simular outros cenários, altere um parâmetro e tecle **Enter**. O novo resultado será calculado e apresentado automaticamente.')

st.sidebar.markdown('#### Parâmetros de UF')
st.sidebar.markdown('#### Parâmetros de UF/Município')

UF = st.sidebar.selectbox('Estado',
options=query_ufs(),
index=0)
GRANULARITY = st.sidebar.selectbox('Unidade',
options=['Estado', 'Município'],
index=1)

dates, dt_index = query_dates(UF)

use_capital = st.sidebar.checkbox('Usar população da capital', value=True)
uf_city_list, uf_city_list_index = query_uf_city(GRANULARITY)
UF_CITY = st.sidebar.selectbox(f'{GRANULARITY}',
options=uf_city_list,
index=uf_city_list_index)

dates, dt_index = query_dates(UF_CITY, GRANULARITY)


DT = st.sidebar.selectbox('Data',
options=dates,
index=dt_index)

if UF == '(Selecione)':
_N = 13_000_000
_E0 = 50
_I0 = 152
_R0 = 1
else:
_N, _E0, _I0, _R0 = query_params(UF, DT, use_capital)

_N, _E0, _I0, _R0 = query_params(UF_CITY, DT, GRANULARITY)


st.sidebar.markdown('#### Condições iniciais')

N = st.sidebar.number_input('População total (N)',
Expand Down Expand Up @@ -164,11 +165,13 @@ def _run_SEIR_BAYES_model(N, E0, I0, R0,
st.markdown('''
>### Configurações da simulação (menu à esquerda)
>
>#### Seleção de UF
>É possível selecionar uma unidade da federação para utilizar seus parâmetros nas condições inicias de *População total* (N), *Indivíduos infecciosos inicialmente* (I0) e *Indivíduos removidos com imunidade inicialmente* (R0).
>### Seleção de Unidade
É possível selecionar o tipo de unidade (Estado ou Município).
>#### Seleção de UF/Município
>Baseado na seleção anterior, é possível selecionar uma unidade da federação ou município para utilizar seus parâmetros nas condições inicias de *População total* (N), *Indivíduos infecciosos inicialmente* (I0), *Indivíduos removidos com imunidade inicialmente* (R0) e *Indivíduos expostos inicialmente (E0)*.
>
>#### Limites inferiores e superiores dos parâmetros
>Também podem ser ajustados limites superior e inferior dos parâmetros *Período infeccioso*, *Tempo de incubação* e *Número básico de reprodução*. Estes limites definem um intervalo de confiança de 95% de uma distribuição log-normal para cada parâmetro.\n\n\n
''')
st.markdown('---')
st.markdown('###### Os dados dos casos confirmados foram coletados na [Plataforma IVIS](http://plataforma.saude.gov.br/novocoronavirus/#COVID-19-brazil) e os populacionais, obtidos do IBGE (endereço: ftp://ftp.ibge.gov.br/Estimativas_de_Populacao/Estimativas_2019/estimativa_dou_2019.xls)')
st.markdown('###### Os dados dos casos confirmados foram coletados em [Número de casos confirmados de COVID-19 no Brasil](https://raw.githubusercontent.com/wcota/covid19br/master/cases-brazil-cities-time.csv) e os populacionais, obtidos do IBGE (endereço: ftp://ftp.ibge.gov.br/Estimativas_de_Populacao/Estimativas_2019/estimativa_dou_2019.xls)')
172 changes: 42 additions & 130 deletions data/collectors.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,121 +3,33 @@
import requests


def load_uf_codes():
return (
pd.read_html(
'https://www.oobj.com.br/bc/article/'
'quais-os-c%C3%B3digos-de-cada-uf-no-brasil-465.html'
)
[0]
.set_index('Código UF')
['UF']
)


def load_ms_db():
return (
json.loads(
requests
.get(
'http://plataforma.saude.gov.br'
'/novocoronavirus/resources/scripts/database.js'
def load_dump_covid_19_data():

COVID_19_BY_CITY_URL='https://raw.githubusercontent.com/wcota/covid19br/master/cases-brazil-cities-time.csv'

by_city=(pd.read_csv(COVID_19_BY_CITY_URL)
.query('country == "Brazil"')
.drop(columns=['country'])
.pipe(lambda df: df[df.state!='TOTAL'])
.assign(city=lambda df: df.city.apply(lambda x: x.split('/')[0]))
.rename(columns={'totalCases': 'cases',
'newCases': 'new_cases',
'state': 'uf'})
.sort_values(by=['city', 'date'])
)
.text
.replace('\n', '')
.replace('var database=', '')
)
['brazil']
)


def ms_db_to_df(db):
rows = []
for d in db:
for v in d['values']:
rows.append(
[
d['date'],
v['uid'],
v.get('suspects', 0),
v.get('refuses', 0),
v.get('cases', 0),
v.get('deaths', 0)
]
)
df = (
pd.DataFrame(
rows,
columns=[
'date', 'uid', 'suspects',
'refuses', 'cases', 'deaths'
]
)
.assign(
date=lambda x: pd.to_datetime(
x['date'],
format='%d/%m/%Y'
)
)
)
return (
pd.merge(
df,
load_uf_codes(),
how='left',
left_on='uid',
right_index=True
)
.drop(['uid'], axis=1)
)


def load_ms_data():
db = load_ms_db()
df = ms_db_to_df(db)
return df


def dump_by_uf(df):
ufs = (
df['UF']
.dropna()
.unique()
)

for uf in ufs:
print(f'Saving data for UF {uf}')
(
df
[df['UF'] == uf]
.sort_values(by='date')
.drop(['UF'], axis=1)
.to_csv(
f'data/csv/by_uf/{uf}.csv',
index=False
)
)


def dump_by_day(df):
days = (
df['date']
.dropna()
.dt.strftime(date_format='%d-%m-%Y')
.unique()
)
for day in days:
print(f'Saving data for day {day}')
(
df
[df['date'].dt.strftime(date_format='%d-%m-%Y') == day]
.sort_values(by='UF')
.drop(['date'], axis=1)
.to_csv(
f'data/csv/by_day/{day}.csv',
index=False
)
)
by_uf = (by_city
.groupby(['date', 'uf'])
['new_cases', 'cases']
.sum()
.reset_index())

dfs = [by_uf, by_city]
filenames = ['by_uf', 'by_city']
for df, filename in zip(dfs, filenames):
output_path = f'data/csv/covid_19/{filename}/{filename}.csv'
df.to_csv(output_path, index=False)
print(f'{filename} data exported to {output_path}')


def load_dump_uf_pop():
Expand All @@ -132,7 +44,8 @@ def _load_uf_codes():
)
[0]
.replace('\s\(\*\)', '', regex=True)
[['Unidade da Federação', 'UF']]
.rename(columns={'UF': 'uf'})
[['Unidade da Federação', 'uf']]
)

def _load_uf_capitals():
Expand All @@ -142,8 +55,8 @@ def _load_uf_capitals():
'https://www.estadosecapitaisdobrasil.com/'
)
[0]
.rename(columns={'Sigla': 'UF', 'Capital': 'city_name'})
[['UF', 'city_name']]
.rename(columns={'Sigla': 'uf', 'Capital': 'city'})
[['uf', 'city']]
)

# TODO: download excel file only once
Expand All @@ -157,7 +70,7 @@ def _load_city_pop():
.rename(columns={
'COD. UF': 'UF_code',
'COD. MUNIC': 'city_code',
'NOME DO MUNICÍPIO': 'city_name',
'NOME DO MUNICÍPIO': 'city',
'POPULAÇÃO ESTIMADA': 'estimated_population'
})
.dropna(how='any')
Expand All @@ -169,7 +82,8 @@ def _load_city_pop():
)
.assign( UF_code=lambda df: df.UF_code.astype(int))
.assign(city_code=lambda df: df.city_code.astype(int))
[['UF', 'city_name', 'estimated_population']]
.rename(columns={'UF': 'uf'})
[['uf', 'city', 'estimated_population']]
)

def _load_uf_pop():
Expand All @@ -191,27 +105,27 @@ def _load_uf_pop():
left_on='BRASIL E UNIDADES DA FEDERAÇÃO',
right_on='Unidade da Federação',
how='inner'))
[['UF', 'estimated_population']]
[['uf', 'estimated_population']]
)

uf_pop, city_pop, uf_capitals = (_load_uf_pop(),
_load_city_pop(),
_load_uf_capitals())

print('Combining UF and city data')
print('Combining uf and city data')
uf_pop = (
uf_pop
# Add capital city name
.merge(
uf_capitals,
how='left',
on='UF'
on='uf'
)
# Add capital population
.merge(
city_pop,
how='left',
on=['UF', 'city_name']
on=['uf', 'city']
)
.rename(
columns={
Expand All @@ -222,9 +136,9 @@ def _load_uf_pop():
)

dfs = [uf_pop, city_pop]
filenames = ['uf_population', 'city_population']
filenames = ['by_uf', 'by_city']
for df, filename in zip(dfs, filenames):
output_path = f'data/csv/{filename}/{filename}.csv'
output_path = f'data/csv/population/{filename}/{filename}.csv'
df.to_csv(output_path, index=False)
print(f'{filename} data exported to {output_path}')

Expand Down Expand Up @@ -290,12 +204,10 @@ def load_jh_data():
)

if __name__ == '__main__':
try:
df = load_ms_data()
dump_by_uf(df)
dump_by_day(df)
except Exception as e:
print(f'Error when collecting COVID-19 cases data: {repr(e)}')
# try:
# load_dump_covid_19_data()
# except Exception as e:
# print(f'Error when collecting COVID-19 cases data: {repr(e)}')

try:
load_dump_uf_pop()
Expand Down
8 changes: 0 additions & 8 deletions data/csv/by_day/01-02-2020.csv

This file was deleted.

17 changes: 0 additions & 17 deletions data/csv/by_day/01-03-2020.csv

This file was deleted.

8 changes: 0 additions & 8 deletions data/csv/by_day/02-02-2020.csv

This file was deleted.

24 changes: 0 additions & 24 deletions data/csv/by_day/02-03-2020.csv

This file was deleted.

8 changes: 0 additions & 8 deletions data/csv/by_day/03-02-2020.csv

This file was deleted.

Loading