一个模拟NFL常规赛和季后赛的工具

nflsim的Python项目详细描述


NFLSIM

这个包使用一个简单的、可定制的蒙特卡洛方法模拟NFL常规赛和季后赛。

安装

该软件包位于pypi上,可以与pip一起安装:

pip install nflsim

工作原理

在每个模拟过程中,NFLSIM使用下面描述的方法将一个赢家分配给给定赛季中所有剩余的NFL比赛。然后,它使用NFL的复杂的"分层"过程来确定季后赛种子,并且每场比赛都是模拟的。

在开始模拟之前,每个小组被分配一个平均值为0的额定功率(pwr),这样一个pwr为3的小组将比一个pwr为-2的小组在中性场上得到5分。默认情况下,每支球队的基本实力排名都是使用srs规范化版本的平均加权组合计算出来的。fpidvoa,以及排名。所使用的排名系统及其相对权重是可配置的,并且支持自定义排名系统。个人评分系统和综合排名可以根据需要回归到平均值(或自定义团队特定值)。

团队压水堆排名在每个赛季开始时通过随机数量进行调整,使用均值为0的正态分布和用户提供的标准差(默认为2分)确定:

adjusted_pwr = [PWR] - numpy.random.normal(0, [rank_adj])

这一调整代表了每个团队的基本压水堆预测中的不确定性,包括模型误差和伤害风险。值越高,结果差异越大。

当模拟一场比赛时,主队的压水堆向上调整一个固定的量,并与客队的压水堆进行比较。所得的积分差分用于生成正态累积分布函数,该函数决定主队获胜的概率。将此获胜概率与随机数进行比较,以确定游戏的模拟赢家:

home_pwr_difference = ([Home PWR] + [Home Adj]) - [Away PWR]
home_win_probability = 1 - scipy.stats.norm(home_pwr_difference, [stdev]).cdf(0)
is_home_winner = numpy.random.random() < home_win_probability

主场调整(默认情况下3分)和用于生成正态分布的标准差()默认情况下,可以配置13个积分。

用法

基础知识

每个模拟都由一个模拟对象控制。通过指定要模拟的季节和模拟次数来创建对象:

importnflsimasnflsimulation=nfl.Simulate(season=2018,n_sims=10000)

如果需要,您可以自定义主场优势值、每次模拟开始时使用的压水堆等级调整值和模拟单个游戏时使用的标准偏差:

simulation=nfl.Simulate(season=2018,n_sims=10000,rank_adj=3,home_adj=2.5,st_dev=13.5)
pwr系统

您可以通过创建pwrsystems对象自定义如何生成功率排名。通过指示要包括哪些系统来创建对象:

systems=nfl.PWRsystems(dvoa=True,fpi=True,sagarin=True)simulation=nfl.Simulate(season=2018,n_sims=10000,pwr_systems=systems)

可以使用每个系统的内置对象(srs、dvoa、fpi和sagarin)指定每个系统的权重(默认值为1):

systems=nfl.PWRsystems(srs=True,dvoa=nfl.DVOA(weight=2),fpi=nfl.FPI(weight=1.5))

您还可以通过创建一个通用的pwr对象并向其传递一个包含自定义排名的pandas数据框来合并自己的评级系统。数据框必须包含一个名为"team"的列(包含完整的团队名称)和另一个包含团队排名的列。排名列的名称应该与正在使用的其他系统的名称不同(因此不要使用"fpi"或"srs"":

my_sys_df=pandas.DataFrame([{'Team':'A','Power':-2},{'Team':'B','Power':5}])my_sys=nfl.PWR(weight=2,values=my_sys_df)systems=nfl.PWRsystems(srs=True,others=my_sys)

要使用多个自定义系统,请传递数据帧列表,而不是单个数据帧:

df1=pandas.DataFrame([{'Team':'A','Power':-2},{'Team':'B','Power':5}])df2=pandas.DataFrame([{'Team':'A','Power':0},{'Team':'B','Power':2}])my_sys_1=nfl.PWR(weight=2,values=df1)my_sys_2=nfl.PWR(weight=1.5,values=df2)systems=nfl.PWRsystems(srs=True,others=[my_sys_1,my_sys_2])
回归

(可选)您可以选择通过创建回归对象来回归每个系统生成的评分(如果省略"回归",则不使用回归)。默认情况下,pwr值将回归到样本平均值:

pip install nflsim
0

您可以使用固定权重,方法是指定介于0和1之间的小数点,或基于指定游戏数百分比的可变权重(默认选项):

pip install nflsim
1

您可以将pwr回归到一个固定值,而不是使用样本均值:

pip install nflsim
2

还可以使用pandas数据框为每个团队指定自定义回归值。数据框必须包含一个名为"team"的列,其中包含完整的团队名称,另一个名为"baseline"的列用于回归值:

pip install nflsim
3

除了(或代替)对单个压水堆系统的值进行回归之外,您还可以选择在组合不同系统后对最终结果进行回归:

pip install nflsim
4
执行和分析

设置好模拟对象后,使用run()执行模拟。

pip install nflsim
5

run()方法将返回对simulate对象的引用,因此此语法也可以接受:

pip install nflsim
6

默认情况下,run()将使用joblib包并行运行模拟;通过设置parallel=false:

pip install nflsim
7

一旦执行了模拟,结果将被聚合并存储在几个相关的数据帧中。可以使用Simulations属性直接访问它们:

pip install nflsim
8

或使用类方法作为副本返回:

pip install nflsim
9

默认情况下,所有聚合的数据帧都使用包含模拟号和模拟内行号的多索引。类方法包括一个选项,用于将多索引的"模拟"部分提取到它自己的列中:

adjusted_pwr = [PWR] - numpy.random.normal(0, [rank_adj])
0

您还可以完全禁用聚合统计信息的生成,在这种情况下,结果将存储为模拟对象列表:

adjusted_pwr = [PWR] - numpy.random.normal(0, [rank_adj])
1

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

推荐PyPI第三方库


热门话题
javajaxb在嵌套节点中生成xmlns:xsi声明   java重定向到youtube以上传jsp上可用的视频   java提高了JVM和ANT的性能   java如何将返回的JSON数据放在HTML表单中   java如何发送XWWWFORMURLENCODE在重新授权   java为什么jvm XX:+EliminateAllocations失败   堆移除和重建方法?(爪哇)   Stanford NPL in Spark(Scala)应用程序运行到Java堆空间(Java.lang.OutOfMemoryError)   调试java中打开/关闭println的任何方式(详细模式)   java IntelliJ在鼠标悬停时显示JavaDocs工具提示   Olingo Odata Java中的自动扩展选项   json将postgres文本arry转换为java列表?   oop需要帮助推断Java代码   复选框的java添加操作侦听器AbstractTableModel   java如何从公共静态void main(String[]args)传递值   java从数据库中获取大值   java Processing 2.0电影从jar运行时无法打开电影文件   java如何在不使用应用程序的情况下刷新活动?   尝试将JSON解析为ListView时的Android:JSON parse:null对象引用