goodthings4me.tistory.com
판다스를 배우는 단계에서 시계열 데이터인 네이버 주식 현황을 크롤링한 코드로 matplotlib와 seaborn으로 그래프를 그리는 코드 연습을 해봤다.
네이버 주식 데이터 크롤링(파이썬)
네이버 주식에 대한 크롤링은 파이썬으로 간단하게 작성이 가능함. 삼성전자 코드로 예시 데이터를 추출했고, 다른 기업으로 변경할 때는 해당 기업의 코드만 변경하면 됨
import requests
import time
import pandas as pd
total_data = []
stock_code = '005930' # 삼성전자
for page in range(1, 11):
print(f'Page - #{page}')
url = f'https://m.stock.naver.com/api/stock/{stock_code}/price?pageSize=20&page={page}'
response = requests.get(url)
time.sleep(1)
if response.status_code == 200:
datas = response.json()
# print(datas)
if not datas:
break
for data in datas:
try:
date = data['localTradedAt']
price = data['closePrice']
total_data.append( [date, price] )
except:
pass
else:
print(f'Error code : {response.status_code}')
break
print(total_data)
위 코드로 추출할 때 for 문 내의 print() 결과이며, print(datas) 주석을 풀면 아래 이미지와 같이 출력됨
total_data의 추출 결과 리스트로 일자(localTradedAt)와 종가(closePrice)를 리스트로 추출함
Pandas로 추출하고, matplotlib, seaborn으로 그래프 그리기
위 코드에서 일부를 jupyter notebook에서 작성하고 실행하면 네이버 주식의 각 페이지의 데이터가 동일하게 추출되고,
dfs 리스트 변수에 판다스 데이터프레임으로 하나씩 저장됨
import requests
import time
import pandas as pd
dfs = []
stock_code = '005930' # 삼성전자
for page in range(1, 11):
print(f'Page - #{page}')
url = f'https://m.stock.naver.com/api/stock/{stock_code}/price?pageSize=20&page={page}'
response = requests.get(url)
time.sleep(1)
df = pd.DataFrame(response.json())
print(df)
dfs.append(df)
▶ 판다스 데이터프레임 리스트를 concat()을 통해 하나로 합치기
▶ pandas info() 결과
▶ 날짜 데이터 타입을 datetime으로 변환
data['localTradedAt'] = pd.to_datetime(data['localTradedAt']) # 날짜 타입 변환
data['closePrice'] = data['closePrice'].str.replace(',', '').astype(int)
n_data = data[['localTradedAt', 'closePrice']].set_index('localTradedAt')
- to_datetime() 함수로 날짜 컬럼을 datetime으로 변경
- closePrice 컬럼의 콤마를 제거(str.replace())하고 int 타입으로 변환
- 데이터프레임에서 날짜와 종가 컬럼만 추출
그래프 그리기
import matplotlib.pyplot as plt
import seaborn as sns
sns.lineplot(data=n_data, x='localTradedAt', y='closePrice')
▶ 주 단위로 그래프를 다시 그리기
# 주 단위로
w_data = n_data.resample('W-SUN').mean() # 주간 주기(Weekly frequency) 데이터화, 각 주의 시작은 일요일
sns.lineplot(data=w_data, x='localTradedAt', y='closePrice')
plt.xticks(rotation=45) # x축의 label을 45도로 회전시킴
'코딩 연습' 카테고리의 다른 글
동영상 음원추출 - 파이썬 moviepy 사용 (0) | 2024.11.07 |
---|---|
판다스 날짜 추출 - 연,월,일 분리 (0) | 2024.03.28 |
썸네일 이미지 만들기 용량 줄이기(with python) (0) | 2023.12.10 |
SQL 함수, 서브 쿼리 연습 (0) | 2023.12.08 |
DB, DBMS, 그리고 SQL 기본 문법 알아보기 (0) | 2023.12.08 |
댓글