双色球选号器:基于历史数据和统计学分析的预测模型
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 著作权归作者所有。请勿转载和采集!