from datetime import date
from typing import Optional
from pydantic import validate_call, PositiveInt
from ..utils import Base, Get, parse, Formato, Output
[documentos]
class Partido(Base):
"""Informações detalhadas sobre um partido.
Parameters
----------
cod : int
Código numérico do partido do qual se deseja informações.
verificar_certificado : bool, default=True
Defina esse argumento como `False` em caso de falha na verificação do
certificado SSL.
Attributes
----------
dados : dict
Conjunto completo de dados.
cod : int
Código numérico do partido.
facebook : str
URL da página no Facebook do partido.
legislatura : str
Código numérico da última legislatura.
lider : dict
Informações sobre o líder do partido.
logo : str
URL da logo do partido.
nome : str
Nome completo do partido.
numero : int
Número eleitoral do partido.
sigla : str
Sigla do partido.
situacao : str
Situação do partido.
total_membros : str
Total de membros do partido.
total_posse : str
Total de posse do partido.
ultima_atualizacao : str
Última atualização das informações sobre o partido.
uri : str
Endereço para coleta de dados direta pela API do partido.
uri_membros : str
Endereço para coleta de dados direta pela API dos membros do partido.
website : str
URL do website do partido.
Methods
-------
membros()
Uma lista dos parlamentares de um partido durante um período.
Examples
--------
Obter o nome completo do partido #36899.
>>> p = camara.Partido(cod=36899)
>>> p.nome
... 'Movimento Democrático Brasileiro'
"""
def __init__(self, cod: int, verificar_certificado: bool = True):
self.cod = cod
self.verify = verificar_certificado
atributos = {
"facebook": ["urlFacebook"],
"legislatura": ["status", "idLegislatura"],
"lider": ["status", "lider"],
"logo": ["urlLogo"],
"nome": ["nome"],
"numero": ["numeroEleitoral"],
"sigla": ["sigla"],
"situacao": ["status", "situacao"],
"total_membros": ["status", "totalMembros"],
"total_posse": ["status", "totalPosse"],
"ultima_atualizacao": ["status", "data"],
"uri": ["uri"],
"uri_membros": ["status", "uriMembros"],
"website": ["urlWebSite"],
}
super().__init__(
endpoint="camara",
path=["partidos", str(cod)],
unpack_keys=["dados"],
error_key="status",
atributos=atributos,
verify=self.verify,
)
def __repr__(self) -> str:
return f"DadosAbertosBrasil.camara: {self.nome}"
def __str__(self) -> str:
return self.nome
[documentos]
def membros(
self,
inicio: Optional[date] = None,
fim: Optional[date] = None,
legislatura: Optional[PositiveInt] = None,
pagina: PositiveInt = 1,
itens: Optional[PositiveInt] = None,
ordenar_por: Optional[str] = None,
asc: bool = True,
url: bool = True,
index: bool = False,
formato: Formato = "pandas",
) -> Output:
"""Uma lista dos parlamentares de um partido durante um período.
Retorna uma lista de deputados que estão ou estiveram em exercício
pelo partido. Opcionalmente, pode-se usar os parâmetros `inicio`,
`fim` ou `legislatura` para se obter uma lista de deputados filiados
ao partido num certo intervalo de tempo. Isso é equivalente à função
`lista_deputados` com filtro por partido, mas é melhor para obter
informações sobre membros de partidos já extintos.
Parameters
----------
inicio : str, optional
Data de início de um intervalo de tempo, no formato `'AAAA-MM-DD'`.
fim : str, optional
Data de término de um intervalo de tempo, no formato `'AAAA-MM-DD'`.
legislatura : int, optional
Número da legislatura, à qual os dados buscados devem corresponder.
pagina : int, default=1
Número da página de resultados, a partir de 1, que se deseja
obter com a requisição, contendo o número de itens definido
pelo parâmetro `itens`. Se omitido, assume o valor 1.
itens : int, optional
Número máximo de itens na página que se deseja obter com esta
requisição.
asc : bool, default=True
Se os registros são ordenados no sentido ascendente:
- True: De A a Z ou 0 a 9 (ascendente);
- False: De Z a A ou 9 a 0 (descendente).
ordenar_por : str, optional
Qual dos elementos da representação deverá ser usado para aplicar
ordenação à lista.
url : bool, default=False
Se False, remove as colunas contendo URI, URL e e-mails.
Esse argumento é ignorado se `formato` for igual a 'json'.
index : bool, default=False
Se True, define a coluna `codigo` como index do DataFrame.
Esse argumento é ignorado se `formato` for igual a 'json'.
formato : {"json", "pandas", "url"}, default="pandas"
Formato do dado que será retornado:
- "json": Dicionário com as chaves e valores originais da API;
- "pandas": DataFrame formatado;
- "url": Endereço da API que retorna o arquivo JSON.
Returns
-------
pandas.core.frame.DataFrame | str | dict | list[dict]
Lista dos parlamentares de um partido durante um período.
"""
params = {"pagina": pagina, "ordem": "asc" if asc else "desc"}
if inicio is not None:
params["dataInicio"] = parse.data(inicio, "camara")
if fim is not None:
params["dataFim"] = parse.data(fim, "camara")
if legislatura is not None:
params["idLegislatura"] = legislatura
if itens is not None:
params["itens"] = itens
if ordenar_por is not None:
params["ordenarPor"] = ordenar_por
cols_to_rename = {
"id": "codigo",
"uri": "uri",
"nome": "nome",
"siglaPartido": "partido",
"uriPartido": "partido_uri",
"siglaUf": "uf",
"idLegislatura": "legislatura",
"urlFoto": "foto",
"email": "email",
}
return Get(
endpoint="camara",
path=["partidos", str(self.cod), "membros"],
params=params,
unpack_keys=["dados"],
cols_to_rename=cols_to_rename,
url_cols=["uri", "partido_uri", "foto", "email"],
remover_url=not url,
index=index,
verify=self.verify,
).get(formato)
[documentos]
@validate_call
def lista_partidos(
legislatura: Optional[PositiveInt] = None,
inicio: Optional[date] = None,
fim: Optional[date] = None,
pagina: PositiveInt = 1,
itens: Optional[PositiveInt] = None,
asc: bool = True,
ordenar_por: str = "sigla",
url: bool = True,
index: bool = False,
formato: Formato = "pandas",
verificar_certificado: bool = True,
) -> Output:
"""Os partidos políticos que têm ou já tiveram parlamentares em exercício
na Câmara.
Retorna uma lista de dados básicos sobre os partidos políticos que têm ou
já tiveram deputados na Câmara. Se não forem passados parâmetros, a função
retorna os partidos que têm deputados em exercício no momento da
requisição. É possível obter uma lista de partidos representados na Câmara
em um certo intervalo de datas ou de legislaturas.
Parameters
----------
legislatura : int, optional
Número da legislatura a qual os dados buscados devem corresponder.
inicio : str, optional
Data de início de um intervalo de tempo, no formato `'AAAA-MM-DD'`.
fim : str, optional
Data de término de um intervalo de tempo, no formato `'AAAA-MM-DD'`.
pagina : int, default=1
Número da página de resultados, a partir de 1, que se deseja
obter com a requisição, contendo o número de itens definido
pelo parâmetro `itens`. Se omitido, assume o valor 1.
itens : int, optional
Número máximo de itens na página que se deseja obter com esta
requisição.
asc : bool, default=True
Se os registros são ordenados no sentido ascendente:
- True: De A a Z ou 0 a 9 (ascendente);
- False: De Z a A ou 9 a 0 (descendente).
ordenar_por : str, default='sigla'
Qual dos elementos da representação deverá ser usado para aplicar
ordenação à lista.
url : bool, default=False
Se False, remove as colunas contendo URI, URL e e-mails.
Esse argumento é ignorado se `formato` for igual a 'json'.
index : bool, default=False
Se True, define a coluna `codigo` como index do DataFrame.
Esse argumento é ignorado se `formato` for igual a 'json'.
formato : {"json", "pandas", "url"}, default="pandas"
Formato do dado que será retornado:
- "json": Dicionário com as chaves e valores originais da API;
- "pandas": DataFrame formatado;
- "url": Endereço da API que retorna o arquivo JSON.
verificar_certificado : bool, default=True
Defina esse argumento como `False` em caso de falha na verificação do
certificado SSL.
Returns
-------
pandas.core.frame.DataFrame | str | dict | list[dict]
Os partidos políticos que têm ou já tiveram parlamentares em exercício
na Câmara.
"""
params = {
"pagina": pagina,
"ordem": "asc" if asc else "desc",
"ordenarPor": ordenar_por,
}
if legislatura is not None:
params["idLegislatura"] = legislatura
if inicio is not None:
params["dataInicio"] = parse.data(inicio, "camara")
if fim is not None:
params["dataFim"] = parse.data(fim, "camara")
if itens is not None:
params["itens"] = itens
cols_to_rename = {"id": "codigo", "sigla": "sigla", "nome": "nome", "uri": "uri"}
return Get(
endpoint="camara",
path=["partidos"],
params=params,
unpack_keys=["dados"],
cols_to_rename=cols_to_rename,
url_cols=["uri"],
remover_url=not url,
index=index,
verify=verificar_certificado,
).get(formato)