728x90

06.파이썬(python) 오픈api json파일 가져오기

 

요즘 많은 공공데이터들을 json파일로 공개를 하고 있습니다.

csv파일로 다운로드를 받을수 있게 해 놓는 경우도 있지만 json으로만 공개하는 경우도 많기 떄문에

파이썬을 통해 json파일을 파싱하는 법에 대해서 알아보겠습니다.

 

kobis라는 영화진흥위원회 오픈api를 파싱해 볼건데

http://www.kobis.or.kr/kobisopenapi/homepg/apiservice/searchServiceInfo.do

위 링크를 들어가면 회원가입을 해서 key값을 따로 받지 않아도 json url을 통해 접근이 가능하기 때문에

이 곳의 영화목록 데이터를 사용하겠습니다.

 

위 페이지 가장 아래쪽에 xml과 json이라고 써있는 url이 있는데 저희는 json파일을 사용할 것이기 떄문에

json에 있는 url을 복사해서 가져오겠습니다.

 

그전에 먼저 파싱에 필요한 패키지부터 import해야합니다.

import 후 movieURL에 복사해둔 url을 넣어주겠습니다. 

 

 

 

링크를 보면 여러개의 요청변수를 볼 수 있는데

저는 &openStartDt=2017&itemPerPage=40를 url뒤에 추가해줘서

2017년에 오픈한 데이터 40개를 가져와 보겠습니다.

 

json파일을 보면 파이썬의 딕셔너리 형식으로 되어 있고 파싱한 json파일을 파이썬의 딕셔너리 구조로 저장을 해주어야 합니다.

 

 

 

 

movieData를 보면 딕셔너리 형식으로 'movieListResult','source','movieList'등 여러 값들이 들어와 있는것을 확인할 수 있는데

변수들이

\uc601\ud654\uc9c4\ud765\uc704\uc6d0\ud68c 

이런식으로 이상하게 들어와 있습니다.

일단 이부분은 넘어가고 뒤에서 설명하겠습니다.

 

이제 파싱해온 movieData를 DataFrame으로 만들어 주겠습니다.

많은 변수들중 저는 movieCd, movieNm, movieNmEn, openDt, peopleNm을 가져올 거기 떄문에

이 변수이름을 가진 DataFrame을 먼저 생성하겠습니다.

 

결과값을 보면

이러한 DataFrame이 생성된 걸 확인할 수 있습니다.

 

파이썬 딕셔너리는 계층구조로 key값을 통해 value값을 얻을수 있는데

앞에 포스팅한 간단한 딕셔너리구조에 대해 이해하고 있으면 쉽게 value값을 가져올 수 있을것 입니다.

계층 구조이기 때문에 한번에 원하는 변수에 접근하기가 어렵습니다.

 

