글 목록

엑셀에서 Open API 통해 직접 한국은행 경제통계시스템(ECOS) 시계열 데이터를 다운받아 보자 (II) - 복수 시계열

안녕하세요 여몽의 눈동자입니다. 지난 포스팅에서는 한개의 데이터를 다운받는 법을 보았는데요 실제 일을 하다보면 여러개의 시계열을 동시에 뽑아서 분석하는 경우가 많죠. 그래서 이번에는 한번에 여러 시계열 데이터를 다운받는 법을 알아보겠습니다.

이번 포스팅에서는 일단 데이터 추출에 집중하고 다음 포스팅에서는 어떻게 다운받은 데이터를 우리가 주로 사용하는 long format 으로 변경할지에 대해 알아보겠습니다.

1. 복수의 통계데이터 추출

수출물가지수와 수입물가지수를 1971년 1월부터 2019년 5월까지 다운로드 하겠습니다.

우선 한국은행 Open API 홈페이지로 가셔서
(https://ecos.bok.or.kr/jsp/openapi/OpenApiController.jsp?t=main)

개발가이드-> 통계코드검색 에서 필요한 통계들의 통계코드를 확인합니다.

수출물가지수(기본분류)의 통계코드는 019Y301 이고 총지수의 항목코드는 *AA 그리고 원화기준의 경우 W의 항목코드 입니다.

이 경우 url 설정은 다음과 같습니다.

http://ecos.bok.or.kr/api/StatisticSearch/[본인의 인증키]/xml/kr/1/10000/019Y301/MM/197101/201905/*AA/W/

마찬가지로 수입물가지수(기본분류)의 통계코드는 018Y301 이고 총지수의 항목코드는 *AA 그리고 원화기준의 경우 W의 항목코드 입니다.

url 설정은 다음과 같습니다.

http://ecos.bok.or.kr/api/StatisticSearch/[본인의 인증키]/xml/kr/1/10000/018Y301/MM/197101/201905/*AA/W/

복수의 데이터를 추출하기 위한 코드 예시 입니다.

---------------------------------------------------------------------------------------------------

Sub callOpenapi()
 
    Dim callUrl As String
    Dim result As String
    Dim objHttp As New WinHttpRequest
 
    Dim nodeList As IXMLDOMNodeList
    Dim nodeRow As IXMLDOMNode
    Dim nodeCell As IXMLDOMNode
 
    Dim rowCount As Integer
    Dim cellCount As Integer
    Dim rowRange As Range
    Dim cellRange As Range
    Dim sheet As Worksheet
 
    callUrl = "http://ecos.bok.or.kr/api/StatisticSearch/[본인의 인증키]/xml/kr/1/10000/019Y301/MM/197101/201905/*AA/W/"
    objHttp.Open "GET", callUrl, False
    objHttp.Send
 
    If objHttp.Status = 200 Then
        result = objHttp.ResponseText
     
        Dim objXml As MSXML2.DOMDocument
        Set objXml = New DOMDocument
        objXml.LoadXML (result)
     
        Set sheet = ActiveSheet
        Set nodeList = objXml.SelectNodes("/StatisticSearch/row")
     
        rowCount = 0
        For Each nodeRow In nodeList
            rowCount = rowCount + 1
            cellCount = 0
            For Each nodeCell In nodeRow.ChildNodes
                cellCount = cellCount + 1
                Set cellRange = sheet.Cells(rowCount, cellCount)
                cellRange.Value = nodeCell.Text
            Next nodeCell
        Next nodeRow
    End If
 
    callUrl = "http://ecos.bok.or.kr/api/StatisticSearch/[본인의 인증키]/xml/kr/1/10000/018Y301/MM/197101/201905/*AA/W/"
    objHttp.Open "GET", callUrl, False
    objHttp.Send
 
 
    If objHttp.Status = 200 Then
        result = objHttp.ResponseText
     
        objXml.LoadXML (result)
     
        Set sheet = ActiveSheet
        Set nodeList = objXml.SelectNodes("/StatisticSearch/row")
     
        For Each nodeRow In nodeList
            rowCount = rowCount + 1
            cellCount = 0
            For Each nodeCell In nodeRow.ChildNodes
                cellCount = cellCount + 1
                Set cellRange = sheet.Cells(rowCount, cellCount)
                cellRange.Value = nodeCell.Text
            Next nodeCell
        Next nodeRow
    End If
 
End Sub

--------------------------------------------------------------------------------------------------

코드를 보시면 url 요청이 두번 들어가는 것을 보실 수 있습니다.

다만 코드를 자세히 보시면 첫번째 요청에 비해 두번째 요청시에는
Dim objXml As MSXML2.DOMDocument
Set objXml = New DOMDocument
이 두줄이 생략되어 있는데요 중복 설정시의 오류를 방지하기 위함입니다.

또한 rowCount = 0 도 생략이 되어있는데요
만약 두번째 요청시 rowCount 를 다시 0으로 돌리게 되면 첫번째 데이터를 저장한 셀 위치에 다시 두번째 데이터를 덮어씌우게 되므로 이것을 방지하기 위함입니다.

이제 매크로를 실행하시면


아래와 같이 수출물가지수 바로 밑에 수입물가지수가 다운로드 된 것을 보실 수 있습니다.



(세부항목코드 미지정시)

참고로 세부 항목코드를 지정하지 않으시면 해당 항목 내의 모든 세부항목에 대한 다운로드가 실행됩니다. 예를 들어 수출물가지수에서 세부항목코드를 생략할 경우 사용하는 url은

http://ecos.bok.or.kr/api/StatisticSearch/[본인의 인증키]/xml/kr/1/10000/019Y301/MM/197101/201905/

가 되는데요 이렇게 url을 넣고 VBA 코드를 실행하면 한국은행통계 항목 7.5.1. 수출물가지수(기본분류)에 있는 모든 세부항목을 한꺼번에 다운받게 됩니다. 한번에 다운로드가 가능한 것은 장점이지만 그만큼 다운로드에 시간도 많이 걸립니다. 심지어 이경우 데이터가 10000개를 넘어가므로 다 받을 수도 없습니다. 따라서 10000 이상의 큰 숫자로 url의 요청종료건수를 변경해주는 것이 필요합니다.


(어떻게 long format 시계열 테이블로 바꿀까?)

그런데 우리가 일반적으로 사용하는 시계열 데이터는 long format 즉

시간     변수1       변수2

t1        값1(t1)      값2(t1)
t2        값1(t2)      값2(t2)

이런 형태이죠. 다음 포스팅에서는 어떻게 이러한 형식으로 변환할지 알아보겠습니다.









댓글