双色球号码预测:基于历史数据和统计学分析
import os from collections import Counter from random import choices from colorama import Fore, Style import pandas as pd import openpyxl from openpyxl.utils import get_column_letter
导入操作系统
os.system('cls')
从集合导入随机
from random import choices
导入计数器,默认
from collections import Counter
导入 colorama
from colorama import Fore, Style
import numpy 作为 np
import numpy as np
导入 openpyxl 导入熊猫作为 pd
import openpyxl import pandas as pd
从 openpyxl.utils 导入 get_column_letter
from openpyxl.utils import *
读取历史数据
df = pd.read_excel('ssq.xls', sheet_name='0', usecols=list(range(2, 9)), skiprows=2)
将前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(choices(red_ball_list, weights=red_weights_list, k=1)[0])
new_selected_balls.append(choices(red_ball_list, weights=red_weights_list, k=1)[0])
if len(red_selected_balls) >= 6:
break
blue_selected_ball = choices(blue_ball_list, weights=blue_weights_list, k=1)[0]
new_selected_balls.append(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' 对象不可迭代
原文地址: https://www.cveoy.top/t/topic/o7Ja 著作权归作者所有。请勿转载和采集!