Today I Learned

[TIL] 230131 파이썬 데이터시각화(1)

by Holly Yoon

파이썬 라이브러리

  • pandas : 파이썬에서 사용하는 데이터분석 라이브러리, 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있음
  • numpy : 다차원의 연산 → 수식계산 지원
  • matplotlib : MATLAB과 비슷하게 명령어 스타일로 동작하는 함수의 모음
  • 매서드체이닝하면 도움말이 잘 작동 안할 때
#?-도움말, ??-소스코드 보기, help()
df.sort_index?
  • 히스토그램의 장점
    • 끊어진 수치 데이터를 볼 수 있음 → 범주형 데이터
    • 변수의 빈도수를 알 수 있고, 전체적인 분포를 알 수 있음
    • 데이터의 대칭성, 시간 경과에 따른 변화를 분석할 수 있음

0301-실습

  • 기준선 넣기
gu_count.plot.bar()
plt.axhline(5000, c="k", ls=":") # r->red, b->blue, k->black

  • 연도/월 두 변수에 대한 빈도수 구하기
df_ym = pd.crosstab(index=df['연도'], columns=df['월'])
  • 시각화 Case1 2중축
df_ym.T.plot(kind='bar', rot=0, figsize=(12,3), secondary_y=df['연도'][1])

  • 시각화 Case2 subplots
df_ym.T.plot(kind='bar', rot=0, figsize=(12,3), subplots=True)

  • 연도/요일 crosstab만들고 요일명 붙이기
df_yd= pd.crosstab(index=df['연도'], columns=df['요일'], normalize=True)*100
weekday_list = list('월화수목금토일')
df_yd.columns=weekday_list
df_yd
df_guym = pd.crosstab(index=df['거주구'], columns=df['연도월'])
df_guym.style.background_gradient()

  • boolean indexing (1)
# 강남구에서 "일요일"에 확진된 데이터만 찾기
# .loc[행]
df[(df['거주구']=='강남구') & (df['요일명']=='일')]

# .loc[조건, 열]
df.loc[(df['거주구']=='강남구') & (df['요일명']=='일'),['거주구','요일명']]
  • boolean indexing (2) - 조건문 별도로 남기기
강남 = df['거주구']=='강남구'
일본 = df['여행력']=='일본'

df[강남&일본]
  • str.contains() - 대소문자가 섞여있을 때, 변경해주기
#예시1
df['접촉력_대문자'] = df['접촉력'].str.upper()
df.loc[df['접촉력_대문자'].str.contains("PC"),'접촉력'].value_counts()
#예시2
df.loc[df['거주구'].str.contains('강남구|송파구|서초구'), '접촉력'].value_counts()
  • isin - 데이터 프레임에서도 사용가능, .str은 시리즈에만 사용가능
df.loc[df['거주구'].isin(['강남구','서초구','송파구']),'접촉력'].value_counts().to_frame()
  • 새로운 파생변수 만들기
df['해외유입'] = df['접촉력']=='해외유입'
df.loc[df['해외유입'],'국내해외']='해외'
df.loc[~df['해외유입'],'국내해외']='국내'

  • 국내/해외 발생자 수
df_guaboard=pd.crosstab(df['거주구'],df['국내해외'])
df_guaboard.plot(kind='bar',subplots=True)

  • 비율 구하기 - 도메인에 따라 비율을 구하는 방법이 다를 수 있음
df_guaboard['해외비율'] = df_guaboard['해외']/df_guaboard['국내']
  • 막대 그래프
df_guaboard[['국내','해외']].plot(kind='barh', stacked=True)

  • pivot/pivot_table 공통점은 index, columns를 사용할 수 있다. pivot은 형태 반환만 제공, pivot_table은 연산을 함께 제공.
  • 요일/거주구별 환자 수 - style.bar()
weekday_list = list('월화수목금토일')
df_guday = pd.pivot_table(data=df, index='거주구', columns='요일', values='환자' , aggfunc='count')
df_guday.columns = weekday_list
df_guday.style.bar()

  • groupby()
gu_over = df.groupby(by=['거주구','국내해외'])['환자'].count()
gu_over.unstack(level=-1)

df.groupby(by=['연도','월'])['국내해외'].describe()

0302-증권데이터

