728x90
to_sql() 함수를 이용해 시계열 데이터를 SQL에 저장할 경우 발생하는 문제와
upsert 기능을 사용하는 방법에 대해 설명해보겠습니다,
<시계열 데이터의 특성> 1. insert :시간이 지남에 따라 데이터가 추가됨 2. update :간혹 과거 데이터가 수정됨 |
입력하고자 하는 데이터가 기존 테이블에 값이 있는 경우 새로운 데이터로 업데이트하고
값이 없는 경우에는 새로운 데이터를 추가하는 기능을 mysql에서는 'upsert'라고 부릅니다.
이제 시계열 데이터를 데이터베이스에 추가하는 예제를 살펴보겠습니다.
#1. 필요한 라이브러리 불러오기
import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy_utils import create_database
#2. 데이터베이스 만들기
create_database('mysql+pymysql://root:1234@127.0.0.1:3306/exam') # exam이라는 db만들기
#3. 데이터 만들에서 exam db에 넣기
price = pd.DataFrame({
"날짜": ['2021-01-02', '2021-01-03'],
"티커": ['000001', '000001'],
"종가": [1340, 1315],
"거래량": [1000, 2000]
})
engine = create_engine('mysql+pymysql://root:1234@127.0.0.1:3306/exam')
price.to_sql(name = 'price', con = engine, index = False, if_exists = 'append')
# if_exists = 'append'는 테이블이 존재할 경우 기존 테이블에 데이터를 추가
engine.dispose()
위의 코드를 작성하면 아래와 같이 의도된 결과가 나오는 것을 확인할 수 있습니다.
여기까지는 문제가 없습니다.
그러나 하루가 지나서 다음날의 데이터가 추가되는 상황을 보여드리겠습니다.
import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy_utils import create_database
#기존 데이터
price = pd.DataFrame({
"날짜": ['2021-01-02', '2021-01-03'],
"티커": ['000001', '000001'],
"종가": [1340, 1315],
"거래량": [1000, 2000]
})
#새로운 데이터
new = pd.DataFrame({
"날짜": ['2021-01-04'],
"티커": ['000001'],
"종가": [1320],
"거래량": [1500]
})
price = pd.concat([price,new]) #기존 데이터와 새로운 데이터 합침
engine = create_engine('mysql+pymysql://root:1234@127.0.0.1:3306/exam')
price.to_sql(name = 'price', con = engine, index = False, if_exists = 'append')
engine.dispose()
위의 코드를 실행시키면 exam db에 새로운 데이터가 추가될 것입니다.
이와 같이 기존 데이터와 누적되어서 같은 데이터가 반복되는 문제가 발생합니다.
이러한 문제를 해결하는 과정은 다음 블로그에서 소개해드리겠습니다.
'파이썬으로 퀀트 프로그램 만들기 project' 카테고리의 다른 글
정규 표현식(정규식) 종류 (0) | 2023.09.05 |
---|---|
Python, MySQL - 시계열 데이터 처리를 위한 upsert 알아보기_2 (0) | 2023.08.25 |
pandas로 파이썬에 SQL사용하기 - 데이터 프레임을 SQL DB에 저장 (0) | 2023.08.24 |
pandas로 파이썬에 SQL사용하기 - DB에 접속하여 데이터 불러오기 (0) | 2023.08.24 |
파이썬에서 SQL(pymysql) - data 입력, 수정, 삭제 (0) | 2023.08.21 |