Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/origin/staging/br_tse_fili…
Browse files Browse the repository at this point in the history
…acao_partidaria__microdados' into staging/br_tse_filiacao_partidaria__microdados
  • Loading branch information
Winzen committed Nov 1, 2024
2 parents 729ac2b + a8d93f6 commit f458f0b
Show file tree
Hide file tree
Showing 15 changed files with 3,025 additions and 1 deletion.
63 changes: 63 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@

# Template Pull Requests - Queries-basedosdados

## Nomeação do Pull Request

A nomeação de cada Pull Request (PR) deve seguir o seguinte padrão:

- O título de cada Pull Request (PR) deve começar com uma das seguintes palavras-chave, entre colchetes. Além disso, **marque a palavra-chave que melhor descreve o seu PR atual**:
- [ ] **[Dbt]**: Para subida de novos dados em produção.
- [ ] **[Feature]**: Para novas funcionalidades.
- [ ] **[Table-Approve]**: Para rodar apenas o Table-Approve.
- [ ] **[Bugfix]**: Para correções de bugs.
- [ ] **[Refactor]**: Para mudanças no código que não alteram a funcionalidade.
- [ ] **[Docs]**: Para atualizações na documentação.
- [ ] **[Test]**: Para mudanças relacionadas a testes.
- [ ] **[Chore]**: Para tarefas menores e de manutenção.

---
- Exemplos de título:
- **[docs] br_me_caged**
- **[Feature] br_cgu_servidores_publicos**

## Draft:
- Ao abrir o PR, deverá coloca-lo como draft


## Descrição do PR:
- Explique de maneira clara e concisa o objetivo deste PR. O que foi alterado? Qual o problema que ele resolve?
- **Motivação/Contexto:** <!-- Qual a necessidade dessa mudança? -->


## Detalhes Técnicos:
- Detalhe as mudanças mais técnicas, como ajustes no dbt, scripts ou modelo de dados utilizado.
- **Principais alterações no dbt/scripts:** <!-- Cite as principais mudanças no dbt/script -->
- **Mudanças nos dados e no schema:** <!-- Cite se há mudanças nos dados e no schema -->
- **Impacto no desempenho:** <!-- Cite os impactos de desempenho dessas mudanças -->

- Se alguma parte do código precisar de alguma atenção a mais, comente na linha sinalizando para os revisores.

## Teste e Validações:

- Relate os testes e validações relacionado aos dados/script:
- [ ] Testado em `queries-basedosdados-dev`
- [ ] **Decisões relacionadas aos testes:** <!-- Cite as decisões relacionadas ao teste -->

- **Caso haja algo relacionado aos testes que vale a pena informar:** <!-- Cite informações sobre os testes? -->

## Riscos e Mitigações:
- Identifique os riscos potenciais desta mudança e como mitigar esses Riscos

- Riscos conhecidos: <!-- Cite problemas que podem surgir -->
- Planos de rollback: <!-- Explique como reverter as mudanças -->

## Dependencias:
- Liste quaisquer dependências externas, como bibliotecas, outros PRs ou mudanças que precisam ser feitas antes deste merge.
- [ ] Dependências: <!-- Cite dependencias, bibliotecas e outros PRs que são relacionados a esse Pull Requests antes de mergear -->
- [ ] Nenhuma dependencias adicional


