双色球号码预测 - 基于历史数据和统计学分析
import operator/nimport os/nimport random/nfrom collections import Counter/nfrom colorama import Fore, Style/nimport numpy as np/nimport pandas as pd/nimport openpyxl/nfrom openpyxl.utils import get_column_letter/n/n# 导入数据/ndf = pd.read_excel('ssq.xls', sheet_name=0, usecols=list(range(2, 9)), skiprows=2)/n/n# 将红球和蓝球数据分开/nred_data = df.iloc[:, :6]/nblue_data = df.iloc[:, 6]/n/n# 统计红球出现次数/nred_counts = red_data.apply(Counter).sum()/n/n# 预测下一期红球区间出现个数/ndef predict_red(red_counts):/n next_red_counts = red_counts.copy()/n for i in range(10, 34):/n if i in next_red_counts:/n next_red_counts[i] = 0/n next_red_counts[i] += 1 # 当前逻辑保持不变/n # 增加逻辑: 如果某个区间的出数个数小于5,那么预测下一期该区间的出数个数加1/n if next_red_counts[i] < 5:/n next_red_counts[i] += 1/n return list(next_red_counts.items())/n/n# 预测下一期奇数和偶数的数量/ndef predict_odd_even(red_data):/n # 增加逻辑: 如果上一期的奇数个数大于等于6,预测下一期奇数个数减1;/n # 如果上一期的偶数个数大于等于6,预测下一期偶数个数减1。/n prev_odd_count = len([num for num in red_data if num % 2 == 1])/n prev_even_count = len([num for num in red_data if num % 2 == 0])/n if prev_odd_count >= 6:/n odd_count = max(0, prev_odd_count - 1)/n else:/n odd_count = prev_odd_count/n if prev_even_count >= 6:/n even_count = max(0, prev_even_count - 1)/n else:/n even_count = prev_even_count/n return {'奇数': odd_count, '偶数': even_count}/n/n# 历史数据分析法:计算红球数字的概率权重/nred_weights_history = red_data.apply(lambda x: x.value_counts(normalize=True))/n/n# 统计学分析法:计算红球数字的概率权重/nred_weights_statistics = red_data.apply(lambda x: x.value_counts(normalize=True))/n/n# 趋势分析法:计算红球数字的概率权重/nred_weights_trend = red_data.apply(lambda x: x.value_counts(normalize=True))/n/n# 分组选号法:计算红球数字的概率权重/nred_weights_group = red_data.apply(lambda x: x.value_counts(normalize=True))/n/n# 历史数据分析法:计算蓝球数字的概率权重/nblue_weights_history = blue_data.value_counts(normalize=True)/n/n# 统计学分析法:计算蓝球数字的概率权重/nblue_weights_statistics = blue_data.value_counts(normalize=True)/n/n# 趋势分析法:计算蓝球数字的概率权重/nblue_weights_trend = blue_data.value_counts(normalize=True)/n/n# 分组选号法:计算蓝球数字的概率权重/nblue_weights_group = blue_data.value_counts(normalize=True)/n/n# 将四种分析方法计算的概率权重合并并每个值乘以100/nred_weights = pd.concat([red_weights_history, red_weights_statistics, red_weights_trend, red_weights_group], axis=1).sum(axis=1)/nblue_weights = pd.concat([blue_weights_history, blue_weights_statistics, blue_weights_trend, blue_weights_group], axis=1).sum(axis=1)/n/n# 获取最近几期的红球和蓝球号码/nrecent_winners = df.tail(20)/nrecent_winners_red = recent_winners.iloc[:, :6].values.flatten()/nrecent_winners_blue = recent_winners.iloc[:, 6].values.flatten()/n/n/ncount_red = {}/ncount_blue = {}/n/nfor i in recent_winners_red:/n count_red[i] = count_red.get(i, 0) + 1/n/nfor i in recent_winners_blue:/n count_blue[i] = count_blue.get(i, 0) + 1/n/n# 计算每个数字的自动权重调整因子系数/nred_auto_weights = {num: 1 / (freq ** 2) for num, freq in count_red.items()}/nblue_auto_weights = {num: 1 / (freq ** 2) for num, freq in count_blue.items()}/n/n# 合并红球权重字典/nmerged_red_weights = {}/nfor num, weight in red_weights.items():/n if num in red_auto_weights:/n merged_red_weights[num] = weight * red_auto_weights[num]/n/n# 合并蓝球权重字典/nmerged_blue_weights = {}/nfor num, weight in blue_weights_history.items():/n if num in blue_auto_weights:/n merged_blue_weights[num] = weight * blue_auto_weights[num]/n/n# 确保所有数字都有权重/nnumbers_red = [i for i in range(1, 34)]/nnumbers_blue = [i for i in range(1, 17)]/n/nfor num in numbers_red:/n if num not in merged_red_weights.keys():/n merged_red_weights.update({num: 1})/n/nfor num in numbers_blue:/n if num not in merged_blue_weights.keys():/n merged_blue_weights.update({num: 1})/n/n# 从红球权重字典中根据概率随机选择6个红球/nred_ball_list = list(merged_red_weights.keys())/nred_weights_list = list(merged_red_weights.values())/n/n# 从蓝球权重字典中根据概率随机选择1个蓝球/nblue_ball_list = list(merged_blue_weights.keys())/nblue_weights_list = list(merged_blue_weights.values())/n/nprint('///n')/nwhile True:/n selected_red_combinations = []/n while True:/n user_input = input(/' 请输入所下注数: /')/n os.system('cls')/n try:/n Note_number = int(user_input)/n break/n except ValueError:/n print(/' 输入的不是数字,请重新输入。/')/n print()/n print('///n')/n user_inputb = input(/' 请选择是否测试本期中奖率:(输入'y'或者'n') /')/n os.system('cls')/n if user_inputb.lower() == 'y':/n while True:/n print('///n')/n user_inputc = input(/' 请输入本期中奖红球号码(并以空格分开): /')/n print()/n if len(user_inputc.split()) != 6:/n print(/' 输入的红球号码数量不正确,请重新输入。/')/n print()/n else:/n try:/n red_ballsa = [int(num) for num in user_inputc.split()]/n if all(1 <= i <= 33 for i in red_ballsa):/n break/n else:/n print(/' 输入的不是有效的数字,请重新输入。/')/n print()/n except ValueError:/n print(/' 输入的不是有效的数字,请重新输入。/')/n print()/n num_list = user_inputc.split()/n user_inputc = [int(num) for num in num_list] # 转换成整数类型/n while True:/n print()/n user_inputd = input(/' 请输入本期中奖蓝球号码: /')/n print()/n try:/n blue_balld = int(user_inputd)/n if 1 <= blue_balld <= 16:/n break/n except ValueError:/n print(/' 输入的不是有效的数字,请重新输入。/')/n print()/n os.system('cls')/n countaa = {}/n my_dict = {}/n my_list_a = []/n historical_data = df.values/n xx = 0/n xxx = 0/n new_list = []/n for _ in range(int(user_input)):/n while True:/n red_selected_balls = []/n new_selected_balls = []/n blue_selected_ball = []/n while True:/n red_selected_balls.append(random.choices(red_ball_list, weights=red_weights_list, k=1)[0])/n new_selected_balls.append(random.choices(red_ball_list, weights=red_weights_list, k=1)[0])/n if len(red_selected_balls) >= 6:/n break/n blue_selected_ball = random.choices(blue_ball_list, weights=blue_weights_list, k=1)[0]/n new_selected_balls.append(random.choices(blue_ball_list, weights=blue_weights_list, k=1)[0])/n if all(set(new_selected_balls) != set(x) for x in balls_data.values) and ///n all(set(red_selected_balls) != set(x) for x in selected_red_combinations):/n selected_red_combinations.append(tuple(sorted(new_selected_balls)))/n break/n sorted_selected_red_balls = sorted(red_selected_balls)/n/n print(f/'{colorama.Fore.RED} {' '.join([f'{i:02d}' for i in sorted_selected_red_balls])}{colorama.Style.RESET_ALL}/',/n end='')/n print(f/'{colorama.Fore.BLUE} {f'{blue_selected_ball:02d}'} {colorama.Style.RESET_ALL}/')/n most_common_reds_formatted = [f'{i:02d}' for i in sorted_selected_red_balls]/n most_common_reds_formatted.append(' ')/n most_common_reds_formatted.append(f'{blue_selected_ball:02d}')/n my_list_a.append(most_common_reds_formatted)/n if user_inputb.lower() == 'y':/n new_lista = []/n/n common_elements_red = len(set(user_inputc) & set(red_selected_balls))/n/n/n common_elements_blue = /'是/' if int(user_inputd) == int(blue_selected_ball) else /'否/'/n if common_elements_blue == /'是/':/n if common_elements_red >= 3:/n word = f' 中{common_elements_red}个红球,蓝球是否中奖:( {common_elements_blue} )'/n countaa[word] = countaa.get(word, 0) + 1/n most_common_reds_formatted.append(f'{word}')/n new_list.append(list(/n most_common_reds_formatted))/n/n xx += 1/n else:/n word = f' 只中蓝球:( {common_elements_blue} ) '/n countaa[word] = countaa.get(word, 0) + 1/n most_common_reds_formatted.append(f'{word}')/n new_list.append(list(/n most_common_reds_formatted))/n xx += 1/n else:/n if common_elements_red >= 4:/n word = f' 中{common_elements_red}个红球,蓝球是否中奖:/n/n ( {common_elements_blue} )'/n/n countaa[word] = countaa.get(word, 0)/n/n + 1/n most_common_reds_formatted.append(f'{word}')/n new_list.append(list(most_common_reds_formatted))/n/n xx += 1/n xxx += 1/n/n if user_inputb.lower() == 'y':/n sorted_dict = dict(sorted(countaa.items(), key=operator.itemgetter(1, 0)))/n print('///n')/n for key, value in sorted_dict.items():/n print(key, ' ', '中奖注数: ', value, ' 注')/n print(' 总下注数: ', f'{int(xxx)}', ' 注')/n print(' 中奖概率: ', f'{(int(xx) / int(xxx) * 100):.2f} %')/n if (int(xx) / int(xxx) * 100) > 0:/n # 创建 DataFrame/n df = pd.DataFrame(new_list, columns=['红', '红', '红', '红', '红', '', '蓝', '奖项'])/n df.to_excel('中奖结果.xlsx', index=False)/n os.startfile('中奖结果.xlsx')/n/n/n else:/n df = pd.DataFrame(/n columns=['红', '红', '红', '红', '红', '红', ''', '蓝', '概率', '少于10', '少于20', '少于30', '30以上', '奇数','偶数'])/n for row in my_list_a:/n new_row = []/n for cell in row:/n try:/n cell = int(cell)/n except ValueError:/n pass/n new_row.append(cell)/n/n/n aa = sum(1 for i in new_row[:6] if i < 10)/n bb = sum(1 for i in new_row[:6] if 10 <= i < 20)/n cc = sum(1 for i in new_row[:6] if 20 <= i < 30)/n dd = sum(1 for i in new_row[:6] if i >= 30)/n formula = sum(1 for i in my_list_a if i[7] == row[7])/n ee = sum(1 for i in new_row[:6] if i % 2 == 1)/n ff = sum(1 for i in new_row[:6] if i % 2 == 0)/n/n formatted_row = [f'{i:02d}' if isinstance(i, int) else i for i in new_row]/n formatted_row.extend([formula, aa, bb, cc, dd, ee, ff])/n df = df._append(pd.Series(formatted_row, index=df.columns), ignore_index=True)/n/n df_sorted = df.sort_values(by=['概率', '少于10', '少于20', '少于30', '30以上', '奇数','偶数'],ascending=[False, False, False, False, False, False, False])/n df_sorted.to_excel('选号结果.xlsx', index=False)/n # 打开现有的Excel文件/n filename = '选号结果.xlsx'/n wb = openpyxl.load_workbook(filename)/n ws = wb.active/n/n data = []/n data.append([])/n data.append([])/n data.append(['下一期红球预测:'])/n/n next_red_predictions = predict_red(red_counts)/n odd_even_predictions = predict_odd_even(red_data)/n next_red_predictions_sorted = sorted(next_red_predictions, key=operator.itemgetter(1, 0), reverse=True)/n # 将预测结果写入Excel文件中/n row_index = ws.max_row + 1 # 获取下一行的索引/n for i, value in enumerate(next_red_predictions_sorted):/n ws.cell(row=row_index + i, column=1, value=str(value))/n/n row_index = ws.max_row + 2 # 获取下一行的索引/n ws.cell(row=row_index, column=1, value=/'奇偶预测:/')/n row_index += 1/n ws.cell(row=row_index, column=1, value=/'奇数:/')/n # 或者 odd_values = odd_even_predictions['odd'] # 如果odd_even_predictions['odd']是整数的话/n for key, values in odd_even_predictions.items():/n for i, value in enumerate(values):/n if key == 'odd':/n ws.cell(row=row_index + 1 + i, column=1, value=value)/n elif key == 'even':/n ws.cell(row=row_index + 1 + i, column=2, value=value)/n/n ws.cell(row=row_index, column=2, value=/'偶数:/')/n for i, value in enumerate(odd_even_predictions['even']):/n ws.cell(row=row_index + 1 + i, column=2, value=value)/n/n # 设置列宽/n column_list = [1, 9] # 第一列和第9列的列索引/n for column in column_list:/n column_letter = get_column_letter(column)/n ws.column_dimensions[column_letter].width = 15/n/n # 保存更改到Excel文件并打开文件/n wb.save(filename)/n os.startfile(filename)/n/n print('///n')/n input(/'按回车键继续.../')/n os.system('cls')/n/n # ... 剩余代码 ... /
原文地址: https://www.cveoy.top/t/topic/o7I8 著作权归作者所有。请勿转载和采集!