Example #1
0
class ConvertModel:

    def __init__(self, worker, initial_table=True, last_draw=None, limit=0):

        # class initialize
        self.worker = worker
        self.table_name = self.worker.table_name
        self.game_name = self.worker.window.line_current_game.text()

        if initial_table:

            self.ldb = self.worker.window.ldb

            self.curr_game = self.ldb.fetchone(LottoGame, {'name': self.game_name})
            self.input_table = 'INPUT_' + self.curr_game.input_table

            # features
            table_headers = {'__tablename__': self.table_name,
                             'id': Column('id', Integer, primary_key=True),
                             'DRAFT_ID': Column('DRAFT_ID', Integer)}

            for feature in self.curr_game.model_features:
                match_items = self.worker.window.list_model.findItems(feature.name, Qt.MatchExactly)
                if len(match_items) > 0:
                    feature_len = feature.length + 1
                    feature_header = feature.header
                    for n in range(1, feature_len):
                        table_headers[feature_header + str(n)] = Column(feature_header + str(n), Integer)

            table_headers['LABEL'] = Column('LABEL', Integer)

            self.ldb.delete_table(self.table_name)
            self.ldb.delete_model_by_table_name(self.table_name)
            self.ldb.create_class_model(self.curr_game.training_model, table_headers)
            self.ldb.meta_create_all()
            self.input_record_count = self.ldb.get_table_length(DYNAMIC_CLASS[self.curr_game.input_model]) + 1 - limit

            # variables
            if last_draw is None:
                self.last_draw = [13, 18, 29, 32, 37]
            else:
                self.last_draw = last_draw

            self.total_game_numbers = self.curr_game.total_numbers + 1
            self.training_size_limit = int(self.worker.window.combo_test_size.currentText())
            self.single_draw_len = self.curr_game.length + 1

            self.labels = [0, 12, 34, 56]
            self.win = {'LABEL': 1}
            self.loss = {'LABEL': 0}

            self.rash_one = 5
            self.rash_two = 5
            self.rash_three = 5
            self.rash_default = 5

    @staticmethod
    def __append_drawn(current_array, set_of_six):
        new_drawn = []
        for drawn in set_of_six:
            index = drawn - 1
            new_drawn.append(current_array[index])

        return new_drawn

    def __append_rash_group(self, sample):
        new_set = []
        for num in sample:
            if num in self.curr_game['groups']['first_group']:
                new_set += [1]
            elif num in self.curr_game['groups']['second_group']:
                new_set += [2]
            elif num in self.curr_game['groups']['third_group']:
                new_set += [3]

        return new_set

    def __append_alpha_group(self, sample):
        alpha_group = []
        for n in sample:
            for g in self.curr_game['alphabetic_groups'].items():
                if n in g[1]:
                    alpha_group += [1]
                else:
                    alpha_group += [0]

        return alpha_group

    def __map_last_draw(self, curr_draw):
        return {'IN_LAST_' + str(n): i for n, i in zip(range(1, self.single_draw_len), curr_draw)}

    def __append_in_last_draw(self, sample, curr_draw):
        if curr_draw.count(0) == 0:
            last_draw = [0 for _ in range(1, self.total_game_numbers)]
        else:
            last_draw = [1 if n in sample else 0 for n in range(1, self.total_game_numbers)]

        return last_draw

    def __append_numbers_cycle(self, sample, curr_cycle):
        if sum(map((0).__eq__, curr_cycle.values())) == 0:
            numbers_cycle = {'CYCLE_' + str(n): 0 for n in range(1, self.total_game_numbers)}
        else:
            numbers_cycle = {'CYCLE_' + str(n): 1 if n in sample else curr_cycle['CYCLE_' + str(n)]
                             for n in range(1, self.total_game_numbers)}
        return numbers_cycle

    def append_hot_cold_warm_cool(self, top_numbers, n_top, large_small):
        if large_small == 'L':
            hw = nlargest(n_top, top_numbers, key=top_numbers.get)
            hc_wc = [1 if str(n) in hw else 0 for n in range(1, self.total_game_numbers)]
        else:
            cc = nsmallest(n_top, top_numbers, key=top_numbers.get)
            hc_wc = [1 if str(n) in cc else 0 for n in range(1, self.total_game_numbers)]

        return hc_wc

    @staticmethod
    def __append_count_label(sample, count_list):
        label = 0
        count = Counter(sample)
        for x in count_list:
            label = label + count[x]
        return label

    def __map_number_map(self, sample):
        return {'MAP_' + str(n): 1 if n in sample else 0 for n in range(1, self.total_game_numbers)}

    def __map_original_numbers(self, sample):
        return {'ORIGINAL_' + str(n): i for n, i in zip(range(1, self.single_draw_len), sample)}

    def __append_rash(self, array):
        rash_group = []
        for num in array:
            if num in self.curr_game['groups']['first_group']:
                data = 1  # first_data_group.get(num)
                if data is None:
                    per = round(float(1 / self.rash_one) * 100, 2)
                else:
                    per = round(float(data / self.rash_one) * 100, 2)
                rash_group.append(per)

            elif num in self.curr_game['groups']['second_group']:
                data = 1  # second_data_group.get(num)
                if data is None:
                    per = round(float(1 / self.rash_two) * 100, 2)
                else:
                    per = round(float(data / self.rash_two) * 100, 2)
                rash_group.append(per)

            elif num in self.curr_game['groups']['third_group']:
                data = 1  # third_data_group.get(num)
                if data is None:
                    per = round(float(1 / self.rash_three) * 100, 2)
                else:
                    per = round(float(data / self.rash_three) * 100, 2)
                rash_group.append(per)

        return rash_group

    def __append_db(self, params):
        self.ldb.add_record(DYNAMIC_CLASS[self.curr_game.training_model], params)

    def create_prediction_model(self, input_array):

        self.ldb.create_new_session()
        list_model = self.worker.window.list_model

        my_list = list(map(int, input_array.split(" ")))
        my_list = self.__add_random(my_list)

        ids = 1
        combined_set = []
        top_numbers = self.__create_top_numbers(self.input_record_count - 100)
        number_cycles = self.__get_latest_number_cycle()
        curr_draw = self.__get_latest_draw()
        total_combinations = int(math.factorial(42)/(math.factorial(5)*(math.factorial(42-5))))

        for a in my_list:
            # if 1 <= a <= 11:
            for b in my_list:
                if a < b:  # and 5 <= b <= 23:
                    for c in my_list:
                        if b < c:  # and 11 <= c <= 33:
                            for d in my_list:
                                if c < d:  # and 20 <= d <= 40:
                                    for e in my_list:
                                        # diff = e-a
                                        # sample_sum = a+b+c+d+e
                                        if d < e:  # and 29 <= e <= 42: # and 17 < diff < 40 and 69 < sample_sum < 151:
                                            # for f in my_list:
                                            #     if e < f:

                                            sample_array = [a, b, c, d, e]

                                            for i in range(self.worker.window.list_model.count()):

                                                if list_model.item(i).text() == 'number_map':
                                                    combined_set += self.__map_number_map(sample_array)

                                                elif list_model.item(i).text() == 'number_cycles':
                                                    combined_set += self.__append_numbers_cycle(sample_array,
                                                                                                number_cycles)

                                                elif list_model.item(i).text() == 'original_numbers':
                                                    combined_set += sample_array

                                                elif list_model.item(i).text() == 'in_last_draw':
                                                    combined_set += curr_draw

                                                elif list_model.item(i).text() == 'rash_group':
                                                    combined_set += self.__append_rash_group(sample_array)

                                                elif list_model.item(i).text() == 'alphabetic_group':
                                                    combined_set += self.__append_alpha_group(sample_array)

                                                elif list_model.item(i).text() == 'hot numbers':
                                                    combined_set += self.append_hot_cold_warm_cool(
                                                        top_numbers, 10, 'L')

                                                elif list_model.item(i).text() == 'cold numbers':
                                                    combined_set += self.append_hot_cold_warm_cool(
                                                        top_numbers, 10, 'S')

                                                elif list_model.item(i).text() == 'warm numbers':
                                                    combined_set += self.append_hot_cold_warm_cool(
                                                        top_numbers, 20, 'L')

                                                elif list_model.item(i).text() == 'cool numbers':
                                                    combined_set += self.append_hot_cold_warm_cool(
                                                        top_numbers, 20, 'S')

                                            label = [self.__append_count_label(sample_array,
                                                                               self.last_draw)]

                                            self.__append_db(ids, [0], combined_set, label)

                                            combined_set = []

                                            self.worker.signal_progress_bar.emit((ids/total_combinations)*100)

                                            ids += 1

        self.worker.signal_progress_bar.emit(0)
        self.ldb.db_commit()

    def convert_to_original(self):

        self.ldb = LotteryDatabase()
        combo_predict = self.worker.window.combo_predict_model
        self.table_name = 'PREDICT_' + combo_predict.currentText()

        now = datetime.datetime.now()
        file_name = str.format('{} {}', combo_predict.currentText(), now.strftime("%Y-%m-%d %H %M %S"))
        export_columns = ['FIRST', 'SECOND', 'THIRD', 'FOURTH', 'FIFTH', 'SIXTH', 'LABEL', 'OUTPUT']

        with open('archived/' + file_name + '.csv', 'a', newline='') as csv_file:

            writer = csv.writer(csv_file)
            writer.writerow(export_columns)

            for o in range(1, self.input_record_count):
                fetch_one = list(self.ldb.fetchone(self.table_name, o))
                fetch_output = list(self.ldb.fetchone('OUTPUT_prediction', o))

                originals = fetch_one[1:50]
                label_column = [fetch_one[-1]]
                output_column = [fetch_output[-1]]

                output_list = [n + 1 for n in range(0, len(originals)) if originals[n] == 1]
                output_list = output_list + label_column + output_column

                writer.writerow(output_list)

                self.worker.signal_status.emit('Export in progress: {} of {}.'.format(o, self.input_record_count - 1))

        self.worker.signal_status.emit('')

    def __get_latest_number_cycle(self):

        curr_cycle, fetch_one = [], []
        for o in range(1, self.input_record_count):
            curr_cycle = self.__append_numbers_cycle(fetch_one[1:self.single_draw_len], curr_cycle)

            self.ldb.db_commit()
            fetch_one = list(self.ldb.fetchone(self.input_table, o))

        curr_cycle = self.__append_numbers_cycle(fetch_one[1:self.single_draw_len], curr_cycle)
        return curr_cycle

    def __get_latest_draw(self):

        curr_draw, fetch_one = [], []
        for o in range(1, self.input_record_count):
            curr_draw = self.__append_in_last_draw(fetch_one[1:self.single_draw_len], curr_draw)

            self.ldb.session_commit()
            fetch_one = list(self.ldb.fetchone(self.input_table, o))

        curr_draw = self.__append_in_last_draw(fetch_one[1:self.single_draw_len], curr_draw)
        return curr_draw

    def __create_top_numbers(self, offset):

        top_numbers = {}
        last = self.ldb.limit_offset_query(DYNAMIC_CLASS[self.curr_game.input_model], offset, offset-200)
        for sample in last:
            for number in range(1, self.single_draw_len):
                number = str(getattr(sample, 'NR_' + str(number)))
                if number not in top_numbers:
                    top_numbers[number] = 0
                top_numbers[number] += 1

        return top_numbers

    def get_latest_pairs(self, pair_size):

        pairs = {}
        sql_ct = str.format("SELECT * FROM {} limit {} offset {}", self.input_table, 366, self.input_record_count - 367)
        self.ldb.execute(sql_ct)
        last = self.ldb.c.fetchmany(self.input_record_count)
        for sample in last:
            comb = combinations(sample, pair_size)
            for c in comb:
                if c not in pairs:
                    pairs[c] = 1
                else:
                    pairs[c] += 1

        pairs_largest = nlargest(100, pairs, key=pairs.get)
        return pairs_largest

    def get_latest_top(self):
        return self.__create_top_numbers(self.input_record_count - 100)

    def __add_random(self, o_num, limit=True):

        if limit:
            sample_size = self.training_size_limit
        else:
            sample_size = self.total_game_numbers + 1

        while True:
            r = random.randrange(1, self.total_game_numbers)
            if r not in o_num:
                o_num = o_num + [r]
                if len(o_num) == sample_size:
                    o_num.sort()
                    break
        return o_num

    def create_training_model(self):

        self.ldb.create_new_session()
        list_model = self.worker.window.list_model

        ids = 1
        avg_time = 0
        win_count, loss_count = 0, 0
        zero, one, two, three, four = 0, 0, 0, 0, 0

        combined_set, curr_cycle = {}, {}
        fetch_one, curr_draw = [], []
        start_time = time.time()
        
        for o in range(1, self.input_record_count):

            curr_cycle = self.__append_numbers_cycle(fetch_one, curr_cycle)
            curr_draw = self.__append_in_last_draw(fetch_one, curr_draw)
            top_numbers = self.__create_top_numbers(o)

            record_set = self.ldb.fetchone(DYNAMIC_CLASS[self.curr_game.input_model], {'id': o})
            fetch_one = [getattr(record_set, 'NR_' + str(i)) for i in range(1, self.single_draw_len)]

            my_list = self.__add_random(fetch_one)

            end_time = time.time()
            avg_time = (avg_time + (end_time - start_time)) / o
            eta = avg_time * self.input_record_count - avg_time * o

            self.worker.signal_status.emit(self.__print_run_time(eta))
            self.worker.signal_progress_bar.emit(((o + 1) / self.input_record_count) * 100)

            for a in my_list:
                for b in my_list:
                    if a < b:
                        for c in my_list:
                            if b < c:
                                for d in my_list:
                                    if c < d:
                                        for e in my_list:
                                            if d < e:

                                                sample_array = [a, b, c, d, e]

                                                for i in range(self.worker.window.list_model.count()):

                                                    if list_model.item(i).text() == 'number_map':
                                                        combined_set = {**combined_set,
                                                                        **self.__map_number_map(sample_array)}

                                                    elif list_model.item(i).text() == 'number_cycles':
                                                        combined_set = {**combined_set,
                                                                        **self.__append_numbers_cycle(
                                                                            fetch_one, curr_cycle)}

                                                    elif list_model.item(i).text() == 'original_numbers':
                                                        combined_set = {**combined_set,
                                                                        **self.__map_original_numbers(sample_array)}

                                                    elif list_model.item(i).text() == 'in_last_draw':
                                                        combined_set = {**combined_set,
                                                                        **self.__map_last_draw(curr_draw)}

                                                    elif list_model.item(i).text() == 'rash_group':
                                                        combined_set = {**combined_set,
                                                                        **self.__append_rash_group(sample_array)}

                                                    elif list_model.item(i).text() == 'alphabetic_group':
                                                        combined_set = {**combined_set,
                                                                        **self.__append_alpha_group(sample_array)}

                                                    elif list_model.item(i).text() == 'hot numbers':
                                                        combined_set = {**combined_set,
                                                                        **self.append_hot_cold_warm_cool(
                                                                            top_numbers, 10, 'L')}

                                                    elif list_model.item(i).text() == 'cold numbers':
                                                        combined_set = {**combined_set,
                                                                        **self.append_hot_cold_warm_cool(
                                                                            top_numbers, 10, 'S')}

                                                    elif list_model.item(i).text() == 'warm numbers':
                                                        combined_set = {**combined_set,
                                                                        **self.append_hot_cold_warm_cool(
                                                                            top_numbers, 20, 'L')}

                                                    elif list_model.item(i).text() == 'cool numbers':
                                                        combined_set = {**combined_set,
                                                                        **self.append_hot_cold_warm_cool(
                                                                            top_numbers, 20, 'S')}

                                                label = [self.__append_count_label(sample_array, fetch_one)]

                                                if self.worker.window.check_win_loss.isChecked():

                                                    if label < [3]:
                                                        self.__append_db({**{'DRAFT_ID': o},
                                                                          **combined_set,
                                                                          **self.loss})
                                                        loss_count += 1
                                                    else:
                                                        self.__append_db({**{'DRAFT_ID': o},
                                                                          **combined_set,
                                                                          **self.win})
                                                        win_count += 1

                                                    ids += 1

                                                else:

                                                    if label[0] in [0, 1]:  # and number_limit[0] < 25:
                                                        self.__append_db({**{'DRAFT_ID': o},
                                                                          **combined_set,
                                                                          **{'LABEL': 0}})
                                                        # number_limit[0] = number_limit[0] + 1
                                                        zero += 1
                                                        ids += 1
                                                    elif label[0] == 2:  # and number_limit[1] < 25:
                                                        self.__append_db({**{'DRAFT_ID': o},
                                                                          **combined_set,
                                                                          **{'LABEL': 1}})
                                                        # number_limit[1] = number_limit[1] + 1
                                                        one += 1
                                                        ids += 1
                                                    elif label[0] == 3:  # and number_limit[1] < 25:
                                                        self.__append_db({**{'DRAFT_ID': o},
                                                                          **combined_set,
                                                                          **{'LABEL': 2}})
                                                        # number_limit[1] = number_limit[1] + 1
                                                        two += 1
                                                        ids += 1
                                                    elif label[0] in [4, 5]:  # and number_limit[2] < 25:
                                                        self.__append_db({**{'DRAFT_ID': o},
                                                                          **combined_set,
                                                                          **{'LABEL': 3}})
                                                        # number_limit[2] = number_limit[2] + 1
                                                        three += 1
                                                        ids += 1

                                                combined_set = {}

        self.ldb.session_commit()
        self.ldb.session_close()
        if self.worker.window.check_win_loss.isChecked():
            return win_count, loss_count
        else:
            return zero, one, two, three, four

    @staticmethod
    def __print_run_time(seconds):
        seconds = int(seconds)
        hours = seconds // 3600
        minutes = (seconds - 3600 * hours) // 60
        seconds = seconds - 3600 * hours - 60 * minutes
        print_it = str.format('Estimate time remaining: {}:{}:{}'.format(
            '{:02}'.format(hours), '{:02}'.format(minutes), '{:02}'.format(seconds)))
        return print_it

    def __create_rash_group(self):

        self.ldb = LotteryDatabase()
        fetch_a = self.ldb.execute(self.input_table)

        first_data_group = defaultdict(int)
        second_data_group = defaultdict(int)
        third_data_group = defaultdict(int)
        new_set = []

        for line in fetch_a:
            line = line[1:7]
            for num in line:
                if num in self.curr_game['groups']['first_group']:
                    new_set.append(1)
                elif num in self.curr_game['groups']['second_group']:
                    new_set.append(2)
                elif num in self.curr_game['groups']['third_group']:
                    new_set.append(3)

            count = Counter(new_set)

            if count[1] == 4:
                self.rash_one += 1
                for x, y in zip(line, new_set):
                    if y == 1:
                        first_data_group[x] += 1

            elif count[2] == 4:
                self.rash_two += 1
                for x, y in zip(line, new_set):
                    if y == 2:
                        second_data_group[x] += 1

            elif count[3] == 4:
                self.rash_three += 1
                for x, y in zip(line, new_set):
                    if y == 3:
                        third_data_group[x] += 1

            rash_group = []

            for num in line:
                if num in self.curr_game['groups']['first_group']:
                    d = first_data_group.get(num)
                    if d == "":
                        per = round(float(1 / self.rash_one) * 10, 2)
                    else:
                        per = round(float(d / self.rash_one) * 10, 2)

                    rash_group.append(per)
                elif num in self.curr_game['groups']['second_group']:
                    d = second_data_group.get(num)
                    if d == "":
                        per = round(float(1 / self.rash_two) * 10, 2)
                    else:
                        per = round(float(d / self.rash_two) * 10, 2)
                    rash_group.append(per)
                elif num in self.curr_game['groups']['third_group']:
                    d = third_data_group.get(num)
                    if d == "":
                        per = round(float(1 / self.rash_three) * 10, 2)
                    else:
                        per = round(float(d / self.rash_three) * 10, 2)

                    rash_group.append(per)

        self.ldb.__del__()