import pandas as pd
import numpy as np
!pip install -U finance-datareader
import FinanceDataReader as fdr
url = "<https://finance.naver.com/sise/entryJongmok.naver?&page=1>"
print(url)
  • 필요없는 열 삭제
df_top10 = pd.read_html(url)[0].dropna()
  • 종목명 코드만 가져오기
df_krx = fdr.StockListing('KRX')[['Name','Code']]
  • merge() - 종목이름으로 두 테이블 합치기
df_10 = df_top10.merge(df_krx, left_on='종목별', right_on='Name')[['Name','Code']]
df_10
  • 일별 종가 데이터 테이블 만들기
#fdr.DataReader('005930', start='2022')
item_list = [fdr.DataReader(code, start='2022')['Close'] for code in df_10['Code']]
df = pd.concat(item_list, axis=1)
df.columns=df_10['Name']

  • 다양한 그래프 스타일 사용하기
#폰트를 포함하고 있는 스타일을 지정시, 폰트 설정이 초기화됨.
print(plt.style.available)
# 한글폰트 사용을 위해 설치
!pip install koreanize-matplotlib
import koreanize_matplotlib
# 그래프에 retina display 적용
%config InlineBackend.figure_format = 'retina'
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
  • 여러 종목 시각화
df.plot(figsize=(10,4), lw=2)
plt.legend(bbox_to_anchor=(1,1))
  • 2가지 축으로 비교하기 (삼성vslg화학)
df[['삼성전자','LG화학']].plot(kind='line', secondary_y='LG화학')
  • 파이썬 라이브러리
    • pandas : 파이썬에서 사용하는 데이터분석 라이브러리, 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있음
    • numpy : 다차원의 연산 → 수식계산 지원
    • matplotlib : MATLAB과 비슷하게 명령어 스타일로 동작하는 함수의 모음
  • 매서드체이닝하면 도움말이 잘 작동 안할 때
#?-도움말, ??-소스코드 보기, help()
df.sort_index?
  • 히스토그램의 장점
    • 끊어진 수치 데이터를 볼 수 있음 → 범주형 데이터
    • 변수의 빈도수를 알 수 있고, 전체적인 분포를 알 수 있음
    • 데이터의 대칭성, 시간 경과에 따른 변화를 분석할 수 있음

0301-실습

  • 기준선 넣기
gu_count.plot.bar()
plt.axhline(5000, c="k", ls=":") # r->red, b->blue, k->black
  • 연도/월 두 변수에 대한 빈도수 구하기
df_ym = pd.crosstab(index=df['연도'], columns=df['월'])
  • 시각화 Case1 2중축
df_ym.T.plot(kind='bar', rot=0, figsize=(12,3), secondary_y=df['연도'][1])
  • 시각화 Case2 subplots
df_ym.T.plot(kind='bar', rot=0, figsize=(12,3), subplots=True)
  • 연도/요일 crosstab만들고 요일명 붙이기
df_yd= pd.crosstab(index=df['연도'], columns=df['요일'], normalize=True)*100
weekday_list = list('월화수목금토일')
df_yd.columns=weekday_list
df_yd
df_guym = pd.crosstab(index=df['거주구'], columns=df['연도월'])
df_guym.style.background_gradient()
  • boolean indexing (1)
# 강남구에서 "일요일"에 확진된 데이터만 찾기
# .loc[행]
df[(df['거주구']=='강남구') & (df['요일명']=='일')]

# .loc[조건, 열]
df.loc[(df['거주구']=='강남구') & (df['요일명']=='일'),['거주구','요일명']]
  • boolean indexing (2) - 조건문 별도로 남기기
강남 = df['거주구']=='강남구'
일본 = df['여행력']=='일본'

df[강남&일본]
  • str.contains() - 대소문자가 섞여있을 때, 변경해주기
#예시1
df['접촉력_대문자'] = df['접촉력'].str.upper()
df.loc[df['접촉력_대문자'].str.contains("PC"),'접촉력'].value_counts()
#예시2
df.loc[df['거주구'].str.contains('강남구|송파구|서초구'), '접촉력'].value_counts()
  • isin - 데이터 프레임에서도 사용가능, .str은 시리즈에만 사용가능
df.loc[df['거주구'].isin(['강남구','서초구','송파구']),'접촉력'].value_counts().to_frame()
  • 새로운 파생변수 만들기
