"""Este módulo contém funções úteis para a manipulação da base de dados utilizando-se de datas,
utilizada na visualização de alguns membros, além da filtragem dos dados.
"""
import sys, os
esse_caminho = os.path.dirname(os.path.abspath(__file__))
sys.path.append(esse_caminho)
from get_data import get_dates_between_dates
import pandas as pd
import doctest
[documentos]
def concat_data_by_dates(start_date: str, end_date: str, path="dados", file_names="Manipulados", filtered_columns=None) -> pd.DataFrame:
"""
Concatena todos os dados de CSVs de dados entre as datas dadas e retorna um dataframe Pandas
O formato do nome dos arquivos devem ser 'nomedabase_ano_mes.csv'
Parameters
----------
start_date
type: str
description: inicio da range de datas
example: "2014-01"
end_date
type: str
description: final da range de datas
example: "2021-11"
path
type: str
description: caminho da pasta com os arquivos
example: "dados/"
file_names
type: str
description: nome padrão de salvamento dos arquivos
example: "file_names_ANO_mês.csv"
filtered_columns
type: list, optional
description: colunas a serem filtradas se necessário da base de dados, caso não sejam válidas então todo o datafram é retornado
example: "["coluna_1"]"
Return
----------
dataset
type: pandas.Dataframe
description: dataframe com todos os dados concatenados, caso as colunas de filtro sejam válidas, retorna o dataset com apenas elas como colunas.
Test
----------
>>> type(concat_data_by_dates("2014/01", "2014/01"))
<class 'pandas.core.frame.DataFrame'>
>>> len(concat_data_by_dates("2021/01", "2021/02", filtered_columns=["ANO_VENDA"]).columns)
1
>>> type(concat_data_by_dates("2021/01", "2021/01", filtered_columns=3))
As colunas filtradas devem ser uma lista de strings das colunas do dataframe, tente inserir novamente.
<class 'pandas.core.frame.DataFrame'>
>>> type(concat_data_by_dates("2021/01", "2021/01", filtered_columns=["cachorro_mal"]))
Uma ou mais colunas do filtro não estão nas colunas do dataframe, tente verificar as colunas do filtro.
<class 'pandas.core.frame.DataFrame'>
"""
try:
# Valida as datas da concatenação.
dates = get_dates_between_dates(start_date, end_date)
if dates == []:
raise ValueError
except ValueError:
pass
else:
first_date = dates[0]
try:
dataset = pd.read_csv(f"{path}/{file_names}_{first_date[:4]}_{first_date[-2:]}.csv",
delimiter=";", low_memory=False)
except Exception as err:
print("Erro na leitura do arquivo:", err)
return None
# Verifica se o filtro é valido.
else:
if filtered_columns != None:
try:
if type(filtered_columns) != list:
raise TypeError
for each_column in filtered_columns:
if each_column not in dataset.columns:
raise NameError
except TypeError:
print("As colunas filtradas devem ser uma lista de strings das colunas do dataframe, tente inserir novamente.")
except NameError:
print("Uma ou mais colunas do filtro não estão nas colunas do dataframe, tente verificar as colunas do filtro.")
else:
dataset = dataset[filtered_columns]
if len(dates) > 1:
for index in range(1, len(dates)):
date_year, date_month = dates[index][:4], dates[index][-2:]
try:
new_dataset = pd.read_csv(f"{path}/{file_names}_{date_year[:4]}_{date_month[-2:]}.csv",
delimiter=";", low_memory=False)
except Exception as err:
print(f"Não foi possível converter '{path}/{file_names}_{date_year[:4]}_{date_month[-2:]}.csv' em dataframe")
print(err)
continue
new_dataset = new_dataset[dataset.columns]
dataset = pd.concat([dataset, new_dataset])
return dataset
[documentos]
def filtra_dados_por_valores_procurados(dados: pd.DataFrame, coluna_do_valor: str, valores_procurados: list or str) -> pd.DataFrame:
"""
Modifica e retorna o dataframe com apenas as linhas que possuem o valor procurado na coluna especificada.
Parameters
----------
dados
type: pandas.Dataframe
description: dataframe a ser modificado
coluna_do_valor
type: str
description: nome da coluna em que o valor deve estar
valores_procurados
type: list or str
description: valores que vão ser procurados na coluna e mantidos
example: ["CLOROQUINA", "DISFOSFATO DE CLOROQUINA"]
Return
----------
dados
type: pandas.Dataframe
description: dataframe com apenas as linhas que contém o valor desejado
Test
----------
>>> dados = pd.DataFrame({"PINCIPIO_ATIVO": ["CLOROQUINA", "DIFOSFATO DE CLOROQUINA", "HIDROXICLOROQUINA", "IBUPROFENO"], "Qnt": [10, 5, 8, 15]})
>>> filtra_dados_por_valores_procurados(dados, "PINCIPIO_ATIVO", "CLOROQUINA")["Qnt"][0]
10
>>> filtra_dados_por_valores_procurados(dados, "PINCIPIO_ATIVO", ["CLOROQUINA", "HIDROXICLOROQUINA"])["Qnt"]
0 10
2 8
Name: Qnt, dtype: int64
>>> filtra_dados_por_valores_procurados(42, "PINCIPIO_ATIVO", "CLOROQUINA")
DataFrame inválido, tente inserir outro DataFrame.
>>> filtra_dados_por_valores_procurados(dados, 66, "CLOROQUINA")
Tente inserir um nome de coluna válido como string.
>>> filtra_dados_por_valores_procurados(dados, "COLUNA_INVÁLIDA", "CLOROQUINA")
Coluna selecionada inválida, tente inserir o nome de uma coluna do DataFrame.
"""
# Chega se o data frame é válido.
try:
if type(dados) != pd.DataFrame:
raise TypeError
except TypeError:
print("DataFrame inválido, tente inserir outro DataFrame.")
else:
# Checa se a coluna é válida.
try:
if type(coluna_do_valor) != str:
raise TypeError
elif coluna_do_valor not in dados.columns:
raise ValueError
except TypeError:
print("Tente inserir um nome de coluna válido como string.")
except ValueError:
print("Coluna selecionada inválida, tente inserir o nome de uma coluna do DataFrame.")
else:
if type(valores_procurados) == list:
dados = dados[dados[coluna_do_valor].isin(valores_procurados)]
else:
dados = dados[dados[coluna_do_valor] == valores_procurados]
return dados
[documentos]
def set_anabolizantes(dataframe_bruto:pd.DataFrame) -> pd.DataFrame:
"""
A função tem como objetivo receber um dataframe bruto e realizar a filtragem dos dados
retornando apenas os registros referentes a medicamentos anabolizantes e esteróides.
Parameters
----------
dataframe_bruto
type: pd.DataFrame
description: dataframe completo e referente a todos os medicamentos
Return
----------
dataframe_final
type: pd.DataFrame
description: dataframe filtrado apenas com os medicamentos anabolizantes
Test
----------
>>> type(set_anabolizantes(dataframe_geral))
<class 'pandas.core.frame.DataFrame'>
>>> dataframe_vazio = pd.DataFrame()
>>> set_anabolizantes(dataframe_vazio)
Esse dataframe está no formato incorreto, ele não possui a coluna 'PRINCIPIO_ATIVO'.
>>> set_anabolizantes("Matheus")
Algo deu errado. Verifique a documentação da função e tente novamente.
"""
lista_de_anabolizantes = ["TESTOSTERONA",
"ESTANOZOLOL",
"NANDROLONA"]
try:
#filtragem do dataframe
df_testosterona = dataframe_bruto[dataframe_bruto["PRINCIPIO_ATIVO"] == lista_de_anabolizantes[0]].reset_index(drop=True)
df_estanozolol = dataframe_bruto[dataframe_bruto["PRINCIPIO_ATIVO"] == lista_de_anabolizantes[1]].reset_index(drop=True)
df_nandrolona = dataframe_bruto[dataframe_bruto["PRINCIPIO_ATIVO"] == lista_de_anabolizantes[2]].reset_index(drop=True)
#concatenação do dataframe
dataframe_final = pd.concat((df_testosterona, df_estanozolol, df_nandrolona)).reset_index(drop=True)
except KeyError:
print("Esse dataframe está no formato incorreto, ele não possui a coluna 'PRINCIPIO_ATIVO'.")
dataframe_final = None
except:
print("Algo deu errado. Verifique a documentação da função e tente novamente.")
dataframe_final = None
return dataframe_final
if __name__ == "__main__":
#dataframes para testes
# df_01 = pd.read_csv("dados\Manipulados_2014_01.csv", delimiter=";", encoding="unicode_escape", low_memory=False)
# df_02 = pd.read_csv("dados\Manipulados_2014_02.csv", delimiter=";", encoding="unicode_escape", low_memory=False)
# df_03 = pd.read_csv("dados\Manipulados_2014_03.csv", delimiter=";", encoding="unicode_escape", low_memory=False)
# dataframe_geral = pd.concat((df_01, df_02, df_03))
dataframe_geral = concat_data_by_dates("2014/01", "2014/03", filtered_columns=["PRINCIPIO_ATIVO"])
# print(dataframe_geral["MES_VENDA"].unique())
# print(concat_data_by_dates("2021/01", "2021/02", filtered_columns=["ANO_VENDA"]))
doctest.testmod(verbose=True)