分析和模拟NCAA三月疯狂锦标赛
bracketolog的Python项目详细描述
欢迎来到苞叶科!在
bracketology的目标是加速NCAA三月疯狂数据的分析 帮助开发填充括号的算法。在
开始之前
- 以下是您需要了解的主要事项:
- 这个包的主要部分是
Bracket
对象和simulators
模块中的模拟器函数 - 括号由
Team
和Game
对象组成 - 游戏对象有两个团队对象作为属性,以及整数
- 团队有一个名称、种子和统计字典
- 模拟器函数有一个Game类型的参数,并返回该游戏的获胜团队
- 这个包的主要部分是
入门
导入支架学并从去年开始创建支架。在
^{pr2}$教程
检查支架对象
这里有三种不同的检查方法。在
- 检查每个区域的团队(实际结果字典)
- 逐轮检验实际结果(字典)
- 按轮检查模拟结果(团队属性列表)
在每个地区组建团队
打印出每个地区的所有团队。区域属性是 包含每个地区所有球队信息的字典。在
>>>print(b19.regions){'East':[{'Team':'Duke','Seed':1},{'Team':'Michigan St','Seed':2},{'Team':'LSU','Seed':3},...],'West':[{'Team':'Gonzaga','Seed':1},{'Team':'Michigan','Seed':2},{'Team':'Texas Tech','Seed':3},...],'Midwest':[{'Team':'North Carolina','Seed':1},{'Team':'Kentucky','Seed':2},{'Team':'Houston','Seed':3},...],'South':[{'Team':'Virginia','Seed':1},{'Team':'Tennessee','Seed':2},{'Team':'Purdue','Seed':3},...]}
按轮计算的实际结果
result属性将返回一个字典(类似于上面的区域) 但会根据每一轮比赛的实际情况来决定。你可以 用它来检查真正的比赛结果。在
>>>print(b19.result.keys())dict_keys(['first','second','sweet16','elite8','final4','championship','winner'])>>>print(b19.result['final4'])[{'Team':'Michigan St','Seed':2},{'Team':'Virginia','Seed':1},{'Team':'Texas Tech','Seed':3},{'Team':'Auburn','Seed':5}]>>>print(b19.result.get('winner')){'Team':'Virginia','Seed':1}
按轮划分的模拟结果
打印出所有模拟的队伍,使其进入每一轮比赛。 第一轮默认填写。这是一个团队对象的列表 它们被模拟到每一轮。现在第二轮是一个空列表 因为我们还没有模拟支架。在
>>>print(b19.round1)[<1Duke>,<2MichiganSt>,<3LSU>,...,<1Gonzaga>,<2Michigan>,<3TexasTech>,...,<1NorthCarolina>,<2Kentucky>,<3Houston>,...,<1Virginia>,<2Tennessee>,<3Purdue>]>>>print(b19.round2)[]
创建模拟器算法
模拟器函数需要接受一个游戏并返回一个团队。在
首先,我们创建一些假的团队和游戏来测试我们的模拟器功能。在
# Create teamsteam1=Team(name='Blue Mountain State',seed=1)team2=Team(name='School of Hard Knocks',seed=2)​# Create a game between the teamsgame1=Game(team1,team2,round_number=1)
然后我们定义了模拟器函数。在
importrandomdefpick_a_random_team(the_game):# Extract Teams from Gameteam1=the_game.top_teamteam2=the_game.bottom_team​# Randomly select a winnerifrandom.random()<0.5:winner=team1else:winner=team2# Return the lucky teamreturnwinner
在游戏中测试该功能。在
>>>pick_a_random_team(game1)<2SchoolofHardKnocks>
让我们用我们的函数进行一些模拟吧!在
# Initialize Simulation ParametersBMS_wins=0HardKnocks_wins=0n_games=1000​# Loop through a bunch of gamesforiinrange(n_games):# Simulate the winnerwinner=pick_a_random_team(game1)# Increment win totalsifwinner.seed==1:BMS_wins+=1elifwinner.seed==2:HardKnocks_wins+=1else:raiseException("We have a tie??")​# Calculate total win percentageBMS_win_pct=round(BMS_wins/n_games,4)*100HardKnocks_win_pct=round(HardKnocks_wins/n_games,4)*100​# Print out resultsprint(f"Blue Mountain State Win Percentage: %{BMS_win_pct}")print(f"School of Hard Knocks Win Percentage: %{HardKnocks_win_pct}")
输出:
BlueMountainStateWinPercentage:%50.9SchoolofHardKnocksWinPercentage:%49.1
评估模拟器结果
让我们用一些实际的括号来评估我们的模拟器功能。在
# Initialize simulation parametersn_sims=1000# number of times to simulate through all yearstotal_sims=(n_sims*len(brackets))scores=[]correct_games=[]# Loop through a plethora of bracketsforiinrange(n_sims):forbracketinbrackets:# Run the algorithm on the bracketbracket.score(sim_func=pick_a_random_team,verbose=False)# Save the scoring results in a listscores.append(bracket.total_score)correct_games.append(bracket.n_games_correct)# Calculate the average across all simulationsavg_score=round(sum(scores)/total_sims)avg_correct=round(sum(correct_games)/total_sims)# Print resultprint(f"Average number total score {avg_score}/192")print(f"Average number of games guessed correctly {avg_correct}/64")
输出:
Averagenumbertotalscore31/192Averagenumberofgamesguessedcorrectly21/64
别紧张,对吧!在
- 项目
标签: