Рассчитать вероятность попадания команды в лигу

цель этого проекта - рассчитать вероятность того, что каждая из них попадет в топ-6 (оставшиеся сценарии, когда каждая команда выиграет или проиграет оставшиеся матчи, но все же попадет в топ-6), поэтому я сделал 3D-список для ввода истории матчей ( матчи, которые сыграны, и мы знаем результаты) проблема в том, что я не знаю, как рассчитать вероятность ранга команды, потому что это также зависит от других команд, я хочу найти формулу или код для ее решения

class Team:
    def __init__(self, name, pos):
       self.name = name
       self.pos = pos
       self.w = 0
       self.l = 0
       self.score = ""

    def upd_score(self, history):
        # check the rows
        for match in history[self.pos]:
            if match == ["w"]:
                self.w += 1
            elif match == ["l"]:
                self.l += 1
        # check the columns
        for match in history:
            if match[self.pos] == ["l"]:
                self.w += 1
            elif match[self.pos] == ["w"]:
                self.l += 1
        self.score = f"{self.w} - {self.l}"

    def get_score(self):
        print(f"the score is {self.score} ")

RGE = Team("RGE", 1)
VIT = Team("VIT", 2)
G2 = Team("G2", 3)
MSF = Team("MSF", 4)
AST = Team("AST", 5)
MAD = Team("MAD", 6)
FNC = Team("FNC", 7)
SK = Team("SK", 8)
XL = Team("XL", 9)
BDS = Team("BDS", 10)


MATCH_HISTORY = [
    [["X"], [RGE], [VIT], [G2], [MSF], [AST], [MAD], [FNC], [SK], [XL], [BDS]],
    [[RGE], ["X"], ["w"], ["w"], ["l"], [""], [""], [""], [""], [""], [""]],
    [[VIT], ["w"], ["X"], [""], [""], [""], [""], [""], [""], [""], [""]],
    [[G2], ["w"], [""], ["X"], [""], [""], [""], [""], [""], [""], [""]],
    [[MSF], ["w"], [""], [""], ["X"], [""], [""], [""], [""], [""], [""]],
    [[AST], ["l"], [""], [""], [""], ["X"], [""], [""], [""], [""], [""]],
    [[MAD], ["w"], [""], [""], [""], [""], ["X"], [""], [""], [""], [""]],
    [[FNC], ["l"], [""], [""], [""], [""], [""], ["X"], [""], [""], [""]],
    [[SK], ["w"], [""], [""], [""], [""], [""], [""], ["X"], [""], [""]],
    [[XL], ["w"], [""], [""], [""], [""], [""], [""], [""], ["X"], [""]],
    [[BDS], ["w"], [""], [""], [""], [""], [""], [""], [""], [""], ["X"]],
]

# SCORE UPDATING
RGE.upd_score(MATCH_HISTORY)
VIT.upd_score(MATCH_HISTORY)
G2.upd_score(MATCH_HISTORY)
MSF.upd_score(MATCH_HISTORY)
AST.upd_score(MATCH_HISTORY)
MAD.upd_score(MATCH_HISTORY)
FNC.upd_score(MATCH_HISTORY)
SK.upd_score(MATCH_HISTORY)
XL.upd_score(MATCH_HISTORY)
BDS.upd_score(MATCH_HISTORY)

для подсчета очков: если команда находится в рядах, я ставлю «w», а если команда находится в столбцах, я ставлю «l» и «X» для случаев, которые не могут быть заполнены (команда не может играть против себя)

кстати, я все еще новичок, поэтому, пожалуйста, если есть способ оптимизировать мой код, скажите мне, и если вы предложите мне что-то, было бы неплохо, если бы объяснили это или дали мне ссылку на что-то, что может помочь

Что вы подразумеваете под «вероятностью попадания в топ-6»? Разве вы не можете просто распечатать результаты, основанные на проценте w-l?

Sala 17.03.2022 17:59

вопрос не ясен.

D.L 17.03.2022 18:11

Извините, я надеюсь, что теперь это более ясно

nader 18.03.2022 09:22

Привет! просто чтобы быть уверенным в этом, история матча читается vit won vs rge ?

Ren 19.03.2022 12:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для элементарной вероятности победы команды вы можете использовать их победы над их общими поражениями. self.w / (self.w + self.l) Чтобы рассчитать (опять-таки очень элементарную) вероятность командного рейтинга, просто рассчитайте вероятности всех команд и расположите их в порядке убывания. например

# teams is an array containing instances of your teams
team_win_probs = []

for team in teams:
    team_win_probs.append((team.name, team.w / (team.w + team.l)))

team_win_probs.sort(key=lambda p: p[1], reverse=True) # the lambda gets the second elements of the tuple

Здесь я использовал кортеж, чтобы связать название команды и вероятность победы команды, и использовал лямбду в параметре сортировки listkey, чтобы получить вероятность из tuple и отсортировать на ее основе.

Я надеюсь, что это помогло :)

Ответ принят как подходящий

Мне понравилась идея, и я не мог устоять перед ней, поэтому вот код

По сути, он перебирает все возможности, существующие для всех матчей, которые еще не были проведены, и вычисляет статистику каждой команды, находящейся в топ-N (которую вы можете изменить в коде).

