前提
pythonでバスケットボールのシュート確率の分析を行うプログラムを作りたいと思っています。
APIを利用して、ある選手の・あるシーズンにおけるシュートの様子を以下のような形のDataFrame形式で複数(50個ほど)取得することができました。以下、DataFrameの特徴を記します。
- 一つのDataFrameは1試合あたりのシュートに関する情報で、N本目のシュートが決まった(MADE_FRAG=1)か外れたか(MADE_FRAG=0)を示している
- 一つのDataFrameの行数は、1試合ごとのシュート本数であり、試合ごとに本数は異なるため行数も異なる→DataFrameのサイズが異なる
- SHOT_ATTEMPTED_FLAGは常に1。
SHOT_MADE_FLAG | SHOT_ATTEMPTED_FLAG | |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
2 | 0 | 1 |
3 | 1 | 1 |
SHOT_MADE_FLAG | SHOT_ATTEMPTED_FLAG | |
---|---|---|
0 | 1 | 1 |
1 | 1 | 1 |
2 | 0 | 1 |
3 | 1 | 1 |
4 | 1 | 1 |
5 | 0 | 1 |
実現したいこと
- シーズンを通して、N本目のシュート確率がどうだったかを知りたい
- そのために、50個ほどあるDataFrame内の値を全て足し合わせたい→足し合わせた結果SHOT_ATTEMPTED_FLAGの値=DataFrameの個数=試合数となれば良い
- 例えば、50試合のデータがあったとすると、「1本目のシュートは確率○%、2本目のシュートは確率○%で入り」
発生している問題・エラーメッセージ
- DataFrameのサイズが揃っていないためか、計算が上手くいきません
- 正しいかは分からないですが、十分な行数のあるDataFrame(値は全て0)を用意して、for文で上記のDataFrameを.addで足し合わせています。
- その結果、以下のように、全てが0のDataFrameが返されます。
SHOT_MADE_FLAG SHOT_ATTEMPTED_FLAG 0 0 0 1 0 0 2 0 0 3 0 0 4 0 0 5 0 0 6 0 0 7 0 0 8 0 0 9 0 0 10 0 0 11 0 0 12 0 0 13 0 0 14 0 0 15 0 0 16 0 0 17 0 0 18 0 0 19 0 0 20 0 0 21 0 0
該当のソースコード
python
1import matplotlib.pyplot as plt 2import matplotlib.patches as patches 3import pandas as pd 4import json 5from nba_api.stats.endpoints import playergamelogs,shotchartdetail 6import numpy as np 7from IPython.display import display 8import seaborn as sns 9 10#値が全て0で十分な行数のあるDataFrameを作成 11shooting = [] 12for k in range(50): 13 shooting.append(k) 14feature = ['SHOT_MADE_FLAG', 'SHOT_ATTEMPTED_FLAG'] 15primary_data = pd.DataFrame(index=shooting, columns=feature) 16primary_data.fillna(0, inplace=True) 17 18def get_game_id(player_id="",Season=""):#playerAのplayer_idと情報を取得したいシーズンを入力 19 #playerAが当該シーズンに出場した試合idを取得する 20 player_game_id = playergamelogs.PlayerGameLogs(player_id_nullable=player_id,season_nullable=Season) 21 player_game_id = json.loads(player_game_id.get_json()) 22 rowdata = player_game_id["resultSets"][0]["rowSet"] 23 headers = player_game_id["resultSets"][0]["headers"] 24 game_df = pd.DataFrame(rowdata, columns=headers) 25 game_id_list = game_df.GAME_ID 26 #取得した試合idをリストにする 27 game_id_list = game_id_list.values.tolist() 28 for i in game_id_list:#試合idリストの番号とplayerAのplayer_idを元に、試合iにおけるAのシュート結果を取得 29 player_shots = shotchartdetail.ShotChartDetail(player_id=player_id,season_nullable=Season,game_id_nullable=i,context_measure_simple="FGA", team_id=1610612757) 30 player_shots = json.loads(player_shots.get_json()) 31 shots = player_shots["resultSets"][0]["rowSet"] 32 headers = player_shots["resultSets"][0]["headers"] 33 shot_df = pd.DataFrame(shots, columns=headers) 34 #取得したシュート結果から必要部分を抜き出してDataFrame化(ここまではできていることを確認済み) 35 shot_df = shot_df.loc[:,['SHOT_MADE_FLAG','SHOT_ATTEMPTED_FLAG']] 36 #関数外に作っておいた「値が全て0で十分な行数のあるDataFrame」に抜き出したDataFrameの値を足す 37 primary_data.add(shot_df) 38 print(primary_data) 39 40get_game_id(player_id=203081, Season="2020-21")
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/09/16 13:42