<파이썬 데이터분석 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주차 강의 들으러! 화이팅!

'코딩 개발일지 > 파이썬 데이터분석(스파르타 코딩클럽)' 카테고리의 다른 글
<스파르타 코딩클럽 파이썬 데이터분석 5주차> (0) | 2023.03.19 |
---|---|
<스파르타 코딩클럽 파이썬 데이터 분석 4주차> (2) | 2023.03.16 |
<스파르타 코딩클럽 파이썬 데이터분석 3주차> (0) | 2023.03.04 |
<스파르타 코딩클럽 파이썬 데이터분석 1주차> (0) | 2023.02.26 |