#!/usr/bin/env python3 """Generate trifecta predictions for all Australian Gallops races.""" import json from datetime import datetime # Load race forms with open('all_race_forms.json', 'r') as f: all_races = json.load(f) def score_runner(run, track_cond): """Score a runner 0-100 based on trifecta model factors.""" score = 0 # Current Form: 20% form = run.get('form', '') if form and form != '0': # Prefer shorter recent form strings (better recent performance) score += 8 if len(form) <= 3 else 5 # Speed Ratings: 15% (proxy via prize money and sire) sire = run.get('sire', '').lower() good_sires = ['snitzel', 'headwater', 'tagaloa', 'redoso', 'exceed_and_exceed', 'rulingly'] if any(s in sire for s in good_sires): score += 15 else: score += 8 # Class: 15% (based on raceClass and horse experience) prize = run.get('careerPrizeMoney', '$0.00') try: prize_val = float(prize.replace('$', '').replace(',', '')) if prize_val > 10000: score += 15 elif prize_val > 0: score += 10 else: score += 5 except: score += 5 # Distance Suitability: 10% stats = run.get('stats', {}) dist_stats = stats.get('distance', {}) wins = dist_stats.get('wins', 0) starts = dist_stats.get('starts', 0) if starts > 0 and wins > 0: score += 10 elif starts > 0: score += 5 # Track Suitability: 8% cond_stats = stats.get('synthetic', {}) if 'Synthetic' in track_cond else stats.get('heavy', {}) if 'Heavy' in track_cond else stats.get('soft', {}) if cond_stats.get('wins', 0) > 0: score += 8 elif cond_stats.get('starts', 0) > 0: score += 4 # Track Condition: 8% if cond_stats.get('places', 0) > 0: score += 8 elif cond_stats.get('starts', 0) > 0: score += 4 # Barrier: 5% barrier = run.get('barrier', 8) if barrier <= 3: score += 5 elif barrier <= 6: score += 3 # Jockey: 5% (premium jockeys) jockey = run.get('jockey', '').lower() good_jockeys = ['michael dee', 'blake shinn', 'japan', 'jason collett', 'nash welles', 'nikki deeded', 'jimmy mcarthur'] if any(j in jockey for j in good_jockeys): score += 5 elif any(j in jockey for j in ['ethan brown', 'fred kersley', 'luke nolen', 'jake noonan']): score += 3 # Trainer: 5% trainer = run.get('trainer', '').lower() good_trainers = ['mick price', 'gai waterhouse', 'vernon smith', 'peter snowden', 'chris gaudement'] if any(t in trainer for t in good_trainers): score += 5 elif any(t in trainer for t in ['mark walker', 'arthur pace', 'stephen v brown']): score += 3 # Pace Map Advantage: 5% # Early speed horses prefer speed-favouring tracks age = run.get('age', 3) if age == 3: score += 5 # Young horses often fresh else: score += 3 return score results = [] for race in all_races: track = race.get('track', 'Unknown') race_num = race.get('raceNumber', '?') race_name = race.get('raceName', 'Unknown') distance = race.get('distance', '?') cond = race.get('condition', '') runners = race.get('runners', []) non_scratched = [r for r in runners if not r.get('scratched', False)] scored = [] for runner in non_scratched: score = score_runner(runner, cond) scored.append({ 'number': runner.get('number'), 'name': runner.get('name'), 'score': score, 'jockey': runner.get('jockey') }) scored.sort(key=lambda x: x['score'], reverse=True) results.append({ 'track': track, 'race': race_num, 'name': race_name, 'distance': distance, 'condition': cond, 'predictions': scored[:4] # Top 4 }) # Output summary print("\n=== AUSTRALIAN GALLOPS TRIFECTA PREDICTIONS - TODAY ===\n") for r in results: preds = r['predictions'] top3 = [f"{p['number']}-{p['name']}" for p in preds[:3]] top4 = [f"{p['number']}-{p['name']}" for p in preds[:4]] print(f"{r['track'].upper()} {r['race']} - {r['name']} ({r['distance']}, {r['condition']})") print(f" Top 3: {' / '.join(top3)}") print(f" Top 4: {' / '.join(top4)}") print() # Save full results with open('predictions.json', 'w') as f: json.dump(results, f, indent=2)