• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

fdr.StockListing("KRW") 불러올때 오류가 납니다.

21.04.26 20:56 작성 조회수 361

1

ValueError: unknown format code 'd' for object of type 'str' 이라고 뜨네요

krx/listing.py 에서

df_listing['Symbol'] = df_listing['Symbol'].apply(lambda x: '{:06d}'.format(x))

이부분에서 x값이 string으로 들어가서 문제가 생기는듯 합니다. 버전은 선생님 버전이랑 같은데 뭐가 문제인지 몰겠네요

답변 2

·

답변을 작성해보세요.

1

안녕하세요.

질문 주신 내용은 아래 링크에 있는 소스코드에서 난 오류입니다.

https://github.com/FinanceData/FinanceDataReader/blob/master/krx/listing.py#L30

데이터를 제대로 받아왔다면 오류가 발생하지 않았을텐데 해당 데이터를 불러오는 과정에서 오류가 발생해서 데이터 형식이 d 형태로 보이는게 아닐까 싶습니다.

주피터 노트북에서 아래의 소스코드를 직접 실행해 보세요.

코드는 아래 제가 붙여넣기 한 코드보다 깃헙에 있는 21-29 행에 있는 소스코드를 비어있는 주피터 노트북을 생성하고 실행해 보세요.

아마도 SSL 인증서 문제로 데이터를 받아오지 못해 오류가 발생했을 것으로 추측됩니다.

 

        # For mac, SSL CERTIFICATION VERIFICATION ERROR
        ssl._create_default_https_context = ssl._create_unverified_context
        
        url = 'http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13'
        df_listing = pd.read_html(url, header=0)[0]
        cols_ren = {'회사명':'Name', '종목코드':'Symbol', '업종':'Sector', '주요제품':'Industry', 
                            '상장일':'ListingDate', '결산월':'SettleMonth',  '대표자명':'Representative', 
                            '홈페이지':'HomePage', '지역':'Region', }
        df_listing = df_listing.rename(columns = cols_ren)

 

 

haemil님의 프로필

haemil

2021.09.22

답변해주셔서 감사합니다 선생님~! 🙏

url을 통해 전달해주신 저장소의 21-29 행 코드를 빈 주피터 노트북을 새롭게 열어서 실행해보니 

아래와 같은 오류 메시지를 확인했습니다. 

아래 오류 메시지를 살펴보며 몇 가지 궁금한 것이 생겨서 진행해본 내용이 있는데 혹시 제가 잘못하고 있는 부분이 있는지 확인 한 번 부탁드려도 될까요?

 

ssl 이 정의 되어 있지 않다는 오류 메시지에 대응하기 위해 저장소의 내용대로 

import ssl

 

ssl을 import 하고 코드를 다시 실행시켜 보았더니 코드가 21~29행까지는 코드가 실행이 되는 것 같습니다.  (실행이 되는 것 같다고 한 이유는 정상적인 실행인지 확인할 길이 없기 때문에.... 그렇습니다)

 

아래의 코드를 실행한 결과 

df_listing = df_listing.rename(columns = cols_ren)
df_listing

 

29행까지의 코드가 실행된 내용은 위의 캡쳐내역과 같습니다. 

이후 한줄한줄씩 실행하며 오류를 살펴보려고 했는데, 

30번째 행을 실행하니 오류가 바로 발생했습니다. 

오류의 내용은 이전과 같습니다. 

---> 14 df_listing['Symbol'] = df_listing['Symbol'].apply(lambda x: '{:06d}'.format(x))
     15 df_listing

ValueError: Unknown format code 'd' for object of type 'str'

 

오류 메시지를 살펴보며 궁금한 것이 생겨서 진행해본 내용인데, 현재까지의 상황은 이렇습니다.

제가 수업을 듣고 있는 부분은 판다스를 다루는 방법을 학습하는 부분이라서 큰 영향은 없을 것 같지만..! 

혹시나 제가 잘못하고 있는 부분이 있는지 궁금해서 이렇게 문의를 드려봅니다..! 

 

감사합니다. 🙇🏻‍♂️

 

안녕하세요.

Name              object
Symbol             int64
Sector            object
Industry          object
ListingDate       object
SettleMonth       object
Representative    object
HomePage          object
Region            object
dtype: object

df_listing['Symbol'] = df_listing['Symbol'].apply(lambda x: '{:06d}'.format(x))

# 처음에는 Symbol 이 숫자 타입입니다. 그런데 숫자타입이면 012345 라는 종목코드일때 앞의 0이 사라지게 됩니다.

# 마치 엑셀에서 전화번호 앞의 0이 숫자로 인식했을 때 사라지는 것과 마찬가지 이치입니다.

# 여기에서 이 문제를 해결하기 위해 앞에 0이 사라졌다면 다음의 방법으로 숫자 6자리로 만들어 줍니다.

x2 = 123

'{:06d}'.format(x2)

# 위에서 숫자 6자리로 만들어 주고 타입을 문자로 변경하면 앞의 0이 사라지지 않습니다.

