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