【发布时间】:2020-07-20 05:37:59
【问题描述】:
我有一个网球比赛结果的 CSV 数据集,格式与此类似:https://www.kaggle.com/jordangoblet/atp-tour-20002016
我想创建另一个表格来显示每个球员的胜负数、自上次比赛以来的天数、平均发球率等。
一位朋友建议尝试这样的事情:
games = [
["Elliot", 7, "Maya", 10],
["Elliot", 10, "Brendan", 8],
["Jamie", 7, "Omid", 10],
["Elliot", 6, "Jamie", 10],
["Brendan", 7, "Jamie", 10],
]
players = {}
K = 32.0
game_number = 1
for game in games:
p1name, p1score, p2name, p2score = game
if p1name not in players:
players[p1name] = {
'wins': 0,
'losses': 0,
'score': 1000.0,
}
if p2name not in players:
players[p2name] = {
'wins': 0,
'losses': 0,
'score': 1000.0,
}
更多代码...
...
print('Rank Player Elo Wins Losses')
rank = 1
for player, p in sorted(players.items(), key=lambda item: (item[1]['score'], item[0]), reverse=True):
print('%4s %20s %7.1f %5s %7s' % (rank, player, p['score'], p['wins'], p['losses']))
rank += 1
我试图通过使我的 df 成为列表列表来根据我的需要调整此代码:
lol = df.values.tolist()
players = {}
for game in lol:
game_id, tournament_name, tournament_id, tournament_date, round_match, winner, winner_id, loser, loser_id, winner_elo,
loser_elo, winner_delta, loser_delta, winner_set_1, loser_set_1, winner_set_2, loser_set_2, winner_set_3, loser_set_3,
winner_set_4, loser_set_4, winner_set_5, loser_set_5, winner_sets, loser_sets, winner_serve_points_won,
loser_serve_points_won, winner_serve_hold, loser_serve_hold, winner_points_won, loser_points_won, winner_true_serve_pct,
loser_true_serve_pct = game
以上都是我原来的df中的列名
但我收到此错误:
NameError: name "game_id" is not defined
原始代码运行良好,但我不明白为什么 =game 不适用于我的情况。
我错过了什么吗?有没有更好的方法来解决这个问题?我的数据集有大约 60k 个实例和 33 列
编辑:找到解决方案,变量 = 游戏应该在一行中。但是,如果有更好的解决方案来实现我在 cmets 中描述的内容,欢迎您发表评论
编辑:列信息
game/tournament/winner/loser_id = unique id's
tournament_name = matches are played in daily tournaments
tournament_date = date of tournament/match
round_match = round of tournament the match takes place
winner/loser= winner/loser name
winner/loser_elo = current elo for the day
winner/loser_delta = delta change after match
winner/loser_set_1,2,3,4,5 = score for winner/loser per game, match ends when a player reaches 3 games, 11 points needed to win a game or 2 point differential (extra points if game is tied at 10-10)
winner/loser_sets= number of sets
winner/loser_points_won = total points per player in the match
winner/loser_true_serve_pct = % of points player wins when he is serving
winner_serve_points_won/loser_serve_points_won is obsolete
winner_serve_hold/loser_serve_hold will be replaced by winner/loser_true_serve_pct
【问题讨论】:
-
我正在使用 pandas 数据框,您在最后一个代码中看到的所有变量(game_id、tournament_name 等 = 游戏)都是我在 df 中的列的标题。我试图获取每个玩家玩游戏的最近日期,以找出他们最近的 elo。我按“获胜者”分组,然后按日期排序并获得最大日期。我为“失败者”做了同样的事情,但我找不到一种方法来比较同一玩家之间的最大日期并从“elo”列中获取一个值(如果最近日期该玩家是一个“赢家”,那么我需要'winner_elo',如果失败者我需要'loser_elo')
-
所以除了统计输赢之外,处理 pandas 似乎很难,而这个字典列表列表似乎是一个很好的解决方案
-
嗯,如果您要同时生成多个输出列,请用伪代码写出 'winner'、max date (newest?) / 'loser'、'elo' / 'winner_elo 的规范' / 'loser_elo';我无法关注你的评论。如果您展示一个如何计算这些内容的简单示例,例如 6-10 条记录,将会有所帮助。 (此外,这是非常特定于数据集的,Kaggle competition's kernels 通常会展示一些很好的探索性数据分析,或者发布您自己的数据集以获取了解该数据集的人的反馈)。
-
抱歉低估了你的问题——这比乍一看更难——我们不能只使用
df.groupby()。您需要在数据框中查询出现在“赢家”或“输家”列中的玩家姓名。这是最难做对的部分。剩下的就简单了。
标签: python pandas list dictionary