
* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.
* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.
카카오 재무재표를 불러와서, 시각화 시키는데 계속 에러가 생깁니다.
여러번 챗 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()
