본문 바로가기
개발일지

파이썬 데이터분석 2주차 정리

by 디지털뚜이 2022. 12. 14.

파이썬 스크래핑 및 분석하기 공부 2주차 개발일지

데이터를 분석하고 수정하는 기본방법

!pip install pandas numpy #pandas 설치 (데이터표식화) #numpy 설치 (np.where사용)
import pandas as pd #pandas를 별칭 pd로 사용하겠다.
import numpy as np #numpy를 별칭 np로 사용하겠다.
data = { # 리스트+딕셔너리 조합형 변수
    'name':['철수','영희','동희','영수'], #쉼표(,) 넣기 조심
    'age':[15,12,20,35]
}

df = pd.DataFrame(data) # data변수값을 데이터표로 만들기 (pandas이용한 데이터표식화 기본문법)(()만 넣으면 빈 표)
doc = {
    'name':'명훈',
    'age':23
# 1행 추가할 데이터내용 변수

df = df.append(doc,ignore_index=True#df기존 변수에 1행추가
# ignore_index=True는 index를 따로 안넣고 마지막 4로 붙겠다는 뜻?

df['city'] = ['서울','부산','서울','광주','세종'#city라는 1열을 추가
df[['name','city']] #특정 열만 뽑아오기
 
cond = df['age'] < 20 #if조건문을 안쓰더라도 어떤 조건을 변수화해서 넣으면 해당 데이터만 출력
df[cond] #df[df['age']] < 20]로 바로 써도됨
df.iloc[-1,0#[-1]행[2]열값 ([0]열이 첫번째열이기 때문에 [-1]행은 위로넘어가서 마지막행)
 
df.sort_values(by='age',ascending=False#정렬하기 
#ascending은 내림차순여부 (True는 내림차순, False는 오름차순)

#특정값은 df.sort_values(by='age',ascending=False).iloc[0,1] 이런식으로 .iloc이용
 
df['is_adult'] = np.where(df['age'] < 20,'청소년','성인'#is_adult라는 1열을 추가
#조건에 맞는 값을 넣을때는 numpy를 쓴다
#np.where라고 쓰고 그 다음은 if문 쓸때 형식과 같다
#np.where : 각 열마다 조건에 맞는 값을 반환한다. (값을 지정안하면 index값으로 반환)

df
df['age'].describe() #해당 항목의 각종 정보표시
df[df['city'] == '서울'#어떤 열이 조건에 맞는 값 표시
df[df['city'] == '서울']['age'].mean() #어떤 열이 조건에 맞을때 특정 열만 표시(평균값표시)
# df[df['city'] == '서울']['age'].max() 와 같은 표현
df[df['city'] == '서울'].sort_values(by='age',ascending=False).iloc[0,1]
 
 
 

판다스로 엑셀파일 불러와서 편집

import pandas as pd
import numpy as np
 
#엑셀파일 불러오기 + 확인하기

df = pd.read_excel('종목데이터.xlsx'# pandas로 엑셀파일 불러오기

df.head() # 처음 5개만 보기 (기본5개)
df.tail(3# 끝 3개만 보기
#서식변경

pd.options.display.float_format = '{:.2f}'.format # 소수점 2째자리까지만 나오게하기
 
 
#필터 + 행 추가/삭제

cond = df['change_rate'] > 0 # 조건(컨디션)을 설정하여 변수화 #change_rate(변동률)이 0보다 큰것
df = df[cond] # df = df[df['change_rate']]와 같다
# 조건에 해당하는 배열변수 불러올때 []안에 항목조건이 아닌 df[]까지 넣은채로 조건작성

cond = df['per'] > 0
df = df[cond] # 변동률과 per가 0보다 큰 종목으로 새로 갱신 (per가 마이너스면 적자기업)

# per=시가총액(marketcap)/순이익(earning)=주가(close)/주당순이익(eps)
df['close'] = df['per'] * df['eps'#주가(close) 열이 없어 추가 # 없는 열 이름으로 변수값 넣으면 자동으로 열추가됨
df['earning'] = df['marketcap'] * df['per'#순이익(earning) 열 추가 

del df['date'#행 지우기

cond = (df['pbr'] < 1) & (df['marketcap'] > 1000000000000) & (df['per'] < 20#중복 조건
df = df[cond]

df
 
# 정렬

df.sort_values(by='marketcap',ascending=False#시총 정렬
 
df.describe() #열별 수치 분석

 

yahoo finance 라이브러리 기초

!pip install yfinance # 야후 파이낸스 라이브러리 설치
 
import pandas as bd
import numpy as np
import yfinance as yf #야후 파이낸스는 yf로 지칭
company = yf.Ticker('TSLA'# 테슬라 종목을 변수에 입력

company.info # 변수에 입력된 종목의 정보표시 (배열값) (이 라이브러리의 문법)
 
name = company.info['shortName'#테스트
industry = company.info['industry']
marketcap = company.info['marketCap']
revenue = company.info['totalRevenue']

print(name,industry,marketcap,revenue)
company.balance_sheet #대차대조표
 
company.balance_sheet.loc[['Cash']] #대차대조표의 현금부분만 보기 #[]만 하면 값만나오는데 [[]]하면 표로 이쁘게나옴
 
company.cashflow #현금유동성
 
company.earnings #수익 (매출,수익)
 
df = company.recommendations #증권사 추천정보
cond = df['Firm'] == 'JP Morgan' #필터 #여러 증권사 중 JP Morgan만 보기
df[cond]
news = company.news #뉴스정보
news[0]['title'#첫번째 뉴스의 제목

 

yahoo finance 분석하기

!pip install pandas numpy
 
!pip install yfinance
 
import pandas as pd
import numpy as np
import yfinance as yf
pd.options.display.float_format = '{:.2f}'.format #소수점2째자리까지 (pandas문법)
# 데이터 추가하기 복습

df_test = pd.DataFrame() # 빈 데이터 표 만들어놓기

doc_test = { # 추가할 데이터 1행 값 
  'name':'bob',
  'age':26,
}
df_test.append(doc_test,ignore_index=True# 데이터 1행 추가하기
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'# 1년후 예상주가

  per = company.info['trailingPE'# PER
  eps = company.info['trailingEps'# EPS(주당순이익)
  pbr = company.info['priceToBook'# PBR

  rev2021 = company.earnings.iloc[-1,0# 2021년 매출
  rev2020 = company.earnings.iloc[-2,0# 2020년 매출
  rev2019 = company.earnings.iloc[-3,0# 2019년 매출

  ear2021 = company.earnings.iloc[-1,1# 2021년 수익
  ear2020 = company.earnings.iloc[-2,1# 2020년 수익
  ear2019 = company.earnings.iloc[-3,1# 2019년 수익

  doc = { # 추가할 데이터 1행 값 형식 만들기 
    'code':code,
    'name':name,
    'industry':industry,
    'marketCap':marketcap/1000,
    'summary':summary,
    '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
df = pd.DataFrame()
row = add_company('TSLA'# 추가할 1행값을 row변수로 지정

df = df.append(row,ignore_index=True# 1행 추가

df
 
 
# 여러 행을 추가하기 방법

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

for code in codes:
  print(code) # 반복과정을 print해서 나타내기
  try# 에러없이 정상일때 설정
    row = add_company(code)
    df = df.append(row, ignore_index = True)
  except#항목값이 부족하는 등 에러가 날때 설정
    print(f'error - {code}'# 에러났을때 error-종목명 으로 표시하게 만들기
    # 추가시 에러나면 반복멈추게되니 try, except 필수설정

df
#필터,정렬

cond = df['per'] < 30
df[cond].sort_values(by='eps',ascending=False).head(5)
 
 
# 현재가격 - 1년 후 가격의 비율 차이가 큰 종목들을 추려내기

new_df = df[['code','name','currentPrice','targetPrice']].copy() # 일부열만 뽑아서 새 변수
#.copy()를 안쓰면 new_df 값 변경시 df원본에 영향이 감 그래서 복사본을 새 변수로 넣는 개념



# <ipython-input-17-29bbdea26e80>:6: SettingWithCopyWarning: 
# A value is trying to be set on a copy of a slice from a DataFrame.
# Try using .loc[row_indexer,col_indexer] = value instead

#   new_df['gap'] = new_df['targetPrice'] / new_df['currentPrice'] -1 # gap 열 추가

# 이와 같은 에러가 뜨면 .copy() 넣어줘야함



new_df['gap'] = new_df['targetPrice'] / new_df['currentPrice'-1 # gap 열 추가
 
new_df.sort_values(by='gap',ascending=False)

 

 

# 3년 연속 순수익이 오른 기업을 표기하기

new_df2 = df[['code','name','ear2021','ear2020','ear2019']].copy() # 새 변수 설정

cond = (new_df2['ear2021'] > new_df2['ear2020']) & (new_df2['ear2020'] > new_df2['ear2019']) # 3년연속상승 조건

new_df2['is_target'] = np.where(cond,'O','X'#is_target열을 넣어 O,X로 표기하기
# np.where기능 : 조건에 따른 지정된 값으로 각 행마다 반환

new_df2[new_df2['is_target'] == 'O']

 

실습해보기

!pip install yfinance
 
import yfinance as yf
import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
 
company = yf.Ticker('GOOG')

df = company.balance_sheet.loc[['Cash']] # Cash 열만 추출
df = df.reset_index(drop=True# 행의 index가 본래 Cash인데 0으로 초기화 하는 방법

df.columns = ['2021','2020','2019','2018'# 컬럼명(열명) 전체를 변경
df['name'] = company.info['shortName'# name열을 미리 추가해주고

new_df = df[['name','2021','2020']].copy() # name열을 1번째로 배치
new_df['diff'] = new_df['2021'] - new_df['2020']

new_df