ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PER PBR 활용07 : 기업별 산업코드 PER PBR 데이터 생성 프로그램 구조
    금융퀀트/(퀀트)PERPBR활용 2023. 6. 13. 06:48
    반응형

    python Module의 사용

    기업별 산업코드, PER, PBR을 한 번에 보여주는 데이터를 만들기 위해서 PER PBR 활용06 : 기업별 산업코드 PER PBR 데이터 생성 프로그램 CLASS 구성에서 각 STEP 별 기초 기능들을 클래스로 묶어 보았다. 이제 클래로 묶어낸 함수들을 순서에 맞게 실행하는 기능만 구현하면 된다. 그런데 클래스로 묶어낸 단순한 세부 기능들과 그 기능들을 종합적으로 실행하는 기능은 구분할 필요가 있다. 작업의 단계가 다르기 때문이다. 기능을 구분하는 방법은 그냥 파일을 각각 만들면 된다. 즉, "기초작업을 하는 함수의 클래스로 이루어진 파일"과 "기초 함수들을 순서에 맞게 실행시켜서 MYSQL DB에 데이터를 넣어주는 파일", 두 가지 파일을 만들면 된다. 파이썬에서는 이런 각각의 파일을 모듈이라고 한다.

    기업별 산업별 PER PBR 데이터 프로그램 구조

    모듈의 이름은 본인 마음대로 임의로 정하면 된다. 이번 프로젝트에서는 기초작업을 위한 파일은 configFunc.py로 하고, 기초 함수들을 순서에 맞게 실행시켜서 MYSQL DB에 데이터를 넣어주는 파일은 main.py로 할 것이다. 프로그램 구조를  그려보면 아래와 같다.

    그림1: 기업별 산업코드, PER, PBR 데이터구축 프로그램

    그림 1에서 확인할 수 있듯이 main.py에서는 configFunc.py의 GetDf 클래스를 이용해서 기본 주식정보 목록 DataFrame인 df_init을 만들고 이 목록을 바탕으로 GetMap, GetAddData 클래스를 이용해서 추가 정보 DataFrame인 df_add를 만든다. df_init과 df_add가 주식종목코드 데이터를 공유하고 있다면, 이 컬럼을 기준으로 데이터를 합쳐서(Merge) 최종적인 DataFrame인 df를 만들 수 있다. df를 다시 PostDf 클래스를 이용해서 mysql DB에 저장하면 mysql에서 나만의 분석데이터를 만들어 볼 수 있다. 

    기업별 산업정보 PER PBR 데이터 프로그램

    python Module Import

    글 초반에 파이썬에서 다른 파이썬 파일을 모듈이라고 했다. 다른 파이썬 파일을 참조하기 위해서는 현재 작업하고 있는 파이썬 파일에 다른 파일 즉 모듈을 참조해주는 문장이 필요하다. "import" 하고 해당 모듈 전체를 갖고 올 수도 있고, "from ~ import ~"와 같이 다른 모듈의 클래스를 특정해서 참조해 올 수도 있다.

     

    import configFunc
    from configFunc import GetDf
    ...

     

    main.py에서도 configFunc.py의 클래스와 함수를 갖다 쓰기 때문에 위와 같이 모듈을 import 해주는 문장이 파일 상단에 존재해야 한다.

    main.py 만들기

    결과적으로 import configFunc를 통해서 모듈을 불러와서 아래와 같은 main.py 파일을 만들 수 있다. main.py는 configDf라는 함수를 새롭게 설정해서 GetDf, GetMap, GetAddData 클래스 함수를 모두 이용하여 통합 DataFrame을(df) 만들고, postDf클래스 함수를 통해서 df를 mysql DB에 넣어주는 과정을 거친다.

     

    import pandas as pd
    # 나의 모듈 불러오기
    import configFunc
    
    opendatakey = "나의 API키(공공데이터포털)"
    dartkey = "나의 API키(DART API)"
    code_path = "DART기업코드 주식종목코드 매핑파일 위치"
    indust_name_path = "산업코드 산업코드명 매핑파일 위치"
    db_id = 'mysql 아이디'
    db_password = 'db 비번'
    db_name = 'mysql 스키마 이름'
    
    # 통함 DataFrame 만드는 함수
    def configDf():
    	# 모듈 안에 있는 각각의 클래스에 대한 map, initdf, addfunc 라는 인스턴스 생성
        # 만들어지는 인스턴스는 클래스의 복제품이고 이 인스턴스로 클래스 내부 함수 호출가능
        map = configFunc.GetMap(code_path, indust_name_path)
        initdf = configFunc.GetDf(opendatakey)
        addfunc = configFunc.GetAddData(dartkey)
        # GetMap의 configCorpCodeMap을 실행시켜 DART기업코드-주식종목코드 매핑테이블 생성
        mapcode = map.configCorpCodeMap()
        # GetMap의 configIndustMap을 실행시켜 산업코드-산업코드명 매핑테이블 생성
        mapindustname = map.configIndustMap()
        
        # GetDf 클래스의 getStockList 에 272 페이지, 한 페이지당 10 줄로 2023-05-24 데이터 호출
        df_init = initdf.getStockList(272, "10", "20230524")
        # 추가 데이터 리스트를 담을 빈 리스트 생성
        df_add = []
        # 작업진행도 표시를 위한 변수
        process = 0
        # getStockList로 만든 df_init이라는 DataFrame의 "주식코드"컬럼 값을 code라는 변수에 하나씩 입수
        for code in df_init["주식코드"]:
        	# 코드 데이터 형식 string 으로 맞춤
            code = str(code)
            # 작업진행률 증가시킴
            process += 1
            # GetAddData 클래스의 getPerPbr에 code를 넣어서 per, pbr 값 구하기 
            per, pbr = addfunc.getPerPbr(code)
            # DART기업코드-주식종목코드 매핑테이블에서 주식종목코드로 DART 기업코드 구하기
            corpcode = map.getCorpCode(mapcode, code)
            # GetAddData 클래스의 getIndustryCode에 DART기업코드를 넣어서 산업코드 구하기
            industcode = addfunc.getIndustryCode(corpcode)
            # 산업코드-산업코드명 매핑테이블에서 산업코드로 산업명 구하기
            industname = map.getIndustName(mapindustname,industcode)
            if industcode != "n/a" and industname != "n/a":
            	# 주식종목코드, 산업코드, 산업명, per, pbr로 이루어진 df_add_if 라는 list만들기
                df_add_if = [code, industcode, industname, per, pbr]
                # df_add_if 라는 추가데이터 리스트를 df_add 라는 리스트에 담기
                df_add.append(df_add_if)
                # 작업진행률 표시
                print("percent: {:.2%}".format(process / len(df_init["주식코드"])))
            else: 
                pass
        # df_add를 이용해서 DataFrame 만들기
        df_add = pd.DataFrame(df_add, columns=['주식코드', '산업코드', '산업명', 'PER', 'PBR'])
        # df_init과 df_add는 모두 '주식코드'라는 공통된 컬럼을 갖고 있으므로 merge 함수를 이용해서 
        # 두 데이터를 결합 이때 how=inner은 두 데이터의 교집합으로 df라는 데이터를 구성한다는 뜻
        df = pd.merge(df_init, df_add, how='inner')
        return df
    
    if __name__=="__main__":
    	# 위에서 정의한 configDf를 이용해서 통합데이터(df)구성
        df = configDf()
        # configFunc 모듈안에 PostDf 클래스에 대한 인스턴스인 sqlinstance 생성
        sqlinstance = configFunc.PostDf(db_id,db_password,db_name)
        # "testperpbr"이라는 이름의 테이블 생성
        sqlinstance.postTable(df, 'testperpbr')
    반응형
Designed by Tistory.