Código fonte para functions.luciano_vis

"""
Módulo para a criação da visualização do integrante Luciano Sampaio. 
Contém 6 funções incluindo aquela que gera e salva o gráfico.
"""

import sys, os
esse_caminho = os.path.dirname(os.path.abspath(__file__))
sys.path.append(esse_caminho)

import pandas as pd
import utils
import matplotlib.pyplot as plt
import doctest
from typing import Literal, Iterable, Optional
from numpy import datetime64


[documentos] def filtra_e_contatena(coluna_do_valor: str, valores_procurados: list | str) -> pd.DataFrame: ''' Usa as funções do módulo utils para concatenar todas as datas disponíveis e pegar apenas as linhas com os valores procurados Parâmetros: ------------ coluna_do_valor: Tipo: str Descrição: nome da coluna em que o valor procurado deve estar valores_procurados: Tipo: list | str Descrição: valor, caso string, ou valores, caso lista, que serão procurados na coluna Retorna: --------- dataframe: Tipo: pandas.DataFrame Descrição: dataframe pandas com os dados filtrados ''' dataframe = utils.concat_data_by_dates(f"2014/01", f"2014/12") dataframe = utils.filtra_dados_por_valores_procurados(dataframe, coluna_do_valor, valores_procurados) for year in range(2014, 2021+1): novo_dataframe = utils.concat_data_by_dates(f"{year}/01", f"{year}/12") novo_dataframe = utils.filtra_dados_por_valores_procurados(novo_dataframe, coluna_do_valor, valores_procurados) dataframe = pd.concat((dataframe, novo_dataframe)) return dataframe
[documentos] def cria_datetime(dataframe: pd.DataFrame) -> pd.Series: ''' Cria uma série do Pandas com datetimes relativos aos anos e meses das colunas "ANO_VENDA" e "MES_VENDA". Os dias no datetime serão todos o primeiro dia de cada mês. Parâmetros: ------------- dataframe: Tipo: pandas.DataFrame Descrição: o dataframe do Pandas com as colunas "ANO_VENDA" e "MES_VENDA". Retorna: --------- datetimes: Tipo: pandas.Series Descrição: série do Pandas com as datas em formato datetime. Exemplo: --------- >>> cria_datetime(pd.DataFrame({"ANO_VENDA": [2020, 2020, 2021], "MES_VENDA": [3, 3, 12]})) 0 2020-03-01 1 2020-03-01 2 2021-12-01 dtype: datetime64[ns] ''' datetimes = {"Year": dataframe["ANO_VENDA"], "Month": dataframe["MES_VENDA"], "Day": ["1"]*len(dataframe.index)} return pd.to_datetime(datetimes)
[documentos] def regiao_estado(sigla_estado: str) -> str: """ Retorna a região do estado brasileiro: Norte, Nordeste, Centro-Oeste, Sudeste ou Sul. Parâmetros ------------- sigla_estado: Tipo: str Descrição: Sigla do estado brasileiro Exemplo: "MG" Retorna: -------- regiao: Tipo: str | None Descrição: Região em que o estado brasileiro está. Se a sigla inserida for inexistente, retorna None. Exemplo: Sudeste Exemplos ---------- >>> regiao_estado("RR") 'Norte' >>> regiao_estado("BH") """ estados = { "AC": "Norte", "AP": "Norte", "AM": "Norte", "PA": "Norte", "RO": "Norte", "RR": "Norte", "TO": "Norte", "MA": "Nordeste", "PI": "Nordeste", "CE": "Nordeste", "RN": "Nordeste", "PB": "Nordeste", "PE": "Nordeste", "AL": "Nordeste", "SE": "Nordeste", "BA": "Nordeste", "GO": "Centro-Oeste", "MT": "Centro-Oeste", "MS": "Centro-Oeste", "DF": "Centro-Oeste", "SP": "Sudeste", "MG": "Sudeste", "RJ": "Sudeste", "ES": "Sudeste", "PR": "Sul", "SC": "Sul", "RS": "Sul" } try: regiao = estados[sigla_estado] except KeyError: return None return regiao
[documentos] def grafico_linhas(datas: Iterable[datetime64], valores: tuple[Iterable] | Iterable, labels: tuple[str] | str, titulo: str | None = None, transparencias: tuple[float] | float = 1.0): """ Prepara um gráfico de linhas com os dados fornecidos usando o matplotlib.pyplot Parâmetros ------------- datas: Tipo: Iterable[datetime] Descrição: Datas que serão usadas no eixo X. valores: Tipo: tuple[Iterable] | Iterable Descrição: Valores que serão plotados em relação ao eixo Y. Se há mais de uma linha, o parâmetro deve receber uma tupla com os dados de cada linha. labels: Tipo: tuple[str] | str Descrição: Legendas das linhas a serem plotadas. Se há mais de uma linha, esse parâmetro deve receber uma tupla. titulo: Tipo: str | None Descrição: Título do gráfico. transparencias: Tipo: tuple[float] | float Descrição: Transparências das linhas a serem geradas. Se há mais de uma linha, esse parâmetro deve receber uma tupla. Exemplo: --------- >>> datas = cria_datetime(pd.DataFrame({"ANO_VENDA": [2020, 2020, 2021], "MES_VENDA": [3, 3, 12]})) >>> grafico_linhas(datas, ([1, 3, 4], [2, 3, 1]), ("Primeira linha")) Traceback (most recent call last): ... ValueError: As quantidades de valores e labels são diferentes. """ if type(valores) != tuple: valores = tuple([valores]) if type(labels) != tuple: labels = tuple([labels]) if len(labels) != len(valores): raise ValueError("As quantidades de valores e labels são diferentes.") if type(transparencias) == float or type(transparencias) == int: transparencias = [transparencias]*len(valores) if len(transparencias) != len(valores): raise ValueError("Tuples of different sizes given.") for i in range(len(valores)): plt.plot(datas, valores[i], alpha = transparencias[i], label = labels[i]) plt.legend(loc='best') plt.suptitle(titulo)
[documentos] def contagem_elementos(dataframe: pd.DataFrame, elemento_contado: str, nome_da_serie: str) -> pd.Series: """ Retorna uma série do Pandas com as contagens dos elementos na ordem deles. Parâmetros ------------- dataframe: Tipo: pandas.DataFrame Descrição: DataFrame a ser modificado elemento_contado: Tipo: str Descrição: Nome da coluna em que o value_counts vai ser feito nome_da_serie: Tipo: str Descrição: nome da série a ser retornada Retorna -------- contagem: Tipo: pandas.Series Descrição: série do pandas com as informações feitas Exemplos -------- >>> contagem_elementos(pd.DataFrame({"NOME": ["A", "B", "B"]}), "NOME", "SERIE EXEMPLO") NOME A 1 B 2 Name: SERIE EXEMPLO, dtype: int64 """ dataframe = dataframe.copy() # Para não alterar o dataframe original dataframe.sort_values(elemento_contado) contagem = dataframe.value_counts(elemento_contado, sort=False).rename(nome_da_serie) return contagem
[documentos] def luciano_vis(acao: Literal["show", "save", None], path: str|None = None): """ Gera o gráfico escolhido por Luciano. Vai ser exibido ou salvo. Parâmetros: ------------ acao: Tipo: str | None Descrição: Ação a ser executada depois de formar o gráfico. Pode ser: "show": irá mostrar o gráfico e fechar a figura. "save": irá salvar o gráfico e fechar a figura. None: formará o gráfico, mas não o fechará. path: Tipo: str | None Descrição: path em que a figura será salva. É necessário caso o parâmetro acao seja "save". Exemplo: ----------- >>> luciano_vis(acao = "salvar") Traceback (most recent call last): ... ValueError: Ação 'salvar' inválida. Valores válidos: 'show', 'save', None """ if acao not in ["show", "save", None]: raise ValueError(f"Ação '{acao}' inválida. \nValores válidos: 'show', 'save', None") if acao == "save" and type(path) != str: raise ValueError(f"Especifique um caminho para salvar o arquivo.") principios_de_antidepressivos = ["SELEGILINA","SERTRALINA", "AMITRIPTILINA", "CITALOPRAM", "CLOMIPRAMINA", "IPRONIAZIDA", "MOCLOBEMIDA", "IMIPRAMINA", "TRIMIPRAMINA", "NORTRIPTILINA", "PROTRIPTILINA", "DOXEPINA", "AMOXAPINA", "DOTIEPINA", "OUDOSULEPINA", "FLUOXETINA", "FLUVOXAMINA", "PAROXETINA", "ESCITALOPRAM", "NORCITALOPRAM", "TIANEPTINA", "MIANSERINA", "DULOXETINA", "MIRTAZAPINA", "MAPROTILINA", "NEFAZODONA", "MILNACIPRANA", "TRAZODONA", "DESVENLAFAXINA", "VENLAFAXINA", "BUPROPIONA"] try: dataframe_antidepressivos = pd.read_csv("dados/Manipulados_ANTIDEPRESSIVOS.csv") except: dataframe_antidepressivos = filtra_e_contatena("PRINCIPIO_ATIVO", principios_de_antidepressivos) dataframe_antidepressivos.to_csv("dados/Manipulados_ANTIDEPRESSIVOS.csv", index=False) dataframe_antidepressivos["DATA"] = cria_datetime(dataframe_antidepressivos) dataframe_antidepressivos["REGIAO"] = dataframe_antidepressivos["UF_VENDA"].apply(regiao_estado) antidepressivos_norte = utils.filtra_dados_por_valores_procurados(dataframe_antidepressivos, "REGIAO", "Norte") antidepressivos_nordeste = utils.filtra_dados_por_valores_procurados(dataframe_antidepressivos, "REGIAO", "Nordeste") antidepressivos_centroeste = utils.filtra_dados_por_valores_procurados(dataframe_antidepressivos, "REGIAO", "Centro-Oeste") antidepressivos_sudeste = utils.filtra_dados_por_valores_procurados(dataframe_antidepressivos, "REGIAO", "Sudeste") antidepressivos_sul = utils.filtra_dados_por_valores_procurados(dataframe_antidepressivos, "REGIAO", "Sul") contagem_norte = contagem_elementos(antidepressivos_norte, "DATA", "NORTE") contagem_nordeste = contagem_elementos(antidepressivos_nordeste, "DATA", "NORDESTE") contagem_centroeste = contagem_elementos(antidepressivos_centroeste, "DATA", "CENTRO-OESTE") contagem_sudeste = contagem_elementos(antidepressivos_sudeste, "DATA", "SUDESTE") contagem_sul = contagem_elementos(antidepressivos_sul, "DATA", "SUL") contagem = pd.concat([contagem_norte, contagem_nordeste, contagem_centroeste, contagem_sudeste, contagem_sul], axis=1) contagem.fillna(0, inplace=True) grafico_linhas(contagem.index, (contagem["NORTE"], contagem["NORDESTE"], contagem["CENTRO-OESTE"], contagem["SUDESTE"], contagem["SUL"]), tuple(contagem.columns), titulo = "ANTIDEPRESSIVOS POR REGIÃO") if acao == "show": plt.show() plt.close() elif acao == "save": plt.savefig(path) plt.close()
if __name__ == "__main__": luciano_vis("show") doctest.testmod(verbose=True)