코딩 개발일지/파이썬 데이터분석(스파르타 코딩클럽)

<스파르타 코딩클럽 파이썬 데이터분석 2주차>

찐쥬 2023. 3. 3. 15:11

<파이썬 데이터분석 2주차 개발일지>

 

 

엉엉,, 성격상 완전히 아무것도 모르는 상태로 훅훅 넘어가는걸 못하는 나는..

yahoo finance 에 info가 안먹어서 강의를 더 보지 않고 기다리고 있었는데,

(사실 2주차 개발일지도 써야해서 미룬것도 있음>_<,,)

 

 

업데이트까지 약 3주 정도의 시간이 소요될 것 같다는.. 스파르타 직원분의 답변에..

미뤘던,, 2주차 복습&개발일지 작성을 끝내고 강의 시청이라도 하려고,,

꾸역꾸역 개발일지 작성을 시작해 보는 것으로.. 엉엉,,

청천벽력같은 답변이지만 스파르타 코딩클럽은 댓글을 아주 친절하게 잘 달아주신다!

 

이러나 저러나!

2주차는 pandas 기초, 엑셀활용, 해외주식다루기(yfinance) 를 배운다고 한다!

 

이 전 오프라인 수업에서 배웠던 게 있으니,

아주 조금은 눈에 익숙할 것이라고 예상함!

 

 

파이썬 데이터분석을 위해 pandas와 numpy 라이브러리 설치가 필요하다!

! pip install pandas numpy  두 가지 한번에 설치 후 import 해주기.

import pandas as pd

import numpy as np

 

 

 

pandas

 

pandas는 기본적으로 DataFrame을 활용 하는데,

DataFrame은 엑셀처럼 표 형식으로 데이터를 깔끔하게 볼 수 있도록 만들어 주는 거라고 생각하면 된다.

(대게 리스트 안에 딕셔너리가 들어간 데이터를 다룸!)

 

 

데이터 프레임을 만들고 싶다면,

아래와 같이 나열된 데이터를

                                                                     data = {
                                                                              'name' : ['영수','철수','영희','소희'],
                                                                               'age' : [20,15,38,8]
                                                                        }

pandas의 DataFrame으로 씌워 변수를 만들어주면

                                                                             df = pd.DataFrame(data)

 

이렇게 엑셀처럼 데이터가 표로 만들어졌음을 확인!

 

 

name은 세종 age는 23인 a변수 데이터를 추가로 넣고 싶다면,

