HiÐΞClassic

【メモ】大谷選手(2021年)の打撃データ / 打球方向&コースごと / Code

SHOGAKU
2 years ago
打球方向カラム確認データ確認ホームランホームランplot打球plot大谷のみコースごとの結果大谷選手 全球をplotヒット&デッドボール(hit by pitch)event確認ヒット&デッドボール以外をoutとしてplotストライクゾーンチェック

昨日投稿のデータのコード備忘録


打球方向

!pip install pybaseball
from pybaseball import statcast
df = statcast(start_dt='2021-04-01', end_dt='2021-12-31')
df_ohtani = df[df['batter'] == 660271]

参考:大谷さんのID → https://baseballsavant.mlb.com/savant-player/shohei-ohtani-660271

df_ohtani

カラム確認

df_ohtani.columns
Index(['pitch_type', 'game_date', 'release_speed', 'release_pos_x',
       'release_pos_z', 'player_name', 'batter', 'pitcher', 'events',
       'description', 'spin_dir', 'spin_rate_deprecated',
       'break_angle_deprecated', 'break_length_deprecated', 'zone', 'des',
       'game_type', 'stand', 'p_throws', 'home_team', 'away_team', 'type',
       'hit_location', 'bb_type', 'balls', 'strikes', 'game_year', 'pfx_x',
       'pfx_z', 'plate_x', 'plate_z', 'on_3b', 'on_2b', 'on_1b',
       'outs_when_up', 'inning', 'inning_topbot', 'hc_x', 'hc_y',
       'tfs_deprecated', 'tfs_zulu_deprecated', 'fielder_2', 'umpire', 'sv_id',
       'vx0', 'vy0', 'vz0', 'ax', 'ay', 'az', 'sz_top', 'sz_bot',
       'hit_distance_sc', 'launch_speed', 'launch_angle', 'effective_speed',
       'release_spin_rate', 'release_extension', 'game_pk', 'pitcher.1',
       'fielder_2.1', 'fielder_3', 'fielder_4', 'fielder_5', 'fielder_6',
       'fielder_7', 'fielder_8', 'fielder_9', 'release_pos_y',
       'estimated_ba_using_speedangle', 'estimated_woba_using_speedangle',
       'woba_value', 'woba_denom', 'babip_value', 'iso_value',
       'launch_speed_angle', 'at_bat_number', 'pitch_number', 'pitch_name',
       'home_score', 'away_score', 'bat_score', 'fld_score', 'post_away_score',
       'post_home_score', 'post_bat_score', 'post_fld_score',
       'if_fielding_alignment', 'of_fielding_alignment', 'spin_axis',
       'delta_home_win_exp', 'delta_run_exp'],
      dtype='object')

データ確認

df_ohtani[['hit_distance_sc', 'launch_angle']]

df_ohtani['events'].unique()
array(['strikeout', nan, 'home_run', 'walk', 'field_out', 'double',
       'triple', 'single', 'pickoff_3b', 'force_out', 'hit_by_pitch',
       'grounded_into_double_play', 'field_error', 'sac_fly',
       'fielders_choice', 'strikeout_double_play'], dtype=object)

ホームラン

df_ohtani[df_ohtani['events'] == 'home_run']

df_ohtani[df_ohtani['events'] == 'home_run'][['hit_distance_sc', 'launch_angle', 'launch_speed', 'events', 'description','hc_x', 'hc_y']]

ホームランplot

# 全部
import matplotlib.pyplot as plt
df_home_run = df[df['events'] == 'home_run']
df_home_run = df_home_run.dropna(subset=['hc_x','hc_y'])
plt.scatter(df_home_run['hc_x'], df_home_run['hc_y'])
plt.xlim(-10, 270)
plt.ylim(-50, 220)
plt.xlabel('X coordinate')
plt.ylabel('Y coordinate')
plt.gca().invert_yaxis()

# フェア線を引く
plt.plot([125, 250], [210, 85], 'k-', lw=3)
plt.plot([125, 0], [210, 85], 'k-', lw=3)

plt.show()

df_home_run_660271 = df_ohtani[(df_ohtani['events'] == 'home_run') & (df_ohtani['batter'] == 660271)]
df_home_run = df_home_run.dropna(subset=['hc_x','hc_y'])
plt.scatter(df_home_run['hc_x'], df_home_run['hc_y'], color='gray')
plt.scatter(df_home_run_660271['hc_x'], df_home_run_660271['hc_y'], color='r')

plt.xlim(-10, 270)
plt.ylim(-50, 220)


plt.xlabel('X coordinate')
plt.ylabel('Y coordinate')
plt.gca().invert_yaxis()

# フェア線を引く
plt.plot([125, 250], [210, 85], 'k-', lw=3)
plt.plot([125, 0], [210, 85], 'k-', lw=3)

plt.show()

打球plot

import matplotlib.pyplot as plt
df = df.dropna(subset=['hc_x','hc_y'])
plt.scatter(df['hc_x'], df['hc_y'])
plt.xlabel('X coordinate')
plt.ylabel('Y coordinate')
plt.gca().invert_yaxis()

