[Pandas] SQL 데이터베이스 저장, 불러오기

반응형
    반응형

    가끔 파이썬에서 SQL 데이터를 작업해야하거나 작업한 데이터를 SQL에 다시 저장해야하는 일이 생깁니다.
    파이썬으로 SQL 데이터를 가져오기 위해서 sqlite3을 쓰지만 메모리형식으로 저장되기 때문에 휘발성이 강합니다.
    메모리 절약을 위해 sqlite3에서 필요한 데이터만 가져오는 것도 좋지만 지속적으로 저장되어야 하는 경우도 있습니다. 이럴 때 판다스로 SQL을 불러오면 작업에 필요한 내용이 정의가 되기 때문에 작업을 용이하게 할 수 있습니다.

    데이터프레임 SQL 데이터로 저장하기

    데이터프레임을 SQL데이터(sqlite or db)로 저장을 해보겠습니다.
    저장할 데이터는 애플과 마이크로소프트의 가격 데이터입니다.
    먼저 저장할 sqlite 파일에 연결을 합니다.

    import sqlite3
    import pandas as pd
    connection = sqlite3.connect('./stocks.sqlite')

    저장할 데이터는 다음과 같습니다.

     msft,aapl

     

    저장은 to_sql로 합니다.
    굉장히 간단한데 주의할 것은 테이블이 원래 있는경우입니다. 기존의 테이블을 삭제할지 아니면 값 추가를 할지 정해주어야 합니다
    if_exists에 적당한 값을 넣어서 정해줍니다.

     

    f_exists{'fail','replace','append'}

    • fail : 디폴트값. 테이블이 이미 존재하면 에러 발생
    • replace : 기존의 테이블을 버리고 새로 넣는다
    • append : 기존의 테이블에 추가로 넣는다.

     

    #df.to_sql(테이블명,sqlite3연결, if_exists='append or replace')
    aapl.to_sql('AAPL',connection,if_exists='append'
    msft.to_sql('MSFT',connection,if_exists='replace')
    connection.commit()
    connection.close()

     

    DB browser(sqlite)로 불러보면 저장이 된 것을 볼 수 있습니다.

     

    SQL데이터 데이터프레임으로 불러오기

    sql 파일을 불러오려면 read_sql을 씁니다.

     

    connection = sqlite3.connect('./stocks.sqlite')
    # pd.read_sql("SELECT 구문",sqlite3연결,index_col='인덱스로 쓸 컬럼이름')
    ms = pd.read_sql("SELECT * FROM MSFT;",connection,index_col='Date')

     

    컬럼 전체를 불러오고 싶다면 * 을 넣고 일부를 불러오고 싶다면 컬럼이름을 각각 써줍니다.
    컬럼이름을 쓴 순서대로 컬럼배치가 되니 참고하시기 바랍니다.

     

    ms = pd.read_sql("SELECT Date,Volume,Open FROM MSFT",connection,index_col='Date')

    시간포맷 형식 설정

    parse_dates를 이용해 해당컬럼을 시간형식으로 바꿀 수 있습니다.
    Close 컬럼을 시간형식으로 바꿔보겠습니다.

    ms = pd.read_sql("SELECT * FROM MSFT",connection,parse_dates=['Close'])

    Close가 시간구문으로 바껴서 나온 것을 볼 수 있습니다.

     

    조건문으로 불러오기

    sql 구문 중 조건문으로 쓰는 where을 이용해 조건문을 만들어 데이터의 일부만 가져올 수 있습니다.

    query = "SELECT * FROM MSFT WHERE Volume>200000000"
    
    condition_ms = pd.read_sql('SELECT * FROM MSFT WHERE Close>100',connection,index_col='Date',parse_dates=['Date'])

    Close 가 100 보다 큰 값에 대해서만 가져온 것을 볼 수 있습니다.

     

    관련 포스팅
    DB browser for sqlite 설치 및 사용법

    [SQLite3] 테이블 생성,변경,제거

    [SQLite3] 행 추가,삭제,조회

    댓글

    Designed by JB FACTORY

    ....