Esse repositório contém os scripts em Python que alimentam o aplicativo.
Na prática, assim que o usuário informa sua localização, a API do site chama os métodos que estão no diretório code
para obter os dados necessários para a visualização de dados.
Os dados usados vêm do Censo de 2010 IBGE e do Brasil.io.
É importante frisar que o raio populacional exibido é referente ao total de habitantes da região do usuário na época de realização do último Censo, há cerca de dez anos. Esses são os dados mais recentes possíveis para esse nível de detalhamento.
Além disso, o cálculo parte do pressuposto que a população é distribuída homogeneamente dentro de cada setor censitário, o que não é necessariamente verdade, especialmente para blocos de maior área.
Para reproduzir os resultados em sua própria máquina, você precisa configurar seu ambiente de desenvolvimento da seguinte maneira:
Clone o repositório
Baixe este arquivo compactado e extraia no diretório data
.
Instale os requerimentos em um ambiente virtual do Anaconda com os seguinte comandos:
conda create -n gpd_0.8
conda activate gpd_0.8
conda config --env --add channels conda-forge
conda config --env --set channel_priority strict
conda install python=3 geopandas
conda install pygeos --channel conda-forge
conda install feather-format
conda install requests
Ou, caso prefira isntalar com outro método, veja a sessão Using the optional PyGEOS dependency da documentação do GeoPandas.
Caso queira gerar também os pontos que aparecem no mapa, execute python generate_points.py
. Isso deve demorar um bocado e é opcional.
Use python prepare.py
para pré-processar diversos dados, o que vai otimizar o processo de cálculo.
Use python run_query.py lat lon
para obter um objeto JSON-like com as informações necessárias para gerar a visualização de dados personalizada.
O arquivo update.py
deve ser executado repetidamente em um intervalo fixo de tempo via cron ou mecanismo semelhante. Ele é responsável por atualizar a contagem de casos de covid-19 no país, além de já calcular previamente o raio de mortes nas principais cidades do país.
Tenha em mente que o aplicativo roda em um ambiente Anaconda, criado exatamente seguindo as especificações desse tutorial, em um servidor Ubuntu 18.04. Não fizemos testes em outras configurações, mas sinta-se a vontade para abrir um issue caso encontre algum problema.
code
Esse diretório contém os scripts que processam os dados necessários para o funcionamento.
app.py: implementa a API do aplicativo usando o framework Flask
generate_points.py: gera um arquivo no formato geojson com (aproximadamente) um ponto para cada habitante do país. O cálculo é feito gerando pontos de forma aleatória em um bounding box que envolve cada setor censitário. Ao fim do processo, removemos os pontos que foram gerados fora do setor. Para minimzar estes erros, estimamos a razão entre as áreas do bounding box e a área do setor e geramos pontos suficientes para compensar aqueles que ficaram fora dos limites. Usamos essa estratégia porque gerar apenas pontos que estejam garantidamente dentro do setor censitário, um polígono complexo, é computacionalmente dispendioso.
prepare.py: script que encapsula as funções abaixo, que servem para pré-processar os dados necessários para execução dos cálculos
prepare_capitals_radius.py: calcula o raio de mortes a partir de locais turísticos de dez capitais brasileiras e salva em um arquivo JSON. O método de cálculo é o mesmo utilizado no arquivo run_query.py
.
prepare_city_bboxes.py: divide o mapa do Brasil em 400 bounding boxes que contém os limites dos municípios e salva o resultado em arquivos no formato feather. Esse pré-processamento é necessário para melhorar o tempo de execução da função do arquivo run_query.py
que encontra a cidade mais próxima ao usuário.
prepate_city_centroids.py: salva os centróides das cidades do país em um arquivo no formato feather, otimizado para melhorar o tempo de leitura.
prepare_covid_count.py: envia uma requisição para os servidores do Brasil.io e processa a resposta, salvando um arquivo JSON com dados sobre a quantidade de mortes por Covid 19 no país.
prepare_tracts_bboxes.py: Usa o mesmo método do arquivo prepare_city_bboxes.py
para dividir os setores censitários do Brasil em cerca de 10 mil arquivos diferentes, otimizando o tempo de carregamento.
run_query.py: arquivo que gera os dados que são exibidos para o usuário do aplicativo: o raio de mortes ao redor da localização, a cidade mais próxima que desapareceria e o raio de mortes ao redor do centro de duas capitais. Descrevemos em mais detalhes como a computação funciona na sessão Metodologia detalhada, logo abaixo.
update.py: script que encapsula as funções de e prepare_capitals_radius.py
e prepare_covid_count.py
, de forma a atualizar periodicamente os dados estáticos do alicativo.
data
Contém informações sobre a divisão do país em setores censitários. Esses arquivos serão pré-processados para permitir que a execução aconteça de forma mais rápida.
O algoritmo que calcula as informações exibidas para o usuário foi implementado no arquivo run_query.py
. Confira abaixo uma descrição passo-a-passo do processo:
point = parse_input(point)
prepare_covid_count.py
para descobrir o total de pessoas que precisam estar contidas no raio.target = get_covid_count(measure='deaths')
gdf = find_user_area(point, target)
gdf["geometry"] = gdf.geometry.buffer(0)
spatial_index = gdf.sindex
radius_data = find_radius(point, gdf, spatial_index, target)
Essa função, por ser a mais complexa do programa, merece uma descrição mais detalhada.
a) De início, o ponto fornecido pelo usuário é colocado em cima do mapa.
b) Um buffer de 0.01 graus é aplicado no ponto, que assim se torna um polígono circular.
c) Verificamos então quais setores censitários fazem interseção com o círculo.
d) Calulamos o percentual de interseção de cada um desses setores e somamos a população de forma proporcional. Por exemplo, caso um setor censitário de 100 habitantes esteja completamente dentro do círculo, somamos as 100 pessoas que moram lá. Caso esse mesmo setor só esteja 30% dentro do círculo, somamos apenas 30 pessoas.
e) Caso a população no raio seja inferior ao total de mortos por Covid-19 no Brasil, aumentamos o buffer em 50% e repetimos o processo a partir do passo C.
f) Definimos um intervalo de tolerância para a população que está dentro do círculo: entre 90% e 110% do total de mortos.
g) Definimos um degrau para alterar o tamanho do buffer a cada iteração subsequente: de início, 50%.
h) Caso o total de pessoas no círculo esteja dentro do intervalo de tolerância, a função se resolve e retorna as coordenadas do raio.
i) Caso o total de pessoas no círculo seja superior ao intervalo de tolerância, diminuímos o tamanho do raio pelo valor do degrau.
j) Caso o total de pessoas no círculo seja inferior ao intervalo de tolerância, aumentamos o tamanho do raio pelo valor do degrau.
k) Verificamos novamente quais setores censitários fazem interseção com o círculo.
l) Calulamos outra vez o percentual de interseção de cada um desses setores e somamos a população de forma proporcional.
m) Para as próximas iterações, o degrau é diminuído pela metade: em vez de 50%, a alteração de tamanho passa para 25%, 12.5%... e assim sucessivamente.
n) Se necessário, repetimos a operação a partir do item H.
city_data = find_user_city(point, target)
city_centroids = gpd.read_feather("../output/city_centroids.feather")
nearest_neighbor
do Shapely, o programa calcula qual é a cidade mais próxima do usuário que iria "desaparecer" - ou seja, que tem menos habitantes do que o total de mortes no Brasilneighbor_data = find_neighboring_city(point, target, city_centroids)
capitals_data = choose_capitals(point, city_data["code_muni"], city_centroids)
Bumps certifi from 2020.4.5.2 to 2022.12.7.
9e9e840
2022.12.07b81bdb2
2022.09.24939a28f
2022.09.14aca828a
2022.06.15.2de0eae1
Only use importlib.resources's new files() / Traversable API on Python ≥3.11 ...b8eb5e9
2022.06.15.147fb7ab
Fix deprecation warning on Python 3.11 (#199)b0b48e0
fixes #198 -- update link in license9d514b4
2022.06.154151e88
Add py.typed to MANIFEST.in to package in sdist (#196)Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase
.
Bumps nbconvert from 5.6.1 to 6.5.1.
Sourced from nbconvert's releases.
Release 6.5.1
No release notes provided.
6.5.0
What's Changed
- Drop dependency on testpath. by
@anntzer
in jupyter/nbconvert#1723- Adopt pre-commit by
@blink1073
in jupyter/nbconvert#1744- Add pytest settings and handle warnings by
@blink1073
in jupyter/nbconvert#1745- Apply Autoformatters by
@blink1073
in jupyter/nbconvert#1746- Add git-blame-ignore-revs by
@blink1073
in jupyter/nbconvert#1748- Update flake8 config by
@blink1073
in jupyter/nbconvert#1749- support bleach 5, add packaging and tinycss2 dependencies by
@bollwyvl
in jupyter/nbconvert#1755- [pre-commit.ci] pre-commit autoupdate by
@pre-commit-ci
in jupyter/nbconvert#1752- update cli example by
@leahecole
in jupyter/nbconvert#1753- Clean up pre-commit by
@blink1073
in jupyter/nbconvert#1757- Clean up workflows by
@blink1073
in jupyter/nbconvert#1750New Contributors
@pre-commit-ci
made their first contribution in jupyter/nbconvert#1752Full Changelog: https://github.com/jupyter/nbconvert/compare/6.4.5...6.5
6.4.3
What's Changed
- Add section to
customizing
showing how to use template inheritance by@stefanv
in jupyter/nbconvert#1719- Remove ipython genutils by
@rgs258
in jupyter/nbconvert#1727- Update changelog for 6.4.3 by
@blink1073
in jupyter/nbconvert#1728New Contributors
@stefanv
made their first contribution in jupyter/nbconvert#1719@rgs258
made their first contribution in jupyter/nbconvert#1727Full Changelog: https://github.com/jupyter/nbconvert/compare/6.4.2...6.4.3
6.4.0
What's Changed
- Optionally speed up validation by
@gwincr11
in jupyter/nbconvert#1672- Adding missing div compared to JupyterLab DOM structure by
@SylvainCorlay
in jupyter/nbconvert#1678- Allow passing extra args to code highlighter by
@yuvipanda
in jupyter/nbconvert#1683- Prevent page breaks in outputs when printing by
@SylvainCorlay
in jupyter/nbconvert#1679- Add collapsers to template by
@SylvainCorlay
in jupyter/nbconvert#1689- Fix recent pandoc latex tables by adding calc and array (#1536, #1566) by
@cgevans
in jupyter/nbconvert#1686- Add an invalid notebook error by
@gwincr11
in jupyter/nbconvert#1675- Fix typos in execute.py by
@TylerAnderson22
in jupyter/nbconvert#1692- Modernize latex greek math handling (partially fixes #1673) by
@cgevans
in jupyter/nbconvert#1687- Fix use of deprecated API and update test matrix by
@blink1073
in jupyter/nbconvert#1696- Update nbconvert_library.ipynb by
@letterphile
in jupyter/nbconvert#1695- Changelog for 6.4 by
@blink1073
in jupyter/nbconvert#1697New Contributors
... (truncated)
7471b75
Release 6.5.1c1943e0
Fix pre-commit8685e93
Fix tests0abf290
Run black and prettier418d545
Run test on 6.x branchbef65d7
Convert input to string prior to escape HTML0818628
Check input type before escapingb206470
GHSL-2021-1017, GHSL-2021-1020, GHSL-2021-1021a03cbb8
GHSL-2021-1026, GHSL-2021-102548fe71e
GHSL-2021-1024Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase
.
Bumps mistune from 0.8.4 to 2.0.3.
Sourced from mistune's releases.
Version 2.0.2
Fix
escape_url
via lepture/mistune#295Version 2.0.1
Fix XSS for image link syntax.
Version 2.0.0
First release of Mistune v2.
Version 2.0.0 RC1
In this release, we have a Security Fix for harmful links.
Version 2.0.0 Alpha 1
This is the first release of v2. An alpha version for users to have a preview of the new mistune.
Sourced from mistune's changelog.
Changelog
Here is the full history of mistune v2.
Version 2.0.4
Released on Jul 15, 2022
- Fix
url
plugin in<a>
tag- Fix
*
formattingVersion 2.0.3
Released on Jun 27, 2022
- Fix
table
plugin- Security fix for CVE-2022-34749
Version 2.0.2
Released on Jan 14, 2022
Fix
escape_url
Version 2.0.1
Released on Dec 30, 2021
XSS fix for image link syntax.
Version 2.0.0
Released on Dec 5, 2021
This is the first non-alpha release of mistune v2.
Version 2.0.0rc1
Released on Feb 16, 2021
Version 2.0.0a6
</tr></table>
... (truncated)
3f422f1
Version bump 2.0.3a6d4321
Fix asteris emphasis regex CVE-2022-347495638e46
Merge pull request #307 from jieter/patch-10eba471
Fix typo in guide.rst61e9337
Fix table plugin76dec68
Add documentation for renderer heading when TOC enabled799cd11
Version bump 2.0.2babb0cf
Merge pull request #295 from dairiki/bug.escape_urlfc2cd53
Make mistune.util.escape_url less aggressive3e8d352
Version bump 2.0.1Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase
.
Bumps notebook from 6.0.3 to 6.4.12.
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase
.
Bumps ipython from 7.13.0 to 7.16.3.
d43c7c7
release 7.16.35fa1e40
Merge pull request from GHSA-pq7m-3gw7-gq5x8df8971
back to dev9f477b7
release 7.16.2138f266
bring back release helper from master branch5aa3634
Merge pull request #13341 from meeseeksmachine/auto-backport-of-pr-13335-on-7...bcae8e0
Backport PR #13335: What's new 7.16.28fcdcd3
Pin Jedi to <0.17.2.2486838
release 7.16.120bdc6f
fix conda buildDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase
.
Bumps pygments from 2.6.1 to 2.7.4.
Sourced from pygments's releases.
2.7.4
Updated lexers:
Fix infinite loop in SML lexer (#1625)
Fix backtracking string regexes in JavaScript/TypeScript, Modula2 and many other lexers (#1637)
Limit recursion with nesting Ruby heredocs (#1638)
Fix a few inefficient regexes for guessing lexers
Fix the raw token lexer handling of Unicode (#1616)
Revert a private API change in the HTML formatter (#1655) -- please note that private APIs remain subject to change!
Fix several exponential/cubic-complexity regexes found by Ben Caller/Doyensec (#1675)
Fix incorrect MATLAB example (#1582)
Thanks to Google's OSS-Fuzz project for finding many of these bugs.
2.7.3
... (truncated)
Sourced from pygments's changelog.
Version 2.7.4
(released January 12, 2021)
Updated lexers:
Fix infinite loop in SML lexer (#1625)
Fix backtracking string regexes in JavaScript/TypeScript, Modula2 and many other lexers (#1637)
Limit recursion with nesting Ruby heredocs (#1638)
Fix a few inefficient regexes for guessing lexers
Fix the raw token lexer handling of Unicode (#1616)
Revert a private API change in the HTML formatter (#1655) -- please note that private APIs remain subject to change!
Fix several exponential/cubic-complexity regexes found by Ben Caller/Doyensec (#1675)
Fix incorrect MATLAB example (#1582)
Thanks to Google's OSS-Fuzz project for finding many of these bugs.
Version 2.7.3
(released December 6, 2020)
... (truncated)
4d555d0
Bump version to 2.7.4.fc3b05d
Update CHANGES.ad21935
Revert "Added dracula theme style (#1636)"e411506
Prepare for 2.7.4 release.275e34d
doc: remove Perl 6 ref2e7e8c4
Fix several exponential/cubic complexity regexes found by Ben Caller/Doyenseceb39c43
xquery: fix pop from empty stack2738778
fix coding style in test_analyzer_lexer02e0f09
Added 'ERROR STOP' to fortran.py keywords. (#1665)c83fe48
support added for css variables (#1633)Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase
.