"跟踪球队记录每场比赛"

2024-05-18 19:14:23 发布

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

希望添加一个列,将保持每场比赛的记录每场比赛的轨道。我有一个赛季专栏,上面写着过去几年的每个赛季和季后赛。你知道吗

array(['2012-13', '2013-14', '2014-15', '2015 Post', '2015-16',
       '2016 Post', '2016-17', '2017 Post', '2013 Post', '2014 Post'], dtype=object) 

我应该先使用groupby来分隔每个季节,还是不需要。我试着到处寻找一个类似的问题,但没有发现什么,所以我真的不知道如何处理这个问题。干杯!你知道吗

                 Date             Visitor  V_PTS                  Home  H_PTS  \
0 2012-10-30 19:00:00  Washington Wizards     84   Cleveland Cavaliers     94   
1 2012-10-30 19:30:00    Dallas Mavericks     99    Los Angeles Lakers     91   
2 2012-10-30 20:00:00      Boston Celtics    107            Miami Heat    120   
3 2012-10-31 19:00:00    Dallas Mavericks     94             Utah Jazz    113   
4 2012-10-31 19:00:00   San Antonio Spurs     99  New Orleans Pelicans     95   

   Attendance                    Arena                 Location  Capacity  \
0       20562      Quicken Loans Arena          Cleveland, Ohio     20562   
1       18997           Staples Center  Los Angeles, California     18997   
2       20296  American Airlines Arena           Miami, Florida     19600   
3       17634  Vivint Smart Home Arena     Salt Lake City, Utah     18303   
4       15358     Smoothie King Center   New Orleans, Louisiana     16867   

  Yr Arena Opened   Season  H_Wins  H_Losses  V_Wins  V_Losses  
0            1994  2012-13       0         0       0         0  
1            1992  2012-13       0         0       0         0  
2            1999  2012-13       0         0       0         0  
3            1991  2012-13       0         0       0         0  
4            1999  2012-13       0         0       0         0 

我知道这并不是最具python风格的方法,但到目前为止,我可以用这个代码来描述它是赢还是输

nba['Wins'] = np.where(nba['H_PTS']>nba['V_PTS'], 1, 0)
nba['Losses'] = np.where(nba['H_PTS']<nba['V_PTS'], 1, 0)

有没有办法让它添加到自己的基础上,在同一个季节的标签栏?你知道吗


Tags: homepostptsnbalosses季节arenawins
1条回答
网友
1楼 · 发布于 2024-05-18 19:14:23

这比看上去要复杂得多。我找到的解决方案肯定有简化的方法,但我会一步一步地把它列出来,这样就很清楚发生了什么。你知道吗

但首先值得花点时间问一下为什么这很棘手。它看起来像一个简单的groupby()问题,使用.cumsum()来加总胜负。如果你只是想得到客队的结果,那就太好了。但你的问题是你想为球队赢得胜利,不管他们是客场还是主场。你知道吗

为此,我建议将问题分成几个步骤(当您有一些有问题的代码时,这总是一件有用的事情)。你知道吗

主要答案

首先,将数据分为两个数据帧,一个用于客队,另一个用于主队:

vdf = nba.set_index(['Season', 'Date', 'Visitor'])
vdf['win'] = np.where(vdf['H_PTS'] < vdf['V_PTS'], 1, 0)
vdf.index.names = ['Season', 'Date', 'Team']

hdf = nba.set_index(['Season', 'Date', 'Home'])
hdf['win'] = np.where(hdf['H_PTS'] > hdf['V_PTS'], 1, 0)
hdf.index.names = ['Season', 'Date', 'Team']

一旦分离,我们对每个数据帧做两件事。首先,我们使用np.where()(顺便说一下,完全是pythonic)创建一个win列。我想说只使用布尔值,但这并不能很好地处理.cumsum())。第二,我们重新命名索引,这样我们就不用讨论客队和主队,而是讨论球队。这很重要,因为现在我们要再次将这些数据帧合并为一个:

df = pd.concat([vdf, hdf])
df['loss'] = 1 - df.win
df = df.sort_index(level=['Date'])
gr = df.groupby(level=['Season', 'Team'])

我们可以把一个队的loss算作win的简单倒数,然后我们按Date排序,因为没有一个队可以同时打两场比赛,这应该没问题。然后我们将按SeasonTeam分组,因为这是您要计算结果的组。你知道吗

现在很容易把胜负累加起来:

df['wins'] = gr.win.apply(lambda g: g.shift().cumsum().fillna(0))
df['losses'] = gr.loss.apply(lambda g: g.shift().cumsum().fillna(0))

如果您想得到包括当前游戏在内的结果,可以使用.cumsum()。但是,由于您需要上一个游戏的结果,我们需要使用.shift(),然后用0填充(现在为空)第一行。你知道吗

但现在我们遇到了一个问题:主队和客队在不同的一排!为了解决这个问题,我们再次将它们拆分为单独的数据帧,并重命名这些列,以明确我们谈论的是访客记录还是家庭记录。你知道吗

