diff --git a/bases/br_ans_beneficiario/dataset_config.yaml b/bases/br_ans_beneficiario/dataset_config.yaml new file mode 100644 index 000000000..c89f1e843 --- /dev/null +++ b/bases/br_ans_beneficiario/dataset_config.yaml @@ -0,0 +1,41 @@ + +# Nome (slug) do conjunto no CKAN +# Exemplos: br-ibge-populacao, br-tse-eleicoes +name: br-ans-beneficiarios + +# Título do conjunto, a ser exibido no mecanismo de busca. +# Exemplo: População brasileira +title: Beneficiarios de plano de Saúde + +# Qual organização disponibiliza os dados originais? +# Opções: escolher dessa lista -> https://basedosdados.org/api/3/action/organization_list +# Se a organização não estiver na lista acima ou o nome não estiver conforme o manual de estilo +# criar ou renomear a organização em https://basedosdados.org/organization/ +# Exemplos: br-ibge, br-tse, br-rj-gov +organization: br-ans + +# Descrição do conjunto +notes: + +# Quais temas caracterizam a base? +# Opções: escolher dessa lista -> https://basedosdados.org/api/3/action/group_list +# Importante: preencher com a chave, e não o valor. +groups: + - saude + +# Quais etiquetas caracterizam a base? +# Opções: escolher dessa lista -> https://basedosdados.org/api/3/action/tag_list +# Exemplos: +# - fertilidade +# - preco +# - desmatamento +# Caso crie etiquetas novas, as regras são: +# - letras minúsculas +# - sem acentos +# - sempre no singular +# - não repita nomes de grupos (ex. educacao, saude, meio ambiente, economia, etc.) +tags: + +# Não altere esse campo. +# Data da última modificação dos metadados gerada automaticamente pelo CKAN. +metadata_modified: diff --git a/bases/br_ans_beneficiario/informacao_consolidada/.gitignore b/bases/br_ans_beneficiario/informacao_consolidada/.gitignore new file mode 100644 index 000000000..1aafc3b01 --- /dev/null +++ b/bases/br_ans_beneficiario/informacao_consolidada/.gitignore @@ -0,0 +1,2 @@ +input +output diff --git a/bases/br_ans_beneficiario/informacao_consolidada/code/count_lines.py b/bases/br_ans_beneficiario/informacao_consolidada/code/count_lines.py new file mode 100644 index 000000000..f8e6a9331 --- /dev/null +++ b/bases/br_ans_beneficiario/informacao_consolidada/code/count_lines.py @@ -0,0 +1,15 @@ +from glob import glob +import pandas as pd +from loguru import logger + +csv_filepaths = glob('../input/**/*.csv', recursive=True) + +count = 0 +for filepath in csv_filepaths: + logger.info(f"reading {filepath}") + df = pd.read_csv(filepath, encoding="utf-8", index_col=0) + size = len(df.index) + logger.debug(f"{filepath} has {size}") + count += size + +logger.info(f"Total: {count}") diff --git a/bases/br_ans_beneficiario/informacao_consolidada/code/pipeline.py b/bases/br_ans_beneficiario/informacao_consolidada/code/pipeline.py new file mode 100644 index 000000000..fec903500 --- /dev/null +++ b/bases/br_ans_beneficiario/informacao_consolidada/code/pipeline.py @@ -0,0 +1,164 @@ +from typing import Optional, Tuple +from dateutil.relativedelta import relativedelta +import pandas as pd +from multiprocessing import Pool +from datetime import datetime +from loguru import logger +from pathlib import Path +from ftputil import FTPHost +from datetime import datetime +from io import BytesIO +import tempfile +import zipfile +from functools import reduce + +host = FTPHost('ftp.dadosabertos.ans.gov.br', 'anonymous') +host.keep_alive() + +TABLE_NAME = 'informacoes_consolidadas_de_beneficiarios' +FTP_PATH = 'FTP/PDA/informacoes_consolidadas_de_beneficiarios' +RAW_COLLUNS_TYPE = { + '#ID_CMPT_MOVEL': str, + 'CD_OPERADORA': str, + 'NM_RAZAO_SOCIAL': str, + 'NR_CNPJ': str, + 'MODALIDADE_OPERADORA': str, + 'SG_UF': str, + 'CD_MUNICIPIO': str, + 'NM_MUNICIPIO': str, + 'TP_SEXO': str, + 'DE_FAIXA_ETARIA': str, + 'DE_FAIXA_ETARIA_REAJ': str, + 'CD_PLANO': str, + 'TP_VIGENCIA_PLANO': str, + 'DE_CONTRATACAO_PLANO': str, + 'DE_SEGMENTACAO_PLANO': str, + 'DE_ABRG_GEOGRAFICA_PLANO': str, + 'COBERTURA_ASSIST_PLAN': str, + 'TIPO_VINCULO': str, + 'QT_BENEFICIARIO_ATIVO': int, + 'QT_BENEFICIARIO_ADERIDO': int, + 'QT_BENEFICIARIO_CANCELADO': int, + 'QT_BENEFICIARIO_CANCELADO': int, + 'DT_CARGA': str, +} + + +def range_year_month(start: datetime, stop = datetime.now(), step = relativedelta(months=1)): + if (start > stop): + return + + yield start + yield from range_year_month(start + step, stop) + +def host_months_path(): + for date in range_year_month(datetime(2014, 5, 1), datetime(2022, 12, 31)): + month_path = date.strftime("%Y%m") + yield FTP_PATH + '/' + month_path, date + + + +def host_list(basepath: str): + for path in host.listdir(basepath)[::-1]: + complete_path = host.path.join(basepath, str(path)) + yield complete_path + +def host_read(path: str) -> BytesIO: + filename, file_extension = host.path.splitext(host.path.basename(path)) + with tempfile.NamedTemporaryFile(prefix=filename, suffix=file_extension) as tmp: + logger.info(f'ftp downloading {path}') + host.download(path, tmp.name) + return BytesIO(tmp.read()) + +def read_csv_zip_to_dataframe(path) -> pd.DataFrame: + zfile = host_read(path) + with zipfile.ZipFile(zfile) as zref: + for filename in zref.namelist(): + if not filename.endswith('.csv'): + continue + path = host.path.join(host.path.dirname(path), filename) + logger.debug(f"load {path}") + + filecontent = BytesIO(zref.read(filename)) + + return pd.read_csv(filecontent, sep=';', encoding='cp1252', dtype=RAW_COLLUNS_TYPE) + raise Exception(f"CSV not foun in {path}") + +def process(df: pd.DataFrame): + time_col = pd.to_datetime(df['#ID_CMPT_MOVEL'], format='%Y%m') + df['ano'] = time_col.dt.year + df['mes'] = time_col.dt.month + del df['#ID_CMPT_MOVEL'] + del df['NM_MUNICIPIO'] + del df['DT_CARGA'] + + df.rename(columns={ + 'CD_OPERADORA': 'codigo_operadora', + 'NM_RAZAO_SOCIAL': 'razao_social', + 'NR_CNPJ': 'cnpj', + 'MODALIDADE_OPERADORA': 'modalidade_operadora', + 'SG_UF': 'sigla_uf', + 'CD_MUNICIPIO': 'id_municipio_6', + 'TP_SEXO': 'sexo', + 'DE_FAIXA_ETARIA': 'faixa_etaria', + 'DE_FAIXA_ETARIA_REAJ': 'faixa_etaria_reajuste', + 'CD_PLANO': 'codigo_plano', + 'TP_VIGENCIA_PLANO': 'tipo_vigencia_plano', + 'DE_CONTRATACAO_PLANO': 'contratacao_beneficiario', + 'DE_SEGMENTACAO_PLANO': 'segmentacao_beneficiario', + 'DE_ABRG_GEOGRAFICA_PLANO': 'abrangencia_beneficiario', + 'COBERTURA_ASSIST_PLAN': 'cobertura_assistencia_beneficiario', + 'TIPO_VINCULO': 'tipo_vinculo', + 'QT_BENEFICIARIO_ATIVO': 'quantidade_beneficiario_ativo', + 'QT_BENEFICIARIO_ADERIDO': 'quantidade_beneficiario_aderido', + 'QT_BENEFICIARIO_CANCELADO': 'quantidade_beneficiario_cancelado' + }, inplace=True) + + df['cnpj'] = df['cnpj'].str.zfill(14) + + # Using parquet, don't need external dictionary + df['tipo_vigencia_plano'].replace({ + 'P': 'Posterior à Lei 9656/1998 ou planos adaptados à lei', + 'A': 'Anterior à Lei 9656/1998' + }) + + return df + +if __name__ == '__main__': + for month_path, month_date in host_months_path(): + for state_path in host_list(month_path): + state = state_path.split("_")[-1].split(".")[0] + + output_path = Path('../output') / f'ano={month_date.strftime("%Y")}' / f'mes={month_date.strftime("%m")}' / f'sigla_uf={state}' / f'ben{month_date.strftime("%Y%m")}-{state}.parquet' + + if output_path.exists(): + logger.info(f"Jumping path {output_path}. Already download") + continue + + input_path = Path('../input') / f'ano={month_date.strftime("%Y")}' / f'mes={month_date.strftime("%m")}' / f'ben{month_date.strftime("%Y%m")}_{state}.csv' + + if input_path.exists(): + logger.debug(f"reading input in {input_path}") + df = pd.read_csv(input_path, encoding="utf-8", dtype=RAW_COLLUNS_TYPE, index_col=0) + else: + # Wtf, pq tem um repositorio aqui? + # https://dadosabertos.ans.gov.br/FTP/PDA/informacoes_consolidadas_de_beneficiarios/201602/201607/ + if not host.path.isfile(state_path): + continue + + df = read_csv_zip_to_dataframe(state_path) + input_path.parent.mkdir(parents=True, exist_ok=True) + df.to_csv(input_path, encoding="utf-8") + + logger.info("Cleaning dataset") + df = process(df) + + output_path.parent.mkdir(parents=True, exist_ok=True) + + # delete partition columns + del df['ano'] + del df['mes'] + del df['sigla_uf'] + + logger.info(f"Writing to output {output_path.as_posix()}") + df.to_parquet(output_path, index=False) diff --git a/bases/br_ans_beneficiario/informacao_consolidada/code/requirements.txt b/bases/br_ans_beneficiario/informacao_consolidada/code/requirements.txt new file mode 100644 index 000000000..474aa6563 --- /dev/null +++ b/bases/br_ans_beneficiario/informacao_consolidada/code/requirements.txt @@ -0,0 +1,2 @@ +python-dateutil +ftputil diff --git a/bases/br_ans_beneficiario/informacao_consolidada/extra/architecture/_table_id_.xlsx b/bases/br_ans_beneficiario/informacao_consolidada/extra/architecture/_table_id_.xlsx new file mode 100644 index 000000000..2d316bb7d Binary files /dev/null and b/bases/br_ans_beneficiario/informacao_consolidada/extra/architecture/_table_id_.xlsx differ diff --git a/bases/br_ans_beneficiario/informacao_consolidada/extra/architecture/informacao_consolidada.url b/bases/br_ans_beneficiario/informacao_consolidada/extra/architecture/informacao_consolidada.url new file mode 100644 index 000000000..20379cb81 --- /dev/null +++ b/bases/br_ans_beneficiario/informacao_consolidada/extra/architecture/informacao_consolidada.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://docs.google.com/spreadsheets/d/11hTzsBQja-bpM9dac9NkmGvSI39xqiW7TC8amQUUvzc/edit#gid=0 diff --git a/bases/br_ans_beneficiario/informacao_consolidada/publish.sql b/bases/br_ans_beneficiario/informacao_consolidada/publish.sql new file mode 100644 index 000000000..c35927e39 --- /dev/null +++ b/bases/br_ans_beneficiario/informacao_consolidada/publish.sql @@ -0,0 +1,43 @@ +/* +Query para publicar a tabela. + +Esse é o lugar para: + - modificar nomes, ordem e tipos de colunas + - dar join com outras tabelas + - criar colunas extras (e.g. logs, proporções, etc.) + +Qualquer coluna definida aqui deve também existir em `table_config.yaml`. + +# Além disso, sinta-se à vontade para alterar alguns nomes obscuros +# para algo um pouco mais explícito. + +TIPOS: + - Para modificar tipos de colunas, basta substituir STRING por outro tipo válido. + - Exemplo: `SAFE_CAST(column_name AS NUMERIC) column_name` + - Mais detalhes: https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types +*/ + +CREATE VIEW basedosdados.br_ans_beneficiario.informacao_consolidada AS +SELECT +SAFE_CAST(ano AS INT64) ano, +SAFE_CAST(mes AS INT64) mes, +SAFE_CAST(codigo_operadora AS STRING) codigo_operadora, +SAFE_CAST(razao_social AS STRING) razao_social, +SAFE_CAST(cnpj AS STRING) cnpj, +SAFE_CAST(modalidade_operadora AS STRING) modalidade_operadora, +SAFE_CAST(sigla_uf AS STRING) sigla_uf, +SAFE_CAST(id_municipio_6 AS STRING) id_municipio_6, +SAFE_CAST(sexo AS STRING) sexo, +SAFE_CAST(faixa_etaria AS STRING) faixa_etaria, +SAFE_CAST(faixa_etaria_reajuste AS STRING) faixa_etaria_reajuste, +SAFE_CAST(codigo_plano AS STRING) codigo_plano, +SAFE_CAST(tipo_vigencia_plano AS STRING) tipo_vigencia_plano, +SAFE_CAST(contratacao_beneficiario AS STRING) contratacao_beneficiario, +SAFE_CAST(segmentacao_beneficiario AS STRING) segmentacao_beneficiario, +SAFE_CAST(abrangencia_beneficiario AS STRING) abrangencia_beneficiario, +SAFE_CAST(cobertura_assistencia_beneficiario AS STRING) cobertura_assistencia_beneficiario, +SAFE_CAST(tipo_vinculo AS STRING) tipo_vinculo, +SAFE_CAST(quantidade_beneficiario_ativo AS INT64) quantidade_beneficiario_ativo, +SAFE_CAST(quantidade_beneficiario_aderido AS INT64) quantidade_beneficiario_aderido, +SAFE_CAST(quantidade_beneficiario_cancelado AS INT64) quantidade_beneficiario_cancelado +FROM basedosdados-dev.br_ans_beneficiario_staging.informacao_consolidada AS t diff --git a/bases/br_ans_beneficiario/informacao_consolidada/table_config.yaml b/bases/br_ans_beneficiario/informacao_consolidada/table_config.yaml new file mode 100644 index 000000000..0cb98733d --- /dev/null +++ b/bases/br_ans_beneficiario/informacao_consolidada/table_config.yaml @@ -0,0 +1,442 @@ + +# Igual ao dataset.name mas como lower case. +# Exemplos: br_ibge_populacao, br_inep_censo_escolar +dataset_id: br_ans_beneficiario + +table_id: informacao_consolidada + +# Título da tabela. +title: Informações consolidadas de Beneficiários + +# Descreva a tabela. Essas são as primeiras frases que um usuário vai ver. +# Você não precisa ser muito conciso. Sinta-se a vontade para dar exemplos de +# como usar os dados. +# Se souber, liste também aplicações: pesquisa, apps, etc. que usem os dados., +description: O conjunto contém Informações consolidadas de beneficiários por competência. Este será alterado para inclusão de dados acima de 5 anos e melhorias na qualidade dos dados + +# As máximas unidades espaciais que a tabela cobre. +# Exemplo: +# - sa.br +# +# - sa.br.sp +# +# - world +spatial_coverage: + - sa.br + +# Anos cobertos pela tabela. +# Exemplos: +# - 1995(1)2019 +# Caso a cobertura não seja contínua: +# - 2002(2)2010 +# - 2016 +# - 2020 +temporal_coverage: + - 2014-08(1)2022-12 + +# A unidade temporal com qual a tabela é atualizada. +# Opções em 'https://basedosdados.org/api/3/action/bd_available_options' +update_frequency: month +# # Observação: as operadoras podem enviar dados que afetam informações das competências passadas. +# # A cada divulgação atualizamos os dados dos últimos 5 anos. +# # Portanto, os dados atualizados de competências já publicadas podem estar diferentes do divulgado anteriormente. + +# Nível de observação da tabela: o que representa cada linha. +# A combinação das colunas aqui deve construir uma chave única da tabelaOpções de entity em 'https://basedosdados.org/api/3/action/bd_available_options' +# Caso a entidade seja espacial incluir a informação de 'country' Exemplos: +# - entity: year +# columns: +# - ano +# - country: br +# entity: state +# columns: +# - sigla_uf +observation_level: municipality + +last_updated: + metadata: '2023-03-02' + data: '2022-10-11 17:33:30' + release: '2022-10-11 17:33:30' + +# Versão da tabela. Seguindo o padrão de semantic versioning. +# Exemplos: v1.0, v1.1.3 +version: v1.0 + +# Quem está preenchendo esses metadados? +published_by: + name: Guilherme Salustiano + email: guissalustiano@gmail.com + github_user: guissalustiano + ckan_user: + website: guissalustiano.dev + +# Qual organização/departamento/pessoa tratou os dados? +# As vezes há um ponto intermediário entre os dados originais e subir na Base dos Dados. +# Se essa pessoa é você, preencha abaixo com suas informações. +data_cleaned_by: + name: Guilherme Salustiano + email: guissalustiano@gmail.com + github_user: guissalustiano + ckan_user: + website: guissalustiano.dev + +# Se houve passos de tratamento, limpeza e manipulação de dados, descreva-os aqui. +data_cleaning_description: A coluna NM_MUNICIPIO, DT_CARGA e ID_CMPT_MOVEL foi apagada, as demais colunas foram renomeadas em lowercase e snake_case, A coluna TP_VIGENCIA_PLANO foi expandida + +# Url do código de limpeza dos dados do github. +data_cleaning_code_url: https://github.com/guissalustiano/mais/blob/38200e878adab55b3b0aea1a626ce45b43619057/bases/br_ans_beneficiario/informacao_consolidada/code/pipeline.py#L86-L123 + +# Organização que ajudou institucionalmente na disponibilização dos dados. +partner_organization: + name: Guilherme Salustiano + organization_id: + +# Url dos dados originais no GCP Storage. +raw_files_url: https://console.cloud.google.com/storage/browser/basedosdados_stag_guissalustiano + +# Url dos arquivos auxiliares no GCP Storage. +auxiliary_files_url: + +# Url da tabela de arquitetura no GCP Storage. +architecture_url: https://docs.google.com/spreadsheets/d/11hTzsBQja-bpM9dac9NkmGvSI39xqiW7TC8amQUUvzc/edit#gid=0 + +source_bucket_name: basedosdados_stag_guissalustiano + +project_id_prod: basedosdados-379403 + +project_id_staging: basedosdados-staging-379403 + +# Liste as colunas da tabela que representam partições. +# Não esqueça de deletar essas colunas nas tabelas .csv na hora de subir para o BigQuery. +# Isso poupará muito tempo e dinheiro às pessoas utilizando essa tabela. +# Se não houver partições, não modifique abaixo. +partitions: + - ano + - mes + +# Quais são as colunas? Certifique-se de escrever uma boa descrição, as pessoas vão gostar +# para saber sobre o que é a coluna. +# Adicionar todas as colunas manualmente pode ser bastante cansativo, por isso, quando +# inicializando este arquivo de configuração, você pode apontar a função para uma amostra de dados que +# preencherá automaticamente as colunas. +# Além disso, você deve adicionar as colunas de partição aqui e definir is_partition como True. +columns: + - name: ano + bigquery_type: int64 + description: Ano da competência dos dados + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: br_bd_diretorios_data_tempo + table_id: ano + column_name: ano + measurement_unit: ano + has_sensitive_data: no + observations: + is_in_staging: true + is_partition: true + - name: mes + bigquery_type: INT64 + description: Mês da competência dos dados + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: br_bd_diretorios_data_tempo + table_id: mes + column_name: mes + measurement_unit: month + has_sensitive_data: no + observations: + is_in_staging: true + is_partition: true + - name: codigo_operadora + bigquery_type: string + description: Código de registro da operadora de plano de saúde na ANS + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: + has_sensitive_data: yes + observations: + is_in_staging: + is_partition: + - name: razao_social + bigquery_type: string + description: Razão Social da Operadora + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: + has_sensitive_data: no + observations: + is_in_staging: true + is_partition: false + - name: cnpj + bigquery_type: string + description: CNPJ da Operadora + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: + has_sensitive_data: no + observations: + is_in_staging: true + is_partition: false + - name: modalidade_operadora + bigquery_type: string' + description: Classificação das operadoras de planos privados de assistência à saúde de acordo com seu estatuto jurídico + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: + has_sensitive_data: no + observations: "'Administradora', 'Cooperativa Médica', 'Cooperativa odontológica', 'Autogestão', 'Medicina de Grupo', 'Odontologia de Grupo', 'Filantropia', 'Seguradora Especializada em Saúde', 'Seguradora' or 'Administradora de Benefícios'" + is_in_staging: true + is_partition: false + - name: sigla_uf + bigquery_type: string + description: Sigla da Unidade da Federação + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: br_bd_diretorios_brasil + table_id: uf + column_name: sigla + measurement_unit: + has_sensitive_data: no + observations: Os dados originais anonimizados pela ANS fornecem informações onde a sigla_uf="XX" + is_in_staging: true + is_partition: false + - name: id_municipio_6 + bigquery_type: string + description: ID do Município IBGE - 6 Dígitos + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: br_bd_diretorios_brasil + table_id: municipio + column_name: id_municipio_6 + measurement_unit: + has_sensitive_data: no + observations: Os dados originais anonimizados pela ANS fornecem informações onde o id_municipio_6="-1" + is_in_staging: true + is_partition: false + - name: sexo + bigquery_type: string + description: Sexo + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: + has_sensitive_data: no + observations: "'M' or 'F'" + is_in_staging: true + is_partition: false + - name: faixa_etaria + bigquery_type: 'string' + description: 'Faixa etária do beneficiário' + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: age + has_sensitive_data: no + observations: + is_in_staging: true + is_partition: false + - name: faixa_etaria_reajuste + bigquery_type: string + description: Faixa etária do beneficiária utilizada para o reajuste do plano definida pela Lei 9.656 + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: age + has_sensitive_data: no + observations: + is_in_staging: true + is_partition: false + - name: codigo_plano + bigquery_type: string + description: Código do plano registrado ou cadastrado na ANS no qual o beneficiário possui vínculo + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: + has_sensitive_data: no + observations: + is_in_staging: true + is_partition: false + - name: tipo_vigencia_plano + bigquery_type: string + description: Início da vigência do plano para comercialização + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: + has_sensitive_data: no + observations: "'Anterior à Lei 9656/1998' or 'Posterior à Lei 9656/1998 ou planos adaptados à lei'" + is_in_staging: true + is_partition: false + - name: contratacao_beneficiario + bigquery_type: string + description: Tipo de contratação do plano do beneficiário + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: + has_sensitive_data: no + observations: "'Individual ou familiar', 'Coletivo empresarial', 'Coletivo por adesão', 'Individual ou Familiar + Coletivo Empresarial', 'Individual ou Familiar + Coletivo por Adesão', 'Coletivo Empresarial + Coletivo por Adesão' or 'Individual + Coletivo Empresarial + Coletivo por Adesão'" + is_in_staging: true + is_partition: false + - name: segmentacao_beneficiario + bigquery_type: string + description: Tipo de segmentação assistencial do plano do beneficiário + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: + has_sensitive_data: no + observations: "'Ambulatorial (Ambulatorial)', 'Hospitalar com obstetrícia (Hosp c/ obst)', 'Hospitalar sem obstetrícia (Hosp s/ obst)', 'Odontológico (Odontológico)', 'Referência (Amb + hosp c/ obst)', 'Ambulatorial + Hospitalar com obstetrícia (Amb + hosp c/ obst)', 'Ambulatorial + Hospitalar sem obstetrícia (Amb + hosp s/ obst)', 'Ambulatorial + Odontológico (Ambulatorial)', 'Hosp c/ obstetrícia + Hosp s/ obstetrícia (Hosp c/s obst)', 'Hospitalar com obstetrícia + Odontológico (Hosp c/ obst)', 'Hospitalar sem obstetrícia + Odontológico (Hosp s/ obst)', 'Amb + Hosp c/s Obstetrícia (Amb + hosp c/s obst)', 'Ambulatorial + Hospitalar com obstetrícia + Odontológico (Amb + hosp c/ obst)', 'Ambulatorial + Hospitalar sem obstetrícia + Odontológico (Amb + hosp s/ obst)' or 'Hosp c/s Obstetrícia + Odont (Hosp c/s obst)'" + is_in_staging: true + is_partition: false + - name: abrangencia_beneficiario + bigquery_type: string + description: Tipo de abrangência do plano do beneficiário + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: + has_sensitive_data: no + observations: "'Nacional', 'Grupo de estados', 'Estadual', 'Grupo de municípios', 'Municipal' or 'Outras'" + is_in_staging: true + is_partition: false + - name: cobertura_assistencia_beneficiario + bigquery_type: string + description: Tipo de cobertura de plano do beneficiário + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: + has_sensitive_data: no + observations: "'Médico-hospitalar com ou sem cobertura odontológica' or 'Exclusivamente Odontológica'" + is_in_staging: true + is_partition: false + - name: tipo_vinculo + bigquery_type: string + description: Tipo de vinculo do beneficiário + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: people + has_sensitive_data: no + observations: "'Titular', 'Depedente' or 'Nao Informado'" + is_in_staging: true + is_partition: false + - name: quantidade_beneficiario_ativo + bigquery_type: int64 + description: Quantidade de beneficiários ativos na competência + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: people + has_sensitive_data: no + observations: + is_in_staging: true + is_partition: false + - name: quantidade_beneficiario_aderido + bigquery_type: int64 + description: Quantidade de beneficiários aderidos na competência + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: people + has_sensitive_data: no + observations: + is_in_staging: true + is_partition: false + - name: quantidade_beneficiario_cancelado + bigquery_type: int64 + description: Quantidade de beneficiários cancelados na competência + temporal_coverage: + - (1) + covered_by_dictionary: no + directory_column: + dataset_id: + table_id: + column_name: + measurement_unit: people + has_sensitive_data: no + observations: + is_in_staging: true + is_partition: false + +number_rows: 1490467876 + +metadata_modified: