import operator import os import random import pandas as pd from collections import Counter from colorama import Fore, Style import numpy as np import openpyxl from openpyxl.utils import get_column_letter

导入数据

df = pd.read_excel('ssq.xls', sheet_name=0, usecols=list(range(2, 9)), skiprows=2)

获取红球数据

red_data = df.iloc[:, :6]

获取蓝球数据

blue_data = df.iloc[:, 6]

将前6列(红球)存储在新的DataFrame中

red_data = df.iloc[:, :6]

将第7列(蓝球)存储在新的DataFrame中

blue_data = df.iloc[:, 6]

balls_data = df.iloc[:, :]

数据预处理: 统计每个红球的出现次数

red_counts = red_data.apply(Counter).sum()

预测下一期红球区间出数个数

预测: 生成下一期区间出数个数的数量预测

def predict_red(red_counts): next_red_counts = red_counts.copy() for i in range(10, 34): if i in next_red_counts: next_red_counts[i] = 0 next_red_counts[i] += 1 # 当前逻辑保持不变 # 增加逻辑: 如果某个区间的出数个数小于5,那么预测下一期该区间的出数个数加1 for key, value in next_red_counts.items(): if value < 5: next_red_counts[key] += 1 return list(next_red_counts.items())

预测: 生成下一期奇数和偶数的数量预测

def predict_odd_even(red_data): # 增加逻辑: 如果上一期的奇数个数大于等于6,预测下一期奇数个数减1; # 如果上一期的偶数个数大于等于6,预测下一期偶数个数减1。 prev_odd_count = len([num for num in red_data if num % 2 == 1]) prev_even_count = len([num for num in red_data if num % 2 == 0]) if prev_odd_count >= 6: odd_count = max(0, prev_odd_count - 1) else: odd_count = prev_odd_count if prev_even_count >= 6: even_count = max(0, prev_even_count - 1) else: even_count = prev_even_count return {'奇数': odd_count, '偶数': even_count}

历史数据分析法:计算红球数字的概率权重

red_weights_history = red_data.apply(lambda x: x.value_counts(normalize=True))

统计学分析法:计算红球数字的概率权重

red_weights_statistics = red_data.apply(lambda x: x.value_counts(normalize=True))

趋势分析法:计算红球数字的概率权重

red_weights_trend = red_data.apply(lambda x: x.value_counts(normalize=True))

分组选号法:计算红球数字的概率权重

red_weights_group = red_data.apply(lambda x: x.value_counts(normalize=True))

历史数据分析法:计算蓝球数字的概率权重

blue_weights_history = blue_data.value_counts(normalize=True)

统计学分析法:计算蓝球数字的概率权重

blue_weights_statistics = blue_data.value_counts(normalize=True)

趋势分析法:计算蓝球数字的概率权重

blue_weights_trend = blue_data.value_counts(normalize=True)

分组选号法:计算蓝球数字的概率权重

blue_weights_group = blue_data.value_counts(normalize=True)

将四种分析方法计算的概率权重合并并每个值乘以100

red_weights = pd.concat([red_weights_history, red_weights_statistics, red_weights_trend, red_weights_group], axis=1).sum(axis=1) blue_weights = pd.concat([blue_weights_history, blue_weights_statistics, blue_weights_trend, blue_weights_group], axis=1).sum(axis=1)

获取最近几期的红球和蓝球号码

recent_winners = df.tail(20) recent_winners_red = recent_winners.iloc[:, :6].values.flatten() recent_winners_blue = recent_winners.iloc[:, 6].values.flatten()

count_red = {} count_blue = {}

for i in recent_winners_red: count_red[i] = count_red.get(i, 0) + 1

for i in recent_winners_blue: count_blue[i] = count_blue.get(i, 0) + 1

计算每个数字的自动权重调整因子系数

red_auto_weights = {num: 1 / (freq ** 2) for num, freq in count_red.items()} blue_auto_weights = {num: 1 / (freq ** 2) for num, freq in count_blue.items()}

合并红球权重字典

merged_red_weights = {} for num, weight in red_weights.items(): if num in red_auto_weights: merged_red_weights[num] = weight * red_auto_weights[num]

合并蓝球权重字典

merged_blue_weights = {} for num, weight in blue_weights_history.items(): if num in blue_auto_weights: merged_blue_weights[num] = weight * blue_auto_weights[num]

numbers_red = [i for i in range(1, 34)]

numbers_blue = [i for i in range(1, 17)]

for num in numbers_red:

if num not in merged_red_weights.keys():

merged_red_weights.update({num: 1})

for num in numbers_blue:

if num not in merged_blue_weights.keys():

merged_blue_weights.update({num: 1})

从红球权重字典中根据概率随机选择6个红球

red_ball_list = list(merged_red_weights.keys()) red_weights_list = list(merged_red_weights.values())

从蓝球权重字典中根据概率随机选择1个蓝球

blue_ball_list = list(merged_blue_weights.keys()) blue_weights_list = list(merged_blue_weights.values())

print('
') while True: selected_red_combinations = [] while True: user_input = input('请输入所下注数: ') os.system('cls') try: Note_number = int(user_input) break except ValueError: print('输入的不是数字,请重新输入。') print() print('
') user_inputb = input('请选择是否测试本期中奖率:(输入'y'或者'n') ') os.system('cls') if user_inputb.lower() == 'y': while True: print('
') user_inputc = input('请输入本期中奖红球号码(并以空格分开): ') print() if len(user_inputc.split()) != 6: print('输入的红球号码数量不正确,请重新输入。') print() else: try: red_ballsa = [int(num) for num in user_inputc.split()] if all(1 <= i <= 33 for i in red_ballsa): break else: print('输入的不是有效的数字,请重新输入。') print() except ValueError: print('输入的不是有效的数字,请重新输入。') print() num_list = user_inputc.split() user_inputc = [int(num) for num in num_list] # 转换成整数类型 while True: print() user_inputd = input('请输入本期中奖蓝球号码: ') print() try: blue_balld = int(user_inputd) if 1 <= blue_balld <= 16: break except ValueError: print('输入的不是有效的数字,请重新输入。') print() os.system('cls') countaa = {} my_dict = {} my_list_a = [] historical_data = df.values xx = 0 xxx = 0 new_list = [] for _ in range(int(user_input)): while True: red_selected_balls = [] new_selected_balls = [] blue_selected_ball = [] while True: red_selected_balls.append(random.choices(red_ball_list, weights=red_weights_list, k=1)[0]) new_selected_balls.append(random.choices(red_ball_list, weights=red_weights_list, k=1)[0]) if len(red_selected_balls) >= 6: break blue_selected_ball = random.choices(blue_ball_list, weights=blue_weights_list, k=1)[0] new_selected_balls.append(random.choices(blue_ball_list, weights=blue_weights_list, k=1)[0]) if all(set(new_selected_balls) != set(x) for x in balls_data.values) and
all(set(red_selected_balls) != set(x) for x in selected_red_combinations): selected_red_combinations.append(tuple(sorted(new_selected_balls))) break sorted_selected_red_balls = sorted(red_selected_balls)

                print(f'{Fore.RED} { ' '.join([f'{i:02d}' for i in sorted_selected_red_balls])}{Style.RESET_ALL}',
                      end='')
                print(f'{Fore.BLUE} {f'{blue_selected_ball:02d}'} {Style.RESET_ALL}')
                most_common_reds_formatted = [f'{i:02d}' for i in sorted_selected_red_balls]
                most_common_reds_formatted.append(' ')
                most_common_reds_formatted.append(f'{blue_selected_ball:02d}')
                my_list_a.append(most_common_reds_formatted)
                if user_inputb.lower() == 'y':
                    new_lista = []

                    common_elements_red = len(set(user_inputc) & set(red_selected_balls))


                    common_elements_blue = '是' if int(user_inputd) == int(blue_selected_ball) else '否'
                    if common_elements_blue == '是':
                        if common_elements_red >= 3:
                            word = f' 中{common_elements_red}个红球,蓝球是否中奖:( {common_elements_blue} )'
                            countaa[word] = countaa.get(word, 0) + 1
                            most_common_reds_formatted.append(f'{word}')
                            new_list.append(list(most_common_reds_formatted))

                            xx += 1
                        else:
                            word = f' 只中蓝球:( {common_elements_blue} ) '
                            countaa[word] = countaa.get(word, 0) + 1
                            most_common_reds_formatted.append(f'{word}')
                            new_list.append(list(most_common_reds_formatted))
                            xx += 1
                    else:
                        if common_elements_red >= 4:
                            word = f' 中{common_elements_red}个红球,蓝球是否中奖:

                            ( {common_elements_blue} )'

                            countaa[word] = countaa.get(word, 0)

                            + 1
                            most_common_reds_formatted.append(f'{word}')
                            new_list.append(list(most_common_reds_formatted))

                            xx += 1
                        xxx += 1

        if user_inputb.lower() == 'y':
            sorted_dict = dict(sorted(countaa.items(), key=operator.itemgetter(1, 0)))
            print('\

') for key, value in sorted_dict.items(): print(key, ' ', '中奖注数: ', value, ' 注') print(' 总下注数: ', f'{int(xxx)}', ' 注') print(' 中奖概率: ', f'{(int(xx) / int(xxx) * 100):.2f} %') if (int(xx) / int(xxx) * 100) > 0: # 创建 DataFrame df = pd.DataFrame(new_list, columns=['红', '红', '红', '红', '红', '', '蓝', '奖项']) df.to_excel('中奖结果.xlsx', index=False) os.startfile('中奖结果.xlsx')

        else:
            df = pd.DataFrame(
                columns=['红', '红', '红', '红', '红', '红', '''', '蓝', '概率', '少于10', '少于20', '少于30', '30以上', '奇数','偶数'])
            for row in my_list_a:
                new_row = []
                for cell in row:
                    try:
                        cell = int(cell)
                    except ValueError:
                        pass
                    new_row.append(cell)


                    aa = sum(1 for i in new_row[:6] if i < 10)
                    bb = sum(1 for i in new_row[:6] if 10 <= i < 20)
                    cc = sum(1 for i in new_row[:6] if 20 <= i < 30)
                    dd = sum(1 for i in new_row[:6] if i >= 30)
                    formula = sum(1 for i in my_list_a if i[7] == row[7])
                    ee = sum(1 for i in new_row[:6] if i % 2 == 1)
                    ff = sum(1 for i in new_row[:6] if i % 2 == 0)

                    formatted_row = [f'{i:02d}' if isinstance(i, int) else i for i in new_row]
                    formatted_row.extend([formula, aa, bb, cc, dd, ee, ff])
                    df = df._append(pd.Series(formatted_row, index=df.columns), ignore_index=True)

            df_sorted = df.sort_values(by=['概率', '少于10', '少于20', '少于30', '30以上', '奇数','偶数'],ascending=[False, False, False, False, False, False, False])
            df_sorted.to_excel('选号结果.xlsx', index=False)
            # 打开现有的Excel文件
            filename = '选号结果.xlsx'
            wb = openpyxl.load_workbook(filename)
            ws = wb.active

            data = []
            data.append([])
            data.append([])
            data.append(['下一期红球预测:'])

            next_red_predictions = predict_red(red_counts)
            odd_even_predictions = predict_odd_even(red_data)
            next_red_predictions_sorted = sorted(next_red_predictions, key=operator.itemgetter(1, 0), reverse=True)
            # 将预测结果写入Excel文件中
            row_index = ws.max_row + 1  # 获取下一行的索引
            for i, value in enumerate(next_red_predictions_sorted):
                ws.cell(row=row_index + i, column=1, value=str(value))

            row_index = ws.max_row + 2  # 获取下一行的索引
            ws.cell(row=row_index, column=1, value='奇偶预测:')
            row_index += 1
            ws.cell(row=row_index, column=1, value='奇数:')
            # 或者 odd_values = odd_even_predictions['odd']  # 如果odd_even_predictions['odd']是整数的话
            for key, values in odd_even_predictions.items():
                for i, value in enumerate(values):
                    if key == 'odd':
                        ws.cell(row=row_index + 1 + i, column=1, value=value)
                    elif key == 'even':
                        ws.cell(row=row_index + 1 + i, column=2, value=value)

            ws.cell(row=row_index, column=2, value='偶数:')
            for i, value in enumerate(odd_even_predictions['even']):
                ws.cell(row=row_index + 1 + i, column=2, value=value)

            # 设置列宽
            column_list = [1, 9]  # 第一列和第9列的列索引
            for column in column_list:
                column_letter = get_column_letter(column)
                ws.column_dimensions[column_letter].width = 15

            # 保存更改到Excel文件并打开文件
            wb.save(filename)
            os.startfile(filename)

        print('\

') input('按回车键继续...') os.system('cls')

        for i, value in enumerate(values):
            ^^^^^^^^^^^^^^^^^
            TypeError:
            'int' object is not iterable
        for i, value in enumerate(values):
            ^^^^^^^^^^^^^^^^^
            TypeError:
            'int' object is not iterable
双色球选号器:基于历史数据和统计学分析的预测模型

原文地址: https://www.cveoy.top/t/topic/o7II 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录