먼저 코드를 실행하기 전에 필요한 라이브러리를 설치해야 합니다. pandas
, plotly.express
, requests
, bs4
(Beautiful Soup) 라이브러리가 필요합니다.
만약 이러한 라이브러리가 설치되어 있지 않다면, 다음 명령어를 사용하여 설치할 수 있습니다.
pip install pandas plotly requests beautifulsoup4
이제 다음과 같이 코드를 작성하고 실행할 수 있습니다.
import pandas as pd
import plotly.express as px
import requests
from bs4 import BeautifulSoup
# 종목명과 코드를 저장할 데이터프레임 생성
code_df = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13', header=0)[0]
code_df = code_df[['회사명', '종목코드']]
code_df = code_df.rename(columns={'회사명': 'name', '종목코드': 'code'})
code_df['code'] = code_df['code'].astype(str).str.zfill(6)
# 종목명으로부터 종목 코드를 얻는 함수 정의
def get_stock_code(name, code_df):
code = code_df.query("name == '{}'".format(name))['code'].to_string(index=False)
return code.strip()
# 종목명 지정 (삼성전자)
company_name = '삼성전자'
# 종목 코드 가져오기
stock_code = get_stock_code(company_name, code_df)
# 네이버 금융에서 종목 데이터 수집
def get_stock_data(stock_code):
url = 'https://finance.naver.com/item/sise_day.nhn?code={}'.format(stock_code)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
table = soup.find('table')
df = pd.read_html(str(table), header=0)[0]
return df
# 종목 데이터 수집
stock_data = get_stock_data(stock_code)
# 데이터 전처리
stock_data = stock_data.dropna()
stock_data['날짜'] = pd.to_datetime(stock_data['날짜'])
stock_data[['종가', '전일비', '시가', '고가', '저가', '거래량']] = stock_data[['종가', '전일비', '시가', '고가', '저가', '거래량']].astype(int)
# 그래프 그리기
fig = px.line(stock_data, x='날짜', y='종가', title='{}의 종가(Time Series)'.format(company_name))
fig.show()
위 코드는 삼성전자의 주식 종가 데이터를 수집하고 Plotly를 사용하여 시계열 그래프를 생성하는 예제입니다.
코드를 실행하기 전에 Python 환경에 필요한 라이브러리를 설치하고, 코드 내에서 company_name
변수에 삼성전자 또는 원하는 다른 기업명을 입력하여 해당 기업의 주식 종가를 시각화할 수 있습니다.
이 코드의 각 단계는 다음과 같습니다.
- 필요한 라이브러리를 가져옵니다.
- 한국 거래소의 기업 코드 데이터를 가져와서 종목명과 종목 코드를 추출합니다.
- 특정 기업명(여기서는 '삼성전자')을 선택하고 해당 기업의 종목 코드를 얻습니다.
- 네이버 금융에서 선택한 기업의 주식 데이터를 크롤링합니다.
- 주식 데이터를 데이터프레임으로 변환하고 데이터를 전처리합니다.
- Plotly를 사용하여 주식 종가의 시계열 그래프를 생성하고 표시합니다.
Pandas를 사용하여 Naver 금융에서 주식 데이터를 가져오는 과정은 아래와 같습니다.
- 필요한 라이브러리 설치
먼저 필요한 라이브러리를 설치해야 합니다.pandas
,plotly
,requests
,bs4
(Beautiful Soup) 라이브러리가 필요합니다. 필요한 라이브러리를 설치하는 방법은 이전에 설명한대로입니다.
pip install pandas plotly requests beautifulsoup4
- 한국거래소(KRX)에서 종목 코드 가져오기
한국거래소에서 종목 코드를 가져오는 부분은 이미 설명한 코드와 동일합니다. 이 코드를 사용하여 주식 종목의 종목 코드를 얻어옵니다.
import pandas as pd
# 한국거래소에서 종목 코드를 가져오기
code_df = pd.read_html('http://kind.krx.co.kr/corpgeneral/corpList.do?method=download&searchType=13', header=0)[0]
# 종목 코드를 6자리로 맞추기
code_df.종목코드 = code_df.종목코드.map('{:06d}'.format)
# 필요한 컬럼만 선택
code_df = code_df[['회사명', '종목코드']]
# 컬럼명을 영어로 변경
code_df = code_df.rename(columns={'회사명': 'name', '종목코드': 'code'})
# 상위 5개 데이터 확인
print(code_df.head())
- Naver 금융에서 주식 데이터 가져오기
이제 Naver 금융에서 주식 데이터를 가져오는 부분을 설명하겠습니다. 여기서는 '삼성전자'를 예로 들겠습니다.
import requests
from bs4 import BeautifulSoup
# 종목 이름을 입력하면 종목에 해당하는 코드를 가져와 네이버 금융에 넣어줍니다.
def get_url(item_name, code_df):
code = code_df.query("name=='{}'".format(item_name))['code'].to_string(index=False)
url = 'http://finance.naver.com/item/sise_day.nhn?code={code}'.format(code=code)
print("요청 URL = {}".format(url))
return url
# 종목명 지정 (예: 삼성전자)
company_name = '삼성전자'
# 종목 코드 가져오기
stock_code = get_url(company_name, code_df)
# 일자 데이터를 담을 데이터프레임 정의
df = pd.DataFrame()
# 1페이지에서 20페이지까지의 데이터를 가져옵니다.
for page in range(1, 21):
pg_url = '{url}&page={page}'.format(url=stock_code, page=page)
df = df.append(pd.read_html(pg_url, header=0)[0], ignore_index=True)
# 결측값(NaN) 있는 행 제거
df = df.dropna()
# 상위 5개 데이터 확인
print(df.head())
- 데이터 전처리
주식 데이터를 가져오면 데이터를 전처리해야 합니다. 데이터프레임의 컬럼명을 영어로 변경하고, 데이터의 타입을 int로 변환하며, 일자(date)를 날짜 형식으로 변환합니다.
# 한글로 된 컬럼명을 영어로 바꿔줍니다.
df = df.rename(columns={'날짜': 'date', '종가': 'close', '전일비': 'diff',
'시가': 'open', '고가': 'high', '저가': 'low', '거래량': 'volume'})
# 데이터의 타입을 int로 변환합니다.
df[['close', 'diff', 'open', 'high', 'low', 'volume']] = df[['close', 'diff', 'open', 'high', 'low', 'volume']].astype(int)
# 컬럼명 'date'의 타입을 날짜로 변환합니다.
df['date'] = pd.to_datetime(df['date'])
# 일자(date)를 기준으로 오름차순 정렬합니다.
df = df.sort_values(by=['date'], ascending=True)
# 상위 5개 데이터 확인
print(df.head())
- Plotly를 사용하여 Time Series 그래프 그리기
이제 전처리한 데이터를 사용하여 Plotly를 이용해 Time Series 그래프를 그립니다.
import plotly.offline as offline
import plotly.graph_objs as go
# Jupyter Notebook에서 출력
offline.init_notebook_mode(connected=True)
trace = go.Scatter(
x=df.date,
y=df.close,
name=company_name
)
data = [trace]
layout = dict(
title='{}의 종가(Time Series)'.format(company_name),
xaxis=dict(
rangeselector=dict(
buttons=list([
dict(count=1,
label='1m',
step='month',
stepmode='backward'),
dict(count=3,
label='3m',
step='month',
stepmode='backward'),
dict(count=6,
label='6m',
step='month',
stepmode='backward'),
dict(step='all')
])
),
rangeslider=dict(),
type='date'
)
)
fig = go.Figure(data=data, layout=layout)
offline.iplot(fig)
이제 위의 코드를 사용하여 Pandas를 이용해 Naver 금융에서 주식 데이터를 가져와서 시계열(Time Series) 그래프를 그릴 수 있습니다. 주식 데이터를 쉽게 분석하고 시각화할 수 있는 강력한 도구입니다.
728x90
댓글