This commit is contained in:
jakub.kowalczyk 2020-05-22 10:30:55 +02:00
parent 5dc90d347e
commit bb11bc87cc
3 changed files with 102 additions and 65 deletions

View File

@ -12,6 +12,8 @@ class calculating:
for key in tableDict: for key in tableDict:
numMatch = tableDict[key][1] numMatch = tableDict[key][1]
points = tableDict[key][7] points = tableDict[key][7]
goals = tableDict[key][6]
goals = round(goals/numMatch, 2)
val = round(points/numMatch, 2) val = round(points/numMatch, 2)
del tableDict[key][1] del tableDict[key][1]
del tableDict[key][1] del tableDict[key][1]
@ -19,6 +21,8 @@ class calculating:
del tableDict[key][1] del tableDict[key][1]
del tableDict[key][1] del tableDict[key][1]
del tableDict[key][2] del tableDict[key][2]
del tableDict[key][1]
tableDict[key].append(goals)
tableDict[key].append(val) tableDict[key].append(val)
self.tableDict = tableDict self.tableDict = tableDict
@ -28,13 +32,13 @@ class calculating:
valueDict = self.valueDict valueDict = self.valueDict
prevPlaceDict = self.prevPlaceDict prevPlaceDict = self.prevPlaceDict
for key in tableDict: for key in tableDict:
for ke in valueDict: # for ke in valueDict:
if re.match(key,ke): # if re.match(key,ke):
tableDict[key].append(valueDict[ke]) # tableDict[key].append(valueDict[ke])
for ke in prevPlaceDict: for ke in prevPlaceDict:
if re.match(key,ke): if re.match(key,ke):
tableDict[key].append(prevPlaceDict[ke]) tableDict[key].append(prevPlaceDict[ke])
if len(tableDict[key]) == 4: if len(tableDict[key]) == 3:
tableDict[key].append(15) tableDict[key].append(15)
self.tableDict = tableDict self.tableDict = tableDict

76
main.py
View File