a = { 'name' : '세종, 'age' : 23}

 

df.append(a, ignore_index=True)

를 코딩하여 확인차 실행해서 데이터 프레임을 체크하고,

df = df.append(a, ignore_index=True)

df 변수에 데이터를 쏘옥 넣어주면 된다

 

*여기서 ignore_index=True 란, 인덱스를 따로 넣지 않고 기존 데이터 프레임과 같이

0 1 2 3 4 순서대로 붙겠다 라는 의미라고함!

 

 

 

아예 새로운 column을 추가하고 싶다면,

df['city'] = ['서울', '부산', '서울', '부산', '부산'] 입력하면 됨

변수명['컬럼명'] = [데이터]

 

 

데이터 프레임에서 특정 column만 확인하고 싶다면,

df[['name', 'city']] 대괄호 2번! 감싸야 함

 

 

특정 조건에 부합하는 데이터를 확인하고 싶다면,

cond = df['age' <20  <- 조건을 담은 변수를 만들어주고

df[cond]  <- 데이터변수에 조건 변수를 달아주면 됨!

단, 이렇게 조건이 짧을 때는 df [df ['age'] <20] 이렇게 바로 써줘도 된다는 점.

 

 

 

데이터 특정 구역을 인덱스로 지정해서 확안히고 싶다면,

df.iloc[-1]   <- 마지막 줄 확인하고 싶을때

df.iloc[-1,0]  <- 마지막 줄의 0번째 정보 확인시(행, 열 순서대로)

 

데이터를 정렬하고 싶을 때

df.sort_values(by='age', ascending=False)

buy = '정렬기준', ascending = False(내림차순), True(오름차순)

 

 

 

조건에 맞는 열을 추가하고 싶을 때

df['is_adult'] = np.where(df['age'] < 20, '청소년', '성인')

df['새컬럼명'] = np.where(조건, 맞다면, 아니라면)

 

 

df['age'].mean()  df['age'].max()  df['age'].min()  df['age'].describe()  df['age'].count()

 

여기까지는 기초적인 pandas, numpy 활용법!

 

 

 

코랩에 종목데이터 엑셀파일을 불러온 뒤,

df = pd.read_excel('종목데이터.xlsx')

를 입력하면 데이터프레임 형식으로 읽을 수 있다

엑셀 읽어오기

 

 

df.head() <- 제일 위에 5개만 보는 법

 

df.tail() <- 제일 끝에 5개만 보는 법

 

특정 갯수만큼 보고 싶다면 소괄호 안에 숫자 입력하면 됨 .head(10)

 

 

 

소수점 둘째자리까지만 보려면

pd.options.display.float_format = '{:.2f}'.format

이 코드를 입력하고 실행해주면 됨(판다스에서 보여줄 때 둘째자리까지만 보여줘라)

 

 

 

컬럼을 없애려면

del df['date']

 

 

 


 

이 강의는 주로 주식에 관한 데이터 분석을 하기 때문에,

 

주식의 기본적인 용어를 알고 가는게 좋다!

 

 

PER : 기업의 주가를 주당순이익(EPS)로 나눈 지표, 주가 대비 기업의 수익성을 나타냄

PBR : 기업의 주가를 주당순자산가지로 나눈 지표, 기업의 자산 대비 주가가 어느 정도인지를 나타냄

ROE : 기업의 이익을 주주에 대한 자본금으로 나눈 지표, 기업이 투자한 자본금에 대한 수익성을 나타냄

 

 

다시 한 번, 각 조건에 맞게 condition을 만들고,

df= df[cond] 를 코딩해서 실행하면 df가 바뀌는 걸 따라해 보면서

나에게 필요한 정보만을 추출해서 데이터를 분석 할 수 있는 방법을 배웠다.

 

 

 

그리고 이제 yahoo finance를 이용해서 해외주식 데이터를 다루는 법을 익힌다고 한다!

(대망의 오류부분 시작 ㅠ)

 

 

일단 라이브러리를 깔아주고, import 해주기

! pip install yfinance

 

(설치 완료 후 하단에 restart runtime 을 한 번 클릭해줘야함)

import yfinance as yf

 

 

 

 

company = yf.Ticker('TSLA')

company 를 실행하여 해당 종목이 잘 불러와졌는지 확인한다.

 

company.info 를 실행하면, 종목에 대한 여러가지 정보들을 확인할 수 있음!

잘 실행이 되면 이렇게 나온다고함,,(난 안나옴 ㅠ)

 

 

 

해외 주식 사이트라, 종목명이 다르게 쓰여져 있을 수가 있으니,

아래와 같이 변수를 별도로 지정해주는게 좋다고 한다.

그래서 info를 열어 내가 필요한 정보가 무엇인지 체크해보는 게 좋음!

 

 

info 말고도 재무제표를 확인할 수 있는 다른 방법들도 있다

company.balance_sheet 대차대조표

company.cashflow 현금흐름표

company.earings 기업 실적(매출, 이익)

대차대조표 확인

 

 

balance_sheet에서 특정 항목만 가져오고 싶다면,

company.balance_sheet.loc['Cash'] <-하지만 이렇게 입려하면 그 값만 가져오기 때문에

 

company.balance_sheet.loc[['Cash']]<- 이렇게 대괄호를 두 번 감싸줘서 보기좋게 확인하자!

(오프라인 강의 들었을 때 iloc 과 loc의 차이점을 알았었는데, 기억이.. 가물가물..

정리한 파일 보면 알 수 있을텐데 이래서 활용하지 않으면 배워봐야 무소용!!!

인덱스가 숫자로 써져 있으면 iloc, 문자로 써져 있으면 loc 이었던 느낌,,?)

 

 

 

그 외로

company.institutional_hodlers 주주정보

company.recommendations  애널리스트 추천

등등 여러가지 정보가 많이 있으니,

 

 

전체 사용법을 알고 싶다면 하단 링크 클릭!

https://pypi.org/project/yfinance/ 

 

yfinance

Download market data from Yahoo! Finance API

pypi.org

 

 


본격적으로 분석하기 시작!

 

전략세우기(내가 어떤 정보가 필요한지) -> 데이터모으기 -> 모아진 데이터 분석

 

종목코드 ⇒ code

회사명 ⇒ company.info[’shortName’]

산업 ⇒ company.info[’industry’]

설명 ⇒ company.info[’longBusinessSummary’]

시가총액 ⇒ company.fast_info[’market_cap’]

현재 주가 ⇒ company.fast_info[’last_price’]

1년 후 예상 주가 ⇒ company.info[’targetMeanPrice’]

PER ⇒ company.info[’trailingPE’]

EPS ⇒ company.info[’trailingEps’]

PBR ⇒ company.info[’priceToBook’]

매출 (3년치) ⇒ company.earnings ⇒ 3년 치 가져오기

순이익 (3년치) ⇒ company.earnings ⇒ 3년 치 가져오기

뉴스 ⇒ company.news ⇒ 최근 뉴스 1개 가져오기

 

↑ 요런식으로?ㅎ(복붙)

 

 

상기와 같이 정리한 데이터들을 이제 표로 만들어서 정리한다!

 

 

우선, 빈 데이터 프레임을 만들고 df = pd.DataFrame()

그 안에 df.append(변수명, ignore_index=True) 해서 정보를 추가하면 된다.

 

 

종목명만 바꿔 넣으면, 위에 정리한 데이터가 자동으로 추가되서 표로 만들어지게 하고싶다면?

같은 동작을 하는 함수!

함수로 만들어 주면 된다.

 

def add_company(code): #함수를 만들어서 파라미터 값으로 code를 받고

  company = yf.Ticker(code) #Ticker 해서 코드를 불러오고,

  name = company.info['shortName'] #모은 정보들 변수로 넣어주기
  industry = company.info['industry']
  bussiness = company.info['longBusinessSummary']
  marketCap= company.info['marketCap']
  currentPrice= company.info['currentPrice']
  targetPrice= company.info['targetMeanPrice']

  per = company.info['forwardPE']
  eps = company.info['forwardEps']
  pbr = company.info['priceToBook']

  rev2021 = company.earnings.iloc[-1,0]. #매출
  rev2020 = company.earnings.iloc[-2,0]
  rev2019 = company.earnings.iloc[-3,0]

  ear2021 = company.earnings.iloc[-1,1] #순이익
  ear2020 = company.earnings.iloc[-2,1]
  ear2019 = company.earnings.iloc[-3,1]

  doc = {   #위의 정보들을 변수로 지정하고, append하기 위해 딕셔너리 형태로 doc를  만든다
    'code':code,
    'name':name,
    'industry':industry,
    'bussiness':bussiness,
    'marketCap':marketCap/1000,
    'currentPrice':currentPrice,
    'targetPrice':targetPrice,
    'per':per,
    'eps':eps,
    'pbr':pbr,
    'rev2021':rev2021/1000,
    'rev2020':rev2020/1000,
    'rev2019':rev2019/1000,
    'ear2021':ear2021/1000,
    'ear2020':ear2020/1000,
    'ear2019':ear2019/1000,
  }

  return doc  #최종적으로 함수를 실행했을때, doc 값이 나오도록!

df = pd.DataFrame() #새로 만든 빈 데이터 프레임

row = add_comapny('TSLA')  # 행이라는 새로운 변수를 만들고, 함수를 넣어줌
df.append(row.ignore_index_Ture) # 빈데이터 프레임에 row 값을 추가하면 됨

테슬라의 정보가 행으로 잘 쌓아진 것을 확인할 수 있음

 

 

 

이제 저 위의 함수에 여러 종목명을 순차적으로 넣어

여러 회사들의 정보를 데이터프레임에 쌓아주면된다.

그렇다! 반복문 사용!

 

 

codes = ['AAPL','ABNB','BIDU','FB','GOOG','MSFT','TSLA','PYPL','NFLX','NVDA']

확인하고 싶은 회사들을 리스트로 모아놓고, for문으로 돌리면 됨

 

df = pd.DataFrame()  #새로 만든 빈 데이터 프레임

codes = ['AAPL','ABNB','BIDU','FB','GOOG','MSFT','TSLA','PYPL','NFLX','NVDA'] #회사리스트


for code in codes:  #for문으로 위에 만들었던 코드를 감싸줌
    print(code)  #어디까지 코드가 돌았는지 알아보기 위해 넣음
    row = add_comapny(code) # 'TSLA'가 아닌 반복문 돌려 나온 code를 넣어줌
    df = df.append(row.ignore_index_Ture) #df에 계속 쌓아넣기 위해 앞에 df= 를 추가함

df #df 확인해보기

 

그러다 잠깐!!

df를 실행해서 반복문을 돌리다가 에러가 뜨는걸 확인할 수 있다.

 

 

ABNB 에 per 값이 없는 걸 야후 파이낸스에서 확인이 가능하고, 값이 없기 때문에 에러가 발생.

 

 

 

이렇게 에러가 나는 경우를 대비해 코드를 이렇게 수정한다

df = pd.DataFrame()                          

codes = ['AAPL','ABNB','BIDU','FB','GOOG','MSFT','TSLA','PYPL','NFLX','NVDA'] 

for code in codes:    
    print(code)               
    try :  # 얘네를 실행을 하다가 오류가 나면 멈추지말고
         row = add_comapny(code)    
         df = df.append(row.ignore_index_Ture)  
    except : #except 에 있는 구문을 실행한 다음에 넘어가라
        print(f'error - {company}') #error- 회사명 을 프린트하고 넘어가라(어디에서 에러가 났는지 확인하기 위해)

df 

이렇게 에러가 나도 넘어가는 걸 확인할 수 있다!

 

 

 

이 부분은 파이썬 강의 들었을 때도 몰랐던 내용이라, 듣고 신박했음!

특히나 남자친구가 부동산 매매 관련 자료를 홈페이지로 직접 코딩해서 만들고 있기 때문에

강의를 보자마자 캡쳐해서 남자친구한테 알려줬다ㅋ_ㅋ!

(근데 이미 안다고했음 ㅇ~ㅅㄱ;)

 

 

df가 모두 깔끔하게 표로 정리된 것을 확인하면,

아래처럼 내가 원하는 정보만 추출해서 데이터를 분석할 수 있다.

 

 

cond = df['per'] > 30            <- per가 30 이하인 cond 만들기

df[cond]                         <- df에 cond 넣어 확인하기

df[cond].sort_values(by='per',ascending=False)    <-  per 오름차순으로 정렬하기

 

 

표에서 몇 가지 컬럼만 추출해서 보고싶다면, 새로운 df 를 만들어 주면됨

new_df = df[['name', 'currentprice', 'targetprice']]        <- 대괄호 두개로 만들기

 

 

 

현재 가격과 1년 후 가격의 비율차이가 큰 종목들을 추려내고 싶다면,

새로운 컬럼(gap)을 만들고 연산한 값을 넣어주면 됨

new_df['gap'] = new_df['targetprice'] / new_df['currentprice'] - 1

 

다시 잠깐! 실행값에 저런 문구가 뜬다면!

 

 

기존의 df를 사용해서 new_df를 만들고 있었는데,

저 상태에서 컬럼을 추가하고 연산하고 하면 기존의 df 원본값에 영향이 간다고 함.

 

 

그래서 .copy() 를 추가하여 원본에 영향이 안가게끔 해줘야함

new_df = df[['name', 'currentprice', 'targetprice']] .copy() 

.copy() 를 붙여 다시 실행하면, 문구가 뜨지 않고 값이 잘 나오는걸 확인할 수 있다.

 

 

 

마무리하고 숙제까지 제출하면 완료!

(숙제는 코드 복붙함ㅋ)

 

오류때문에 진행이 늦어졌던 파이썬 데이터 분석..

3주차 강의 들으러! 화이팅!