출연 : hadoop 3.2.2, hive 3.1.2, pyhive, sklearn(LinearRegression), Yahoo-Finance API
줄거리 : Yahoo-finance api를 이용하여 원하는 주식을 원하는 날짜로부터 조회하고 저장한다. 저장된 정보를 Hive를 통해 Hadoop시스템에 저장, 처리한다. 저장된 정보를 토대로 주식 차트를 그리고 sklearn의 LinearRegression함수를 이용해 주식 차트에 대한 추세선을 그리며 마무리된다.
코드 설명
1.
# Yahoo-finance로 주식 데이터 가져오기
import yfinance as yf
title = input("조회할 주식 코드 : ").lower()
year = input("조회 시작 년도(4자리) : ")
month = input('조회 시작 월 : ')
day = input('조회 시작 일 : ')
date = f'{year}-{month}-{day}'
full_title = f"{title}_{date.replace('-','0')}"
google_df = yf.download(title.upper(),start = date)
print(f'↓\n코드명 : {title}\n{date} 부터 조회 완료')

Yahoo-finance api(이하 yf)를 이용하여 주식데이터를 불러오기 위한 과정이다.
사용자에게 원하는 주식의 코드, 조회할 시작날짜의 년, 월, 일을 입력받고 입력받은 정보를 토대로 yf를 활용하여 정보를 가져온다.
추가적으로 date, full_title이라는 변수를 만들었는데 date는 yf로 검색할 때 날짜에 대한 서식을 맞추기 위함이다.
full_title은 후에 나오겠지만 주식 정보를 저장할 파일명, db 테이블명을 지정하기 위함이다.
2.
# 불러온 데이터 소수점 2자리로 수정
import pandas as pd
df = pd.DataFrame(google_df)
df[['Open','High','Low','Close','Adj Close','Volume']] = df[['Open','High','Low','Close','Adj Close','Volume']].round(2)
# .csv 파일 생성 (컬럼 명 제거)
with open(f'/home/hdoop/hive-3.1.2/bin/{full_title}.csv', 'w', encoding='utf8') as writer :
df.to_csv(writer, header = False)
print(f'↓\n경로 : /home/hdoop/hive-3.1.2/bin/ \n파일명 : {full_title}.csv 생성 완료')

1에서 불러온 주식 데이터를 판다스 데이터프레임(df)에 저장한다. 3번째 줄은 주식 정보중에 소수점으로 나타나는 부분이 있는데 소수점 자릿수를 2자리로 잘라서 저장하기 위함이다.
판다를 이용한 이유는 csv파일을 만들기 쉽기 때문이다. '.to_csv'를 통해 데이터프레임의 정보를 csv파일로 만들고 이때 header는 제거하였다(헤더 제거는 컬럼명을 저장하지 않고 필드만 저장하겠다는 의미).
3.
# hive 접속
from pyhive import hive
conn = hive.Connection(host = '127.0.0.1', port = 10000, username = 'hdoop')
cursor = conn.cursor()
print('↓\nHiveserver 접속 완료')

본격적으로 hive를 통해 데이터를 저장하기 전, 객체 생성 과정이다. hive를 활용하기 위해 파이썬 모듈인 pyhive를 이용하였다.
4.
# 데이터베이스 생성(없으면) 및 테이블 생성(없으면)
cursor.execute('create database if not exists stockDB')
cursor.execute(f'use stockDB')
sql = """create table if not exists `{}_stock` (
`Date` string,
`Open` float,
`High` float,
`Low` float,
`Close` float,
`Adj Close` float,
`Volume` int)
row format delimited
fields terminated by ','
lines terminated by '\n'
stored as textfile
tblproperties('no_auto_compaction'='true')
""".format(full_title)
cursor.execute(sql)
print(f'↓\nDatabase : stockDB\nTable : {full_title}_stock')

hive는 sql형태를 지니고 있다. 데이터를 테이블에 담는 형식으로 기본 문법등은 sql과 매우 흡사하다.
우선 stockdDB라는 데이터베이스가 없다면 새로 생성한다.
stockDB안에 테이블을 만드는데 위에서 만든 변수 full_title이 여기서부터 등장한다. full_title은 주식 코드명과 조회시작 날짜를 모두 담고있기 때문에 '이 테이블은 이러한 정보를 담고있다~'를 표현할 때 매우 용이하다.
테이블명은 full_title에 저장된 값으로 하고, 테이블 스키마는 주식 정보를 담을 수 있는 구조, (')는 열 구분자, (\n)는 행 구분자로지정한다. 이렇게 테이블을 만들고 선택된 db, 테이블명을 출력한다.
5.
# 로컬 영역의 파일을 위에서 테이블에 삽입
cursor.execute(f"load data local inpath '/home/hdoop/hive-3.1.2/bin/{full_title}.csv' overwrite into table {full_title}_stock")
print(f'↓\n{full_title}.csv → 테이블에 저장 완료')

주식 정보를 담고있는 csv파일도 있고, 정보를 저장할 테이블도 생성했다.
위는 csv파일의 내용을 테이블에 저장하는 과정이다.
load data local inpath를 이용해 로컬 영역의 파일을 지정하고 overwrite into table를 이용해 테이블에 저장한다.
이때 full_title이 다시 사용되었다.
6.
# 테이블 삽입 결과 확인
cursor.execute(f"select * from {full_title}_stock")
data = cursor.fetchall()
print('↓\n테이블 row : ',len(data))
print('<첫 10줄 조회>')
for i in range(10) :
print(data[i])

사용자가 원하는 주식 정보를 데이터베이스 테이블에 저장하는 과정은 모두 끝났다.
테이블에 저장이 잘 되었는지 확인하는 과정이다.
나는 구글 주식 데이터를 2011년도부터 가져왔기 때문에 데이터를 모두 출력하면 컴퓨터가 터질지도 모른다...10줄만 출력하자..
(2)편 to be continue...
'개인작품' 카테고리의 다른 글
주식데이터 저장 + 추세선 그리기(2) (0) | 2021.09.14 |
---|
댓글