Score Journée
77.0
Très bon ⭐⭐
Multiplicateur Lunaire
×1.449
Waning Gibbous 95.1%
Meilleur Créneau
06:30
Minor 2 + Golden Hour
Heures favorables ≥60
16/24
67% de la journée
📊 Scores Horaires Ajustés × lune
🎣 Créneaux par Score

🧮 Les 7 Formules

① Multiplicateur Lunaire

Pondère l'activité selon phase et illumination. Nouvelle/pleine lune = alignement gravitationnel maximal.

base = 1 + 0.4 × illumination Waning/Waxing Gibbous → × 1.05 Full Moon / New Moon → × 1.10 clamp(base, 1.0, 1.60)

② Score Créneau Solunar

Major (2h) = 80pts, Minor (1h) = 60pts. Overlap avec événement solaire (sunrise/transit/sunset) → +20.

base = MAJOR ? 80 : 60 if overlap(créneau, solar_event): base = min(base + 20, 100) score = clamp(base × lunar_mult, 100)

③ Golden Hours Solaires

Lumière rasante = prédateurs avantagés. 1h avant lever + 1.5h après, miroir au coucher.

morning = [sunrise-0.5h, sunrise+1.5h] evening = [sunset-1.5h, sunset+0.5h] golden_bonus = ×1.15 si overlap

④ Score Horaire Ajusté

Combine score brut API, multiplicateur lunaire et bonus golden hour en score final par heure.

gbonus = 1.15 if golden_hour else 1.0 score = base × lunar_mult × gbonus clamp(score, 0, 100)

⑤ Score Global Journée

Formule pondérée combinant 4 dimensions : rating global, moyenne horaire, créneau peak, densité.

W1=(day/5×100)×0.30 ← rating W2=mean(h)×mult ×0.25 ← horaire W3=best_score ×0.30 ← peak W4=(%h≥60×100) ×0.15 ← densité

⑥ Synergy Marée (Bonus)

Créneau solunar + marée haute/basse (±3h) → bonus d'activité. Courants = déplacement des poissons.

ov = overlap(sol, [tide±3h]) if ov > 1h → bonus +25 elif ov > 0 → bonus +15 else → bonus 0

⑦ Qualité (Label)

Conversion du score numérique en label lisible. Seuils empiriques basés sur retours de pêcheurs.

≥ 80 → "Excellent 🏆" ≥ 65 → "Très bon ⭐⭐" ≥ 50 → "Bon ✅" ≥ 35 → "Moyen ⚠️" < 35 → "Faible ❌"
🐍 Exemple d'intégration FastAPI Python
# pip install fishing_forecast from fishing_forecast import SolunarData, analyze_fishing_day import requests # 1. Appel API Solunar (gratuit, sans clé API) raw = requests.get(f"https://api.solunar.org/solunar/44.84,-0.58,20260403,1").json() # 2. Analyse complète (marées optionnelles) result = analyze_fishing_day( SolunarData(**raw), high_tide_dec=14.5, # marée haute à 14h30 low_tide_dec=8.2 # marée basse à 8h12 ) # 3. Endpoint FastAPI @app.get("/fishing/forecast") async def forecast(lat: float, lon: float, date: str): raw = requests.get(f"https://api.solunar.org/solunar/{lat},{lon},{date},1").json() r = analyze_fishing_day(SolunarData(**raw)) return {"score": r.global_score, "quality": r.day_quality, "best": r.best_window.start_str, "windows": r.all_windows}