diff --git a/models/br_me_rais/br_me_rais__dicionario.sql b/models/br_me_rais/br_me_rais__dicionario.sql index 8c55fa33..758968b3 100644 --- a/models/br_me_rais/br_me_rais__dicionario.sql +++ b/models/br_me_rais/br_me_rais__dicionario.sql @@ -1,5 +1,5 @@ {{ config(alias="dicionario", schema="br_me_rais") }} --- Dicionário da Rais + select safe_cast(id_tabela as string) id_tabela, safe_cast(nome_coluna as string) nome_coluna, diff --git a/models/br_me_rais/br_me_rais__microdados_estabelecimentos.sql b/models/br_me_rais/br_me_rais__microdados_estabelecimentos.sql index 8a0fedc7..ec1d73cb 100644 --- a/models/br_me_rais/br_me_rais__microdados_estabelecimentos.sql +++ b/models/br_me_rais/br_me_rais__microdados_estabelecimentos.sql @@ -8,13 +8,14 @@ "data_type": "int64", "range": {"start": 1985, "end": 2023, "interval": 1}, }, - cluster_by=["sigla_uf"], + cluster_by=["sigla_uf", "id_municipio"], ) }} + select safe_cast(ano as int64) ano, safe_cast(sigla_uf as string) sigla_uf, - safe_cast(id_municipio as string) id_municipio, + cast(regexp_replace(id_municipio, r'\.0$', '') as string) id_municipio, safe_cast(quantidade_vinculos_ativos as int64) quantidade_vinculos_ativos, safe_cast(quantidade_vinculos_clt as int64) quantidade_vinculos_clt, safe_cast( @@ -23,7 +24,9 @@ select safe_cast(natureza as string) natureza_estabelecimento, safe_cast(natureza_juridica as string) natureza_juridica, safe_cast(tamanho as string) tamanho_estabelecimento, - safe_cast(tipo as string) tipo_estabelecimento, + cast( + cast(regexp_replace(tipo, r'^0+', '') as string) as string + ) as tipo_estabelecimento, safe_cast(indicador_cei_vinculado as int64) indicador_cei_vinculado, safe_cast(indicador_pat as int64) indicador_pat, safe_cast(indicador_simples as string) indicador_simples, @@ -42,12 +45,16 @@ select case when bairros_sp = '????????????' then null - else cast(regexp_replace(bairros_sp, r'^0+', '') as string) + else trim(cast(regexp_replace(bairros_sp, r'^0+', '') as string)) end as bairros_sp, - cast(regexp_replace(distritos_sp, r'^0+', '') as string) as distritos_sp, - cast(regexp_replace(bairros_fortaleza, r'^0+', '') as string) as bairros_fortaleza, - nullif(cast(regexp_replace(bairros_rj, r'^0+', '') as string), '') as bairros_rj, - cast( - regexp_replace(regioes_administrativas_df, r'^0+', '') as string + trim(cast(regexp_replace(distritos_sp, r'^0+', '') as string)) as distritos_sp, + trim( + cast(regexp_replace(bairros_fortaleza, r'^0+', '') as string) + ) as bairros_fortaleza, + trim( + nullif(cast(regexp_replace(bairros_rj, r'^0+', '') as string), '') + ) as bairros_rj, + trim( + cast(regexp_replace(regioes_administrativas_df, r'^0+', '') as string) ) as regioes_administrativas_df from `basedosdados-staging.br_me_rais_staging.microdados_estabelecimentos` as t diff --git a/models/br_me_rais/br_me_rais__microdados_vinculos.sql b/models/br_me_rais/br_me_rais__microdados_vinculos.sql index 8b2a475b..3b37a14e 100644 --- a/models/br_me_rais/br_me_rais__microdados_vinculos.sql +++ b/models/br_me_rais/br_me_rais__microdados_vinculos.sql @@ -8,14 +8,14 @@ "data_type": "int64", "range": {"start": 1985, "end": 2023, "interval": 1}, }, - cluster_by=["sigla_uf"], + cluster_by=["sigla_uf", "id_municipio"], ) }} select safe_cast(ano as int64) ano, safe_cast(sigla_uf as string) sigla_uf, - safe_cast(id_municipio as string) id_municipio, + cast(regexp_replace(id_municipio, r'\.0$', '') as string) id_municipio, safe_cast(tipo_vinculo as string) tipo_vinculo, safe_cast(vinculo_ativo_3112 as string) vinculo_ativo_3112, safe_cast(tipo_admissao as string) tipo_admissao, @@ -27,7 +27,7 @@ select safe_cast(causa_desligamento_3 as string) causa_desligamento_3, safe_cast(faixa_tempo_emprego as string) faixa_tempo_emprego, safe_cast(faixa_horas_contratadas as string) faixa_horas_contratadas, - safe_cast(tempo_emprego as float64) tempo_emprego, + round(safe_cast(tempo_emprego as float64), 2) tempo_emprego, safe_cast(quantidade_horas_contratadas as int64) quantidade_horas_contratadas, safe_cast(id_municipio_trabalho as string) id_municipio_trabalho, safe_cast(quantidade_dias_afastamento as int64) quantidade_dias_afastamento, @@ -37,10 +37,14 @@ select indicador_trabalho_intermitente as string ) indicador_trabalho_intermitente, safe_cast(faixa_remuneracao_media_sm as string) faixa_remuneracao_media_sm, - safe_cast(valor_remuneracao_media_sm as float64) valor_remuneracao_media_sm, + round( + safe_cast(valor_remuneracao_media_sm as float64), 2 + ) valor_remuneracao_media_sm, safe_cast(valor_remuneracao_media as float64) valor_remuneracao_media, safe_cast(faixa_remuneracao_dezembro_sm as string) faixa_remuneracao_dezembro_sm, - safe_cast(valor_remuneracao_dezembro_sm as float64) valor_remuneracao_dezembro_sm, + round( + safe_cast(valor_remuneracao_dezembro_sm as float64), 2 + ) valor_remuneracao_dezembro_sm, safe_cast(valor_remuneracao_janeiro as float64) valor_remuneracao_janeiro, safe_cast(valor_remuneracao_fevereiro as float64) valor_remuneracao_fevereiro, safe_cast(valor_remuneracao_marco as float64) valor_remuneracao_marco, @@ -82,19 +86,32 @@ select then 'Não identificado' when tipo_estabelecimento = 'CEI/CNO' then 'CEI' - else tipo_estabelecimento + else + cast( + cast( + regexp_replace(tipo_estabelecimento, r'^0+', '') as string + ) as string + ) end as tipo_estabelecimento, safe_cast(natureza_juridica as string) natureza_juridica, safe_cast(indicador_simples as string) indicador_simples, - cast(cast(regexp_replace(bairros_sp, r'^0+', '') as int64) as string) as bairros_sp, - cast( - cast(regexp_replace(distritos_sp, r'^0+', '') as int64) as string + trim( + cast(cast(regexp_replace(bairros_sp, r'^0+', '') as int64) as string) + ) as bairros_sp, + trim( + cast(cast(regexp_replace(distritos_sp, r'^0+', '') as int64) as string) ) as distritos_sp, - cast( - cast(regexp_replace(bairros_fortaleza, r'^0+', '') as int64) as string + trim( + cast(cast(regexp_replace(bairros_fortaleza, r'^0+', '') as int64) as string) ) as bairros_fortaleza, - cast(cast(regexp_replace(bairros_rj, r'^0+', '') as int64) as string) as bairros_rj, - cast( - cast(regexp_replace(regioes_administrativas_df, r'^0+', '') as int64) as string + trim( + cast(cast(regexp_replace(bairros_rj, r'^0+', '') as int64) as string) + ) as bairros_rj, + trim( + cast( + cast( + regexp_replace(regioes_administrativas_df, r'^0+', '') as int64 + ) as string + ) ) as regioes_administrativas_df, from `basedosdados-staging.br_me_rais_staging.microdados_vinculos` diff --git a/models/br_me_rais/code/rais_estabelecimento.ipynb b/models/br_me_rais/code/rais_estabelecimento.ipynb new file mode 100755 index 00000000..100937a3 --- /dev/null +++ b/models/br_me_rais/code/rais_estabelecimento.ipynb @@ -0,0 +1,275 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import os\n", + "import basedosdados as bd\n", + "import numpy as np\n", + "from datetime import datetime\n", + "from os.path import join\n", + "from pathlib import Path\n", + "from typing import Any, Dict, List, Optional, Tuple, Union\n", + "pd.set_option(\"display.max_columns\", None)\n", + "\n", + "def to_partitions(\n", + " data: pd.DataFrame,\n", + " partition_columns: List[str],\n", + " savepath: str,\n", + " file_type: str = \"csv\",\n", + "):\n", + " \"\"\"Save data in to hive patitions schema, given a dataframe and a list of partition columns.\n", + " Args:\n", + " data (pandas.core.frame.DataFrame): Dataframe to be partitioned.\n", + " partition_columns (list): List of columns to be used as partitions.\n", + " savepath (str, pathlib.PosixPath): folder path to save the partitions.\n", + " file_type (str): default to csv. Accepts parquet.\n", + " Exemple:\n", + " data = {\n", + " \"ano\": [2020, 2021, 2020, 2021, 2020, 2021, 2021,2025],\n", + " \"mes\": [1, 2, 3, 4, 5, 6, 6,9],\n", + " \"sigla_uf\": [\"SP\", \"SP\", \"RJ\", \"RJ\", \"PR\", \"PR\", \"PR\",\"PR\"],\n", + " \"dado\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\",'h'],\n", + " }\n", + " to_partitions(\n", + " data=pd.DataFrame(data),\n", + " partition_columns=['ano','mes','sigla_uf'],\n", + " savepath='partitions/',\n", + " )\n", + " \"\"\"\n", + "\n", + " if isinstance(data, (pd.core.frame.DataFrame)):\n", + " savepath = Path(savepath)\n", + " # create unique combinations between partition columns\n", + " unique_combinations = (\n", + " data[partition_columns]\n", + " # .astype(str)\n", + " .drop_duplicates(subset=partition_columns).to_dict(orient=\"records\")\n", + " )\n", + "\n", + " for filter_combination in unique_combinations:\n", + " patitions_values = [\n", + " f\"{partition}={value}\"\n", + " for partition, value in filter_combination.items()\n", + " ]\n", + "\n", + " # get filtered data\n", + " df_filter = data.loc[\n", + " data[filter_combination.keys()]\n", + " .isin(filter_combination.values())\n", + " .all(axis=1),\n", + " :,\n", + " ]\n", + " df_filter = df_filter.drop(columns=partition_columns)\n", + "\n", + " # create folder tree\n", + " filter_save_path = Path(savepath / \"/\".join(patitions_values))\n", + " filter_save_path.mkdir(parents=True, exist_ok=True)\n", + "\n", + " if file_type == \"csv\":\n", + " # append data to csv\n", + " file_filter_save_path = Path(filter_save_path) / \"data.csv\"\n", + " df_filter.to_csv(\n", + " file_filter_save_path,\n", + " sep=\",\",\n", + " encoding=\"utf-8\",\n", + " na_rep=\"\",\n", + " index=False,\n", + " mode=\"a\",\n", + " header=not file_filter_save_path.exists(),\n", + " )\n", + " elif file_type == \"parquet\":\n", + " # append data to parquet\n", + " file_filter_save_path = Path(filter_save_path) / \"data.parquet\"\n", + " df_filter.to_parquet(\n", + " file_filter_save_path, index=False, compression=\"gzip\"\n", + " )\n", + " else:\n", + " raise BaseException(\"Data need to be a pandas DataFrame\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading: 100%|██████████| 5570/5570 [00:00<00:00, 6164.87rows/s]\n", + "Downloading: 100%|██████████| 27/27 [00:00<00:00, 86.26rows/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "natureza\n", + "subatividade_ibge\n" + ] + } + ], + "source": [ + "df = pd.read_csv(\n", + " \"X:\\\\dados\\\\br_me_rais\\\\estabelecimento_2023\\\\RAIS_ESTAB_PUB.txt\",\n", + " encoding=\"latin1\",\n", + " sep=\";\",\n", + " dtype=str,\n", + ")\n", + "\n", + "df.rename(columns={\n", + " 'Bairros SP' : 'bairros_sp',\n", + " 'Bairros Fortaleza' : 'bairros_fortaleza',\n", + " 'Bairros RJ' : 'bairros_rj',\n", + " 'CNAE 2.0 Classe' : 'cnae_2',\n", + " 'CNAE 95 Classe' : 'cnae_1',\n", + " 'Distritos SP' : 'distritos_sp',\n", + " 'Qtd Vínculos CLT' : 'quantidade_vinculos_clt',\n", + " 'Qtd Vínculos Ativos' : 'quantidade_vinculos_ativos',\n", + " 'Qtd Vínculos Estatutários' : 'quantidade_vinculos_estatutarios',\n", + " 'Ind Atividade Ano' : 'indicador_atividade_ano',\n", + " 'Ind CEI Vinculado' : 'indicador_cei_vinculado',\n", + " 'Ind Estab Participa PAT' : 'indicador_pat',\n", + " 'Ind Rais Negativa' : 'indicador_rais_negativa',\n", + " 'Ind Simples' : 'indicador_simples',\n", + " 'Município' : 'municipio',\n", + " 'Natureza Jurídica' : 'natureza_juridica',\n", + " 'Regiões Adm DF' : 'regioes_administrativas_df',\n", + " 'CNAE 2.0 Subclasse' : 'cnae_2_subclasse',\n", + " 'Tamanho Estabelecimento' : 'tamanho',\n", + " 'Tipo Estab' : 'tipo',\n", + " 'UF' : 'uf',\n", + " 'IBGE Subsetor' : 'subsetor_ibge',\n", + " 'CEP Estab' : 'cep',\n", + " }, inplace=True)\n", + "\n", + "df['ano'] = 2023\n", + "\n", + "df['municipio'] = df['municipio'].astype(str)\n", + "\n", + "# Carregar os arquivos\n", + "\n", + "df_municipio = bd.read_sql('SELECT id_municipio, id_municipio_6 FROM `basedosdados.br_bd_diretorios_brasil.municipio`', billing_project_id='basedosdados', reauth=False)\n", + "df_uf = bd.read_sql('SELECT id_uf, sigla FROM `basedosdados.br_bd_diretorios_brasil.uf`', billing_project_id='basedosdados', reauth=False)\n", + "\n", + "# Mescla com o arquivo de municípios\n", + "df = pd.merge(df, df_municipio, left_on='municipio', right_on='id_municipio_6', how='left')\n", + "df.drop(['id_municipio_6', 'municipio'], axis=1, inplace=True)\n", + "\n", + "# Gerar a sigla_uf\n", + "\n", + "# Mescla com o arquivo de UFs\n", + "df['uf'] = df['uf'].astype(str)\n", + "df = pd.merge(df, df_uf, left_on='uf', right_on='id_uf', how='left')\n", + "df = df.drop(['id_uf', 'uf'], axis=1)\n", + "df = df.rename(columns={'sigla': 'sigla_uf'})\n", + "\n", + "\n", + "# Substitui sigla_uf vazia por \"IGNORADO\"\n", + "df['sigla_uf'].replace(np.nan, \"IGNORADO\", inplace=True)\n", + "\n", + "# Padronização das variáveis e dados\n", + "for col in df.columns:\n", + " if df[col].dtype == 'str':\n", + " df[col] = df[col].str.strip()\n", + " df[col].replace([\"{ñ\", \"{ñ class}\", \"{ñ c\"], \"\", inplace=True)\n", + "\n", + "# Lista de variáveis\n", + "vars_list = [\n", + " 'ano',\n", + " 'sigla_uf',\n", + " 'id_municipio',\n", + " 'quantidade_vinculos_ativos',\n", + " 'quantidade_vinculos_clt',\n", + " 'quantidade_vinculos_estatutarios',\n", + " 'natureza',\n", + " 'natureza_juridica',\n", + " 'tamanho',\n", + " 'tipo',\n", + " 'indicador_cei_vinculado',\n", + " 'indicador_pat',\n", + " 'indicador_simples',\n", + " 'indicador_rais_negativa',\n", + " 'indicador_atividade_ano',\n", + " 'cnae_1',\n", + " 'cnae_2',\n", + " 'cnae_2_subclasse',\n", + " 'subsetor_ibge',\n", + " 'subatividade_ibge',\n", + " 'cep',\n", + " 'bairros_sp',\n", + " 'distritos_sp',\n", + " 'bairros_fortaleza',\n", + " 'bairros_rj',\n", + " 'regioes_administrativas_df'\n", + "]\n", + "\n", + "# Gera as variáveis não confirmadas\n", + "for var in vars_list:\n", + " if var not in df.columns:\n", + " print(var)\n", + " df[var] = \"\"\n", + "\n", + "# Limpeza adicional de variáveis\n", + "for col in df.columns:\n", + " if df[col].dtype == 'str':\n", + " print(col)\n", + " df[col] = df[col].str.strip()\n", + " df[col].replace([\"{ñ\", \"{ñ class}\", \"{ñ c\", \"{ñ clas}\"], \"\", inplace=True)\n", + "\n", + "# Limpeza para variáveis específicas\n", + "for col in ['bairros_sp', 'distritos_sp', 'bairros_fortaleza', 'bairros_rj', 'distritos_sp', 'regioes_administrativas_df', 'cnae_2', 'cnae_2_subclasse', 'subsetor_ibge', 'subatividade_ibge']:\n", + " df[col].replace([\"0000\", \"00000\", \"000000\", \"0000000\", \"0000-1\", \"000-1\", \"998\", \"999\", \"9999\", \"9997\", \"00\", \"-1\"], \"\", inplace=True)\n", + "\n", + "# Limpeza de natureza_juridica e cep\n", + "df['natureza_juridica'].replace([\"9990\", \"9999\"], \"\", inplace=True)\n", + "df['cep'].replace(\"0\", \"\", inplace=True)\n", + "\n", + "# Ajuste na variável tipo\n", + "df['tipo'].replace([\"CNPJ\", \"Cnpj\", \"01\", \"1\"], \"1\", inplace=True)\n", + "df['tipo'].replace([\"CAEPF\", \"Caepf\"], \"2\", inplace=True)\n", + "df['tipo'].replace([\"CEI\", \"Cei\", \"CEI/CNO\", \"Cei/Cno\", \"CNO\", \"Cno\", \"03\", \"3\"], \"3\", inplace=True)\n", + "\n", + "# Converte colunas para numérico\n", + "cols_to_numeric = ['id_municipio', 'quantidade_vinculos_ativos', 'quantidade_vinculos_clt', 'quantidade_vinculos_estatutarios', 'tamanho', 'indicador_cei_vinculado', 'indicador_pat', 'indicador_simples', 'indicador_rais_negativa', 'indicador_atividade_ano']\n", + "df[cols_to_numeric] = df[cols_to_numeric].apply(pd.to_numeric, errors='coerce')\n", + "\n", + "# Reordena as colunas\n", + "df = df[vars_list]\n", + "\n", + "to_partitions(\n", + " data=df,\n", + " partition_columns=[\"ano\", \"sigla_uf\"],\n", + " savepath=\"X:\\\\dados\\\\br_me_rais\\\\estabelecimento_2023\\\\estabelecimento\",\n", + " file_type=\"csv\",\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/models/br_me_rais/code/rais_vinculo.ipynb b/models/br_me_rais/code/rais_vinculo.ipynb new file mode 100755 index 00000000..4ff17521 --- /dev/null +++ b/models/br_me_rais/code/rais_vinculo.ipynb @@ -0,0 +1,452 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from datetime import datetime\n", + "from os.path import join\n", + "from pathlib import Path\n", + "from typing import Any, Dict, List, Optional, Tuple, Union\n", + "import basedosdados as bd # type: ignore\n", + "import numpy as np\n", + "import pandas as pd\n", + "import gc\n", + "import tqdm\n", + "\n", + "\n", + "def to_partitions(\n", + " data: pd.DataFrame,\n", + " partition_columns: List[str],\n", + " savepath: str,\n", + " file_type: str = \"csv\",\n", + "):\n", + " \"\"\"Save data in to hive patitions schema, given a dataframe and a list of partition columns.\n", + " Args:\n", + " data (pandas.core.frame.DataFrame): Dataframe to be partitioned.\n", + " partition_columns (list): List of columns to be used as partitions.\n", + " savepath (str, pathlib.PosixPath): folder path to save the partitions.\n", + " file_type (str): default to csv. Accepts parquet.\n", + " Exemple:\n", + " data = {\n", + " \"ano\": [2020, 2021, 2020, 2021, 2020, 2021, 2021,2025],\n", + " \"mes\": [1, 2, 3, 4, 5, 6, 6,9],\n", + " \"sigla_uf\": [\"SP\", \"SP\", \"RJ\", \"RJ\", \"PR\", \"PR\", \"PR\",\"PR\"],\n", + " \"dado\": [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\",'h'],\n", + " }\n", + " to_partitions(\n", + " data=pd.DataFrame(data),\n", + " partition_columns=['ano','mes','sigla_uf'],\n", + " savepath='partitions/',\n", + " )\n", + " \"\"\"\n", + "\n", + " if isinstance(data, (pd.core.frame.DataFrame)):\n", + " savepath = Path(savepath)\n", + " # create unique combinations between partition columns\n", + " unique_combinations = (\n", + " data[partition_columns]\n", + " # .astype(str)\n", + " .drop_duplicates(subset=partition_columns).to_dict(orient=\"records\")\n", + " )\n", + "\n", + " for filter_combination in unique_combinations:\n", + " patitions_values = [\n", + " f\"{partition}={value}\"\n", + " for partition, value in filter_combination.items()\n", + " ]\n", + "\n", + " # get filtered data\n", + " df_filter = data.loc[\n", + " data[filter_combination.keys()]\n", + " .isin(filter_combination.values())\n", + " .all(axis=1),\n", + " :,\n", + " ]\n", + " df_filter = df_filter.drop(columns=partition_columns)\n", + "\n", + " # create folder tree\n", + " filter_save_path = Path(savepath / \"/\".join(patitions_values))\n", + " filter_save_path.mkdir(parents=True, exist_ok=True)\n", + "\n", + " if file_type == \"csv\":\n", + " # append data to csv\n", + " file_filter_save_path = Path(filter_save_path) / \"data.csv\"\n", + " df_filter.to_csv(\n", + " file_filter_save_path,\n", + " sep=\",\",\n", + " encoding=\"utf-8\",\n", + " na_rep=\"\",\n", + " index=False,\n", + " mode=\"a\",\n", + " header=not file_filter_save_path.exists(),\n", + " )\n", + " elif file_type == \"parquet\":\n", + " # append data to parquet\n", + " file_filter_save_path = Path(filter_save_path) / \"data.parquet\"\n", + " df_filter.to_parquet(\n", + " file_filter_save_path, index=False, compression=\"gzip\"\n", + " )\n", + " else:\n", + " raise BaseException(\"Data need to be a pandas DataFrame\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pd.set_option(\"display.max_columns\", None)\n", + "\n", + "chucks = []\n", + "\n", + "\n", + "df_municipio = bd.read_sql(\n", + " \"SELECT id_municipio, id_municipio_6, sigla_uf FROM `basedosdados.br_bd_diretorios_brasil.municipio`\",\n", + " billing_project_id=\"basedosdados\",\n", + " reauth=False,\n", + ")\n", + "\n", + "valor = 0\n", + "\n", + "for chunk in tqdm.tqdm(\n", + " pd.read_csv(\n", + " \"X:\\\\dados\\\\br_me_rais\\\\vinculos_2023\\\\RAIS_VINC_PUB_SUL.txt\",\n", + " sep=\";\",\n", + " encoding=\"latin1\",\n", + " low_memory=False,\n", + " decimal=\",\",\n", + " chunksize=100000,\n", + " )\n", + "):\n", + " valor = valor + 1\n", + " print(f\"Quantidade: {valor}\")\n", + "\n", + " ints = chunk.select_dtypes(include=[\"int64\", \"int32\", \"int16\"]).columns\n", + " chunk[ints] = chunk[ints].apply(pd.to_numeric, downcast=\"integer\")\n", + "\n", + " floats = chunk.select_dtypes(include=[\"float\"]).columns\n", + " chunk[floats] = chunk[floats].apply(pd.to_numeric, downcast=\"float\")\n", + "\n", + " objects = chunk.select_dtypes(\"object\").columns\n", + " chunk[objects] = chunk[objects].apply(lambda x: x.astype(\"category\"))\n", + "\n", + " chunk.rename(\n", + " columns={\n", + " \"Tipo Vínculo\": \"tipo_vinculo\",\n", + " \"Vínculo Ativo 31/12\": \"vinculo_ativo_3112\",\n", + " \"Tipo Admissão\": \"tipo_admissao\",\n", + " \"Mês Admissão\": \"mes_admissao\",\n", + " \"Mês Desligamento\": \"mes_desligamento\",\n", + " \"Motivo Desligamento\": \"motivo_desligamento\",\n", + " \"Causa Afastamento 1\": \"causa_desligamento_1\",\n", + " \"Causa Afastamento 2\": \"causa_desligamento_2\",\n", + " \"Causa Afastamento 3\": \"causa_desligamento_3\",\n", + " \"Faixa Tempo Emprego\": \"faixa_tempo_emprego\",\n", + " \"Tempo Emprego\": \"tempo_emprego\",\n", + " \"Faixa Hora Contrat\": \"faixa_horas_contratadas\",\n", + " \"Qtd Hora Contr\": \"quantidade_horas_contratadas\",\n", + " \"Mun Trab\": \"id_municipio_trabalho\",\n", + " \"Qtd Dias Afastamento\": \"quantidade_dias_afastamento\",\n", + " \"Ind CEI Vinculado\": \"indicador_cei_vinculado\",\n", + " \"Ind Trab Parcial\": \"indicador_trabalho_parcial\",\n", + " \"Ind Trab Intermitente\": \"indicador_trabalho_intermitente\",\n", + " \"Faixa Remun Média (SM)\": \"faixa_remuneracao_media_sm\",\n", + " \"Vl Remun Média (SM)\": \"valor_remuneracao_media_sm\",\n", + " \"Vl Remun Média Nom\": \"valor_remuneracao_media\",\n", + " \"Faixa Remun Dezem (SM)\": \"faixa_remuneracao_dezembro_sm\",\n", + " \"Vl Remun Dezembro (SM)\": \"valor_remuneracao_dezembro_sm\",\n", + " \"Vl Rem Janeiro SC\": \"valor_remuneracao_janeiro\",\n", + " \"Vl Rem Fevereiro SC\": \"valor_remuneracao_fevereiro\",\n", + " \"Vl Rem Março SC\": \"valor_remuneracao_marco\",\n", + " \"Vl Rem Abril SC\": \"valor_remuneracao_abril\",\n", + " \"Vl Rem Maio SC\": \"valor_remuneracao_maio\",\n", + " \"Vl Rem Junho SC\": \"valor_remuneracao_junho\",\n", + " \"Vl Rem Julho SC\": \"valor_remuneracao_julho\",\n", + " \"Vl Rem Agosto SC\": \"valor_remuneracao_agosto\",\n", + " \"Vl Rem Setembro SC\": \"valor_remuneracao_setembro\",\n", + " \"Vl Rem Outubro SC\": \"valor_remuneracao_outubro\",\n", + " \"Vl Rem Novembro SC\": \"valor_remuneracao_novembro\",\n", + " \"Vl Remun Dezembro Nom\": \"valor_remuneracao_dezembro\",\n", + " \"CBO Ocupação 2002\": \"cbo_2002\",\n", + " \"Faixa Etária\": \"faixa_etaria\",\n", + " \"Idade\": \"idade\",\n", + " \"Escolaridade após 2005\": \"grau_instrucao_apos_2005\",\n", + " \"Nacionalidade\": \"nacionalidade\",\n", + " \"Sexo Trabalhador\": \"sexo\",\n", + " \"Raça Cor\": \"raca_cor\",\n", + " \"Ind Portador Defic\": \"indicador_portador_deficiencia\",\n", + " \"Tipo Defic\": \"tipo_deficiencia\",\n", + " \"Ano Chegada Brasil\": \"ano_chegada_brasil\",\n", + " \"IBGE Subsetor\": \"subsetor_ibge\",\n", + " \"CNAE 95 Classe\": \"cnae_1\",\n", + " \"CNAE 2.0 Classe\": \"cnae_2\",\n", + " \"CNAE 2.0 Subclasse\": \"cnae_2_subclasse\",\n", + " \"Tamanho Estabelecimento\": \"tamanho_estabelecimento\",\n", + " \"Tipo Estab\": \"tipo_estabelecimento\",\n", + " \"Natureza Jurídica\": \"natureza_juridica\",\n", + " \"Ind Simples\": \"indicador_simples\",\n", + " \"Bairros SP\": \"bairros_sp\",\n", + " \"Distritos SP\": \"distritos_sp\",\n", + " \"Bairros Fortaleza\": \"bairros_fortaleza\",\n", + " \"Bairros RJ\": \"bairros_rj\",\n", + " \"Regiões Adm DF\": \"regioes_administrativas_df\",\n", + " \"Município\": \"municipio\",\n", + " },\n", + " inplace=True,\n", + " )\n", + "\n", + " chunk[\"ano\"] = 2023\n", + "\n", + " chunk[[\"municipio\", \"id_municipio_trabalho\"]] = chunk[\n", + " [\"municipio\", \"id_municipio_trabalho\"]\n", + " ].astype(str)\n", + "\n", + " # Mescla com o arquivo de municípios\n", + "\n", + " chunk = pd.merge(\n", + " chunk,\n", + " df_municipio,\n", + " left_on=[\"municipio\"],\n", + " right_on=[\"id_municipio_6\"],\n", + " how=\"left\",\n", + " )\n", + "\n", + " chunk = pd.merge(\n", + " chunk,\n", + " df_municipio,\n", + " left_on=[\"id_municipio_trabalho\"],\n", + " right_on=[\"id_municipio_6\"],\n", + " how=\"left\",\n", + " )\n", + "\n", + " chunk.drop(\n", + " [\n", + " \"id_municipio_trabalho\",\n", + " \"municipio\",\n", + " \"id_municipio_6_x\",\n", + " \"id_municipio_6_y\",\n", + " \"sigla_uf_y\",\n", + " ],\n", + " axis=1,\n", + " inplace=True,\n", + " )\n", + "\n", + " chunk.rename(\n", + " columns={\n", + " \"id_municipio_x\": \"id_municipio\",\n", + " \"sigla_uf_x\": \"sigla_uf\",\n", + " \"id_municipio_y\": \"id_municipio_trabalho\",\n", + " },\n", + " inplace=True,\n", + " )\n", + "\n", + " chunk[\"sigla_uf\"].replace([np.nan, \"NI\"], \"IGNORADO\", inplace=True)\n", + "\n", + " vars_list = [\n", + " \"ano\",\n", + " \"sigla_uf\",\n", + " \"id_municipio\",\n", + " \"tipo_vinculo\",\n", + " \"vinculo_ativo_3112\",\n", + " \"tipo_admissao\",\n", + " \"mes_admissao\",\n", + " \"mes_desligamento\",\n", + " \"motivo_desligamento\",\n", + " \"causa_desligamento_1\",\n", + " \"causa_desligamento_2\",\n", + " \"causa_desligamento_3\",\n", + " \"faixa_tempo_emprego\",\n", + " \"tempo_emprego\",\n", + " \"faixa_horas_contratadas\",\n", + " \"quantidade_horas_contratadas\",\n", + " \"id_municipio_trabalho\",\n", + " \"quantidade_dias_afastamento\",\n", + " \"indicador_cei_vinculado\",\n", + " \"indicador_trabalho_parcial\",\n", + " \"indicador_trabalho_intermitente\",\n", + " \"faixa_remuneracao_media_sm\",\n", + " \"valor_remuneracao_media_sm\",\n", + " \"valor_remuneracao_media\",\n", + " \"faixa_remuneracao_dezembro_sm\",\n", + " \"valor_remuneracao_dezembro_sm\",\n", + " \"valor_remuneracao_janeiro\",\n", + " \"valor_remuneracao_fevereiro\",\n", + " \"valor_remuneracao_marco\",\n", + " \"valor_remuneracao_abril\",\n", + " \"valor_remuneracao_maio\",\n", + " \"valor_remuneracao_junho\",\n", + " \"valor_remuneracao_julho\",\n", + " \"valor_remuneracao_agosto\",\n", + " \"valor_remuneracao_setembro\",\n", + " \"valor_remuneracao_outubro\",\n", + " \"valor_remuneracao_novembro\",\n", + " \"valor_remuneracao_dezembro\",\n", + " \"tipo_salario\",\n", + " \"valor_salario_contratual\",\n", + " \"subatividade_ibge\",\n", + " \"subsetor_ibge\",\n", + " \"cbo_1994\",\n", + " \"cbo_2002\",\n", + " \"cnae_1\",\n", + " \"cnae_2\",\n", + " \"cnae_2_subclasse\",\n", + " \"faixa_etaria\",\n", + " \"idade\",\n", + " \"grau_instrucao_1985_2005\",\n", + " \"grau_instrucao_apos_2005\",\n", + " \"nacionalidade\",\n", + " \"sexo\",\n", + " \"raca_cor\",\n", + " \"indicador_portador_deficiencia\",\n", + " \"tipo_deficiencia\",\n", + " \"ano_chegada_brasil\",\n", + " \"tamanho_estabelecimento\",\n", + " \"tipo_estabelecimento\",\n", + " \"natureza_juridica\",\n", + " \"indicador_simples\",\n", + " \"bairros_sp\",\n", + " \"distritos_sp\",\n", + " \"bairros_fortaleza\",\n", + " \"bairros_rj\",\n", + " \"regioes_administrativas_df\",\n", + " ]\n", + "\n", + " for var in vars_list:\n", + "\n", + " if var not in chunk.columns:\n", + " chunk[var] = \"\"\n", + "\n", + " # Limpeza de variáveis\n", + " chunk = chunk.applymap(lambda x: x.strip() if isinstance(x, str) else x)\n", + "\n", + " # Limpeza de códigos inválidos\n", + "\n", + " invalid_codes_bairros = [\n", + " \"0000\",\n", + " \"00000\",\n", + " \"000000\",\n", + " \"0000000\",\n", + " \"0000-1\",\n", + " \"000-1\",\n", + " \"9999\",\n", + " \"9997\",\n", + " ]\n", + " for col in [\n", + " \"bairros_rj\",\n", + " \"bairros_sp\",\n", + " \"bairros_fortaleza\",\n", + " \"distritos_sp\",\n", + " \"regioes_administrativas_df\",\n", + " ]:\n", + "\n", + " chunk[col].replace(invalid_codes_bairros, \"\", inplace=True)\n", + "\n", + " # Mais substituições de códigos\n", + "\n", + " invalid_codes_general = [\"0000\", \"00000\", \"000000\", \"0000000\", \"0000-1\", \"000-1\"]\n", + "\n", + " for col in [\n", + " \"cbo_1994\",\n", + " \"cbo_2002\",\n", + " \"cnae_1\",\n", + " \"cnae_2\",\n", + " \"cnae_2_subclasse\",\n", + " \"ano_chegada_brasil\",\n", + " ]:\n", + "\n", + " chunk[col].replace(invalid_codes_general, \"\", inplace=True)\n", + "\n", + " chunk[\"mes_admissao\"].replace(\"00\", \"\", inplace=True)\n", + "\n", + " chunk[\"mes_desligamento\"].replace(\"00\", \"\", inplace=True)\n", + "\n", + " chunk[\"motivo_desligamento\"].replace(\"0\", \"\", inplace=True)\n", + "\n", + " chunk[\"causa_desligamento_1\"].replace(\"99\", \"\", inplace=True)\n", + "\n", + " chunk[\"raca_cor\"].replace(\"99\", \"9\", inplace=True)\n", + "\n", + " # Ajustes adicionais\n", + "\n", + " chunk[\"natureza_juridica\"].replace([\"9990\", \"9999\"], \"\", inplace=True)\n", + "\n", + " chunk[\"tipo_estabelecimento\"] = chunk[\"tipo_estabelecimento\"].replace(\n", + " [\"CNPJ\", \"Cnpj\", \"01\", \"1\"], \"1\"\n", + " )\n", + "\n", + " chunk[\"tipo_estabelecimento\"] = chunk[\"tipo_estabelecimento\"].replace(\"CAEPF\", \"2\")\n", + "\n", + " chunk[\"tipo_estabelecimento\"] = chunk[\"tipo_estabelecimento\"].replace(\n", + " [\"CEI\", \"Cei\", \"CEI/CNO\", \"Cei/Cno\", \"CNO\", \"Cno\", \"03\", \"3\"], \"3\"\n", + " )\n", + "\n", + " # Conversão de valores monetários\n", + "\n", + " monetary_vars = [\n", + " \"valor_remuneracao_janeiro\",\n", + " \"valor_remuneracao_fevereiro\",\n", + " \"valor_remuneracao_marco\",\n", + " \"valor_remuneracao_abril\",\n", + " \"valor_remuneracao_maio\",\n", + " \"valor_remuneracao_junho\",\n", + " \"valor_remuneracao_julho\",\n", + " \"valor_remuneracao_agosto\",\n", + " \"valor_remuneracao_setembro\",\n", + " \"valor_remuneracao_outubro\",\n", + " \"valor_remuneracao_novembro\",\n", + " \"valor_remuneracao_dezembro\",\n", + " \"valor_salario_contratual\",\n", + " \"valor_remuneracao_dezembro_sm\",\n", + " \"valor_remuneracao_media\",\n", + " \"valor_remuneracao_media_sm\",\n", + " ]\n", + "\n", + " for var in monetary_vars:\n", + "\n", + " chunk[var] = chunk[var].astype(str)\n", + "\n", + " chunk[var] = chunk[var].str.replace(\",\", \".\")\n", + "\n", + " chunk = chunk[vars_list]\n", + "\n", + " print(\"Particionando...\")\n", + "\n", + " to_partitions(\n", + " data=chunk,\n", + " partition_columns=[\"ano\", \"sigla_uf\"],\n", + " savepath=\"X:\\\\dados\\\\br_me_rais\\\\vinculos_2023\\\\vinculos\",\n", + " file_type=\"csv\",\n", + " )\n", + "\n", + " del chunk\n", + "\n", + " gc.collect()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/models/br_me_rais/schema.yml b/models/br_me_rais/schema.yml index 863e0cca..b58f2f05 100644 --- a/models/br_me_rais/schema.yml +++ b/models/br_me_rais/schema.yml @@ -135,39 +135,39 @@ models: description: Indicador Trabalho Parcial - name: indicador_trabalho_intermitente description: Indicador Trabalho Intermitente - - name: faixa_remun_media_sm + - name: faixa_remuneracao_media_sm description: Faixa Remuneração Média (Salários Mínimos) - - name: valor_remun_media_sm + - name: valor_remuneracao_media_sm description: Valor da Remuneração Média (Salários Mínimos) - - name: valor_remun_media_nominal + - name: valor_remuneracao_media description: Valor da Remuneração Média (Nominal) - - name: faixa_remun_dezembro_sm + - name: faixa_remuneracao_dezembro_sm description: Faixa Remuneração em Dezembro (Salários Mínimos) - - name: valor_remun_dezembro_sm + - name: valor_remuneracao_dezembro_sm description: Valor da Remuneração em Dezembro (Salários Mínimos) - - name: valor_remun_janeiro_nominal + - name: valor_remuneracao_janeiro description: Valor da Remuneração em Janeiro (Nominal) - - name: valor_remun_fevereiro_nominal + - name: valor_remuneracao_fevereiro description: Valor da Remuneração em Fevereiro (Nominal) - - name: valor_remun_marco_nominal + - name: valor_remuneracao_marco description: Valor da Remuneração em Março (Nominal) - - name: valor_remun_abril_nominal + - name: valor_remuneracao_abril description: Valor da Remuneração em Abril (Nominal) - - name: valor_remun_maio_nominal + - name: valor_remuneracao_maio description: Valor da Remuneração em Maio (Nominal) - - name: valor_remun_junho_nominal + - name: valor_remuneracao_junho description: Valor da Remuneração em Junho (Nominal) - - name: valor_remun_julho_nominal + - name: valor_remuneracao_julho description: Valor da Remuneração em Julho (Nominal) - - name: valor_remun_agosto_nominal + - name: valor_remuneracao_agosto description: Valor da Remuneração em Agosto (Nominal) - - name: valor_remun_setembro_nominal + - name: valor_remuneracao_setembro description: Valor da Remuneração em Setembro (Nominal) - - name: valor_remun_outubro_nominal + - name: valor_remuneracao_outubro description: Valor da Remuneração em Outubro (Nominal) - - name: valor_remun_novembro_nominal + - name: valor_remuneracao_novembro description: Valor da Remuneração em Novembro (Nominal) - - name: valor_remun_dezembro_nominal + - name: valor_remuneracao_dezembro description: Valor da Remuneração em Dezembro (Nominal) - name: tipo_salario description: Tipo do Salário @@ -220,7 +220,7 @@ models: tests: - relationships: to: ref('br_bd_diretorios_brasil__subatividade_ibge') - field: subatividade_ibge.subatividade_ibge + field: id_subatividade - name: subsetor_ibge description: Subsetor - IBGE - name: cnae_1 @@ -235,11 +235,9 @@ models: - name: cnae_2_subclasse description: Classificação Nacional de Atividades Econômicas (CNAE) 2.0 Subclasse tests: - - custom_relationships: - tags: [cnae] - to: ref('br_bd_diretorios_brasil__cnae_2') - field: subclasse - ignore_values: ['9999997', '8630505', '3312101', '9999999', 00000-1] + - relationships: + to: ref('br_bd_diretorios_brasil__cnae_2_subclasse') + field: cnae_2_subclasse.cnae_2_subclasse - name: tamanho_estabelecimento description: Tamanho do Estabelecimento - name: tipo_estabelecimento @@ -293,7 +291,7 @@ models: - relationships: to: ref('br_bd_diretorios_brasil__municipio') field: id_municipio - - name: quantidade_vinculos_ativo + - name: quantidade_vinculos_ativos description: Estoque de vínculos ativos em 31/12. - name: quantidade_vinculos_clt description: Estoque de vínculos, sob o regime CLT e Outros, ativos em 31/12 @@ -377,7 +375,7 @@ models: - name: subatividade_ibge description: Subatividade IBGE tests: - - custom_relationships: + - relationships: to: ref('br_bd_diretorios_brasil__subatividade_ibge') field: id_subatividade - name: cep