라이브러리 임포트
import pandas as pd
import requests
1. 웹서비스 분석 : url
- pc 웹페이지가 복잡하면 mobile 웹페이지에서 수집
page, page_size = 1, 20
url = f'https://m.stock.naver.com/api/index/KOSPI/price?pageSize={page_size}&page={page}'
print(url)
2. 서버에 데이터 요청 : request(url) > response : json(str)
- response의 status code가 200이 나오는지 확인
- 403이나 500이 나오면 request가 잘못되거나 web server에서 수집이 안되도록 설정이 된것임
- 200이 나오더라도 response 안에 있는 내용을 확인 > 확인하는 방법 : response.text
response = requests.get(url)
response
response.text[:200]
3. 서버에서 받은 데이터 파싱(데이터 형태를 변경) : json(str) > list, dict > DataFrame
columns = ["localTradedAt", "closePrice"]
datas = response.json()
kospi_df = pd.DataFrame(datas)[columns]
kospi_df.tail(2)
4. 함수로 만들기
- 방금까지 짠 크롤링 코드를 함수로 만들어준다.
def stock_price(code="KOSPI", page=1, page_size=20):
""" This function is crwaling stock price from naver stock web page
parameters :
code : str : KOSPI or KOSDAQ
page : int : page number
page_size : int : one page size
return :
type : DataFame of pandas"""
url = f'https://m.stock.naver.com/api/index/{code}/price?pageSize={page_size}&page={page}'
response = requests.get(url)
columns = ["localTradedAt", "closePrice"]
datas = response.json()
return pd.DataFrame(datas)[columns]
help(stock_price)
kospi_df = stock_price()
kospi_df.tail(2)
kosdaq_df = stock_price("KOSDAQ")
kosdaq_df.tail(2)
5. 원달러 환율 데이터 수집 : 실습
- 위에서 했던것과 마찬가지로 함수를 만들어준다.
def exchage_rate(code="FX_USDKRW", page=1, page_size=60):
url = f'https://api.stock.naver.com/marketindex/exchange/{code}/prices?page={page}\
&pageSize={page_size}'
response = requests.get(url)
columns = ["localTradedAt", "closePrice"]
datas = response.json()
return pd.DataFrame(datas)[columns]
usd_df = exchage_rate()
usd_df.tail(2)
eur_df = exchage_rate("FX_EURKRW")
eur_df.tail(2)
6. 시각화
%matplotlib inline
%config InlineBackend.figure_formats = {'png', 'retina'}
import matplotlib.pyplot as plt
import seaborn as sns
page_size = 60
kospi_df = stock_price("KOSPI", page_size=page_size)
kosdaq_df = stock_price("KOSDAQ", page_size=page_size)
usd_df = exchage_rate("FX_USDKRW", page_size=page_size)
eur_df = exchage_rate("FX_EURKRW", page_size=page_size)
print(kospi_df.dtypes)
kospi_df["kospi"] = kospi_df["closePrice"].apply(lambda data: float(data.replace(",", "")))
kospi_df = kospi_df.drop(columns=["closePrice"])
print(kospi_df.dtypes)
kosdaq_df["kosdaq"] = kosdaq_df["closePrice"].apply(lambda data: float(data.replace(",", "")))
usd_df["usd"] = usd_df["closePrice"].apply(lambda data: float(data.replace(",", "")))
eur_df["eur"] = eur_df["closePrice"].apply(lambda data: float(data.replace(",", "")))
kosdaq_df = kosdaq_df.drop(columns=["closePrice"])
usd_df = usd_df.drop(columns=["closePrice"])
eur_df = eur_df.drop(columns=["closePrice"])
- 데이터 전처리 2 : 날짜 데이터 맞추기 : merge
merge_df_1 = pd.merge(kospi_df, kosdaq_df, on="localTradedAt")
merge_df_2 = pd.merge(merge_df_1, usd_df, on="localTradedAt")
merge_df_3 = pd.merge(merge_df_2, eur_df, on="localTradedAt")
merge_df = merge_df_3.copy()
merge_df.tail(2)
plt.figure(figsize=(20, 5))
columns = merge_df.columns[1:]
for column in columns:
plt.plot(merge_df["localTradedAt"], merge_df[column], label=column)
xticks_count = 11
plt.xticks(merge_df["localTradedAt"][::int(len(merge_df) // xticks_count) + 1])
plt.legend(loc=0)
plt.show()
7. 데이터 스케일링
- z=max(x)−min(x)xi−min(x)(0≦z≦1)
from sklearn.preprocessing import minmax_scale
plt.figure(figsize=(20, 5))
columns = merge_df.columns[1:]
for column in columns:
plt.plot(merge_df["localTradedAt"], minmax_scale(merge_df[column]), label=column)
xticks_count = 11
plt.xticks(merge_df["localTradedAt"][::int(len(merge_df) // xticks_count) + 1])
plt.legend(loc=0)
plt.show()
8. 상관관계 분석
- 피어슨 상관계수(Pearson Correlation Coefficient)
- 두 데이터 집합의 상관도를 분석할때 사용되는 지표
- 상관계수의 해석
- -1에 가까울수록 서로 반대방향으로 움직임
- 1에 가까울수록 서로 같은방향으로 움직임
- 0에 가까울수록 두 데이터는 관계가 없음
corr_df = merge_df[merge_df.columns[1:]].corr()
corr_df
plt.figure(figsize=(20, 5))
sns.heatmap(corr_df**2, cmap="YlGnBu", annot=True)
plt.show()