#2-2 경주 기록을 속도로 바꾸기 - pandas의 dataframe에서 문자열 다루기
목차
빅데이터와 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를 활용한 사례는 어떤 것들이 있을까?)
'Python > 파이썬 경마 분석' 카테고리의 다른 글
#1-2 경마 데이터 수집하기 - 렛츠런 파크 사이트 보기 (0) | 2017.08.11 |
---|---|
#1-3 경마 데이터 수집하기 - 크롤링을 위해 필요한 프로그램 (0) | 2017.08.11 |
#2-4 나만의 레이팅 시스템 만들기(elo rating) (2) | 2017.08.11 |
#3-1 모델링을 위한 패키지 - sklearn (0) | 2017.08.10 |
2017년 8월 6일 렛츠런파크 부산 4번째 경주 (0) | 2017.08.10 |
SQLite3 파이썬 pandas 데이터프레임으로 불러오기 (0) | 2017.07.31 |
#1-8 경마 데이터 수집하기(7) - 경기 결과를 다 크롤링해야 하나요? (8) | 2017.07.28 |
#1-7 경마 데이터 수집하기 - 다수의 경기를 SQLite3 DB에 저장하기 (2) | 2017.07.28 |