From dfb44df7cb9af18b2af0e3433572ef00e217f92f Mon Sep 17 00:00:00 2001 From: Halal37 <59863785+Halal37@users.noreply.github.com> Date: Sat, 27 Jan 2024 20:16:01 +0100 Subject: [PATCH] Add fuzzylogic aggression metric --- data_filters.py | 73 +++++++++++++++++++++++++++++++++++++++++++++++-- main.py | 7 +++-- rules.py | 13 ++++++++- 3 files changed, 88 insertions(+), 5 deletions(-) diff --git a/data_filters.py b/data_filters.py index 2f13b93..63fa745 100644 --- a/data_filters.py +++ b/data_filters.py @@ -1,6 +1,7 @@ import pandas as pd from simpful import * +FS = FuzzySystem() def generateTrainingData(dataframe): columns = ['season','date','home_team','away_team','result_full','home_passes','away_passes', 'home_possession','away_possession','home_shots','away_shots'] @@ -10,10 +11,61 @@ def generateTrainingData(dataframe): def generateFuzzyLogicData(dataframe): columns = ['season','date','home_team','away_team','result_full','c_home_form_5m','c_away_form_5m',#,'c_home_passes','c_away_passes', # 'c_home_possession','c_away_possession','c_home_shots','c_away_shots', - 'c_home_diff_5m', 'c_away_diff_5m','c_home_form_season','c_away_form_season', + 'c_home_diff_5m', 'c_away_diff_5m', 'c_home_aggression_5m', + 'c_away_aggression_5m', 'c_home_aggression_season', 'c_away_aggression_season', + 'c_home_form_season','c_away_form_season', 'c_home_diff_season', 'c_away_diff_season'] return dataframe[columns] +def calculateFuzzyAggression(yellow_cards, red_cards): + FS.set_crisp_output_value("low", 0.0) + FS.set_crisp_output_value("average", 0.5) + FS.set_crisp_output_value("high", 1.0) + + Yellow_cards1 = TriangleFuzzySet(0, 2, 3, term="low") + Yellow_cards2 = TriangleFuzzySet(2, 3, 4, term="average") + Yellow_cards3 = TriangleFuzzySet(3, 4, 4, term="high") + + FS.add_linguistic_variable("yellow_cards", LinguisticVariable([Yellow_cards1, Yellow_cards2, Yellow_cards3], universe_of_discourse=[0, 10])) + + Red_cards1 = TriangleFuzzySet(0, 0, 1, term="low") + Red_cards2 = TriangleFuzzySet(0, 1, 2, term="average") + Red_cards3 = TriangleFuzzySet(1, 2, 2, term="high") + + FS.add_linguistic_variable("red_cards", LinguisticVariable([Red_cards1, Red_cards2, Red_cards3], universe_of_discourse=[0, 4])) + + # Pass_domination1 = TriangleFuzzySet(2,2,6, term="low") + # Pass_domination2 = TriangleFuzzySet(3,5,7, term="average") + # Pass_domination3 = TriangleFuzzySet(4,8,8, term="high") + + # FS.add_linguistic_variable("passes_domination", LinguisticVariable([Pass_domination1, Pass_domination2, Pass_domination3], universe_of_discourse=[0,10])) + + FS.add_rules([ + + "IF (yellow_cards IS low) AND (red_cards IS low) THEN (aggression IS low)", + + "IF (yellow_cards IS high) AND (red_cards IS high) THEN (aggression IS high)", + + "IF (yellow_cards IS average) AND (red_cards IS average) THEN (aggression IS average)", + + "IF (yellow_cards IS low) AND (red_cards IS high) THEN (aggression IS high)", + + "IF (yellow_cards IS high ) AND (red_cards IS low) THEN (aggression IS high)", + + "IF (yellow_cards IS average) AND (red_cards IS high) THEN (aggression IS high)", + + "IF (yellow_cards IS high) AND (red_cards IS average) THEN (aggression IS high)", + + "IF (yellow_cards IS low) AND (red_cards IS average) THEN (aggression IS low)", + + "IF (yellow_cards IS average) AND (red_cards IS low) THEN (aggression IS average)" + ]) + + FS.set_variable("yellow_cards", yellow_cards) + FS.set_variable("red_cards", red_cards) + + aggression = FS.inference() + return aggression def last5Matches(season, teamA, data, df): # Wybierz rekordy dla danej pary drużyn i sezonu subset = df[((df['season'] == season) & ((df['home_team'] == teamA) | (df['away_team'] == teamA)))] @@ -53,7 +105,24 @@ def getResult(score,teamHome): return "draw" else: return "loss" - + +def calculateAggression(matches, team): + aggression = 0 + for index, row in matches.iterrows(): + if team == row['home_team']: + yellow_cards = row['home_yellow_cards'] + red_cards = row['home_red_cards'] + else: + yellow_cards = row['away_yellow_cards'] + red_cards = row['away_red_cards'] + aggression_result = calculateFuzzyAggression(yellow_cards, red_cards) + #print(aggression_result['aggression']) + aggression = aggression + aggression_result['aggression'] + if matches.shape[0] != 0: + aggression_avg = aggression / matches.shape[0] + else: + aggression_avg = 0 + return aggression_avg def calculatePoints(matches, team): points = 0 diff --git a/main.py b/main.py index f85f6e4..1e1ab2c 100644 --- a/main.py +++ b/main.py @@ -23,7 +23,6 @@ from sklearn.metrics import classification_report if __name__ == "__main__": df = pd.read_csv('df_full_premierleague.csv') - result = last5Matches('10/11', 'Stoke City', '2010-10-02', df) #print(result.to_markdown()) #print(result) @@ -50,13 +49,17 @@ if __name__ == "__main__": df = add_column(df, get_method(df, True, categorize_diff, last5Matches), "c_home_diff_5m")#categorize_diff df = add_column(df, get_method(df, False, categorize_diff,last5Matches), "c_away_diff_5m") - + df = add_column(df, get_method(df, True, categorize_aggression, last5Matches), "c_home_aggression_5m")#categorize_diff + df = add_column(df, get_method(df, False, categorize_aggression,last5Matches), "c_away_aggression_5m") df = add_column(df, get_method(df, True, categorize_points, seasonMatches), "c_home_form_season") df = add_column(df, get_method(df, False, categorize_points, seasonMatches), "c_away_form_season") df = add_column(df, get_method(df, True, categorize_diff, seasonMatches), "c_home_diff_season")#categorize_diff df = add_column(df, get_method(df, False, categorize_diff,seasonMatches), "c_away_diff_season") + df = add_column(df, get_method(df, True, categorize_aggression, seasonMatches), "c_home_aggression_season")#categorize_diff + df = add_column(df, get_method(df, False, categorize_aggression,seasonMatches), "c_away_aggression_season") + df = generateFuzzyLogicData(df) label_encoder = LabelEncoder() diff --git a/rules.py b/rules.py index 000489f..26ff808 100644 --- a/rules.py +++ b/rules.py @@ -190,7 +190,18 @@ def categorize_diff(data, row, teamHome, matches_type): else: return 1 - +def categorize_aggression(data, row, teamHome, matches_type): + if teamHome: + data_5 = matches_type(row['season'], row['home_team'], row['date'], data) + diff = calculateAggression(data_5,row['home_team']) + else: + data_5 = matches_type(row['season'], row['away_team'], row['date'], data) + diff = calculateAggression(data_5,row['away_team']) + return diff + # if diff <=0: + # return 0 + # else: + # return 1 def get_diff_home(data): points = [] for index, row in data.iterrows():