SW
json 본문
In [310]:
from IPython.core.display import display, HTML
display(HTML("<style> .container{width:90% !important;}</style>"))
In [160]:
# 다음 증권 정보에서 -> 특정 업체의 주가를 다운로드
# pandas를 이용해 분석
In [161]:
# 1. 다음 증권 사이트에서 데이터 수집
In [162]:
import requests
In [163]:
import time
In [164]:
url = "http://finance.daum.net/api/quote/A005930/days"
In [280]:
data = get_stock_data("A005930", 1)
if data:
json_data = json.loads(req.text)
stock_data = pd.DataFrame(json_data['data'])
total_pages = int(json_data['totalPages'])
for page in range(2, total_pages + 1):
#다음 페이지 수집
#time.sleep(1)
data = get_stock_data("A005930", page)
json_data = json.loads(data)
stock_data = pd.concat([stock_data,pd.DataFrame(json_data['data'])]) #페이지 합쳐줌
stock_data
Out[280]:
In [282]:
stock_data.head()
# 시고저종 - 시가, 고가, 저가, 종가
Out[282]:
In [283]:
stock_data.info()
In [284]:
# 1. 전처리 - 날짜 데이터가 날짜 형태가 아니라서 -> 형변환
# 원하는 열을 형변환 한다.
# 원하는 열을 선택해서 형변환 한다.
#stock_date.date
stock_data["date"] = pd.to_datetime(stock_data["date"], format="%Y-%m-%d %H:%M:%S", errors="coerce")
In [286]:
stock_data["date"]
Out[286]:
In [171]:
# 2. 인덱스 설정
# * 판다스의 메서드들은 대부분 원본은 그대로 두고, 복사본을 준다.
# stock_data.set_index('date', inplace=True) # inplace -> 원본을 바꿔줌
# stock_data = stock_data.set_index('date')
# stock_data.index = stock_data['date']
In [287]:
stock_data.head()
Out[287]:
In [288]:
# 3. 정렬하기
stock_data = stock_data.sort_index()
In [289]:
stock_data.head()
Out[289]:
In [290]:
# 4. 이동평균 데이터 구하기
stock_data['tradePrice'].rolling(window=5).mean()
Out[290]:
In [291]:
# 5. 새로운 열을 만들어서 데이터 저장하기
stock_data['5일이평'] = stock_data['tradePrice'].rolling(window=5).mean()
In [292]:
# 5. 30일이평, 60일이평 계산해서 저장하기
stock_data['30일이평'] = stock_data['tradePrice'].rolling(window=30).mean()
stock_data['60일이평'] = stock_data['tradePrice'].rolling(window=60).mean()
In [293]:
stock_data
Out[293]:
In [295]:
# 6. 단 > 장 - 단 < 장
# 6. 단 < 장 - 단 > 장
In [294]:
stock_data['5일이평_prev'] = stock_data['5일이평'].shift(1)
In [296]:
stock_data['30일이평_prev'] = stock_data['30일이평'].shift(1)
stock_data['60일이평_prev'] = stock_data['60일이평'].shift(1)
In [297]:
stock_data['5일이평_prev'] < stock_data['30일이평_prev']
Out[297]:
In [298]:
# 열 데이터 비교하기
# 어제는 단기이평이 장기이평보다 낮고,
# 오늘은 단기이평이 장기이평보다 높다.
golden = (stock_data['5일이평_prev'] < stock_data['30일이평_prev']) & (stock_data['5일이평'] > stock_data['30일이평'])
dead = (stock_data['5일이평_prev'] > stock_data['30일이평_prev']) & (stock_data['5일이평'] < stock_data['30일이평'])
In [299]:
# 7. 원하는 조건에 맞는 행만 찾아보기
stock_data[golden == True]
Out[299]:
In [300]:
# 8. 처음으로 주가가 만원이 넘은날 찾기
stock_data[stock_data['tradePrice'] > 10000]
Out[300]:
In [301]:
stock_data['golden'] = golden
stock_data['dead'] = dead
In [302]:
import matplotlib.pyplot as plt
In [303]:
plt.rc('font', family = 'Times New Roman')
In [ ]:
plt.figure(dpi=120)
plt.plot(stock_data.index, stock_data['5일이평'], label="5일 이평")
plt.plot(stock_data.index, stock_data['30일이평'], label ="30일 이평")
plt.plot(stock_data.index, stock_data['60일이평'], label = "60일 이평")
# cross 발생 지점 표시하기
#plt.plot(stock_data.golden==True.index, stock_data['5일이평'][stock_data.golden==True],label="5일 이평")
# 데이터 범위
plt.xlim([10, 8000])
# 범례 표시
plt.legend(loc='best')
plt.xlabel("거래일")
plt.ylabel("증가")
plt.title("삼성전자 주가 그래프")
In [181]:
import numpy as np
In [182]:
np.nan # Not a Number -> 결측치
# 전처리 -> 결측치 처리
# 1. 결측치가 있는 데이터 (열, 행)
# 2. 특정 값으로 채운다.
# 2-1. 대표값으로 채운다 - 전체 데이터의 평균
# 2-2. 끌어다 채우기 -> 앞, 전 열(행)의 값을 끌어다 채우기
# 2-3. 유추값으로 채우기
np.inf #infinite
Out[182]:
In [183]:
def get_stock_data(code, page=1):
# 옵션 -> ?symbolCode=A005930&page=1&perPage=10&pagination=true
options = {
"symbolCode":"A005930",
"page":"1",
"perPage":"10",
"pagination":"true"
}
custom_headers = {
"referer":"http://finance.daum.net/quotes/A005930",
"user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
}
req = requests.get(url, headers=custom_headers, params=options)
if req.status_code == requests.codes.ok:
return req.text
else:
return False
In [184]:
req.text
Out[184]:
In [185]:
import json
json_data = json.loads(req.text)
In [186]:
json_data
Out[186]:
In [187]:
json_data['totalPages']
Out[187]:
In [188]:
json_data['currentPage']
Out[188]:
In [189]:
import pandas as pd
In [190]:
stock_data = pd.DataFrame(json_data['data'])
In [191]:
stock_data.head()
Out[191]:
In [192]:
stock_data.info()
In [193]:
# 바구니 객체 - 딕셔너리
# 사전형 객체 - 사전
# 키:값 - key:value
test_dict = {}
test_dict = dict()
test_dict = {
"a":"apple",
"b":"banana",
"o":"orange",
99:"hi",
"heello":"greeting"
}
In [194]:
test_dict["b"] = "test"
In [195]:
test_dict # dict는 순서가 없습니다.
Out[195]:
In [196]:
test_dict.update({"c":"carvena"})
In [197]:
test_dict
Out[197]:
In [198]:
test_dict["new"] = "new value"
In [199]:
test_dict
Out[199]:
In [200]:
# del - 메모리 해제
del(test_dict["c"])
In [201]:
test_dict
Out[201]:
In [202]:
len(test_dict)
Out[202]:
In [203]:
"new" in test_dict
Out[203]:
In [204]:
# key 값 출력
for item in test_dict:
print(item)
In [205]:
# value 값 출력 (자주 쓰이는 형태)
for key in test_dict:
print(test_dict[key])
In [206]:
test_dict.keys()
Out[206]:
In [207]:
test_dict.values()
Out[207]:
In [208]:
# 자주 쓰이는 형태
for key, value in test_dict.items():
print(key, value)
'대학교 > Data' 카테고리의 다른 글
matplotlib (0) | 2020.02.01 |
---|---|
Kaggle [Titanic Data Analysis] (0) | 2020.02.01 |
pandas (0) | 2020.01.30 |
openpyxl (0) | 2020.01.30 |
Beautifulsoup (0) | 2020.01.30 |
Comments