85 lines
4.1 KiB
Python
85 lines
4.1 KiB
Python
import json
|
|
from datetime import datetime
|
|
|
|
class LotteryPredictorV6:
|
|
def __init__(self, stats_path):
|
|
with open(stats_path, 'r', encoding='utf-8') as f:
|
|
self.stats = json.load(f)
|
|
# self.result_weights = {'time': 0.83, 'week': 0.14, 'date': 0.03}
|
|
self.result_weights = {'time': 0.9, 'week': 0.05, 'date': 0.05}
|
|
self.result_detail_weights = {'time': 0.9, 'week': 0.05, 'date': 0.05}
|
|
self.winner_weights = {'time': 0.9, 'week': 0.05, 'date': 0.05}
|
|
self.gd_weights = {'time': 0.9, 'week': 0.05, 'date': 0.05}
|
|
self.glh_weights = {'time': 0.9, 'week': 0.05, 'date': 0.05}
|
|
|
|
def predict(self, date_str, time_str):
|
|
dt = datetime.strptime(date_str, '%Y-%m-%d')
|
|
day_of_month = str(dt.day)
|
|
day_of_week = str(dt.weekday())
|
|
|
|
t_stats = self.stats['by_time'].get(time_str, {})
|
|
d_stats = self.stats['by_date'].get(day_of_month, {})
|
|
w_stats = self.stats['by_week'].get(day_of_week, {})
|
|
|
|
raw_probs = {
|
|
'digital_pos': {},
|
|
'pos_detail': {},
|
|
'winner_prob': {},
|
|
'direct_gd1': {},
|
|
'direct_gd2': {},
|
|
'glh_pos': {}
|
|
}
|
|
|
|
# 1. 数字位置概率
|
|
for i in range(10):
|
|
pos_key = f'pos_{i}'
|
|
combined = {}
|
|
for val in range(1, 11):
|
|
v = str(val)
|
|
p = (t_stats.get('result_pos_prob', {}).get(pos_key, {}).get(v, 0) * self.result_weights['time'] +
|
|
w_stats.get('result_pos_prob', {}).get(pos_key, {}).get(v, 0) * self.result_weights['week'] +
|
|
d_stats.get('result_pos_prob', {}).get(pos_key, {}).get(v, 0) * self.result_weights['date'])
|
|
combined[v] = p
|
|
raw_probs['digital_pos'][pos_key] = combined
|
|
|
|
# 2. 位置详情 (单双大小)
|
|
for i in range(10):
|
|
pos_key = f'pos_{i}'
|
|
raw_probs['pos_detail'][pos_key] = {'big_small': {}, 'odd_even': {}}
|
|
for cat in ['big_small', 'odd_even']:
|
|
options = ['大', '小'] if cat == 'big_small' else ['单', '双']
|
|
for opt in options:
|
|
p = (t_stats.get('result_pos_detail_prob', {}).get(pos_key, {}).get(cat, {}).get(opt, 0) * self.result_detail_weights['time'] +
|
|
w_stats.get('result_pos_detail_prob', {}).get(pos_key, {}).get(cat, {}).get(opt, 0) * self.result_detail_weights['week'] +
|
|
d_stats.get('result_pos_detail_prob', {}).get(pos_key, {}).get(cat, {}).get(opt, 0) * self.result_detail_weights['date'])
|
|
raw_probs['pos_detail'][pos_key][cat][opt] = p
|
|
|
|
# 3. 冠亚和
|
|
for val in range(3, 20):
|
|
v = str(val)
|
|
p = (t_stats.get('winner_prob', {}).get(v, 0) * self.winner_weights['time'] +
|
|
w_stats.get('winner_prob', {}).get(v, 0) * self.winner_weights['week'] +
|
|
d_stats.get('winner_prob', {}).get(v, 0) * self.winner_weights['date'])
|
|
raw_probs['winner_prob'][v] = p
|
|
|
|
# 4. GD1 & GD2
|
|
for cat, opts in [('direct_gd1', ['冠亚大', '冠亚小']), ('direct_gd2', ['冠亚单', '冠亚双'])]:
|
|
stat_key = 'GD1_prob' if cat == 'direct_gd1' else 'GD2_prob'
|
|
for opt in opts:
|
|
p = (t_stats.get(stat_key, {}).get(opt, 0) * self.gd_weights['time'] +
|
|
w_stats.get(stat_key, {}).get(opt, 0) * self.gd_weights['week'] +
|
|
d_stats.get(stat_key, {}).get(opt, 0) * self.gd_weights['date'])
|
|
raw_probs[cat][opt] = p
|
|
|
|
# 5. 龙虎
|
|
for i in range(5):
|
|
pos_key = f'pos_{i}'
|
|
raw_probs['glh_pos'][pos_key] = {}
|
|
for opt in ['龙', '虎']:
|
|
p = (t_stats.get('GLH_pos_prob', {}).get(pos_key, {}).get(opt, 0) * self.glh_weights['time'] +
|
|
w_stats.get('GLH_pos_prob', {}).get(pos_key, {}).get(opt, 0) * self.glh_weights['week'] +
|
|
d_stats.get('GLH_pos_prob', {}).get(pos_key, {}).get(opt, 0) * self.glh_weights['date'])
|
|
raw_probs['glh_pos'][pos_key][opt] = p
|
|
|
|
return raw_probs
|