INVESTAR / StockAnalysisInPython

456 stars 412 forks source link

아래 코드를 _test_.py 파일이라고 예를 들어서 설명을 드리겠습니다. #36

Open kslee5838 opened 3 years ago

kslee5838 commented 3 years ago

아래 코드를 _test_.py 파일이라고 예를 들어서 설명을 드리겠습니다. (저는 Investar의 첫글자를 대문자 i로 사용했으니 참고하시기 바랍니다.)

from Investar import Analyzer mk = Analyzer.MarketDB() df = mk.get_daily_price('삼성전자', '2021-01-25', '2021-01-29') print(df)

_test_.py 코드의 첫 줄에서 Investar 패키지의 Analyzer 모듈을 import 하고 있습니다. 따라서, _test_.py 파일이 존재하는 디렉터리에 Investar 디렉터리가 존재해야 하며, Investar 디렉터리 안에는 Analyzer.py와 MarketDB.py 파일이 존재해야 합니다. 즉 아래와 같은 구조로 파일이 존재해야 합니다.

Investar

실제로 _test_.py를 실행해 보면 아래와 같이 실행됨을 확인할 수 있습니다.

MarketDB

Originally posted by @INVESTAR in https://github.com/INVESTAR/StockAnalysisInPython/issues/28#issuecomment-769798085

kslee5838 commented 3 years ago

설명해 주신데로 디렉토리에 각각 넣고 돌렸는데, 아래처럼 empty dataframe 이라고 하네요?? 파일(코딩)들이 길다보니 어디서 잘못 됐는지 알 길이 없습니다

%Run test.py Empty DataFrame Columns: [code, date, open, high, low, close, diff, volume] Index: []

kslee5838 commented 3 years ago

참고로 DBUpdater.py 를 돌린 결과는 아래와 같습니다. 20분 정도 밖에 안걸린 거 같습니다. 5시간 걸린 다고 책에 쓰여 있던데요.

[2021-02-13 17:50] #2418 JTC (950170) : 10 rows > REPLACE INTO daily_price [OK] [2021-02-13 17:50] #2419 SNK (950180) : 10 rows > REPLACE INTO daily_price [OK] [2021-02-13 17:50] #2420 미투젠 (950190) : 10 rows > REPLACE INTO daily_price [OK] [2021-02-13 17:50] #2421 소마젠 (950200) : 10 rows > REPLACE INTO daily_price [OK] Waiting for next update (2021-02-14 17:00) ...

INVESTAR commented 3 years ago

_test_.py 실행 결과로 Empty DataFrame이 출력된 것으로 미루어 볼 때 실제로 마리아디비에는 삼성전자의 '2021-01-25' ~ '2021-01-29' 기간의 OHLC 주가 데이터가 존재하지 않는 것 같습니다.

최근 네이버에서 User-agent 정보가 없는 웹 스크레이핑을 차단했기 때문에 DBUpdater의 read_naver() 함수 내부에서 BeautifulSoup() 생성자와 read_html() 함수를 호출할 때 넘겨주는 인자를 requests.get(...).text로 변경하셨는지 체크해 보시기 바랍니다. https://github.com/INVESTAR/StockAnalysisInPython/blob/master/05_Stock_Price_API/Investar/DBUpdaterEx.py

책에서 DBUpdater 실행 시간이 5시간 정도 걸린다고 안내드린 부분은 최초 실행 시 config.json 파일의 pages_to_fetch 값이 100일 때의 경우입니다. 1 페이지당 10일치(=2주치) 데이터가 존재하므로, 100 페이지는 1000일치 데이터, 즉 4년치(개장일 250일 x 4) 데이터를 의미합니다. 최초 실행 이후부터는 pages_to_fetch 값이 자동으로 1로 바뀌게 되므로 DBUpdater를 실행하더라도 10일치 데이터만 업데이트 합니다.

config.json 파일의 pages_to_fetch 값을 10 정도로 늘린 뒤에 DBUpdater를 재시작 하셔서 주식 시세를 다시 한번 업데이트 해보시는 게 좋겠습니다.

{"pages_to_fetch": 10}
Woody-k commented 3 years ago

저 또한, 위 예시 설명대로 설명해주신 대로 구현을 시도했으며 수정부분 까지 전부 적용시켜 Annaconda Prompt 에서 아래와 같은 소스를 실행하였습니다.

from Investar import Analyzer mk = Analyzer.MarketDB() df = mk.get_daily_price('삼성전자', '2020-08-30', '2021-01-29')

하지만.. 제가 설정한 기간이랑 무관하게 2021.01.26 ~ 2021.01.29 주가정보만 출력되었습니다. 이를 해결하려면 어느 부분을 수정해야하는지 질문드립니다.. daily_price

INVESTAR commented 3 years ago

먼저 마리아디비에 삼성전자 주가 정보가 존재하는지 확인해 보시기 바랍니다.

SELECT * FROM daily_price WHERE CODE='005930' AND DATE >= '2020-08-30' AND DATE <= '2021-01-29'

005930

만일 마리아디비에서도 2021-01-26 ~ 2021-01-29 기간의 정보만 조회된다면 config.json 파일의 pages_to_fetch 값을 10 정도로 늘린 뒤에 DBUpdater를 재시작 하셔서 주식 시세를 다시 한번 업데이트 해보시기 바랍니다.

{"pages_to_fetch": 10}
Woody-k commented 3 years ago

제 질문에 대한 의문? 해결책을 찾았습니다. 원인은 제 자신의 MySQL(MariaDB) 사용 미숙에 의한 오류였습니다.

단순히 본 오픈소스에 나온대로만 실행을 하니 DBUpdater.py 업데이트 시, 항상 100rows(100일)/10페이지 주가정보만 출력되었습니다. ({"pages_to_fetch": x} -> x 값의 변경과는 무관하게..) 정확한 이유는 모르겠으나, Jupyter Lab에서 DBUpdater.py 실행시 정상적이었지만 PyCharm에서는 매번 100row만 업데이트 되었습니다......

(아래 3가지 사항은 반드시 MySQL 8.0 Command Line Client에서 본인이 직접 입력해야 합니다)

  1. 데이터베이스 생성시 UTF8로 문자열을 저장할 수 있도록 해야한다.

    CREATE DATABASES (데이터베이스명) default CHARACTER SET UTF8;

  2. 데이터베이스에 사용권한을 적용시킨다.

    grant all privileges on 데이터베이스명.TABLE명 '사용자명'@'localhost';

    1. DB에 사용권한을 부여하기 전에, TABLE을 먼저 생성한다.

      사용권한 부여 후 꼭 확인해본다. (show grants for '사용자명'@'localhost';) DBUpdater py

INVESTAR commented 3 years ago

독자님의 경험을 공유해 주셔서 감사합니다.