ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (OpenAPI)NOTION API 사용: 데이터 입력(파이썬활용)
    금융퀀트/프로그램기초 2024. 6. 23. 10:39
    반응형

    파이썬에서 데이터 불러오기: configdf

    (OpenAPI)Notion API 사용: 데이터 입수 1, (OpenAPI)Notion API 사용: 데이터 입수 2를 통해 노션에 있는 데이터를 불러올 수도 있지만 노션에 데이터를 저장할 필요성도 생긴다. 내 컴퓨터에 sql 서버를 굳이 만들지 않아도 정기적으로 DataBase를 저장해서 나만의 DB를 만들 수 있다. ETF가격 분석을 위해서 일별 ETF종가 DB를 만드는 상황을 가정해 보자. 먼저 KRX정보데이터시스템(http://data.krx.co.kr/)에 접속해서 일별 ETF전종목 시세를 다운받는다.

    그림1: 기초데이터 다운로드
    240614_ETF_PRICE.csv
    0.16MB

     

    다운로드한 csv 파일 데이터에 기준일자인 2024-06-14를 추가하고, 종목코드의 데이터 형식은 문자열로 하며, 기준일자+종목코드로 REFID라는 유일한 코드를 가지는 데이터를 만드는 함수를 아래와 같이 만들 수 있다.

    import pandas as pd
    # 파일 경로 설정
    datapath = "파일의 경로/240614_ETF_PRICE.csv"
    
    def configdf(datapath: str):
    	# pandas 로 데이터를 불러오기 이 때 인코딩은 utf-8이 아닌 euc-kr
        df = pd.read_csv(datapath, encoding="euc-kr")
        # 기준일자인 2024-06-14 컬럼 추가(날짜 형식도 문자열(string))
        df["기준일자"] = "20240614"
        # 종목코드 컬럼 문자열(string)으로 형식 변경
        df["종목코드"] = df["종목코드"].astype(str)
        # REFID 키 값 컬럼 생성
        df["REFID"] = "20240614"+df["종목코드"]
        # 데이터에서 원하는 컬럼만 선택
        df = df[["REFID", "기준일자", "종목코드", "종목명", "기초지수_지수명", "종가"]]
        return df.head(10)
    # 데이터프레임값 payload 변수에 입수
    df = configdf(datapath=datapath)
    # 결과 확인
    print(df)

    그림2: 다운로드한 파일을 이용해서 데이터프레임 구성한 결과

     

    노션(Notion) 데이터 테이블 생성

    노션에 데이터를 입력하기 위해선 데이터를 입력할 테이블을 노션에서 먼저 만들어야 한다. 표의 항목과 형식을 먼저 정의해 주고 그에 맞는 데이터를 넣어줘야 하는 것이다. (OpenAPI)Notion API 사용: 데이터 입수 1(파이썬 활용)에서 했던 것처럼 표 템플릿을 추가해 준다. 

    그림3: 노션 기초 DB틀 생성 1

    아래 그림 4의 오른쪽과 같이 내가 만든 DB와 연결을 해주고 아래 그림 3의 왼쪽과 같이 컬럼을 하나씩 추가해 준다. 이때 URL의 notion.so/ 뒤에 이어지는 부분이 database id라는 걸 기록해 둔다.(? v= 는 페이지 뷰 아이디로 database id 에는 포함되지 않는다.)

    그림4: 노션 기초 DB틀 생성 2

    여기서 컬럼의 속성유형 부분을 명확하게 이해해야 한다. 첫 번째 컬럼은 아래 그림 4의 왼쪽과 같이 "제목"으로 고정되어 있다.(사용자 변경 불가) "제목"은 노션의 JSON 템플릿 상으로는 "title"이라는 속성이다. 그리고 오른쪽에 계속 컬럼을 추가할 수 있는데, 추가하는 컬럼에 대해서는 사용자가 임의로 속성유형을 부여할 수 있다. 대표적으로는 "텍스트", "숫자"가 있다. 각각 JSON 템플릿 상에서는 "rich_text", "number"라는 이름을 갖는다.

    그림 5: 노션 기초 DB틀 생성 3

    파이썬으로 만든 데이터 프레임은 ["REFID", "기준일자", "종목코드", "종목명", "기초지수_지수명", "종가"] 컬럼을 가지므로 각각 "제목", "텍스트", "텍스트", "텍스트", "텍스트", "숫자" 속성을 갖는 표를 노션에 아래 그림 5와 같이 세팅할 수 있다. 각 컬럼명은 REFNO, 종목코드, 기준일자, 종목명, 기초지수명, 종가로 부여했다.(파이썬으로 뽑은 데이터 프레임에서 순서를 조금 바꿨다.)

    그림 6: 노션 기초 DB틀 생성 4

    노션(Notion) 데이터 입력하기: add_row_to_notion

    이제 미리 발급받은 나의 API키와( (OpenAPI)Notion API 사용: 데이터 입수 2 참조) 상단의 URL 정보를 통해 얻어낸 database id를 바탕으로 노션 DB에 접속하고, 입력할 정보를 properties 항목에 넣어서 전송하는 add_row_to_notion 함수를 만들 수 있다. 이 함수를 만들 때는 위에서 설명한 컬럼의 속성유형을 잘 고려해야 한다. 속성유형이 title이고 거기에 text형식의 content를 넣는다면 "title": [{"text":{"content": "내가 넣을 데이터"}}] 형식으로 정의를 해주는 식이다. 최종적으로 for문을 사용하여 파이썬으로 만든 데이터 row 별로 add_row_notion 함수로 작업하여 노션에 데이터를 추가해 줄 수 있다.

    # 노션API 및 pandas 라이브러리 사용
    from notion_client import Client
    import pandas as pd
    
    # Notion API 키를 직접 코드에 작성
    NOTION_API_KEY = "나의 API키"
    
    # Notion 클라이언트 초기화
    notion = Client(auth=NOTION_API_KEY)
    db_id = "나의 페이지 아이디"
    datapath = "파일의 경로/240614_ETF_PRICE.csv"
    
    # 데이터프레임 생성 함수
    def configdf(datapath: str):
        df = pd.read_csv(datapath, encoding="euc-kr")
        df["기준일자"] = "20240614"
        df["종목코드"] = df["종목코드"].astype(str)
        df["REFID"] = "20240614"+df["종목코드"]
        df = df[["REFID", "기준일자", "종목코드", "종목명", "기초지수_지수명", "종가"]]
        return df.head(10)
    
    # row 별로 properties json 문서를 만들어서 노션 db에 insert
    def add_row_to_notion(database_id, row):
        try:
            notion.pages.create(
                parent={"database_id": database_id},
                properties={
                	# REFNO 속성 title
                    "REFNO": {
                    # 데이터프레임 row 중 REFID 컬럼 데이터
                        "title": [{"text":{"content": row["REFID"]}}] 
                    },
                    # 종목코드 속성 rich_text
                    "종목코드": {
                    # 데이터프레임 row 중 종목코드 컬럼 데이터
                        "rich_text": [{"text": {"content": row["종목코드"]}}]
                    },
                    # 기준일자 속성 rich_text
                    "기준일자": {
                    # 데이터프레임 row 중 기준일자 컬럼 데이터
                        "rich_text": [{"text": {"content": row["기준일자"]}}]
                    },
                    # 종목명 속성 rich_text
                    "종목명": {
                    # 데이터프레임 row 중 종목명 컬럼 데이터
                        "rich_text": [{"text": {"content": row["종목명"]}}]
                    },
                    # 기초지수명 속성 rich_text
                    "기초지수명": {
                    # 데이터프레임 row 중 기초지수명 컬럼 데이터
                        "rich_text": [{"text": {"content": row["기초지수_지수명"]}}]
                    },
                    # 종가 속성 number
                    "종가": {
                    # 데이터프레임 row 중 종가 컬럼 데이터
                        "number": row["종가"]
                    },
                }
            )
        except Exception as e:
            print(f"Error adding row to Notion: {e}")
    # 파이썬으로 다운받을 파일을 이용해서 데이터프레임 구성
    df = configdf(datapath=datapath)
    # 데이터프레임 row 별로 JSON 형식으로 변환하여 노션 DB에 INSERT 
    for index, row in df.iterrows():
        add_row_to_notion(db_id, row)

    위 코드로 아래 그림 7과 같이 ETF종가 데이터를 구축해 나갈 수 있다

    그림7: 노션 DB구축 예시

    반응형
Designed by Tistory.