示例#1
0
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
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#5
0
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
示例#6
0
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
示例#7
0
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
示例#8
0
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
示例#9
0
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
示例#10
0
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