Saving result as csv, upgraded program structure, visualisation implemented
This commit is contained in:
parent
8cbb72de73
commit
93331fc4b6
184
main.py
184
main.py
@ -1,7 +1,9 @@
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
import skfuzzy as fuzz
|
import skfuzzy as fuzz
|
||||||
|
from skfuzzy import control as ctrl
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
from read_data import get_leagues_data
|
from read_data import get_leagues_data
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
# https://pythonhosted.org/scikit-fuzzy/auto_examples/plot_tipping_problem.html
|
# https://pythonhosted.org/scikit-fuzzy/auto_examples/plot_tipping_problem.html
|
||||||
|
|
||||||
@ -157,7 +159,7 @@ def defineRules():
|
|||||||
global teamsCfL_min_level, teamsCfL_mid_level, teamsCfL_max_level
|
global teamsCfL_min_level, teamsCfL_mid_level, teamsCfL_max_level
|
||||||
global score_tragic, score_bad, score_moderate, score_good, score_best, unv_score
|
global score_tragic, score_bad, score_moderate, score_good, score_best, unv_score
|
||||||
|
|
||||||
# OR
|
# OR zmienić na AND (bo Or wybija wysokie wartości)
|
||||||
active_rule1 = np.fmax(clubs_some_level,
|
active_rule1 = np.fmax(clubs_some_level,
|
||||||
np.fmax(clubs_few_level,
|
np.fmax(clubs_few_level,
|
||||||
np.fmax(goals_few_level,
|
np.fmax(goals_few_level,
|
||||||
@ -239,18 +241,170 @@ def defineRules():
|
|||||||
score_activation = fuzz.interp_membership(unv_score, aggregated_rules, score) # for plot
|
score_activation = fuzz.interp_membership(unv_score, aggregated_rules, score) # for plot
|
||||||
return score_activation
|
return score_activation
|
||||||
|
|
||||||
|
class LeagueController:
|
||||||
|
clubs = None
|
||||||
|
goals = None
|
||||||
|
avgValue = None
|
||||||
|
players = None
|
||||||
|
teamsChL = None
|
||||||
|
teamsEuL = None
|
||||||
|
teamsCfL = None
|
||||||
|
score = None
|
||||||
|
|
||||||
|
rule1 = None
|
||||||
|
rule2 = None
|
||||||
|
rule3 = None
|
||||||
|
rule4 = None
|
||||||
|
rule5 = None
|
||||||
|
|
||||||
|
league_ctrl = None
|
||||||
|
league_system = None
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
# Universes for variables
|
||||||
|
self.clubs = ctrl.Antecedent(np.arange(2, 31, 1), 'clubs')
|
||||||
|
self.goals = ctrl.Antecedent(np.arange(0.99, 5.01, 0.01), 'goals')
|
||||||
|
self.avgValue = ctrl.Antecedent(np.arange(0.01, 500.01, 0.01), 'avgValue')
|
||||||
|
self.players = ctrl.Antecedent(np.arange(0, 101, 1), 'players')
|
||||||
|
self.teamsChL = ctrl.Antecedent(np.arange(0, 6, 1), 'teamsChL')
|
||||||
|
self.teamsEuL = ctrl.Antecedent(np.arange(0, 6, 1), 'teamsEuL')
|
||||||
|
self.teamsCfL = ctrl.Antecedent(np.arange(0, 6, 1), 'teamsCfL')
|
||||||
|
# Result score universum
|
||||||
|
self.score = ctrl.Consequent(np.arange(0, 101, 1), 'score')
|
||||||
|
|
||||||
|
# Membership Functions
|
||||||
|
# trimf - triangular function
|
||||||
|
# trapmf - trapezoidal function
|
||||||
|
self.clubs['few'] = fuzz.trapmf(self.clubs.universe, [2, 2, 5, 8])
|
||||||
|
self.clubs['some'] = fuzz.trapmf(self.clubs.universe, [3, 6, 9, 12])
|
||||||
|
self.clubs['several'] = fuzz.trapmf(self.clubs.universe, [8, 11, 15, 18])
|
||||||
|
self.clubs['many'] = fuzz.trapmf(self.clubs.universe, [15, 18, 30, 30])
|
||||||
|
|
||||||
|
self.goals['few'] = fuzz.trapmf(self.goals.universe, [1.0, 1.0, 2.0, 3.0])
|
||||||
|
self.goals['moderate'] = fuzz.trimf(self.goals.universe, [2.5, 3.0, 3.5])
|
||||||
|
self.goals['many'] = fuzz.trapmf(self.goals.universe, [3.0, 3.5, 5.0, 5.0])
|
||||||
|
|
||||||
|
self.avgValue['vpoor'] = fuzz.trapmf(self.avgValue.universe, [0.01, 0.01, 1.0, 2.0])
|
||||||
|
self.avgValue['poor'] = fuzz.trimf(self.avgValue.universe, [1.0, 5.0, 15.0])
|
||||||
|
self.avgValue['mpoor'] = fuzz.trimf(self.avgValue.universe, [7.5, 20.0, 50.0])
|
||||||
|
self.avgValue['moderate'] = fuzz.trimf(self.avgValue.universe, [20.0, 50.0, 100.0])
|
||||||
|
self.avgValue['mrich'] = fuzz.trimf(self.avgValue.universe, [50.0, 100.0, 175.0])
|
||||||
|
self.avgValue['rich'] = fuzz.trimf(self.avgValue.universe, [150.0, 200.0, 275.0])
|
||||||
|
self.avgValue['vrich'] = fuzz.trapmf(self.avgValue.universe, [200.0, 300.0, 500.0, 500.0])
|
||||||
|
|
||||||
|
self.players['none'] = fuzz.trimf(self.players.universe, [0, 0, 1])
|
||||||
|
self.players['few'] = fuzz.trapmf(self.players.universe, [1, 5, 10, 15])
|
||||||
|
self.players['moderate'] = fuzz.trapmf(self.players.universe, [10, 15, 20, 25])
|
||||||
|
self.players['many'] = fuzz.trapmf(self.players.universe, [20, 25, 100, 100])
|
||||||
|
|
||||||
|
self.teamsChL['min'] = fuzz.trapmf(self.teamsChL.universe, [0, 0, 1, 2])
|
||||||
|
self.teamsChL['mid'] = fuzz.trapmf(self.teamsChL.universe, [1, 2, 3, 4])
|
||||||
|
self.teamsChL['max'] = fuzz.trapmf(self.teamsChL.universe, [3, 4, 5, 5])
|
||||||
|
|
||||||
|
self.teamsEuL['min'] = fuzz.trimf(self.teamsEuL.universe, [0, 0, 1])
|
||||||
|
self.teamsEuL['mid'] = fuzz.trimf(self.teamsEuL.universe, [0, 1, 2])
|
||||||
|
self.teamsEuL['max'] = fuzz.trapmf(self.teamsEuL.universe, [1, 2, 5, 5])
|
||||||
|
|
||||||
|
self.teamsCfL['min'] = fuzz.trapmf(self.teamsCfL.universe, [0, 0, 1, 2])
|
||||||
|
self.teamsCfL['mid'] = fuzz.trimf(self.teamsCfL.universe, [1, 2, 3])
|
||||||
|
self.teamsCfL['max'] = fuzz.trapmf(self.teamsCfL.universe, [2, 3, 5, 5])
|
||||||
|
|
||||||
|
self.score['tragic'] = fuzz.trapmf(self.score.universe, [0, 0, 15, 25])
|
||||||
|
self.score['bad'] = fuzz.trapmf(self.score.universe, [15, 25, 35, 45])
|
||||||
|
self.score['moderate'] = fuzz.trapmf(self.score.universe, [35, 45, 55, 65])
|
||||||
|
self.score['good'] = fuzz.trapmf(self.score.universe, [55, 65, 75, 85])
|
||||||
|
self.score['best'] = fuzz.trapmf(self.score.universe, [75, 85, 100, 100])
|
||||||
|
|
||||||
|
# FuzzyRules
|
||||||
|
self.rule1 = ctrl.Rule(self.clubs['some'] | self.clubs['few'] | self.goals['few'] | self.avgValue['mpoor'] | self.avgValue['poor'] | self.avgValue['vpoor'] | self.players['none'] | self.teamsChL['min'] | self.teamsEuL['min'] | self.teamsCfL['max'] | self.teamsCfL['mid'], self.score['tragic'])
|
||||||
|
self.rule2 = ctrl.Rule(self.clubs['several'] | self.clubs['some'] | self.clubs['few'] | self.goals['moderate'] | self.goals['few'] | self.avgValue['moderate'] | self.avgValue['mpoor'] | self.avgValue['poor'] | self.players['few'] | self.players['none'] | self.teamsChL['min'] | self.teamsEuL['min'] | self.teamsCfL['max'] | self.teamsCfL['mid'], self.score['bad'])
|
||||||
|
self.rule3 = ctrl.Rule(self.clubs['several'] | self.clubs['some'] | self.goals['moderate'] | self.avgValue['mrich'] | self.avgValue['moderate'] | self.avgValue['mpoor'] | self.players['moderate'] | self.players['few'] | self.teamsChL['mid'] | self.teamsChL['min'] | self.teamsEuL['mid'] | self.teamsEuL['min'] | self.teamsCfL['max'] | self.teamsCfL['mid'], self.score['moderate'])
|
||||||
|
self.rule4 = ctrl.Rule(self.clubs['many'] | self.clubs['several'] | self.goals['many'] | self.goals['moderate'] | self.avgValue['vrich'] | self.avgValue['rich'] | self.avgValue['mrich'] | self.players['many'] | self.players['moderate'] | self.teamsChL['mid'] | self.teamsEuL['mid'] | self.teamsCfL['mid'], self.score['good'])
|
||||||
|
self.rule5 = ctrl.Rule(self.clubs['many'] | self.goals['many'] | self.avgValue['vrich'] | self.players['many'] | self.teamsChL['max'] | self.teamsEuL['max'] | self.teamsCfL['min'], self.score['best'])
|
||||||
|
|
||||||
|
self.league_ctrl = ctrl.ControlSystem([self.rule1, self.rule2, self.rule3, self.rule4, self.rule5])
|
||||||
|
self.league_system = ctrl.ControlSystemSimulation(self.league_ctrl)
|
||||||
|
|
||||||
|
def getScore(self, values):
|
||||||
|
self.league_system.input['clubs'] = values['clubs']
|
||||||
|
self.league_system.input['goals'] = values['goalsPerMatch']
|
||||||
|
self.league_system.input['avgValue'] = values['avgMarketValueInMln']
|
||||||
|
self.league_system.input['players'] = values['famousPlayers']
|
||||||
|
self.league_system.input['teamsChL'] = values['teamsInChampionsLeague']
|
||||||
|
self.league_system.input['teamsEuL'] = values['teamsInEuropaLeague']
|
||||||
|
self.league_system.input['teamsCfL'] = values['teamsInConferenceLeague']
|
||||||
|
|
||||||
|
self.league_system.compute()
|
||||||
|
|
||||||
|
return self.league_system.output['score']
|
||||||
|
|
||||||
|
#score.view(sim=league_system)
|
||||||
|
|
||||||
|
def displayMembershipFunctionPlot(self, function_id):
|
||||||
|
if function_id == 0:
|
||||||
|
self.score.view()
|
||||||
|
elif function_id == 1:
|
||||||
|
self.clubs.view()
|
||||||
|
elif function_id == 2:
|
||||||
|
self.goals.view()
|
||||||
|
elif function_id == 3:
|
||||||
|
self.avgValue.view()
|
||||||
|
elif function_id == 4:
|
||||||
|
self.players.view()
|
||||||
|
elif function_id == 5:
|
||||||
|
self.teamsChL.view()
|
||||||
|
elif function_id == 6:
|
||||||
|
self.teamsEuL.view()
|
||||||
|
elif function_id == 7:
|
||||||
|
self.teamsCfL.view()
|
||||||
|
|
||||||
|
def displayRulePlot(self, rule_id):
|
||||||
|
if rule_id == 1:
|
||||||
|
self.rule1.view()
|
||||||
|
elif rule_id == 2:
|
||||||
|
self.rule2.view()
|
||||||
|
elif rule_id == 3:
|
||||||
|
self.rule3.view()
|
||||||
|
elif rule_id == 4:
|
||||||
|
self.rule4.view()
|
||||||
|
elif rule_id == 5:
|
||||||
|
self.rule5.view()
|
||||||
|
|
||||||
|
def displayControllerResultPlot(self):
|
||||||
|
self.score.view(sim=self.league_system)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
initFuzzyMembershipFunctions()
|
league_name_col = []
|
||||||
|
league_score_col = []
|
||||||
|
# initFuzzyMembershipFunctions()
|
||||||
|
controller = LeagueController()
|
||||||
data_source = None
|
data_source = None
|
||||||
|
function_rule_result = None
|
||||||
|
function_id = None
|
||||||
|
rule_id = None
|
||||||
|
view_plot = None
|
||||||
|
data_save = None
|
||||||
while not(data_source == '1' or data_source == '2'):
|
while not(data_source == '1' or data_source == '2'):
|
||||||
data_source = input('Wpisz 1 by wczytać dane z pliku lub 2 by wpisać dane z konsoli:\n')
|
data_source = input('Wpisz 1 by wczytać dane z pliku lub 2 by wpisać dane z konsoli:\n')
|
||||||
if data_source == '1':
|
if data_source == '1':
|
||||||
leagues_data = get_leagues_data('leagues.csv')
|
leagues_data = get_leagues_data('leagues.csv')
|
||||||
for league in leagues_data:
|
for league in leagues_data:
|
||||||
activateFuzzyMembershipFunctions(league)
|
#activateFuzzyMembershipFunctions(league)
|
||||||
result = defineRules()
|
#result = defineRules()
|
||||||
|
result = controller.getScore(league)
|
||||||
print(f"{league['leagueName']} score is: {result}")
|
print(f"{league['leagueName']} score is: {result}")
|
||||||
|
league_name_col.append(league['leagueName'])
|
||||||
|
league_score_col.append(result)
|
||||||
|
data_save = input('Wpisz 1 by zapisać dane do pliku lub dowolny klawisz żeby kontynuować:\n')
|
||||||
|
if data_save == '1':
|
||||||
|
file_name = input('Podaj nazwę pliku:\n')
|
||||||
|
file_name += ".csv"
|
||||||
|
d = {'League':league_name_col,'Score':league_score_col}
|
||||||
|
df = pd.DataFrame(d)
|
||||||
|
df.to_csv(file_name, index=False)
|
||||||
|
print('Wyniki zostały zapisane w pliku csv w folderze programu')
|
||||||
else:
|
else:
|
||||||
league = {'leagueName': input('Podaj nazwę ligi:\n'), 'country': input('Podaj kraj ligi:\n'),
|
league = {'leagueName': input('Podaj nazwę ligi:\n'), 'country': input('Podaj kraj ligi:\n'),
|
||||||
'clubs': input('Podaj liczbę klubów grających w lidze:\n'),
|
'clubs': input('Podaj liczbę klubów grających w lidze:\n'),
|
||||||
@ -260,8 +414,24 @@ if __name__ == "__main__":
|
|||||||
'teamsInEuropaLeague': input('Podaj liczbę klubów grających w Lidze Europy:\n'),
|
'teamsInEuropaLeague': input('Podaj liczbę klubów grających w Lidze Europy:\n'),
|
||||||
'teamsInConferenceLeague': input('Podaj liczbę klubów grających w Lidze Konferencji:\n'),
|
'teamsInConferenceLeague': input('Podaj liczbę klubów grających w Lidze Konferencji:\n'),
|
||||||
'famousPlayers': input('Podaj liczbę sławnych piłkarzy:\n')}
|
'famousPlayers': input('Podaj liczbę sławnych piłkarzy:\n')}
|
||||||
activateFuzzyMembershipFunctions(league)
|
# activateFuzzyMembershipFunctions(league)
|
||||||
result = defineRules()
|
# result = defineRules()
|
||||||
|
result = controller.getScore(league)
|
||||||
print(f"{league['leagueName']} score is: {result}")
|
print(f"{league['leagueName']} score is: {result}")
|
||||||
|
view_plot = input('Wpisz 1 jeżeli chcesz obejrzeć wykresy funkcji i reguł dla ostatnio sprawdzanej ligi lub dowolny klawisz żeby kontynuować:\n')
|
||||||
|
if view_plot == '1':
|
||||||
|
while (function_rule_result != '0'):
|
||||||
|
function_rule_result = input('Wybierz rodzaj wykresu:\n1 - wykresy funkcji przynależności\n2 - wykresy reguł\n3 - wykres wyniku kontrolera\n0 - skończ wizualizację\n')
|
||||||
|
if function_rule_result == "1":
|
||||||
|
while (function_id != '8'):
|
||||||
|
function_id = input('Wybierz funkcje przynależności:\n0 - funkcje punktów atrakcyjności ligi\n1 - funkcje klubów w lidze\n2 - funkcje średniej ilości golów\n3 - funkcje średniej wartości rynkowej\n4 - funkcje ilości słynnych zawodników\n5 - funkcje drużyn w lidze mistrzów\n6 - funkcję drużyn w lidze europy\n7 - funkcję drużyn w lidze konfederacji\n8 - powrót do poprzedniego menu\n')
|
||||||
|
if function_id == "0" or function_id == "1" or function_id == "2" or function_id == "3" or function_id == "4" or function_id == "5" or function_id == "6" or function_id == "7":
|
||||||
|
controller.displayMembershipFunctionPlot(int(function_id))
|
||||||
|
elif function_rule_result == "2":
|
||||||
|
while (rule_id != '6'):
|
||||||
|
rule_id = input('Wybierz regułę:\n1 - reguła dla tragicznych lig\n2 - reguła dla słabych lig\n3 - reguła dla przeciętnych lig\n4 - reguła dla dobrych lig\n5 - reguła dla najlepszych lig\n6 - powrót do poprzedniego menu\n')
|
||||||
|
if rule_id == "1" or rule_id == "2" or rule_id == "3" or rule_id == "4" or rule_id == "5":
|
||||||
|
controller.displayRulePlot(int(rule_id))
|
||||||
|
elif function_rule_result == "3":
|
||||||
|
controller.displayControllerResultPlot()
|
||||||
#plt.show()
|
#plt.show()
|
54
res.csv
54
res.csv
@ -1,54 +0,0 @@
|
|||||||
Premier League score is, 1.0
|
|
||||||
LaLiga score is, 1.0
|
|
||||||
Serie A score is, 1.0
|
|
||||||
Bundesliga score is, 1.0
|
|
||||||
Ligue 1 score is, 0.6926977372958362
|
|
||||||
Liga Bwin score is, 1.0
|
|
||||||
Eredivisie score is, 1.0
|
|
||||||
Bundesliga score is, 0.5057471264367834
|
|
||||||
Premiership score is, 0.5057471264367834
|
|
||||||
Premier Liga score is, 0.8734130372900716
|
|
||||||
Premier Liga score is, 0.8734130372900716
|
|
||||||
Super liga Srbije score is, 0.7140096618357546
|
|
||||||
Jupiler Pro League score is, 1.0
|
|
||||||
Super League score is, 1.0
|
|
||||||
Protathlima Cyta score is, 0.5057471264367834
|
|
||||||
1.HNL score is, 0.5403828197945835
|
|
||||||
Fortuna Liga score is, 0.8734130372900716
|
|
||||||
Super Lig score is, 1.0
|
|
||||||
Super League 1 score is, 0.5057471264367834
|
|
||||||
Superligaen score is, 0.5057471264367834
|
|
||||||
Eliteserien score is, 0.8434674958254214
|
|
||||||
Ligat ha'Al score is, 0.5057471264367834
|
|
||||||
Allsvenskan score is, 0.7140096618357546
|
|
||||||
efbet Liga score is, 0.5057471264367834
|
|
||||||
Premyer Liqa score is, 0.97034078807242
|
|
||||||
Liga 1 score is, 0.7140096618357546
|
|
||||||
Ekstraklasa score is, 1.0
|
|
||||||
NB I. score is, 0.9248363528865283
|
|
||||||
Fortuna Liga score is, 0.5057471264367834
|
|
||||||
Premier Liga score is, 0.5057471264367834
|
|
||||||
Prva Liga score is, 0.6908378245957848
|
|
||||||
Vysheyshaya Liga score is, 0.7140096618357546
|
|
||||||
Divizia Nationala score is, 0.8463231347289373
|
|
||||||
A Lyga score is, 0.6908378245957848
|
|
||||||
Premijer Liga score is, 0.5057471264367834
|
|
||||||
Veikkausliiga score is, 0.5057471264367834
|
|
||||||
BGL Ligue score is, 1.0
|
|
||||||
Virsliga score is, 0.5321408915795232
|
|
||||||
BKT Superliga e Kosovës score is, 0.5057471264367834
|
|
||||||
Premier Division score is, 0.6908378245957848
|
|
||||||
Premiership score is, 0.5057471264367834
|
|
||||||
Kategoria Superiore score is, 0.6908378245957848
|
|
||||||
Bardzragujn khumb score is, 0.6908378245957848
|
|
||||||
Betri-deildin score is, 1.0
|
|
||||||
Premium Liiga score is, 1.0
|
|
||||||
Premier League score is, 0.5057471264367834
|
|
||||||
Crystalbet Erovnuli Liga score is, 0.6908378245957848
|
|
||||||
Prva liga score is, 0.5057471264367834
|
|
||||||
Cymru Premier score is, 0.5057471264367834
|
|
||||||
Gibraltar National League score is, 1.0
|
|
||||||
Pepsi Max deild score is, 0.5057471264367834
|
|
||||||
1. CFL score is, 0.6908378245957848
|
|
||||||
Primera Divisió score is, 0.5057471264367834
|
|
||||||
Camp. Sammarinese score is, 0.5057471264367834
|
|
|
55
res3.csv
Normal file
55
res3.csv
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
League,Score
|
||||||
|
Premier League,61.025119126510795
|
||||||
|
LaLiga,56.15575447570333
|
||||||
|
Serie A,60.40382819794585
|
||||||
|
Bundesliga,60.30366482401773
|
||||||
|
Ligue 1,58.07302262704164
|
||||||
|
Liga Bwin,50.0
|
||||||
|
Eredivisie,50.0
|
||||||
|
Bundesliga,40.057471264367834
|
||||||
|
Premiership,40.057471264367834
|
||||||
|
Premier Liga,43.734130372900715
|
||||||
|
Premier Liga,43.734130372900715
|
||||||
|
Super liga Srbije,42.14850588590407
|
||||||
|
Jupiler Pro League,50.0
|
||||||
|
Super League,45.29147855530481
|
||||||
|
Protathlima Cyta,40.057471264367834
|
||||||
|
1.HNL,39.596171802054165
|
||||||
|
Fortuna Liga,43.734130372900715
|
||||||
|
Super Lig,50.0
|
||||||
|
Super League 1,40.057471264367834
|
||||||
|
Superligaen,40.057471264367834
|
||||||
|
Eliteserien,43.44018053492688
|
||||||
|
Ligat ha'Al,40.057471264367834
|
||||||
|
Allsvenskan,42.14850588590407
|
||||||
|
efbet Liga,40.057471264367834
|
||||||
|
Premyer Liqa,35.30248317573896
|
||||||
|
Liga 1,42.14850588590407
|
||||||
|
Ekstraklasa,50.0
|
||||||
|
NB I.,44.24836352886529
|
||||||
|
Fortuna Liga,40.057471264367834
|
||||||
|
Premier Liga,40.057471264367834
|
||||||
|
Prva Liga,38.10204081632655
|
||||||
|
Vysheyshaya Liga,42.14850588590407
|
||||||
|
Divizia Nationala,43.47289117836451
|
||||||
|
A Lyga,38.10204081632655
|
||||||
|
Premijer Liga,40.057471264367834
|
||||||
|
Veikkausliiga,40.057471264367834
|
||||||
|
BGL Ligue,47.32523094688215
|
||||||
|
Virsliga,40.33120598591547
|
||||||
|
BKT Superliga e Kosovës,40.057471264367834
|
||||||
|
Premier Division,38.10204081632655
|
||||||
|
Premiership,40.057471264367834
|
||||||
|
Kategoria Superiore,38.10204081632655
|
||||||
|
Bardzragujn khumb,38.10204081632655
|
||||||
|
Betri-deildin,50.0
|
||||||
|
Premium Liiga,46.40917191914804
|
||||||
|
Premier League,40.057471264367834
|
||||||
|
Crystalbet Erovnuli Liga,38.10204081632655
|
||||||
|
Prva liga,40.057471264367834
|
||||||
|
Cymru Premier,40.057471264367834
|
||||||
|
Gibraltar National League,50.0
|
||||||
|
Pepsi Max deild,40.057471264367834
|
||||||
|
1. CFL,38.10204081632655
|
||||||
|
Primera Divisió,40.057471264367834
|
||||||
|
Camp. Sammarinese,40.057471264367834
|
|
Loading…
Reference in New Issue
Block a user