import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
import matplotlib.font_manager as fm
import os
import seaborn as sns
from IPython.display import display
import numpy as np
import re
import json
pd.options.display.max_columns = None
%matplotlib inline
plt.rcParams['font.family'] = 'NanumGothic'
matplotlib.rcParams['axes.unicode_minus'] = False
font_path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'
font_prop = fm.FontProperties(fname=font_path).get_name()
matplotlib.rcParams['font.family'] = font_prop
sns.set_palette('Set2')
os.listdir('./datas')
['Pre_Season_Batter.csv',
'Regular_Season_Batter.csv',
'Pre_Season_Batter copy.csv',
'submission.csv',
'Regular_Season_Batter_copy.csv',
'Regular_Season_Batter_Day_by_Day_b4.csv']
pd.read_csv('./datas/Regular_Season_Batter.csv').head()
|
batter_id |
batter_name |
year |
team |
avg |
G |
AB |
R |
H |
2B |
3B |
HR |
TB |
RBI |
SB |
CS |
BB |
HBP |
SO |
GDP |
SLG |
OBP |
E |
height/weight |
year_born |
position |
career |
starting_salary |
OPS |
0 |
0 |
가르시아 |
2018 |
LG |
0.339 |
50 |
183 |
27 |
62 |
9 |
0 |
8 |
95 |
34 |
5 |
0 |
9 |
8 |
25 |
3 |
0.519 |
0.383 |
9 |
177cm/93kg |
1985년 04월 12일 |
내야수(우투우타) |
쿠바 Ciego de Avila Maximo Gomez Baez(대) |
NaN |
0.902 |
1 |
1 |
강경학 |
2011 |
한화 |
0.000 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0.000 |
0.000 |
1 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.000 |
2 |
1 |
강경학 |
2014 |
한화 |
0.221 |
41 |
86 |
11 |
19 |
2 |
3 |
1 |
30 |
7 |
0 |
0 |
13 |
2 |
28 |
1 |
0.349 |
0.337 |
6 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.686 |
3 |
1 |
강경학 |
2015 |
한화 |
0.257 |
120 |
311 |
50 |
80 |
7 |
4 |
2 |
101 |
27 |
4 |
3 |
40 |
5 |
58 |
3 |
0.325 |
0.348 |
15 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.673 |
4 |
1 |
강경학 |
2016 |
한화 |
0.158 |
46 |
101 |
16 |
16 |
3 |
2 |
1 |
26 |
7 |
0 |
0 |
8 |
2 |
30 |
5 |
0.257 |
0.232 |
7 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.489 |
preseason = pd.read_csv('./datas/Pre_Season_Batter.csv')
print(preseason.shape)
print()
print(preseason.info())
preseason.head()
(1393, 29)
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1393 entries, 0 to 1392
Data columns (total 29 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 batter_id 1393 non-null int64
1 batter_name 1393 non-null object
2 year 1393 non-null int64
3 team 1393 non-null object
4 avg 1393 non-null object
5 G 1393 non-null int64
6 AB 1393 non-null int64
7 R 1393 non-null int64
8 H 1393 non-null int64
9 2B 1393 non-null int64
10 3B 1393 non-null int64
11 HR 1393 non-null int64
12 TB 1393 non-null int64
13 RBI 1393 non-null int64
14 SB 1393 non-null int64
15 CS 1393 non-null int64
16 BB 1393 non-null int64
17 HBP 1393 non-null int64
18 SO 1393 non-null int64
19 GDP 1393 non-null int64
20 SLG 1364 non-null float64
21 OBP 1368 non-null float64
22 E 1393 non-null int64
23 height/weight 1393 non-null object
24 year_born 1393 non-null object
25 position 1393 non-null object
26 career 1393 non-null object
27 starting_salary 1179 non-null object
28 OPS 1364 non-null float64
dtypes: float64(3), int64(18), object(8)
memory usage: 315.7+ KB
None
|
batter_id |
batter_name |
year |
team |
avg |
G |
AB |
R |
H |
2B |
3B |
HR |
TB |
RBI |
SB |
CS |
BB |
HBP |
SO |
GDP |
SLG |
OBP |
E |
height/weight |
year_born |
position |
career |
starting_salary |
OPS |
0 |
0 |
가르시아 |
2018 |
LG |
0.350 |
7 |
20 |
1 |
7 |
1 |
0 |
1 |
11 |
5 |
0 |
0 |
2 |
0 |
3 |
1 |
0.550 |
0.409 |
1 |
177cm/93kg |
1985년 04월 12일 |
내야수(우투우타) |
쿠바 Ciego de Avila Maximo Gomez Baez(대) |
NaN |
0.959 |
1 |
1 |
강경학 |
2011 |
한화 |
0.000 |
4 |
2 |
2 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
2 |
1 |
0 |
0.000 |
0.500 |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.500 |
2 |
1 |
강경학 |
2014 |
한화 |
- |
4 |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
NaN |
NaN |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
NaN |
3 |
1 |
강경학 |
2015 |
한화 |
0.130 |
10 |
23 |
3 |
3 |
0 |
0 |
0 |
3 |
1 |
3 |
0 |
4 |
1 |
9 |
0 |
0.130 |
0.286 |
2 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.416 |
4 |
1 |
강경학 |
2016 |
한화 |
0.188 |
14 |
32 |
4 |
6 |
1 |
1 |
0 |
9 |
2 |
1 |
2 |
0 |
1 |
10 |
0 |
0.281 |
0.212 |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.493 |
'''
1. 선수는 총 1393명이 있다.
2. 데이터는 2002년부터 2018년까지 존재한다.
'''
preseason.describe()
|
batter_id |
year |
G |
AB |
R |
H |
2B |
3B |
HR |
TB |
RBI |
SB |
CS |
BB |
HBP |
SO |
GDP |
SLG |
OBP |
E |
OPS |
count |
1393.000000 |
1393.000000 |
1393.000000 |
1393.000000 |
1393.000000 |
1393.000000 |
1393.000000 |
1393.000000 |
1393.000000 |
1393.000000 |
1393.000000 |
1393.000000 |
1393.000000 |
1393.000000 |
1393.000000 |
1393.000000 |
1393.000000 |
1364.000000 |
1368.000000 |
1393.000000 |
1364.000000 |
mean |
173.434314 |
2013.014358 |
8.705671 |
19.201723 |
2.679828 |
5.021536 |
0.954774 |
0.119885 |
0.391960 |
7.391960 |
2.430725 |
0.629576 |
0.291457 |
1.877961 |
0.330223 |
3.714286 |
0.447236 |
0.361012 |
0.317912 |
0.381910 |
0.676924 |
std |
94.716851 |
4.166757 |
5.562686 |
13.395946 |
2.637212 |
4.232584 |
1.196904 |
0.379976 |
0.748557 |
6.538787 |
2.698122 |
1.146854 |
0.595522 |
2.053392 |
0.642204 |
3.180884 |
0.723364 |
0.269892 |
0.151489 |
0.729521 |
0.386933 |
min |
0.000000 |
2002.000000 |
1.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
25% |
99.000000 |
2010.000000 |
6.000000 |
9.000000 |
1.000000 |
2.000000 |
0.000000 |
0.000000 |
0.000000 |
2.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
0.000000 |
1.000000 |
0.000000 |
0.217000 |
0.250000 |
0.000000 |
0.472000 |
50% |
178.000000 |
2014.000000 |
9.000000 |
18.000000 |
2.000000 |
4.000000 |
1.000000 |
0.000000 |
0.000000 |
6.000000 |
2.000000 |
0.000000 |
0.000000 |
1.000000 |
0.000000 |
3.000000 |
0.000000 |
0.344500 |
0.333000 |
0.000000 |
0.675000 |
75% |
254.000000 |
2017.000000 |
11.000000 |
28.000000 |
4.000000 |
8.000000 |
2.000000 |
0.000000 |
1.000000 |
11.000000 |
4.000000 |
1.000000 |
0.000000 |
3.000000 |
1.000000 |
5.000000 |
1.000000 |
0.478000 |
0.400000 |
1.000000 |
0.867000 |
max |
344.000000 |
2018.000000 |
119.000000 |
183.000000 |
35.000000 |
51.000000 |
11.000000 |
4.000000 |
5.000000 |
68.000000 |
24.000000 |
9.000000 |
4.000000 |
21.000000 |
4.000000 |
36.000000 |
5.000000 |
4.000000 |
1.000000 |
5.000000 |
5.000000 |
'''
프리시즌은 연습경기이기 때문에 많은 데이터가 0쪽에 가깝다.
예를 들어 1년에 일반적인 정규타석을 채우지 않았고, 득전, 타수, 안타 등이 0에 가깝다.
또한 데이터의 양은 과거보다 최근에 가까워 질수록 많아진다.
'''
preseason.hist(figsize=(20,9))
plt.tight_layout()
plt.show()

'''
데이터의 개수가 적어서 그런가 대부분의 연도의 OPS의 중앙값이 비슷하다.
'''
plt.figure(figsize=(20,5))
sns.boxplot(x='year', y='OPS', data=preseason, showfliers=False)
<Axes: xlabel='year', ylabel='OPS'>

'''
몇 몇 선수들을 추출해 OPS를 비교해 보았다.
그러던 도중 결측값이 있는 것을 발견하였다.
'''
preseason_df_2002 = preseason[preseason['year'] == 2002]
preseason_df_2002.head()
|
batter_id |
batter_name |
year |
team |
avg |
G |
AB |
R |
H |
2B |
3B |
HR |
TB |
RBI |
SB |
CS |
BB |
HBP |
SO |
GDP |
SLG |
OBP |
E |
height/weight |
year_born |
position |
career |
starting_salary |
OPS |
228 |
62 |
김주찬 |
2002 |
롯데 |
0.107 |
9 |
28 |
2 |
3 |
0 |
0 |
0 |
3 |
0 |
2 |
0 |
1 |
1 |
7 |
1 |
0.107 |
0.167 |
1 |
183cm/94kg |
1981년 03월 25일 |
내야수(우투우타) |
충암초(장충리틀)-충암중-충암고-삼성-롯데 |
18000만원 |
0.274 |
260 |
67 |
김태균 |
2002 |
한화 |
0.235 |
11 |
34 |
7 |
8 |
5 |
0 |
1 |
16 |
4 |
1 |
0 |
4 |
1 |
14 |
0 |
0.471 |
0.333 |
2 |
185cm/110kg |
1982년 05월 29일 |
내야수(우투우타) |
천안남산초-천안북중-북일고-(대전대) |
16000만원 |
0.804 |
413 |
109 |
박기혁 |
2002 |
롯데 |
0.000 |
8 |
5 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
4 |
0 |
0.000 |
0.000 |
0 |
179cm/77kg |
1981년 06월 04일 |
내야수(우투우타) |
대구수창초-성광중-대구상고-롯데 |
8000만원 |
0.000 |
467 |
119 |
박용택 |
2002 |
LG |
- |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
NaN |
NaN |
0 |
185cm/90kg |
1979년 04월 21일 |
외야수(우투좌타) |
고명초-휘문중-휘문고-고려대 |
30000만원 |
NaN |
511 |
131 |
박한이 |
2002 |
삼성 |
0.319 |
11 |
47 |
7 |
15 |
3 |
0 |
1 |
21 |
4 |
3 |
0 |
3 |
0 |
8 |
1 |
0.447 |
0.360 |
0 |
182cm/91kg |
1979년 01월 28일 |
외야수(좌투좌타) |
초량초-부산중-부산고-동국대 |
30000만원 |
0.807 |
'''
결측값의 개수를 확인해 보았다.
'''
for i, j in preseason.isnull().sum().items():
if not j == 0:
print(i, j)
'''
nan 값이 있는 행만 추출해 보았다.
그 중에서 starting_salary부분이 nan인 경우는 제외 하였다.
'''
preseason[preseason.isna().any(axis=1) & preseason['starting_salary'].notna()].head()
SLG 29
OBP 25
starting_salary 214
OPS 29
|
batter_id |
batter_name |
year |
team |
avg |
G |
AB |
R |
H |
2B |
3B |
HR |
TB |
RBI |
SB |
CS |
BB |
HBP |
SO |
GDP |
SLG |
OBP |
E |
height/weight |
year_born |
position |
career |
starting_salary |
OPS |
2 |
1 |
강경학 |
2014 |
한화 |
- |
4 |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
NaN |
NaN |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
NaN |
37 |
8 |
강상원 |
2016 |
한화 |
- |
6 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
2 |
1 |
0 |
0 |
0 |
0 |
NaN |
NaN |
0 |
172cm/64kg |
1997년 05월 05일 |
외야수(우투좌타) |
온양온천초-온양중-북일고 |
3000만원 |
NaN |
74 |
24 |
김강민 |
2003 |
SK |
- |
3 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
NaN |
NaN |
0 |
182cm/85kg |
1982년 09월 13일 |
외야수(우투우타) |
본리초-대구중-경북고 |
11000만원 |
NaN |
80 |
24 |
김강민 |
2009 |
SK |
- |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
NaN |
NaN |
0 |
182cm/85kg |
1982년 09월 13일 |
외야수(우투우타) |
본리초-대구중-경북고 |
11000만원 |
NaN |
90 |
101 |
문선재 |
2009 |
LG |
- |
2 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
NaN |
1.0 |
0 |
184cm/80kg |
1990년 05월 20일 |
외야수(우투우타) |
광주서림초-광주동성중-광주동성고-LG-상무 |
5000만원 |
NaN |
'''
장타율과 출루율이 계산되지 않아 OPS가 NaN이 나온것을 확인 하였다.
검색해 보니 장타율 같은 경우에는 (3루타 + 2루타 + 홈런) / 안타 로 계산하는데 이것은 TBS식 장타율이라고 한다.
다른 데이터와 비교하여 TBS식 장타율로 계산되었으면 이것도 같은 방법으로 계산하여 채우려고 한다.
'''
print(f'clac_SLG: {preseason.loc[0, ["3B", "2B", "HR"]].sum() / preseason.loc[0, ["H"]]}')
print(f'orig_SLG: {preseason.loc[0, "SLG"]}')
print()
'''
계산해 보니 다르다.
알고보니 이것은 일본 TBS 테레비의 루즈밸트 게임 드라마에서 나온 잘못된 계산식이라고 한다.
조금 더 찾아보니 다른 식을 찾을 수 있었다.
(1루타(단타) x 1 + 2루타 x 2 + 3루타 x 3 + 홈런 x 4) / 타수
'''
cnt = 1
SLG = 0
for i in preseason.loc[0, ['H', '2B', '3B', 'HR']]:
SLG += i * cnt
cnt += 1
SLG = SLG / preseason.loc[0, "AB"]
print(f'clac_SLG: {SLG}')
print(f'orig_SLG: {preseason.loc[0, "SLG"]}')
print()
'''
약 0.1 정도의 오차가 발생하였다.
어디서 잘못 되었나 좀 더 찾아보니
단타는 총 안타에서 2, 3루타 그리고 홈런을 제외한 숫자를 의미한다.
그러면 단타는 안타의 개수는 7이 아니라 2루타와 홈런을 제외한 5가 된다.
이것을 기반으로 다시 계산하였다.
'''
H = preseason.loc[0, 'H'] - preseason.loc[0, ['2B', '3B', 'HR']].sum()
cnt = 2
SLG = H
for i in preseason.loc[0, ['2B', '3B', 'HR']]:
SLG += i * cnt
cnt += 1
SLG = SLG / preseason.loc[0, "AB"]
print(f'clac_SLG: {SLG}')
print(f'orig_SLG: {preseason.loc[0, "SLG"]}')
clac_SLG: H 0.285714
Name: 0, dtype: object
orig_SLG: 0.55
clac_SLG: 0.65
orig_SLG: 0.55
clac_SLG: 0.55
orig_SLG: 0.55
'''
이제 저 계산식을 기반으로 NaN 값을 채우려고 한다.
이제 SLG는 다 채웠으니 OBP만 채우면 된다.
'''
def SLG_calc(row):
if pd.notna(row['SLG']):
return row['SLG']
if pd.notna(row['AB']) or row['AB'] == 0:
return 0
H = row['H'] - row[['2B', '3B', 'HR']].sum()
SLG = (H + row['2B'] * 2 + row['3B'] * 3 + row['HR'] * 4) / row['AB']
return SLG
display(preseason.head())
print()
preseason['SLG'] = preseason.apply(SLG_calc, axis=1)
display(preseason.head())
for i, j in preseason.isnull().sum().items():
if not j == 0:
print(i, j)
|
batter_id |
batter_name |
year |
team |
avg |
G |
AB |
R |
H |
2B |
3B |
HR |
TB |
RBI |
SB |
CS |
BB |
HBP |
SO |
GDP |
SLG |
OBP |
E |
height/weight |
year_born |
position |
career |
starting_salary |
OPS |
0 |
0 |
가르시아 |
2018 |
LG |
0.350 |
7 |
20 |
1 |
7 |
1 |
0 |
1 |
11 |
5 |
0 |
0 |
2 |
0 |
3 |
1 |
0.550 |
0.409 |
1 |
177cm/93kg |
1985년 04월 12일 |
내야수(우투우타) |
쿠바 Ciego de Avila Maximo Gomez Baez(대) |
NaN |
0.959 |
1 |
1 |
강경학 |
2011 |
한화 |
0.000 |
4 |
2 |
2 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
2 |
1 |
0 |
0.000 |
0.500 |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.500 |
2 |
1 |
강경학 |
2014 |
한화 |
- |
4 |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
NaN |
NaN |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
NaN |
3 |
1 |
강경학 |
2015 |
한화 |
0.130 |
10 |
23 |
3 |
3 |
0 |
0 |
0 |
3 |
1 |
3 |
0 |
4 |
1 |
9 |
0 |
0.130 |
0.286 |
2 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.416 |
4 |
1 |
강경학 |
2016 |
한화 |
0.188 |
14 |
32 |
4 |
6 |
1 |
1 |
0 |
9 |
2 |
1 |
2 |
0 |
1 |
10 |
0 |
0.281 |
0.212 |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.493 |
|
batter_id |
batter_name |
year |
team |
avg |
G |
AB |
R |
H |
2B |
3B |
HR |
TB |
RBI |
SB |
CS |
BB |
HBP |
SO |
GDP |
SLG |
OBP |
E |
height/weight |
year_born |
position |
career |
starting_salary |
OPS |
0 |
0 |
가르시아 |
2018 |
LG |
0.350 |
7 |
20 |
1 |
7 |
1 |
0 |
1 |
11 |
5 |
0 |
0 |
2 |
0 |
3 |
1 |
0.550 |
0.409 |
1 |
177cm/93kg |
1985년 04월 12일 |
내야수(우투우타) |
쿠바 Ciego de Avila Maximo Gomez Baez(대) |
NaN |
0.959 |
1 |
1 |
강경학 |
2011 |
한화 |
0.000 |
4 |
2 |
2 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
2 |
1 |
0 |
0.000 |
0.500 |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.500 |
2 |
1 |
강경학 |
2014 |
한화 |
- |
4 |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0.000 |
NaN |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
NaN |
3 |
1 |
강경학 |
2015 |
한화 |
0.130 |
10 |
23 |
3 |
3 |
0 |
0 |
0 |
3 |
1 |
3 |
0 |
4 |
1 |
9 |
0 |
0.130 |
0.286 |
2 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.416 |
4 |
1 |
강경학 |
2016 |
한화 |
0.188 |
14 |
32 |
4 |
6 |
1 |
1 |
0 |
9 |
2 |
1 |
2 |
0 |
1 |
10 |
0 |
0.281 |
0.212 |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.493 |
OBP 25
starting_salary 214
OPS 29
'''
출루율의 계산 공식은 아래와 같다.
(안타 + 볼넷 + 사구) / (타수 + 볼넷 + 사구 + 희생 플라이)
하지만 주어진 데이터에는 희생 플라이는 존재하지 않는다.
그렇기 때문에 일단 0으로 두고 계산해 보았다.
이것으로 한 번 계산해 보았다.
'''
print(f'clac_OPS: {preseason.loc[0, ["H", "BB", "HBP"]].sum() / preseason.loc[0, ["AB", "BB", "HBP"]].sum()}')
print(f'orig_OPS: {preseason.loc[0, ["OBP"]]}')
'''
제대로 된 계산식임을 확인 하였기에 위와 똑같이 채워 주었다.
'''
def OBP_calc(row):
if pd.notna(row['OBP']):
return row['OBP']
denominator = row[['H', 'BB', 'HBP']].sum()
numerator = row[['AB', 'BB', 'HBP']].sum()
if denominator == 0 or numerator == 0:
return 0
OBP = denominator / numerator
return OBP
preseason['OBP'] = preseason.apply(OBP_calc, axis=1)
display(preseason.head())
for i, j in preseason.isnull().sum().items():
if not j == 0:
print(i, j)
clac_OPS: 0.4090909090909091
orig_OPS: OBP 0.409
Name: 0, dtype: object
|
batter_id |
batter_name |
year |
team |
avg |
G |
AB |
R |
H |
2B |
3B |
HR |
TB |
RBI |
SB |
CS |
BB |
HBP |
SO |
GDP |
SLG |
OBP |
E |
height/weight |
year_born |
position |
career |
starting_salary |
OPS |
0 |
0 |
가르시아 |
2018 |
LG |
0.350 |
7 |
20 |
1 |
7 |
1 |
0 |
1 |
11 |
5 |
0 |
0 |
2 |
0 |
3 |
1 |
0.550 |
0.409 |
1 |
177cm/93kg |
1985년 04월 12일 |
내야수(우투우타) |
쿠바 Ciego de Avila Maximo Gomez Baez(대) |
NaN |
0.959 |
1 |
1 |
강경학 |
2011 |
한화 |
0.000 |
4 |
2 |
2 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
2 |
1 |
0 |
0.000 |
0.500 |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.500 |
2 |
1 |
강경학 |
2014 |
한화 |
- |
4 |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0.000 |
0.000 |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
NaN |
3 |
1 |
강경학 |
2015 |
한화 |
0.130 |
10 |
23 |
3 |
3 |
0 |
0 |
0 |
3 |
1 |
3 |
0 |
4 |
1 |
9 |
0 |
0.130 |
0.286 |
2 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.416 |
4 |
1 |
강경학 |
2016 |
한화 |
0.188 |
14 |
32 |
4 |
6 |
1 |
1 |
0 |
9 |
2 |
1 |
2 |
0 |
1 |
10 |
0 |
0.281 |
0.212 |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.493 |
starting_salary 214
OPS 29
def OPS_clac(row):
return row[['SLG', 'OBP']].sum()
preseason['OPS'] = preseason.apply(OPS_clac, axis=1)
display(preseason)
for i, j in preseason.isnull().sum().items():
if not j == 0:
print(i, j)
|
batter_id |
batter_name |
year |
team |
avg |
G |
AB |
R |
H |
2B |
3B |
HR |
TB |
RBI |
SB |
CS |
BB |
HBP |
SO |
GDP |
SLG |
OBP |
E |
height/weight |
year_born |
position |
career |
starting_salary |
OPS |
0 |
0 |
가르시아 |
2018 |
LG |
0.350 |
7 |
20 |
1 |
7 |
1 |
0 |
1 |
11 |
5 |
0 |
0 |
2 |
0 |
3 |
1 |
0.550 |
0.409 |
1 |
177cm/93kg |
1985년 04월 12일 |
내야수(우투우타) |
쿠바 Ciego de Avila Maximo Gomez Baez(대) |
NaN |
0.959 |
1 |
1 |
강경학 |
2011 |
한화 |
0.000 |
4 |
2 |
2 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
2 |
1 |
0 |
0.000 |
0.500 |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.500 |
2 |
1 |
강경학 |
2014 |
한화 |
- |
4 |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0.000 |
0.000 |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.000 |
3 |
1 |
강경학 |
2015 |
한화 |
0.130 |
10 |
23 |
3 |
3 |
0 |
0 |
0 |
3 |
1 |
3 |
0 |
4 |
1 |
9 |
0 |
0.130 |
0.286 |
2 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.416 |
4 |
1 |
강경학 |
2016 |
한화 |
0.188 |
14 |
32 |
4 |
6 |
1 |
1 |
0 |
9 |
2 |
1 |
2 |
0 |
1 |
10 |
0 |
0.281 |
0.212 |
0 |
180cm/72kg |
1992년 08월 11일 |
내야수(우투좌타) |
광주대성초-광주동성중-광주동성고 |
10000만원 |
0.493 |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
1388 |
342 |
황재균 |
2014 |
롯데 |
0.407 |
10 |
27 |
3 |
11 |
2 |
0 |
1 |
16 |
4 |
1 |
0 |
2 |
0 |
5 |
0 |
0.593 |
0.448 |
1 |
183cm/96kg |
1987년 07월 28일 |
내야수(우투우타) |
사당초-이수중-경기고-현대-우리-히어로즈-넥센-롯데-샌프란시스코 |
6000만원 |
1.041 |
1389 |
342 |
황재균 |
2015 |
롯데 |
0.333 |
11 |
30 |
8 |
10 |
3 |
0 |
0 |
13 |
6 |
0 |
0 |
4 |
0 |
3 |
0 |
0.433 |
0.389 |
0 |
183cm/96kg |
1987년 07월 28일 |
내야수(우투우타) |
사당초-이수중-경기고-현대-우리-히어로즈-넥센-롯데-샌프란시스코 |
6000만원 |
0.822 |
1390 |
342 |
황재균 |
2016 |
롯데 |
0.310 |
16 |
42 |
8 |
13 |
3 |
1 |
0 |
18 |
4 |
3 |
1 |
4 |
0 |
4 |
0 |
0.429 |
0.370 |
1 |
183cm/96kg |
1987년 07월 28일 |
내야수(우투우타) |
사당초-이수중-경기고-현대-우리-히어로즈-넥센-롯데-샌프란시스코 |
6000만원 |
0.799 |
1391 |
342 |
황재균 |
2018 |
KT |
0.250 |
6 |
16 |
3 |
4 |
1 |
0 |
1 |
8 |
4 |
0 |
0 |
2 |
0 |
6 |
0 |
0.500 |
0.333 |
3 |
183cm/96kg |
1987년 07월 28일 |
내야수(우투우타) |
사당초-이수중-경기고-현대-우리-히어로즈-넥센-롯데-샌프란시스코 |
6000만원 |
0.833 |
1392 |
344 |
황진수 |
2014 |
롯데 |
0.000 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0.000 |
0.000 |
0 |
181cm/82kg |
1989년 02월 15일 |
내야수(우투양타) |
석천초-대헌중-공주고 |
4000만원 |
0.000 |
1393 rows × 29 columns
starting_salary 214
preseason.to_csv('./datas/Pre_Season_Batter.csv', encoding='utf-8-sig', index=False)
preseason = pd.read_csv('./datas/Pre_Season_Batter.csv')
for i, j in preseason.isnull().sum().items():
if not j == 0:
print(i, j)
starting_salary 214