AI SCHOOL/Python

[Python] FinanceDataReader - 1

moru_xz 2023. 1. 31. 17:12

라이브러리 불러오기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

import FinanceDataReader as fdr

상장종목 목록 가져오기

url = "https://finance.naver.com/sise/entryJongmok.naver?&page=1"

이 url로 상위 10개 종목 불러오기

df_top10 = pd.read_html(url)[0].dropna()
df_top10

전체 상장종목에서 종목 코드와 종목명만 가져오기

fdr.StockListing('KRX').head(3)

df_krx = fdr.StockListing('KRX')[['Name', 'Code']]
df_krx.head()

merge를 통한 시가총액 상위 10개 종목 만들기

- merge는 key값이 일치하는 것으로 합침

- 이름이 같으면 on 사용하고, 다르면 left_on과 right_on 사용

일별시세를 수집하기 위해 종목코드가 필요 -> 종목코드를 찾자

df_10 = df_top10.merge(df_krx, left_on = '종목별', right_on = 'Name')[['Name', 'Code']]
df_10

isin을 사용해서 찾기

df_krx[df_krx['Name'].isin(df_top10['종목별'])]

일별 시세 수집

fdr.DataReader('005930', start = '2022')['Close']

여러 종목이 종가 수집

- 종목코드로 수집 가능

반복문을 사용해서 여러 종목의 종가 수집

item_list = [fdr.DataReader(code, start = '2022')['Close'] for code in df_10['Code']]
df = pd.concat(item_list, axis = 1)
df

- item_list 안에 시가총액 순위 별로 종가가 들어있음

- 순서대로 가져왔기 때문에 df_10['Name']을 columns 에 넣어도 가능

df = pd.concat(item_list, axis = 1)
df.columns = df_10['Name']
df

시각화 폰트 설정

 

# 한글폰트 사용을 위해 설치
!pip install koreanize-matplotlib
import koreanize_matplotlib

# 그래프에 retina display 적용
%config InlineBackend.figure_format = 'retina'

import matplotlib.pyplot as plt
plt.style.use('ggplot')

- 폰트를 포함하고 있는 스타일을 지정하게 되면 폰트 설정이 초기화 되어 한글폰트가 깨지는 문제 발생
- 한글폰트 사용을 위해 추천하는 스타일 사용! -> 'fivethirtyeight', 'ggplot'

print(plt.style.available)

>> ['Solarize_Light2', '_classic_test_patch', '_mpl-gallery', '_mpl-gallery-nogrid', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']

여러 종목 한 번에 시각화 하기

df.plot(figsize = (12, 6))
plt.legend(bbox_to_anchor = (1, 1))

plt.legend(bbox_to_anchor = (1, 1))  -> 범주박스 위치

# 2개의 종목 비교하기 : "삼성전자", "LG화학" 을 plot으로 시각화 합니다.
df[['삼성전자', 'LG화학']].plot()

2축 그래프 사용하기

df[['삼성전자', 'LG화학']].plot(secondary_y = ['LG화학'], figsize = (12, 6))


[더하기]

판다스의 describe()를 통해 수치 데이터의 기술통계 구했을 때 알 수 있는 것은?

- 빈도수, 평균, 표준편차, 최솟값, 1사분위수(25%), 2사분위수(50%, 중앙값), 3사분위수(75%), 최댓값
- 'count', 'mean', 'std', 'min', '25%', '50%', '75%', 'max'

 

pivot() / pivot_table() / groupby() / crosstab()

- pivot() 은 형태만 변경하고 연산을 하는 기능이 없음 -> 연산을 하기 위해서는 pivot_table()을 사용해야 합니다.
-  pivot_table()은 groupby()를 사용하기 쉽게 만들어 놓은 기능이며, crosstab()은 pivot_table() 을 사용하기 쉽게 만들어 놓은 기능입니다.