Если я понимаю ваш код, вы пытаетесь перебрать список 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).
Два последних замечания о питоническом коде:
- Если ваша функция возвращает
None
в конкретном случае, вы должны написать return None
явно, даже если написать return
или позволить функции достичь конца своего тела, достигается тот же результат.Таким образом, становится понятнее, что вы хотите вернуть None
, и это, возможно, помогло вам уловить эту ошибку.Используйте другие способы в функциях, которые ничего не должны возвращать (void функции). - В python, согласно pep8 , более обычным является написание имен функций (и переменных тоже) в
small_letters_with_underscores_as_spaces
.Поэтому более привычно писать team_stats
вместо teamStats
.Конечно, это личное предпочтение, но я думаю, что это хорошая практика - придерживаться соглашений.