Единственная проблема заключается в том, что число возможностей равно 2^undone_matches, и оно очень быстро увеличивается, поэтому вы не можете запустить программу для более чем 15 отмененных совпадений...

Другой возможностью было бы сделать это не рекурсивно, а математически с вероятностями, но я слишком ленив для этого xD

PS: на данный момент программа не обрабатывает равенство в счете и берет 1-ю команду с одинаковым счетом, я позволю вам позаботиться об этом, если хотите :)

import copy

class Team:
    def __init__(self, name):
       self.name = name
       self.w = 0
       self.l = 0

    def init_scores(self, MH):
        for rowIndex in range(0, len(MH[0])):
            if MH[rowIndex][0] == self.name:
                index = rowIndex
        for columnIndex in range(0, len(MH[0])):
            result = MH[columnIndex][index]
            if result == "w":
                self.l += 1
            elif result == "l":
                self.w += 1
                
        for columnIndex in range(0, len(MH[0])):
            if MH[0][columnIndex] == self.name:
                index = columnIndex
        for rowIndex in range(0, len(MH[0])):
            result = MH[index][rowIndex]
            if result == "w":
                self.w += 1
            elif result == "l":
                self.l += 1
    
            
    def toString(self):
        r  = "| " + self.name.ljust(9) + "|\n"
        r += "|" + "----------" + "|\n"
        r += "| w: " + str(self.w).ljust(6) + "|\n"
        r += "| l: " + str(self.l).ljust(6) + "|\n"
        return r
    
    def getScore(self):
        return [self.name, self.w]
        
        
def createAllPossibilities(MH, topN, results):
    coo = emptyCellExist(MH)
    if coo[0] >= 0:
        cp1 = copy.deepcopy(MH)
        cp1[coo[0]][coo[1]] = "w"
        createAllPossibilities(cp1, topN, results)
        cp2 = copy.deepcopy(MH)
        cp2[coo[0]][coo[1]] = "l"
        createAllPossibilities(cp2, topN, results)
    else:
        Teams = []
        Teams.append(Team("RGE"))
        Teams.append(Team("VIT"))
        Teams.append(Team("G2"))
        Teams.append(Team("MSF"))
        Teams.append(Team("AST"))
        Teams.append(Team("MAD"))
        Teams.append(Team("FNC"))
        Teams.append(Team("SK"))
        Teams.append(Team("XL"))
        Teams.append(Team("BDS"))
        
        for t in Teams:
            t.init_scores(MH)
            
        scores = []
        for t in Teams:
            scores.append(t.getScore())
        
        for n in range(topN):
            best = 0
            index = -1
            for t in range(len(scores)):
                if best < scores[t][1]:
                    best = scores[t][1]
                    index = t
            scores[index][1] = 0
            #print(scores)
            results[index] += 1
            

def emptyCellExist(MH):
    for row in range(len(MH[0])):
        for cell in range(len(MH[0])):
            if MH[row][cell] == "":
                return [row, cell]
    return [-1, -1]



# current score
MATCH_HISTORY = [   ["X",   "RGE", "VIT", "G2", "MSF", "AST", "MAD", "FNC", "SK", "XL", "BDS"],
                    ["RGE", "X",   "w",   "w",  "l",   "l",   "w",   "l",   "l",  "w",  ""],
                    ["VIT", "w",   "X",   "l",  "w",   "l",   "w",   "l",   "w",  "w",  ""],
                    ["G2",  "w",   "l",   "X",  "w",   "w",   "l",   "l",   "w",  "w",  ""],
                    ["MSF", "w",   "l",   "v",  "X",   "w",   "w",   "l",   "w",  "w",  ""],
                    ["AST", "l",   "l",   "l",  "l",   "X",   "l",   "l",   "l",  "",  ""],
                    ["MAD", "w",   "l",   "v",  "w",   "l",   "X",   "l",   "l",  "",  ""],
                    ["FNC", "l",   "l",   "l",  "w",   "l",   "l",   "X",   "w",  "",  ""],
                    ["SK",  "w",   "l",   "w",  "l",   "w",   "w",   "l",   "X",  "",  ""],
                    ["XL",  "w",   "l",   "w",  "w",   "l",   "l",   "w",   "w",  "X",  ""],
                    ["BDS", "w",   "l",   "w",  "w",   "l",   "w",   "w",   "l",  "",  "X"]]

# top teams must be top X
topN = 6

# count the number of matches done and left to do
matchesDone = 0
matchesLeft = 0
for row in MATCH_HISTORY:
    for cell in row:
        if cell == "w" or cell == "l":
            matchesDone += 1
        elif cell == "":
            matchesLeft += 1
print("matches done : " + str(matchesDone))
print("matches left to do : " + str(matchesLeft))
print("that's " + str(pow(2, matchesLeft)) + " possibilities\n")

if matchesLeft > 20:
    print("that's way to much for me")
else:
    # if the number of matches left to do is low enought, then start calculating the probabilities
    results = [0 for a in range(len(MATCH_HISTORY[0]))]
    createAllPossibilities(MATCH_HISTORY, topN, results)
    
    print(MATCH_HISTORY[0][1:])
    for a in range(len(results)):
        results[a] /= (pow(2, matchesLeft)*topN)
        results[a] = int(results[a]*1000)/10
    print(results)
    

while 1:
    pass


большое спасибо это очень полезно

nader 21.03.2022 13:44

Другие вопросы по теме