# 그래서 타입이 object 로 변경된 것을 확인해 볼 수 있습니다.

df_listing.dtypes

-----

Name              object
Symbol            object
Sector            object
Industry          object
ListingDate       object
SettleMonth       object
Representative    object
HomePage          object
Region            object
dtype: object

-----

# 문자 타입을 다시 읽어와서 앞에 0을 붙이고 형변환을 하려고 하면 숫자가 아니기 때문에 오류가 나게 됩니다.

# 그래서 데이터를 처음에 읽어왔을 때 종목코드에 문자가 섞여있다면 이런 오류가 발생할 수 있으며,

# 아니면 처음부터 읽어온 타입이 문자일 때 이런 현상이 있을 수 있습니다.

# 아마도 설치된 판다스 버전에 따라 결과값을 다르게 받아오는 것으로 추측됩니다.

df_listing['Symbol'] = df_listing['Symbol'].apply(lambda x: '{:06d}'.format(x))

<ipython-input-7-3df13bd90e34> in <lambda>(x)
----> 1 df_listing['Symbol'] = df_listing['Symbol'].apply(lambda x: '{:06d}'.format(x))

ValueError: Unknown format code 'd' for object of type 'str'

사용하고 있는 판다스 버전을 알려주시면 판다스 버전 문제인지 확인해 볼 수 있을것 같습니다.

pd.__version__ 으로 판다스 버전을 올려주시면 확인해 보겠습니다.
오류제보 감사합니다 :)

haemil님의 프로필

haemil

2021.09.23

상세하게 답변해주셔서 감사합니다. 선생님 🙇🏻‍♂️

판다스 버전을 확인해보니 아래처럼 1.3.3 으로 확인됩니다..!

 

선생님 덕분에 미지의 영역으로 남아 있던 문제가 이제 손에 잡히는 것처럼 느껴져요! 

정말 감사합니다. 🙏

1

안녕하세요. 버전이 저와 같다면 오타가 있어서 그런것 같아요.

아래 오타가 있어요 KRW => KRX 로 바꿔서 불러와 보세요!

fdr.StockListing("KRW") => fdr.StockListing("KRX")

고형진님의 프로필

고형진

질문자

2021.04.27

앗 제가 잘못썼는데 KRX로 해도 같은 결과가 나옵니다. 코스피도 마찬가지에용..

안녕하세요. 실습 초반부터 어려움이 많으셨겠어요.

0.9.31 버전 이상을 사용하는 것을 추천하고요.

일단 아래 colab 링크에서 아래 코드의 주석을 풀고 실습을 해보세요. 

!pip install -U finance-datareader

https://colab.research.google.com/github/corazzon/finance-data-analysis/blob/main/2.1%20FinanceDataReader%EB%A5%BC%20%ED%86%B5%ED%95%9C%20%EC%83%81%EC%9E%A5%EC%A2%85%EB%AA%A9%20%EC%A0%84%EC%B2%B4%20%EB%B6%88%EB%9F%AC%EC%98%A4%EA%B8%B0-output.ipynb

그리고 로컬 주피터 노트북에서도 다시 실행해도 오류가 난다면 아래 명령어로 재설치를 해보세요.


!
pip uninstall finance-datareader

!pip install finance-datareader --upgrade

 

haemil님의 프로필

haemil

2021.09.21

어떻게 해결하셨는지 여쭈어봐도 될까요? 저도 같은 에러를 겪고 있는데... 처음에 한 번 진행했을 때는 잘 되던 것 같은데 실습해보려고 하니 갑자기 안 되네요 ㅠ...

안녕하세요. 혹시 위 Colab 으로 실습해도 같은 결과가 나오는지 궁금합니다. 실습하신 소스코드에 대한 스크린샷과 오류 메시지를 함께 올려주시면 도움을 드리겠습니다.

haemil님의 프로필

haemil

2021.09.22

선생님께서 공유해주신 Colab 으로 실습을 진행하니 정상적으로 작동이 됩니다 감사합니다. 다만 제 컴퓨터 로컬 환경에서 실행되지 않는 부분이 아쉽네요 ㅠ. `FinanceDataReader` 도 정상적으로 설치했고 버전도 최신 버전인데, 아래와 같이 문의 내역과 동일한 오류가 발생해서..! 조금 해매었어요.  강의 내용을 따라 실습을 진행하다가 추후 문제가 된다면..! 다시 여쭈어보겠습니다. 

```

     28                             '홈페이지':'HomePage', '지역':'Region', }
     29         df_listing = df_listing.rename(columns = cols_ren)
---> 30         df_listing['Symbol'] = df_listing['Symbol'].apply(lambda x: '{:06d}'.format(x))
     31         df_listing['ListingDate'] = pd.to_datetime(df_listing['ListingDate'])
     32 

ValueError: Unknown format code 'd' for object of type 'str'

```

 

답변해주셔서 감사합니다. 🙇🏻‍♂️

아래 답변을 추가했습니다. 아래 내용을 참고해서 원래 소스코드를 실행했을 때 정상 동작하는지 확인해 주세요!