#2-2 경주 기록을 속도로 바꾸기 - pandas의 dataframe에서 문자열 다루기

목차

    2017. 8. 2. 12:40

    빅데이터와 AI기술이 발달하면서, 많은 사람들이 관심을 가지고 배우려고 한다. 하지만 현실에서 이러한 기술을 테스트 해보고 공부하기는 쉽지 않다. 여러가지 제약사항이 있지만 가장 큰 것은 데이터이다. 일반인들이 예측 알고리즘을 만들기 위한 데이터를 수집하는 것은 쉽지 않다. 그래서 경마를 재미로 분석하는 것이 학습에 큰 도움이 된다고 생각한다.
    ( 참조: 
    경마로 코딩 배우기 )


    이전 포스팅에서는 분석을 위해 경마 데이터를 수집해 보았다. 데이터를 수집하는 방법은 여러가지가 있지만, 렛츠런파크 싸이트의 데이터를 크롤링해서 쉽게 수집할 수 있었다.
    ( 참조: 경주 결과 웹크롤링 하기 )



    문자열_데이터



    pandas dataframe에서 문자열 다루는 방법을 통해, 경주기록을 속력으로 바꿔보자.


    경마 경기를 분석하기 위해서는 경주기록을 다뤄야 한다. 그리고 경주기록은 숫자가 아닌 문자열 데이터이다. 경주 기록을 분석해도 되지만, 편의상 속도라는 개념이 더 이해하기가 편리했다. 여기서는 경주 기록을 속력으로 바꾸는 작업을 해보도록 하겠다.


    먼저 경주 기록은 아래와 같이 시간을 나타내는 문자열 데이터로 저장되어 있는 것을 확인할 수 있다.



    In[3]: print(race_result["race_time"])

    0         1:02.7

    1         1:03.2

    2         1:03.6

    3         1:03.7

    4         1:03.8

    5         1:03.9

    ....




    해당 변수값을 속도로 바꾸려면 pandas의 dataframe에서 문자열을 다루는 방법을 알아야 한다. 필요한 문자열 데이터를 다루는 방법을  하나씩 알아보며, 속도로 변환해보도록 하자.



    1) split함수를 이용해서 문자열을 자른다.


    특정 문자를 기준으로 문자열을 자를 때 사용할 수 있는 함수가 split이다. 위의 racetime이라는 칼럼의 값을 보면 '1:23.12 ' 이런 형식으로 되어 있다. 분과 초 단위가 섞여 있어, 이를 초단위로 변환하고자 한다. 1:23.12는 83.12초로 변환하면 된다.


    dataframe에 문자열 관련 함수를 적용하려면, 반드시 칼럼명 뒤에 '.str' 을 붙여줘야 한다. race_result["race_time"].str.split(":")이라고 입력하면, 문자열을 ":"으로 나눈다. 이 중에 첫 번째 값이 필요하므로 .str[0]을 입력한다. 잘려진 문자열에서 첫 번째 값을 가져오라는 뜻이다.

    위의 2가지 구문은 합쳐서 race_result["race_time"].str.split(":").str[0]로 작성할 수가 있다.



    In[4]: race_result["mm"] = race_result["race_time"].str.split(":").str[0]

    In[5]: race_result["mm"]

    Out[5]: 

    0         1

    1         1

    2         1

    3         1

    4         1

    ....

    ...



    race_result["mm"]에 우리가 원하는 분에 해당하는 값이 저장된 것을 확인할 수 있다.



    추천포스트



    2) 문자열 변수를 숫자형으로 변환한다.


    이제 분에 해당하는 값을 문자열 데이터에서 숫자형으로 변환해야 한다. 현재 칼럼의 타입을 확인해 보면, string도 하나의 object이기 때문에 'O'라고 표시되는 것을 알 수 있다. dataframe의 각 변수에 대한 type을 알고자 할 때는 칼럼명 뒤에 dtypes를 붙이면 된다.




    In[4]: race_result["mm"].dtypes

    Out[7]: dtype('O')

    .



    숫자형 데이터로 변환하기 위해서는 astype이라는 함수를 이용하면 된다. astype함수를 이용해서 int형으로 변환하였다. 하지만, 실행을 해 보니 아래와 같이 에러가 발생한다.



    In[4]: race_result["mm"]=race_result["mm"].astype(int)

    ValueError: invalid literal for int() with base 10: ''




    값중에 빈 값(' ')들이 있어, int형으로 바꿀 수 없다고 한다. 실제 경주기록에는 중도 탈락이나 이탈 등의 결과값들이 들어 있다. 이런 값들을 제거해야 숫자형으로 변환할 수 있다.



    In[1]: race_result=race_result[race_result["mm"]!=""]

    In[2]: race_result["mm"]=race_result["mm"].astype(int)

    In[3]: print(race_result["mm"].dtypes)

    int64




    첫 번째 행에서 race_result를 새로 만든다. 기존의 race_result 데이터프레임에 조건을 걸어, 분에 해당하는 칼럼에 값이 없는 것은 제외한다. 혹은 값이 없는 칼럼에 0값을 넣으면 된다. dataframe에서 if조건을 사용하면 되는데, 자세한 내용이 궁금하다면 아래 포스팅을 참조해보자.
    ( 참조: 파이썬 판다스 dataframe에서 if문(특정조건) 사용하여 값 바꾸기 )


    mm이라는 칼럼의 값이 공백이 아닌 값을 가져온다. '!=은 아니다'라는 뜻이다. race_result["mm"].astype(int)라고 입력하여 int형으로 데이터 타입을 변경하여 저장한다. 실수형으로 저장하고자 한다면, float을 입력하면 된다.


    변수 타입을 출력하여, int형으로 저장된 것을 확인할 수 있었다. 그리고, 초에 해당하는 부분도 따로 떼어 float형으로 저장을 해 주었다. (소수점이 있어 float형으로 저장하였다.)



    In[4]: race_result["sec"] = race_result["race_time"].str.split(":").str[1]

    In[5]: race_result["sec"] = race_result["sec"].astype(float)

    In[6]: race_result["sec"]

    Out[16]: 

    0          2.7

    1          3.2

    2          3.6

    3          3.7

    4          3.8




    이제 숫자형으로 바꿨으므로 60을 곱하고 더하여, 초단위의 시간으로 바꾸었다.



    In[4]: race_result["rt"] = race_result["mm"]*60 + race_result["sec"]

    In[5]: print(race_result["rt"])

    0          62.7

    1          63.2

    2          63.6

    3          63.7

    4          63.8




    그리고 거리를 나누어주면 원하는 속력값으로 바꿀 수 있다..




    In[4]: race_result["speed"] = race_result["distance"] / race_result["rt"]

    In[5]: print(race_result["speed"])

    0         15.948963

    1         15.822785

    2         15.723270

    3         15.698587




    오늘은 이렇게 경마의 경주기록을 속력으로 바꾸어 보았다. pandas의 dataframe에서 문자열을 다루는 방법을 이용하여, 손쉽게 바꿀 수 있었다. 


    단승 배당을 기준으로 경마에 참여하는 사람들이 예측을 얼마나 정교하게 하는지 한 번 알아보았다. 자세한 내용이 궁금하다면, 아래 포스팅을 참조해보자.
    ( 참조: 경마에 참여하는 사람들의 예측 결과는? )


    오픈API를 사용하면 다양한 재미있는 일들을 해 볼 수 있다. 파이썬을 활용한 오픈API 사용이 궁금하다면 아래 글을 참조해보자.

    (참조: 오픈API를 활용한 사례는 어떤 것들이 있을까?)