p.244~245에 나오는 코드 관련 질문입니다.
import pymysql
from sqlalchemy import create_engine
import pandas as pd
from datetime import date
from dateutil.relativedelta import relativedelta
import requests as rq
import time
from tqdm import tqdm
from io import BytesIO
#DB 연결
engine = create_engine('mysql+pymysql://root:[email protected]:3306/stock_db')
con = pymysql.connect(user='root',
passwd='1234',
host='127.0.0.1',
db='stock_db',
charset='utf8')
mycursor = con.cursor()
ticker_list = pd.read_sql("""
select * from kor_ticker
where 기준일 = (select max(기준일) from kor_ticker)
and 종목구분 = '보통주';
""", con=engine)
#DB저장 쿼리
query = """
insert into kor_price(날짜, 시가, 고가, 저가, 종가, 거래량, 종목코드)
values (%s,%s,%s,%s,%s,%s,%s) as new
on duplicate key update
시가 = new.시가, 고가 = new.고가, 저가 = new.저가,
종가 = new.종가, 거래량=new.거래량;
"""
error_list = []
for i in tqdm(range(0, len(ticker_list))):
#티커선택
ticker = ticker_list['종목코드'][i]
#시작일과 종료일
fr = (date.today()+relativedelta(years=-5)).strftime("%Y%m%d")
to = (date.today().strftime("%Y%m%d"))
try:
#url 생성
url = f'''https://fchart.stock.naver.com/siseJson.nhn?symbol={ticker}&requestType=1
&startTime={fr}&endTime={to}&timeframe=day'''
#데이터 다운로드
data = rq.get(url).content
data_price = pd.read_csv(BytesIO(data))
#데이터 클렌징
price = data_price.iloc[:, 0:6]
price.columns = ['날짜', '시가', '고가', '저가', '종가', '거래랑']
price = price.dropna()
price['날짜'] = price['날짜'].str.extract('(\d+)')
price['날짜'] = pd.to_datetime(price['날짜'])
price['종목코드'] = ticker
#주가 데이터를 DB에 저장
args = price.values.tolist()
mycursor.executemany(query, args)
con.commit()
except:
print(ticker)
error_list.append(ticker)
#타입슬립 적용
time.sleep(2)
#DB연결종료
engine.dispose()
con.close()
다음과 같이 작성해서 실행하면 price랑 args 까지는 모두다 데이터가 정상적으로 들어있는데
mycursor.executemany(query, args) 해당 부분에서 데이터가 sql에 저장되지 않습니다.
price
Out[68]:
날짜 시가 고가 저가 종가 거래랑 종목코드
0 2018-07-02 10200.0 10250.0 9900.0 9940.0 146002.0 000020
1 2018-07-03 9940.0 10350.0 9940.0 10000.0 114950.0 000020
2 2018-07-04 9980.0 10450.0 9980.0 10450.0 45931.0 000020
3 2018-07-05 10450.0 10600.0 10150.0 10400.0 32153.0 000020
4 2018-07-06 10450.0 10750.0 10150.0 10450.0 40958.0 000020
... ... ... ... ... ... ...
1229 2023-06-26 10830.0 10970.0 10730.0 10890.0 124535.0 000020
1230 2023-06-27 10970.0 11020.0 10600.0 10820.0 118043.0 000020
1231 2023-06-28 10850.0 10850.0 10460.0 10540.0 135671.0 000020
1232 2023-06-29 10450.0 10530.0 10340.0 10400.0 112113.0 000020
1233 2023-06-30 10400.0 10440.0 10200.0 10390.0 86693.0 000020
[1234 rows x 7 columns]
mycursor.executemany(query, args)
Out[69]: 0
실제로 i=0만 대입해서 콘솔에 입력해보면 price와 args는 데이터가 모두 나오는데
mycursor.executemany(query, args) 를 실행하면 out이 0으로 뜨고 sql에 저장되지 않습니다
어디서 잘못된 걸까요..?