본문 바로가기

TIL 통합

03/07 TIL 실전 프로젝트 ing

오늘 한 것

1. 파이썬 빅쿼리 연동 보강

2. Prophet 예측력 보강 : 파라미터 조정

3. 태블로 - PPT 실시간 연동 알아보기 : 실패

4. 태블로 발제자료 시작

 

 

파이썬이랑 빅쿼리 연동 보강, 그러니까 중복값 제외하고 새로 데이터 보강하는 작업은 결국 아무리 해봐도 안 됐지만, 애초에 태블로가 빅쿼리에 있는 중복데이터를 필터링 해줘서 아예 실패도 아닌? 하지만 헛발질을 한 꼴이 되어버렸곸ㅋㅋ

태블로 대쉬보드를 PPT에 연동하는 것도 현재 Cloud 버전으로는 불가능하다는 것을 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 sendtogbq(corp_name):
  current_datetime = datetime.now().strftime("%Y-%m-%d")
  start_year = datetime.now().year - 5          # 현재 년도 기준 몇년 전까지를 할 것인지 : 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, seasonality_mode='multiplicative', n_changepoints=100, seasonality_prior_scale=0.05)
  #changepoint_prior_scale = 0.15, daily_seasonality = True, seasonality_mode='multiplicative', n_changepoints=100, seasonality_prior_scale=0.05 현재 사용중
  #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()


  client = bigquery.Client()


  # yfinance 데이터와 예측값 데이터 통합
  corp_forecast = corp_forecast[['ds','yhat_lower', 'yhat_upper', 'yhat']]

  corp_pred = pd.merge(corp,corp_forecast, on=['ds'], how = 'inner')
  corp_pred = corp_pred.sort_values(by='ds')

  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='append')

  #예측력 측정용 데이터 통합 및 빅쿼리 연동
  y_pred_df = pd.DataFrame(y_pred).rename(columns = {0 : "pred"})
  y_true_df = pd.DataFrame(y_true).rename(columns = {0 : "true"})
  combined_df = pd.concat([y_pred_df, y_true_df], axis=1)
  table_id_2 = 'strange-terra-415002.practical_project.' + corp_name + '_predictability'
  pandas_gbq.to_gbq(combined_df, table_id_2, project_id='strange-terra-415002', if_exists='append')


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

 

 

 

 

 

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

03/13 TIL  (0) 2024.03.13
03/12 TIL 실전 프로젝트 끗  (0) 2024.03.12
03/06 TIL 실전프로젝트 ing  (2) 2024.03.06
03/05 TIL 실전프로젝트ing  (0) 2024.03.05
02/29 TIL 실전프로젝트 1일차  (0) 2024.02.29