分析和模拟NCAA三月疯狂锦标赛

bracketolog的Python项目详细描述


欢迎来到苞叶科!在

Bracketology logo

bracketology的目标是加速NCAA三月疯狂数据的分析 帮助开发填充括号的算法。在

Documentation:https://bracketology.readthedocs.io/en/latest/
GitHub Repo:https://github.com/stahl085/bracketology
Issue Tracker:https://github.com/stahl085/bracketology/issues
Backlog:https://github.com/stahl085/bracketology/projects/1?fullscreen=true
PyPI:https://pypi.org/project/bracketology/

开始之前

以下是您需要了解的主要事项:
  • 这个包的主要部分是Bracket对象和simulators模块中的模拟器函数
  • 括号由TeamGame对象组成
  • 游戏对象有两个团队对象作为属性,以及整数
  • 团队有一个名称、种子和统计字典
  • 模拟器函数有一个Game类型的参数,并返回该游戏的获胜团队

安装

pip安装

pip install bracketology

或者直接从PyPi下载

入门

导入支架学并从去年开始创建支架。在

^{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)[]
{id10}$

创建模拟器算法

模拟器函数需要接受一个游戏并返回一个团队。在

首先,我们创建一些假的团队和游戏来测试我们的模拟器功能。在

# 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

别紧张,对吧!在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javascript问题:通过URL用网站数据填充Textview   java TabLayout Android,如何用几个标签填充整个屏幕宽度,并用大量标签滚动?   Eclipse Java运行的文件不再存在于我的工作区中   安装两个Java版本时,使用Java的windows链接不起作用   java将多个图形添加到单个JPanel   java Kafka ConsumerFactory,带有两个Desiarizer   使用反射更改java类超类   当一致性测试失败时,java有没有办法让堆栈跟踪显示在控制台中   java映射到基元类型的HashMap的快速替代方案是什么?   java关闭一个jframe所有剩余的打开jframe都将关闭。   java为什么不推荐“使用getString()获取设备标识符”?   java值比较和值赋值之间有什么性能差异吗?   Java实体数组到JavaScript数组   java使用流将一个列表转换为另一个列表   在JTree中保存对象,但更改显示的名称(java swing)?   java“Hello world”Android应用程序,文件尽可能少,没有IDE,只有文本编辑器   java在方法之间传递值   java如何为项目数组创建ParseQuery?