커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
답변 완료
재무재표 시각화에서 에러가 계속 생기네요.
[왕초보] ChatGPT 300% 활용하기 v0
2주차
북마크
이*수
댓글
6
추천
0
조회수
8
조회수
8
답변 완료

* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.

* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.



카카오 재무재표를 불러와서, 시각화 시키는데 계속 에러가 생깁니다.

여러번 챗 gpt에 물어봐도 계속 같은 현상인데, 어떻게 해결하고, 뭐가 문제인지요?


스파르타 즉문즉답




작성한 코드 및 에러 메세지

import pandas as pd

import matplotlib.pyplot as plt


# 재무제표 데이터를 가져오기 위해 pandas의 read_html 함수를 사용합니다.

# 주소는 카카오의 네이버 금융 페이지에서 제공하는 재무제표 페이지 주소입니다.

url = 'https://finance.naver.com/item/main.nhn?code=035720'

# encoding 매개변수를 변경하여 HTML의 인코딩을 다시 시도합니다.

df_list = pd.read_html(url, encoding='cp949')


# 가져온 데이터프레임 중에서 재무제표 데이터프레임을 선택합니다.

financial_df = df_list[3] # 네이버 금융 페이지의 구조에 따라서 선택할 인덱스가 다를 수 있습니다.


# 시각화를 위해 데이터프레임에서 필요한 열을 선택합니다.

# 네이버 금융 페이지의 재무제표 데이터프레임의 열 이름을 확인합니다.

print(financial_df.columns)


# 선택한 열 이름을 기반으로 데이터프레임에서 해당 열을 선택합니다.

# 이때, 열 이름에는 공백, 특수문자 등이 포함되어 있으므로 주의해야 합니다.

# 예를 들어, '당기순이익(억원)', '영업이익(억원)', 'ROE(지배주주)(%)', '부채비율(%)' 등이 포함된 열을 선택합니다.

selected_df = financial_df[[

  ('주요재무정보', '주요재무정보', '주요재무정보'), # 이 부분은 재무정보 테이블에서 가져오는 열입니다.

  ('최근 연간 실적', '2021.12'), # 예시 데이터입니다. 연도와 해당 연도의 실적 열입니다.

  ('최근 연간 실적', '당기순이익(억원)'), 

  ('최근 연간 실적', '영업이익(억원)'), 

  ('최근 연간 실적', 'ROE(지배주주)(%)'), 

  ('최근 연간 실적', '부채비율(%)')

]]


# 선택한 열 이름을 변경합니다.

selected_df.columns = ['연도', '당기순이익', '영업이익', 'ROE', '부채비율']


# '연도' 열을 인덱스로 설정합니다.

selected_df.set_index('연도', inplace=True)


# 시각화를 위해 데이터프레임을 숫자형으로 변환합니다.

selected_df = selected_df.apply(pd.to_numeric, errors='coerce')


# 시각화 코드는 그대로 사용합니다.

# 당기순이익과 영업이익 시각화

plt.figure(figsize=(10, 6))

selected_df[['당기순이익', '영업이익']].plot(kind='bar', figsize=(10, 6), color=['blue', 'red'])

plt.title('당기순이익과 영업이익')

plt.xlabel('연도')

plt.ylabel('금액')

plt.legend(['당기순이익', '영업이익'])

plt.grid(True)

plt.show()


# 자기자본이율 시각화

plt.figure(figsize=(10, 6))

plt.plot(selected_df.index, selected_df['ROE'], marker='o', color='green', linestyle='-')

plt.title('자기자본이율')

plt.xlabel('연도')

plt.ylabel('ROE')

plt.grid(True)

plt.show()


# 연간 부채비율 시각화

plt.figure(figsize=(10, 6))

plt.bar(selected_df.index, selected_df['부채비율'], color='orange')

plt.title('연간 부채비율')

plt.xlabel('연도')

plt.ylabel('부채비율')

plt.grid(True)

plt.show()

오류 발생 시, 작성한 코드 전체와 에러 메시지를 첨부해 주세요.


에러메세지 입니다.

c:\Users\아빠\AppData\Local\Programs\Python\Python312\Lib\site-packages\bs4\__init__.py:228: UserWarning: You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored.

 warnings.warn("You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored.")

MultiIndex([( '주요재무정보',   '주요재무정보', '주요재무정보'),

      ('최근 연간 실적',  '2021.12', 'IFRS연결'),

      ('최근 연간 실적',  '2022.12', 'IFRS연결'),

      ('최근 연간 실적',  '2023.12', 'IFRS연결'),

      ('최근 연간 실적', '2024.12(E)', 'IFRS연결'),

      ('최근 분기 실적',  '2022.12', 'IFRS연결'),

      ('최근 분기 실적',  '2023.03', 'IFRS연결'),

      ('최근 분기 실적',  '2023.06', 'IFRS연결'),

      ('최근 분기 실적',  '2023.09', 'IFRS연결'),

      ('최근 분기 실적',  '2023.12', 'IFRS연결'),

      ('최근 분기 실적', '2024.03(E)', 'IFRS연결')],

      )

------------------------------------------------------------------------------

{

"name": "IndexError",

"message": "tuple index out of range",

"stack": "---------------------------------------------------------------------------

IndexError                Traceback (most recent call last)

Cell In[82], line 20

   15 print(financial_df.columns)

   17 # 선택한 열 이름을 기반으로 데이터프레임에서 해당 열을 선택합니다.

   18 # 이때, 열 이름에는 공백, 특수문자 등이 포함되어 있으므로 주의해야 합니다.

   19 # 예를 들어, '당기순이익(억원)', '영업이익(억원)', 'ROE(지배주주)(%)', '부채비율(%)' 등이 포함된 열을 선택합니다.

---> 20 selected_df = financial_df[[

   21   ('주요재무정보', '주요재무정보', '주요재무정보'), # 이 부분은 재무정보 테이블에서 가져오는 열입니다.

   22   ('최근 연간 실적', '2021.12'), # 예시 데이터입니다. 연도와 해당 연도의 실적 열입니다.

   23   ('최근 연간 실적', '당기순이익(억원)'), 

   24   ('최근 연간 실적', '영업이익(억원)'), 

   25   ('최근 연간 실적', 'ROE(지배주주)(%)'), 

   26   ('최근 연간 실적', '부채비율(%)')

   27 ]]

   29 # 선택한 열 이름을 변경합니다.

   30 selected_df.columns = ['연도', '당기순이익', '영업이익', 'ROE', '부채비율']


File c:\\Users\\아빠\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\frame.py:4096, in DataFrame.__getitem__(self, key)

  4094   if is_iterator(key):

  4095     key = list(key)

-> 4096   indexer = self.columns._get_indexer_strict(key, \"columns\")[1]

  4098 # take() does not accept boolean indexers

  4099 if getattr(indexer, \"dtype\", None) == bool:


File c:\\Users\\아빠\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\multi.py:2766, in MultiIndex._get_indexer_strict(self, key, axis_name)

  2763   self._raise_if_missing(key, indexer, axis_name)

  2764   return self[indexer], indexer

-> 2766 return super()._get_indexer_strict(key, axis_name)


File c:\\Users\\아빠\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\base.py:6195, in Index._get_indexer_strict(self, key, axis_name)

  6192   keyarr = com.asarray_tuplesafe(keyarr)

  6194 if self._index_as_unique:

-> 6195   indexer = self.get_indexer_for(keyarr)

  6196   keyarr = self.reindex(keyarr)[0]

  6197 else:


File c:\\Users\\아빠\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\base.py:6182, in Index.get_indexer_for(self, target)

  6164 \"\"\"

  6165 Guaranteed return of an indexer even when non-unique.

  6166 

  (...)

  6179 array([0, 2])

  6180 \"\"\"

  6181 if self._index_as_unique:

-> 6182   return self.get_indexer(target)

  6183 indexer, _ = self.get_indexer_non_unique(target)

  6184 return indexer


File c:\\Users\\아빠\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\base.py:3932, in Index.get_indexer(self, target, method, limit, tolerance)

  3928     indexer[mask] = loc

  3930   return ensure_platform_int(indexer)

-> 3932 pself, ptarget = self._maybe_downcast_for_indexing(target)

  3933 if pself is not self or ptarget is not target:

  3934   return pself.get_indexer(

  3935     ptarget, method=method, limit=limit, tolerance=tolerance

  3936   )


File c:\\Users\\아빠\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\base.py:6359, in Index._maybe_downcast_for_indexing(self, other)

  6356 elif self._is_multi and not other._is_multi:

  6357   try:

  6358     # \"Type[Index]\" has no attribute \"from_tuples\"

-> 6359     other = type(self).from_tuples(other) # type: ignore[attr-defined]

  6360   except (TypeError, ValueError):

  6361     # let's instead try with a straight Index

  6362     self = Index(self._values)


File c:\\Users\\아빠\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\multi.py:222, in names_compat.<locals>.new_meth(self_or_cls, *args, **kwargs)

  219 if \"name\" in kwargs:

  220   kwargs[\"names\"] = kwargs.pop(\"name\")

--> 222 return meth(self_or_cls, *args, **kwargs)


File c:\\Users\\아빠\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pandas\\core\\indexes\\multi.py:617, in MultiIndex.from_tuples(cls, tuples, sortorder, names)

  614   if isinstance(tuples, Index):

  615     tuples = np.asarray(tuples._values)

--> 617   arrays = list(lib.tuples_to_object_array(tuples).T)

  618 elif isinstance(tuples, list):

  619   arrays = list(lib.to_object_array_tuples(tuples).T)


File lib.pyx:3041, in pandas._libs.lib.tuples_to_object_array()


IndexError: tuple index out of range"

}Tip 1) </> 아이콘을 눌러 코드박스를 만들어 보세요.

Tip 2) Ctrl+A(맥의 경우 Command+A) 단축키로 코드를 한 번에 선택할 수 있어요!


import pandas as pd
import matplotlib.pyplot as plt


# 재무제표 데이터를 가져오기 위해 pandas의 read_html 함수를 사용합니다.
# 주소는 카카오의 네이버 금융 페이지에서 제공하는 재무제표 페이지 주소입니다.
url = 'https://finance.naver.com/item/main.nhn?code=035720'
# encoding 매개변수를 변경하여 HTML의 인코딩을 다시 시도합니다.
df_list = pd.read_html(url, encoding='cp949')


# 가져온 데이터프레임 중에서 재무제표 데이터프레임을 선택합니다.
financial_df = df_list[3]  # 네이버 금융 페이지의 구조에 따라서 선택할 인덱스가 다를 수 있습니다.


# 시각화를 위해 데이터프레임에서 필요한 열을 선택합니다.
# 네이버 금융 페이지의 재무제표 데이터프레임의 열 이름을 확인합니다.
print(financial_df.columns)


# 선택한 열 이름을 기반으로 데이터프레임에서 해당 열을 선택합니다.
# 이때, 열 이름에는 공백, 특수문자 등이 포함되어 있으므로 주의해야 합니다.
# 예를 들어, '당기순이익(억원)', '영업이익(억원)', 'ROE(지배주주)(%)', '부채비율(%)' 등이 포함된 열을 선택합니다.
selected_df = financial_df[[
    ('주요재무정보', '주요재무정보', '주요재무정보'),  # 이 부분은 재무정보 테이블에서 가져오는 열입니다.
    ('최근 연간 실적', '2021.12'),  # 예시 데이터입니다. 연도와 해당 연도의 실적 열입니다.
    ('최근 연간 실적', '당기순이익(억원)'), 
    ('최근 연간 실적', '영업이익(억원)'), 
    ('최근 연간 실적', 'ROE(지배주주)(%)'), 
    ('최근 연간 실적', '부채비율(%)')
]]


# 선택한 열 이름을 변경합니다.
selected_df.columns = ['연도', '당기순이익', '영업이익', 'ROE', '부채비율']


# '연도' 열을 인덱스로 설정합니다.
selected_df.set_index('연도', inplace=True)


# 시각화를 위해 데이터프레임을 숫자형으로 변환합니다.
selected_df = selected_df.apply(pd.to_numeric, errors='coerce')


# 시각화 코드는 그대로 사용합니다.
# 당기순이익과 영업이익 시각화
plt.figure(figsize=(10, 6))
selected_df[['당기순이익', '영업이익']].plot(kind='bar', figsize=(10, 6), color=['blue', 'red'])
plt.title('당기순이익과 영업이익')
plt.xlabel('연도')
plt.ylabel('금액')
plt.legend(['당기순이익', '영업이익'])
plt.grid(True)
plt.show()


# 자기자본이율 시각화
plt.figure(figsize=(10, 6))
plt.plot(selected_df.index, selected_df['ROE'], marker='o', color='green', linestyle='-')
plt.title('자기자본이율')
plt.xlabel('연도')
plt.ylabel('ROE')
plt.grid(True)
plt.show()


# 연간 부채비율 시각화
plt.figure(figsize=(10, 6))
plt.bar(selected_df.index, selected_df['부채비율'], color='orange')
plt.title('연간 부채비율')
plt.xlabel('연도')
plt.ylabel('부채비율')
plt.grid(True)
plt.show()



취소
 공유
취소
댓글 0
댓글 알림
나의얼굴