[데이터분석]SpartaCodingClub

Python 둘째주_해외주식 분석

dowon 2023. 1. 16. 16:08

이번주도 난이도가 꽤 있었던 수업이었다

우선 깔아야 하는 패키지들부터!

!pip install pandas numpy
import pandas as pd
import numpy as  np
!pip install yfinance
import yfinance as yf

pandas, numpy, yfinance 패키지를 사용했다

data = {
    'name': ['철수', '영희' ,'동희', '영수'],
    'age': [15, 12, 20, 35]
}

df = pd.DataFrame(data)

데이터프레임을 만드는 방법

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

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

그리고 documents를 만드는 방법이다

df['city'] = ['서울', '부산', '서울', '부산', '부산']

df[['name', 'city']]

df[df['age'] < 20]

df.iloc[-1, 2]
df.iloc[-2]

만들어둔 df에 city를 추가한 후 age 조건에 따라 데이터를 분류하였다

정렬을 사용하여 마지막 행을 추출하거나 뒤에서 몇 번째 행을 출력하는 방법을 배웠다

df.sort_values(by = 'age', ascending = False).iloc[0,1]

나이에 따라 정렬한 후 값 추출하기

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

어른인지 판단하는 행을 추가하고 나이에 따라 청소년 / 성인 분류하는 법

df['age'].describe()

'나이'항목에 관한 대략적인 통계 자료들

갯수, 평균, 표준편차, 최소/25%/50%/75%/최댓값을 확인할 수 있다

df[df['city']=='서울']['age'].mean()
df[df['city']=='서울']['age'].max()

서울의 나이 최소/최댓값 확인

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

df_1.head()

종목 데이터 엑셀 파일을 불러오고 5개 열을 확인

종목데이터.xlsx
0.17MB

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

소숫점 2째 자리까지만 확인하고 싶을 때 사용하는 코드

cond = df_1['change_rate'] > 0
df_1[cond]

주식의 change rate > 0 : 가격이 어제 대비 상승한 종목만 추출하여 나타내기

df_1 = df_1[cond]

condd = df_1['per'] > 0
df_1 = df_1[condd]
df_1

주식의 per가 양수인 항목만 찾아서 나타내기

....애초에 per가 음수이면 매우 문제있는 회사가 아닐련지..ㅋㅋㅋ

df_1['close'] = df_1['per'] * df_1['eps']
df_1['earning'] = df_1['marketcap'] / df_1['per']

df_1

종가와 순수익 항목을 추가하기

del df_1['date']

df_1

데이터프레임에서 date 항목을 삭제하기

con_2 = (df_1['pbr'] < 1) & (df_1['marketcap'] > 1000000000000) & (df_1['per'] < 20)
df_1 = df_1[con_2]

여러 조건을 기술하여 해당 조건에 맞는 자료만 추출하기

df_1.sort_values(by = 'marketcap', ascending = False)

df_1.describe()

marketcap에 관해 내림차순으로 정렬한 후 평균/표준편차/사분위수 지표 확인하기

company = yf.Ticker('TSLA')

company.info

company에 야후 증권의 테슬라 항목을 집어넣기

테슬라에 관한 각종 지표들을 확인할 수 있다

name = company.info['shortName']
industry = company.info['industry']
marketcap = company.info['marketCap']
revenue = company.info['totalRevenue']

print(name, industry, marketcap, revenue)

테슬라의 이름, 산업, 이익, marketcap 확인하는 방법

company.cashflow
company.earnings
dff = company.recommendations

condition = dff['Firm'] == 'JP Morgan'
dff[condition]

news = company.news
news[0]['title']

JP 모건의 뉴스 타이틀을 확인하는 방법

def add_company(code):

  company = yf.Ticker(code)

  name = company.info['shortName']
  industry = company.info['industry']
  marketcap = company.info['marketCap']
  summary = company.info['longBusinessSummary']
  currentprice = company.info['currentPrice']
  targetprice = company.info['targetMeanPrice']

  per = company.info['trailingPE']
  eps = company.info['trailingEps']
  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 = {
      'name' : name,
      'industry' : industry,
      'marketcap' : marketcap,
      'summary' : summary,
      'currentprice' : currentprice,
      'targetprice' : targetprice,
      'per' : per,
      'eps' : eps,
      'pbr' : pbr,
      'rev2021' : rev2021,
      'rev2020' : rev2020,
      'rev2019' : rev2019,
      'ear2021' : ear2021,
      'ear2020' : ear2020,
      'ear2019' : ear2019

  }

  return doc

알고 싶은 회사의 이름을 검색하면 이름, 산업, marketcap, 요약본, 유동성, per, eps, pbr, 2019~2021에 해당하는 이익을 산출해주는 doc 함수 코드

df = pd.DataFrame()


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

for code in codes:
  print(code)
  try:
    row = add_company(code)
    df = df.append(row, ignore_index = True)
  except:
    print(f'error - {code}')

df

만든 함수에다 애플을 비롯하여 많은 기업들을 한번에 검색하기

이 때 주의해야 할 점은 모든 회사에 모든 정보가 담겨있진 않다

회사에 따라 제공되는 정보가 다르기 때문

그렇기 때문에 null인 값들을 error로 표시하는 작업이 추가로 필요하다

이 경우 사용되는 코드는 try ~ except 함수

df.sort_values(by = 'eps', ascending = False).head(5)

condd = df['per'] < 30
df[condd].sort_values(by = 'per', ascending = False)

new_df = df[['name', 'currentprice', 'targetprice']].copy()
new_df['gap'] = new_df['targetprice'] / new_df['currentprice'] - 1
new_df.sort_values(by = 'gap', ascending = False)

new_df2 = df[['name', 'ear2021', 'ear2020', 'ear2019']].copy()
cond2 = (new_df2['ear2021'] > new_df2['ear2020']) & (new_df2['ear2020'] > new_df2['ear2019'])
new_df2['is_target'] = np.where(cond2, 'o', 'x')
new_df2

마지막으로 

new_df2에 .copy()를 사용한 것은

new_df에 바로 조건을 사용하면 원래 데이터프래임의 변형이 발생하기 때문에 오류가 생긴다

따라서 copy를 사용하여 새로운 데이터브래임을 만들어 작업을 진행한다

cond2에 따른 조건이 만족되면 is_target항목에 o를, 아니면 x를 표시한다

company = yf.Ticker('TSLA')

df = pd.DataFrame()
df = company.balance_sheet.loc[['Cash And Cash Equivalents']]

df.columns = ['2021', '2020', '2019']
df['name'] = company.info['shortName']

new_df = df[['name', '2021', '2020']].copy()
new_df['diff'] = new_df['2021'] - new_df['2020']

new_df.reset_index(drop = True)

2주차 숙제였다

테슬라의 cash항목에서 diff 행을 만들어 표시하는 것이었다

 

이번주에 배운 내용은 빅데이터에서 원하는 정보만 추출하여 검색하는 경우에 유용하게 사용될 듯 하다

3주차도 열심히 들어야지

'[데이터분석]SpartaCodingClub' 카테고리의 다른 글

마지막주_백테스팅(2)  (0) 2023.02.03
넷째주_백테스팅  (0) 2023.01.31
Python 셋째주_DART 데이터 활용하기  (0) 2023.01.19
Python 첫째주_파이썬 기초  (0) 2023.01.04