如何解决数据帧中的变量?

2024-10-03 23:18:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Excel中执行解算器函数以最小化变量并获得成功。下面我们可以看到我是如何做到的:

  • 首先,我们有一张“客场球队”、“客场Pts”、“主场”的比赛表 球队、主场得分、比赛总数、主场动作:

Excel table

  • 然后,我们得到每个团队需要最小化的变量:

Variables minimized

  • 下面是我想在中重现的解算器函数的设置 Python:

Set Up solver function

在Python中,我导入了带有“客场球队”、“客场球员”、“主场球队”、“主场球员”、“比赛总数”和“主场球员”信息的表,然后我创建了两个以上与将最小化的变量相关的列。在添加的第一列中,变量与主队实力(ht1、ht2、…、ht18)相关,相当于Excel中AB列中的变量;在第二列中,有客队实力变量(at1、at2、…、at18),相当于Excel中的AC列

它们将在公式中用于计算主客场球队的参数估计值,就像在Excel中所做的那样:

  1. PEhome=Hadj+ht[i]-at[i]
  2. PEaway=Aadj+ht[i]-at[i]

其中Hadj为“主场调整”,Aadj为“客场调整”

  • 如何应用OLS最小化在[I]解决HadjAadj和所有ht[I]问题

这里我最大的挑战是知道如何在python中设置它,如果真的需要添加带有变量的列,以及如何组织所有这些以使用scipy.minimization

注意:在使用“np.linalg.lstsq”之前,我已经解决了变量问题,这非常简单和容易,但是在这个时候,我的变量在数据帧的每一行中都会发生变化。我的疑问是如何设置所有这些来解决这些问题。因此,我尝试应用“scipy.minimization”来完成这项任务,但没有成功。但这不是以正确的方式组织的。代码如下

# Variables to be minimized
'''Get unique variables in columns 'HT' and 'AT', sort items, and append more two variables that will be also minimized: 'Hadj', and 'Aadj', that is home and away adjustments.'''

var = np.concatenate([games['HT'].unique(), games['AT'].unique()])
var = sorted(var, key=lambda x: int("".join([i for i in x if i.isdigit()])))
var = np.append(var, ['Hadj','Aadj'])


# Initial values for var to be minimized
initial = np.repeat(10., var.size)

# Ratings for home and away team
def func(coeffs, var, games):
    # Parameter Estimate for Home and Away teams:
    lookup = dict()
    for i in range(len(var)):
        lookup[var[i]] = coeffs[i]
    games = games.replace(lookup)

'''functions = Home Adjustment + home team - away team
              Away Adjustment + home team - away team'''


    peH = games['Hadj'] + games['HT'] - games['AT']
    peA = games['Aadj'] + games['HT'] - games['AT']
    
    # EXP Function
    expFH = math.exp(peH) / (1 + math.exp(peH))
    expFA = math.exp(peA) / (1 + math.exp(peA))
    
    # Z Score
    homeZs = norm.cdf(expFH)
    awayZs = norm.cdf(expFA)
    
    # Estimated Points
    estHP = avgHP + (homeZs * stdevHP)
    estAP = avgAP + (awayZs * stdevAP)
    
    # Errors Sq for each teams, then sum them all
    homeEsq = np.array((estHP - games['Home Pts'])**2).sum()
    awayEsq = np.array((estAP - games['Away Pts'])**2).sum()
    totalEsq = homeEsq + awayEsq
    
    return totalEsq

res = minimize(func, x0=initial, args=(var, games))

Tags: andhomeforvarnpexcelgamesteam