2016-12-07 206 views
0

我想获得NHL赛季每场比赛的统计数据和比赛信息。我正在与Stata合作。我发现包nhlscrapi,并已编写的代码来获取所有数据和特定季节的统计:nhlscrapi - 下载数据错误

# Import statements 
# Notice how I import the whole modules and not the functions explicitly as given in the online example (good practice) 
from nhlscrapi.games import game, cumstats 
from nhlscrapi import constants 
import csv 


# Define season being considered: 
season = 2012 

# Get all stats they have defined 
# Googled "get all methods of a class python" and found this: 
# http://stackoverflow.com/questions/34439/finding-what-methods-an-object-has 
# Also, needed to excclude some methods (ABCMeta, ...) after I checked what they do 
# (I did that with: "help(cumstats.METHODNAME)") and saw that they did not contain stats 
methods = [method for method in dir(cumstats) if callable(getattr(cumstats, method)) and 
               method != 'ABCMeta' and 
               method != 'AccumulateStats' and 
               method != 'ShotEventTallyBase' and 
               method != 'abstractmethod' and 
               method != 'TeamIncrementor' and 
               method != 'EF' and 
               method != 'St'] 

# Set up dictionary with all stats 
cum_stats = {method: getattr(cumstats, method)() for method in methods} 

print('All the stats:', cum_stats.keys()) 

# Now, look up how many games were in the regular season of the year 2012 
maxgames = constants.GAME_CT_DICT[season] 

# If one is interested in all the home coaches (as an example), one would first set up an empty list, 
# and gradually fill it: 
thingswewant_keys = ['home_coach', 'away_coach', 'home', 'away', 'attendance', 'Score', 'Fenwick'] 
thingswewant_values = {key: [] for key in thingswewant_keys if not key in cum_stats.keys()} 
thingswewant_values.update({key+'_home': [] for key in cum_stats.keys()}) 
thingswewant_values.update({key+'_away': [] for key in cum_stats.keys()}) 

# Now, loop over all games in this season 
for i in range(**12**): 
    # Set up object which queries database 
    # If one enters the following command in ipython: "help(game.Game)", one sees also alternative ways to set up 
    # query other than the one given in the example 
    ggames = game.Game(game.GameKey(season, game.GameType.Regular, i+1), cum_stats=cum_stats) 

    # This object 'ggames' now contains all the information of 1 specific game. 
    # To concatenate all the home coaches for example, one would do it like this 

    for key in thingswewant_keys: 
     if not key in cum_stats.keys(): 
      # First case: Information is attribute of ggames (e.g. home_coach) 
      if not key in ['home', 'away', 'attendance']: 
       thingswewant_values[key] += [getattr(ggames, key)] 

      # Second case: Information is key of ggames.matchup (e.g. home) 
      if key in ['home', 'away', 'attendance']: 
       thingswewant_values[key] += [ggames.matchup[key]] 

    # Third case: Information is a cum_stat 
    # Figure out home_team and away team 
    hometeam = ggames.matchup['home'] 
    awayteam = ggames.matchup['away'] 

    for key in cum_stats.keys(): 
     thingswewant_values[key+'_home'] += [ggames.cum_stats[key].total[hometeam]] 
     thingswewant_values[key+'_away'] += [ggames.cum_stats[key].total[awayteam]] 

# Make one single table out of all the columns 
results = [tuple([key for key in thingswewant_values.keys()])] 
results += zip(*[thingswewant_values[key] for key in thingswewant_values.keys()]) 

# Write to csv 
with open('brrr.csv', 'wb') as f: 
    writer = csv.writer(f) 
    writer.writerows(results) 

现在的问题是,在每一个季节,有一定的比赛结束后,代码将停止并吐出以下错误:

Traceback (most recent call last): 
    File "C:/Users/Dennis/Downloads/AllStatsExcell.py", line 67, in <module> 
    thingswewant_values[key+'_home'] += [ggames.cum_stats[key].total[hometeam]] 
    File "C:\Python27\lib\site-packages\nhlscrapi\games\game.py", line 211, in cum_stats 
    return self.play_by_play.compute_stats() 
    File "C:\Python27\lib\site-packages\nhlscrapi\games\playbyplay.py", line 95, in compute_stats 
    for play in self._rep_reader.parse_plays_stream(): 
    File "C:\Python27\lib\site-packages\nhlscrapi\scrapr\rtss.py", line 56, in parse_plays_stream 
    p_obj = parser.build_play(p) 
    File "C:\Python27\lib\site-packages\nhlscrapi\scrapr\rtss.py", line 130, in build_play 
    p['vis_on_ice'] = self.__skaters(skater_tab[0][0]) if len(skater_tab) else { } 
    File "C:\Python27\lib\site-packages\nhlscrapi\scrapr\rtss.py", line 159, in __skaters 
    if pl[0].text.isdigit(): 
AttributeError: 'NoneType' object has no attribute 'isdigit' 

在2012赛季,这个游戏发生后12所以我只是在赛季的第12场运行2012

​​

在例如,,它崩溃。但是如果我再次运行这条线,我会得到结果。

我不知道如何解决这个问题。

如果我只是可以得到所有游戏的csv文件,即使有一些缺失值,我也会很高兴。

回答

1

首先,您需要自己做一些调试。该错误明确指出:

File "C:/Users/Dennis/Downloads/AllStatsExcell.py", line 67, in thingswewant_values[key+'_home'] += [ggames.cum_stats[key].total[hometeam]]

这意味着您的程序的第67行有错误。在底部它表明你是什么错误是:

AttributeError: 'NoneType' object has no attribute 'isdigit'

这意味着,你正在试图将属性isdigit上的对象,它是NoneType的价值。正如你可能猜测的那样,NoneType对象没有任何内容。

这是有问题的线路,与块前面沿:

for key in cum_stats.keys(): 
    thingswewant_values[key+'_home'] += [ggames.cum_stats[key].total[hometeam]] 

你想要做什么可能是以下几点:

for key in cum_stats.keys(): 
    try: 
     thingswewant_values[key+'_home'] += [ggames.cum_stats[key].total[hometeam]] 
    except Exception as e: 
     print(e) 
     print("key={}".format(key) 
     print("hometeam={}".format(hometeam) 
     print("ggames.cumstats={}".format(s[key].total[hometeam]) 

这是一个基本错误捕获块。第一个打印行应该告诉你这个例外。下面的告诉你关于你在违规行中使用的各种事情的状态。你的工作是弄清楚哪个是NoneType(它可能不是我提供的那个),然后,找出为什么它是NoneType。基本上是:看看你有的数据,并试图在该块中操纵。它缺少一些东西。

+0

谢谢纳撒尼尔。我会尝试这个 – Evidenz

+0

如果有帮助,不要忘记用你发现的任何附加信息来上传和更新你的问题(假设你没有解决问题)。当你鼓励人们更可能帮助你。 –