개발공부 & 부트캠프/[부트캠프] 회고

[데이터 엔지니어링 부트캠프]9월 3주차 회고

포리셔 2023. 9. 23. 22:11

좋았던 점

  • 팀별 단합: 파이널 프로젝트 팀도 (잠정적이라고는 하지만) 꾸려졌겠다, 파이널 때 사용할 데이터와 분석 주제 같은 것을 정하게 되었습니다. 생각보다는 다들 적극적으로 나서 주었고, 같은 팀이 된 수강생들과는 예전부터 이런 주제를 해보고 싶다고 지속적으로 말을 맞춰 온 사이였기 때문에 실제로 프로젝트에 돌입하면 기술적으로 어려운 것 외에 의견 조율 등에 있어서는 비교적 수월할 수 있겠다는 생각이 듭니다.
  • 미니 프로젝트 - 주가 예측: 하둡 하이브를 이용한 미니 프로젝트로 주어진 주가 데이터로부터 최적의 주식 매수/매도 타이밍을 알아보는 실습을 할 예정입니다. 블로그에 따로 올린 적은 없지만, 부트캠프 시작 전 따로 독학할 때 모아둔 자료에 마침 주가 예측 코드가 좀 있어서 그걸 활용해도 괜찮을 거 같다는 생각이 듭니다. 아니 그보다 이 자료를 여기서 써먹게 되네...

아쉬웠던 점

  • 미니 프로젝트 주제의 부족한 짜임새: 하이브 데이터베이스에 업로드시킨 세 가지 테이블은 각각 주가 정보, 일일 주가, 기업별 재무 정보를 담고 있는 테이블이었습니다. 문제는 이것만 가지고는 실제 주식 시장의 특성을 반영한 분석이 조금은 어려울 수 있다는 점. 애초에 주식 시장 자체가 워낙 난해하고 변수도 많은 부분이라 미니 프로젝트에서는 이렇게 단순하게 굴려야 하는 게 맞기는 하겠다마는, 그걸 제시한 강사가 '나는 주식 모르니까 알아서 해라'라는 자세로 데이터만 던져주면 마찬가지로 그 내용을 모르는 수강생들 입장에서는 혼란만 가중되는 형국입니다. 차트 그리는 기법만 소개하면서 진행하기에는 애로사항이 많은 미니 프로젝트 아닌가 싶습니다.
  • 여전한 수업 자료의 부실함: 하이브 내용이 얼추 마무리 되고, 수업 커리큘럼 상 sqoop을 들어가야 하는 시점에, 여전히 해결되지 않은 Tez 설치 이슈 때문에 오전 반나절을 날려먹고, 오후 수업에 진행하려는 에어플로우 설치도 도커파일을 단순히 시간이 오래 걸린다는 이유로 중요한 명령어들을 죄다 생략하는 바람에 환경 구축만 하다가 수업은 진행되지 않았습니다. 심지어 그마저도 월요일날 새로 배포하는 도커파일로 다시 구축할 거라 하니 이건 도대체가....

배운 점

하이브 데이터 집계 및 고급 쿼리

  • 하이브 환경에서 GROUP BY 및 집계 함수(COUNT 등), HAVING 쿼리를 이용해 데이터를 집계 및 필터링했습니다.
  • 서브쿼리(Sub query): 한 문장의 SQL 쿼리 안에 또다른 SQL 쿼리가 부가적으로 쓰인 것을 말합니다. WHERE 절과 FROM 절 등에서 사용할 수 있으며, 아래와 같은 방식으로 쓸 수 있습니다. 첫 번째 예시는, WHERE 절에 사용된 서브쿼리, 두 번째 예시는 단독 실행 가능한 SQL 쿼리를 FROM 절에 묶어서 사용한 인라인 뷰(inline view)로 서브쿼리의 일종으로 볼 수 있습니다.
    select t1.stk_cd , t1.stk_nm
        , t1.sec_nm , t1.ex_cd
        ,t2.dt, t2.vol , t2.c_prc
    from stock t2
    inner join history_dt t2
    on (t2.stk_cd=t1.stk_cd)
    where t1.stk_nm = '삼성전자'
    and t2.dt = (select max(a.dt)
                      from history_dt a
                      where a.dt < '2019-04-01')
    order by t2.vol desc;
    select a.stk_cd
        , max(a.vol * a.c_prc) `거래금액`
        , max(a.stk_nm) , max(t1.sec_nm), max(t1.ex_cd)
    from (
          select t1.stk_cd , t1.stk_nm
                , t1.sec_nm , t1.ex_cd
                ,t2.dt, t2.vol , t2.c_prc
          from history_dt t2
          inner join stock t1 on (t1.stk_cd=t2.stk_cd)
          order by t2.vol desc
          limit 50 ) a
    group by a.stk_cd order by `거래금액` desc; 
  • 고급 쿼리: 상위 몇 개만 골라내는 Top-N을 구현하기 위해 LIMIT 절을 이용한 구현과 RANK 절 - 인라인 뷰 조합을 이용한 구현을 진행했습니다. 분석함수를 적용할 대상을 나누기 위한 PARTITION BY도 본 내용에서 다루었습니다.

    하이브 파이썬 연동

  • 하이브와의 연동을 위해서 pyhive라는 라이브러리를 설치해 연결했습니다. MySQL과 연동하는 pymysql과 사용법은 상당히 유사했습니다. 아래 예시 코드는 하이브에 업로드한 STOCK, HISTORY_DT, FINANCE_Y라는 세 테이블의 데이터를 불러오는 과정을 다뤘습니다. 이 과정을 거친 후, matplotlib와 seaborn 등의 시각화 라이브러리를 이용해 (미니 프로젝트에서도 사용한) 봉 차트(캔들 차트), 볼린저 밴드 등의 차트를 그리는 실습을 했습니다.
    import pandas as pd
    from pyhive import hive
    import re
    