df['해외유입'] = df['접촉력']=='해외유입'
df.loc[df['해외유입'],'국내해외']='해외'
df.loc[~df['해외유입'],'국내해외']='국내'
  • 국내/해외 발생자 수
df_guaboard=pd.crosstab(df['거주구'],df['국내해외'])
df_guaboard.plot(kind='bar',subplots=True)
  • 비율 구하기 - 도메인에 따라 비율을 구하는 방법이 다를 수 있음
df_guaboard['해외비율'] = df_guaboard['해외']/df_guaboard['국내']
  • 막대 그래프
df_guaboard[['국내','해외']].plot(kind='barh', stacked=True)
  • pivot/pivot_table 공통점은 index, columns를 사용할 수 있다. pivot은 형태 반환만 제공, pivot_table은 연산을 함께 제공.
  • 요일/거주구별 환자 수 - style.bar()
weekday_list = list('월화수목금토일')
df_guday = pd.pivot_table(data=df, index='거주구', columns='요일', values='환자' , aggfunc='count')
df_guday.columns = weekday_list
df_guday.style.bar()
  • groupby()
gu_over = df.groupby(by=['거주구','국내해외'])['환자'].count()
gu_over.unstack(level=-1)
df.groupby(by=['연도','월'])['국내해외'].describe()

0302-증권데이터

import pandas as pd
import numpy as np
!pip install -U finance-datareader
import FinanceDataReader as fdr
url = "<https://finance.naver.com/sise/entryJongmok.naver?&page=1>"
print(url)
  • 필요없는 열 삭제
df_top10 = pd.read_html(url)[0].dropna()
  • 종목명 코드만 가져오기
df_krx = fdr.StockListing('KRX')[['Name','Code']]
  • merge() - 종목이름으로 두 테이블 합치기
df_10 = df_top10.merge(df_krx, left_on='종목별', right_on='Name')[['Name','Code']]
df_10
  • 일별 종가 데이터 테이블 만들기
#fdr.DataReader('005930', start='2022')
item_list = [fdr.DataReader(code, start='2022')['Close'] for code in df_10['Code']]
df = pd.concat(item_list, axis=1)
df.columns=df_10['Name']
  • 다양한 그래프 스타일 사용하기
#폰트를 포함하고 있는 스타일을 지정시, 폰트 설정이 초기화됨.
print(plt.style.available)
# 한글폰트 사용을 위해 설치
!pip install koreanize-matplotlib
import koreanize_matplotlib
# 그래프에 retina display 적용
%config InlineBackend.figure_format = 'retina'
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
  • 여러 종목 시각화
df.plot(figsize=(10,4), lw=2)
plt.legend(bbox_to_anchor=(1,1))
  • 2가지 축으로 비교하기 (삼성vslg화학)
df[['삼성전자','LG화학']].plot(kind='line', secondary_y='LG화학')
  • 파이썬 라이브러리
    • pandas : 파이썬에서 사용하는 데이터분석 라이브러리, 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있음
    • numpy : 다차원의 연산 → 수식계산 지원
    • matplotlib : MATLAB과 비슷하게 명령어 스타일로 동작하는 함수의 모음
  • 매서드체이닝하면 도움말이 잘 작동 안할 때
#?-도움말, ??-소스코드 보기, help()
df.sort_index?
  • 히스토그램의 장점
    • 끊어진 수치 데이터를 볼 수 있음 → 범주형 데이터
    • 변수의 빈도수를 알 수 있고, 전체적인 분포를 알 수 있음
    • 데이터의 대칭성, 시간 경과에 따른 변화를 분석할 수 있음

0301-실습

  • 기준선 넣기
gu_count.plot.bar()
plt.axhline(5000, c="k", ls=":") # r->red, b->blue, k->black
  • 연도/월 두 변수에 대한 빈도수 구하기
df_ym = pd.crosstab(index=df['연도'], columns=df['월'])
  • 시각화 Case1 2중축
df_ym.T.plot(kind='bar', rot=0, figsize=(12,3), secondary_y=df['연도'][1])
  • 시각화 Case2 subplots
df_ym.T.plot(kind='bar', rot=0, figsize=(12,3), subplots=True)
  • 연도/요일 crosstab만들고 요일명 붙이기
