Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[dados] br_fbsp_absp #222

Merged
merged 13 commits into from
Sep 26, 2023
3 changes: 3 additions & 0 deletions dbt_project.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
37 changes: 37 additions & 0 deletions models/br_fbsp_absp/br_fbsp_absp__uf.sql
Original file line number Diff line number Diff line change
@@ -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
51 changes: 51 additions & 0 deletions models/br_fbsp_absp/code/clean_data.py
Original file line number Diff line number Diff line change
@@ -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()
61 changes: 61 additions & 0 deletions models/br_fbsp_absp/code/columns.py
Original file line number Diff line number Diff line change
@@ -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"]
74 changes: 74 additions & 0 deletions models/br_fbsp_absp/code/download_data.py
Original file line number Diff line number Diff line change
@@ -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()
70 changes: 70 additions & 0 deletions models/br_fbsp_absp/schema.yaml
Original file line number Diff line number Diff line change
@@ -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
Loading