Initial commit: existing turf_saas codebase
Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
294
populate_analytics.py
Normal file
294
populate_analytics.py
Normal file
@@ -0,0 +1,294 @@
|
||||
#!/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']}")
|
||||
Reference in New Issue
Block a user