df_yd= pd.crosstab(index=df['연도'], columns=df['요일'], normalize=True)*100
weekday_list = list('월화수목금토일')
df_yd.columns=weekday_list
df_yd
df_guym = pd.crosstab(index=df['거주구'], columns=df['연도월'])
df_guym.style.background_gradient()
  • boolean indexing (1)
# 강남구에서 "일요일"에 확진된 데이터만 찾기
# .loc[행]
df[(df['거주구']=='강남구') & (df['요일명']=='일')]

# .loc[조건, 열]
df.loc[(df['거주구']=='강남구') & (df['요일명']=='일'),['거주구','요일명']]
  • boolean indexing (2) - 조건문 별도로 남기기
강남 = df['거주구']=='강남구'
일본 = df['여행력']=='일본'

df[강남&일본]
  • str.contains() - 대소문자가 섞여있을 때, 변경해주기
#예시1
df['접촉력_대문자'] = df['접촉력'].str.upper()
df.loc[df['접촉력_대문자'].str.contains("PC"),'접촉력'].value_counts()
#예시2
df.loc[df['거주구'].str.contains('강남구|송파구|서초구'), '접촉력'].value_counts()
  • isin - 데이터 프레임에서도 사용가능, .str은 시리즈에만 사용가능
df.loc[df['거주구'].isin(['강남구','서초구','송파구']),'접촉력'].value_counts().to_frame()
  • 새로운 파생변수 만들기
df['해외유입'] = df['접촉력']=='해외유입'
df.loc[df['해외유입'],'국내해외']='해외'
df.loc[~df['해외유입'],'국내해외']='국내'
  • 국내/해외 발생자 수
df_guaboard=pd.crosstab(df['거주구'],df['국내해외'])
df_guaboard.plot(kind='bar',subplots=True)
  • 비율 구하기 - 도메인에 따라 비율을 구하는 방법이 다를 수 있음
df_guaboard['해외비율'] = df_guaboard['해외']/df_guaboard['국내']
  • 막대 그래프
df_guaboard[['국내','해외']].plot(kind='barh', stacked=True)
  • pivot/pivot_table 공통점은 index, columns를 사용할 수 있다. pivot은 형태 반환만 제공, pivot_table은 연산을 함께 제공.
  • 요일/거주구별 환자 수 - style.bar()
weekday_list = list('월화수목금토일')
df_guday = pd.pivot_table(data=df, index='거주구', columns='요일', values='환자' , aggfunc='count')
df_guday.columns = weekday_list
df_guday.style.bar()
  • groupby()
gu_over = df.groupby(by=['거주구','국내해외'])['환자'].count()
gu_over.unstack(level=-1)
df.groupby(by=['연도','월'])['국내해외'].describe()

0302-증권데이터

import pandas as pd
import numpy as np
!pip install -U finance-datareader
import FinanceDataReader as fdr
url = "<https://finance.naver.com/sise/entryJongmok.naver?&page=1>"
print(url)
  • 필요없는 열 삭제
df_top10 = pd.read_html(url)[0].dropna()
  • 종목명 코드만 가져오기
df_krx = fdr.StockListing('KRX')[['Name','Code']]
  • merge() - 종목이름으로 두 테이블 합치기
df_10 = df_top10.merge(df_krx, left_on='종목별', right_on='Name')[['Name','Code']]
df_10
  • 일별 종가 데이터 테이블 만들기
#fdr.DataReader('005930', start='2022')
item_list = [fdr.DataReader(code, start='2022')['Close'] for code in df_10['Code']]
df = pd.concat(item_list, axis=1)
df.columns=df_10['Name']
  • 다양한 그래프 스타일 사용하기
#폰트를 포함하고 있는 스타일을 지정시, 폰트 설정이 초기화됨.
print(plt.style.available)
# 한글폰트 사용을 위해 설치
!pip install koreanize-matplotlib
import koreanize_matplotlib
# 그래프에 retina display 적용
%config InlineBackend.figure_format = 'retina'
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
  • 여러 종목 시각화
df.plot(figsize=(10,4), lw=2)
plt.legend(bbox_to_anchor=(1,1))
  • 2가지 축으로 비교하기 (삼성vslg화학)
df[['삼성전자','LG화학']].plot(kind='line', secondary_y='LG화학')

 

블로그의 정보

Study Log by Holly

Holly Yoon

활동하기