머신러닝으로 야구 득/실점 예측해보기 (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 패 두산

더블헤더 경기도 잘 정리된 것을 확인할 수 있다.

 

 

 

(다음 글에 이어서)

728x90
반응형