@ -2,47 +2,56 @@ import numpy as np
import skfuzzy as fuzz import skfuzzy as fuzz
from skfuzzy import control as ctrl from skfuzzy import control as ctrl
from calculating import calculating from calculating import calculating
import collections
prevPlace = ctrl.Antecedent(np.arange(0, 17, 1), 'prevPlace') prevPlace = ctrl.Antecedent(np.arange(0, 17, 1), 'prevPlace')
teamValue = ctrl.Antecedent(np.arange(0, 31, 1), 'teamValue') teamValue = ctrl.Antecedent(np.arange(0, 31, 1), 'teamValue')
currentPlace = ctrl.Antecedent(np.arange(0, 17, 1), 'currentPlace') currentPlace = ctrl.Antecedent(np.arange(0, 17, 1), 'currentPlace')
points = ctrl.Antecedent(np.arange(0, 4, 1), 'points') points = ctrl.Antecedent(np.arange(0, 2.3, 0.1), 'points')
goals = ctrl.Antecedent(np.arange(-26, 26, 1), 'goals') goals = ctrl.Antecedent(np.arange(-2.0, 2.0, 0.2), 'goals')
place = ctrl.Consequent(np.arange(0, 100, 1), 'place') place = ctrl.Consequent(np.arange(0, 100, 1), 'place')
# prevPlace.automf(3) # prevPlace.automf(3)
# teamValue.automf(5) # teamValue.automf(5)
place.automf(3) place.automf(5)
prevPlace['Low'] = fuzz.trimf(prevPlace.universe, [10,16,16]) prevPlace['Low'] = fuzz.trimf(prevPlace.universe, [12,16,16])
prevPlace['Medium'] = fuzz.trimf(prevPlace.universe, [4,8,12]) prevPlace['Medium'] = fuzz.trimf(prevPlace.universe, [5,8,12])
prevPlace['High'] = fuzz.trimf(prevPlace.universe, [0,0,6]) prevPlace['High'] = fuzz.trimf(prevPlace.universe, [0,0,5])
teamValue['Low'] = fuzz.trimf(teamValue.universe, [0,0,10]) teamValue['Low'] = fuzz.trimf(teamValue.universe, [0,0,10])
teamValue['Medium'] = fuzz.trimf(teamValue.universe, [8,12,16]) teamValue['Medium'] = fuzz.trimf(teamValue.universe, [8,12,16])
teamValue['High'] = fuzz.trimf(teamValue.universe, [15,30,30]) teamValue['High'] = fuzz.trimf(teamValue.universe, [15,30,30])
currentPlace['Low'] = fuzz.trimf(currentPlace.universe, [10,16,16]) currentPlace['Low'] = fuzz.trimf(currentPlace.universe, [12,16,16])
currentPlace['Medium'] = fuzz.trimf(currentPlace.universe, [4,8,12]) currentPlace['Medium'] = fuzz.trimf(currentPlace.universe, [5,8,12])
currentPlace['High'] = fuzz.trimf(currentPlace.universe, [0,0,6]) currentPlace['High'] = fuzz.trimf(currentPlace.universe, [0,0,5])
points['Low'] = fuzz.trimf(points.universe, [0,0, 1.0]) points['Low'] = fuzz.trimf(points.universe, [0,0, 1.2])
points['Medium'] = fuzz.trimf(points.universe, [1.0,1.4, 1.8]) points['Medium'] = fuzz.trimf(points.universe, [1.0,1.4, 1.7])
points['High'] = fuzz.trimf(points.universe, [1.8,3,3]) points['High'] = fuzz.trimf(points.universe, [1.7,2.2,2.2])
goals['Low'] = fuzz.trimf(goals.universe, [-15,-15,-5]) goals['Low'] = fuzz.trimf(goals.universe, [-2,-2,-0.8])
goals['Medium'] = fuzz.trimf(goals.universe, [-5,0,5]) goals['Medium'] = fuzz.trimf(goals.universe, [-1.0,0,1])
goals['High'] = fuzz.trimf(goals.universe, [5,15,15]) goals['High'] = fuzz.trimf(goals.universe, [0.8,2.0,2.0])
prevPlace.view()
# teamValue.view()
rule1 = ctrl.Rule(prevPlace['Low'] | currentPlace['Low'] | points['Low'], place['poor'])
rule2 = ctrl.Rule(points['Medium'] | currentPlace['Medium'] | goals['Medium'] | prevPlace['Medium'], place['average'])
rule3 = ctrl.Rule(teamValue['High'] | goals['High'] | prevPlace['High'], place['good'])
rule4 = ctrl.Rule(teamValue['High'] | points['High'], place['good'])
rule5 = ctrl.Rule(goals['High'] | currentPlace['High'], place['good'])
placeCtrl = ctrl.ControlSystem([rule1, rule2, rule3, rule4, rule5])
points.view()
rule1 = ctrl.Rule(prevPlace['Low'] | currentPlace['Low'] | points['Low'] | goals['Low'], place['poor'])
rule2 = ctrl.Rule(prevPlace['Medium'] | currentPlace['Medium'] | points['Medium'] | goals['Medium'], place['average'])
rule3 = ctrl.Rule((currentPlace['High']) | (points['High'] | goals['High']), place['good'])
# rule4 = ctrl.Rule(prevPlace['High'], place['good'])
# rule4 = ctrl.Rule(prevPlace['Medium'] | currentPlace['High'] | goals['High'], place['decent'])
# rule5 = ctrl.Rule(prevPlace['High'] | currentPlace['Medium'], place['good'])
# rule6 = ctrl.Rule(goals['Low'] | prevPlace['High'] | points['Medium'], place['average'])
# rule7 = ctrl.Rule(prevPlace['High'] | currentPlace['Medium'], place['decent'])
# rule5 = ctrl.Rule(currentPlace['High'] & points['High'], place['good'])
placeCtrl = ctrl.ControlSystem([rule1, rule2, rule3])
calPlace = ctrl.ControlSystemSimulation(placeCtrl) calPlace = ctrl.ControlSystemSimulation(placeCtrl)
@ -50,20 +59,27 @@ calPlace = ctrl.ControlSystemSimulation(placeCtrl)
calculate = calculating() calculate = calculating()
calculate.cleanTeamParameters() calculate.cleanTeamParameters()
dict = calculate.joinDict() dict = calculate.joinDict()
teamsPlace = {}
for key in dict: for key in dict:
print(key + " = " + str(dict[key])) print(key + " = " + str(dict[key]))
calPlace.input['currentPlace'] = dict[key][0] calPlace.input['currentPlace'] = dict[key][0]
calPlace.input['goals'] = dict[key][1] calPlace.input['goals'] = dict[key][1]
calPlace.input['points'] = dict[key][2] calPlace.input['points'] = dict[key][2]
calPlace.input['teamValue'] = dict[key][3] calPlace.input['prevPlace'] = dict[key][3]
calPlace.input['prevPlace'] = dict[key][4] # calPlace.input['prevPlace'] = dict[key][4]
calPlace.compute() calPlace.compute()
print(calPlace.output['place']) # print(calPlace.output['place'])
# place.view(sim=calPlace) teamsPlace[key] = calPlace.output['place']
place.view(sim=calPlace)
sorted_x = sorted(teamsPlace.items(), key=lambda kv: kv[1])
sorted_dict = collections.OrderedDict(sorted_x)
listReversed = list(reversed(sorted_dict))
print()
print("Results:")
for item in reversed(sorted_dict):
print(item + " = " + str(sorted_dict[item]))

View File

