map, apply/ merger, concat, join / 리스트 컴프리헨션 / matplotlib API와 pandas API/ plotly / range slider/ 캔들차트/ OHLC / loc, iloc / 논리연산자, 비트연산자/ Unnamed0
221005
✅ 0206번 실습 파일
1. map과 apply
1.1 map
- 함수를 만들어서 일괄적으로 전처리, 세부 페이지 처리 등
- Series에서만 사용 가능
1.2 apply
- BMI 지수를 구하는 등에 사용
- Series와 DataFrame에서 모두 사용 가능
2. 병합하기
- numpy는 반복문을 사용하지 않고, 벡터 사용. 빠르다.
- 수집한 view_detail이란 내용을 tolist()를 통해 리스트로 변환 후 concat으로 병합
- 질문 : pd.concat(view_detail.tolist()) 했을 때, 인덱스 값이 1만 나오는 이유? ta02.index=ta01.index 해줘서
2.1 Merge, join, concatenate
문서 https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html
2.1.1 concat
- 위아래로 병합 : concat(axis = 0)
- 옆으로 병합할 때 : concat(axis = 1)
2.1.2 join
- join = "inner"과 같이 설정할 수 있다.
- SQL의 innerjoin, leftjoin, outerjoin이랑 같은 개념
- concat(join="inner") 인덱스값, 키값을 기준으로 연결해준다.
- join = inner 없는 값을 빼고서 공통적으로 있는 값만 가져온다.
- concat(ignore_index = True, sort = False)
- 조금 더 쉬운 문서 https://pandas.pydata.org/pandas-docs/stable/getting_started/intro_tutorials/08_combine_dataframes.html#min-tut-08-combine
- 인덱스 값은 다 다르지만, 연결해줄 key가 있다.
2.2 병합
- Q. 우리는 어떤 키 값을 사용해서 연결할 수 있을까? A. 내용번호
- 병합
- tolist() 리스트로 변환, concat으로 병합
- merge : df 데이터에 df_view 데이터를 붙여주는데, 내용번호와 생산일 컬럼을 기준으로 붙여준다.
- jupyter 노트북
- 경로 찾기 : %pwd
- Jupyter Extension 궁금하다면 03번 강의 파일에서 참고하기
- Table of Contents는 목차 기능- 도움말 : shift+tab+tab
✅ 0301번 실습파일
- FinanceDataReader : 주가 관련 정보를 불러오는 라이브러리
- concat(axis=1) : 한 종목을 불러오고(KB금융), 종목코드로 여러 종목의 종가를 따로 가져온다.
- 상위 10개 종목 목록 가져오기
- pd.read_html(url)[0].dropna() : 결측치 있어서 dropna()
- 종목명과 종목 코드만 가져오기 : df_top10에 종목번호가 없어서 합쳐주기 위해서
4. Merge
- inner join : 동시에 겹치는 것 / out join : 다 보고 싶을 때 / left join / right join
- df_10 = df_top10.merge(df_krx, left_on="종목별", right on ="Name", how="left")[["Name", "Symbol"]]
- df_top10이라는 데이터프레임에 df_krx라는 데이터프레임을 merge한다.
- 왼쪽 테이블의 "종목별"이라는 컬럼, 오른쪽 테이블의 "Name"이라는 컬럼을 "left"테이블 기준(df_top10)으로 merge한다.
- 표시할 컬럼은 "Name"과 "Symbol".
- Q. 오류 난 이유는? merge(df_krx) 하고 키값을 지정해주지 않았기 때문에.
- 인덱스라면 left_index, right_index로 합칠 수 있고, 한쪽은 컬럼이고 한쪽은 인덱스일때도 합칠 수 있다.
- how = "right" 하면 7872 row가 나온다. 상위 top10에서 가져온 것이 아니라 df_krx값을 가져오게 되니까
- 질문 : how의 디폴트는 inner -> 양쪽의 값이 같을 때 가져온다.
5. 여러 종목의 종가 수집
5.1 리스트 컴프리헨션
item_list = []
for sym in df_10["Symbol"]:
item_list.append(fdr.DataReader(sym, "2022")["Close"])
item_list=[]
item_list=[fdr.DataReader(sym, "2022")["Close"] for sym in df_10["Symbol"]]
5.2 합치기
- 행열 순이다 : 외우기! axis=0 은 행, axis=1은 컬럼
- axis = 0이 기본값. 아래로 길어지는 합침 - df_10["Name"] Name을 기준으로 합칠 것이기 때문에 df.columns에 담아준다.
5.3 시각화를 위한 폰트 설정
- koreanize-matplotlib
- 파이썬 문서 번역해주시기도 한 분
- 스타일 : 템플릿 같은 느낌. ggplot이나 fivethirtyeight이 한글이 깨지지 않고 비교적 잘 보인다.
- 스타일 확인 : print(plt.style.available)
- 폰트 설정을 덮어쓰기 안하기 때문에.
- 여러 종목 한번에 시각화
- 종목 항목이 겹쳐져서 안보이면 plt.legend(bbox_to_anchor=(1,1))로 오른쪽으로 따로 빼준다.
- 2축 그래프 사용하기
- secondary_y는 오른쪽에 생성해줌.
8. 수익률 비교
- 첫번째 날 가격으로 나머지를 나눠주고, -1을 해주면 수익률을 구할 수 있다.
- LG에너지솔루션은 첫번째날이 없어서 NaN으로 나온다.
- df / df.iloc[0] 첫째날 값이 1이 된다.
- (df / df.iloc[0]) -1 : -1하면 첫째날 0을 기준으로 수익률을 볼 수 있다.
- LG에너지솔루션은 어떻게?
- (df["LG에너지솔루션"] / df["LG에너지솔루션"].dropna()[0]) - 1
9. 수익률 시각화
- matplotlib API와 Pandas API 비교 : plt.plot(df_norm) / df_norm.plot(fizsize=(12,5))
- Pandas는 matplotlib을 사용하기 쉽게 감싸두었다.
- Pandas는 범례가 있고, 보기가 쉽다.
- matplotlib은 설정이 디테일하게 가능하다.
- plt.axhline(0)는 0 라인에 선을 그려준다.
- plt.axhline(0, c="k") k는 블루, b는 검정 선
- https://matplotlib.org/
- 히스토그램 그리기
- 변수에 할당하면, 보이는 로그를 없앨 수 있어 조금 더 깔끔해보인다.
- plt.show() / _= / ; 등을 사용하면 로그를 없앨 수 있다.
- 왜도와 첨도
- 왜도 df_norm.skew().sort_values()
- 첨도 df_norm.kurt().sort_values() : 0에 가까울 수록 정규분포
- cut과 qcut() : 04번 판다스 기초 강의 파일.
- pd.cut : ex) 절대평가
- pd.qcut : ex) 상대평가
- 중앙값 : df_norm.resample("M").median() / 분기별 : df_norm.resample("Q").median()
✅ 05번 강의 파일
- 데이터 시각화 도구
- 엑셀 : 속도가 느림. / Power BI : 라이센스 비용 / 태블로 / Google 데이터스튜디오
- Q. 유료 BI 도구의 장점? : 쉽고 빠르게 시각화. 방대한 데이터를 효율적으로 시각화
- Q. 단점 : 비싸다. 커스텀이 한계가 있다.
- matplotlib 기반 정적 도구 : seaborn, pandas, plotnine library
- JavaScript 기반 동적 도구 : plotly, bokeh, altair
- Plotnine은 파이썬 문법과 거리가 있다.
- Seaborn
- small multiple : 서브 플롯을 잘 제공한다.
- FacetGrid : 하나의 범주형 변수 중 특정 변수를 쪼개서 볼 때
- PairGrid : 여러 개의 변수를 그릴 때
- plotly
- plotly는 내장되어 있어서 별도의 API를 불러올 필요가 없다.
- seaborn과 비슷한 사용법 : data, x, y
- hue 대신 color를 사용
- Graph Object: low level interface제공
- https://plotly.com/python/time-series/
✅ 0302 실습파일
- import plotly.express as px
- . 하고 tab하면 내장 메서드가 보인다.
- df에 내장된 데이터를 불러오기 : df = px.data.stocks()
1. 그래프 그리기
- 한글 폰트 설정이 필요 없다.
- pandas API : df.set_index("date").plot()
- plotly express API: px.line(df.set_index("date"))
2. 일별 수익률 막대그래프
- df해서 출력해보면 첫번째값이 1이기 때문에 df-1하면 된다.
- df-1했을 때는 "date"가 object라서 오류가 난다.
- df에서 date를 인덱스해준다.
- df_1 = df.set_index("date")-1
- date가 컬럼이 아닌 인덱스이기 때문에 오류가 난다.
- px.bar(df_1, x="date", y="GOOG") 를 px.bar(df_1, x=df_1.index, y="GOOG") 로 바꿔줘야 한다.
- px.bar(df_1["GOOG"]) / px.bar(df_1, y="GOOG")같은 방법
- 그래프가 표시되지 않을 때
from plotly.offline import iplot, init_notebook_mode
from plotly.subplots import make_subplots
init_notebook_mode()
3. facet_col로 서브플롯 그리기
- df_1.columns을 출력해서 컬럼 이름들을 본다.
- 컬럼 이름들에 이름을 지정해준다. 그러면 그 이름별로 서브플롯을 그리게 된다.
- px.area(df_1, facet_col = "company")
4. 하나의 그래프로 합치기
- Q. px.line(df_1, hover_data={"date": "|%Y-%m-%d"}) 오류가 난 이유?
- A. index로 접근해야 한다. px.line(df, hover_data={"date": "|%Y-%m-%d"})
- 하나씩 그릴 수도 있다. px.line(df, x= "date", y="GOOG", hover_data={"date": "|%Y-%m-%d"})
5. Range Slider
- https://plotly.com/python/time-series/에서 예제를 가지고 어떻게 활용하면 좋을지 고민해보기
- matplotlib을 훨씬 많이 쓰는 이유는 속도가 차이가 많이 난다.
- 스크롤을 옮기면서 볼 수 있다.
- Q. plotly를 잘 쓰는 방법? 시각화할 때 데이터가 많으면 오래걸리는데 속도를 개선해 보는 방법?
- A. 대표값을 표시해야 한다면 그래프에서 계산하지 않고, 미리 계산해서 시각화하기
6. 캔들 차트
- 예제 : Open 시작가가 위에 있고, Close가 밑에 있어서 종가가 하락했다.
- https://plotly.com/python/time-series/에서 Simple Candlestick with Pandas 예제를 가지고 사용
7. OHLC
- 캔들차트 예제를 가지고 와서 go.Ohlc만 바꿔준다. 대문자 O 쓰고 탭키
- 캔들차트에서 range slider 빼고 싶을 때 : fig.update_layout(xaxis_rangeslider_visible=False) 추가
8. 직접 수집한 주가 데이터로 시각화
- 과제!!
- 해외 주가를 불러올 수 있다.
- 데이터가 1980년부터 불러올 수 있기 때문에 기간을 정해주는것이 좋다. amd = fdr.DataReader("amd", start="2022")
퀴즈
9/14문제
1. 틀린 것
- 2번 문제 : 전체 데이터프레임의 요약 정보를 확인하는 메서드. 데이터의 행과 열의 수, 데이터 타입, 메모리 사용량 등의 정보를 볼 수 있는 기능
- info() 골랐다가... shape 했는데... 반성하자
- shape는 '데이터프레임'의 행과 열 확인
- 5번 문제 : 한국 거래소(KRX)의 데이터프레임 중 "Symbol"과 "Name" 컬럼만 색인한 결과를 df라는 변수에 할당했다고 가정한다. 다음 중 df 변수를 이용하여 데이터 색인을 하는 과정에서 오류가 발생하는 코드는?
- df.loc[[1,3,5]] / df.loc[0] / df[1] / df["Name"]
- df[1]과 df.loc[[1,3,5]] 중 헷갈렸는데..
loc는 값 지정이었던 것 같은데 다시 헷갈리네. 다시 보자
ㄴdf.loc[[1,3,5]]하면 1,3,5번째 인덱스 값인 AJ네트웍스, APS홀딩스, AP위성이 나온다. 두 개 이상 변수를 조건으로 줬기 때문에 대괄호 두개로 감쌈.
ㄴdf.loc[0]하면 0번 인덱스 값인 3S가 나온다. 그런데 Series 형태로 나온다. 왜?? https://sikaleo.tistory.com/12
ㄴdf["Name"]하면 Name 컬럼 값들이 전부 나온다.
ㄴ아마 df[1]하면 https://blog.naver.com/snp0783/222285418495 여기서 "df.loc[s] 또는 df[s]라고 표현해줘도 된다." 라고 설명한 부분의 의도에서 생각해 볼 수 있을 것 같다.
ㄴdf.iloc[0], df.loc[0]은 가능
- 6번 문제 : 서울특별시에 소재지를 두고 있는 KOSPI 종목의 종목명과 종목코드(Symbol) 데이터를 확인하려고 합니다. 다음 그림의 빈 칸에 알맞은 것을 골라주세요.
seoul = df["Region"] == "서울특별시"
kospi = df["Market"] == "KOSPI"
df.loc[(seoul & kospi), ["Symbol", "Name"]]- and와 or은 논리 연산자
- |는 비트 연산자
- 10번 문제 : 비연속(범주형)데이터의 시각화로 가장 적절한 것
- 또 틀렸어, 범주형과 수치형 플롯 구분! 공부하자
- histogram / scatterplot / barplot / lineplot
- barplot
ㄴhttps://seaborn.pydata.org/tutorial/function_overview.html
- 11번 문제 : 무엇의 API로 시각화?
- _=df_norm.plot(title="수익률 비교", figsize=(15,6))
- pandas, matplotlib, seaborn, plotly
- 코드를 뭘 썼는지 잘 확인해보자. 정답이 있다.
- pandas. 데이터 프레임을 썼다.
- 맞았지만 다시 볼 것
- 3번 문제 : 데이터프레임에서 인덱스값이 함께 저장되어 "Unnamed0:"이 함께 저장되었을 때, 값을 저장하지 않기 위해 사용해야 할 속성
- index = False
- 14번 문제 : 캔들 스틱 차트를 보고 올바르지 않은 것
- 캔들 스틱의 봉 하나는 하루 가격의 움직임을 나타낸다. (0)
해결과제
- 퀴즈에서 loc부분 다시 보기
- df.loc https://blog.naver.com/snp0783/222285418495
- df.loc["index_names", "column_names"]
- unnamed:0이라는 컬럼이 생겼을 때, 어떻게 해줘야 없어지더라.
- df.iloc https://blog.naver.com/snp0783/222285447103
- df.iloc[index_number, column_number]
- df.iloc[:,:4] : "" 없이 정수로만 입력 가능
- Date인덱스의 전체 날짜에 대해서, :4, close, open, high, low 값만 가져와서 선 그래프를 그린 것.
- 퀴즈에서 index = False 지정할 때 전체 코드 찾아보기
- 220920 판다스 실습 파일에서, 파일로 저장할 때, df.to_csv("drug.csv", index=False) 에서도 인덱스가 나오네.
- 퀴즈 10번 문제 범주형 데이터, 수치형 데이터 분석 plot 공부
https://seaborn.pydata.org/tutorial/function_overview.html
댓글