def dateMenu(dataframe): 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 while (True): displayMenu() command = testValidInput(1, 4) if command == 1: analysis.dateAnalysis("Specific Number", dataframe) elif command == 2: analysis.dateAnalysis("Most Recent", dataframe) elif command == 3: analysis.dateAnalysis("Oldest", dataframe) elif command == 4: break
def combinationsMenu(): # Função que exibe o menu principal 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 while (True): displayMenu() command = testValidInput(1, 3) if command == 1: combinations.randomComb() elif command == 2: combinations.userDefComb() elif command == 3: break
def recurrencyMenu(dataframe): 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 while (True): displayMenu() command = testValidInput(1, 4) if command == 1: analysis.findRecurrency('mais frequentes', dataframe) elif command == 2: analysis.findRecurrency('menos frequentes', dataframe) elif command == 3: analysis.findRecurrency('Specific Number', dataframe) elif command == 4: break
def mainInterface(): # Função que exibe o menu principal 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 while (True): displayMenu() command = testValidInput(1, 4) if command == 1: analysisMenu() # Vamos para o menu de análises elif command == 2: get_files.obtainData() # Baixamos os dados mais recentes elif command == 3: combinationsMenu() # Vamos para o menu de combinações elif command == 4: break return
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 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 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 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 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