# フェア線を引く
plt.plot([125, 250], [210, 85], 'k-', lw=3)
plt.plot([125, 0], [210, 85], 'k-', lw=3)

plt.show()

# batter 660271の結果を取り出し、df_660271に格納
df_660271 = df[df["batter"] == 660271]

# 全体をプロット
plt.scatter(df['hc_x'], df['hc_y'], color='gray')

# batter 660271の結果を赤色でプロット
plt.scatter(df_660271['hc_x'], df_660271['hc_y'], color='red')

plt.xlabel('X coordinate')
plt.ylabel('Y coordinate')
plt.gca().invert_yaxis()

# フェア線を引く
plt.plot([125, 250], [210, 85], 'k-', lw=3)
plt.plot([125, 0], [210, 85], 'k-', lw=3)

plt.show()

大谷のみ

import matplotlib.pyplot as plt
df_batter_660271 = df[df['batter']==660271]

home_run_events = ['home_run', 'double', 'triple', 'single', 'hit_by_pitch']

df_batter_660271_home_run = df_batter_660271[df_batter_660271['events'].isin(home_run_events)]
plt.scatter(df_batter_660271_home_run['hc_x'], df_batter_660271_home_run['hc_y'], color='red')

df_batter_660271_others = df_batter_660271[~df_batter_660271['events'].isin(home_run_events)]
plt.scatter(df_batter_660271_others['hc_x'], df_batter_660271_others['hc_y'], color='gray')

plt.xlabel('X coordinate')
plt.ylabel('Y coordinate')
plt.gca().invert_yaxis()

# フェア線を引く
plt.plot([125, 250], [210, 85], 'k-', lw=3)
plt.plot([125, 0], [210, 85], 'k-', lw=3)

plt.show()

import matplotlib.pyplot as plt

#home_runのデータを取り出す
df_hr = df[df['events'] == 'home_run']
df_hr = df_hr[df_hr['batter'] == 660271]
#doubleのデータを取り出す
df_2b = df[df['events'] == 'double']
df_2b = df_2b[df_2b['batter'] == 660271]
#tripleのデータを取り出す
df_3b = df[df['events'] == 'triple']
df_3b = df_3b[df_3b['batter'] == 660271]
#singleのデータを取り出す
df_1b = df[df['events'] == 'single']
df_1b = df_1b[df_1b['batter'] == 660271]
#hit_by_pitchのデータを取り出す
df_hbp = df[df['events'] == 'hit_by_pitch']
df_hbp = df_hbp[df_hbp['batter'] == 660271]

#outイベントのデータを取り出す
df_out = df[~df['events'].isin(['home_run', 'double', 'triple', 'single', 'hit_by_pitch'])]
df_out = df_out[df_out['batter'] == 660271]

#plotする
plt.scatter(df_hr['hc_x'], df_hr['hc_y'], color='r', label='home_run')
plt.scatter(df_2b['hc_x'], df_2b['hc_y'], color='b', label='double')
plt.scatter(df_3b['hc_x'], df_3b['hc_y'], color='g', label='triple')
plt.scatter(df_1b['hc_x'], df_1b['hc_y'], color='y', label='single')
# plt.scatter(df_hbp['hc_x'], df_hbp['hc_y'], color='c', label='hit_by_pitch')
plt.scatter(df_out['hc_x'], df_out['hc_y'], color='gray', label='out', zorder=0)
plt.xlabel('X coordinate')
plt.ylabel('Y coordinate')
plt.gca().invert_yaxis()
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)

# フェア線を引く
plt.plot([125, 250], [210, 85], 'k-', lw=3)
plt.plot([125, 0], [210,85], 'k-', lw=3)



plt.title("Ohtani, direction of the batted ball 2021")

plt.show()


コースごとの結果

大谷選手 全球をplot

import matplotlib.pyplot as plt

# create scatter plot using 'plate_x' and 'plate_z' columns
df_ohtani = df_ohtani.dropna(subset=['plate_x','plate_z'])
plt.scatter(df_ohtani['plate_x'], df_ohtani['plate_z'])

# add labels for x and y axis
plt.xlabel('Plate X')
plt.ylabel('Plate Z')

# show the plot
plt.show()

ヒット&デッドボール(hit by pitch)



#home_runのデータを取り出す
df_hr = df[df['events'] == 'home_run']
df_hr = df_hr[df_hr['batter'] == 660271]
#doubleのデータを取り出す
df_2b = df[df['events'] == 'double']
df_2b = df_2b[df_2b['batter'] == 660271]
#tripleのデータを取り出す
df_3b = df[df['events'] == 'triple']
df_3b = df_3b[df_3b['batter'] == 660271]
#singleのデータを取り出す
df_1b = df[df['events'] == 'single']
df_1b = df_1b[df_1b['batter'] == 660271]
#hit_bypitchのデータを取り出す
df_hbp = df[df['events'] == 'hit_by_pitch']
df_hbp = df_hbp[df_hbp['batter'] == 660271]