vdf = df.dropna(subset=['Home'])[['wins', 'losses']].rename(columns=lambda c: 'V_' + c)
hdf = df.dropna(subset=['Visitor'])[['wins', 'losses']].rename(columns=lambda c: 'H_' + c)

最后一步是基于VisitorHome团队名称合并回主数据帧。你知道吗

nba = nba.merge(vdf.astype(int), left_on=['Season', 'Date', 'Visitor'], right_index=True)
nba = nba.merge(hdf.astype(int), left_on=['Season', 'Date', 'Home'], right_index=True)

最后,我们可以(可选)生成您在注释中提到的那种W-L格式:

nba['V_winloss'] = nba['V_wins'].astype(str) + '-' + nba['V_losses'].astype(str)
nba['H_winloss'] = nba['H_wins'].astype(str) + '-' + nba['H_losses'].astype(str)

完成!进一步简化它(这肯定可以做到)留给读者作为练习。你知道吗


所有代码都放在一个地方:

vdf = nba.set_index(['Season', 'Date', 'Visitor'])
vdf['win'] = np.where(vdf['H_PTS'] < vdf['V_PTS'], 1, 0)
vdf.index.names = ['Season', 'Date', 'Team']

hdf = nba.set_index(['Season', 'Date', 'Home'])
hdf['win'] = np.where(hdf['H_PTS'] > hdf['V_PTS'], 1, 0)
hdf.index.names = ['Season', 'Date', 'Team']

df = pd.concat([vdf, hdf])
df['loss'] = 1 - df.win
df['location'] = np.where(pd.notnull(df['Home']), 'h', 'v')
df = df.sort_index(level=['Date'])
gr = df.groupby(level=['Season', 'Team'])

df['wins'] = gr.win.apply(lambda g: g.shift().cumsum().fillna(0))
df['losses'] = gr.loss.apply(lambda g: g.shift().cumsum().fillna(0))

vdf = df.dropna(subset=['Home'])[['wins', 'losses']].rename(columns=lambda c: 'V_' + c)
hdf = df.dropna(subset=['Visitor'])[['wins', 'losses']].rename(columns=lambda c: 'H_' + c)

nba = nba.merge(vdf.astype(int), left_on=['Season', 'Date', 'Visitor'], right_index=True)
nba = nba.merge(hdf.astype(int), left_on=['Season', 'Date', 'Home'], right_index=True)

nba['V_winloss'] = nba['V_wins'].astype(str) + '-' + nba['V_losses'].astype(str)
nba['H_winloss'] = nba['H_wins'].astype(str) + '-' + nba['H_losses'].astype(str)

一个例子(和一些建议)

每当你有问题的时候,试着构造一个你想要的输入和输出的样本,其格式可以让回答者直接复制粘贴到他们的代码中。此示例应演示任务的关键要求。在你的例子中,这可能包括一支同时打主客场和多个赛季的球队。这是一个很有用的练习,甚至在你问问题之前——用基本用例构建一个测试平台可以很容易地检查你编写的代码是否按预期工作。你知道吗

我制作了一个包含这些特性的示例数据帧。请注意,我删除了与当前问题无关的列。你知道吗

>>> nba

   Season  Date Visitor Home  V_PTS  H_PTS
0       1     1       A    E      1      2
1       1     2       B    E      1      0
2       1     3       C    E      1      2
3       1     4       D    E      1      0
4       1     5       E    A      1      2
5       1     6       E    B      1      0
6       1     7       E    C      1      2
7       1     8       E    D      1      0
8       2     9       A    E      1      2

在计算胜负(df['losses'] = ...)之后,您应该检查团队结果是否正确累积:

>>> print df[['wins', 'losses']].sort_index(level=['Team', 'Date']).astype(int)

                  wins  losses
Season Date Team
1      1    A        0       0
       5    A        0       1
2      9    A        0       0
1      2    B        0       0
       6    B        1       0
       3    C        0       0
       7    C        0       1
       4    D        0       0
       8    D        1       0
       1    E        0       0
       2    E        1       0
       3    E        1       1
       4    E        2       1
       5    E        2       2
       6    E        2       3
       7    E        3       3
       8    E        3       4
2      9    E        0       0

最后,你会发现:

   Season  Date Visitor Home  V_PTS  H_PTS  V_wins  V_losses  H_wins  \
0       1     1       A    E      1      2       0         0       0
1       1     2       B    E      1      0       0         0       1
2       1     3       C    E      1      2       0         0       1
3       1     4       D    E      1      0       0         0       2
4       1     5       E    A      1      2       2         2       0
5       1     6       E    B      1      0       2         3       1
6       1     7       E    C      1      2       3         3       0
7       1     8       E    D      1      0       3         4       1
8       2     9       A    E      1      2       0         0       0

   H_losses V_winloss H_winloss
0         0       0-0       0-0
1         0       0-0       1-0
2         1       0-0       1-1
3         1       0-0       2-1
4         1       2-2       0-1
5         0       2-3       1-0
6         1       3-3       0-1
7         0       3-4       1-0
8         0       0-0       0-0

你可以仔细看看,以确保它符合你想要的。你知道吗

相关问题 更多 >

    热门问题