머신러닝으로 야구 득/실점 예측해보기 (3) 스코어 뽑아내기
- 목차
[('9.1 (금)\n\n18:30', 'NC\n\n1:6\n\n롯데'), ('9.2 (토)\n\n17:00', '한화\n\n0:9\n\n롯데'), ('9.3 (일)\n\n14:00', '한화\n\n2:7\n\n롯데'), ('9.5 (화)\n\n18:30', '롯데\n\n2:6\n\nSK'), ('9.6 (수)\n\n18:30', '롯데\n\nVS\n\nSK\n경'), ('9.7 (목)\n\n18:30', '삼성\n\n6:5\n\n롯데'), ('9.8 (금)\n\n18:30', '삼성\n\n5:6\n\n롯데'), ('9.9 (토)\n\n17:00', '롯데\n\n2:3\n\nkt'), ('9.10 (일)\n\n14:00', '롯데\n\n7:5\n\nkt'), ('9.12 (화)\n\n18:30', '롯데\n\n2:1\n\nLG'), ('9.13 (수)\n\n18:30', '롯데\n\n1:3\n\nLG'), ('9.14 (목)\n\n18:30', 'KIA\n\n11:2\n\n롯데'), ('9.15 (금)\n\n18:30', 'KIA\n\n3:4\n\n롯데'), ('9.16 (토)\n\n17:00', 'SK\n\n1:6\n\n롯데'), ('9.17 (일)\n\n14:00', 'SK\n\n5:9\n\n롯데'), ('9.19 (화)\n\n18:30', '두산\n\n8:3\n\n롯데'), ('9.22 (금)\n\n18:30', '롯데\n\n2:0\n\n한화'), ('9.23 (토)\n\n17:00', '넥센\n\n2:7\n\n롯데'), ('9.26 (화)\n\n18:30', '한화\n\n8:11\n\n롯데'), ('9.29 (금)\n\n18:30', '롯데\n\n7:2\n\nSK')] |
롯데가 반등에 성공했던 2017년 9월의 성적을 앞선 글의 코드를 이용하여 뽑아냈다.
각 튜플은 (날짜 데이터, 스코어 데이터)로 이루어져있다.
이제 이 튜플 리스트를 연도-월-일-승패-득점-실점-상대팀 순으로 정리하고 싶다.
def score(ls):
tmp = []
for datestring, teamscore in ls :
pos0 = datestring.find(".")
pos1 = datestring.find("(")
pos2 = datestring.find(")")
month = datestring[:pos0].strip()
date = datestring[pos0+1:pos1].strip()
day = datestring[pos1+1:pos2].strip()
month = int(month)
date = int(date)
if "VS" in teamscore:
continue
else :
team1 = teamscore[:3].strip()
team2 = teamscore[-3:].strip()
pos4 = teamscore.find(":")
score1 = teamscore[3:pos4].strip()
score2 = teamscore[pos4+1:-3].strip()
score1 = int(score1)
score2 = int(score2)
if team1 == "롯데":
r = score1
er = score2
op = team2
else :
r = score2
er = score1
op = team1
if r > er :
wdl = "승"
elif r < er :
wdl = "패"
else :
wdl = "무"
tmp.append((month, date, day, wdl, r, er, op))
return tmp
월.일 (요일) 경기시간 으로 이루어져있으므로 . 앞은 월, . 뒤는 날짜, () 안에는 요일이라는 점을 이용하여 날짜를 나눴다.
스코어 데이터에 'VS' 즉 경기 취소된 날이 있다면 더 이상 데이터 처리를 하지 않고 다음 튜플로 넘어가게 했다.
KIA의 경우를 포함하여 팀 명은 앞뒤로 최대 3글자이므로 2글자라도 strip()을 통해 공백을 없앨 수 있다.
그리고 : 양 옆으로 스코어임을 이용했다.
이 함수를 돌려서 확인해보자.
ls = cutst(st)
sc = score(ls)
for (month, date, day, wdl, r, er, op) in sc :
print(str(month)+'월 '+str(date)+'일 '+day+'요일 '+str(r)+':'+str(er)+' '+wdl+' '+op)
9월 1일 금요일 6:1 승 NC 9월 2일 토요일 9:0 승 한화 9월 3일 일요일 7:2 승 한화 9월 5일 화요일 2:6 패 SK 9월 7일 목요일 5:6 패 삼성 9월 8일 금요일 6:5 승 삼성 9월 9일 토요일 2:3 패 kt 9월 10일 일요일 7:5 승 kt 9월 12일 화요일 2:1 승 LG 9월 13일 수요일 1:3 패 LG 9월 14일 목요일 2:11 패 KIA 9월 15일 금요일 4:3 승 KIA 9월 16일 토요일 6:1 승 SK 9월 17일 일요일 9:5 승 SK 9월 19일 화요일 3:8 패 두산 9월 22일 금요일 2:0 승 한화 9월 23일 토요일 7:2 승 넥센 9월 26일 화요일 11:8 승 한화 9월 29일 금요일 7:2 승 SK |
하지만 문제는 또 있었다. 바로 더블헤더 경기.
롯데가 무참히 발렸던 2018년 10월 10일 경기이다.
이 달의 경기를 확인해보자.
[('10.2 (화)\n\n18:30', '롯데\n\n8:6\n\nSK'), ('10.3 (수)\n\n14:00', '롯데\n\n6:7\n\n한화'), ('10.4 (목)\n\n18:30', '롯데\n\n7:2\n\n한화'), ('10.5 (금)\n\n18:30', '두산\n\nVS\n\n롯데\n경'), ('10.6 (토)\n\n17:00', '한화\n\n5:8\n\n롯데'), ('10.7 (일)\n\n14:00', '롯데\n\n8:2\n\nNC'), ('10.9 (화)\n\n14:00', 'KIA\n\n10:11\n\n롯데'), ('10.10 (수)\n\n15:00', 'KT\n\n10:1\n\n롯데'), ('18:22', 'KT\n\n7:0\n\n롯데'), ('10.11 (목)\n\n18:30', '롯데\n\n4:0\n\nKIA'), ('10.12 (금)\n\n18:30', '롯데\n\n4:6\n\nKIA'), ('10.13 (토)\n\n17:00', '롯데\n\n5:1\n\nKIA'), ('10.14 (일)\n\n14:00', '두산\n\n5:1\n\n롯데')] |
10월 10일 첫 경기는 잘 정리되어 나왔다. 하지만 그 다음에 있는 더블헤더 두 번째 경기는 날짜 데이터에 경기시간만 적혀있다. 이를 score() 함수에 넣으면 에러가 난다.
pos0 = datestring.find(".")
pos1 = datestring.find("(")
pos2 = datestring.find(")")
month = datestring[:pos0].strip()
date = datestring[pos0+1:pos1].strip()
day = datestring[pos1+1:pos2].strip()
month = int(month)
date = int(date)
이 부분에서 오류가 난다.
pos0, pos1, pos2의 위치가 각각 ., (, )의 위치다. 하지만 '18:22'라는 날짜 데이터에는 ., (, )가 없으므로 모두 -1을 낸다.
그러면 month == '18:2', date == '18:2', day == '18:2'라는 결과가 나온다. 이걸 정수화하니 오류가 나는 것이다.
이걸 해결하기 위해 다음과 같이 코드를 수정했다.
date = datestring[pos0+1:pos1].strip()
day = datestring[pos1+1:pos2].strip()
try :
month = int(month)
date = int(date)
except :
month = tmp[-1][0]
date = tmp[-1][1]
day = tmp[-1][2]
...
sc = score(ls)
for (month, date, day, wdl, r, er, op) in sc :
print(str(month)+'월 '+str(date)+'일 '+day+'요일 '+str(r)+':'+str(er)+' '+wdl+' '+op)
10월 2일 화요일 8:6 승 SK 10월 3일 수요일 6:7 패 한화 10월 4일 목요일 7:2 승 한화 10월 6일 토요일 8:5 승 한화 10월 7일 일요일 8:2 승 NC 10월 9일 화요일 11:10 승 KIA 10월 10일 수요일 1:10 패 KT 10월 10일 수요일 0:7 패 KT 10월 11일 목요일 4:0 승 KIA 10월 12일 금요일 4:6 패 KIA 10월 13일 토요일 5:1 승 KIA 10월 14일 일요일 1:5 패 두산 |
더블헤더 경기도 잘 정리된 것을 확인할 수 있다.
(다음 글에 이어서)
'데이터 분석 > 머신러닝' 카테고리의 다른 글
머신러닝과 기상 데이터를 이용해 홈런 갯수 예측해보기 (1) 소스 가져오기 (0) | 2020.05.10 |
---|---|
머신러닝으로 야구 득/실점 예측해보기 (5) 머신러닝 (0) | 2020.05.05 |
머신러닝으로 야구 득/실점 예측해보기 (4) 데이터 저장 (0) | 2020.05.05 |
머신러닝으로 야구 득/실점 예측해보기 (2) string 정리하기 (0) | 2020.05.05 |
머신러닝으로 야구 득/실점 예측해보기 (1) 소스 가져오기 (0) | 2020.05.05 |