본문 바로가기
sql

python 주가 데이터 mysql에 insert하기

by HanYaung 2022. 7. 13.

우선 mysql에서 table을 만들어 주었습니다. 

기본키는 티커와 날짜 두개의 다중 기본키를 사용하였습니다.

create table price (
	ticker varchar(6) not null,
    day1 varchar(8) not null,
    open1 int, 
    high int, 
    low int,
    end1 int, 
    volume int,
    mount Long,
    rate float,
    name1 varchar(20),
    primary key(ticker,day1)
)

일정기간동안의 주가 데이터를 pykrx로 가져와서 전처리합니다

def getStockPrice(self,start_day, end_day):
    print("start get_stock_price")

    def str_day(d):
        return d.strftime('%Y%m%d')

    def getStock(day): # 해당일의 모든 종목의 종가,저가,고가등등을 가져오고 날짜를 추가
        ddf = stock.get_market_ohlcv(day, market="ALL").reset_index()
        ddf["day"] = day
        return ddf

    # 입력한 기간동안에 개장일을 구하기
    tmpDays = stock.get_market_ohlcv(start_day, end_day, "005930")
    days = list(map(str_day, tmpDays.index.to_list()))
    if len(days)<=1:
        print(start_day,end_day)
        print("업데이트할 내용이 없습니다 ")
        return -1
    #멀티 프로세싱을 이용하여 구한 값들을 다 합치기 시간 단축
    df = pd.concat(parmap.map(getStock, days, pm_pbar=True, pm_processes='8'))

    df["회사명"]=""
    def tickerChangeName(code):
        name = stock.get_market_ticker_name(code)
        return name
    tickerList = df.groupby("티커").size().index
    for ticker in tqdm(tickerList):
        name = tickerChangeName(ticker)
        df.loc[df["티커"] == ticker, "회사명"] = name
    print(df)
    if os.path.isfile("csvFile/stock2019.csv")==False:
        df.to_csv("csvFile/stock2019.csv", mode='w')
        return 0
    else:
        preDf = pd.read_csv("csvFile/stock2019.csv", index_col=0)
        df = pd.concat([preDf,df])
        df.to_csv("csvFile/stock2019.csv", mode='w')
        return 0

      ticker  open1   high    low  ...       mount  rate      day1    name1
0     060310   2280   2280   2160  ...    53853515 -1.13  20190102       3S
1     095570   4530   4605   4445  ...   179748930  0.55  20190102   AJ네트웍스
2     068400  12750  12950  12250  ...  2723516050  0.41  20190102    SK렌터카
3     006840  53900  54000  51300  ...  1248346800 -3.89  20190102    AK홀딩스
4     054620   4225   4290   4155  ...    99013735 -0.36  20190102   APS홀딩스

 

to_sql을 이용해서 한번에 df을 mysql에 업로드 합니다 

주의점 df 컬럼과 table의 컬럼명이 같아야함 

import pandas as pd
import pymysql
from sqlalchemy import create_engine
# https://go-for-data.tistory.com/entry/01SQLBulkInsert
df = pd.read_csv("csvFile/stock2019.csv",index_col=0)

df.columns = ["ticker","open1","high","low","end1","volume","mount","rate","day1","name1"]
#중복된 값들 제거
df.drop_duplicates(['ticker',"day1"], keep='first',inplace=True)
print(df.shape)
engine = create_engine("mysql+pymysql://root:"+"비번"+"@localhost/db명", encoding='utf-8')
df.to_sql(name ='price', con = engine, if_exists='append', index=False)