[파이썬]이중반복(중첩루프)가 잘 이해돼지 않습니다.

조회수 3322회

다른 분이 작성하신 증권사 API 관련 코드입니다. 중간에 BlockRequest()로 값을 넘겨준 뒤 증권사 서버로부터 cpSvr7254.GetHeaderValue(1) 메소드를 통해 자료를 받고 GetDataValue로 자료를 리턴하거나 출력하는 형식입니다.

그런데 중간에 보면 for 안에 for이 들어간 부분이 있습니다. 이것을 어떤 식으로 읽어 오는 지 잘 모르겠습니다. 모두 완성하고 나서 데이터 값은 밑의 엑셀 파일과 같이 되는데요. 가로 데이터 개수가 14개라서 'for ixCol in range(14)'에 14을 입력한 것은 알겠습니다. 그런데 이게 어떤 형식으로 데이터를 읽어 나가는 건 지 잘 모르겠습니다. 세로 방향으로 다 읽어 낸 뒤 tempdata에 입력하고 그 다음에 가로 방향으로 입력하는 건가요? 혼자 해결해보려고 했지만 너무 힘드네요. 고수 분의 답변을 기다립니다.

import time
import win32com.client
def subCpSvr7254(m_code, m_FromDate, m_ToDate):
   ## 대신 API 세팅
    cpSvr7254 = win32com.client.Dispatch("CpSysDib.CpSvr7254")
    cpSvr7254.SetInputValue(0, m_code)       # 종목코드
    cpSvr7254.SetInputValue(1, '6')          # 기간선택 0:기간선택, 1:1개월, ... , 4:6개월
    cpSvr7254.SetInputValue(2, m_FromDate)  # 시작일자
    cpSvr7254.SetInputValue(3, m_ToDate)    # 끝일자
    cpSvr7254.SetInputValue(4, '0')         # 0:순매수 1:비중
    cpSvr7254.SetInputValue(5, '0')         # 투자자
    **cpSvr7254.BlockRequest()**

    **numData=cpSvr7254.GetHeaderValue(1)
    #print(numData)
    data=[]
    for ixRow in range(numData):
        tempData=[]
        for ixCol in range(14): 
            tempData.append(cpSvr7254.GetDataValue(ixCol, ixRow))
        data.append(tempData)**

    #연속 수행
    while cpSvr7254.Continue:
        cpSvr7254.BlockRequest()
        numData = cpSvr7254.GetHeaderValue(1)
        #print(numData)
        for ixRow in range(numData):
            tempData=[]
            for ixCol in range(14):
                tempData.append(cpSvr7254.GetDataValue(ixCol, ixRow))
            data.append(tempData)
            time.sleep(0.1)

    return data

from subDS import subCpSvr7254
from pandas import DataFrame

if __name__ == "__main__":

    code='A005930'        # 삼성전자 코드
    fromDate = '20161201' # 요청 시작 날짜
    toDate = '20161223'   # 요청 마지막 날짜

    ### 자료가져오기
    data=subCpSvr7254(code, fromDate, toDate)
    print(data)
    df=DataFrame(data,  columns=['일자', '개인', '외국인', '기관계', '금융투자', '보험', '투신', '은행', '기타금융', '연기금', '기타법인', '기타외인', '사모펀드', '국가지자체'])
    df.to_csv('subCpSvr7254.csv')

이미지

1 답변

  • data=[]
        for ixRow in range(numData): # first loop
            tempData=[]
            for ixCol in range(14):  #second loop
                tempData.append(cpSvr7254.GetDataValue(ixCol, ixRow))
            data.append(tempData)**
    
    

    이 부분만 떼서 보시면, first loop는 row 그러니까 데이터의 수 만큼 행을 루프하는 것입니다. 엑셀의 하나의 행, 하나의데이터 레코드에 해당합니다.

    한개의 데이터에 대해 tempData라는 빈 list를 정의한 상태에서 second loop에 들어가게 되는데, second loop는 열을 루프합니다. 엑셀의 열에 해당하는 것이죠. API에서 현재의 데이터에 해당하는 열의 값(일자, 개인, .. 등)을 가져와서 tempData에 append 함으로써 tempData는 한개의 데이터(엑셀에서 하나의 행)가 됩니다.

    그렇게 하나의 데이터에 대해 모든 정보를 저장하고 나면 second loop가 끝나게 되고 완성된 하나의 데이터를 최종 data list에 append 합니다. 그리고 다음 데이터로 넘어가면 다시 tempData를 빈 list로 리셋합니다.

    그리고 다시 second loop를 돌면서 또다른 데이터를 완성하는 식입니다.

    이중 루프를 보실 때 맨 안쪽의 루프가 어떻게 도는지 먼저 확인하시고 바깥의 루프로 어떻게 돌게 되는지 생각해보시면 조금 더 편합니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)