[Python pandas] TimeStamp 행별로 칼럼별 비율을 구하고 시도표 그리기
Python 분석과 프로그래밍/Python 데이터 전처리 2021. 11. 14. 22:54이번 포스팅에서는 시계열 데이터에서
(1) TimeStamp 행별로 칼럼별 비율을 구하고
(2) 시도표 (time series plot) 를 그리기
하는 방법을 소개하겠습니다.
먼저, 예제로 사용할 간단한 pandas DataFrame을 만들어보겠습니다. index 로 2000년 ~ 2021년까지의 년도를 사용하고, 성별로 'M', 'F'의 두 개의 칼럼에 포아송분포로 부터 난수를 발생시켜서 만든 도수(frequency)를 가지는 DataFrame 입니다.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
## creating a sample DataFrame
ts = np.arange(2000, 2022) # from year 2000 to 2021
print(ts)
# [2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013
# 2014 2015 2016 2017 2018 2019 2020 2021]
np.random.seed(1) # for reproducibility
M = np.arange(len(ts)) + np.random.poisson(lam=10, size=len(ts))
F = np.arange(len(ts))[::-1] + np.random.poisson(lam=2, size=len(ts))
df = pd.DataFrame({'M': M, 'F': F}, index=ts)
df.head()
# M F
# 2000 9 21
# 2001 7 24
# 2002 9 20
# 2003 12 19
# 2004 13 18
(1) TimeStamp 행별로 칼럼별 비율을 구하기
먼저, pandas DataFrame 에서 합(sum)을 구할 때 각 TimeStamp 별로 칼럼 축(axis = 1) 으로 합을 구해보겠습니다.
## calculating summation by rows
df.sum(axis=1).head()
# 2000 30
# 2001 31
# 2002 29
# 2003 31
# 2004 31
# dtype: int64
참고로, index 축으로 칼럼별 합을 구할 때는 df.sum(axis=0) 을 해주면 됩니다. sum(axis=0) 이 기본설정값이므로 df.sum() 하면 동일한 결과가 나옵니다.
## summation by index axis
df.sum(axis=0) # default setting
# M 426
# F 274
# dtype: int64
pandas DataFrame에서 div() 메소드를 사용하면 각 원소를 특정 값으로 나눌 수 있습니다. 가령, 위의 예제 df DataFrame의 각 원소를 10으로 나눈다고 하면 아래처럼 df.div(10) 이라고 해주면 됩니다. (나누어주는 값 '10' 이 broadcasting 되어서 각 원소를 나누어주었음.)
## pd.DataFrame.div()
## : Get Floating division of dataframe and other,
## element-wise (binary operator truediv).
df.div(10).head()
# M F
# 2000 0.9 2.1
# 2001 0.7 2.4
# 2002 0.9 2.0
# 2003 1.2 1.9
# 2004 1.3 1.8
이제 df DataFrame의 각 원소를 각 원소가 속한 TimeStamp별로 칼럼 축(axis=1)으로 합한 값(df.sum(axis=1))으로 나누어주면 우리가 구하고자 하는 각 TimeStamp별 칼럼별 비율을 구할 수 있습니다.
df.div(df.sum(axis=1), axis=0).head()
# M F
# 2000 0.300000 0.700000
# 2001 0.225806 0.774194
# 2002 0.310345 0.689655
# 2003 0.387097 0.612903
# 2004 0.419355 0.580645
(2) 시도표 (time series plot) 를 그리기
pandas DataFrame 의 plot() 메소드를 사용하면 편리하게 시계열 도표를 그릴 수 있습니다. 이때 성별을 나타내는 칼럼 'M', 'F' 별로 선의 모양(line type)과 색깔(color) 을 style={'M': 'b--', 'F': 'r-'} 매개변수를 사용해서 다르게 해서 그려보겠습니다. ('M' 은 파란색 점선, 'F' 는 빨간색 실선)
df.div(df.sum(1), axis=0).plot(
style={'M': 'b--', 'F': 'r-'},
figsize=(12, 8),
title='Proportion Trend by Gender')
plt.show()
[ Reference ]
* pandas.DataFrame.div(): https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.div.html
이번 포스팅이 많은 도움이 되었기를 바랍니다.
행복한 데이터 과학자 되세요! :-)