#outイベントのデータを取り出す
df_out = df[~df['events'].isin(['home_run', 'double', 'triple', 'single', 'hit_by_pitch'])]
df_out = df_out[df_out['batter'] == 660271]

df_1b = df_1b.dropna(subset=['plate_x','plate_z'])
df_hr = df_hr.dropna(subset=['plate_x','plate_z'])
df_2b = df_2b.dropna(subset=['plate_x','plate_z'])
df_3b = df_3b.dropna(subset=['plate_x','plate_z'])
df_hbp = df_hbp.dropna(subset=['plate_x','plate_z'])
df_out = df_out.dropna(subset=['plate_x','plate_z'])


#create scatter plot using 'plate_x' and 'plate_z' columns
plt.scatter(df_hr['plate_x'], df_hr['plate_z'], color='r', label='home_run')
plt.scatter(df_2b['plate_x'], df_2b['plate_z'], color='g', label='double')
plt.scatter(df_3b['plate_x'], df_3b['plate_z'], color='b', label='triple')
plt.scatter(df_1b['plate_x'], df_1b['plate_z'], color='c', label='single')
plt.scatter(df_hbp['plate_x'], df_hbp['plate_z'], color='m', label='hit_by_pitch')

# plt.scatter(df_out['plate_x'], df_out['plate_z'], color='gray', label='out', marker='.')

# add labels for x and y axis
plt.xlabel('Plate X')
plt.ylabel('Plate Z')

# add legend
plt.legend()

# show the plot
plt.show()

event確認

df['events'].value_counts()

ヒット&デッドボール以外をoutとしてplot



#home_runのデータを取り出す
df_hr = df[df['events'] == 'home_run']
df_hr = df_hr[df_hr['batter'] == 660271]
#doubleのデータを取り出す
df_2b = df[df['events'] == 'double']
df_2b = df_2b[df_2b['batter'] == 660271]
#tripleのデータを取り出す
df_3b = df[df['events'] == 'triple']
df_3b = df_3b[df_3b['batter'] == 660271]
#singleのデータを取り出す
df_1b = df[df['events'] == 'single']
df_1b = df_1b[df_1b['batter'] == 660271]
#hit_bypitchのデータを取り出す
df_hbp = df[df['events'] == 'hit_by_pitch']
df_hbp = df_hbp[df_hbp['batter'] == 660271]

#outイベントのデータを取り出す
df_out = df[~df['events'].isin(['home_run', 'double', 'triple', 'single', 'hit_by_pitch'])]
df_out = df_out[df_out['batter'] == 660271]

df_1b = df_1b.dropna(subset=['plate_x','plate_z'])
df_hr = df_hr.dropna(subset=['plate_x','plate_z'])
df_2b = df_2b.dropna(subset=['plate_x','plate_z'])
df_3b = df_3b.dropna(subset=['plate_x','plate_z'])
df_hbp = df_hbp.dropna(subset=['plate_x','plate_z'])
df_out = df_out.dropna(subset=['plate_x','plate_z'])


#create scatter plot using 'plate_x' and 'plate_z' columns
plt.scatter(df_hr['plate_x'], df_hr['plate_z'], color='r', label='home_run')
plt.scatter(df_2b['plate_x'], df_2b['plate_z'], color='g', label='double')
plt.scatter(df_3b['plate_x'], df_3b['plate_z'], color='b', label='triple')
plt.scatter(df_1b['plate_x'], df_1b['plate_z'], color='c', label='single')
plt.scatter(df_hbp['plate_x'], df_hbp['plate_z'], color='m', label='hit_by_pitch')

# 最背面へ
plt.scatter(df_out['plate_x'], df_out['plate_z'], color='gray', label='out', marker='.', linestyle='dotted', zorder=0)


# add labels for x and y axis
plt.xlabel('Plate X')
plt.ylabel('Plate Z')

# add legend
plt.legend()

# show the plot
plt.show()


ストライクゾーンチェック

import matplotlib.pyplot as plt

df_strike = df[df['description'] == 'called_strike'].dropna(subset=['plate_x','plate_z'])

# create scatter plot using 'plate_x' and 'plate_z' columns
plt.scatter(df_strike['plate_x'], df_strike['plate_z'], color='gray', label='all strikes')

# add labels for x and y axis
plt.xlabel('Left/Right')
plt.ylabel('Height')

# add title to the plot
plt.title('Strike Zone')

# add legend to the plot
plt.legend()

# display the plot
plt.show()


コメント
いいね
投げ銭
最新順
人気順
SHOGAKU
2 years ago
コメント
いいね
投げ銭
最新順
人気順
トピック
アプリ

Astar Network

DFINITY / ICP

NFT

DAO

DeFi

L2

メタバース

BCG

仮想通貨 / クリプト

ブロックチェーン別

プロジェクト

目次
Tweet
ログイン