Example #2
0
class DatabaseManagerDialog(QtBaseDbClass, Ui_DbDialog):
    def __init__(self, window, parent=None):
        super(DatabaseManagerDialog, self).__init__(parent)

        # class initialize
        self.setupUi(self)
        self.window = window
        self.ldb = LotteryDatabase()
        self.db_manager_init()

        # variables
        self.deleted = {}
        self.created = {}

        # buttons
        self.btn_add_model.clicked.connect(self.add_model)
        self.btn_delete_model.clicked.connect(self.delete_model)

        self.btn_add_predict.clicked.connect(self.add_predict)
        self.btn_delete_predict.clicked.connect(self.delete_predict)

        self.btn_save.clicked.connect(self.save_database)
        self.btn_cancel.clicked.connect(self.close_db_manager)

    def db_manager_init(self):

        curr_game = self.ldb.fetchone(
            LottoGame, {'name': self.window.line_current_game.text()})

        for table in curr_game.user_tables:
            if table.database_name.startswith('MODEL_'):
                self.list_model_db.addItem(
                    table.database_name.replace('MODEL_', ''))
            elif table.database_name.startswith('PREDICT_'):
                self.list_predict_db.addItem(
                    table.database_name.replace('PREDICT_', ''))

    def add_model(self):

        text = self.line_model.text().strip()

        if text != '':
            if ' ' in text:
                QMessageBox.information(
                    self, 'Whitespace',
                    'Your database name contain whitespaces. Please check!')
            else:
                if self.list_model_db.findItems(text, QtCore.Qt.MatchExactly):
                    QMessageBox.information(
                        self, 'Already exist',
                        'Your database name already exist. Try again!')
                else:
                    self.created[text] = 0
                    self.list_model_db.addItem(text)
                    self.line_model.clear()

    def add_predict(self):

        text = self.line_predict.text().strip()

        if text != '':
            if ' ' in text:
                QMessageBox.information(
                    self, 'Whitespace',
                    'Your database name contain whitespaces. Please check!')
            else:
                if self.list_predict_db.findItems(text,
                                                  QtCore.Qt.MatchExactly):
                    QMessageBox.information(
                        self, 'Already exist',
                        'Your database name already exist. Try again!')
                else:
                    self.created[text] = 1
                    self.list_predict_db.addItem(text)
                    self.line_predict.clear()

    def delete_model(self):
        if len(self.list_model_db.selectedItems()) > 0:
            self.deleted[self.list_model_db.currentItem().text()] = 0
            self.list_model_db.takeItem(self.list_model_db.currentRow())

    def delete_predict(self):
        if len(self.list_predict_db.selectedItems()) > 0:
            self.deleted[self.list_predict_db.currentItem().text()] = 1
            self.list_predict_db.takeItem(self.list_predict_db.currentRow())

    def save_database(self):

        self.window.combo_db.clear()
        self.window.combo_predict_model.clear()
        self.ldb.create_new_session()

        for key, value in self.deleted.items():
            if value == 0:
                self.ldb.delete_record(
                    DatabaseModels, {
                        'game': self.window.line_current_game.text(),
                        'database_name': 'MODEL_' + key
                    })
            elif value == 1:
                self.ldb.delete_record(
                    DatabaseModels, {
                        'game': self.window.line_current_game.text(),
                        'database_name': 'PREDICT_' + key
                    })

        for key, value in self.created.items():
            if value == 0:
                self.ldb.add_record(
                    DatabaseModels, {
                        'game': self.window.line_current_game.text(),
                        'database_name': 'MODEL_' + key
                    })
                self.window.combo_db.addItem(key)
            elif value == 1:
                self.ldb.add_record(
                    DatabaseModels, {
                        'game': self.window.line_current_game.text(),
                        'database_name': 'PREDICT_' + key
                    })
                self.window.combo_predict_model.addItem(key)

        self.ldb.session_commit()
        self.ldb.session_close()
        self.close_db_manager()

    def close_db_manager(self):
        self.close()