josw123 / dart-fss

한국 금융감독원에서 운영하는 다트(Dart) 시스템 크롤링을 위한 라이브러리
https://github.com/josw123/dart-fss
MIT License
321 stars 110 forks source link

버그 수정 : 인카금융서비스(01013694), SG&G(00264714), 마이크로컨텍솔(00568188) #78

Closed dveamer closed 3 years ago

dveamer commented 3 years ago

멋진 프로그램을 만들어주셔서 고맙습니다. 사용 도중에 발견한 소소한 버그들을 수정해서 올립니다.

각 commit에는 에러를 재현 할 수 있는 corp code와 corp name 그리고 error stack trace를 넣어놨으니 참고하시기 바랍니다. 제 경우에는 quarter 리포트만 추출하는 과정에서 만난 에러이기 때문에 annual 리포트나 다른 리포트를 추출하는 과정에서 동일한 에러가 재현 될지는 잘 모르겠습니다.

josw123 commented 3 years ago

안녕하세요.

dart-fss 라이브러리에 크게 기여해주셔서 감사합니다.

기여해 주신 코드를 테스트를 진행해 보니 아래와 같이 4개의 테스트를 실패하였기 때문에

일단 Revert하였습니다.

===============================================

Failed: Test failed: corp_code='01183407', corp_name='이십일스토어', fs_tp='bs', start_dt='20120101', report_tp='annual', date='20161231', column='label_ko',item='I.유동자산', actual='None', expected='5531436227'

Failed: Test failed: corp_code='00126186', corp_name='삼성에스디에스', fs_tp='bs', start_dt='20130813', report_tp='quarter', date='20130630', column='label_ko',item='유동자산', actual='None', expected='2602291807082'

Failed: Test failed: corp_code='00547583', corp_name='하나금융지주', fs_tp='bs', start_dt='20120101', report_tp='annual', date='20100101', column='label_ko',item='부채총계', actual='None', expected='139823866000000'

Failed: Test failed: corp_code='00123772', corp_name='부국증권', fs_tp='bs', start_dt='20200101', report_tp='annual', date='20201231', column='label_ko',item='부채및자본총계', actual='None', expected='1608864797228'

===============================================

dveamer commented 3 years ago

@josw123 pull request 전에 테스트를 했는데 테트트 과정에서 실수가 있었던 것 같습니다. 혼란을 드린 것 같아서 죄송합니다.

d04bba7 commit sha에 대부분의 재무상태표(bs) 추출이 실패하는 문제가 있었던 것으로 확인됐습니다.
해당 commit을 제외한 그 외 다른 commit들을 pull request 하려고 하는데 제가 확인할 수 없는 사항들이 존재하여 문의드립니다.

현재 pytest를 사용하지 못하고 저장된 엑셀 파일을 직접 열여서 테스트 중입니다.

이십일스토어(01183407)의 경우는 "20161231", "I.유동자산" 의 값이 "5531436227" 으로 expected 값과 동일한 것은 확인했습니다.

근데 삼성에스디에스(00126186)의 경우에는 20130630 열이 존재하지 않고
하나금융지주(00547583), 부국증권(00123772)의 경우에는 expected 값과 불일치하는 값이 출력되고 있습니다.

문제는 1bebd8a (tag v0.3.13) commit sha에서도 동일한 값을 가진 엑셀이 추출되어 테스트 케이스가 성공되지 않는 다는 점입니다.

가장 좋은 방법은 pytest를 이용해서 동일한 테스트를 진행하는 것인데
pytest를 사용하면 아래와 같이 "78 skipped"가 발생하는 상황입니다.

제가 pytest 사용이 미숙하다보니
어떠한 조건에서 테스트 케이스가 skip되는 것인지 파악이 안되고 있습니다.

혹시 pytest 관련해서 예상되는 문제점이 있다면 공유 부탁드립니다.


~/dart-fss# pytest --loc local

==== test session starts ====
platform linux -- Python 3.7.11, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: /usr/src/app/dart-fss
collected 85 items

dart_fss/tests/test_api_filings.py sss
dart_fss/tests/test_api_finance.py sssss
dart_fss/tests/test_api_info.py ssssssssssss
dart_fss/tests/test_api_shareholder.py ss
dart_fss/tests/test_auth.py s
dart_fss/tests/test_corp.py sssssssssss
dart_fss/tests/test_errors.py sss
dart_fss/tests/test_fs.py sssssssssssssssssss
dart_fss/tests/test_fs_search.py ...
dart_fss/tests/test_regex.py ..
dart_fss/tests/test_reports.py ssssss
dart_fss/tests/test_search_report.py ssss
dart_fss/tests/test_utils.py ..
dart_fss/tests/test_xbrl.py sssssssssss

