본문 바로가기
부트캠프(LIKELION AIS7)/수업

[AI스쿨 7기, 3주차] 주가 데이터 시각화(FAANG, 캔들스틱), 서울 코로나 데이터, nunique, accessor(dt accessor), value_counts

by aimaimee 2023. 4. 14.

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 여러 종목의 수익률 보기

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 실습 파일

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() : 수직선을 그리는 함수

해결과제

  1. 퀴즈 2번 문제 : unique와 nunique의 차이
    • nunique는 unique 값의 갯수를 출력해준다.
  2. 5번 datetime 부분 공부하기

댓글