def randomComb(): numErrMes = "\nNúmero inválido, tente novamente\n" # Mensagem de erro especial para número inválido while (True): displayHeader() print( "Digite quantos números aleatórios você quer na combinação (máximo 20)" ) # Testamos se o número da entrada é válido totComb = testValidInput(1, 20, numErrMes) # Se a entrada é válida if totComb: break randNums = generateRandomNumbers(totComb) # Gereamos os números aleatórios # Exibimos ao usuários os números gerados displayHeader() print("Os números aleatórios gerados foram:\n") print(randNums) print("\nPressione enter para continuar") input() return
def displayMenu(): displayHeader() # Mostramos o cabeçalho print("(1) - Combinações aleatórias") print("(2) - Combinações com números específicos") print("(3) - Voltar ") return
def displayMenu(): displayHeader() # Exibimos o cabeçalho print("(1) - Análisar a recorrência dos números") print("(2) - Relacionar ocorrências com datas") print("(3) - Voltar") return
def displayMenu(): displayHeader() # Exibimos o cabeçalho print("(1) - Análise de data - ocorrências para um número especifico") print("(2) - Ordenar os números pela última vez em que eles ocorreram") print( "(3) - Ordenar os números pela primeira vez em que eles ocorreram") print("(4) - Voltar") return
def displayMenu(): displayHeader() # Exibimos o cabeçalho print("Selecione o intervalo de tempo dos dados a serem analisados") print("De hoje até 'X' meses/anos atrás") print("(1) - Selecionar a data em meses") print("(2) - Selecionar a data em anos") print("(3) - Voltar") return
def displayMenu(): displayHeader() # Mostramos o cabeçalho print("Bem vindo ao analisador de jogos da Mega Sena!") print( "Para acessar a funcionalidade desejada, digite o número da opção e confirme com a tecla 'enter'\n" ) print("(1) - Análisar resultados") print("(2) - Atualizar banco de dados") print("(3) - Gerar combinações") print("(4) - Sair") return
def selectDateInterval(): def displayMenu(): displayHeader() # Exibimos o cabeçalho print("Selecione o intervalo de tempo dos dados a serem analisados") print("De hoje até 'X' meses/anos atrás") print("(1) - Selecionar a data em meses") print("(2) - Selecionar a data em anos") print("(3) - Voltar") return multiplicador = 1 # Variável que ajusta o intervalo de tempo para meses ou anos while (True): displayMenu() command = testValidInput(1, 2) if command == 1: multiplicador = 1 tipoIntervalo = 'meses' break elif command == 2: multiplicador = 12 tipoIntervalo = 'anos' break while (True): displayHeader() print( f"Selecione de hoje até quantos {tipoIntervalo} atrás devem ser os dados a serem analisados:" ) print( "Se deseja analisar os dados desde o começo digite um número negativo" ) valor = input() # Recebemos o comando do cmd # Testamos se o valor colocado é válido, ignorando o possível sinal negativo '-' if (valor.strip('-')).isnumeric(): # Retornamos o tamanho do intervalo, aplicado a conversão se necessário return int(valor) * multiplicador else: print("\nComando inválido, Tente novamente\n") sleep(1.5) # Aguardamos 3 segundos para que o texto possa ser lido
def displayMenu(): displayHeader() # Exibimos o cabeçalho print( "(1) - Exibir os números sorteados por ordem decrescente de vezes sorteadas" ) print( "(2) - Exibir os números sorteados por ordem crescente de vezes sorteadas" ) print("(3) - Ver a recorrência de um número específico") print("(4) - Voltar") return
def analysisMenu(): def displayMenu(): displayHeader() # Exibimos o cabeçalho print("(1) - Análisar a recorrência dos números") print("(2) - Relacionar ocorrências com datas") print("(3) - Voltar") return get_files.should_update() # Selecionamos o intervalo dos dados a serem considerados intervaloDatas = selectDateInterval() displayHeader() print("O programa está carregando a base de dados, por favor aguarde") # Criamos o dataframe através dos dados baixados dataframe = webscrap.extractData() # Se desejamos escolher um intervalo específico de tempo dos dados if intervaloDatas > 0: dataframe = analysis.selectDateInterval(dataframe, intervaloDatas) while (True): displayMenu() command = testValidInput(1, 3) if command == 1: recurrencyMenu(dataframe) elif command == 2: dateMenu(dataframe) elif command == 3: break return
def obtainData(): databasePath = rootDir.joinpath('D_megase.zip') # Endereço do arquivo compactado com os dados url = "http://www1.caixa.gov.br/loterias/_arquivos/loterias/D_megase.zip" displayHeader() # Exibimos o cabeçalho print("O programa está atualizando a base de dados, por favor aguarde") try: response = requests.get(url) # Objeto obtido do request except Exception as erro: print("\nHouve um problema na execução da atualização, o seguinte erro foi relatado:\n", erro) else: with open(databasePath, "wb") as dataZipped: try: # Baixamos o zip na pasta files dataZipped.write(response.content) # Descompactamos os dados zipObj = ZipFile(databasePath, 'r') zipObj.extract('d_mega.htm', 'files') # Limpamos o diretório dos arquivos desnecessários os.remove(databasePath) print("\nO banco de dados foi atualizado com sucesso\n") except Exception as erro: print("\nHouve um problema na execução da atualização, o seguinte erro foi relatado:\n", erro) print("Pressione enter para continuar\n") input() return
def findRecurrency(option, dataframe): # Selecionamos apenas as colunas que indicam os números sorteados dataframe = dataframe.iloc[:, 2:] # Series que armazenará o total de ocorrências de cada número ocurr = pd.Series([]) for (_, data) in dataframe.iteritems( ): # Iteramos pelo data frame coluna a coluna # Contamos as ocorrências de cada número na coluna temp = (data.value_counts()).sort_index() # Somamos as ocorrências da coluna com as ocorrências das colunas anteriores ocurr = ocurr.add(temp, fill_value=0) tot = int(ocurr.sum()) # Soma de todas as ocorrências de cada número # Dataframe que guardará as informações de ocorrência de cada número dfOcorr = pd.DataFrame([]) # Criamos a coluna das ocorrências dfOcorr['Número de Ocorrências'] = ocurr # Lambda usado para calcular a porcentagem def percentage(x): return (x / tot) * 100 # Criamos a coluna das porcentagens dfOcorr['% Total'] = ocurr.apply(percentage) index = dfOcorr.index # Obtemos os indíces do dataframe if option == 'Specific Number': while (True): displayHeader() print("Qual o número para pesquisar sua ocorrência?\n") # Testamos se a entrada é um dos números presentes na cartela da megasena numEsc = testValidInput(1, 60) if numEsc: # Se o valor recebido é um número válido # Selecionamos o número desejado no dataframe considerando a indexação começando no 0 df_temp = dfOcorr.loc[index == numEsc] # Se o dataframe está vazio if df_temp.empty: print(f"\nO número {numEsc} não foi sorteado nenhuma vez") else: # Obtemos o total de ocorrências do número desejado ocorr = df_temp.iloc[0, 0] print( f"\nO número {numEsc} foi sorteado {int(ocorr)} vezes") print("\nPressione enter para continuar\n") input() break else: displayHeader() # Mostramos o cabeçalho if option == 'mais frequentes': # Ordenamos o dataframe em ordem decrescente dfOcorr.sort_values('% Total', inplace=True, ascending=False) elif option == 'menos frequentes': # Ordenamos o dataframe em ordem crescente dfOcorr.sort_values('% Total', inplace=True, ascending=True) # Exibimos os 6 números mais/menos recorrentes print(f"Os números {option} são:\n") for num, ocorr in (dfOcorr.iloc[:, 0]).items(): print(f"{num} - sorteado {int(ocorr)} vezes\n") print("Pressione enter para continuar\n") input() return
def dateAnalysis(option, dataframe): class ocurrDates(): def __init__(self, number, newDate, oldDate): self.number = number self.newestDate = newDate self.oldestDate = oldDate def returnDates(self): return self.newestDate, self.oldestDate # Selecionamos apenas as colunas que indicam a data dos sorteios e os números sorteados dataframe = dataframe.iloc[:, 1:8] if option == 'Specific Number': while (True): displayHeader() print( "Qual o número para relacionar suas ocorrências com datas?\n") # Testamos se a entrada é um dos números presentes na cartela da megasena numEsc = testValidInput(1, 60) if numEsc: # Se o valor recebido é um número válido # Obtemos a data da ocorrência mais antiga do número selecionado newDate, oldDate = findDateOcurr(numEsc, dataframe) # Se o dataframe está vazio if oldDate == None: print( f"\nO número {numEsc} não foi sorteado nenhuma vez no período de tempo selecionado" ) else: oldDate = oldDate.strftime( "%d/%m/%Y") # Convertemos a data para o formato string print( f"\nA primeira vez em que o número {numEsc} foi sorteado foi em {oldDate}" ) newDate = newDate.strftime( "%d/%m/%Y") # Convertemos a data para o formato string print( f"\nA última vez em que o número {numEsc} foi sorteado foi em {newDate}" ) break else: listDate = [] # Lista que armazena as datas das ocorrências # Para cada um dos possíveis números for number in itertools.count(1): # Condição de saída do loop if number > 60: break # Obtemos as datas das ocorrências mais recente e mais nova do número atual dataNov, dataAnt = findDateOcurr(number, dataframe) # Se houve ocorrência do número if dataNov != None: numDates = ocurrDates( number, dataNov, dataAnt) # Instanciamos um objeto para guardar as datas listDate.append(numDates) # Salvamos o objeto na lista displayHeader() if (option == "Most Recent"): listDate.sort( key=lambda x: x.newestDate, reverse=False) # Ordenamos a lista pela data mais recente print( "\nOrdenando os números pela última vez em que eles foram sorteados\n" ) for date in listDate: if date.newestDate == None: print(f"{date.number} não foi sorteado nenhuma vez") else: newDate = date.newestDate.strftime( "%d/%m/%Y") # Convertemos a data para o formato string print(f"{date.number} - {newDate}") else: listDate.sort( key=lambda x: x.oldestDate, reverse=False) # Ordenamos a lista pela data mais antiga print( "\nOrdenando os números pela primeira vez em que eles foram sorteados\n" ) for date in listDate: if date.oldestDate == None: print(f"{date.number} não foi sorteado nenhuma vez") else: oldDate = date.oldestDate.strftime( "%d/%m/%Y") # Convertemos a data para o formato string print(f"{date.number} - {oldDate}") print("\nPressione enter para continuar\n") input() return
def should_update(): today = datetime.date.today() # Obtemos a data de hoje # Localização do arquivo que registra quando ocorreu a última atualização lastupdatePath = filesDir.joinpath('lastupdate.txt') displayHeader() # Exibimos o cabeçalho try: with open(lastupdatePath, 'r+') as file: dataUpdate = file.read() # Obtemos do arquivo txt a data da última atualização # Convertemos a data em string para datetime dataUpdate = datetime.datetime.strptime( dataUpdate, "%d/%m/%Y,").date() # Calculamos a diferença de tempo da última atualização para o dia atual daysSinceUpdate = (today - dataUpdate).days if daysSinceUpdate > 7: # Testamos se a última atualização foi a mais de 7 dias while(True): try: displayHeader() # Exibimos o cabeçalho print( f"O banco de dados foi atualizado pela última vez há {daysSinceUpdate} dias") print("Gostaria de atualiza-lo?") print('(1) - Sim\n(2) - Não') command = input() assert((command == '1') or (command == '2')) except: print('Comando inválido, tente novamente') sleep(1.5) else: break if command == '1': # Caso queiramos atualizar obtainData() # Atualizamos o banco de dados # Convertemos a data para o formato de string today = today.strftime("%d/%m/%Y,") file.seek(0) file.truncate(0) # Apagamos o conteúdo do arquivo # Salvamos em um arquivo txt a data atual como a data da última atualiza file.write(today) print("Pressione enter para continuar\n") input() except IOError as erro: # Caso no qual não há arquivo com a data da última atualização print('\nNão foi possível determinar a data da última atualização') print('O programa vai atualizar o banco de dados agora') print("Pressione enter para continuar\n") input() try: with open(lastupdatePath, 'w') as file: # Convertemos para string a data do dia atual temp = today.strftime("%d/%m/%Y,") # Salvamos em um arquivo txt a data atual como a data da última atualização file.write(temp) except Exception as erro: print('Ocorreu um erro ao salvar a data de atualização') print(f'Erro: {erro}') print('Prosseguindo para o programa') obtainData() # Atualizamos o banco de dados except Exception as erro: print('Ocorreu um erro no processo de verificação da atualização') print(f'Erro: {erro}') print('Prosseguindo para o programa') return
def userDefComb(): numErrMes = "\nNúmero inválido, tente novamente\n" # Mensagem de erro especial para número inválido while (True): displayHeader() print("Digite quantos números você quer na combinação (máximo 20)") # Recebemos com quantos números desejamos realizar a combinação totNums = testValidInput(1, 20, numErrMes) # Se a entrada é válida if totNums: break # Recebemos os números com os quais se deseja fazer as combinações vetNums = [] # Vetor que salva os números que serão usados nas combinações i = 0 # Contador while (totNums > i): displayHeader() print("Entre com os números que deseja usar nas combinações:") # Recebemos o número para fazer a combinação num = testValidInput(0, 60, numErrMes) # Se a entrada é válida if num: if num not in vetNums: vetNums.append(num) # Salvamos o número no vetor i += 1 # Incrementamos o contador else: print( "O número já foi selecionado anteriormente, tente outro valor" ) print("Pressione enter para continuar") input() while (True): displayHeader() print( "Digite de quanto a quanto você deseja fazer a combinação, um por vez: " ) # Testamos se o número da entrada é válido parComb = testValidInput(1, totNums, numErrMes) # Se a entrada é válida if (parComb): break # Obtemos as combinações combs = list(combinations(vetNums, parComb)) # Printamos as combinações geradas print("\nAs combinações com os números selecionados são as seguintes:\n") for comb in combs: print(comb) print("\nPressione enter para continuar") input() return