-
(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전종목 시세를 다운받는다.
다운로드한 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)
노션(Notion) 데이터 테이블 생성
노션에 데이터를 입력하기 위해선 데이터를 입력할 테이블을 노션에서 먼저 만들어야 한다. 표의 항목과 형식을 먼저 정의해 주고 그에 맞는 데이터를 넣어줘야 하는 것이다. (OpenAPI)Notion API 사용: 데이터 입수 1(파이썬 활용)에서 했던 것처럼 표 템플릿을 추가해 준다.
아래 그림 4의 오른쪽과 같이 내가 만든 DB와 연결을 해주고 아래 그림 3의 왼쪽과 같이 컬럼을 하나씩 추가해 준다. 이때 URL의 notion.so/ 뒤에 이어지는 부분이 database id라는 걸 기록해 둔다.(? v= 는 페이지 뷰 아이디로 database id 에는 포함되지 않는다.)
여기서 컬럼의 속성유형 부분을 명확하게 이해해야 한다. 첫 번째 컬럼은 아래 그림 4의 왼쪽과 같이 "제목"으로 고정되어 있다.(사용자 변경 불가) "제목"은 노션의 JSON 템플릿 상으로는 "title"이라는 속성이다. 그리고 오른쪽에 계속 컬럼을 추가할 수 있는데, 추가하는 컬럼에 대해서는 사용자가 임의로 속성유형을 부여할 수 있다. 대표적으로는 "텍스트", "숫자"가 있다. 각각 JSON 템플릿 상에서는 "rich_text", "number"라는 이름을 갖는다.
파이썬으로 만든 데이터 프레임은 ["REFID", "기준일자", "종목코드", "종목명", "기초지수_지수명", "종가"] 컬럼을 가지므로 각각 "제목", "텍스트", "텍스트", "텍스트", "텍스트", "숫자" 속성을 갖는 표를 노션에 아래 그림 5와 같이 세팅할 수 있다. 각 컬럼명은 REFNO, 종목코드, 기준일자, 종목명, 기초지수명, 종가로 부여했다.(파이썬으로 뽑은 데이터 프레임에서 순서를 조금 바꿨다.)
노션(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종가 데이터를 구축해 나갈 수 있다
반응형'금융퀀트 > 프로그램기초' 카테고리의 다른 글
(OpenAPI)Notion API 사용: 데이터 입수 2(파이썬 활용) (0) 2024.06.17 (OpenAPI)Notion API 사용: 데이터 입수 1(파이썬 활용) (0) 2024.06.16 (OpenAPI)Notion API 사용: 인증키 발급 (0) 2024.06.15 (OpenAPI)KRX OpenAPI 활용: 서비스 이용 신청 및 API 예제 (2) 2024.03.28 (OpenAPI)KRX OpenAPI 활용: 인증키 발급 (0) 2024.03.23