NoneType 'объект не имеет атрибута' append ' - PullRequest
0 голосов
/ 06 июля 2019

Я пытался создать фрейм данных со столбцами, предоставляя статистику всех игр НФЛ за одну неделю. Однако в НФЛ две команды получают «пока», что означает, что они не будут играть на этой неделе, поэтому нет данных для игры Когда я не использую «если игра не является None», это дает тот же объект «NoneType» не имеет атрибута «home» для «hteam = game.home», что означает отсутствие данных для home из-за прощания, но когда я использую его, он все равно выдает ту же ошибку, однако на этот раз это для добавляющей части. Я не очень понимаю, почему, потому что часть, добавляющая данные, находится внутри оператора if. Заранее спасибо

Я пробовал делать отступы, но на самом деле это ни на что не влияло и выдает мне ту же ошибку

teams= ['KC','NYJ','ATL','BAL','PIT','ARI','JAX','OAK','PHI','IND','SEA','CAR','NYG','NO','MIA','TB','LAC']
df= pd.DataFrame(columns =["Home","Away","Win","hRushYds","hPassYds",
                           'hPuntAvg','hPenYds',"aRushYds","aPassYds",
                           'aPuntAvg','aPenYds',"hScore","aScore"])

def teamStats(h,data):
    w = 0
    game = nflgame.one(2017,1,h,h)
    if game is not None:
        hteam = game.home
        ateam = game.away
        hpass_yds = game.stats_home.passing_yds
        apass_yds = game.stats_away.passing_yds
        hscore = game.score_home
        ascore = game.score_away
        hrush_yds = game.stats_home.rushing_yds
        arush_yds = game.stats_away.rushing_yds
        hpen_yds = game.stats_home.penalty_yds
        apen_yds = game.stats_away.penalty_yds
        hpunt_avg = game.stats_home.punt_avg
        apunt_avg = game.stats_away.punt_avg
        if hteam == game.winner:
            w = 1
        data = data.append({'Home':hteam,'Away':ateam,'Win': w,
                           'hPassYds':hpass_yds,'aPassYds':apass_yds,'hScore': hscore,
                           'aScore':ascore,'hRushYds':hrush_yds,'aRushYds':arush_yds,
                           'hPenYds':hpen_yds,'aPenYds': apen_yds,'hPuntAvg':hpunt_avg,
                           'aPuntAvg': apunt_avg}, ignore_index=True)
        return data

for h in teams:
    df = teamStats(h,df)
df

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Если я понимаю ваш код, вы пытаетесь перебрать список teams и добавить их статистику во фрейм данных, если у них есть статистика для добавления.Вы передаете фрейм данных в функцию teamStats, позволяете ей добавлять и возвращаться к новому фрейму данных, который в цикле установлен на df.

Это не обязательно неправильно, но я бы сказал,Предпочитают, чтобы функция возвращала данные для добавления (если они есть), а добавление выполнялось бы во внешнем цикле.Я думаю, что это будет чище и менее подвержено ошибкам.

Имея это в виду, я бы переписал ваш код следующим образом:

teams = ["KC", "NYJ", "ATL", "BAL", "PIT", "ARI", "JAX", "OAK",
         "PHI", "IND", "SEA", "CAR", "NYG", "NO", "MIA", "TB", "LAC"]
df = pd.DataFrame(columns=["Home", "Away", "Win", "hRushYds", "hPassYds",
                           "hPuntAvg", "hPenYds", "aRushYds", "aPassYds",
                           "aPuntAvg", "aPenYds", "hScore", "aScore"])


def team_stats(h):
    game = nflgame.one(2017, 1, h, h)
    if game is not None:
        return {
            "Home": game.home,
            "Away": game.away,
            "Win": int(game.home == game.winner),  # int(True) = 1, int(False) = 0
            "hPassYds": game.stats_home.passing_yds,
            "aPassYds": game.stats_away.passing_yds,
            "hScore": game.score_home,
            "aScore": game.score_away,
            "hRushYds": game.stats_home.rushing_yds,
            "aRushYds": game.stats_away.rushing_yds,
            "hPenYds": game.stats_home.penalty_yds,
            "aPenYds": game.stats_away.penalty_yds,
            "hPuntAvg": game.stats_home.punt_avg,
            "aPuntAvg": game.stats_away.punt_avg,
        }
    return None


for h in teams:
    stats = team_stats(h)
    if stats is not None:
        df = df.append(stats, ignore_index=True)
df

Как видите, функция team_stats возвращаетданные для добавления (если есть данные) и цикл проверяет, нужно ли добавлять данные или нет.Я предпочитаю такой подход, потому что таким образом функция не изменяет никакие внешние данные (переменные или структуры данных, которые не были определены в функции локально), поэтому вероятность возникновения ошибок меньше, потому что вы забыли вернуть data в случае, еслиигра None (см. ответ kawillzocken).

Два последних замечания о питоническом коде:

  1. Если ваша функция возвращает None в конкретном случае, вы должны написать return None явно, даже если написать return или позволить функции достичь конца своего тела, достигается тот же результат.Таким образом, становится понятнее, что вы хотите вернуть None, и это, возможно, помогло вам уловить эту ошибку.Используйте другие способы в функциях, которые ничего не должны возвращать (void функции).
  2. В python, согласно pep8 , более обычным является написание имен функций (и переменных тоже) вsmall_letters_with_underscores_as_spaces.Поэтому более привычно писать team_stats вместо teamStats.Конечно, это личное предпочтение, но я думаю, что это хорошая практика - придерживаться соглашений.
0 голосов
/ 06 июля 2019

Вы ничего не возвращаете от teamstats, когда game равно None. Затем вы присваиваете возвращаемое значение df. Итак, теперь df может быть None (в случае, если game не было). В следующей итерации цикла for h in teams вы пытаетесь вставить этот df (==None) в teamstats снова, в какой момент он терпит неудачу, потому что нет None.append.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...