==== warnings summary ====
../../../local/lib/python3.7/site-packages/pandas/compat/__init__.py:109
  /usr/local/lib/python3.7/site-packages/pandas/compat/__init__.py:109: UserWarning: Could not import the lzma module. Your installed Python is incomplete. Attempting to use lzma compression will result in a RuntimeError.
    warnings.warn(msg)

../../../local/lib/python3.7/site-packages/arelle/PythonUtil.py:9
  /usr/local/lib/python3.7/site-packages/arelle/PythonUtil.py:9: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working
    from collections import OrderedDict, MutableSet

../../../local/lib/python3.7/site-packages/arelle/PluginManager.py:10
  /usr/local/lib/python3.7/site-packages/arelle/PluginManager.py:10: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
    import os, sys, types, time, ast, imp, io, json, gettext, traceback

../../../local/lib/python3.7/site-packages/arelle/pyparsing/pyparsing_py3.py:627
  /usr/local/lib/python3.7/site-packages/arelle/pyparsing/pyparsing_py3.py:627: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working
    collections.MutableMapping.register(ParseResults)

-- Docs: https://docs.pytest.org/en/stable/warnings.html
==== 7 passed, 78 skipped, 4 warnings in 1.21s ====
josw123 commented 3 years ago

@dveamer 지속적으로 기여해주고 계신점 진심으로 감사드립니다.

1. pytest skip에 관하여

pytest에서 skip이 발생하는 이유는 DART_API_KEY 환경변수가 설정되어 있지 않기 때문입니다.

환경변수 DART_API_KEY에 opendart에서 발급해준 api key를 넣으셔서 pytest를 실행시키시면 skip 없이 동작하게 됩니다.

2. 테스트 케이스에 관하여

일부 테스트 케이스의 경우 테스트 시간단축을 위해 아래와 같이 검색 종료일이 과거로 고정되어 있습니다.

삼성에스디에스

sds = TestCrp(corp_code='00126186', bgn_de='20130813',
              end_de='20150807', separate=False, report_tp='quarter')

하나 금융 투자

hana_fn = TestCrp(corp_code='00547583', bgn_de='20120101',
                  end_de='20121231', separate=False, report_tp='annual')

하나 금융 투자

bookook = TestCrp(corp_code='00123772', bgn_de='20200101', end_de='20210503', separate=False, report_tp='annual')

dart_fss의 경우 최신데이터부터 데이터를 추출하여 저장합니다.

예를들어 아래그림과 같이 2020년 사업보고서에는 2020년 재무제표와 2019년 재무제표가 있습니다. 또한 2019년 사업보고서에는 2019년 재무제표와 2018년 재무제표가 있습니다. 이러한 경우 dart_fss 라이브러리는 2020년 사업보고서에서 2020년 재무제표와 2019년 재무제표를 추출하고, 2019년 사업보고서에는 2018년 재무제표만 추출하여 저장하게 됩니다.

image

문제는 2020년의 사업보고서의 2019년 재무제표와 2019년 사업보고서의 2019년 재무제표의 값이 일치하지 않는 경우가 있습니다. 이는 회계처리 방법의 변경, 오류 수정 등으로 인해 변경이 일어나는 경우입니다.

그러므로 데이터의 추출 종료일이 다른 경우 일부 데이터의 값이 일치하지 않는 경우가 생기게 됩니다. 그러므로 직접 테스트를 하시는 경우 일부 데이터의 값이 일치하지 않거나 추출되지 않는 경우가 생기게 됩니다.(즉, 추출 시작일과 종료일이 다를 경우 일부 추출 되는 데이터가 불일치하게 됩니다.)

그러므로 자동으로 테스트를 하시는 것을 추천드리며 만약 수동으로 테스트 하시는 경우 아래의 테스트 케이스 파일을 참고하셔서 진행하시면 되겠습니다.

3. 기여해주신 테스트 코드에 관하여

기여해주신 코드를 기반으로 인카금융서비스(01013694), SG&G(00264714), 마이크로컨텍솔(00568188)에서 생기는 버그를 수정중에 있으며, 인카금융서비스(01013694)를 제외한 나머지 회사들의 경우 지난주 수정하였습니다.(develop branch를 참고해주시면 감사하겠습니다.)

인카금융서비스의 경우 아래와 같이 테이블 테두리로 인해 발생하는 오류 및 bs4에서 발생하는 일부 오류가 있어 수정하는데 시간이 조금 걸릴 것으로 생각됩니다. (일부 추출 로직 수정이 필요합니다)

다시한번 코드에 지속적으로 기여해 주시는점 감사드립니다.