Obtaining data from IBGE¶
[1]:
import pandas as pd
from pysus.online_data import IBGE
import ipywidgets as widgets
%matplotlib inline
Listing Subject Areas¶
IBGE makes available data from a number of surveys on different subjects. We can find out what is available, before downloading data.
[3]:
ag = IBGE.list_agregados()
ag
Fetching Data groupings from https://servicodados.ibge.gov.br/api/v3/agregados?
[3]:
id | nome | agregados | |
---|---|---|---|
0 | D5 | Áreas Urbanizadas | [{'id': '8418', 'nome': 'Áreas urbanizadas, Lo... |
1 | CL | Cadastro Central de Empresas | [{'id': '1732', 'nome': 'Dados gerais das empr... |
2 | CA | Censo Agropecuário | [{'id': '1278', 'nome': 'Agroindústria rural n... |
3 | ME | Censo Comum do Mercosul, Bolívia e Chile | [{'id': '2059', 'nome': 'Domicílios e Populaçã... |
4 | CD | Censo Demográfico | [{'id': '1301', 'nome': 'Área e Densidade demo... |
... | ... | ... | ... |
62 | VS | Produção da Extração Vegetal e da Silvicultura | [{'id': '5930', 'nome': 'Área total existente ... |
63 | PO | Produção de Ovos de Galinha | [{'id': '915', 'nome': 'Número de informantes,... |
64 | IO | Produto Interno Bruto dos Municípios | [{'id': '599', 'nome': 'Índice de Gini do prod... |
65 | XE | Projeção da População | [{'id': '7362', 'nome': 'Esperança de vida ao ... |
66 | SI | Sistema Nacional de Pesquisa de Custos e Índic... | [{'id': '33', 'nome': 'Custo de projeto m², po... |
67 rows × 3 columns
Let’s look at the datasets (called “agregados”) available within the category of “Censo Demografico”.
[4]:
pd.DataFrame(ag[ag.id=='CM'].agregados.iloc[0])
[4]:
id | nome | |
---|---|---|
0 | 479 | Chefes de domicílios particulares permanentes ... |
1 | 798 | Domicílios particulares ocupados por sexo da p... |
2 | 482 | Domicílios particulares permanentes por sexo d... |
3 | 580 | Domicílios particulares permanentes, População... |
4 | 579 | Domicílios particulares permanentes, População... |
5 | 797 | Domicílios recenseados por espécie de domicílio |
6 | 319 | Média de moradores por domicílio particular pe... |
7 | 553 | Média de moradores por domicílio particular pe... |
8 | 481 | Média de moradores por domicílio particular pe... |
9 | 552 | Média de moradores por domicílio particular pe... |
10 | 476 | Pessoas de 4 anos ou mais de idade por frequên... |
11 | 473 | Pessoas de 4 anos ou mais de idade por grupos ... |
12 | 477 | Pessoas de 4 anos ou mais que frequentam escol... |
13 | 484 | Pessoas não residentes no município de residên... |
14 | 478 | Pessoas não residentes no município de residên... |
15 | 794 | População recenseada por situação do domicílio... |
16 | 793 | População residente |
17 | 305 | População residente em domicílios particulares... |
18 | 475 | População residente por grupos de idade, sexo ... |
19 | 472 | População residente por idade, forma de declar... |
20 | 480 | População residente por relação com o chefe do... |
Again for population projections
[5]:
pd.DataFrame(ag[ag.id=='XE'].agregados.iloc[0])
[5]:
id | nome | |
---|---|---|
0 | 7362 | Esperança de vida ao nascer e Taxa de mortalid... |
1 | 7360 | Indicadores implícitos na projeção da população |
2 | 7358 | População, por sexo e idade |
3 | 7365 | Proporção de pessoas, por grupo de idade |
4 | 7363 | Taxa específica de fecundidade, por grupo de i... |
Downloading data¶
Before downloading the data, it may be useful to look at the metadata of the dataset we are interested in.
[6]:
opts= [(r.nome, int(r.id)) for r in pd.DataFrame(ag[ag.id=='CM'].agregados.iloc[0]).itertuples()]
ds = widgets.Dropdown(
options=opts,
value=475,
description='Number:',
)
display(ds)
IBGE.metadados(ds.value)
[6]:
{'id': 475,
'nome': 'População residente por grupos de idade, sexo e situação',
'URL': 'http://sidra.ibge.gov.br/tabela/475',
'pesquisa': 'Contagem da População ',
'assunto': 'Pessoas',
'periodicidade': {'frequencia': 'anual', 'inicio': 1996, 'fim': 1996},
'nivelTerritorial': {'Administrativo': ['N102',
'N1',
'N10',
'N2',
'N8',
'N9',
'N6',
'N3'],
'Especial': [],
'IBGE': []},
'variaveis': [{'id': 93,
'nome': 'População residente',
'unidade': 'Pessoas',
'sumarizacao': []},
{'id': 1000093,
'nome': 'População residente - percentual do total geral',
'unidade': '%',
'sumarizacao': []}],
'classificacoes': [{'id': 58,
'nome': 'Grupo de idade',
'sumarizacao': {'status': True, 'excecao': []},
'categorias': [{'id': 0, 'nome': 'Total', 'unidade': None, 'nivel': 0},
{'id': 1140, 'nome': '0 a 4 anos', 'unidade': None, 'nivel': 1},
{'id': 1141, 'nome': '5 a 9 anos', 'unidade': None, 'nivel': 1},
{'id': 1142, 'nome': '10 a 14 anos', 'unidade': None, 'nivel': 1},
{'id': 1143, 'nome': '15 a 19 anos', 'unidade': None, 'nivel': 1},
{'id': 1144, 'nome': '20 a 24 anos', 'unidade': None, 'nivel': 1},
{'id': 1145, 'nome': '25 a 29 anos', 'unidade': None, 'nivel': 1},
{'id': 1146, 'nome': '30 a 34 anos', 'unidade': None, 'nivel': 1},
{'id': 1147, 'nome': '35 a 39 anos', 'unidade': None, 'nivel': 1},
{'id': 1148, 'nome': '40 a 44 anos', 'unidade': None, 'nivel': 1},
{'id': 1149, 'nome': '45 a 49 anos', 'unidade': None, 'nivel': 1},
{'id': 1150, 'nome': '50 a 54 anos', 'unidade': None, 'nivel': 1},
{'id': 1151, 'nome': '55 a 59 anos', 'unidade': None, 'nivel': 1},
{'id': 1152, 'nome': '60 a 64 anos', 'unidade': None, 'nivel': 1},
{'id': 1153, 'nome': '65 a 69 anos', 'unidade': None, 'nivel': 1},
{'id': 3244, 'nome': '70 anos ou mais', 'unidade': None, 'nivel': 1},
{'id': 3245, 'nome': 'Idade ignorada', 'unidade': None, 'nivel': 1}]},
{'id': 2,
'nome': 'Sexo',
'sumarizacao': {'status': True, 'excecao': []},
'categorias': [{'id': 0, 'nome': 'Total', 'unidade': None, 'nivel': 0},
{'id': 4, 'nome': 'Homens', 'unidade': None, 'nivel': 1},
{'id': 5, 'nome': 'Mulheres', 'unidade': None, 'nivel': 1}]},
{'id': 1,
'nome': 'Situação do domicílio',
'sumarizacao': {'status': True, 'excecao': []},
'categorias': [{'id': 0, 'nome': 'Total', 'unidade': None, 'nivel': 0},
{'id': 1, 'nome': 'Urbana', 'unidade': None, 'nivel': 1},
{'id': 2, 'nome': 'Rural', 'unidade': None, 'nivel': 1}]}]}
[7]:
IBGE.lista_periodos(475)
[7]:
id | literals | |
---|---|---|
0 | 1996 | [1996] |
[8]:
IBGE.localidades_por_agregado(475, nivel='N3')
[8]:
id | nome | nivel | |
---|---|---|---|
0 | 11 | Rondônia | {'id': 'N3', 'nome': 'Unidade da Federação'} |
1 | 12 | Acre | {'id': 'N3', 'nome': 'Unidade da Federação'} |
2 | 13 | Amazonas | {'id': 'N3', 'nome': 'Unidade da Federação'} |
3 | 14 | Roraima | {'id': 'N3', 'nome': 'Unidade da Federação'} |
4 | 15 | Pará | {'id': 'N3', 'nome': 'Unidade da Federação'} |
5 | 16 | Amapá | {'id': 'N3', 'nome': 'Unidade da Federação'} |
6 | 17 | Tocantins | {'id': 'N3', 'nome': 'Unidade da Federação'} |
7 | 21 | Maranhão | {'id': 'N3', 'nome': 'Unidade da Federação'} |
8 | 22 | Piauí | {'id': 'N3', 'nome': 'Unidade da Federação'} |
9 | 23 | Ceará | {'id': 'N3', 'nome': 'Unidade da Federação'} |
10 | 24 | Rio Grande do Norte | {'id': 'N3', 'nome': 'Unidade da Federação'} |
11 | 25 | Paraíba | {'id': 'N3', 'nome': 'Unidade da Federação'} |
12 | 26 | Pernambuco | {'id': 'N3', 'nome': 'Unidade da Federação'} |
13 | 27 | Alagoas | {'id': 'N3', 'nome': 'Unidade da Federação'} |
14 | 28 | Sergipe | {'id': 'N3', 'nome': 'Unidade da Federação'} |
15 | 29 | Bahia | {'id': 'N3', 'nome': 'Unidade da Federação'} |
16 | 31 | Minas Gerais | {'id': 'N3', 'nome': 'Unidade da Federação'} |
17 | 32 | Espírito Santo | {'id': 'N3', 'nome': 'Unidade da Federação'} |
18 | 33 | Rio de Janeiro | {'id': 'N3', 'nome': 'Unidade da Federação'} |
19 | 35 | São Paulo | {'id': 'N3', 'nome': 'Unidade da Federação'} |
20 | 41 | Paraná | {'id': 'N3', 'nome': 'Unidade da Federação'} |
21 | 42 | Santa Catarina | {'id': 'N3', 'nome': 'Unidade da Federação'} |
22 | 43 | Rio Grande do Sul | {'id': 'N3', 'nome': 'Unidade da Federação'} |
23 | 50 | Mato Grosso do Sul | {'id': 'N3', 'nome': 'Unidade da Federação'} |
24 | 51 | Mato Grosso | {'id': 'N3', 'nome': 'Unidade da Federação'} |
25 | 52 | Goiás | {'id': 'N3', 'nome': 'Unidade da Federação'} |
26 | 53 | Distrito Federal | {'id': 'N3', 'nome': 'Unidade da Federação'} |
To actually download the data after chosing the dataset, we can use the FetchData
class, which will fetch the data and make it available both in JSON format and Dataframe as exemplified below.
[19]:
ds = IBGE.FetchData(475,periodos=1996,variavel=93,localidades='N3[all]',
classificacao='58[all]|2[4,5]|1[all]',view='flat')
ds.JSON[0]
Fetching https://servicodados.ibge.gov.br/api/v3/agregados/475/periodos/1996/variaveis/93?localidades=N3[all]&classificacao=58[all]|2[4,5]|1[all]&view=flat
[19]:
{'NC': 'Nível Territorial (Código)',
'NN': 'Nível Territorial',
'D1C': 'Unidade da Federação (Código)',
'D1N': 'Unidade da Federação',
'D2C': 'Ano (Código)',
'D2N': 'Ano',
'D3C': 'Variável (Código)',
'D3N': 'Variável',
'D4C': 'Grupo de idade (Código)',
'D4N': 'Grupo de idade',
'D5C': 'Sexo (Código)',
'D5N': 'Sexo',
'D6C': 'Situação do domicílio (Código)',
'D6N': 'Situação do domicílio',
'MC': 'Unidade de Medida (Código)',
'MN': 'Unidade de Medida',
'V': 'Valor'}
[17]:
ds.to_dataframe()
[17]:
NC | NN | D1C | D1N | D2C | D2N | D3C | D3N | D4C | D4N | D5C | D5N | D6C | D6N | MC | MN | V | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Nível Territorial (Código) | Nível Territorial | Unidade da Federação (Código) | Unidade da Federação | Ano (Código) | Ano | Variável (Código) | Variável | Grupo de idade (Código) | Grupo de idade | Sexo (Código) | Sexo | Situação do domicílio (Código) | Situação do domicílio | Unidade de Medida (Código) | Unidade de Medida | Valor |
1 | 3 | Unidade da Federação | 11 | Rondônia | 1996 | 1996 | 93 | População residente | 0 | Total | 4 | Homens | 0 | Total | 45 | Pessoas | 633594 |
2 | 3 | Unidade da Federação | 11 | Rondônia | 1996 | 1996 | 93 | População residente | 0 | Total | 4 | Homens | 1 | Urbana | 45 | Pessoas | 380119 |
3 | 3 | Unidade da Federação | 11 | Rondônia | 1996 | 1996 | 93 | População residente | 0 | Total | 4 | Homens | 2 | Rural | 45 | Pessoas | 253475 |
4 | 3 | Unidade da Federação | 11 | Rondônia | 1996 | 1996 | 93 | População residente | 0 | Total | 5 | Mulheres | 0 | Total | 45 | Pessoas | 595712 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2750 | 3 | Unidade da Federação | 53 | Distrito Federal | 1996 | 1996 | 93 | População residente | 3245 | Idade ignorada | 4 | Homens | 1 | Urbana | 45 | Pessoas | 1073 |
2751 | 3 | Unidade da Federação | 53 | Distrito Federal | 1996 | 1996 | 93 | População residente | 3245 | Idade ignorada | 4 | Homens | 2 | Rural | 45 | Pessoas | 94 |
2752 | 3 | Unidade da Federação | 53 | Distrito Federal | 1996 | 1996 | 93 | População residente | 3245 | Idade ignorada | 5 | Mulheres | 0 | Total | 45 | Pessoas | 1381 |
2753 | 3 | Unidade da Federação | 53 | Distrito Federal | 1996 | 1996 | 93 | População residente | 3245 | Idade ignorada | 5 | Mulheres | 1 | Urbana | 45 | Pessoas | 1286 |
2754 | 3 | Unidade da Federação | 53 | Distrito Federal | 1996 | 1996 | 93 | População residente | 3245 | Idade ignorada | 5 | Mulheres | 2 | Rural | 45 | Pessoas | 95 |
2755 rows × 17 columns
Using the SIDRA endpoint¶
IBGE also has a simpler API at https://api.sidra.ibge.gov.br that PySUS also gives access through a simple function. Below we have table 200, which is a sample from the resident population. classification 2
is sex, of which I am fetching all categories: total
, Homens
, and Mulheres
. Terrotorial level 6 is municipality.
[4]:
df = IBGE.get_sidra_table(200,territorial_level=6,classification=2, categories='all')
df
Requesting data from https://apisidra.ibge.gov.br/values/t/200/n6/all/c2/all
[4]:
NC | NN | D1C | D1N | D2C | D2N | D3C | D3N | D4C | D4N | D5C | D5N | D6C | D6N | MC | MN | V | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Nível Territorial (Código) | Nível Territorial | Município (Código) | Município | Sexo (Código) | Sexo | Ano (Código) | Ano | Variável (Código) | Variável | Situação do domicílio (Código) | Situação do domicílio | Grupo de idade (Código) | Grupo de idade | Unidade de Medida (Código) | Unidade de Medida | Valor |
1 | 6 | Município | 1100015 | Alta Floresta D'Oeste - RO | 0 | Total | 2010 | 2010 | 93 | População residente | 0 | Total | 0 | Total | 45 | Pessoas | 24392 |
2 | 6 | Município | 1100015 | Alta Floresta D'Oeste - RO | 4 | Homens | 2010 | 2010 | 93 | População residente | 0 | Total | 0 | Total | 45 | Pessoas | 12656 |
3 | 6 | Município | 1100015 | Alta Floresta D'Oeste - RO | 5 | Mulheres | 2010 | 2010 | 93 | População residente | 0 | Total | 0 | Total | 45 | Pessoas | 11736 |
4 | 6 | Município | 1100023 | Ariquemes - RO | 0 | Total | 2010 | 2010 | 93 | População residente | 0 | Total | 0 | Total | 45 | Pessoas | 90353 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16691 | 6 | Município | 5222302 | Vila Propício - GO | 4 | Homens | 2010 | 2010 | 93 | População residente | 0 | Total | 0 | Total | 45 | Pessoas | 2689 |
16692 | 6 | Município | 5222302 | Vila Propício - GO | 5 | Mulheres | 2010 | 2010 | 93 | População residente | 0 | Total | 0 | Total | 45 | Pessoas | 2456 |
16693 | 6 | Município | 5300108 | Brasília - DF | 0 | Total | 2010 | 2010 | 93 | População residente | 0 | Total | 0 | Total | 45 | Pessoas | 2570160 |
16694 | 6 | Município | 5300108 | Brasília - DF | 4 | Homens | 2010 | 2010 | 93 | População residente | 0 | Total | 0 | Total | 45 | Pessoas | 1228880 |
16695 | 6 | Município | 5300108 | Brasília - DF | 5 | Mulheres | 2010 | 2010 | 93 | População residente | 0 | Total | 0 | Total | 45 | Pessoas | 1341280 |
16696 rows × 17 columns
Suppose we just wanted a single municipality, Balneário Rincão (SC)
: Unfortunately for this one there is no data available, thus the ...
in the column Valor
. Try another one.
[11]:
single = IBGE.get_sidra_table(200,territorial_level=6, geocode=4220000,period='last',classification=2, categories='all')
single
Requesting data from https://apisidra.ibge.gov.br/values/t/200/n6/4220000/p/last/c2/all
[11]:
NC | NN | D1C | D1N | D2C | D2N | D3C | D3N | D4C | D4N | D5C | D5N | D6C | D6N | MC | MN | V | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Nível Territorial (Código) | Nível Territorial | Município (Código) | Município | Ano (Código) | Ano | Sexo (Código) | Sexo | Variável (Código) | Variável | Situação do domicílio (Código) | Situação do domicílio | Grupo de idade (Código) | Grupo de idade | Unidade de Medida (Código) | Unidade de Medida | Valor |
1 | 6 | Município | 4220000 | Balneário Rincão (SC) | 2010 | 2010 | 0 | Total | 93 | População residente | 0 | Total | 0 | Total | 45 | Pessoas | ... |
2 | 6 | Município | 4220000 | Balneário Rincão (SC) | 2010 | 2010 | 4 | Homens | 93 | População residente | 0 | Total | 0 | Total | 45 | Pessoas | ... |
3 | 6 | Município | 4220000 | Balneário Rincão (SC) | 2010 | 2010 | 5 | Mulheres | 93 | População residente | 0 | Total | 0 | Total | 45 | Pessoas | ... |
[ ]: