0302 실습파일 : 주가데이터 시각화, 캔들스틱, OHLC, FAANG / 0303 실습파일 : 서울 코로나 데이터, dulicate, index, sort_index, dt accessor, 연도-월, value_counts
221006
- 선그래프 연속된 수치 데이터/ 범주형 데이터는 히스토그램, 막대 그래프
- shift+tab/ shift+tab+tab 설명 보는 법에 익숙해지자
- 캐글, 데이콘의 다른 사람 자료들을 참고하고 따라해보는 것 추천!!!
1. 0302 실습 파일
- go: graph object. low level interface를 제공하고 있어서 디테일한 설정이 가능하다.
1.1 직접 수집한 주가 데이터로 시각화
- fdr.DataReader("Ticker명",start,end) 등으로 시작과 끝을 정할 수 있다.
- 선그래프: px.line그리면 change값은 적절하지 않게 그려진다.
ㄴ그냥 밑에 일직선으로 그려짐. - marginal="box"를 violin, point, rug등 바꿔볼 수 있다.
- nbins=50과 같이 bin이 담는 통이라고 다른 그래프에 익숙해져 있으면, 설명을 보면 찾기 쉽다.
1.2 Candlestick
- amd.head(2) 해서 내가 그릴 데이터 확인
- x값이 amd의 index로 되어 있다.
1.3 Ohlc
- 미국은 상승일 때 초록, 하락일 때 빨강
1.4 여러 종목의 수익률 보기
- en.widipedia.org/wiki/Nasdaq-100 에서 다른 종목을 볼 수 있다.
- 링크를 이용해서 쉽게 가져올 수 있다. ex)pd.read_html("https://en.wikipedia.org/wiki/List_of_S%26P_500_companies")[0]
1.5 FAANG
- 리스트 컴프리헨션 : [sym for sym in FAANG]
- concat할 때 axis=1 안넣었을 때랑 자료 비교해보기
ㄴ axis=0으로 하면 세로로 길게 합쳐진다. 우리는 FAANG 종목별로 종가를 비교하고 싶은건데, 세로로 길어져서 종목별로 비교가 불가능하다.
ㄴ axis=1하면 FB, AMZN, AAPL, NFLX, GOOGL 컬럼이 생기면서 종목별 비교가 가능하다. - axis는 축을 의미하는 매개변수, 0은 인덱스, 1은 컬럼
- 0301번 실습 파일에서 하나의 데이터 프레임으로 합치기 참고하기
- axis 0 으로 가져왔을 때, series 형태로 보이는 거 공부하기..
- 일별수익률 df_ratio 구할 때, column이름 설정 안하면 컬럼명이 동일해서 API 오류가 난다.
1.6 그래프 그리기
- 선 그래프 그리기 : px.line(df_ratio, facet_col = "company")
- areaplot 그리기 : px.area(df_ratio, facet_col = "company")
- 막대그래프 : 잘게 그려져서 아무것도 안보이면, facet_col_warp=1로 설정해서 보이게 설정
- scatter : 두 개 종목을 비교 하고 싶다. x="FB" ,y="AAPL" 상관이 없음
- 구글과 애플은 양의 상관관계
- px.scatter_matrix(df_ratio)
- scatter 플롯의 예제로 iris 데이터가 좋다(품종별 꽃잎과 꽃받침 색으로 비교)
1.7 옵션 공부
- notched=True, points="all"과 같이 옵션들을 넣어보자. --shift+tab
- 데이터 타입이 숫자인 것만 가져와라 같은 옵션: px.box(iris.select_dtypes(include="number"))
- 품종에 따라 색을 다르게 : px.box(iris, x="sepal_length", color="species")
2. 0303 실습 파일
- 서울시에서 제공하는 공공데이터 : https://www.seoul.go.kr/coronaV/coronaStatus.do
- mpg(mile per gallon)(0106, 0107번 실습파일) 보다 더 큰 데이터 : (20000,7) (18646,7)
2.1 파일 불러오기
- 같은 경로에 있는지 확인: glob("seoul*.csv")
- seoul로 시작하고 뒤는 *뭐가 오든지 상관 없다.
- seoul-covid*.csv
- pd.read_csv("") : 12월 18일자, 26일자 자료 가져오기
- 일부만 쓰고 tab키를 눌러 자동완성을 사용하는 방법 추천. 오타를 막기 위해
- 재감염 빈도를 알 수 없는 이유? 환자번호가 고유번호가 아니라서
2.2 데이터 합치기
- 세로로 합칠 때는 axis=0, pd.concat([df_01,df_02])
- 중복 제거 : df.duplicated()를 한번더 df로 감싸서 데이터프레임으로 본다. df[df.duplicate()]
- 중복된 데이터가 없지만, 있을 때 이런 방법으로 제거해 볼 수 있다. : df.drop_duplicates()
2.3 ["연번"]과 index
df.shape와 df["연번"].nunique()하면 shape의 행의 값과 일치하므로, 중복값이 없다는 것을 알 수 있다.
- 연번과 환자 차이는? 연번 : 서울시기준 확진순서 / 환자: 전국기준 확진자 식별번호
- nunique는 count랑 값이 같다. 유니크값 -> 인덱스로 만들어준다.
- 연번을 이미 인덱스 값으로 만들어줘서, 컬럼에 없기 때문에 한 번 더 실행하면 오류가 발생한다.
2.4 정렬: sort_index(ascending=False)
- set_index 사용 : 주식 date 컬럼을 인덱스로 지정, 전치행렬(transpose) 할 때. 찾아보기!!
- df.index 했을 때 "연번"이 인덱스로 있는지 꼭 확인하기
2.5 판다스 attributes
- df.columns : 컬럼 이름 설정. plotly 할때도 시각화할 때 이름 하나로 설정
- shape, dtyples, columns, index, info
2.6 결측치
- df.isnull().mean() : 왜 퇴원현황이 25%의 결측치가 있을까? 집에서 격리 중 or 결과가 업데이트가 안되었을 경우 or 입원중
2.7 describe
- 확진자가 제일 많은 날짜: 21년 12월 14일/ 3165명
- top, freq의 의미는 ? 최빈값, 최빈값의 빈도수
- 퇴원현황에서 unique가 2이 되있어서 검색 : df["퇴원현황"].unique() : nan 결측치는 제외하고 사망, 퇴원 2개가 나온다.
- 치명률이 어떻게 변화하는지 알아볼 수도 있다.
- unique/ nunique차이 : unique()는 serise에만 사용 가능하고 nunique()는 dataframe, series에 모두 사용 가능
2.8 Accessor : 04번 강의 파일
- string accessor를 사용해봤다. ex) upper 대문자
- dt accessor는 대부분 괄호가 들어가지 않는다.
- 공식문서 : https://pandas.pydata.org/docs/reference/series.html#accessors
- dt, str, cat, sparse 가 있다. 수업에서는 dt와 str을 주로 사용할 것
- df["확진일"].dt.year 하면 오류가 나기 때문에, pd.to_datetime을 통해 datetime형태로 바꿔줘야 한다.
2.9 연도-월
- df["연도"] + df["월"]하면 숫자가 더해진다. 틀린 방법
- df["연도"].astype(str) +"-"+ df["월"].astype(str)
- df["연도월"] = df["확진일"].astype(str).str[:7]
- astype(str) <= pandas series, str() <= python 문자열
- 익명함수 : lambda로 이름이 없는 함수
- lambda : x는 매개변수, "월화수목금토일"[x]는 return
- lambda 반환값 : 식
def add10(x):
return x+10
lambda x: x+10
2.10 히스토그램
- bins 는 도수분포
- 뒤로 갈수록 확진일을 통해 기하급수적으로 확진자가 는다는 것을 확인할 수 있다.
- df.hist(bins = 100); 세미콜론 넣으면 로그가 안뜬다.
- 월요일에 확진자 수가 가장 적고, 화요일이 가장 많다. 일요일에 검사를 못받아서.
- 31일은 연중에 별로 없어서 적게 나온다.
2.11 value_counts
- value_counts로 빈도수 구하고 시각화한다.(한개 변수)
- 두개 변수 crosstap
- 공식처럼 사용된다.
- 앤스컴스콰르텟에서 사용해보았다.
- normalize = True 정규화
- 정규화 : 텍스트 전처리를 한다를 정규화라고 하기도 하고, 정규 distribution을 정규화라고도 한다.
- 0301번 실습파일에서 8. 기간 수익률 비교하기 에서도 정규화 이야기를 해보았다.(scale값을 변경해볼수 있다.는 의미에서)
- kind = "line", kind="area", title="", grid=True 등 여러 조건을 넣을 수 있다.
2.12 요일별 빈도수
- 요일로 가져오면 잘 안가져와 지기 때문에 월~일요일로 정렬이 되게 시각화
- weekday_count = df.value_counts("요일").sort_index() / weekday_count = df["요일"].value_counts().sort_index()
- 그래프 상 월화수목금토일 글자가 누워있다면 rot=0 / rot=30로 회전 각을 설정
- 월화수목금토일은 범주형 변수에 가깝기 때문에 barplot이 더 효과적
- 요일명으로 빈도수 정렬
- 한글이기 때문에 sort_index해도 잘 안됨
- df["요일명"].value_counts().sort_index() 했을 경우
- weekday_cnt에 인덱싱을 해온다.
- 람다로 정렬
- plt.axhline : horizontal line
- 확진자가 없는 날짜를 0으로 빈도를 구하려면 어떻게 해야 할까? ex) 2/7~2/15
- 없는 날에 0이 들어가게 df all day에 확진수 컬럼을 만들기
- df_all_day의 인덱스의 데이터타입과 day_count의 인덱스 데이터 타입이 다르다.
- 이전 실습에서 시각화하면서 day_count의 데이터 타입을 변경해서
- 그러면 df_all_day["확진수"] =day_count할 때 전부 NaN으로만 나온다.
퀴즈
10/10문제
1. 맞았지만 애매한 것
- 2번 문제 : 변수의 유일값(중복을 제외한 unique값)의 갯수를 구하는 기능 : nunique() -> unique와 nunique의 차이 알아보기
- 3번 문제 : 판다스를 통해 1개의 변수에 대한 빈도수를 구하기에 적합한 기능은? : value_counts()
- 4번 문제 : 두 개의 변수에 대한 빈도 수를 구할 수 없는 것?
- crosstab() / groupby() / pivot_table() / pivot()
- pivot() 은 형태만 변경하고 연산을 하는 기능은 없다.
- 피봇테이블은 그룹바이를 사용하기 쉽게 만들어 놓은 기능
- 크로스탭은 피봇테이블을 사용하기 쉽게 만들어 놓은 기능
- 5번 문제
확진일의 데이터타입이 object형으로 되어 있어, 날짜 형식으로 바꾸려 할 때 쓰는 메서드 : pd.to_datetime() 꼭 다시 보기
df["확진일자"] = pd.to_datetime("2020-"+df["확진일"].str.replace(".","-")) - 6번 문제
기준선을 그리는 함수- plt.axhline() : 수평선을 그리는 함수
- plt.axvine() : 수직선을 그리는 함수
해결과제
- 퀴즈 2번 문제 : unique와 nunique의 차이
- nunique는 unique 값의 갯수를 출력해준다.
- 5번 datetime 부분 공부하기
댓글