본문 바로가기

프로젝트/크롤링, 스크래핑

[Python] (2)네이버 금융 증권 데이터(PER,PBR,배당률) 수집 : 데이터프레임

https://bigdata-doctrine.tistory.com/3

 

[Python] (1)네이버 금융 증권 데이터(PER,PBR,배당률) 수집 : 크롤링

https://finance.naver.com/ 네이버 금융 웹사이트 오늘은 크롤링을 사용하여 네이버 금융에서 증권 데이터를 수집해보도록 하겠습니다. 두 번째 포스팅에 프로그램을 실행해 볼 수 있도록 코랩 링크

bigdata-doctrine.tistory.com

 

오늘은 판다스 라이브러리를 통해 이전 시간에 수집한 증권 데이터를 데이터프레임에 저장하고 맷플롯립을 통해 시각화를 한 후 엑셀에 저장해보도록 하겠습니다. 

 

 

 

데이터프레임 만들기


#데이터프레임 생성
import pandas as pd 

stock_df = pd.DataFrame({"ticker":ticker_list,
                       "symbol":symbol_list,
                       "per":pers,
                       "pbr":pbrs,
                       "dividend_yield":dividend_yields})
stock_df

 

데이터 분석에 많이 사용되는 판다스 라이브러리를 통해 데이터프레임을 만들어봅니다.

 

판다스는 다양한 데이터 분석 도구를 지원합니다.

 

데이터프레임을 만드는 방법은 두 가지가 있습니다.

 

하나는 행별로 데이터를 넣는 것, 하나는 열 별로 데이터를 넣는 것입니다.

 

행별로 데이터를 넣는 경우에는 딕셔너리가 아닌 리스트가 들어있는 리스트 형식을 넣어주면 됩니다.

 

열 별로 데이터를 넣는 경우에는 위와 같이 리스트가 들어있는 딕셔너리 형식을 넣어주면 됩니다.

 

column을 key로 지정해주고, 각 column에 들어갈 데이터를 리스트에 넣어 value에 넣어줍니다.

 

다음과 같이 출력됩니다.

 

정렬되지 않은 데이터프레임

 

이와 같이 데이터가 데이터프레임 안에 잘 들어온 것을 알 수 있습니다.

 

데이터프레임을 앞에서부터 10개까지 보고 싶으시면 stock_df.head(10)을 입력하시면 되고

뒤에서부터 10개까지 보고 싶으시면 stock_df.tail(10)을 입력하시면 됩니다.

 

정렬은 주식 이름의 가나다순으로 되어있는데 이는 pykrx에서 주식에 대한 정렬이 가나다순으로 되어있기 때문입니다.

 

하지만 여러분들은 이를 per, pbr, 배당률 순으로 보고 싶으실 수도 있습니다.

 

 

데이터프레임 순서 정렬하기


# per 오름차순 (NaN 제외)
per_ascending = stock_df.sort_values(by="per", ascending=True)
per_ascending[per_ascending["per"] != None].head(20)

 

per 오름차순으로 정렬합니다.

 

sort_values메서드를 사용하여 per오름차순으로 정렬합니다.

 

per데이터가 None인 것은 제외하고 앞에서부터 20개 출력합니다.

 

다음과 같이 출력됩니다.

 

per오름차순 정렬 데이터프레임

 

다음은 pbr오름차순으로 정렬해봅니다.

 

# pbr 오름차순 (NaN 제외)
pbr_ascending = stock_df.sort_values(by="pbr", ascending=True)
pbr_ascending[pbr_ascending["pbr"] != None].head(20)

 

pbr오름차순 정렬 데이터프레임

 

다음은 배당수익률 내림차순으로 정렬해봅니다. 

 

# 배당수익률 내림차순
stock_df.sort_values(by="dividend_yield", ascending=False).head(20)

 

배당수익률 내림차순 정렬 데이터프레임

증권사가 배당수익률 상위권에 많이 분포해 있는 것을 알 수 있습니다.

 

 

간단한 데이터 분석


# 데이터 분석
stock_df.describe()

 

describe메서드는 간단한 데이터 분석을 도와줍니다.

 

출력 결과는 다음과 같습니다.

 

간단한 데이터 분석

 

각 데이터의 개수, 평균, 표준편차, 최솟값, 최댓값 등 여러 통계치를 보여줍니다.

 

None데이터는 개수에 포함되지 않고 따라서 통계치에 포함되지 않습니다.

 

 

데이터프레임 시각화


# 데이터프레임 시각화
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(15,10))

for i, col in enumerate(stock_df):
    if  2 <= i <= 4:
        ax = fig.add_subplot(2, 2, i-1)
        ax.title.set_text(col)

        if col == "per":
            stock_df[col].plot.hist(bins=[0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150])
        elif col == "pbr":
            stock_df[col].plot.hist(bins=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])
        elif col == "dividend_yield":
            stock_df[col].plot.hist(bins=[0,1,2,3,4,5,6,7,8,9,10,11,12])

plt.show()

 

matplotlib은 다양한 시각화 도구를 제공합니다.

 

우리가 구한 증권 데이터를 시각화하기 위해서 히스토그램이 가장 적합할 것 같으므로

히스토그램으로 시각화를 해보도록 하겠습니다.

 

사이즈는 가로 15px, 세로 10px로 만들어줍니다.

 

여러 개의 그래프를 보여주기 위해서는 add_subplot 메서드를 사용합니다.

 

괄호 안에는 2행 2열의 몇 번째 위치에 그래프를 넣을지 적어줍니다.

 

title.set_text 메서드로 각 그래프에 제목을 붙여줍니다.

 

히스토그램의 범위를 설정하기 위해서는 bins를 이용합니다.

 

bins=[0,10,20]은 0~10, 10~20, 20~30의 범위를 가지는 히스토그램을 만들어 줍니다.

 

출력 결과는 다음과 같습니다.

 

PER, PBR, 배당률 히스토그램

 

per은 0~20까지, pbr은 0~2까지 데이터가 몰려있는 것을 알 수 있습니다.

 

 

스프레드시트에 데이터 저장


# csv로 저장
stock_df.to_csv(f"{today}_stock_data_df.csv")

 

지금까지 수집한 증권 데이터를 excel이나 한셀과 같은 스프레드시트 프로그램에 저장할 수 있습니다.

 

to_csv안에 "스프레드시트 이름.csv"의 형식으로 입력해줍니다.

 


지금까지 네이버 금융 사이트를 크롤링하고 데이터프레임을 만들고 시각화를 한 후 엑셀에 저장하는 작업까지 해보았습니다.

 

밑에 코랩 링크 남겨놓을 테니 프로그램을 직접 실행해보고 싶으시다면 위에서부터 차례대로 실행하시면 되겠습니다.

 

 

코랩 링크: https://colab.research.google.com/drive/1rUBDEIJOlB2Im8LGpzrQ4X71LUduvduE?usp=sharing

 

collecting stock data(배포용).ipynb

Colaboratory notebook

colab.research.google.com