@ -1,21 +1,29 @@
import requests import requests
import re import re
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from collections import OrderedDict
class scrap: class scrap:
def fetch_data(self, url): # Sezon 18/19 kolejka 10
# https://www.transfermarkt.pl/ekstraklasa/formtabelle/wettbewerb/PL1?saison_id=2018&min=1&max=10
# Kolejka 15
# https: // www.transfermarkt.pl / ekstraklasa / formtabelle / wettbewerb / PL1?saison_id = 2018 & min = 1 & max = 15
# Kolejka 20
# https: // www.transfermarkt.pl / ekstraklasa / formtabelle / wettbewerb / PL1?saison_id = 2018 & min = 1 & max = 20
# wartość klubów
# https: // www.transfermarkt.pl / pko - ekstraklasa / marktwerteverein / wettbewerb / PL1 / plus /?stichtag = 2018 - 10 - 01
# Poprzedni sezon
# https://www.transfermarkt.pl/pko-ekstraklasa/tabelle/wettbewerb/PL1?saison_id=2017
def scrapTeamValue(self):
url = 'https://www.transfermarkt.pl/pko-ekstraklasa/marktwerteverein/wettbewerb/PL1/plus/?stichtag=2018-10-01'
headers = {'User-Agent': 'Mozilla/5.0'} headers = {'User-Agent': 'Mozilla/5.0'}
req = requests.get(url, headers=headers) req = requests.get(url, headers=headers)
soup = BeautifulSoup(req.text, 'html.parser') soup = BeautifulSoup(req.text, 'html.parser')
body = soup.body body = soup.body
return body
def scrapTeamValue(self):
body = self.fetch_data('https://www.transfermarkt.pl/pko-ekstraklasa/marktwerteverein/wettbewerb/PL1/stichtag//plus/1')
table = body.find('table', {'class': 'items'}) table = body.find('table', {'class': 'items'})
bodyTable = table.find('tbody') bodyTable = table.find('tbody')
values = bodyTable.findAll('td', {'class': 'rechts hauptlink'}) values = bodyTable.findAll('td', {'class': 'rechts'})
teamValues = [] teamValues = []
teams = [] teams = []
for value in values: for value in values:
@ -28,38 +36,44 @@ class scrap:
num = value.text.replace(',','.') num = value.text.replace(',','.')
num = re.match(r'[0-9]+[.][0-9]+',num) num = re.match(r'[0-9]+[.][0-9]+',num)
teamValues.append(float(num.group())) teamValues.append(float(num.group()))
teams = list(OrderedDict.fromkeys(teams))
dictTeams = {} dictTeams = {}
i=0 i=0
for team in teams: for team in teams:
dictTeams[team] = teamValues[i] dictTeams[team] = teamValues[i]
i += 1 i += 2
return dictTeams return dictTeams
def scrapTeamsTable(self): def scrapTeamsTable(self):
body = self.fetch_data('https://www.transfermarkt.pl/pko-ekstraklasa/tabelle/wettbewerb/PL1?saison_id=2019') url = 'https://www.transfermarkt.pl/ekstraklasa/formtabelle/wettbewerb/PL1?saison_id=2017&min=1&max=10'
table = body.find('div', {'class': 'responsive-table'}) headers = {'User-Agent': 'Mozilla/5.0'}
bodyTable = table.find('tbody') req = requests.get(url, headers=headers)
trTable = bodyTable.findAll('tr') soup = BeautifulSoup(req.text, 'html.parser')
body = soup.body
body = body.find('div', {'class': 'large-8 columns'})
table = body.findAll('div', {'class': 'responsive-table'})
i = 1
listTeams = [] listTeams = []
listProperities = [] listProperities = []
for item in trTable: for x in table:
item = item.text.replace(u'\xa0', '') x = x.find('tbody')
teamProperities = re.split('\n', item) trTable = x.findAll('tr')
tab = [] for item in trTable:
item = item.text.replace(u'\xa0', '')
for x in teamProperities: teamProperities = re.split('\n', item)
match = re.match(r'-?[0-9]+', x) tab = []
if match: for x in teamProperities:
tab.append(float(match.group())) match = re.match(r'-?[0-9]+', x)
if match:
match = re.match(r'\D+$', x) tab.append(float(match.group()))
if match:
teamName = match.group().rstrip()
listTeams.append(teamName)
listProperities.append(tab)
match = re.match(r'\D+$', x)
if match:
teamName = match.group().rstrip()
tab[0] = i
i+=1
listTeams.append(teamName)
listProperities.append(tab)
dictTeams = {} dictTeams = {}
i=0 i=0
for team in listTeams: for team in listTeams:
@ -69,7 +83,11 @@ class scrap:
return dictTeams return dictTeams
def scrapPreviousPlace(self): def scrapPreviousPlace(self):
body = self.fetch_data('https://www.transfermarkt.pl/pko-ekstraklasa/tabelle/wettbewerb/PL1?saison_id=2018') url = 'https://www.transfermarkt.pl/pko-ekstraklasa/tabelle/wettbewerb/PL1?saison_id=2016'
headers = {'User-Agent': 'Mozilla/5.0'}
req = requests.get(url, headers=headers)
soup = BeautifulSoup(req.text, 'html.parser')
body = soup.body
table = body.findAll('div', {'class': 'responsive-table'}) table = body.findAll('div', {'class': 'responsive-table'})
listTeams = [] listTeams = []
i = 0 i = 0
@ -84,6 +102,5 @@ class scrap:
for team in listTeams: for team in listTeams:
dictTeams[team] = i dictTeams[team] = i
i += 1 i += 1
return dictTeams return dictTeams