コード例 #1
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
コード例 #2
0
    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
コード例 #3
0
    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
コード例 #4
0
    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
コード例 #5
0
    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
コード例 #6
0
    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
コード例 #7
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
コード例 #8
0
    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
コード例 #9
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
コード例 #10
0
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
コード例 #11
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
コード例 #12
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
コード例 #13
0
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
コード例 #14
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