본문 바로가기
Python/멋사_AIS7

Day 15

by Hi_heidi 2022. 10. 6.

Day 15

 

map과 apply

-map과 apply는 모두 벡터 연산을 해서 속도가 빠르다

-보편적으로 map이 사용된다

  map apply applymap(덤)
Series O O X
DataFrame X O O

1. map()

-Dataframe의 Series를 input으로 받는다

-특정 Series를 대상으로 함수를 적용할 수 있다

df['prod_year'] = df['year'].map(lambda x: x**2)
# year 컬럼 값들을 제곱하는 익명의 함수 람다 x 지정
# 결과값은 prod_year컬럼으로 지정

 

2. apply()

-Series와 DataFrame 둘 다 input으로 받는다

-전체 column(series)를 대상으로 함수를 적용할 수 있다

-axis로 원하는 축 방향에 따라 함수를 지정할 수 있다 : axis=0 행(디폴트), axis=1 열

df.apply(lambda x: x.sum() / len(x) )
# x의 평균값을 구하는 익명의 함수 람다x 지정
# 전체 df에 적용
df.apply(max, axis=1)

 

TQDM

from tqdm.notebook import tqdm
tqdm.pandas() #pandas에서 dataframe에 함수를 적용할 때 tqdm을 실행시켜주기 위한 코드

수집 진행상태를 확인하며 데이터를 가져올 수 있다

view_detail = df["글번호"].progress_map(get_view_page) 
# .progress로 진행상황 확인(앞선 코드에서 map을 사용해서 progress_map)
# 앞선 코드에서 apply를 사용했다면 progress_apply

 

사용할 컬럼만 남기기

df_detail[['번호', '분류', '제목', '내용', '내용번호']]

 

csv 파일로 저장하기

df.to_csv(file_name, index=False, encoding='cp949')

-엑셀에서 바로 열어볼 수 있는 형태로 하고 싶으면 encoding=’cp949’를 추가한다

-but 아스키 코드가 있으면 cp949로 저장X → cp949는 아스키코드를 지원하지 않기 때문

 

시가총액 상위 10개 종목 만들기

df_10 = df_top10.merge(df_krx,left_on='종목별', right_on='Name', how="left")[['Name','Symbol']]

 

리스트 컴프리헨션

stock_list = [fdr.DataReader(sym,'2022')['Close'] for sym in df_10['Symbol']]

1) df_10의 Symbol컬럼의 각 요소에 접근

2) fdr.DataReader로 2022년 symbol의 Close컬럼(종가) 읽어오기

3) 리스트에 삽입

 

시각화 koreanize_matplotlib

주피터노트북 환경에서 동작이 원활해 추천되는 시각화 라이브러리

#초기 설정
import koreanize_matplotlib
%config InlineBackend.figure_format = 'retina' # 그래프에 retina display 적용

import matplotlib.pyplot as plt
print(plt.style.available) #시각화 스타일 종류 보기

-설치는 주피터노트북을 열었던 프롬프트와 동일한(맞는) 아나콘다 프롬프트에 설치해야 실행이 된다

-시각화 스타일로는 'fivethirtyeight', 'ggplot'을 사용해봤는데 한글 표기를 위한 별다른 요구조건을 갖지 않는다. 한글 폰트를 지원하는 것이 아니라 폰트 설정이 없어서 폰트 설정을 덮어쓰지 않는 것이다

-만일 다른 plt 스타일을 썼다가 오류가 나게 되면 ⓐkernel > restart ⓑcell > run cell above ⓒ다시 실행 하면 된다

 

pd.Series([1,-3,5,-7,9]).plot(title='한글', figsize=(6,1))
# 마이너스 값도 잘 표시되는지 체크
# 한글이 깨지지 않는지 체크

시각화 전 위 코드로 미리 체크한다

 

시각화

1) 스타일 지정

plt.style.use('ggplot')

 

2) 범례 그래프 우측으로 빼기

plt.legend(bbox_to_anchor=(1,1))

 

3) 2축 그래프