하이브 연결

cursor = hive.connect('localhost').cursor()

sql = """
SELECT T1.STK_CD, T1.STK_NM, T1.SEC_NM, T1.EX_CD,
T2.DT, T2.O_PRC, T2.L_PRC, T2.H_PRC, T2.C_PRC, T2.VOL,
M5_PRC, M10_PRC, M20_PRC,
T3.FIN_ITM_VAL
FROM STOCK T1
INNER JOIN HISTORY_DT T2
ON (T2.STK_CD = T1.STK_CD)
INNER JOIN FINANCE_Y T3
ON (T2.STK_CD = T3.STK_CD)
WHERE T1.SEC_NM = '제약바이오'
AND T1.EX_CD = 'KP'
AND T2.DT = '2019-01-04'
AND T3.FIN_ITM_NM = '주당순이익'
AND T3.YY = '2018'
"""

cursor.execute(sql)
result = cursor.fetchall()
desc = cursor.description
column_name = list(zip(desc))[0]
column_name = [element.upper() for element in column_name]
column_name = [re.sub('\S
.', "", element) for element in column_name]

df = pd.DataFrame(result)
df.columns = column_name

df["DT"] = pd.to_datetime(df["DT"])
df.loc[:, "O_PRC":] = df.loc[:, "O_PRC":].astype("int64")
df.rename(columns={"FIN_ITM_VAL":"주당순이익"}, inplace=True)

df["PER"] = df["C_PRC"] / df["주당순이익"]

```

앞으로 바라는 점

  • 스터디를 조직은 했는데, 일단은 다음 주부터 추석 연휴가 끼어 있기 때문에, 실제 스터디는 연휴가 끝나는 바로 다다음 주부터 (그러니까 10월 초부터) 시작하기로 했습니다. 그동안 먼저 예습이라도 할 수 있도록 하기 위해 수업 자료를 만들려고 하는데, 그동안 독학해왔던 모든 문헌과 정보들을 한데 모은, 정보의 총집산이 될 것 같습니다. 이것만 해도 대작업일 텐데 일단 목표는 완성도 70% 수준까지 다듬어서 배포할까 합니다...!
  • 예전의 저 같았으면 완벽주의의 함정에 갇혀서 이런 일을 시작조차 못 했을 것 같습니다. 하지만, "프로만 초보들을 가르치는 것이 아니라, 초보가 왕초보를 가르칠 수도 있는" 정보화 시대에 내가 아는 것을 조금이라도 공유하려고 하는 마음에 서툴지만 시작해보려고 합니다. 마침 뜻이 같은 분들이 스터디 자료 준비도 함께 도와주시고 스터디 참여도 많이 해주셔서 참 감사할 따름인데, 그동안 공부가 부족했던 머신러닝/딥러닝 파트를 다루는 만큼 이번 스터디가 참여하시는 같은 반 수강생들에게 조금이나마 도움이 될 수 있도록 최선을 다 할 겁니다. 신청해주신 여러분의 알 수 없는 성원과 호응에 보답하겠읍니다