안녕하세요?


지난번 포스팅에서는 SQL 쿼리가 안 되어서 어떻게 애를 애를 먹었습니다만, 아무튼 그 놈의 그 ' ' 하나를 붙이지 않았다는 이유로 이렇게 애를 먹었다는 사실을 알고는 조금은 힘이 빠지기는 빠졌습니다. 그래서 늦어진 만큼 작업을 빨리 진행하도록 해 보겠습니다.



먼저 위 스크린샷에 나오는 것처럼 SELECT count(*) FROM '테이블이름' 이라는 쿼리를 사용해 보도록 합니다. 이 쿼리는 테이블 안에 있는 모든 열(row)을 읽어 들이는 역할을 합니다.



실제로 숫자가 마지막 값으로 나오는 것을 볼 수 있는데, 이게 진짜로 데이터 베이스 살의 열 갯수-모든 열의 갯수와 맞는지를 살펴봐야 합니다.



DB Browser에서 한번 확인을 해 보니까, 실제로 일치한다는 것을 확인할 수 있었습니다.



이제 위의 붉은색 박스안에 있는 것과 같은 내용의 수식을 쓰면, 제 경우에는 학습에 75%의 데이터만 쓰기 때문에, 일단 75%가 나올 수 있는 공식을 사용해 보도록 합니다.




어떻게 된 일인지 몰라도, python의 작동이 중지가 된 것을 확인해 볼 수 있었습니다.



그래서 수식을 고치기도 했고, lineEdit_3에서 나왔는 텍스트가 진짜로 문자열 형태로 처리가 되어 있기 때문에, 이런 일이 벌어진 것 이었습니다. 그래서 하는 수 없이 float()함수를 사용해서 일단 숫자로 처리하는 단계도 거쳐야 했습니다.



일단 결과값이 나오기는 했는데, 소수점이 붙은 실수로 나오는 것을 볼 수 있습니다. 적확하게는 1174번째 열에서 75%에 해당하기 때문에, 이건 손을 좀 볼 필요가 있습니다.



그래서 위 스크린샷과 같이 먼저 정수로 바꾸어 주는 함수인 int()함수를 사용하면 어떻게 반올림을 해 줄 것으로 기대를 했습니다.




결과를 확인해 보니, 반올림은 커녕, 그냥 소수점 이하의 자리를 그냥 가져다 버리는 것으로 볼 수 있었습니다. 그래서 이대로는 안되겠다는 생각이 듭니다.



그래서 위 스크린샷과 같이 어떤 파이썬의 함수가 반올림을 해주느냐 했더니, round()라는 함수가 해주는 것을 볼 수 있었습니다.



실제로 제가 유저 인터페이스 상에서 75%라는 수치를 입력해 보고나서, 한번 제대로 동작이 되는지를 확인해 보고자 합니다.



진짜로 75%에 해당을 하는 값인 1174의 값이 나오는 것을 확인할 수 있었습니다. 이렇게 하는 것으로 이제 데이터 베이스의 열에서 75%에 해당하는 열을 계산해 내는 것은 좋은데, 문제는 진짜로 데이터를 가지고 올 수 있느냐 하는 것 입니다. 이 내용의 포스팅을 다음 포스팅에서 올릴 것을 약속드리며, 이번 포스팅은 여기서 마치겠습니다.

  1. Jet 2019.06.13 20:47

    학습에 사용할 데이터 % 를 입력후 엔터를 누르게되면 퍼센트만큼의 데이터 갯수는 나오지만 그 뒤에 바로 에러가 나옵니다..
    Traceback (most recent call last):
    File "D:\stock\kiwoom\venv\lib\site-packages\pandas\io\sql.py", line 1431, in execute
    cur.execute(*args)
    sqlite3.OperationalError: no such table:
    이런 에러가 발생되는데 혹시 유의해서 봐야할것이 있나요?? 일주일째 여기 잡혀있습니다 ..ㅠㅠ 도움 부탁드리겠습니다

    • 안녕하세요?
      에러 메세지를 보니 데이터 베이스 파일에 해당하는 테이블이 없다고 나오는 에러입니다.
      이런 경우에는 진짜로 데이터 베이스 파일 안에 테이블이 없거나,
      아니면 테이블의 이름을 잘못 입력하면 이런 에러가 나옵니다.

  2. Jet 2019.06.13 22:00

    근데 종목명을 입력했을때 데이터가 있다고 나오는데 왜 학습데이터 퍼센트만 입력하면 이렇게 나오는지 알수있을까요??

    • 안녕하세요?
      제 경우에는 일단 종목코드가 들어간 부분의 위젯에 있는 텍스트를 가지고 오도록 했습니다.
      여기서 이런다면 우선 강화학습을 하는 메서드에서 이런 처리가 제대로 된건지 의심을 해야 합니다.
      혹시 위젯 이름이 저랑 다른데 그대로 쓰셨거나 하면 이럴 수 있습니다.
      그 외에 종목 코드를 숫자 그대로 가지고 와서 생기는 오류일 수 있습니다.
      이런 경우 str ( ) 함수를 처리해야 합니다.

  3. Jet 2019.06.15 16:54

    data_manager.py 에서 문제가 있는걸 찾았습니다. 소스중에 db파일을 불러오는
    chart_data = pd.read_sql(sqlCode, con, index_col = None) 에서 에러가 발생하는걸 확인하였고
    chart_data = pd.read_sql("SELECT * FROM '068400'", con, index_col=None)
    이런식으로 코드를 변경하면 오류가 발생하지 않는걸로 확인되었습니다.
    지금까지 도움주셔서 감사합니다 ㅎㅎ 다시한번 제가 연구를 해서 오류해결에 힘써보겠습니다
    포스팅하시는 글들 유익하게 잘 보고있습니다!

    • 아......이렇 수가 설마 했더니 sql 쿼리 넣는데서 에러가 난 것이였군요.
      그런데 그렇게 바꾸시면 나중에 종목을 바꿀 경우-다른 종목코드를 사용하실 경우 일일히 입력하셔야 합니다.

  4. 미스터2 2020.05.21 19:05

    또 질문남겨요..
    우선 계속되는 질문 죄송하며 답변 감사합니다.
    현재 문제가 발생되는 부분이
    Try_Machine_Learning에서 필요로하는 chart_data와 training_data의 값이 제대로 나오지않는점입니다.(차트데이터는 트레이닝데이터의 내용으로 나오고 트레이닝데이터는 비어있습니다.)
    그래서 오류를 확인중 data_manager에서의 def preprocess와 def build_traning_data에서 문제가생기는듯합니다.
    구글링중 검색해보니 for반복문에서는 return 을 쓸수 없다고 하던데... 혹시 해결방법에대해 아시는지요?

    • 안녕하세요?

      일단 이래저래 일이 있어서 답변이 늦어졌는데, 저기 for loop에서 return을 굳이 써야 할 필요가 있는지 모르겠습니다만, 혹시 데이터를 메서드에서 메서드를 넘나들면서 옮겨야 할 필요가 있으신지요?

      이런 경우라면 self.변수명 = ~~~ 이라는 식으로 지정해서 변수명 앞에 self.를 붙이는 식으로 method에서 method를 넘나들 수 있습니다.

+ Recent posts