295 lines
8.4 KiB
Python
295 lines
8.4 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Populate Analytics Tables
|
|
Remplit les tables de statistiques depuis les données existantes
|
|
"""
|
|
|
|
import sqlite3
|
|
import os
|
|
from datetime import datetime, timedelta
|
|
|
|
DB_PATH = "/home/h3r7/turf_scraper/turf.db"
|
|
|
|
|
|
def get_db():
|
|
return sqlite3.connect(DB_PATH)
|
|
|
|
|
|
def populate_bet_results():
|
|
"""Remplit bet_results depuis recommendations"""
|
|
conn = get_db()
|
|
c = conn.cursor()
|
|
|
|
# Vérifier si déjà rempli
|
|
c.execute("SELECT COUNT(*) FROM bet_results")
|
|
if c.fetchone()[0] > 0:
|
|
print("✅ bet_results déjà rempli")
|
|
conn.close()
|
|
return
|
|
|
|
# Récupérer depuis recommendations
|
|
c.execute("""
|
|
SELECT date, race_name, type_pari, cheval1, numero1, cote, mise, resultat
|
|
FROM recommendations
|
|
WHERE resultat IS NOT NULL AND resultat != ''
|
|
ORDER BY date
|
|
""")
|
|
|
|
rows = c.fetchall()
|
|
|
|
for row in rows:
|
|
date, race_name, type_pari, cheval1, numero1, cote, mise, resultat = row
|
|
|
|
gain = 0
|
|
if resultat == 'GAGNE':
|
|
gain = float(cote or 1) * float(mise or 1)
|
|
|
|
c2 = conn.cursor()
|
|
c2.execute("""
|
|
INSERT INTO bet_results (date, race_name, type_pari, horse_name, horse_number, cote, mise, resultat, gain, model_source)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
""", (date, race_name, type_pari, cheval1, numero1, cote, mise, resultat, gain, source_reco or 'manual'))
|
|
|
|
conn.commit()
|
|
print(f"✅ {len(rows)} paris ajoutés dans bet_results")
|
|
conn.close()
|
|
|
|
|
|
def populate_daily_stats():
|
|
"""Remplit daily_stats depuis bet_results"""
|
|
conn = get_db()
|
|
c = conn.cursor()
|
|
|
|
# Vérifier si déjà rempli
|
|
c.execute("SELECT COUNT(*) FROM daily_stats")
|
|
if c.fetchone()[0] > 0:
|
|
print("✅ daily_stats déjà rempli")
|
|
conn.close()
|
|
return
|
|
|
|
# Grouper par date
|
|
c.execute("""
|
|
SELECT
|
|
date,
|
|
COUNT(*) as total,
|
|
SUM(CASE WHEN resultat = 'GAGNE' THEN 1 ELSE 0 END) as gagne,
|
|
SUM(mise) as mise,
|
|
SUM(gain) as gain
|
|
FROM bet_results
|
|
GROUP BY date
|
|
ORDER BY date
|
|
""")
|
|
|
|
rows = c.fetchall()
|
|
|
|
for row in rows:
|
|
date, total, gagne, mise, gain = row
|
|
|
|
precision = (gagne / total * 100) if total > 0 else 0
|
|
roi = ((gain - mise) / mise * 100) if mise > 0 else 0
|
|
|
|
c2 = conn.cursor()
|
|
c2.execute("""
|
|
INSERT INTO daily_stats (date, total_bets, bets_gagne, bets_perdu, mise_totale, gain_total, precision_pct, roi_pct)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
""", (date, total, gagne, total - gagne, mise, gain, precision, roi))
|
|
|
|
conn.commit()
|
|
print(f"✅ {len(rows)} jours ajoutés dans daily_stats")
|
|
conn.close()
|
|
|
|
|
|
def populate_stats_by_type():
|
|
"""Remplit stats_by_type depuis bet_results"""
|
|
conn = get_db()
|
|
c = conn.cursor()
|
|
|
|
# Vérifier si déjà rempli
|
|
c.execute("SELECT COUNT(*) FROM stats_by_type")
|
|
if c.fetchone()[0] > 0:
|
|
print("✅ stats_by_type déjà rempli")
|
|
conn.close()
|
|
return
|
|
|
|
# Grouper par date et type
|
|
c.execute("""
|
|
SELECT
|
|
date,
|
|
type_pari,
|
|
COUNT(*) as total,
|
|
SUM(CASE WHEN resultat = 'GAGNE' THEN 1 ELSE 0 END) as gagne,
|
|
SUM(mise) as mise,
|
|
SUM(gain) as gain
|
|
FROM bet_results
|
|
GROUP BY date, type_pari
|
|
ORDER BY date, type_pari
|
|
""")
|
|
|
|
rows = c.fetchall()
|
|
|
|
for row in rows:
|
|
date, type_pari, total, gagne, mise, gain = row
|
|
|
|
precision = (gagne / total * 100) if total > 0 else 0
|
|
roi = ((gain - mise) / mise * 100) if mise > 0 else 0
|
|
|
|
c2 = conn.cursor()
|
|
c2.execute("""
|
|
INSERT INTO stats_by_type (date, type_pari, total_bets, gagne, perdu, mise_totale, gain_total, precision_pct, roi_pct)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
""", (date, type_pari, total, gagne, total - gagne, mise, gain, precision, roi))
|
|
|
|
conn.commit()
|
|
print(f"✅ {len(rows)} lignes ajoutées dans stats_by_type")
|
|
conn.close()
|
|
|
|
|
|
def update_daily_stats():
|
|
"""Met à jour les statistiques quotidiennes (à appeler après chaque nouveau résultat)"""
|
|
conn = get_db()
|
|
c = conn.cursor()
|
|
|
|
# Récupérer les dates sans stats ou avec nouveaux paris
|
|
c.execute("""
|
|
SELECT DISTINCT date FROM bet_results
|
|
WHERE date NOT IN (SELECT date FROM daily_stats)
|
|
ORDER BY date
|
|
""")
|
|
|
|
dates = [r[0] for r in c.fetchall()]
|
|
|
|
for date in dates:
|
|
c.execute("""
|
|
SELECT
|
|
COUNT(*) as total,
|
|
SUM(CASE WHEN resultat = 'GAGNE' THEN 1 ELSE 0 END) as gagne,
|
|
SUM(mise) as mise,
|
|
SUM(gain) as gain
|
|
FROM bet_results
|
|
WHERE date = ?
|
|
""", (date,))
|
|
|
|
row = c.fetchone()
|
|
if row:
|
|
total, gagne, mise, gain = row
|
|
precision = (gagne / total * 100) if total > 0 else 0
|
|
roi = ((gain - mise) / mise * 100) if mise > 0 else 0
|
|
|
|
c.execute("""
|
|
INSERT OR REPLACE INTO daily_stats (date, total_bets, bets_gagne, bets_perdu, mise_totale, gain_total, precision_pct, roi_pct)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
""", (date, total, gagne, total - gagne, mise, gain, precision, roi))
|
|
|
|
conn.commit()
|
|
print(f"✅ {len(dates)} dates mises à jour dans daily_stats")
|
|
conn.close()
|
|
|
|
|
|
def get_stats_from_db(start_date=None, end_date=None):
|
|
"""Récupère les stats depuis la base"""
|
|
conn = get_db()
|
|
c = conn.cursor()
|
|
|
|
if not start_date:
|
|
start_date = (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d')
|
|
if not end_date:
|
|
end_date = datetime.now().strftime('%Y-%m-%d')
|
|
|
|
# Daily stats
|
|
c.execute("""
|
|
SELECT date, total_bets, bets_gagne, bets_perdu, mise_totale, gain_total, precision_pct, roi_pct
|
|
FROM daily_stats
|
|
WHERE date BETWEEN ? AND ?
|
|
ORDER BY date DESC
|
|
""", (start_date, end_date))
|
|
|
|
daily = []
|
|
for row in c.fetchall():
|
|
daily.append({
|
|
'date': row[0],
|
|
'total_bets': row[1],
|
|
'gagne': row[2],
|
|
'perdu': row[3],
|
|
'precision': row[6],
|
|
'mises': row[4],
|
|
'gains': row[5],
|
|
'roi': row[7]
|
|
})
|
|
|
|
# Summary
|
|
c.execute("""
|
|
SELECT
|
|
SUM(total_bets) as total,
|
|
SUM(bets_gagne) as gagne,
|
|
SUM(mise_totale) as mise,
|
|
SUM(gain_total) as gain
|
|
FROM daily_stats
|
|
WHERE date BETWEEN ? AND ?
|
|
""", (start_date, end_date))
|
|
|
|
row = c.fetchone()
|
|
total, gagne, mise, gain = row
|
|
|
|
summary = {
|
|
'total_bets': total or 0,
|
|
'gagne': gagne or 0,
|
|
'perdu': (total or 0) - (gagne or 0),
|
|
'precision': (gagne / total * 100) if total and total > 0 else 0,
|
|
'mise_totale': mise or 0,
|
|
'gain_total': gain or 0,
|
|
'roi': ((gain - mise) / mise * 100) if mise and mise > 0 else 0
|
|
}
|
|
|
|
# By type
|
|
c.execute("""
|
|
SELECT
|
|
type_pari,
|
|
SUM(total_bets) as total,
|
|
SUM(gagne) as gagne,
|
|
SUM(mise_totale) as mise,
|
|
SUM(gain_total) as gain
|
|
FROM stats_by_type
|
|
WHERE date BETWEEN ? AND ?
|
|
GROUP BY type_pari
|
|
""", (start_date, end_date))
|
|
|
|
by_type = {}
|
|
for row in c.fetchall():
|
|
type_pari, total, gagne, mise, gain = row
|
|
roi = ((gain - mise) / mise * 100) if mise > 0 else 0
|
|
precision = (gagne / total * 100) if total > 0 else 0
|
|
|
|
by_type[type_pari] = {
|
|
'count': total,
|
|
'gagne': gagne,
|
|
'mise': mise,
|
|
'gain': gain,
|
|
'roi': roi,
|
|
'precision': precision
|
|
}
|
|
|
|
conn.close()
|
|
|
|
return {
|
|
'period': {'start': start_date, 'end': end_date},
|
|
'summary': summary,
|
|
'daily': daily,
|
|
'by_type': by_type
|
|
}
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print("="*50)
|
|
print("Population des tables analytics")
|
|
print("="*50)
|
|
|
|
populate_bet_results()
|
|
populate_daily_stats()
|
|
populate_stats_by_type()
|
|
|
|
print("\n✅ Tables analytics populées!")
|
|
|
|
# Test
|
|
stats = get_stats_from_db()
|
|
print(f"\nRésumé: {stats['summary']}")
|