오늘 한 것
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 |