From e5c471b41c827a5f2789ee6dc7e04d33a1fcd449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=A3=20B=2E=20Vacaro?= Date: Mon, 15 Jul 2024 16:49:46 -0300 Subject: [PATCH] docs(ibge): include pop and censo ibge documentation (#197) * docs(ibge): include pop and censo ibge documentation * Include total cases by 100k hab on SINAN example * include documentation for utilities --- docs/source/databases/SINAN.ipynb | 2 +- docs/source/databases/Utilities.ipynb | 156 ++ docs/source/tutorials/IBGE_data.ipynb | 1077 +++++++- .../tutorials/Preprocessing SINAN.ipynb | 2230 +++++++++-------- pysus/online_data/SINAN.py | 1 - pysus/utilities/brasil.py | 17 +- 6 files changed, 2279 insertions(+), 1204 deletions(-) create mode 100644 docs/source/databases/Utilities.ipynb diff --git a/docs/source/databases/SINAN.ipynb b/docs/source/databases/SINAN.ipynb index 4cc4130..d94abe2 100644 --- a/docs/source/databases/SINAN.ipynb +++ b/docs/source/databases/SINAN.ipynb @@ -1209,7 +1209,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.11.8" }, "vscode": { "interpreter": { diff --git a/docs/source/databases/Utilities.ipynb b/docs/source/databases/Utilities.ipynb new file mode 100644 index 0000000..95bf895 --- /dev/null +++ b/docs/source/databases/Utilities.ipynb @@ -0,0 +1,156 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c153a255-ad53-4b27-b689-4c119ea8cc52", + "metadata": {}, + "source": [ + "## Utilities module\n", + "\n", + "Some helper functions that are used throughout the package: " + ] + }, + { + "cell_type": "markdown", + "id": "c5c639e6-fa54-482a-a91d-20a8bbe05206", + "metadata": {}, + "source": [ + "### brasil" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "451830fc-04af-4003-8e70-c71d61a57ac5", + "metadata": {}, + "outputs": [], + "source": [ + "from pysus.utilities import brasil" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "76a37da8-7b41-4565-83e2-e23bfbeae5bb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'BR': 'Brasil',\n", + " 'AC': 'Acre',\n", + " 'AL': 'Alagoas',\n", + " 'AP': 'Amapá',\n", + " 'AM': 'Amazonas',\n", + " 'BA': 'Bahia',\n", + " 'CE': 'Ceará',\n", + " 'ES': 'Espírito Santo',\n", + " 'GO': 'Goiás',\n", + " 'MA': 'Maranhão',\n", + " 'MT': 'Mato Grosso',\n", + " 'MS': 'Mato Grosso do Sul',\n", + " 'MG': 'Minas Gerais',\n", + " 'PA': 'Pará',\n", + " 'PB': 'Paraíba',\n", + " 'PR': 'Paraná',\n", + " 'PE': 'Pernambuco',\n", + " 'PI': 'Piauí',\n", + " 'RJ': 'Rio de Janeiro',\n", + " 'RN': 'Rio Grande do Norte',\n", + " 'RS': 'Rio Grande do Sul',\n", + " 'RO': 'Rondônia',\n", + " 'RR': 'Roraima',\n", + " 'SC': 'Santa Catarina',\n", + " 'SP': 'São Paulo',\n", + " 'SE': 'Sergipe',\n", + " 'TO': 'Tocantins',\n", + " 'DF': 'Distrito Federal'}" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brasil.UFs" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "965a2323-066c-45af-83f7-b20ece735089", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{1: 'Janeiro',\n", + " 2: 'Fevereiro',\n", + " 3: 'Março',\n", + " 4: 'Abril',\n", + " 5: 'Maio',\n", + " 6: 'Junho',\n", + " 7: 'Julho',\n", + " 8: 'Agosto',\n", + " 9: 'Setembro',\n", + " 10: 'Outubro',\n", + " 11: 'Novembro',\n", + " 12: 'Dezembro'}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "brasil.MONTHS" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "573f2f20-f038-4384-b6f2-558bad80f276", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Rio de Janeiro'" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Get municipality name by IBGE's geocode \n", + "# https://www.ibge.gov.br/explica/codigos-dos-municipios.php\n", + "brasil.get_city_name_by_geocode(3304557)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/source/tutorials/IBGE_data.ipynb b/docs/source/tutorials/IBGE_data.ipynb index 018a1e5..0d3901b 100644 --- a/docs/source/tutorials/IBGE_data.ipynb +++ b/docs/source/tutorials/IBGE_data.ipynb @@ -28,6 +28,7 @@ "source": [ "import pandas as pd\n", "from pysus.online_data import IBGE\n", + "from pysus.ftp.utils import zfill_year\n", "\n", "import ipywidgets as widgets\n", "%matplotlib inline" @@ -98,25 +99,25 @@ " 1\n", " CL\n", " Cadastro Central de Empresas\n", - " [{'id': '1732', 'nome': 'Dados gerais das empr...\n", + " [{'id': '1685', 'nome': 'Unidades locais, empr...\n", " \n", " \n", " 2\n", " CA\n", " Censo Agropecuário\n", - " [{'id': '1278', 'nome': 'Agroindústria rural n...\n", + " [{'id': '1005', 'nome': 'Número de estabelecim...\n", " \n", " \n", " 3\n", " ME\n", " Censo Comum do Mercosul, Bolívia e Chile\n", - " [{'id': '2059', 'nome': 'Domicílios e Populaçã...\n", + " [{'id': '1221', 'nome': 'População residente, ...\n", " \n", " \n", " 4\n", " CD\n", " Censo Demográfico\n", - " [{'id': '1301', 'nome': 'Área e Densidade demo...\n", + " [{'id': '102', 'nome': 'Mulheres de 10 anos ou...\n", " \n", " \n", " ...\n", @@ -125,38 +126,38 @@ " ...\n", " \n", " \n", - " 62\n", + " 63\n", " VS\n", " Produção da Extração Vegetal e da Silvicultura\n", - " [{'id': '5930', 'nome': 'Área total existente ...\n", + " [{'id': '289', 'nome': 'Quantidade produzida e...\n", " \n", " \n", - " 63\n", + " 64\n", " PO\n", " Produção de Ovos de Galinha\n", - " [{'id': '915', 'nome': 'Número de informantes,...\n", + " [{'id': '6672', 'nome': 'Quantidade de ovos pr...\n", " \n", " \n", - " 64\n", + " 65\n", " IO\n", " Produto Interno Bruto dos Municípios\n", - " [{'id': '599', 'nome': 'Índice de Gini do prod...\n", + " [{'id': '21', 'nome': 'Produto interno bruto a...\n", " \n", " \n", - " 65\n", + " 66\n", " XE\n", " Projeção da População\n", - " [{'id': '7362', 'nome': 'Esperança de vida ao ...\n", + " [{'id': '7358', 'nome': 'População, por sexo e...\n", " \n", " \n", - " 66\n", + " 67\n", " SI\n", " Sistema Nacional de Pesquisa de Custos e Índic...\n", - " [{'id': '33', 'nome': 'Custo de projeto m², po...\n", + " [{'id': '2062', 'nome': 'Preços medianos, por ...\n", " \n", " \n", "\n", - "

67 rows × 3 columns

\n", + "

68 rows × 3 columns

\n", "" ], "text/plain": [ @@ -167,26 +168,26 @@ "3 ME Censo Comum do Mercosul, Bolívia e Chile \n", "4 CD Censo Demográfico \n", ".. .. ... \n", - "62 VS Produção da Extração Vegetal e da Silvicultura \n", - "63 PO Produção de Ovos de Galinha \n", - "64 IO Produto Interno Bruto dos Municípios \n", - "65 XE Projeção da População \n", - "66 SI Sistema Nacional de Pesquisa de Custos e Índic... \n", + "63 VS Produção da Extração Vegetal e da Silvicultura \n", + "64 PO Produção de Ovos de Galinha \n", + "65 IO Produto Interno Bruto dos Municípios \n", + "66 XE Projeção da População \n", + "67 SI Sistema Nacional de Pesquisa de Custos e Índic... \n", "\n", " agregados \n", "0 [{'id': '8418', 'nome': 'Áreas urbanizadas, Lo... \n", - "1 [{'id': '1732', 'nome': 'Dados gerais das empr... \n", - "2 [{'id': '1278', 'nome': 'Agroindústria rural n... \n", - "3 [{'id': '2059', 'nome': 'Domicílios e Populaçã... \n", - "4 [{'id': '1301', 'nome': 'Área e Densidade demo... \n", + "1 [{'id': '1685', 'nome': 'Unidades locais, empr... \n", + "2 [{'id': '1005', 'nome': 'Número de estabelecim... \n", + "3 [{'id': '1221', 'nome': 'População residente, ... \n", + "4 [{'id': '102', 'nome': 'Mulheres de 10 anos ou... \n", ".. ... \n", - "62 [{'id': '5930', 'nome': 'Área total existente ... \n", - "63 [{'id': '915', 'nome': 'Número de informantes,... \n", - "64 [{'id': '599', 'nome': 'Índice de Gini do prod... \n", - "65 [{'id': '7362', 'nome': 'Esperança de vida ao ... \n", - "66 [{'id': '33', 'nome': 'Custo de projeto m², po... \n", + "63 [{'id': '289', 'nome': 'Quantidade produzida e... \n", + "64 [{'id': '6672', 'nome': 'Quantidade de ovos pr... \n", + "65 [{'id': '21', 'nome': 'Produto interno bruto a... \n", + "66 [{'id': '7358', 'nome': 'População, por sexo e... \n", + "67 [{'id': '2062', 'nome': 'Preços medianos, por ... \n", "\n", - "[67 rows x 3 columns]" + "[68 rows x 3 columns]" ] }, "execution_count": 2, @@ -251,108 +252,108 @@ " \n", " \n", " 0\n", - " 479\n", - " Chefes de domicílios particulares permanentes ...\n", + " 305\n", + " População residente em domicílios particulares...\n", " \n", " \n", " 1\n", - " 798\n", - " Domicílios particulares ocupados por sexo da p...\n", + " 319\n", + " Média de moradores por domicílio particular pe...\n", " \n", " \n", " 2\n", - " 482\n", - " Domicílios particulares permanentes por sexo d...\n", + " 472\n", + " População residente por idade, forma de declar...\n", " \n", " \n", " 3\n", - " 580\n", - " Domicílios particulares permanentes, População...\n", + " 473\n", + " Pessoas de 4 anos ou mais de idade por grupos ...\n", " \n", " \n", " 4\n", - " 579\n", - " Domicílios particulares permanentes, População...\n", + " 475\n", + " População residente por grupos de idade, sexo ...\n", " \n", " \n", " 5\n", - " 797\n", - " Domicílios recenseados por espécie de domicílio\n", + " 476\n", + " Pessoas de 4 anos ou mais de idade por frequên...\n", " \n", " \n", " 6\n", - " 319\n", - " Média de moradores por domicílio particular pe...\n", + " 477\n", + " Pessoas de 4 anos ou mais que frequentam escol...\n", " \n", " \n", " 7\n", - " 553\n", - " Média de moradores por domicílio particular pe...\n", + " 478\n", + " Pessoas não residentes no município de residên...\n", " \n", " \n", " 8\n", - " 481\n", - " Média de moradores por domicílio particular pe...\n", + " 479\n", + " Chefes de domicílios particulares permanentes ...\n", " \n", " \n", " 9\n", - " 552\n", - " Média de moradores por domicílio particular pe...\n", + " 480\n", + " População residente por relação com o chefe do...\n", " \n", " \n", " 10\n", - " 476\n", - " Pessoas de 4 anos ou mais de idade por frequên...\n", + " 481\n", + " Média de moradores por domicílio particular pe...\n", " \n", " \n", " 11\n", - " 473\n", - " Pessoas de 4 anos ou mais de idade por grupos ...\n", + " 482\n", + " Domicílios particulares permanentes por sexo d...\n", " \n", " \n", " 12\n", - " 477\n", - " Pessoas de 4 anos ou mais que frequentam escol...\n", + " 484\n", + " Pessoas não residentes no município de residên...\n", " \n", " \n", " 13\n", - " 484\n", - " Pessoas não residentes no município de residên...\n", + " 552\n", + " Média de moradores por domicílio particular pe...\n", " \n", " \n", " 14\n", - " 478\n", - " Pessoas não residentes no município de residên...\n", + " 553\n", + " Média de moradores por domicílio particular pe...\n", " \n", " \n", " 15\n", - " 794\n", - " População recenseada por situação do domicílio...\n", + " 579\n", + " Domicílios particulares permanentes, População...\n", " \n", " \n", " 16\n", - " 793\n", - " População residente\n", + " 580\n", + " Domicílios particulares permanentes, População...\n", " \n", " \n", " 17\n", - " 305\n", - " População residente em domicílios particulares...\n", + " 793\n", + " População residente\n", " \n", " \n", " 18\n", - " 475\n", - " População residente por grupos de idade, sexo ...\n", + " 794\n", + " População recenseada por situação do domicílio...\n", " \n", " \n", " 19\n", - " 472\n", - " População residente por idade, forma de declar...\n", + " 797\n", + " Domicílios recenseados por espécie de domicílio\n", " \n", " \n", " 20\n", - " 480\n", - " População residente por relação com o chefe do...\n", + " 798\n", + " Domicílios particulares ocupados por sexo da p...\n", " \n", " \n", "\n", @@ -360,27 +361,27 @@ ], "text/plain": [ " id nome\n", - "0 479 Chefes de domicílios particulares permanentes ...\n", - "1 798 Domicílios particulares ocupados por sexo da p...\n", - "2 482 Domicílios particulares permanentes por sexo d...\n", - "3 580 Domicílios particulares permanentes, População...\n", - "4 579 Domicílios particulares permanentes, População...\n", - "5 797 Domicílios recenseados por espécie de domicílio\n", - "6 319 Média de moradores por domicílio particular pe...\n", - "7 553 Média de moradores por domicílio particular pe...\n", - "8 481 Média de moradores por domicílio particular pe...\n", - "9 552 Média de moradores por domicílio particular pe...\n", - "10 476 Pessoas de 4 anos ou mais de idade por frequên...\n", - "11 473 Pessoas de 4 anos ou mais de idade por grupos ...\n", - "12 477 Pessoas de 4 anos ou mais que frequentam escol...\n", - "13 484 Pessoas não residentes no município de residên...\n", - "14 478 Pessoas não residentes no município de residên...\n", - "15 794 População recenseada por situação do domicílio...\n", - "16 793 População residente\n", - "17 305 População residente em domicílios particulares...\n", - "18 475 População residente por grupos de idade, sexo ...\n", - "19 472 População residente por idade, forma de declar...\n", - "20 480 População residente por relação com o chefe do..." + "0 305 População residente em domicílios particulares...\n", + "1 319 Média de moradores por domicílio particular pe...\n", + "2 472 População residente por idade, forma de declar...\n", + "3 473 Pessoas de 4 anos ou mais de idade por grupos ...\n", + "4 475 População residente por grupos de idade, sexo ...\n", + "5 476 Pessoas de 4 anos ou mais de idade por frequên...\n", + "6 477 Pessoas de 4 anos ou mais que frequentam escol...\n", + "7 478 Pessoas não residentes no município de residên...\n", + "8 479 Chefes de domicílios particulares permanentes ...\n", + "9 480 População residente por relação com o chefe do...\n", + "10 481 Média de moradores por domicílio particular pe...\n", + "11 482 Domicílios particulares permanentes por sexo d...\n", + "12 484 Pessoas não residentes no município de residên...\n", + "13 552 Média de moradores por domicílio particular pe...\n", + "14 553 Média de moradores por domicílio particular pe...\n", + "15 579 Domicílios particulares permanentes, População...\n", + "16 580 Domicílios particulares permanentes, População...\n", + "17 793 População residente\n", + "18 794 População recenseada por situação do domicílio...\n", + "19 797 Domicílios recenseados por espécie de domicílio\n", + "20 798 Domicílios particulares ocupados por sexo da p..." ] }, "execution_count": 3, @@ -444,8 +445,8 @@ " \n", " \n", " 0\n", - " 7362\n", - " Esperança de vida ao nascer e Taxa de mortalid...\n", + " 7358\n", + " População, por sexo e idade\n", " \n", " \n", " 1\n", @@ -454,18 +455,18 @@ " \n", " \n", " 2\n", - " 7358\n", - " População, por sexo e idade\n", + " 7362\n", + " Esperança de vida ao nascer e Taxa de mortalid...\n", " \n", " \n", " 3\n", - " 7365\n", - " Proporção de pessoas, por grupo de idade\n", + " 7363\n", + " Taxa específica de fecundidade, por grupo de i...\n", " \n", " \n", " 4\n", - " 7363\n", - " Taxa específica de fecundidade, por grupo de i...\n", + " 7365\n", + " Proporção de pessoas, por grupo de idade\n", " \n", " \n", "\n", @@ -473,11 +474,11 @@ ], "text/plain": [ " id nome\n", - "0 7362 Esperança de vida ao nascer e Taxa de mortalid...\n", + "0 7358 População, por sexo e idade\n", "1 7360 Indicadores implícitos na projeção da população\n", - "2 7358 População, por sexo e idade\n", - "3 7365 Proporção de pessoas, por grupo de idade\n", - "4 7363 Taxa específica de fecundidade, por grupo de i..." + "2 7362 Esperança de vida ao nascer e Taxa de mortalid...\n", + "3 7363 Taxa específica de fecundidade, por grupo de i...\n", + "4 7365 Proporção de pessoas, por grupo de idade" ] }, "execution_count": 4, @@ -517,12 +518,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c70f902c99ee451393f7ef18e1699499", + "model_id": "4b34f6337bfd460196a6967f849b9866", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Dropdown(description='Number:', index=18, options=(('Chefes de domicílios particulares permanentes por grupos …" + "Dropdown(description='Number:', index=4, options=(('População residente em domicílios particulares permanentes…" ] }, "metadata": {}, @@ -1942,13 +1943,869 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%%\n" } }, + "source": [ + "## Retrieving population and census data from IBGE" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function get_population in module pysus.online_data.IBGE:\n", + "\n", + "get_population(year: int, source: Literal['POP', 'censo', 'POPTCU', 'projpop'] = 'POPTCU', censo_data: Literal['ALF', 'ESCA', 'ESCB', 'IDOSO', 'RENDA'] = 'ALF') -> pandas.core.frame.DataFrame\n", + " Get population data from IBGE as shared by DATASUS\n", + " :param year: year of the data\n", + " :param source: \n", + " \"POP\" - 1992-presente: Estimativas populacionais estratificadas por \n", + " idade e sexo.\n", + " \"censo\" - 1991, 2000 e 2010: Censos Demográficos\n", + " \"POPTCU\" - 1992-presente: Estimativas populacionais enviadas para o TCU,\n", + " estratificadas por idade e sexo pelo MS/SGEP/Datasus.\n", + " \"projpop\": Estimativas preliminares para os anos intercensitários dos \n", + " totais populacionais, estratificadas por idade e sexo pelo \n", + " MS/SGEP/Datasus.\n", + " :param censo_data: \n", + " \"ALF\": Censo Demográfico\n", + " \"ESCA\": Censo Escolar da Educação Básica\n", + " \"ESCB\": Censo Escolar da Educação Superior\n", + " \"IDOSO\": População de pessoas com 65 anos ou mais\n", + " \"RENDA\": População de pessoas de acordo com a renda familiar\n", + " :return: DataFrame with population data\n", + "\n" + ] + } + ], + "source": [ + "help(IBGE.get_population)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sources:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### POP\n", + "Population estimates stratified by age and sex" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# Available years for `POP`:\n", + "def get_available_years(source):\n", + " return sorted(set([zfill_year(f.name[-2:]) for f in IBGE.ibge.get_files(source=source)]))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('The years available for source `POP` are: [1992, 1993, 1994, 1995, 1997, '\n", + " '1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, '\n", + " '2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021]')\n" + ] + } + ], + "source": [ + "from pprint import pprint\n", + "pprint(f\"The years available for source `POP` are: {get_available_years('POP')}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MUNIC_RESANOPOPULACAO
0110001199234768
1110002199261737
211000319928633
3110004199272462
4110005199223280
............
496952219019923361
497052220019929135
497152220519925384
497252222019922942
497353001019921639035
\n", + "

4974 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " MUNIC_RES ANO POPULACAO\n", + "0 110001 1992 34768\n", + "1 110002 1992 61737\n", + "2 110003 1992 8633\n", + "3 110004 1992 72462\n", + "4 110005 1992 23280\n", + "... ... ... ...\n", + "4969 522190 1992 3361\n", + "4970 522200 1992 9135\n", + "4971 522205 1992 5384\n", + "4972 522220 1992 2942\n", + "4973 530010 1992 1639035\n", + "\n", + "[4974 rows x 3 columns]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IBGE.get_population(1992, source=\"POP\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### censo\n", + "Demographic Censuses of 1991, 2000 and 2010. `censo` is subdivided in 5 categories in which can be selected using the attribute `censo_data`, please see the help() text for more information about `censo_data`, its default value is `ALF`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MUNCODANOCORRACASITUACAONUMRENDADENRENDADENCRIRENDNUMPOBRESNUMPOBRESXNUMCRIPOBNUMCRIPOBXNUMDESOCUPDENDESOCUPNUMTRABINFDENTRABINF
011000120101I6000724.8810482261848312804164591418144511531127
111000120102I378314.66107918653918214446185541680
211000120103I31515.7895046120006508
311000120104I4791228.10119443348580230482096116030449061591583
411000120105I68893.154971824502501651070670108
................................................
2539553001020102I203004614.5819026731396414981437311574452210289119202181716766
2539653001020103I63474517.864238083086538190123115501669243014724001
2539753001020104I1409083997.912366073150012799629847411217139581568856613649720144469
2539853001020105I8884195.0968221140102129719567345389223589
2539953001020100I972433.65853167410330141121000101
\n", + "

25400 rows × 15 columns

\n", + "
" + ], + "text/plain": [ + " MUNCOD ANO CORRACA SITUACAO NUMRENDA DENRENDA DENCRIREND \\\n", + "0 110001 2010 1 I 6000724.88 10482 2618 \n", + "1 110001 2010 2 I 378314.66 1079 186 \n", + "2 110001 2010 3 I 31515.78 95 0 \n", + "3 110001 2010 4 I 4791228.10 11944 3348 \n", + "4 110001 2010 5 I 68893.15 497 182 \n", + "... ... ... ... ... ... ... ... \n", + "25395 530010 2010 2 I 203004614.58 190267 31396 \n", + "25396 530010 2010 3 I 63474517.86 42380 8308 \n", + "25397 530010 2010 4 I 1409083997.9 1236607 315001 \n", + "25398 530010 2010 5 I 8884195.09 6822 1140 \n", + "25399 530010 2010 0 I 972433.65 853 167 \n", + "\n", + " NUMPOBRES NUMPOBRESX NUMCRIPOB NUMCRIPOBX NUMDESOCUP DENDESOCUP \\\n", + "0 4831 2804 1645 914 181 4451 \n", + "1 539 182 144 46 18 554 \n", + "2 46 12 0 0 0 65 \n", + "3 5802 3048 2096 1160 304 4906 \n", + "4 450 250 165 107 0 67 \n", + "... ... ... ... ... ... ... \n", + "25395 41498 14373 11574 4522 10289 119202 \n", + "25396 6538 1901 2311 550 1669 24301 \n", + "25397 279962 98474 112171 39581 56885 661364 \n", + "25398 1021 297 195 67 345 3892 \n", + "25399 410 330 141 121 0 0 \n", + "\n", + " NUMTRABINF DENTRABINF \n", + "0 153 1127 \n", + "1 16 80 \n", + "2 0 8 \n", + "3 159 1583 \n", + "4 0 108 \n", + "... ... ... \n", + "25395 1817 16766 \n", + "25396 472 4001 \n", + "25397 9720 144469 \n", + "25398 23 589 \n", + "25399 0 101 \n", + "\n", + "[25400 rows x 15 columns]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IBGE.get_population(2010, source=\"censo\", censo_data=\"RENDA\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### POPTCU (default)\n", + "\n", + "Population estimates sent to TCU (Federal Court of Accounts - Brazil), stratified by age and sex by MS/SGEP/Datasus" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('The years available for source `POPTCU` are: [1992, 1993, 1994, 1995, 1997, '\n", + " '1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, '\n", + " '2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021]')\n" + ] + } + ], + "source": [ + "pprint(f\"The years available for source `POPTCU` are: {get_available_years('POPTCU')}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MUNIC_RESANOPOPULACAO
01100015202122516
111000232021111148
2110003120215067
31100049202186416
41100056202116088
............
55655222005202114088
5566522205420219002
5567522220320216451
5568522230220215941
5569530010820213094325
\n", + "

5570 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " MUNIC_RES ANO POPULACAO\n", + "0 1100015 2021 22516\n", + "1 1100023 2021 111148\n", + "2 1100031 2021 5067\n", + "3 1100049 2021 86416\n", + "4 1100056 2021 16088\n", + "... ... ... ...\n", + "5565 5222005 2021 14088\n", + "5566 5222054 2021 9002\n", + "5567 5222203 2021 6451\n", + "5568 5222302 2021 5941\n", + "5569 5300108 2021 3094325\n", + "\n", + "[5570 rows x 3 columns]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IBGE.get_population(2021)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### projpop\n", + "\n", + "Preliminary estimates for the intercensal years of population totals, stratified by age and sex by MS/SGEP/Datasus." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('The years available for source `projpop` are: [1925, 1926, 1927, 1928, 1929, '\n", + " '1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, '\n", + " '1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, '\n", + " '1954, 1955, 1956, 1957, 1958, 1959, 1960, 2000, 2001, 2002, 2003, 2004, '\n", + " '2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, '\n", + " '2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024]')\n" + ] + } + ], + "source": [ + "pprint(f\"The years available for source `projpop` are: {get_available_years('projpop')}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ANOFXETARIASEXOPOPULACAO
02024A0000M1326675
12024A0101M1339007
22024A0202M1353165
32024A0303M1367593
42024A0404M1382395
...............
1772024A8686F203662
1782024A8787F178219
1792024A8888F154388
1802024A8989F134069
1812024A9099F627780
\n", + "

182 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " ANO FXETARIA SEXO POPULACAO\n", + "0 2024 A0000 M 1326675\n", + "1 2024 A0101 M 1339007\n", + "2 2024 A0202 M 1353165\n", + "3 2024 A0303 M 1367593\n", + "4 2024 A0404 M 1382395\n", + ".. ... ... ... ...\n", + "177 2024 A8686 F 203662\n", + "178 2024 A8787 F 178219\n", + "179 2024 A8888 F 154388\n", + "180 2024 A8989 F 134069\n", + "181 2024 A9099 F 627780\n", + "\n", + "[182 rows x 4 columns]" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IBGE.get_population(2024, \"projpop\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, "outputs": [], "source": [] } @@ -1970,7 +2827,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.11.8" }, "latex_envs": { "LaTeX_envs_menu_present": true, diff --git a/docs/source/tutorials/Preprocessing SINAN.ipynb b/docs/source/tutorials/Preprocessing SINAN.ipynb index 52c9787..d2337f7 100644 --- a/docs/source/tutorials/Preprocessing SINAN.ipynb +++ b/docs/source/tutorials/Preprocessing SINAN.ipynb @@ -21,16 +21,6 @@ "execution_count": 2, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/bida/Projetos/InfoDengue/PySUS/pysus/online_data/SINAN.py:50: FutureWarning: The error_bad_lines argument has been deprecated and will be removed in a future version. Use on_bad_lines in the future.\n", - "\n", - "\n", - " df = pd.read_csv(\n" - ] - }, { "data": { "text/html": [ @@ -522,7 +512,8 @@ " CHAGBR18.dbc,\n", " CHAGBR19.dbc,\n", " CHAGBR20.dbc,\n", - " CHAGBR21.dbc]" + " CHAGBR21.dbc,\n", + " CHAGBR22.dbc]" ] }, "execution_count": 6, @@ -542,445 +533,12 @@ } }, "source": [ - "We can also check when it was last updated for every disease, and if the table is preliminary or final." + "We can see, that we have data from 2000 to present. Now we can download it:" ] }, { "cell_type": "code", "execution_count": 7, - "metadata": { - "ExecuteTime": { - "end_time": "2022-09-05T17:20:52.815560Z", - "start_time": "2022-09-05T17:20:52.314900Z" - }, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
folderdatefile_sizefile_name
0/dissemin/publicos/SINAN/DADOS/FINAIS2023-01-16 14:15:0028326ACBIBR06.dbc
1/dissemin/publicos/SINAN/DADOS/FINAIS2023-01-16 14:15:00673314ACBIBR07.dbc
2/dissemin/publicos/SINAN/DADOS/FINAIS2023-01-16 14:15:001048406ACBIBR08.dbc
3/dissemin/publicos/SINAN/DADOS/FINAIS2023-01-16 14:15:001493392ACBIBR09.dbc
4/dissemin/publicos/SINAN/DADOS/FINAIS2023-01-16 14:15:001632311ACBIBR10.dbc
...............
753/dissemin/publicos/SINAN/DADOS/PRELIM2023-03-09 16:37:00169214VARCBR22.dbc
754/dissemin/publicos/SINAN/DADOS/PRELIM2023-08-10 10:28:00127626VARCBR23.dbc
755/dissemin/publicos/SINAN/DADOS/PRELIM2023-06-26 11:25:0026007974VIOLBR21.dbc
756/dissemin/publicos/SINAN/DADOS/PRELIM2023-06-26 11:25:0032269105VIOLBR22.dbc
757/dissemin/publicos/SINAN/DADOS/PRELIM2023-08-23 10:11:00384075ZIKABR23.dbc
\n", - "

758 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " folder date file_size \\\n", - "0 /dissemin/publicos/SINAN/DADOS/FINAIS 2023-01-16 14:15:00 28326 \n", - "1 /dissemin/publicos/SINAN/DADOS/FINAIS 2023-01-16 14:15:00 673314 \n", - "2 /dissemin/publicos/SINAN/DADOS/FINAIS 2023-01-16 14:15:00 1048406 \n", - "3 /dissemin/publicos/SINAN/DADOS/FINAIS 2023-01-16 14:15:00 1493392 \n", - "4 /dissemin/publicos/SINAN/DADOS/FINAIS 2023-01-16 14:15:00 1632311 \n", - ".. ... ... ... \n", - "753 /dissemin/publicos/SINAN/DADOS/PRELIM 2023-03-09 16:37:00 169214 \n", - "754 /dissemin/publicos/SINAN/DADOS/PRELIM 2023-08-10 10:28:00 127626 \n", - "755 /dissemin/publicos/SINAN/DADOS/PRELIM 2023-06-26 11:25:00 26007974 \n", - "756 /dissemin/publicos/SINAN/DADOS/PRELIM 2023-06-26 11:25:00 32269105 \n", - "757 /dissemin/publicos/SINAN/DADOS/PRELIM 2023-08-23 10:11:00 384075 \n", - "\n", - " file_name \n", - "0 ACBIBR06.dbc \n", - "1 ACBIBR07.dbc \n", - "2 ACBIBR08.dbc \n", - "3 ACBIBR09.dbc \n", - "4 ACBIBR10.dbc \n", - ".. ... \n", - "753 VARCBR22.dbc \n", - "754 VARCBR23.dbc \n", - "755 VIOLBR21.dbc \n", - "756 VIOLBR22.dbc \n", - "757 ZIKABR23.dbc \n", - "\n", - "[758 rows x 4 columns]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from pysus.online_data import FTP_Inspect\n", - "lu = FTP_Inspect('SINAN').last_update_df()\n", - "lu" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "ExecuteTime": { - "end_time": "2022-09-05T17:21:04.411472Z", - "start_time": "2022-09-05T17:21:04.370232Z" - }, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
folderdatefile_sizefile_name
80/dissemin/publicos/SINAN/DADOS/FINAIS2022-03-28 11:18:0041075CHAGBR00.dbc
81/dissemin/publicos/SINAN/DADOS/FINAIS2022-03-28 11:18:0047675CHAGBR01.dbc
82/dissemin/publicos/SINAN/DADOS/FINAIS2022-03-28 11:18:0069415CHAGBR02.dbc
83/dissemin/publicos/SINAN/DADOS/FINAIS2022-03-28 11:18:0090539CHAGBR03.dbc
84/dissemin/publicos/SINAN/DADOS/FINAIS2022-03-28 11:18:0086820CHAGBR04.dbc
85/dissemin/publicos/SINAN/DADOS/FINAIS2022-03-28 11:18:00223289CHAGBR05.dbc
86/dissemin/publicos/SINAN/DADOS/FINAIS2022-03-28 11:18:00135953CHAGBR06.dbc
87/dissemin/publicos/SINAN/DADOS/FINAIS2021-11-23 12:21:0011660CHAGBR07.dbc
88/dissemin/publicos/SINAN/DADOS/FINAIS2021-11-23 12:21:0011004CHAGBR08.dbc
89/dissemin/publicos/SINAN/DADOS/FINAIS2021-11-23 12:21:0017913CHAGBR09.dbc
90/dissemin/publicos/SINAN/DADOS/FINAIS2021-11-23 12:21:0013470CHAGBR10.dbc
91/dissemin/publicos/SINAN/DADOS/FINAIS2021-11-23 12:21:0017109CHAGBR11.dbc
92/dissemin/publicos/SINAN/DADOS/FINAIS2021-11-23 12:21:00264167CHAGBR12.dbc
93/dissemin/publicos/SINAN/DADOS/FINAIS2021-11-23 12:21:00245977CHAGBR13.dbc
94/dissemin/publicos/SINAN/DADOS/FINAIS2021-11-23 12:21:00261115CHAGBR14.dbc
95/dissemin/publicos/SINAN/DADOS/FINAIS2021-11-23 12:21:00188615CHAGBR15.dbc
96/dissemin/publicos/SINAN/DADOS/FINAIS2022-03-28 11:18:00244387CHAGBR16.dbc
97/dissemin/publicos/SINAN/DADOS/FINAIS2021-11-23 12:21:00215819CHAGBR17.dbc
98/dissemin/publicos/SINAN/DADOS/FINAIS2022-03-28 11:18:00254336CHAGBR18.dbc
99/dissemin/publicos/SINAN/DADOS/FINAIS2021-11-23 12:21:00285962CHAGBR19.dbc
536/dissemin/publicos/SINAN/DADOS/PRELIM2022-02-09 15:16:00189312CHAGBR20.dbc
537/dissemin/publicos/SINAN/DADOS/PRELIM2023-04-20 12:17:00282009CHAGBR21.dbc
\n", - "
" - ], - "text/plain": [ - " folder date file_size \\\n", - "80 /dissemin/publicos/SINAN/DADOS/FINAIS 2022-03-28 11:18:00 41075 \n", - "81 /dissemin/publicos/SINAN/DADOS/FINAIS 2022-03-28 11:18:00 47675 \n", - "82 /dissemin/publicos/SINAN/DADOS/FINAIS 2022-03-28 11:18:00 69415 \n", - "83 /dissemin/publicos/SINAN/DADOS/FINAIS 2022-03-28 11:18:00 90539 \n", - "84 /dissemin/publicos/SINAN/DADOS/FINAIS 2022-03-28 11:18:00 86820 \n", - "85 /dissemin/publicos/SINAN/DADOS/FINAIS 2022-03-28 11:18:00 223289 \n", - "86 /dissemin/publicos/SINAN/DADOS/FINAIS 2022-03-28 11:18:00 135953 \n", - "87 /dissemin/publicos/SINAN/DADOS/FINAIS 2021-11-23 12:21:00 11660 \n", - "88 /dissemin/publicos/SINAN/DADOS/FINAIS 2021-11-23 12:21:00 11004 \n", - "89 /dissemin/publicos/SINAN/DADOS/FINAIS 2021-11-23 12:21:00 17913 \n", - "90 /dissemin/publicos/SINAN/DADOS/FINAIS 2021-11-23 12:21:00 13470 \n", - "91 /dissemin/publicos/SINAN/DADOS/FINAIS 2021-11-23 12:21:00 17109 \n", - "92 /dissemin/publicos/SINAN/DADOS/FINAIS 2021-11-23 12:21:00 264167 \n", - "93 /dissemin/publicos/SINAN/DADOS/FINAIS 2021-11-23 12:21:00 245977 \n", - "94 /dissemin/publicos/SINAN/DADOS/FINAIS 2021-11-23 12:21:00 261115 \n", - "95 /dissemin/publicos/SINAN/DADOS/FINAIS 2021-11-23 12:21:00 188615 \n", - "96 /dissemin/publicos/SINAN/DADOS/FINAIS 2022-03-28 11:18:00 244387 \n", - "97 /dissemin/publicos/SINAN/DADOS/FINAIS 2021-11-23 12:21:00 215819 \n", - "98 /dissemin/publicos/SINAN/DADOS/FINAIS 2022-03-28 11:18:00 254336 \n", - "99 /dissemin/publicos/SINAN/DADOS/FINAIS 2021-11-23 12:21:00 285962 \n", - "536 /dissemin/publicos/SINAN/DADOS/PRELIM 2022-02-09 15:16:00 189312 \n", - "537 /dissemin/publicos/SINAN/DADOS/PRELIM 2023-04-20 12:17:00 282009 \n", - "\n", - " file_name \n", - "80 CHAGBR00.dbc \n", - "81 CHAGBR01.dbc \n", - "82 CHAGBR02.dbc \n", - "83 CHAGBR03.dbc \n", - "84 CHAGBR04.dbc \n", - "85 CHAGBR05.dbc \n", - "86 CHAGBR06.dbc \n", - "87 CHAGBR07.dbc \n", - "88 CHAGBR08.dbc \n", - "89 CHAGBR09.dbc \n", - "90 CHAGBR10.dbc \n", - "91 CHAGBR11.dbc \n", - "92 CHAGBR12.dbc \n", - "93 CHAGBR13.dbc \n", - "94 CHAGBR14.dbc \n", - "95 CHAGBR15.dbc \n", - "96 CHAGBR16.dbc \n", - "97 CHAGBR17.dbc \n", - "98 CHAGBR18.dbc \n", - "99 CHAGBR19.dbc \n", - "536 CHAGBR20.dbc \n", - "537 CHAGBR21.dbc " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "lu[lu.file_name.str.startswith('CHAG')]" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "We can see, that we have data in final form, from 2000 until 2019, and preliminary data for 2020. Now we can download it:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2022-09-05T17:21:11.840622Z", @@ -995,7 +553,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "CHAGBR19.parquet: 100%|████████████████████████████████████████████████████████████████████████████████▉| 8.44k/8.44k [00:00<00:00, 19.4kB/s]\n" + "100%|███████████████████████████████████████████████████████████████████| 286k/286k [00:00<00:00, 266MB/s]\n" ] }, { @@ -1030,16 +588,16 @@ " ID_UNIDADE\n", " DT_SIN_PRI\n", " ...\n", - " DT_OBITO\n", - " CON_PROVAV\n", - " CON_OUTRA\n", - " CON_LOCAL\n", - " TPAUTOCTO\n", - " COUFINF\n", - " COPAISINF\n", - " COMUNINF\n", - " DOENCA_TRA\n", " DT_ENCERRA\n", + " DT_DIGITA\n", + " DT_TRANSUS\n", + " DT_TRANSDM\n", + " DT_TRANSSM\n", + " DT_TRANSRM\n", + " DT_TRANSRS\n", + " DT_TRANSSE\n", + " NU_LOTE_V\n", + " NU_LOTE_H\n", " \n", " \n", " \n", @@ -1056,16 +614,16 @@ " 2019639\n", " 2019-03-01\n", " ...\n", + " 20190513\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " 5\n", " \n", - " 2\n", - " 1\n", - " 16\n", - " 1\n", - " 160030\n", - " 2\n", - " 20190513\n", " \n", " \n", " 1\n", @@ -1080,16 +638,16 @@ " 2022192\n", " 2019-08-18\n", " ...\n", + " 20191002\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " 5\n", " \n", - " 2\n", - " 2\n", - " 16\n", - " 1\n", - " 160060\n", - " 2\n", - " 20191002\n", " \n", " \n", " 2\n", @@ -1104,16 +662,16 @@ " 2022192\n", " 2019-02-28\n", " ...\n", + " 20190325\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " 5\n", " \n", - " 2\n", - " 1\n", - " 16\n", - " 1\n", - " 160030\n", " \n", - " 20190325\n", " \n", " \n", " 3\n", @@ -1128,19 +686,19 @@ " 2020653\n", " 2019-09-09\n", " ...\n", + " 20191107\n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " 5\n", " \n", - " 2\n", - " 1\n", - " 16\n", - " 1\n", - " 160030\n", - " 2\n", - " 20191107\n", - " \n", - " \n", - " 4\n", + " \n", + " \n", + " \n", + " \n", + " 4\n", " 2\n", " B571\n", " 2019-09-10\n", @@ -1152,16 +710,16 @@ " 2020971\n", " 2019-08-28\n", " ...\n", + " 20191108\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " 5\n", " \n", - " 2\n", - " 1\n", - " 16\n", - " 1\n", - " 160060\n", - " 2\n", - " 20191108\n", " \n", " \n", " ...\n", @@ -1200,16 +758,16 @@ " 5740592\n", " 2019-09-04\n", " ...\n", + " 20191022\n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " 0\n", " \n", " \n", - " 20191022\n", " \n", " \n", " 4478\n", @@ -1224,16 +782,16 @@ " 2348489\n", " 2019-08-26\n", " ...\n", + " 20191008\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " 2\n", " \n", - " 2\n", - " 1\n", - " 26\n", - " 1\n", - " 261390\n", - " 2\n", - " 20191008\n", " \n", " \n", " 4479\n", @@ -1248,16 +806,16 @@ " 2711443\n", " 2019-01-05\n", " ...\n", + " 20190212\n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " 0\n", " \n", " \n", - " 20190212\n", " \n", " \n", " 4480\n", @@ -1272,16 +830,16 @@ " 5276403\n", " 2019-07-03\n", " ...\n", + " 20190903\n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " 0\n", " \n", " \n", - " 20190903\n", " \n", " \n", " 4481\n", @@ -1296,20 +854,20 @@ " 5844916\n", " 2019-08-04\n", " ...\n", + " 20200124\n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " 0\n", " \n", " \n", - " 20200124\n", " \n", " \n", "\n", - "

4482 rows × 99 columns

\n", + "

4482 rows × 108 columns

\n", "" ], "text/plain": [ @@ -1326,36 +884,49 @@ "4480 2 B571 2019-07-03 201927 2019 26 260820 \n", "4481 2 B571 2019-11-08 201945 2019 26 261220 \n", "\n", - " ID_REGIONA ID_UNIDADE DT_SIN_PRI ... DT_OBITO CON_PROVAV CON_OUTRA \\\n", - "0 2019639 2019-03-01 ... 5 \n", - "1 2022192 2019-08-18 ... 5 \n", - "2 2022192 2019-02-28 ... 5 \n", - "3 2020653 2019-09-09 ... 5 \n", - "4 2020971 2019-08-28 ... 5 \n", - "... ... ... ... ... ... ... ... \n", - "4477 1501 5740592 2019-09-04 ... \n", - "4478 1506 2348489 2019-08-26 ... 2 \n", - "4479 1501 2711443 2019-01-05 ... \n", - "4480 1498 5276403 2019-07-03 ... \n", - "4481 1502 5844916 2019-08-04 ... \n", + " ID_REGIONA ID_UNIDADE DT_SIN_PRI ... DT_ENCERRA DT_DIGITA DT_TRANSUS \\\n", + "0 2019639 2019-03-01 ... 20190513 \n", + "1 2022192 2019-08-18 ... 20191002 \n", + "2 2022192 2019-02-28 ... 20190325 \n", + "3 2020653 2019-09-09 ... 20191107 \n", + "4 2020971 2019-08-28 ... 20191108 \n", + "... ... ... ... ... ... ... ... \n", + "4477 1501 5740592 2019-09-04 ... 20191022 \n", + "4478 1506 2348489 2019-08-26 ... 20191008 \n", + "4479 1501 2711443 2019-01-05 ... 20190212 \n", + "4480 1498 5276403 2019-07-03 ... 20190903 \n", + "4481 1502 5844916 2019-08-04 ... 20200124 \n", "\n", - " CON_LOCAL TPAUTOCTO COUFINF COPAISINF COMUNINF DOENCA_TRA DT_ENCERRA \n", - "0 2 1 16 1 160030 2 20190513 \n", - "1 2 2 16 1 160060 2 20191002 \n", - "2 2 1 16 1 160030 20190325 \n", - "3 2 1 16 1 160030 2 20191107 \n", - "4 2 1 16 1 160060 2 20191108 \n", - "... ... ... ... ... ... ... ... \n", - "4477 0 20191022 \n", - "4478 2 1 26 1 261390 2 20191008 \n", - "4479 0 20190212 \n", - "4480 0 20190903 \n", - "4481 0 20200124 \n", + " DT_TRANSDM DT_TRANSSM DT_TRANSRM DT_TRANSRS DT_TRANSSE NU_LOTE_V \\\n", + "0 \n", + "1 \n", + "2 \n", + "3 \n", + "4 \n", + "... ... ... ... ... ... ... \n", + "4477 \n", + "4478 \n", + "4479 \n", + "4480 \n", + "4481 \n", "\n", - "[4482 rows x 99 columns]" + " NU_LOTE_H \n", + "0 \n", + "1 \n", + "2 \n", + "3 \n", + "4 \n", + "... ... \n", + "4477 \n", + "4478 \n", + "4479 \n", + "4480 \n", + "4481 \n", + "\n", + "[4482 rows x 108 columns]" ] }, - "execution_count": 9, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -1384,7 +955,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "metadata": { "collapsed": false, "jupyter": { @@ -1399,7 +970,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "DENGBR20.parquet: 100%|█████████████████████████████████████████████████████████████████████████████████| 2.40M/2.40M [02:24<00:00, 16.6kB/s]\n" + "100%|████████████████████████████████████████████████████████████████| 73.8M/73.8M [00:00<00:00, 71.6GB/s]\n" ] } ], @@ -1419,12 +990,12 @@ } }, "source": [ - "The cases of dengue where downloaded to multiple chunks to the directory above" + "The cases of dengue were downloaded to multiple chunks to the directory above" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "metadata": { "collapsed": false, "jupyter": { @@ -1441,7 +1012,7 @@ "50" ] }, - "execution_count": 11, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -1453,7 +1024,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": { "collapsed": false, "jupyter": { @@ -1470,7 +1041,7 @@ "1495117" ] }, - "execution_count": 12, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -1483,10 +1054,6 @@ { "cell_type": "markdown", "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - }, "pycharm": { "name": "#%% md\n" } @@ -1498,433 +1065,35 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "metadata": { "ExecuteTime": { - "end_time": "2022-09-05T17:38:01.818095Z", - "start_time": "2022-09-05T17:36:54.877226Z" + "end_time": "2022-09-05T17:21:42.746132Z", + "start_time": "2022-09-05T17:21:42.660877Z" }, "pycharm": { "name": "#%%\n" - }, - "scrolled": true + } }, "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
TP_NOTID_AGRAVODT_NOTIFICSEM_NOTNU_ANOSG_UF_NOTID_MUNICIPID_REGIONAID_UNIDADEDT_SIN_PRI...LACO_NPLASMATICOEVIDENCIAPLAQ_MENORCON_FHDCOMPLICATP_SISTEMANDUPLIC_NCS_FLXRETFLXRECEBI
02A90202004242020353554101352204645820200420...21
12A90202004302020353511101354734088520200428...20
22A90202003312020353514401573795922220200328...20
32A90202004212020353522701337207983620200421...20
42A90202005162020353502801336205932020200511...21
..................................................................
14951122A90202003312020313106201449002331020200330...21
14951132A90202004162020313132401459314793220200407...20
14951142A90202004142020313106201449002799520200413...21
14951152A90202002142020313116601472216030720200211...21
14951162A90202003162020313106201449965384820200316...21
\n", - "

1495117 rows × 119 columns

\n", - "
" - ], - "text/plain": [ - " TP_NOT ID_AGRAVO DT_NOTIFIC SEM_NOT NU_ANO SG_UF_NOT ID_MUNICIP \\\n", - "0 2 A90 20200424 2020 35 355410 \n", - "1 2 A90 20200430 2020 35 351110 \n", - "2 2 A90 20200331 2020 35 351440 \n", - "3 2 A90 20200421 2020 35 352270 \n", - "4 2 A90 20200516 2020 35 350280 \n", - "... ... ... ... ... ... ... ... \n", - "1495112 2 A90 20200331 2020 31 310620 \n", - "1495113 2 A90 20200416 2020 31 313240 \n", - "1495114 2 A90 20200414 2020 31 310620 \n", - "1495115 2 A90 20200214 2020 31 311660 \n", - "1495116 2 A90 20200316 2020 31 310620 \n", - "\n", - " ID_REGIONA ID_UNIDADE DT_SIN_PRI ... LACO_N PLASMATICO EVIDENCIA \\\n", - "0 1352 2046458 20200420 ... \n", - "1 1354 7340885 20200428 ... \n", - "2 1573 7959222 20200328 ... \n", - "3 1337 2079836 20200421 ... \n", - "4 1336 2059320 20200511 ... \n", - "... ... ... ... ... ... ... ... \n", - "1495112 1449 0023310 20200330 ... \n", - "1495113 1459 3147932 20200407 ... \n", - "1495114 1449 0027995 20200413 ... \n", - "1495115 1472 2160307 20200211 ... \n", - "1495116 1449 9653848 20200316 ... \n", - "\n", - " PLAQ_MENOR CON_FHD COMPLICA TP_SISTEMA NDUPLIC_N CS_FLXRET FLXRECEBI \n", - "0 2 1 \n", - "1 2 0 \n", - "2 2 0 \n", - "3 2 0 \n", - "4 2 1 \n", - "... ... ... ... ... ... ... ... \n", - "1495112 2 1 \n", - "1495113 2 0 \n", - "1495114 2 1 \n", - "1495115 2 1 \n", - "1495116 2 1 \n", - "\n", - "[1495117 rows x 119 columns]" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from glob import glob\n", - "for i, f in enumerate(glob(f\"{fn}/*.parquet\")):\n", - " if i == 0:\n", - " df2 = pd.read_parquet(f)\n", - " else:\n", - " df2 = pd.concat([df2, pd.read_parquet(f)], ignore_index=True)\n", - "df2" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "## Decoding the age in SINAN tables\n", - "In SINAN the age comes encoded. PySUS can decode the age column `NU_IDADE_N` into any of these units: years, months, days, or hours." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "ExecuteTime": { - "end_time": "2022-09-05T17:21:42.746132Z", - "start_time": "2022-09-05T17:21:42.660877Z" - }, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "\u001b[0;31mSignature:\u001b[0m \u001b[0mdecodifica_idade_SINAN\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mType:\u001b[0m vectorize\n", - "\u001b[0;31mString form:\u001b[0m \n", - "\u001b[0;31mFile:\u001b[0m ~/micromamba/envs/pysus/lib/python3.11/site-packages/numpy/__init__.py\n", - "\u001b[0;31mDocstring:\u001b[0m \n", - "Em tabelas do SINAN frequentemente a idade é representada como um inteiro que precisa ser parseado\n", - "para retornar a idade em uma unidade cronológica padrão.\n", - ":param unidade: unidade da idade: 'Y': anos, 'M' meses, 'D': dias, 'H': horas\n", - ":param idade: inteiro ou sequencia de inteiros codificados.\n", - ":return:\n", - "\u001b[0;31mClass docstring:\u001b[0m\n", - "vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False,\n", - " signature=None)\n", - "\n", - "Generalized function class.\n", + "Returns an object that acts like pyfunc, but takes arrays as input.\n", "\n", "Define a vectorized function which takes a nested sequence of objects or\n", "numpy arrays as inputs and returns a single numpy array or a tuple of numpy\n", @@ -1938,8 +1107,9 @@ "\n", "Parameters\n", "----------\n", - "pyfunc : callable\n", + "pyfunc : callable, optional\n", " A python function or method.\n", + " Can be omitted to produce a decorator with keyword arguments.\n", "otypes : str or list of dtypes, optional\n", " The output data type. It must be specified as either a string of\n", " typecode characters or a list of data type specifiers. There should\n", @@ -1971,8 +1141,9 @@ "\n", "Returns\n", "-------\n", - "vectorized : callable\n", - " Vectorized function.\n", + "out : callable\n", + " A vectorized function if ``pyfunc`` was provided,\n", + " a decorator otherwise.\n", "\n", "See Also\n", "--------\n", @@ -2068,9 +1239,21 @@ " [0., 1., 2., 1., 0., 0.],\n", " [0., 0., 1., 2., 1., 0.],\n", " [0., 0., 0., 1., 2., 1.]])\n", - "\u001b[0;31mCall docstring:\u001b[0m \n", - "Return arrays with the results of `pyfunc` broadcast (vectorized) over\n", - "`args` and `kwargs` not in `excluded`." + "\n", + "Decorator syntax is supported. The decorator can be called as\n", + "a function to provide keyword arguments.\n", + ">>>@np.vectorize\n", + "...def identity(x):\n", + "... return x\n", + "...\n", + ">>>identity([0, 1, 2])\n", + "array([0, 1, 2])\n", + ">>>@np.vectorize(otypes=[float])\n", + "...def as_float(x):\n", + "... return x\n", + "...\n", + ">>>as_float([0, 1, 2])\n", + "array([0., 1., 2.])" ] }, "metadata": {}, @@ -2095,7 +1278,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2022-09-05T17:21:57.041703Z", @@ -2112,110 +1295,9 @@ "text": [ "\n", "RangeIndex: 4482 entries, 0 to 4481\n", - "Data columns (total 99 columns):\n", - " # Column Non-Null Count Dtype \n", - "--- ------ -------------- ----- \n", - " 0 TP_NOT 4482 non-null string \n", - " 1 ID_AGRAVO 4482 non-null string \n", - " 2 DT_NOTIFIC 4482 non-null datetime64[ns]\n", - " 3 SEM_NOT 4482 non-null string \n", - " 4 NU_ANO 4482 non-null string \n", - " 5 SG_UF_NOT 4482 non-null string \n", - " 6 ID_MUNICIP 4482 non-null int64 \n", - " 7 ID_REGIONA 3633 non-null float64 \n", - " 8 ID_UNIDADE 4482 non-null int64 \n", - " 9 DT_SIN_PRI 4482 non-null datetime64[ns]\n", - " 10 SEM_PRI 4482 non-null string \n", - " 11 DT_NASC 4447 non-null datetime64[ns]\n", - " 12 NU_IDADE_N 4482 non-null string \n", - " 13 CS_SEXO 4482 non-null string \n", - " 14 CS_GESTANT 4482 non-null string \n", - " 15 CS_RACA 4482 non-null string \n", - " 16 CS_ESCOL_N 4482 non-null string \n", - " 17 SG_UF 4482 non-null string \n", - " 18 ID_MN_RESI 4482 non-null int64 \n", - " 19 ID_RG_RESI 3682 non-null float64 \n", - " 20 ID_PAIS 4482 non-null int64 \n", - " 21 NDUPLIC_N 4482 non-null string \n", - " 22 DT_INVEST 4329 non-null datetime64[ns]\n", - " 23 ID_OCUPA_N 4482 non-null string \n", - " 24 ANT_UF_1 4482 non-null string \n", - " 25 MUN_1 4482 non-null string \n", - " 26 ANT_UF_2 4482 non-null string \n", - " 27 MUN_2 4482 non-null string \n", - " 28 ANT_UF_3 4482 non-null string \n", - " 29 MUN_3 4482 non-null string \n", - " 30 PRESENCA 4482 non-null string \n", - " 31 PARASITO 4482 non-null string \n", - " 32 HISTORIA 4482 non-null string \n", - " 33 CONTROLE 4482 non-null string \n", - " 34 MANIPULA 4482 non-null string \n", - " 35 MAECHAGA 4482 non-null string \n", - " 36 ORAL 4482 non-null string \n", - " 37 ASSINTOMA 4482 non-null string \n", - " 38 EDEMA 4482 non-null string \n", - " 39 MENINGOE 4482 non-null string \n", - " 40 POLIADENO 4482 non-null string \n", - " 41 FEBRE 4482 non-null string \n", - " 42 HEPATOME 4482 non-null string \n", - " 43 SINAIS_ICC 4482 non-null string \n", - " 44 ARRITMIAS 4482 non-null string \n", - " 45 ASTENIA 4482 non-null string \n", - " 46 ESPLENOM 4482 non-null string \n", - " 47 CHAGOMA 4482 non-null string \n", - " 48 OUTRO_SIN 4482 non-null string \n", - " 49 OUTRO_ESP 4482 non-null string \n", - " 50 DT_COL_DIR 2693 non-null datetime64[ns]\n", - " 51 EXAME 4482 non-null string \n", - " 52 MICRO_HEMA 4482 non-null string \n", - " 53 OUTRO 4482 non-null string \n", - " 54 DT_COL_IND 155 non-null datetime64[ns]\n", - " 55 XENODIAG 4482 non-null string \n", - " 56 HEMOCULT 4482 non-null string \n", - " 57 DT_COL_S1 3300 non-null datetime64[ns]\n", - " 58 DT_COL_S2 790 non-null datetime64[ns]\n", - " 59 ELI_IGM_S1 4482 non-null string \n", - " 60 ELI_IGG_S1 4482 non-null string \n", - " 61 ELI_IGM_S2 4482 non-null string \n", - " 62 ELI_IGG_S2 4482 non-null string \n", - " 63 HEM_IGM_S1 4482 non-null string \n", - " 64 HEM_IGG_S1 4482 non-null string \n", - " 65 HEM_IGM_S2 4482 non-null string \n", - " 66 HEM_IGG_S2 4482 non-null string \n", - " 67 IMU_IGM_S1 4482 non-null string \n", - " 68 TIT_IGM_S1 4482 non-null string \n", - " 69 IMU_IGM_S2 4482 non-null string \n", - " 70 TIT_IGM_S2 4482 non-null string \n", - " 71 IMU_IGG_S1 4482 non-null string \n", - " 72 TIT_IGG_S1 4482 non-null string \n", - " 73 IMU_IGG_S2 4482 non-null string \n", - " 74 TIT_IGG_S2 4482 non-null string \n", - " 75 RESUL_HIS 4482 non-null string \n", - " 76 RES_HIST 4482 non-null string \n", - " 77 ESPECIFICO 4482 non-null string \n", - " 78 SINTOMATIC 4482 non-null string \n", - " 79 DROGA 4482 non-null string \n", - " 80 TEMPO 4482 non-null string \n", - " 81 CON_TRIAT 4482 non-null string \n", - " 82 BIOSSEG 4482 non-null string \n", - " 83 FISCALIZA 4482 non-null string \n", - " 84 MED_OUTRO 4482 non-null string \n", - " 85 OUTRO_DES 4482 non-null string \n", - " 86 CLASSI_FIN 4482 non-null string \n", - " 87 CRITERIO 4482 non-null string \n", - " 88 EVOLUCAO 4482 non-null string \n", - " 89 DT_OBITO 54 non-null datetime64[ns]\n", - " 90 CON_PROVAV 4482 non-null string \n", - " 91 CON_OUTRA 4482 non-null string \n", - " 92 CON_LOCAL 4482 non-null string \n", - " 93 TPAUTOCTO 4482 non-null string \n", - " 94 COUFINF 4482 non-null string \n", - " 95 COPAISINF 4482 non-null string \n", - " 96 COMUNINF 4482 non-null string \n", - " 97 DOENCA_TRA 4482 non-null string \n", - " 98 DT_ENCERRA 4366 non-null datetime64[ns]\n", - "dtypes: datetime64[ns](10), float64(2), int64(4), string(83)\n", - "memory usage: 3.4 MB\n" + "Columns: 108 entries, TP_NOT to NU_LOTE_H\n", + "dtypes: Float64(2), Int64(4), datetime64[ns](16), string(86)\n", + "memory usage: 3.7 MB\n" ] } ], @@ -2244,7 +1326,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2022-09-05T17:21:59.409288Z", @@ -2358,7 +1440,7 @@ "[4482 rows x 2 columns]" ] }, - "execution_count": 16, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -2382,7 +1464,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2022-09-05T17:22:02.591827Z", @@ -2397,6 +1479,988 @@ "df['SG_UF_NOT'] = df.SG_UF_NOT.astype(int)\n", "df[df.SG_UF_NOT==31].to_csv('chagas_SP_2018_mod.csv',sep=';',compression='zip')" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Combining SINAN and IBGE databases\n", + "\n", + "We could also use different sources to enrich the analysis. In the example below, population data will be used to calculate how many dengue cases per 100k habitants there are in each geocode:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "from pysus.online_data import IBGE" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
MUNIC_RESANOPOPULACAO
0110001201024422
1110002201090354
211000320106309
3110004201078601
4110005201017030
............
5560522200201012549
556152220520107371
556252222020104742
556352223020105145
556453001020102562963
\n", + "

5565 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " MUNIC_RES ANO POPULACAO\n", + "0 110001 2010 24422\n", + "1 110002 2010 90354\n", + "2 110003 2010 6309\n", + "3 110004 2010 78601\n", + "4 110005 2010 17030\n", + "... ... ... ...\n", + "5560 522200 2010 12549\n", + "5561 522205 2010 7371\n", + "5562 522220 2010 4742\n", + "5563 522230 2010 5145\n", + "5564 530010 2010 2562963\n", + "\n", + "[5565 rows x 3 columns]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pop = IBGE.get_population(source=\"POP\", year=2010)\n", + "pop" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████| 30.5M/30.5M [00:00<00:00, 31.1GB/s]\n" + ] + } + ], + "source": [ + "df = sinan.download(sinan.get_files('DENG', 2010)).to_dataframe()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
TP_NOTID_AGRAVODT_NOTIFICSEM_NOTNU_ANOSG_UF_NOTID_MUNICIPID_REGIONAID_UNIDADEDT_SIN_PRI...PLASMATICOEVIDENCIAPLAQ_MENORCON_FHDCOMPLICAHOSPITALIZDT_INTERNAUFMUNICIPIOTP_SISTEMA
02A902010-03-19201011201051510760157927016262010-03-14...1
12A902010-03-26201012201051510760157927016262010-03-21...1
22A902010-03-12201010201051510760157927016262010-03-07...1
32A902010-03-23201012201051510760157927016262010-03-18...1
42A902010-03-12201010201051510760157927016262010-03-07...1
..................................................................
13812492A902010-01-12201002201029291770140625333752009-12-13...0.0000000001
13812502A902010-01-07201001201029291770140625333752010-01-07...0.0000000001
13812512A902010-01-07201001201029291770140625333752010-01-04...0.0000000001
13812522A902010-01-17201003201029291770140625333752010-01-16...0.0000000001
13812532A902010-01-14201002201029291770140625333751982-04-05...0.0000000001
\n", + "

1381254 rows × 66 columns

\n", + "
" + ], + "text/plain": [ + " TP_NOT ID_AGRAVO DT_NOTIFIC SEM_NOT NU_ANO SG_UF_NOT ID_MUNICIP \\\n", + "0 2 A90 2010-03-19 201011 2010 51 510760 \n", + "1 2 A90 2010-03-26 201012 2010 51 510760 \n", + "2 2 A90 2010-03-12 201010 2010 51 510760 \n", + "3 2 A90 2010-03-23 201012 2010 51 510760 \n", + "4 2 A90 2010-03-12 201010 2010 51 510760 \n", + "... ... ... ... ... ... ... ... \n", + "1381249 2 A90 2010-01-12 201002 2010 29 291770 \n", + "1381250 2 A90 2010-01-07 201001 2010 29 291770 \n", + "1381251 2 A90 2010-01-07 201001 2010 29 291770 \n", + "1381252 2 A90 2010-01-17 201003 2010 29 291770 \n", + "1381253 2 A90 2010-01-14 201002 2010 29 291770 \n", + "\n", + " ID_REGIONA ID_UNIDADE DT_SIN_PRI ... PLASMATICO EVIDENCIA \\\n", + "0 1579 2701626 2010-03-14 ... \n", + "1 1579 2701626 2010-03-21 ... \n", + "2 1579 2701626 2010-03-07 ... \n", + "3 1579 2701626 2010-03-18 ... \n", + "4 1579 2701626 2010-03-07 ... \n", + "... ... ... ... ... ... ... \n", + "1381249 1406 2533375 2009-12-13 ... \n", + "1381250 1406 2533375 2010-01-07 ... \n", + "1381251 1406 2533375 2010-01-04 ... \n", + "1381252 1406 2533375 2010-01-16 ... \n", + "1381253 1406 2533375 1982-04-05 ... \n", + "\n", + " PLAQ_MENOR CON_FHD COMPLICA HOSPITALIZ DT_INTERNA UF \\\n", + "0 \n", + "1 \n", + "2 \n", + "3 \n", + "4 \n", + "... ... ... ... ... ... .. \n", + "1381249 0.000000000 \n", + "1381250 0.000000000 \n", + "1381251 0.000000000 \n", + "1381252 0.000000000 \n", + "1381253 0.000000000 \n", + "\n", + " MUNICIPIO TP_SISTEMA \n", + "0 1 \n", + "1 1 \n", + "2 1 \n", + "3 1 \n", + "4 1 \n", + "... ... ... \n", + "1381249 1 \n", + "1381250 1 \n", + "1381251 1 \n", + "1381252 1 \n", + "1381253 1 \n", + "\n", + "[1381254 rows x 66 columns]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ID_MUNICIPTOTAL_CASES
191431062071056
415852087048397
386750027042761
6112004038333
314735434036107
.........
36394208101
39725103951
24213160201
15332905151
37894314801
\n", + "

4307 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " ID_MUNICIP TOTAL_CASES\n", + "1914 310620 71056\n", + "4158 520870 48397\n", + "3867 500270 42761\n", + "61 120040 38333\n", + "3147 354340 36107\n", + "... ... ...\n", + "3639 420810 1\n", + "3972 510395 1\n", + "2421 316020 1\n", + "1533 290515 1\n", + "3789 431480 1\n", + "\n", + "[4307 rows x 2 columns]" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Grouping all the cases by geocode\n", + "tot_cases = df[['ID_MUNICIP']].groupby('ID_MUNICIP').size().reset_index(name='TOTAL_CASES').sort_values(by='TOTAL_CASES', ascending=False)\n", + "tot_cases" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ID_MUNICIPTOTAL_CASESPOPULACAO
0310620710562375444
1520870483971301892
250027042761787204
312004038333335796
435434036107605114
............
4302420810120315
430351039513125
430431602014135
4305290515113666
4306431480130881
\n", + "

4307 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " ID_MUNICIP TOTAL_CASES POPULACAO\n", + "0 310620 71056 2375444\n", + "1 520870 48397 1301892\n", + "2 500270 42761 787204\n", + "3 120040 38333 335796\n", + "4 354340 36107 605114\n", + "... ... ... ...\n", + "4302 420810 1 20315\n", + "4303 510395 1 3125\n", + "4304 316020 1 4135\n", + "4305 290515 1 13666\n", + "4306 431480 1 30881\n", + "\n", + "[4307 rows x 3 columns]" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.merge(tot_cases, pop, left_on='ID_MUNICIP', right_on='MUNIC_RES')\n", + "df = df[['ID_MUNICIP', 'TOTAL_CASES', 'POPULACAO']]\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ID_MUNICIPTOTAL_CASESPOPULACAOCASES_PER_100K
340411380630459213719.512195
708510719255219911596.180082
31200403833333579611415.561829
5431133036173232111190.866619
2727063072727043410324.559162
...............
388441191521171661.706980
41674312401594361.682482
41794322501613451.630125
39634119501932791.072053
418043224011255070.796768
\n", + "

4307 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " ID_MUNICIP TOTAL_CASES POPULACAO CASES_PER_100K\n", + "340 411380 630 4592 13719.512195\n", + "708 510719 255 2199 11596.180082\n", + "3 120040 38333 335796 11415.561829\n", + "54 311330 3617 32321 11190.866619\n", + "27 270630 7272 70434 10324.559162\n", + "... ... ... ... ...\n", + "3884 411915 2 117166 1.706980\n", + "4167 431240 1 59436 1.682482\n", + "4179 432250 1 61345 1.630125\n", + "3963 411950 1 93279 1.072053\n", + "4180 432240 1 125507 0.796768\n", + "\n", + "[4307 rows x 4 columns]" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['CASES_PER_100K'] = (df['TOTAL_CASES'].astype(int) / df['POPULACAO'].astype(int)) * 100000\n", + "df = df.sort_values(by='CASES_PER_100K', ascending=False)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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3r2r4cOHJ1tv48aNdezYMS1evFiTJk2Sp6enJClr1qySUvd+TnTixAk1bdpU7du3V9u2bTV37lwFBwerdOnSKlKkiCpXrqyePXtq6tSpGjx4sPF3WahQIdPfx/ny5VPFihW1aNEivf/++zb7Llq0SG5ubmrYsGGK48fHx6t+/fratGmTmjdvrl69eun69evasGGDDh8+nOx75UGvbevWrdWxY0cdPnxYRYsWNfYJCwvTsWPH9L///S9V5w3gJWcFAOA5FxUVZZVkbdiwYar3uXnzZpJttWrVsubLl894/u2331olWcPCwlIc56effrJKsi5atMhm+7p162y2p2aslOTOndsqybp8+XJjW1RUlNXb29saGBhobBsxYoTVxcXFeuzYMZv9Bw4caE2XLp01MjLSarVaradPn7ZKsrq7u1svXbr0yPXUq1fPmjt37hTb/v0aJrpx44ZVknXgwIFWq9VqDQsLs0qyLliwIEnf/v37WyVZb9++bbVardZ58+YZr92FCxesRYoUsebLl8965syZh9a6ZcsWqyTrli1bjG1VqlRJcuzY2Firl5eXtUmTJkn2LVSokDU2NtbYPmXKFKsk66FDh4xtyb2fRo8ebbVYLNY//vjD2Na2bVurJGuPHj2MbQkJCdZ69epZM2TIYP3777+N7ZKsQ4cONZ6PGzfOKsl6+vTpJMdKzfvZav3/99L27duNbZcuXbI6ODhY+/bta2xbtmxZktfNan067+PPPvvMKskaERFhbLtz547V09PT2rZt2wceY+7cuVZJ1okTJyZpS0hIMP6c2tf22rVrVkdHR+uAAQNstvfs2dPq4uJijYmJeWA9AGC1Wq0sLwcAPPeio6MlSW5ubqnex8nJyfhzVFSU/vnnH1WpUkWnTp1SVFSUJBk3VFqzZo3i4uKSHWfZsmXy8PBQjRo19M8//xiP0qVLy9XVVVu2bEn1WA+SI0cOvfnmm8Zzd3d3tWnTRr/88osuXrxo1PLaa68pU6ZMNrUEBQUpPj5e27dvtxmzSZMmxkzpk3Lr1i05ODgk2Z54DW3icuvE/01N30R//vmnqlSpori4OG3fvl25c+d+7DpdXV31zjvvGM8zZMigsmXL6tSpU0n6tmvXzuZa99dee02SbPr++/1048YN/fPPP6pQoYKsVqt++eWXJGN2797d+LPFYlH37t11584dbdy48bHOJzXv50SFCxc2zkG6N6Pr7++f7Lnf72m8j5s1ayZHR0ctWrTI6Ld+/Xr9888/Nn9nyVm+fLk8PT3Vo0ePJG0Wi+WR6/Xw8FDDhg21ePFiY/l/fHy8vv76azVq1EguLi6PPCaAlw+hGwDw3HN3d5ckXb9+PdX77Ny5U0FBQXJxcVHGjBmVNWtWDR48WJKMkFKlShU1adJEw4YNk6enpxo2bKh58+YpNjbWGOf48eOKiopStmzZlDVrVptHTEyMLl26lOqxHqRAgQJJQoOfn58kGdf1Hj9+XOvWrUtSR1BQkCQZtSTKmzdvql+v1HJyckr2nG7fvm20//t/U9M3UevWrXXp0iVt27ZNOXPm/E915sqVK8nrmSlTpiTX4UuyueY8sZ8km76RkZEKDg5W5syZ5erqqqxZs6pKlSqSlCT02tnZKV++fDbb7v+7fFSpeT+ndD6J55Tcud/vabyPM2bMqAYNGuirr74y+ixatEg5c+bU66+//sDxT548KX9/f5s7k/9Xbdq0UWRkpH766SdJ0saNG/XXX3+pdevWT+wYAF5sXNMNAHjuubu7K0eOHCneUft+J0+eVPXq1RUQEKCJEyfKx8dHGTJk0Nq1azVp0iTjpmMWi0XffPON9uzZo9WrV2v9+vV69913NWHCBO3Zs0eurq5KSEhQtmzZbGbl/i1xJjk1Y/1XCQkJqlGjhj744INk2xPDTaL7Q+2T4O3trS1btshqtdqEqwsXLkiS8XNjiTe7S9z+bxcuXFDmzJmTzII3btxYCxYs0JQpUzR69Oj/VGfiHdTvZ73vZmap6RsfH29cYz5gwAAFBATIxcVF586dU3BwsM1N7MyQ2vdzas/nQZ7G+1i6F3SXLVumXbt2qVixYlq1apW6du0qO7unP19Uq1YtZc+eXV9++aUqV66sL7/8Ul5eXsaXWQDwMIRuAMALoX79+vr888+1e/dulS9f/oF9V69erdjYWK1atcpm1i9xKfj9Xn31Vb366qsaNWqUvvrqK7Vq1UpLlixRhw4dlD9/fm3cuFEVK1ZMVYh90FgPcuLEiSRB9tixY5Jk/I5y/vz5FRMTk6ZhoGTJkvriiy8UERGhwoULG9sTbzpWsmRJSVLOnDmVNWtW7d+/P8kY+/btM/r9W48ePVSgQAF99NFH8vDw0MCBA005h0d16NAhHTt2TPPnz1ebNm2M7Rs2bEi2f0JCgk6dOmXzJcj9f5fJSWl59KO+n1PjYUuxzXwfS1Lt2rWVNWtWLVq0SOXKldPNmzdTNbOcP39+7d27V3Fxcam6236iB51vunTp1LJlS4WGhmrMmDFauXKlOnbsmOKXFwBwP5aXAwBeCB988IFcXFzUoUMH/fXXX0naT548qSlTpkj6/5m+f8/sRUVFad68eTb7XL16NcnsX2IYTFxO26xZM8XHx2vEiBFJjnn37l1du3Yt1WM9yPnz5/Xtt98az6Ojo7VgwQKVLFlSXl5eRi27d+/W+vXrk+x/7do13b1796HH+a8aNmyo9OnT69NPPzW2Wa1WzZo1Szlz5rS5u3yTJk20Zs0anT171ti2adMmHTt2zPjJqvsNGTJE/fr106BBg5L9Say0kNz7yWq1Gu+35CT+hnli3+nTpyt9+vSqXr16ivskXj+c+J560PGTez8/ipSO9TTex5Jkb2+vFi1aaOnSpQoNDVWxYsVUvHjxh47fpEkT/fPPPzavb6IHzeSndL6JWrduratXr6pz586KiYl56LXlAPBvzHQDAF4I+fPn11dffaW3335bhQoVUps2bVS0aFHduXNHu3bt0rJlyxQcHCxJqlmzpjJkyKAGDRoYH6Jnz56tbNmy2Sx3nj9/vj799FO9+eabyp8/v65fv67Zs2fL3d1ddevWlXTvGtfOnTtr9OjRCg8PV82aNZU+fXodP35cy5Yt05QpU9S0adNUjfUgfn5+at++vcLCwpQ9e3bNnTtXf/31l02w6t+/v1atWqX69esbPwF148YNHTp0SN98843OnDlj/BzSo/r111+1atUqSfdmK6OiojRy5EhJUokSJdSgQQNJ966V7t27t8aNG6e4uDi98sorWrlypX766SctWrTIZnZw8ODBWrZsmapVq6ZevXopJiZG48aNU7FixdSuXbsUaxk3bpyioqLUrVs3ubm5pXkACggIUP78+dWvXz+dO3dO7u7uWr58eYrXSDs6OmrdunVq27atypUrpx9++EHff/+9Bg8e/MAb25UuXVqS9OGHH6p58+ZKnz69GjRokOr386MoWbKk0qVLpzFjxigqKkoODg56/fXX9dVXX5n+Pk7Upk0bTZ06VVu2bNGYMWNSVXebNm20YMEC9enTR/v27dNrr72mGzduaOPGjeratWuKPzeW0mubGMYDAwNVtGhR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qypXrpyWL1+u9PR0NW3aVNeuXdMPP/ygDRs26PTp03rrrbceuN+oqCjZ2toqOjpan332mSTJyspK06ZN0y+//KKoqCht3rxZAwcONF+za9cuderUST179lRMTIzq1Kmj0aNHW/S7YsUK9e7dWx988IEOHz6srl276p133tGWLVskSenp6Xr99ddla2urXbt26bPPPtOgQYMeuP6//vpLFSpU0Nq1a3X48GG9++67ateunXbv3v3I4/yn5ORkJSYmWrwAAMCzb968ecrIyFD+/PllZ2enadOmqXXr1g/1WF9iYqIaNmyokiVLKiwszOJcaGioqlevLn9/fw0aNEgDBw7UxIkTH9MoALxoeKbbAH5+fvr555+1adMmHTp0SP/73//k7e0tSZo7d65KlSqlPXv2qFKlSvfdZ7FixTRhwgSLY3369DH/28fHR6NHj9Z7772nTz/9VJI0depUBQcHmwOqr6+vtm/frnXr1pmvCw8PV0hIiLp37y5J6tevn3bu3Knw8HDVqVNHGzdu1LFjx7R+/Xrly5dPkvTxxx+rfv36D/Q7yZ8/v/r372/++f3339f69eu1ZMkSVa5c+ZHG+U9jx47VyJEjH6g+AADw9CtSpIh++OEHXb9+XYmJifLy8tJbb72lwoULP1A/f/75p4KDg+Xk5KQVK1bIxsbmnu0DAgI0atQoJScny87O7lGGAOAFxEy3ATIyMmQymXT06FF5e3ubA7cklSxZUq6urjp69OgD9VmhQoVMxzZu3Ki6desqf/78cnJyUrt27XT16lXduHFDknT06FEFBARYXFO1alWLn48eParq1atbHKtevbq5vjtjuBO4s+rjfqSlpWnUqFEqU6aMcufOLUdHR61fv15nz5595HH+05AhQ5SQkGB+nTt37oHrBQAAT69cuXLJy8tLf/zxh9avX6+mTZve97WJiYmqV6+ebG1ttXr16kzPiGclJiZGbm5uBG4AD4WZbgMcPXpUhQoVuq+2VlZWmTbmSE1NzdQuV65cFj/HxsaqUaNG6tatm8aMGaPcuXNr27Zt6tSpk1JSUpQzZ86HH8ADurOk6+/j+OcYJk6cqKlTp2rKlCnm57P79OmTabO0xzFOOzs73hQBAHgOrV+/XhkZGSpevLh+/fVXDRgwQH5+fnrnnXck3f4e7rNnz+rChQuSpOPHj0uSPD095enpaQ7c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2r17t1q0aCFfX1+VKlVK/fr1086dOyVJkydPVpkyZZQrVy55e3ure/fuSkpKMvcRGRkpV1dXrV+/XiVKlJCjo6OCg4MVFxdnbrNnzx699tprypMnj1xcXFSrVi3t37/fohaTyaRZs2apSZMmypUrl8aMGaO0tDR16tTJvFysePHimjp1qsV1ISEhatasmcLDw+Xl5SV3d3f16NFDqamp5jbz5s1TxYoV5eTkJE9PT7Vp04ZlYAAAPCeqVaumTZs26cSJE5KkgwcPatu2bapfv74kKTk5WZJkb29vvsbKykp2dnbatm1bln1ev35dERERKlSokLy9vbNsM3fuXOXMmVNvvPHG4xwOAGRC6H5GXbt2TevWrVOPHj2UK1euTOddXV0l3X5TmjZtmn755RdFRUVp8+bNGjhwoEXbGzduKDw8XPPmzdOPP/6os2fPqn///ubzf/75pzp06KBt27Zp586dKlasmBo0aKA///zTop+wsDA1b95chw4dUseOHZWenq6XX35ZS5cu1ZEjRzR8+HB9+OGHWrJkicV1W7Zs0alTp7RlyxZFRUUpMjJSkZGR5vOpqakaNWqUDh48qJUrVyo2NlYhISGP9gsEAABPhcGDB6tVq1by8/OTjY2N/P391adPH7Vt21aS5OfnpwIFCmjIkCH6448/lJKSovHjx+u3336zmCSQpE8//VSOjo5ydHTUd999pw0bNsjW1jbL+86ZM0dt2rSRg4OD4WME8GJjefkzavfu3QoICNDy5cvVvHnz+77um2++0XvvvacrV65Iuj3T/c4771gsvfr000/10Ucf6eLFi1n2kZ6eLldXVy1YsECNGjWSdHumu0+fPvrkk0/uef+ePXvq4sWL+uabbyTdnuneunWrTp06pRw5ckiSWrZsKSsrKy1atCjLPvbu3atKlSrpzz//lKOjY6bzycnJ5k/FpdtLQry9vVleDgDAU2awfx4tWrRIAwYM0MSJE1WqVCnFxMSoT58+mjx5sjp06CBJ2rdvnzp16qSDBw8qR44cCgwMlJWVlTIyMvTdd9+Z+0tISNDly5cVFxen8PBwnT9/XtHR0Raz5JK0Y8cOVatWTXv37lWFChWe6JgBPFtYXv4Cu9/PSjZu3Ki6desqf/78cnJyUrt27XT16lXduHHD3CZnzpwWzzp5eXlZLN++dOmSunTpomLFisnFxUXO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Q2Vvb29us2PHDgUHB6tevXravXu39uzZo549e8rK6v/+ZF22bJnatWund955RwcPHlR0dLTatGnzRMcLAA/COjtv3qJFC6WkpCgqKkqFCxfWpUuXtGnTJl29etXcpkGDBmrQoIEkqUOHDtlV6n1p2bKlWrZsmd1laOPGjSpVqpSuXLmiMWPGqFGjRjpx4oReeuklSZKLi8tjuU+XLl300Ucf6caNG5o7d6569OghNzc3tW7dOlPblJQU2draPpb7AgCAp8v27dvVtGlTNWzYUJLk4+OjhQsXavfu3eY2Q4cOVYMGDTRhwgTzsSJFilj007dvX/Xq1UuDBw82HytevLj537du3VLv3r01ceJEderUyXy8ZMmSj31MAPC4ZNtMd3x8vH766SeNHz9ederUUcGCBVW5cmUNGTJETZo0MbebPHmyypQpo1y5csnb21vdu3dXUlKSRV/Lli1TqVKlZGdnJx8fH02aNOmB65k1a5aKFCkiW1tbFS9eXPPmzTOfy8jIUFhYmHlGPl++fOrVq5f5fHJysvr376/8+fMrV65cCggI0NatW+95v5MnT6pmzZrmWeINGzZkanPo0CG9+uqrcnBwkLu7u959991MY8+Ku7u7PD09Vbp0aX344YdKTEzUrl27zOf/ubw8OTlZvXr1Ut68eWVvb68aNWpoz549/3qfnDlzytPTU4ULF1ZYWJiKFSum1atXS7o9Y92zZ0/16dNHefLkUVBQkCTp8OHDql+/vhwdHfXSSy+pXbt2unLlirmuH374QVOnTjXPosfGxkqSfvjhB1WuXFl2dnby8vLS4MGDdevWrX+tEQAAGK9atWratGmTTpw4IUk6ePCgtm3bpvr160uS0tPTtXbtWvn6+iooKEh58+ZVQECAxWN1ly9f1q5du5Q3b15Vq1ZNL730kmrVqqVt27aZ2+zfv1/nz5+XlZWV/P395eXlpfr16+vw4cNPdLwA8CCyLXQ7OjrK0dFRK1euVHJy8l3bWVlZadq0aeZl25s3b9bAgQPN5/ft26eWLVuqVatWOnTokMLCwhQaGvpAy6dXrFih3r1764MPPtDhw4fVtWtXvfPOO9qyZYuk26H+k08+0eeff66TJ09q5cqVKlOmjPn6nj17aseOHVq0aJF+/vlnvfnmmwoODtbJkyezvF96erpef/112draateuXfrss880aNAgizbXr19XUFCQ3NzctGfPHi1dulQbN25Uz54973tcN2/e1Ny5cyXpnrPMAwcO1LJlyxQVFaX9+/eraNGiCgoK0rVr1+77XpLk4OCglJQU889RUVGytbVVdHS0PvvsM8XHx+vVV1+Vv7+/9u7dq3Xr1unSpUvm1QFTp05V1apV1aVLF8XFxSkuLk7e3t46f/68GjRooEqVKungwYOaNWuW5syZo9GjRz9QfQAAwBiDBw9Wq1at5OfnJxsbG/n7+6tPnz5q27atpNuBOikpSePGjVNwcLC+//57NW/eXK+//rp++OEHSdLp06clSWFhYerSpYvWrVun8uXLq27duua/qf7eZtiwYVqzZo3c3NxUu3btB/67BQCelGxbXm5tba3IyEh16dJFn332mcqXL69atWqpVatWKlu2rLnd35/v9fHx0ejRo/Xee++Znx+ePHmy6tatq9DQUEmSr6+vjhw5ookTJyokJOS+agkPD1dISIi6d+8uSerXr5927typ8PBw1alTR2fPnpWnp6cCAwNlY2OjAgUKqHLlypKks2fPKiIiQmfPnlW+fPkkSf3799e6desUERGhjz/+ONP9Nm7cqGPHjmn9+vXmaz7++GPzp8GStGDBAv3111+aO3eucuXKJUmaMWOGGjdurPHjx5uXimelWrVqsrKy0o0bN5SRkaEKFSqobt26Wba9fv26Zs2apcjISPP9Z8+erQ0bNmjOnDkaMGDAv/7+0tLStHDhQv3888969913zceLFStmsYRs9OjR8vf3t/idfPXVV/L29taJEyfk6+srW1tb8wz6HZ9++qm8vb01Y8YMmUwm+fn56cKFCxo0aJCGDx9u8ZyXdHvm/u8f5CQmJv7rGAAAwMNbsmSJ5s+frwULFqhUqVKKiYlRnz59lC9fPnXo0EHp6emSpKZNm6pv376SpFdeeUXbt2/XZ599plq1apnb3Jn8kCR/f39t2rRJX331lcaOHWtuM3ToULVo0UKSFBERoZdffllLly5V165dn/TQAeBfZetGai1atNCFCxe0evVqBQcHa+vWrSpfvrzFLPXGjRtVt25d5c+fX05OTmrXrp2uXr2qGzduSLq9C2b16tUt+q1evbpOnjyptLS0+6rjbn3c+dqvN998Uzdv3lThwoXVpUsXrVixwry0+dChQ0pLS5Ovr6959t7R0VE//PCDTp06ddf7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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from pysus.utilities.brasil import get_city_name_by_geocode\n", + "from pysus.preprocessing.decoders import calculate_digit\n", + "import matplotlib.pyplot as plt\n", + "\n", + "df = df.sort_values(by='CASES_PER_100K', ascending=True).head(20)\n", + "# Get city name\n", + "df['MUNICIP_NAME'] = df['ID_MUNICIP'].apply(lambda x: get_city_name_by_geocode(int(str(x) + str(calculate_digit(x)))))\n", + "\n", + "plt.figure(figsize=(10, 12))\n", + "bars = plt.barh(df['MUNICIP_NAME'], df['CASES_PER_100K'], color='skyblue')\n", + "plt.ylabel('City')\n", + "plt.xlabel('Cases per 100k inhabitants')\n", + "plt.title('Cases per 100k inhabitants by city')\n", + "\n", + "# Adding labels with CASES_PER_100K values\n", + "for bar in bars:\n", + " plt.text(bar.get_width(), bar.get_y() + bar.get_height()/2, f'{int(bar.get_width())}', \n", + " va='center', ha='left', color='black')\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] } ], "metadata": { @@ -2415,7 +2479,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.11.8" }, "latex_envs": { "LaTeX_envs_menu_present": true, diff --git a/pysus/online_data/SINAN.py b/pysus/online_data/SINAN.py index e209b9b..83901fe 100644 --- a/pysus/online_data/SINAN.py +++ b/pysus/online_data/SINAN.py @@ -54,7 +54,6 @@ def metadata_df(disease_code: str) -> pd.DataFrame: header=0, sep=",", quotechar='"', - error_bad_lines=False, ) return df.iloc[:, 1:] diff --git a/pysus/utilities/brasil.py b/pysus/utilities/brasil.py index 6fbf1cc..e2655c9 100644 --- a/pysus/utilities/brasil.py +++ b/pysus/utilities/brasil.py @@ -2,6 +2,13 @@ from pathlib import Path from typing import Union +with open( + f"{Path(__file__).parent}/municipios.json", 'r', encoding='utf-8-sig' +) as muns: + MUNICIPALITIES = json.loads(muns.read()) + +MUN_BY_GEOCODE = {mun["geocodigo"]: mun["municipio"] for mun in MUNICIPALITIES} + UFs = { "BR": "Brasil", @@ -57,12 +64,4 @@ def get_city_name_by_geocode(geocode: Union[str, int]): :return: City name """ - with open(f"{Path(__file__).parent}/municipios.json") as muns: - _mun_decoded = muns.read().encode().decode("utf-8-sig") - municipalities = json.loads(_mun_decoded) - - mun_by_geocode = { - mun["geocodigo"]: mun["municipio"] for mun in municipalities - } - - return mun_by_geocode[int(geocode)] + return MUN_BY_GEOCODE[int(geocode)]