public QuinielaResult GetBet(float probability) { /* * VOID = 0, * ONE = 1, * X = 2, * TWO = 4, * ONEX = 3, * TWOX = 6, * ONEXTWO = 7 */ QuinielaResult res = QuinielaResult.VOID; float y1, yX, y2; _getMemberships(probability, out y1, out yX, out y2); if (y1 > 0.0) { res = ( QuinielaResult )(( int )res + ( int )QuinielaResult.ONE); } if (yX > 0.0) { res = (QuinielaResult )(( int )res + ( int )QuinielaResult.X); } if (y2 > 0) { res = ( QuinielaResult )(( int )res + ( int )QuinielaResult.TWO); } return(res); }
static void Main(string[] args) { InitializeLog4net(); // Cargamos la configuracion Log.Info("Cargando configuracion"); Configuration configuration = JsonConvert.DeserializeObject <Configuration>(File.ReadAllText(@"./Configuration.json")); // Cargamos nombres de equipos Log.Info("Cargando nombres de equipos de 'TeamsNames.json'"); var jObject = JObject.Parse(File.ReadAllText(@"./TeamsNames.json")); var jToken = jObject.GetValue("TeamsNames"); Teams.TeamsNames = (Dictionary <string, List <string> >)jToken.ToObject(typeof(Dictionary <string, List <string> >)); Log.Info($"Se han cargado {Teams.TeamsNames.Values.Sum(x => x.Count) } nombres de equipos"); QuinEagleCalculator qc = new QuinEagleCalculator() { configuration = configuration }; qc.Configure(); // Cargamos los emparejamientos Log.Info("Cargando Emparejamientos"); FixtureRequester fr = new FixtureRequester() { QuinielaFixtureURL = configuration.QuinielaFixtureURL }; fr.LoadFixtures(); var fixtures = fr.GetFixtures(); fr.PrintFixtures(); List <Fixture> predictions = new List <Fixture>(); fixtures.ForEach(a => { QuinielaResult qr = QuinielaResult.VOID; Fixture f = new Fixture() { AwayTeam = a.AwayTeam, HomeTeam = a.HomeTeam }; f.Probability = qc.GetResult(a, out qr); f.Result = qr; predictions.Add(f); }); qc.SetMaxDoubleBets(ref predictions); predictions.ForEach(a => Log.Info(a.ToString())); Log.Info($"Media calculada = {predictions.Select( a => a.Probability ).Average()}%"); Console.ReadKey(); }
public float GetResult(Fixture fixture, out QuinielaResult result) { //Fixture res = new Fixture() { HomeTeam = fixture.HomeTeam, AwayTeam = fixture.AwayTeam }; List <Nomio> formula = new List <Nomio>(); _statistics.ForEach(a => formula.Add(new Nomio() { Variable = a.GetStatistic(fixture), Weight = a.Weight })); //res.Probability = formula.Sum(n => n.Variable * n.Weight); //res.Result = _fuzzy.GetBet(res.Probability); float probability = formula.Sum(n => n.Variable * n.Weight); result = _fuzzy.GetBet(probability); return(probability); }
private static char _parseResult(QuinielaResult res) { char r; if (res == QuinielaResult.ONE) { r = '1'; } else if (res == QuinielaResult.X) { r = 'X'; } else if (res == QuinielaResult.TWO) { r = '2'; } else { r = 'E'; } return(r); }
public void GetBet(ref List <Fixture> fixtures) { if (IsSet) { foreach (var f in fixtures) { f.Result = GetBet(f.Probability); } // Ahora recorremos la lista otra vez y cogemos las apuestas dobles // Eliminamos las que esten en los extremos hasta tener solo el numero de doblrd que queremos List <Fixture> dobles = fixtures.Where(a => a.Result == QuinielaResult.ONEX || a.Result == QuinielaResult.TWOX).ToList(); if (dobles.Count() > MaxMultipleBets) { for (int i = 0; i < dobles.Count - MaxMultipleBets; i++) { float y1, yX, y2; Fixture candidata = null; float minimo = float.MaxValue; QuinielaResult valor_destino = QuinielaResult.VOID; dobles.ForEach(a => { _getMemberships(a.Probability, out y1, out yX, out y2); if (a.Result == QuinielaResult.ONEX) { if (Math.Min(y1, yX) < minimo) { minimo = Math.Min(y1, yX); candidata = a; if (y1 <= yX) { valor_destino = QuinielaResult.X; } else if (yX < y1) { valor_destino = QuinielaResult.ONE; } } } else if (a.Result == QuinielaResult.TWOX) { if (Math.Min(y2, yX) < minimo) { minimo = Math.Min(y2, yX); candidata = a; if (y2 <= yX) { valor_destino = QuinielaResult.X; } else if (yX < y2) { valor_destino = QuinielaResult.TWO; } } } }); candidata.Result = valor_destino; } } } else { Log.Warn("Valores difusos no establecidos"); } }
private void ConvertNoceToFixture(HtmlNode node) { var fx = new Fixture(); var equipos = node.SelectSingleNode("td[ @class='col-match cell text-match' ]/div").InnerHtml .Replace(" - ", "-").Replace("<br>", "-") .Split('-'); var hometeam = equipos[0].RemoveDiacritics().ToUpper(); var awayteam = equipos[1].RemoveDiacritics().ToUpper(); fx.HomeTeam = Teams.GetKeyfromName(hometeam); fx.AwayTeam = Teams.GetKeyfromName(awayteam); // Miramos si es un emparejamiento clasico (1,x,2) o de los nuevos (0,1,2,M) var div = node.SelectSingleNode("td[ @class='cell results results-centered' ]/div"); if (div.SelectSingleNode("div[@class='rx']") != null) { var r1 = div.SelectSingleNode("div[@class='r1']"); var rx = div.SelectSingleNode("div[@class='rx']"); var r2 = div.SelectSingleNode("div[@class='r2']"); if (r1.ChildNodes[0].Attributes[0].Value == "result-box active") { fx.Result = QuinielaResult.ONE; } else if (r2.ChildNodes[0].Attributes[0].Value == "result-box active") { fx.Result = QuinielaResult.TWO; } else if (rx.ChildNodes[0].Attributes[0].Value == "result-box active") { fx.Result = QuinielaResult.X; } else { fx.Result = QuinielaResult.VOID; } } else { /* * <div class="results-boxes clearfix" style="float: right;"> * <div class="r0"><span class="result-box "> </span></div> * <div class="r1"><span class="result-box "> </span></div> * <div class="r2"><span class="result-box active"> </span></div> * <div class="rM"><span class="result-box "> </span></div> * <br> * <div class="r0" style="margin-top: 1px !important;"><span class="result-box "> </span></div> * <div class="r1" style="margin-top: 1px !important;"><span class="result-box "> </span></div> * <div class="r2" style="margin-top: 1px !important;"><span class="result-box active"> </span></div> * <div class="rM" style="margin-top: 1px !important;"><span class="result-box "> </span></div> * </div> */ var r0s = div.ChildNodes.Where(a => a.Attributes.Count > 0 && a.Attributes[0].Value == "r0").ToList(); var r1s = div.ChildNodes.Where(a => a.Attributes.Count > 0 && a.Attributes[0].Value == "r1").ToList(); var r2s = div.ChildNodes.Where(a => a.Attributes.Count > 0 && a.Attributes[0].Value == "r2").ToList(); var rMs = div.ChildNodes.Where(a => a.Attributes.Count > 0 && a.Attributes[0].Value == "rM").ToList(); int local = -1; int visita = -1; // tratamos de convertir una apuesta del tipo (0,1,2,M) en (1,x,2) if (r0s[0].ChildNodes[0].Attributes[0].Value == "result-box active") { local = 0; } if (r0s[1].ChildNodes[0].Attributes[0].Value == "result-box active") { visita = 0; } if (r1s[0].ChildNodes[0].Attributes[0].Value == "result-box active") { local = 1; } if (r1s[1].ChildNodes[0].Attributes[0].Value == "result-box active") { visita = 1; } if (r2s[0].ChildNodes[0].Attributes[0].Value == "result-box active") { local = 2; } if (r2s[1].ChildNodes[0].Attributes[0].Value == "result-box active") { visita = 2; } if (rMs[0].ChildNodes[0].Attributes[0].Value == "result-box active") { local = 3; } if (rMs[1].ChildNodes[0].Attributes[0].Value == "result-box active") { visita = 3; } QuinielaResult r = QuinielaResult.VOID; if (local > -1 && visita > -1) { if (local == visita) { r = QuinielaResult.X; } else if (local > visita) { r = QuinielaResult.ONE; } else if (local < visita) { r = QuinielaResult.TWO; } } fx.Result = r; } _Fixtures.Add(fx); }
public void LoadFixtures() { var html = new WebClient().DownloadString(QuinielaFixtureURL); var doc = new HtmlDocument(); doc.LoadHtml(html); var nodes = doc.DocumentNode.SelectNodes("//table[@class='general-table estimate-table upcoming-table']/tr").Skip(3); foreach (var node in nodes) { Fixture fx = new Fixture(); var equipos = node.SelectSingleNode("td[ @class='col-match cell text-match' ]/div").InnerHtml .Replace(" - ", "-").Replace("<br>", "-") .Split('-'); fx.HomeTeam = equipos[0]; fx.AwayTeam = equipos[1]; // Miramos si es un emparejamiento clasico (1,x,2) o de los nuevos (0,1,2,M) var div = node.SelectSingleNode("td[ @class='cell results results-centered' ]/div"); if (div.SelectSingleNode("div[@class='rx']") != null) { var r1 = div.SelectSingleNode("div[@class='r1']"); var rx = div.SelectSingleNode("div[@class='rx']"); var r2 = div.SelectSingleNode("div[@class='r2']"); if (r1.ChildNodes[0].Attributes[0].Value == "result-box active") { fx.Result = QuinielaResult.ONE; } else if (r2.ChildNodes[0].Attributes[0].Value == "result-box active") { fx.Result = QuinielaResult.TWO; } else if (rx.ChildNodes[0].Attributes[0].Value == "result-box active") { fx.Result = QuinielaResult.X; } else { fx.Result = QuinielaResult.VOID; } } else { var r0s = div.SelectNodes("//div[@class='r0']"); var r1s = div.SelectNodes("//div[@class='r1']"); var r2s = div.SelectNodes("//div[@class='r2']"); var rms = div.SelectNodes("//div[@class='rM']"); int local = -1; int visita = -1; // tratamos de convertir una apuesta del tipo (0,1,2,M) en (1,x,2) if (r0s[0].ChildNodes[0].Attributes[0].Value == "result-box active") { local = 0; } if (r0s[1].ChildNodes[0].Attributes[0].Value == "result-box active") { visita = 0; } if (r1s[0].ChildNodes[0].Attributes[0].Value == "result-box active") { local = 1; } if (r1s[1].ChildNodes[0].Attributes[0].Value == "result-box active") { visita = 1; } if (r2s[0].ChildNodes[0].Attributes[0].Value == "result-box active") { local = 2; } if (r2s[1].ChildNodes[0].Attributes[0].Value == "result-box active") { visita = 2; } if (rms[0].ChildNodes[0].Attributes[0].Value == "result-box active") { local = 3; } if (rms[1].ChildNodes[0].Attributes[0].Value == "result-box active") { visita = 3; } QuinielaResult r = QuinielaResult.VOID; if (local > -1 && visita > -1) { if (local == visita) { r = QuinielaResult.X; } else if (local > visita) { r = QuinielaResult.ONE; } else if (local < visita) { r = QuinielaResult.TWO; } } fx.Result = r; } _Fixtures.Add(fx); } }
/// <param name="args"></param> public static void Main(string[] args) { // Log4Net InitializeLog4net(); // Cargamos la configuracion Log.Info("Cargando configuracion"); Configuration configuration = JsonConvert.DeserializeObject <Configuration>(File.ReadAllText(@"./Configuration.json")); // Cargamos nombres de equipos Log.Info("Cargando nombres de equipos de 'TeamsNames.json'"); var jObject = JObject.Parse(File.ReadAllText(@"./TeamsNames.json")); var jToken = jObject.GetValue("TeamsNames"); Teams.TeamsNames = (Dictionary <string, List <string> >)jToken.ToObject(typeof(Dictionary <string, List <string> >)); Log.Info($"Se han cargado {Teams.TeamsNames.Values.Sum(x => x.Count) } nombres de equipos"); QuinEagleCalculator qc = new QuinEagleCalculator() { configuration = configuration }; qc.Configure(); // Cargamos todos los partidos en una lista List <Match> matches = _getMatchesStoredDB(qc); // Seleccionamos todas las jornadas y años que tenemos partidos //List<JourneyDateClassification> journeys = matches.Select(a => new JourneyDateClassification(){ journey = a.Journey, season = a.season }) // .Distinct(new JourneyDateClassification.DistinctJourneyDateClassificationComparer()) // .ToList(); // Cogemos todas las clasificaciones y las almacenamos para estas jornadas de estos años //Dictionary<int, Dictionary<LeagueEnum, LeagueTable>> classifications = _getClassifications(journeys, configuration); List <Match> predictions = new List <Match>(); matches.ForEach(m => { Match match = m.Clone(); QuinielaResult qr = QuinielaResult.VOID; match.fixture.Probability = qc.GetResult(m.fixture, out qr); match.fixture.Result = qr; predictions.Add(match); }); /* * int aciertos = matches.Where(a => predictions.Any( * b => b.fixture.AwayTeam == a.fixture.AwayTeam && * b.fixture.HomeTeam == a.fixture.HomeTeam && * b.fixture.Journey == a.fixture.Journey && * (b.fixture.Result & a.fixture.Result) != QuinielaResult.VOID)).Count(); */ var aciertos = predictions.Where(a => matches.Any( b => b.fixture.AwayTeam == a.fixture.AwayTeam && b.fixture.HomeTeam == a.fixture.HomeTeam && b.fixture.Journey == a.fixture.Journey && (b.fixture.Result & a.fixture.Result) != QuinielaResult.VOID)).ToList(); Log.Info("TOTALES"); Log.Info(matches.Count); Log.Info($"1: {matches.Count( a => a.fixture.Result == QuinielaResult.ONE )} || {( float )matches.Count( a => a.fixture.Result == QuinielaResult.ONE ) / ( float )matches.Count * 100f } %"); Log.Info($"X: {matches.Count( a => a.fixture.Result == QuinielaResult.X )} || {( float )matches.Count( a => a.fixture.Result == QuinielaResult.X ) / ( float )matches.Count * 100f } %"); Log.Info($"2: {matches.Count( a => a.fixture.Result == QuinielaResult.TWO )} || {( float )matches.Count( a => a.fixture.Result == QuinielaResult.TWO ) / ( float )matches.Count * 100f } %"); Log.Info("---------------"); Log.Info("PREDICCIONES"); Log.Info($"1: {predictions.Count( a => a.fixture.Result == QuinielaResult.ONE )} || {( float )predictions.Count( a => a.fixture.Result == QuinielaResult.ONE ) / ( float )predictions.Count * 100f } %"); Log.Info($"X: {predictions.Count( a => a.fixture.Result == QuinielaResult.X )} || {( float )predictions.Count( a => a.fixture.Result == QuinielaResult.X ) / ( float )predictions.Count * 100f } %"); Log.Info($"2: {predictions.Count( a => a.fixture.Result == QuinielaResult.TWO )} || {( float )predictions.Count( a => a.fixture.Result == QuinielaResult.TWO ) / ( float )predictions.Count * 100f } %"); Log.Info("---------------"); Log.Info($"Aciertos {aciertos.Count} de {predictions.Count}"); Log.Info($"Total: {(float)aciertos.Count / (float)predictions.Count * 100f} %"); Log.Info("Aciertos por prediccion"); Log.Info($"1: {aciertos.Count( a => a.fixture.Result == QuinielaResult.ONE )} || {( float )aciertos.Count( a => a.fixture.Result == QuinielaResult.ONE ) / ( float )aciertos.Count * 100f } %"); Log.Info($"X: {aciertos.Count( a => a.fixture.Result == QuinielaResult.X )} || {( float )aciertos.Count( a => a.fixture.Result == QuinielaResult.X ) / ( float )aciertos.Count * 100f } %"); Log.Info($"2: {aciertos.Count( a => a.fixture.Result == QuinielaResult.TWO )} || {( float )aciertos.Count( a => a.fixture.Result == QuinielaResult.TWO ) / ( float )aciertos.Count * 100f } %"); Log.Info("---------------"); Log.Info("Aciertos por predicciones"); Log.Info($"1: {aciertos.Count( a => a.fixture.Result == QuinielaResult.ONE )} aciertos de {predictions.Count(a => (a.fixture.Result & QuinielaResult.ONE) != QuinielaResult.VOID)} predicciones || {( float )aciertos.Count( a => a.fixture.Result == QuinielaResult.ONE ) / ( float )predictions.Count( a => ( a.fixture.Result & QuinielaResult.ONE ) != QuinielaResult.VOID ) * 100f } %"); Log.Info($"X: {aciertos.Count( a => a.fixture.Result == QuinielaResult.X )} aciertos de {predictions.Count( a => ( a.fixture.Result & QuinielaResult.X ) != QuinielaResult.VOID )} predicciones || {( float )aciertos.Count( a => a.fixture.Result == QuinielaResult.X ) / ( float )predictions.Count( a => ( a.fixture.Result & QuinielaResult.X ) != QuinielaResult.VOID ) * 100f } %"); Log.Info($"2: {aciertos.Count( a => a.fixture.Result == QuinielaResult.TWO )} aciertos de {predictions.Count( a => ( a.fixture.Result & QuinielaResult.TWO ) != QuinielaResult.VOID )} predicciones || {( float )aciertos.Count( a => a.fixture.Result == QuinielaResult.TWO ) / ( float )predictions.Count( a => ( a.fixture.Result & QuinielaResult.TWO ) != QuinielaResult.VOID ) * 100f } %"); Log.Info("---------------"); Log.Info("Predicciones por resultado real"); Log.Info($"1: {predictions.Count( a => (a.fixture.Result & QuinielaResult.ONE) != QuinielaResult.VOID)} predicciones de {matches.Count( a => a.fixture.Result == QuinielaResult.ONE )} resultados reales || {( float )predictions.Count( a => a.fixture.Result == QuinielaResult.ONE ) / ( float )matches.Count( a => a.fixture.Result == QuinielaResult.ONE ) * 100f } %"); Log.Info($"X: {predictions.Count( a => ( a.fixture.Result & QuinielaResult.X ) != QuinielaResult.VOID )} predicciones de {matches.Count( a => a.fixture.Result == QuinielaResult.X )} resultados reales || {( float )predictions.Count( a => a.fixture.Result == QuinielaResult.X ) / ( float )matches.Count( a => a.fixture.Result == QuinielaResult.X ) * 100f } %"); Log.Info($"2: {predictions.Count( a => ( a.fixture.Result & QuinielaResult.TWO ) != QuinielaResult.VOID )} predicciones de {matches.Count( a => a.fixture.Result == QuinielaResult.TWO )} resultados reales || {( float )predictions.Count( a => a.fixture.Result == QuinielaResult.TWO ) / ( float )matches.Count( a => a.fixture.Result == QuinielaResult.TWO ) * 100f } %"); Log.Debug("---------------"); Log.Debug("Valores de 1s"); var Puntos1 = predictions.Where(a => matches.Any(b => b.fixture.AwayTeam == a.fixture.AwayTeam && b.fixture.HomeTeam == a.fixture.HomeTeam && b.fixture.Journey == a.fixture.Journey && b.fixture.Result == QuinielaResult.ONE)).ToList();; Puntos1.ForEach(a => Log.Debug(a.fixture.Probability)); Log.Debug("---------------"); Log.Debug("Valores de Xs"); var PuntosX = predictions.Where(a => matches.Any(b => b.fixture.AwayTeam == a.fixture.AwayTeam && b.fixture.HomeTeam == a.fixture.HomeTeam && b.fixture.Journey == a.fixture.Journey && b.fixture.Result == QuinielaResult.X)).ToList();; PuntosX.ForEach(a => Log.Debug(a.fixture.Probability)); Log.Debug("---------------"); Log.Debug("Valores de 2s"); var Puntos2 = predictions.Where(a => matches.Any(b => b.fixture.AwayTeam == a.fixture.AwayTeam && b.fixture.HomeTeam == a.fixture.HomeTeam && b.fixture.Journey == a.fixture.Journey && b.fixture.Result == QuinielaResult.TWO)).ToList();; Puntos2.ForEach(a => Log.Debug(a.fixture.Probability)); Console.ReadKey(); }