Trifecta-Lab / generate_predictions.py
Brettapps's picture
Upload folder using huggingface_hub (part 21)
e23172f verified
Raw History Blame Contribute Delete
4.52 kB
#!/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)