파이썬 스크래핑 및 분석하기 공부 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
# See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
# 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
'개발일지' 카테고리의 다른 글
웹프로그래밍 - 파이썬 API다루기, 크롤링, DB처리 3주차 정리 (0) | 2022.12.19 |
---|---|
파이썬 데이터분석 3주차 정리 (OpenDart의 API다루기) (0) | 2022.12.18 |
웹프로그래밍 - jQuer, Ajax 기초 2주차 정리 (0) | 2022.12.17 |
웹프로그래밍 - HTML/CSS/자바스크립트 기초 1주차 정리 (0) | 2022.12.15 |
파이썬 기초 1주차 정리 (0) | 2022.12.13 |