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

Commit

Permalink
Merge pull request #55 from 3778/issue-52
Browse files Browse the repository at this point in the history
Dados por município e/ou cidade (algo mais granular que estado).
  • Loading branch information
dsevero authored Mar 22, 2020
2 parents 4477298 + 9ad9275 commit 80129ec
Show file tree
Hide file tree
Showing 82 changed files with 867 additions and 1,626 deletions.
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

0 comments on commit 80129ec

Please sign in to comment.