본문 바로가기

TIL 통합

03/06 TIL 실전프로젝트 ing

오늘 한 것

1. 예측 함수 보강

2. 빅쿼리 연동 함수 완성

 

 

 

느낀 것

'파이프라인 구축'이라는 이름부터가 뭔가 엄청나보여서 지레 살짝 걱정을 했었는데, 하고 보니 생각보다 별거 아니었음.

이제 내일 오전에 여기에다가 예측력 데이터도 생성해서 빅쿼리에 연동하는 코드를 추가로 작성하고,

오후에 대쉬보드 작성 들어가면 될 듯!

이번에도 조 합이 좋아서 모든 것이 순조롭다

(자세한 코드 설명은 내일)

 

!apt-get install google-cloud-sdk

import yfinance as yf
import pandas as pd
import pandas_gbq
import numpy as np
from prophet import Prophet
import matplotlib.pyplot as plt
from datetime import datetime
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
from pandas.tseries.offsets import BDay #주식 예측 시평일만 카운트 해주기 위함
from currency_converter import CurrencyConverter
from google.oauth2 import service_account
from google.cloud import bigquery

plt.style.use('fivethirtyeight')

# 최종 예측값 => 빅쿼리 연동

#주가 예측& 빅쿼리 연동 함수
def showmetheprophet(corp_name):
  current_datetime = datetime.now().strftime("%Y-%m-%d")
  start_year = datetime.now().year - 10          # 현재 년도 기준 몇년 전까지를 할 것인지 : 5년으로 하면 예측력 자체는 올라가지만, 오차범위가 너무 넓어지지 않나..
  start_datetime = datetime.now().replace(year=start_year)
  start_date_str = start_datetime.strftime("%Y-%m-%d")
  corp = yf.download(corp_name, start=start_date_str, end=current_datetime) #입력 날짜 기준으로 주식 데이터 다운로드
  corp['Name'] = str(corp_name)
  corp.columns = ['Open','High','Low','Close','Adj_Close','Volume','Name'] ## Adj_Close값 잘 연동 되도록 열 이름 변경


  corp['ds'] = pd.to_datetime(corp.index, format = '%Y-%m-%d')         
  corp['y'] = corp['Adj_Close']           ##조정 마감가를 y에 할당 ++ Adj_Close로 수정// 위에서 열 이름 변경했음
  corp_train = corp[['ds', 'y']][:-251]
  
  #모델 적합
  model_prophet = Prophet(changepoint_prior_scale = 0.15, daily_seasonality = True)
  model_prophet.fit(corp)

  #향후 1년간의 time stamp 생성
  fcast_time_with_weekends = 365 #365일 예측
  corp_forecast = model_prophet.make_future_dataframe(periods=fcast_time_with_weekends, freq='D')

  # 주말을 제외한 날짜 범위 생성
  corp_forecast['exclude_weekend'] = corp_forecast['ds'] + BDay(0)
  corp_forecast = corp_forecast[corp_forecast['ds'].dt.weekday < 5]
  corp_forecast = model_prophet.predict(corp_forecast)
  model_prophet.plot(corp_forecast, xlabel = 'Date', ylabel= 'adj price($)')
  plt.show()


  #예측력 테스트
  corp_test = corp[-251:]

  future = corp_test[['ds']]  # 테스트 데이터의 날짜 칼럼을 그대로 사용하여 future 데이터프레임 생성
  forecast = model_prophet.predict(future)

  # 평가 : mae, mse, rmse
  y_pred = forecast['yhat'].values
  y_true = corp_test['y'].values
  mae = mean_absolute_error(y_true, y_pred)
  print('MAE: %.3f' % mae)
  mse = mean_squared_error(y_true, y_pred)
  print('MSE: %.3f' % mse)

  rmse = np.sqrt(mse)
  print('RMSE: %.3f' % rmse)

  plt.plot(y_true, label='Actual')
  plt.plot(y_pred, label='Predicted')
  plt.title('Predictability Test')
  plt.legend()
  plt.show()

  # yfinance 데이터와 예측값 데이터 통합
  corp_forecast = corp_forecast[['ds','yhat_lower', 'yhat_upper', 'yhat']]
  
  corp_pred = pd.merge(corp,corp_forecast, on=['ds'], how = 'inner')

  table_id = 'strange-terra-415002.practical_project.' + corp_name          #corp_name따라 테이블 만들기
  pandas_gbq.to_gbq(corp_pred, table_id, project_id='strange-terra-415002', if_exists='replace')
	#corp_pred.to_gbq(destination_table,project_id,if_exists='append')

  #예측 전체 테이블 : 확인용
  return corp_pred

 

 

 

 

 

'TIL 통합' 카테고리의 다른 글

03/12 TIL 실전 프로젝트 끗  (0) 2024.03.12
03/07 TIL 실전 프로젝트 ing  (1) 2024.03.07
03/05 TIL 실전프로젝트ing  (0) 2024.03.05
02/29 TIL 실전프로젝트 1일차  (0) 2024.02.29
2/28 수 TIL  (0) 2024.02.28