## Revisadores:
- Quando o PR estiver pronto para ser revisado, retire o **Draft** através do **Ready for reviews**, marque os revisadores de repositório, envie o PR no nosso [discord](https://discord.gg/V3yTWRYWZZ) na aba **Correções de PRs, arquiteturas e afins** e marque a **@equipe_dados**:
- Revisadores recomendados no github:
- basedosdados/dados
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{{
config(
alias="docente_deficiencia",
schema="br_inep_sinopse_estatistica_educacao_basica",
materialized="table",
partition_by={
"field": "ano",
"data_type": "int64",
"range": {"start": 2012, "end": 2023, "interval": 1},
},
cluster_by="sigla_uf",
)
}}
select
safe_cast(ano as int64) ano,
safe_cast(sigla_uf as string) sigla_uf,
safe_cast(id_municipio as string) id_municipio,
safe_cast(tipo_classe as string) tipo_classe,
safe_cast(deficiencia as string) deficiencia,
safe_cast(quantidade_docente as int64) quantidade_docente,
from
`basedosdados-staging.br_inep_sinopse_estatistica_educacao_basica_staging.docente_deficiencia`
as t
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{{
config(
alias="docente_escolaridade",
schema="br_inep_sinopse_estatistica_educacao_basica",
materialized="table",
partition_by={
"field": "ano",
"data_type": "int64",
"range": {"start": 2007, "end": 2023, "interval": 1},
},
cluster_by="sigla_uf",
)
}}
select
safe_cast(ano as int64) ano,
safe_cast(sigla_uf as string) sigla_uf,
safe_cast(id_municipio as string) id_municipio,
safe_cast(tipo_classe as string) tipo_classe,
safe_cast(escolaridade as string) escolaridade,
safe_cast(replace(quantidade_docente, ".0", "") as int64) quantidade_docente,
from
`basedosdados-staging.br_inep_sinopse_estatistica_educacao_basica_staging.docente_escolaridade`
as t
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{{
config(
alias="docente_etapa_ensino",
schema="br_inep_sinopse_estatistica_educacao_basica",
materialized="table",
partition_by={
"field": "ano",
"data_type": "int64",
"range": {"start": 2007, "end": 2023, "interval": 1},
},
cluster_by="sigla_uf",
)
}}

select
safe_cast(ano as int64) ano,
safe_cast(sigla_uf as string) sigla_uf,
safe_cast(replace(id_municipio, ".0", "") as string) id_municipio,
safe_cast(tipo_classe as string) tipo_classe,
safe_cast(etapa_ensino as string) etapa_ensino,
safe_cast(replace(quantidade_docentes, ".0", "") as int64) quantidade_docente,
from
`basedosdados-staging.br_inep_sinopse_estatistica_educacao_basica_staging.docente_etapa_ensino`
as t
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{{
config(
alias="docente_faixa_etaria_sexo",
schema="br_inep_sinopse_estatistica_educacao_basica",
materialized="table",
partition_by={
"field": "ano",
"data_type": "int64",
"range": {"start": 2007, "end": 2023, "interval": 1},
},
cluster_by="sigla_uf",
)
}}
select
safe_cast(ano as int64) ano,
safe_cast(sigla_uf as string) sigla_uf,
safe_cast(id_municipio as string) id_municipio,
safe_cast(tipo_classe as string) tipo_classe,
safe_cast(faixa_etaria as string) faixa_etaria,
safe_cast(sexo as string) sexo,
safe_cast(quantidade_docente as int64) quantidade_docente,
from
`basedosdados-staging.br_inep_sinopse_estatistica_educacao_basica_staging.docente_faixa_etaria_sexo`
as t
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{{
config(
alias="docente_localizacao",
schema="br_inep_sinopse_estatistica_educacao_basica",
materialized="table",
partition_by={
"field": "ano",
"data_type": "int64",
"range": {"start": 2007, "end": 2023, "interval": 1},
},
cluster_by="sigla_uf",
)
}}
select
safe_cast(ano as int64) ano,
safe_cast(sigla_uf as string) sigla_uf,
safe_cast(replace(id_municipio, ".0", "") as string) id_municipio,
safe_cast(tipo_classe as string) tipo_classe,
safe_cast(rede as string) rede,
safe_cast(localizacao as string) localizacao,
safe_cast(quantidade_docente as int64) quantidade_docente,
from
`basedosdados-staging.br_inep_sinopse_estatistica_educacao_basica_staging.docente_localizacao`
as t
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{{
config(
alias="docente_regime_contrato",
schema="br_inep_sinopse_estatistica_educacao_basica",
materialized="table",
partition_by={
"field": "ano",
"data_type": "int64",
"range": {"start": 2007, "end": 2023, "interval": 1},
},
cluster_by="sigla_uf",
)
}}
select
safe_cast(ano as int64) ano,
safe_cast(sigla_uf as string) sigla_uf,
safe_cast(id_municipio as string) id_municipio,
safe_cast(tipo_classe as string) tipo_classe,
safe_cast(rede as string) rede,
safe_cast(regime_contrato as string) regime_contrato,
safe_cast(quantidade_docente as int64) quantidade_docente,
from
`basedosdados-staging.br_inep_sinopse_estatistica_educacao_basica_staging.docente_regime_contrato`
as t
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
import os
import zipfile
import pandas as pd
import basedosdados as bd
import numpy as np

INPUT = os.path.join(os.getcwd(), "input")
OUTPUT = os.path.join(os.getcwd(), "output")

# os.makedirs(INPUT, exist_ok=True)
# os.makedirs(OUTPUT, exist_ok=True)

RENAME_DEFICIENCIA = {
"Educacao Especial - Classes Comuns": {
"Unnamed: 1": "uf",
"Unnamed: 3": "id_municipio",
"Cegueira": "Cegueira",
"Baixa Visão": "Baixa Visão",
"Surdez": "Surdez",
"Deficiência Auditiva": "Deficiência Auditiva",
"Surdocegueira": "Surdocegueira",
"Deficiência Física": "Deficiência Física",
"Deficiência Intelectual": "Deficiência Intelectual",
"Deficiência Múltipla": "Deficiência Múltipla",
# "Transtorno do Espectro Autista": "Transtorno do Espectro Autista",
# "Altas Habilidades / Superdotação": "Altas Habilidades / Superdotação",
},
"Educacao Especial - Classes Exclusivas": {
"Unnamed: 1": "uf",
"Unnamed: 3": "id_municipio",
"Cegueira": "Cegueira",
"Baixa Visão": "Baixa Visão",
"Surdez": "Surdez",
"Deficiência Auditiva": "Deficiência Auditiva",
"Surdocegueira": "Surdocegueira",
"Deficiência Física": "Deficiência Física",
"Deficiência Intelectual": "Deficiência Intelectual",
"Deficiência Múltipla": "Deficiência Múltipla",
# "Transtorno do Espectro Autista": "Transtorno do Espectro Autista",
# "Altas Habilidades / Superdotação": "Altas Habilidades / Superdotação",
},
}

deficiencia = {
"educacao_especial_classes_comuns": {
"dicionario": RENAME_DEFICIENCIA["Educacao Especial - Classes Comuns"],
"chave": "2.48",
"valor": "Educacao Especial - Classes Comuns",
"skiprows": 7,
"table": "docente_deficiencia",
},
"educacao_especial_classes_exclusivas": {
"dicionario": RENAME_DEFICIENCIA["Educacao Especial - Classes Exclusivas"],
"chave": "2.54",
"valor": "Educacao Especial - Classes Exclusivas",
"skiprows": 7,
"table": "docente_deficiencia",
},
}


def read_sheet(
table: str, ano: int, chave: str, valor: str, dicionario: dict, skiprows
) -> pd.DataFrame:
print("Tratando dados de", valor, ano)
path_excel = os.path.join(
INPUT,
f"Sinopse_Estatistica_da_Educaç╞o_Basica_{ano}",
f"Sinopse_Estatistica_da_Educaç╞o_Basica_{ano}.xlsx",
)

df = pd.read_excel(
path_excel,
skiprows=skiprows,
sheet_name=chave,
)

sheets_etapa_ensino_serie = {chave: valor}

dfs_deficiencia = {
name: pd.read_excel(path_excel, skiprows=skiprows, sheet_name=sheet_name)
for sheet_name, name in sheets_etapa_ensino_serie.items()
}

dataframes = {}

for table_name, columns in dfs_deficiencia.items():
df = pd.DataFrame(columns) # Create DataFrame for each table
dataframes[table_name] = df # Store the DataFrame in a dictionary

print(df.columns)

def drop_unused_columns(df: pd.DataFrame) -> pd.DataFrame:
cols_drop = [
col
for col in df.columns
if col.startswith("Unnamed") or col.startswith("Total")
]

return df.drop(columns=cols_drop)

dfs_deficiencia = {
name: drop_unused_columns(
df.rename(columns=RENAME_DEFICIENCIA[name], errors="raise")
)
for name, df in dfs_deficiencia.items()
}

df_deficiencia = pd.concat(
[
df.pipe(
lambda d: d.loc[(d["id_municipio"].notna()) & (d["id_municipio"] != " "),]
)
.pipe(
lambda d: pd.melt(
d,
id_vars=["id_municipio", "uf"],
value_vars=d.columns.difference(
["id_municipio", "uf"]
).tolist(), # Convert to list
var_name="deficiencia",
value_name="quantidade_docente",
)
)
.assign(tipo_classe=tipo_classe)
for tipo_classe, df in dfs_deficiencia.items()
]
)

bd_dir = bd.read_sql(
"SELECT nome, sigla FROM `basedosdados.br_bd_diretorios_brasil.uf`",
billing_project_id="basedosdados",
reauth=False,
)

df_deficiencia["uf"] = df_deficiencia["uf"].apply(lambda uf: uf.strip()).replace({i["nome"]: i["sigla"] for i in bd_dir.to_dict("records")}) # type: ignore

df_deficiencia = df_deficiencia.rename(columns={"uf": "sigla_uf"}, errors="raise")

df_deficiencia["quantidade_docente"] = df_deficiencia["quantidade_docente"].astype(
int
)

print("Particionando dados")
for sigla_uf, df in df_deficiencia.groupby("sigla_uf"):
path = os.path.join(OUTPUT, f"{table}", f"ano={ano}", f"sigla_uf={sigla_uf}")
if not os.path.exists(path):
os.makedirs(path, exist_ok=True)
df.drop(columns=["sigla_uf"]).to_csv(
os.path.join(path, "data.csv"), index=False, mode="w"
)
else:
df.drop(columns=["sigla_uf"]).to_csv(
os.path.join(path, "data.csv"), index=False, mode="a", header=False
)

if __name__ == '__main__' :
lista = [
"educacao_especial_classes_comuns",
"educacao_especial_classes_exclusivas",
]

for x in lista:
# for ano in range(2012, 2019):
read_sheet(
table=deficiencia[x]["table"],
ano=2011,
chave=deficiencia[x]["chave"],
valor=deficiencia[x]["valor"],
dicionario=deficiencia[x]["dicionario"],
skiprows=deficiencia[x]["skiprows"],
)
Loading

0 comments on commit f458f0b

Please sign in to comment.