df[['NAVER','카카오']].plot(secondary_y='카카오', figsize=(10,6))

 

수익률 구하기

1) 전체 df값 수익률 구하기

(df / df.iloc[0]) - 1
# 수익률 = (나머지 가격 / 첫번째 날 가격) - 1

 

2) 첫날 가격이 NaN일 경우 수익률 구하는 방법

(df['쏘카'] / df['쏘카'].dropna()[0]) - 1
#(나머지 가격 / 결측치를 제거하고 남은 데이터 중 첫 번째 가격) - 1

 

3) 분기별 수익률 보기

df.resample("Q").mean()
# resample("Q") 분기별로 보겠다
# mean() 평균값으로

 

4) 월별 수익률 보기

df.resample("M").median()
# resample("M") 월별로 보겠다
# median 중앙값으로

 

5) 여러가지 값으로 수익률 보기

df_norm.resample("Q").agg(['mean','median'])

 

matplotlib API 와 Pandas API

1) matplotlib API

디테일한 시각화가 가능하지만 코드가 길고 비교적 사용법이 복잡하다

plt.plot(df)
plt.show()

plt.axhline(0, c='k')
# ax까지 타이핑하고 기다리면 사용할 수 있는 ax~ 스타일을 확인할 수 있다
# axhline(0) 0점을 기준으로 horizontal한 직선 긋기
# c='k' 컬럼= b블루 / r레드 / k블랙

 

2) Pandas API

matplotlib 을 판다스에서 사용하기 쉽게 추상화 해두어 쉽게 시각화할 수 있다

df.plot(figsize=(12,6),colormap='tab10')

 

왜도와 첨도

1) 왜도 = 비대칭도(skewness)

-실수 값 확률 변수의 확률 분포 비대칭성을 나타내는 지표

-왜도 값은 양수나 음수가 될 수 있으며 정의되지 않을 수도 있다

-왜도가 음수일 경우 : 확률밀도함수의 왼쪽 부분에 긴 꼬리, 중앙값을 포함한 자료가 오른쪽에 더 많이 분포

-왜도가 양수일 경우 : 확률밀도함수의 오른쪽 부분에 긴 꼬리, 중앙값을 포함한 자료가 왼쪽에 더 많이 분포

-if 평균 = 중앙값 : 왜도 == 0

df.skew().sort_values()

 

2) 첨도 =뾰족한 정도(kurtosis)

-확률분포의 뾰족한 정도를 나타내는 척도

-관측치들이 얼마나 집중적으로 중심에 몰려 있는가를 측정할 때 사용

-첨도값(K)이 3에 가까우면 산포도가 정규분포에 가깝다

-첨도값(K) < 3 : 정규분포보다 완만하게 납작한 분포

-첨도값(K) > 3 : 정규분포보다 더 뾰족한 분포

df.kurt().sort_values()

 

 

기타

  • 주피터 노트북 도움말 : shift + tab + tab   예시) df.plot(커서) 커서 위치에서 stt
  • 주피터 노트북 df.plot? 하고 실행(ctrl + enter)해도 도움말 볼 수 있음
  • 히스토그램
    • 히스토그램을 변수에 할당해야 그래프로그가 출력되지 않는다
    • 변수 할당 없이 plt.show() 를 해도 그래프로그가 출력되지 않는다(추천)
    • 변수 할당 없이 코드 맨 끝에 ; 를 붙여도 그래프로그가 출력되지 않는다
  • 퀴즈
    • pandas는 and 대신 &, or 대신 | 사용
    • df.loc[1], df.loc[[0,2,4]]은 가능하지만 df[1]처럼 df에 바로 인덱스값을 지정해 결과를 반환하지 못한다(KeyError 발생)

 

출처) 멋쟁이 사자처럼 AI스쿨 7기 박조은 강사님 강의자료

'Python > 멋사_AIS7' 카테고리의 다른 글

Day 18  (0) 2022.10.12
Day 16  (0) 2022.10.06
Day 14  (0) 2022.10.04
Day 12~13  (0) 2022.10.04
Day 10  (0) 2022.09.27