본문 바로가기
TIL

내배캠 TIL 47일차

by ColorConeHead 2024. 3. 8.
반응형

실전 프로젝트 관련

1. CSV 파일 만들기


대시보드 제작을 위한 컬럼을 추가한 기본 csv와

같이 사면 좋은 종목 추천을 위한 csv를 제작하였다.

종목 추천을 위해서
이전에는 국내 주식 1000개를 돌렸었는데,
1000개를 대상으로 추천을 위해 공분산을 산출하는 것은
경우의 수가 너무 많아지기도 하고

기존에 가지고 있는 주식을
해외주식으로 가정하고 만드는 것이기 때문에
해외주식으로 하는 것이 통일성이 더 있어보여서
해외주식으로 하는 것으로 노선을 변경하였다.

또한 지금은 이 모델의 성능을 극한으로 끌어올린다든지
추천을 위해 수집한 데이터의 수가 방대해야 하는 것이
중요한 프로젝트는 아니라고 생각되기에
추천을 위한 해외 주식의 수를
데이터를 수집하는 날 기준으로 상위 100개를 수집하였다.

크롤링 코드부터해서 굉장히 지저분하다 그냥 보세요
중간에 함수를 작성하여 애플, 아마존, 마이크로소프트의 상호명을
바꾸는 구간이 있는데 이는 다른 csv 파일(테이블)과
프라이머리키와 포린키를 만들기 위해 같은 양식으로 바꿔준 것이다.
tickers = []
names = []
stocks = {}

for i in range(1, 101, 20):
    driver = webdriver.Chrome()
    driver.get(f'https://finviz.com/screener.ashx?v=111&o=-marketcap&r={i}')
    time.sleep(3)   
    
    
    body = driver.find_element(By.XPATH, f'//*[@id="screener-table"]/td/table/tbody/tr/td/table/tbody')
    core = body.text.split('\n')

    for j in range(0, 20):
        tickers.append(core[j*11 + 1])
        names.append(core[j*11 + 2])
        

for i, ticker in enumerate(tickers):
    stocks[ticker] = names[i]
    
start = '2021-01-01'
today = datetime.today().strftime('%Y-%m-%d')

df3 = pd.DataFrame()

for ticker in tickers:
    temp = yf.download(ticker, start=start, end=today)
    temp['Name'] = np.array([stocks[ticker] for _ in range(len(temp))]).reshape(len(temp), -1)
    temp = temp[['Name', 'Close']]
    
    df3 = pd.concat([df3, temp], axis=0)

df3 = df3.reset_index()

heads = []
tails = []
covs = []

text = ''

for head in tqdm(['MSFT', 'AAPL', 'AMZN']):
    for tail in tqdm(tickers):
        time.sleep(0.25)
        text = text + tail
        
        a = df3[df3['Name'] == stocks[head]]
        b = df3[df3['Name'] == stocks[tail]]
        
        c = pd.merge(a, b, how='inner', on='Date')

        x = c['Close_x']
        y = c['Close_y']
        
        cov = np.cov(x, y)[0, 1]
        
        heads.append(stocks[head])
        tails.append(stocks[tail])
        covs.append(cov)

df4 = pd.DataFrame()

df4.index = [i for i in range(len(tails))]

df4['Name'] = np.array(heads).reshape(len(heads), -1)
df4['Recommend'] = np.array(tails).reshape(len(tails), -1)
df4['Cov'] = np.array(covs).reshape(len(covs), -1)

def shift_com_name(x):
    if x == 'Microsoft Corporation':
        return 'Microsoft'
    elif x == 'Apple Inc':
        return 'Apple'
    elif x == 'Amazon.com Inc.':
        return 'Amazon'
    else:
        return x

df4['Name'] = df4['Name'].apply(shift_com_name)
df4['Recommend'] = df4['Recommend'].apply(shift_com_name)

df4.to_csv('recommendation.csv')

 

 

2. 빅쿼리 연동


어느 정도 대시보드에 진척이 있다보니
팀원들의 관심사는 파이프라인 구축 중에서도 자동화였다.

자동화를 위해 할 수 있는 선택지는 2가지였다.

1) tabpy
2) 빅쿼리 연동

tabpy의 경우에는 태블로 데스크톱 환경에서만 가능한 것 같았고
조금 더 펜시한 전처리를 위함이고 데이터 적재와는 다소 거리가 있다는
튜터님의 피드백이 있었다.

고로 아래는 윈도우 환경 기준으로 빅쿼리 연동을 위한 과정을 기술했다.

 

 

1) Google Cloud SDK 설치하기

Google Cloud SDK란 Google Cloud 제품 및 서비스와 상호작용하기 위한 도구 및 라이브러리이다.

설치 시 "Bundled Python"을 체크해제 하고 설치해준다.

 

2) Google Cloud SDK 기본 설정하기

설치됐다면 Shell 창을 열어서 아래 명령어를 통해
내 구글 계정에 로그인 및 연동을 해준다.

초기화 - gcloud init
로그인 - gcloud auth login

 

3) 빅쿼리에서 파일 업로드할 경로 가져오기

빅쿼리에서 프로젝트 대시보드에 가면 내 프로젝트 이름과 ID, 등등을 확인할 수 있다

빅쿼리에 파일을 업로드 할 시에는 반드시

프로젝트ID - 데이터셋명 - 테이블명 의 경로를 지정해줘야 한다.

이중 데이터셋과 테이블명은 없을 시
파이썬에서 업로드할 때 지정해줄 수 있으니
프로젝트 ID를 무조건 알아와야 한다

 

4) 파이썬에서 업로드하기

필요한 모듈을 불러온다
없으면 pip install을 이용해 설치해준다

여기서 중요한 점은 업로드할 csv 파일의 컬럼명이
영문이여야 한다는 것이다.
영문이 아닐 수 cell에 있는 값들이 null로 업로드 된다.
# 모듈 불러오기
from google.cloud import bigquery

# 경로에 사용할 변수 선언
project_id = '여기에 개인 프로젝트 id를 적으세요'
dataset_id = '여기에 새롭게 만들 데이터셋 이름을 적으세요'
table_name_1 = '테이블이름1'
table_name_2 = '테이블이름2'

# csv파일 pandas로 불러오기
df_prediction = pd.read_csv('prediction.csv')
df_prediction['Date'] = pd.to_datetime(df_prediction['Date'])

df_recommendation = pd.read_csv('recommendation.csv')


# client 객체 생성(일종의 로그인인듯)
client = bigquery.Client(project=project_id)

# 경로 생성
table_ref_1 = f'{project_id}.{dataset_id}.{table_name_1}'
table_ref_2 = f'{project_id}.{dataset_id}.{table_name_2}'

# 업로드
df_prediction.to_gbq(destination_table=table_ref_1, project_id=project_id, if_exists='replace')
df_recommendation.to_gbq(destination_table=table_ref_2, project_id=project_id, if_exists='replace')
반응형

'TIL' 카테고리의 다른 글

내배캠 TIL 49일차  (0) 2024.03.26
내배캠 TIL 48일차  (0) 2024.03.19
내배캠 TIL 46일차  (0) 2024.03.05
내배캠 TIL 45일차  (0) 2024.03.04
내배캠 TIL 44일차  (1) 2024.02.29