{u'movieListResult': {u'source': u'\uc601\ud654\uc9c4\ud765\uc704\uc6d0\ud68c', u'totCnt': 786, u'movieList': [{u'prdtStatNm': u'\uac1c\ubd09\uc608\uc815', u'movieCd': u'20178121', u'repNationNm': u'\uc911\uad6d', u'prdtYear': u'2015', u'directors': [], u'movieNmEn': u'Boonie Bears : Homeward Journey', u'movieNm': u'\ubd80\ub2c8\ubca0\uc5b4:\ub85c\uac70\ube45 \ucef4\ubc31\ud648 \ud504\ub85c\uc81d\ud2b8', u'openDt': u'20170629', u'repGenreNm': u'\uc560\ub2c8\uba54\uc774\uc158', u'typeNm': u'\uc7a5\ud3b8', u'nationAlt': u'\uc911\uad6d', u'companys': [], u'genreAlt': u'\uc560\ub2c8\uba54\uc774\uc158'}, {u'prdtStatNm': u'\uac1c\ubd09', u'movieCd': u'20177781', u'repNationNm': u'\uc77c\ubcf8', u'prdtYear': u'2016', u'directors': [{u'peopleNm': u'\ubaa8\ub9ac \ud788\ub370\ud1a0\ub77c'}], u'movieNmEn': u'Hentaidantituma', u'movieNm': u'\ubcc0\ud0dc\uac00 \ub41c \ub0b4 \uc544\ub0b4', u'openDt': u'20170609', u'repGenreNm': u'\uba5c\ub85c/\ub85c\ub9e8\uc2a4', u'typeNm': u'\uc7a5\ud3b8', u'nationAlt': u'\uc77c\ubcf8', u'companys': [], u'genreAlt': u'\uba5c\ub85c/\ub85c\ub9e8\uc2a4,\ub4dc\ub77c\ub9c8'}, {u'prdtStatNm': u'\uac1c\ubd09', u'movieCd': u'20177783', u'repNationNm': u'\uc77c\ubcf8', u'prdtYear': u'2016', u'directors': [{u'peopleNm': u'\uc720\ud0a4\uce58 \uc624\uce20\uce74'}], u'movieNmEn': u'FLARE', u'movieNm': u'\ud50c\ub808\uc5b4', u'openDt': u'20170609', u'repGenreNm': u'\uba5c\ub85c/\ub85c\ub9e8\uc2a4', u'typeNm': u'\uc7a5\ud3b8', u'nationAlt': u'\uc77c\ubcf8', u'companys':

 

movieIdData를 보면 위에처럼 나오는데

가장 앞에잇는 movieListResult에 접근한뒤
그 안에있는 movieList에 접근해야 합니다.

 

여기까지 보면 다음 변수들은 [{},{},{}]형식으로 movieList들이 쭉 저장되어 있는데

우선 첫번째에 있는 movieNm을 가져와보겠습니다.

 

 

이렇게 하면 결과값으로

부니베어:로거빅 컴백홈 프로젝트

가 나오는걸 볼 수 있는데 print를 안해주면 아까 위에처럼 안나오고 한글로 바뀌어 출력됩니다.

 

다음은 for문을 사용해서 가져오려던 변수값들을 한번에 쭉 가져오는 코드입니다.


 

 

마지막에 peopleNm을 if,else문으로 구분해준 이유는

api를 제공할때 모든 변수값을 100%정확히 해주는게 아니고 빠진 값들도 있기때문에

해당 값이 없을때 아무것도 넣지말라는 예외처리를 해주어야 합니다.

안해주면 movieIdData len과 어긋나면서 오류가나게 됩니다.

 

movieIDDF

를 확인해보면

 

 

 

이런식으로 쭉 입력이 된것을 확인할수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

06.랜덤포레스트(RandomForest) in R

 

랜덤포레스트란 앞에서 배운 의사결정트리를 랜덤으로 만들어 나온 결과를 투표방식으로 예측하는 알고리즘 입니다.

그렇기 때문에 하나의 트리를 통해 분류하는 의사결정트리보다 높은 정확성을 갖는 강력한 알고리즘이라고 할 수 있습니다.

 

랜덤포레스트 모델을 생성할때 ntree(트리개수), mtry(변수개수)를 지정해주어야 합니다.

 

먼저 randomForest패키지를 install해주고 불러옵니다.

데이터셋은 R에서 기본으로 제공하는 iris데이터셋을 사용하겠습니다.

 

그다음 랜덤포레스트 모델을 생성한뒤

파라미터를 조정해주는 코드 입니다.

 

일단 ntree=300, mtry=4로 지정을 한뒤 모델을 생성해 보겠습니다.

 

model2를 실행시키면

다음과 같이 결과를 확인할 수 있습니다.

결과에서 confusion matrix를 통해 분류한 내용과

error rate를 확인할 수 있습니다.

 

 

 

다음은 변수중요도로 랜덤포레스트 모델을 생성하는 것입니다,

iris데이터는 변수가 4개밖에 되지않아서 큰 차이는없지만

변수가 많고 큰데이터는 변수중요도에 따라 error rate가 크게 변하기 때문에

변수 종요도로 생성해주는 것이 좋습니다.

importance = T를 추가해주면 됩니다.

 

 

랜덤포레스트는 모델을 생성할 때 파라미터를 입력을 해 주기때문에

어떤 파라미터가 높은 정확도를 갖는지 알수 없습니다.

그렇기 때문에 for문을 사용해서 최적의 파라미터를 찾을 수 있습니다.

 

이 코드를 돌리면 결과값이 쭉 출력되는데

그중 error rate가 낮은 파라미터값을 사용하면 됩니다.

 

 

728x90
05.파이썬(python) 조건문, if문

 

파이썬의 if문은 몇가지 주의점만 조심하면, 다른 언어를 사용했던 분들은 아주쉽게 사용할 수 있습니다.

기본 구조는

으로 이루워져 있습니다.

 

여기에서 주의할점은 if문에서 조건문을 ()로 묶어주는것이 아니고 마지막에 : 을 붙여줘야 한다는 점과

파이썬에는 문장 마지막에 ;이 없고 줄을 변경하면 문장이 끝나기 때문에 주의해야 합니다.

또, 자바나 C에서는 수행동작부분을 {}로 묶어주지만 파이썬에서는 들여쓰기(tab)으로 구분하기 때문에

if문 안에서 동작할 부분은 들여쓰기를 한후 작성해줘야 오류가 나지않고 돌아갑니다.

 

간단한 if문을 작성해 보겠습니다.

 

리스트를 통해서도 if문에 접근을 할 수 있습니다.

 

이경우 a가 list에 있기 떄문에 "a 입니다"를 출력할 것이고

 

이경우 a가 list에 없기 땨문에 "아무것도아닙니다"가 출력될 것입니다

 

다음은 elif입니다. elif는 java에서 else if와 같은 것입니다.

 

if문과 다른점은

 

if 조건1:

if 조건2:

 

가 있을때 두 if문 모두 판단하지만

 

if 조건1:

elif 조건2:

 

경우 조건1이 만족한다면 elif를 생략하고 넘어가고

조건1이 불만족한다면 조건2를 판단한다는 점입니다.

 

 

728x90

04.파이썬(python) 집합(set) 자료형 

 

 

집합(set) 자료형에 대해서 알아보겠습니다.

우선 집합 자료형의 특징은 중복이 안되고, 순서가 없는 자료형이라 인덱스로 접근이 불가능하다는 점 입니다.

 

집합 자료형은 

 

set1 = set(["a","b","c","a"]) #집합 자료형 선언 방법1

set2 = {"a","b","c","a"} #집합 자료형 선언 방법2

 

이렇게 두가지로 선언을 해줄수 있습니다.

위에서 보면 a가 2개씩 들어갔지만 집합 자료형은 중복이 안되기 때문에 

{'a', 'b', 'c'} 이러한 결과값을 볼 수 있습니다.

 

집합 자료형은 인덱스로 접근이 불가능하다고 했기때문에

인덱스로 접근하려면 리스트로 변경을 해줘야 합니다.

 

set1 = set(["a","b","c"])

list1 = list(set1) #집합을 리스트로 변환

 

다음은 교집합, 합집합, 차집합입니다.

 

#교집합, 합집합, 차집합 구하기

set1 = set([1,2,3,4,5])

set2 = set([3,4,5,6,7])

 

#교집합 

print(set1 & set2)

print(set1.intersection(set2))

 

{3, 4, 5} #결과

 

#합집합

print(set1 | set2)

print(set1.union(set2))

{1, 2, 3, 4, 5, 6, 7} #결과

 

#차집합

print(set1 - set2)

print(set2.difference(set1))

{1, 2} #결과

{6, 7} #결과

 

#값 1개 추가하기(add)

set1 = {1, 2, 3}

set.add(4)

s1 #결과값 = {1, 2, 3, 4}

 

#값 여러개 추가하기(update)

set1 = {1, 2, 3}

set.update([4, 5, 6])

s1 #결과값 = {1, 2, 3, 4, 5, 6}

 

#특정값 제거(remove)

set1 = {1, 2, 3}

set.remove(2)

s1 #결과값 = {1, 3}

+ Recent posts