Spaces:
Configuration error
Configuration error
Download generate_predictions.py from Brettapps/Trifecta-Lab: direct link, hf CLI and curl.
- Browser
- Download file 4.52 kB
-
https://huggingface.co/spaces/Brettapps/Trifecta-Lab/resolve/main/generate_predictions.py
- Command line
-
hf download hf://spaces/Brettapps/Trifecta-Lab/generate_predictions.py
-
curl -L -o generate_predictions.py https://huggingface.co/spaces/Brettapps/Trifecta-Lab/resolve/main/generate_predictions.py
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) |