diff --git a/dbt_project.yml b/dbt_project.yml index 6107c9ba..dda95eb4 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -121,6 +121,9 @@ models: br_cvm_oferta_publica_distribuicao: +materialized: table +schema: br_cvm_oferta_publica_distribuicao + br_fbsp_absp: + +materialized: table + +schema: br_fbsp_absp br_fgv_igp: +materialized: table +schema: br_fgv_igp diff --git a/models/br_fbsp_absp/br_fbsp_absp__uf.sql b/models/br_fbsp_absp/br_fbsp_absp__uf.sql new file mode 100644 index 00000000..a27c36d6 --- /dev/null +++ b/models/br_fbsp_absp/br_fbsp_absp__uf.sql @@ -0,0 +1,37 @@ +{{ + config( + alias='uf', + schema='br_fbsp_absp' + ) +}} +SELECT +SAFE_CAST(ano AS INT64) ano, +SAFE_CAST(sigla_uf AS STRING) sigla_uf, +SAFE_CAST(quantidade_cvli AS INT64) quantidade_cvli, +SAFE_CAST(quantidade_feminicidio AS INT64) quantidade_feminicidio, +SAFE_CAST(quantidade_ocorrencia_homicidio_doloso AS INT64) quantidade_ocorrencia_homicidio_doloso, +SAFE_CAST(quantidade_vitima_homicidio_doloso AS INT64) quantidade_vitima_homicidio_doloso, +SAFE_CAST(quantidade_latrocinio AS INT64) quantidade_latrocinio, +SAFE_CAST(quantidade_lesao_corporal_seguida_de_morte AS INT64) quantidade_lesao_corporal_seguida_de_morte, +SAFE_CAST(quantidade_morte_a_esclarecer AS INT64) quantidade_morte_a_esclarecer, +SAFE_CAST(quantidade_morte_intervencao_policial_civil_servico AS INT64) quantidade_morte_intervencao_policial_civil_servico, +SAFE_CAST(quantidade_morte_intervencao_policial_civil_fora_servico AS INT64) quantidade_morte_intervencao_policial_civil_fora_servico, +SAFE_CAST(quantidade_morte_intervencao_policial_militar_servico AS INT64) quantidade_morte_intervencao_policial_militar_servico, +SAFE_CAST(quantidade_morte_intervencao_policial_militar_fora_servico AS INT64) quantidade_morte_intervencao_policial_militar_fora_servico, +SAFE_CAST(quantidade_morte_violenta_intencional AS INT64) quantidade_morte_violenta_intencional, +SAFE_CAST(quantidade_policial_civil_morto_confronto_servico AS INT64) quantidade_policial_civil_morto_confronto_servico, +SAFE_CAST(quantidade_policial_civil_morto_confronto_fora_servico AS INT64) quantidade_policial_civil_morto_confronto_fora_servico, +SAFE_CAST(quantidade_policial_militar_morto_confronto_servico AS INT64) quantidade_policial_militar_morto_confronto_servico, +SAFE_CAST(quantidade_policial_militar_morto_confronto_fora_servico AS INT64) quantidade_policial_militar_morto_confronto_fora_servico, +SAFE_CAST(quantidade_suicidio AS INT64) quantidade_suicidio, +SAFE_CAST(quantidade_estupro AS INT64) quantidade_estupro, +SAFE_CAST(quantidade_tentativa_estupro AS INT64) quantidade_tentativa_estupro, +SAFE_CAST(quantidade_furto_veiculo AS INT64) quantidade_furto_veiculo, +SAFE_CAST(quantidade_roubo_instituicao_financeira AS INT64) quantidade_roubo_instituicao_financeira, +SAFE_CAST(quantidade_roubo_carga AS INT64) quantidade_roubo_carga, +SAFE_CAST(quantidade_roubo_de_veiculo AS INT64) quantidade_roubo_de_veiculo, +SAFE_CAST(quantidade_arma_fogo_apreendida AS INT64) quantidade_arma_fogo_apreendida, +SAFE_CAST(quantidade_registro_pessoa_desaparecida AS INT64) quantidade_registro_pessoa_desaparecida, +SAFE_CAST(quantidade_populacao_sistema_penitenciario AS INT64) quantidade_populacao_sistema_penitenciario, +SAFE_CAST(despesa_empenhada_seguranca_publica AS FLOAT64) despesa_empenhada_seguranca_publica +FROM basedosdados-staging.br_fbsp_absp_staging.uf AS t diff --git a/models/br_fbsp_absp/code/clean_data.py b/models/br_fbsp_absp/code/clean_data.py new file mode 100644 index 00000000..a49fc1f0 --- /dev/null +++ b/models/br_fbsp_absp/code/clean_data.py @@ -0,0 +1,51 @@ +import os +import pandas as pd +from columns import columns_order, real_columns + + +def set_row(df): + keys = df.columns.tolist() + modelo_dict = {keys[n]: 0 for n in range(len(keys))} + return modelo_dict + + +def get_clean_data(): + + arquivos = os.listdir(os.getcwd().replace("code", "input")) + + dfs = [pd.read_excel(f"../input/{df}") for df in arquivos] + df = pd.concat(dfs) + + df_group = df.groupby(["ano", "uf"], group_keys=True).apply(lambda x: x)[["tipo_de_crime", "qtd"]] + df_raw = pd.DataFrame(columns=columns_order) + + modelo_dict = set_row(df_raw) + for ano in df["ano"].sort_values(ascending=False).unique(): + for uf in df["uf"].unique(): + condition = (df_group.index.get_level_values("uf") == uf) & (df_group.index.get_level_values("ano") == ano) + modelo_dict["ano"] = ano + modelo_dict["sigla_uf"] = uf + for dado in df_group[condition].iloc: + modelo_dict[dado[0]] = dado[1] + df_raw.loc[len(df_raw)] = modelo_dict + modelo_dict = set_row(df_raw) + + remove_list_colunas = [ + "Mortes decorrentes de intervenções policiais - Total (Policiais civis e militares em serviço e fora)", + "Roubo e furto de veículos"] + + for remove in remove_list_colunas: + df_raw = df_raw.drop(remove, axis=1) + + for column in df_raw.columns: + if column not in ["ano", "sigla_uf", "Despesas empenhadas na Função Segurança Pública"]: + df_raw[column] = df_raw[column].astype("Int64") + + df_raw.columns = real_columns + df_raw = df_raw[~df_raw["sigla_uf"].isin(["Brasil"])] + + df_raw.to_csv("../output/br_fbsp_absp_uf.csv", index=False) + + +if __name__ == '__main__': + get_clean_data() diff --git a/models/br_fbsp_absp/code/columns.py b/models/br_fbsp_absp/code/columns.py new file mode 100644 index 00000000..99441016 --- /dev/null +++ b/models/br_fbsp_absp/code/columns.py @@ -0,0 +1,61 @@ +columns_order = ['ano', + 'sigla_uf', + 'CVLI Crimes violentos letais intencionais', + 'Feminicídios', + 'Homicídio doloso - N° ocorrências', + 'Homicídio doloso - N° vítimas', + 'Latrocínio', + 'Lesão corporal seguida de morte', + 'Mortes a esclarecer', + 'Mortes decorrentes de intervenções de Policiais Civis em serviço', + 'Mortes decorrentes de intervenções de Policiais Civis fora de serviço', + 'Mortes decorrentes de intervenções de Policiais Militares em serviço', + 'Mortes decorrentes de intervenções de Policiais Militares fora de serviço', + 'Mortes decorrentes de intervenções policiais - Total (Policiais civis e militares em serviço e fora)', + 'Mortes Violentas Intencionais', + 'Policiais Civis mortos em confronto em serviço', + 'Policiais Civis mortos em confronto ou por lesão não natural fora de serviço', + 'Policiais Militares mortos em confronto em serviço', + 'Policiais Militares mortos em confronto ou por lesão não natural fora de serviço', + 'Suicídio', + 'Estupro (incluindo Estupro de Vulnerável)', + 'Tentativa de estupro', + 'Furto de veículo', + 'Roubo a instituição financeira', + 'Roubo de carga', + 'Roubo de veículo', + 'Roubo e furto de veículos', + 'Armas de fogo apreendidas', + 'Registros de pessoas desaparecidas', + 'População do sistema penitenciário', + 'Despesas empenhadas na Função Segurança Pública'] + +real_columns = ["ano", + "sigla_uf", + "quantidade_cvli", + "quantidade_feminicidio", + "quantidade_ocorrencia_homicidio_doloso", + "quantidade_vitima_homicidio_doloso", + "quantidade_latrocinio", + "quantidade_lesao_corporal_seguida_de_morte", + "quantidade_morte_a_esclarecer", + "quantidade_morte_intervencao_policial_civil_servico", + "quantidade_morte_intervencao_policial_civil_fora_servico", + "quantidade_morte_intervencao_policial_militar_servico", + "quantidade_morte_intervencao_policial_militar_fora_servico", + "quantidade_morte_violenta_intencional", + "quantidade_policial_civil_morto_confronto_servico", + "quantidade_policial_civil_morto_confronto_fora_servico", + "quantidade_policial_militar_morto_confronto_servico", + "quantidade_policial_militar_morto_confronto_fora_servico", + "quantidade_suicidio", + "quantidade_estupro", + "quantidade_tentativa_estupro", + "quantidade_furto_veiculo", + "quantidade_roubo_instituicao_financeira", + "quantidade_roubo_carga", + "quantidade_roubo_de_veiculo", + "quantidade_arma_fogo_apreendida", + "quantidade_registro_pessoa_desaparecida", + "quantidade_populacao_sistema_penitenciario", + "despesa_empenhada_seguranca_publica"] diff --git a/models/br_fbsp_absp/code/download_data.py b/models/br_fbsp_absp/code/download_data.py new file mode 100644 index 00000000..6f27cf80 --- /dev/null +++ b/models/br_fbsp_absp/code/download_data.py @@ -0,0 +1,74 @@ +from selenium import webdriver +from selenium.webdriver.firefox.options import Options +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as EC +from time import sleep +import os + + +def select_selection_download(website): + + abas_dic = [[2, 18, 'tableau_mvi-downloadData'], + [7, 2, 'tableau_estupro-downloadData'], + [12, 5, 'tableau_patrimonial-downloadData'], + [17, 1, 'tableau_mvi_armas-downloadData'], + [22, 1, 'tableau_mvi_gastos-downloadData'], + [27, 1, 'tableau_mvi_desap-downloadData'], + [32, 1, 'tableau_mvi_pop_pris-downloadData']] + + click(website, By.CSS_SELECTOR, "a.dropdown-toggle") + dropdown = website.find_element(By.CSS_SELECTOR, "ul.dropdown-menu") + dropdown = dropdown.find_elements(By.CSS_SELECTOR, "li a") + + for aba_n, aba in enumerate(dropdown): + sleep(2) + website.execute_script("arguments[0].click();", aba) + + for n in range(abas_dic[aba_n][1]): + try: + + click(website, By.CSS_SELECTOR, f'[aria-owns="bs-select-{abas_dic[aba_n][0]}"]') + + click(website, By.ID, f'bs-select-{abas_dic[aba_n][0]}-{n}') + + click(website, By.ID, abas_dic[aba_n][2]) + + except Exception as Error: + print(Error) + break + + +def create_website(): + options = Options() + options.add_argument('-headless') + options.set_preference('browser.download.folderList', 2) + options.set_preference('browser.download.manager.showWhenStarting', False) + options.set_preference('browser.download.dir', os.getcwd().replace("code", "input")) + options.set_preference('browser.helperApps.neverAsk.saveToDisk', "application/x-gzip") + + website = webdriver.Firefox(options=options) + wait = WebDriverWait(website, 10) + + website.get( + f"http://forumseguranca.org.br:3838/") + wait.until(EC.visibility_of_element_located((By.ID, 'tableau_mvi-downloadData'))) + + return website + + +def click(website, by, match, time_sleep=2): + where_click = website.find_element(by, match) + sleep(time_sleep) + website.execute_script("arguments[0].click();", where_click) + + +def download_data(): + website = create_website() + select_selection_download(website) + sleep(5) + website.quit() + + +if __name__ == '__main__': + download_data() diff --git a/models/br_fbsp_absp/schema.yaml b/models/br_fbsp_absp/schema.yaml new file mode 100644 index 00000000..a87dfa2f --- /dev/null +++ b/models/br_fbsp_absp/schema.yaml @@ -0,0 +1,70 @@ +version: 2 + +models: + - name: br_fbsp_absp + description: A base contempla as informações do Anuário de Segurança Pública a partir de 2007 com as estatísticas criminais compatibilizadas entre anos, com informações acerca dos homicídios, tráfico, furto e roubo, além da força policial, entre outros ao nível das unidades da federação. + columns: + - name: ano + description: Ano + - name: sigla_uf + description: Sigla da Unidade da Federação + - name: quantidade_cvli + description: Quantidade de Crimes violentos letais intencionais (CVLI) + - name: quantidade_feminicidio + description: Quantidade de Feminicídios + - name: quantidade_ocorrencia_homicidio_doloso + description: Quantidade de Homicídio doloso - N° ocorrências + - name: quantidade_vitima_homicidio_doloso + description: Quantidade de Homicídio doloso - N° vítimas + - name: quantidade_latrocinio + description: Quantidade de Latrocínio + - name: quantidade_lesao_corporal_seguida_de_morte + description: Quantidade de Lesão corporal seguida de morte + - name: quantidade_morte_a_esclarecer + description: Quantidade de Mortes a esclarecer + - name: quantidade_morte_intervencao_policial_civil_servico + description: Quantidade de Mortes decorrentes de intervenções de Policiais + Civis em servico + - name: quantidade_morte_intervencao_policial_civil_fora_servico + description: Quantidade de Mortes decorrentes de intervenções de Policiais + Civis fora de servico + - name: quantidade_morte_intervencao_policial_militar_servico + description: Quantidade de Mortes decorrentes de intervenções de Policiais + Militares em servico + - name: quantidade_morte_intervencao_policial_militar_fora_servico + description: Quantidade de Mortes decorrentes de intervenções de Policiais + Militares fora de servico + - name: quantidade_morte_violenta_intencional + description: Quantidade de Mortes Violentas Intencionais + - name: quantidade_policial_civil_morto_confronto_servico + description: Quantidade de Policiais Civis mortos em confronto em servico + - name: quantidade_policial_civil_morto_confronto_fora_servico + description: Quantidade de Policiais Civis mortos em confronto ou por lesão + não natural fora de servico + - name: quantidade_policial_militar_morto_confronto_servico + description: Quantidade de Policiais Militares mortos em confronto em servico + - name: quantidade_policial_militar_morto_confronto_fora_servico + description: Quantidade de Policiais Militares mortos em confronto ou por + lesão não natural fora de servico + - name: quantidade_suicidio + description: Quantidade de Suicídio + - name: quantidade_estupro + description: Quantidade de Estupro (incluindo Estupro de Vulnerável) + - name: quantidade_tentativa_estupro + description: Quantidade de Tentativa de estupro + - name: quantidade_furto_veiculo + description: Quantidade de Furto de veículo + - name: quantidade_roubo_instituicao_financeira + description: Quantidade de Roubo a instituição financeira + - name: quantidade_roubo_carga + description: Quantidade de Roubo de carga + - name: quantidade_roubo_de_veiculo + description: Quantidade de Roubo de veículo + - name: quantidade_arma_fogo_apreendida + description: Quantidade de Armas de fogo apreendidas + - name: quantidade_registro_pessoa_desaparecida + description: Quantidade de Registros de pessoas desaparecidas + - name: quantidade_populacao_sistema_penitenciario + description: Quantidade de População do sistema penitenciário + - name: despesa_empenhada_seguranca_publica + description: Quantidade de Despesas empenhadas na Função Segurança Pública