반응형
Python에서 데이터 분석을 위한 라이브러리 Pandas, Matplotlib, Numpy를 10분만에 익히는 방법
python에서 데이터 분석을 하기 위해서는 주로 사용하는 라이브러리가 있습니다. pandas, matplotlib, numpy입니다. 패키지들을 이용하는 이유는 데이터 분석을 용이하게 할 수 있도록, matrix연산과 시각화를 지원합니다. pandas는 DataFrame, Series의 데이터 객체를 이용해서 데이터를 쉽게 가공을 할 수 있습니다. 더나아가 평균, 분산, 최대, 최소 등을 쉽게 연산할 수 있습니다. 그 외에도 데이터 변수 사이에 연관성, 그룹, 선택, 조인 등의 다양한 함수를 통해 matrix를 효율적으로 쉽게 가공 할 수 있습니다. matplotlib은 데이터의 분포 및 패턴을 확인하기 위한 시각화 용도로 사용이 됩니다. 아래 예제를 통해 데이터 분석에 기본이 되는 함수를 익혀보도록 하겠습니다.
10 Minutes to pandas¶
In [273]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
Object Creation¶
In [274]:
s = pd.Series([1,3,5,np.nan,6,8])
In [4]:
s
Out[4]:
In [5]:
# numpy array를 이용해 DataFrame 생성하기
dates = pd.date_range('20160620', periods=6)
dates
Out[5]:
In [6]:
# 위에서 생성한 dates를 index로 생성하는 방법, (row x col)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df
Out[6]:
In [7]:
# dict의 형태를 DataFrame으로 생성하는 방법.
df2 = pd.DataFrame({ 'A' : 1.,
'B' : pd.Timestamp('20130102'),
'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
'D' : np.array([3] * 4,dtype='int32'),
'E' : pd.Categorical(["test","train","test","train"]),
'F' : 'foo' })
df2
Out[7]:
In [8]:
# DataFrame의 datatype확인하는 방법
df2.dtypes
Out[8]:
In [9]:
# Viewing Data
In [10]:
# DataFrame의 top N을 보는 방법 df.head(N)
df.head()
Out[10]:
In [11]:
# DataFrame의 bottom N을 보는 방법 df.tail(N)
df.tail(3)
Out[11]:
In [12]:
df.index
Out[12]:
In [13]:
df.columns
Out[13]:
In [23]:
df.values
Out[23]:
In [24]:
df.describe()
Out[24]:
In [25]:
# transposing
df.T
Out[25]:
In [36]:
# axis의 개념은 (0,0)을 기준으로 0=down, 1=across를 의미한다. 풀어 말하면
# axis=0은 각 apply a method down each column,row의 labels를 나타낸다 (index)
# axis=1은 각 apply a method across each row, column labels
df.sort_index(axis=1, ascending=False) # column의 값으로 정렬
Out[36]:
In [ ]:
df.sort_index(axis=0, ascending=False) # row의 값으로 정렬
In [29]:
df.sort_values(by='B')
Out[29]:
Selection¶
Getting¶
In [38]:
# getting
df['A']
Out[38]:
In [39]:
df[1:3]
Out[39]:
Selection by label¶
In [41]:
# selection by label
df.loc[dates[0]]
Out[41]:
In [44]:
# : 는 row의 전체 범위를 의미한다.전체의 row에서 ['A','B'] column을 선택
df.loc[:,['A','B']]
Out[44]:
In [55]:
# '20160620':'20160623 까지의 날짜를 기간으로 입력하고, ['A','B']의 column을 선택
df.loc['20160620':'20160623',['A','B']]
Out[55]:
In [61]:
# 20160621의 이전의 row를 선택
df.loc[:'20160621']
Out[61]:
In [60]:
df.loc['20160620',['A','B']]
Out[60]:
In [62]:
# dates[0]에 column'A'를 선택
df.loc[dates[0], 'A']
Out[62]:
In [63]:
df.at[dates[0],'A']
Out[63]:
selection by position¶
In [69]:
# N번째 row를 가져오는 방법 index의 location을 바로
df.iloc[3]
Out[69]:
In [75]:
# 3번째 ~ 5번째까지의 row를 가져오고 2부터 (4-1)의 column을 선택
df.iloc[3:5,2:4]
Out[75]:
In [76]:
# 1,2,4row와 0,2의 column을 선택
df.iloc[[1,2,4],[0,2]]
Out[76]:
In [78]:
# row 1:3, column 전체
df.iloc[1:3,:]
Out[78]:
In [79]:
# row 전체, column 1:3
df.iloc[:, 1:3]
Out[79]:
In [80]:
df.iloc[1,1]
Out[80]:
In [81]:
df.iat[1,1]
Out[81]:
Boolean Indexing¶
In [83]:
df[df.A > 0]
Out[83]:
In [84]:
df[df > 0]
Out[84]:
In [85]:
df > 0
Out[85]:
In [87]:
df2 = df.copy()
df2['E'] = ['one','one','two','three','four','three']
df2
Out[87]:
In [93]:
df2['E'].isin(['two','four'])
Out[93]:
In [92]:
df2[df2['E'].isin(['two','four'])]
Out[92]:
Setting¶
In [39]:
s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20160620', periods=6))
s1
Out[39]:
In [40]:
df['F'] = s1
In [41]:
df.at[dates[0], 'A'] = 0
In [42]:
df.iat[0,1] = 0
In [43]:
# numpy array를 set
df.loc[:,'D'] = np.array([5] * len(df))
In [44]:
df
Out[44]:
In [47]:
# where operation
df2 = df.copy()
df2[df2 > 0] = -df2
df2
Out[47]:
Missing Data¶
In [49]:
df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
df1.loc[dates[0]:dates[1], 'E'] = 1
df1
Out[49]:
In [51]:
df1.dropna(how='any')
Out[51]:
In [53]:
df1.fillna(value=5)
Out[53]:
In [54]:
df1.fillna(value=5)
Out[54]:
Operations¶
In [66]:
df.mean(0)
Out[66]:
In [61]:
df.mean(1)
Out[61]:
In [58]:
s = pd.Series([1,3,5,np.nan,6,8], index=dates).shift(2)
s
Out[58]:
In [67]:
df.sub(s, axis='index')
Out[67]:
In [70]:
df.apply(np.cumsum)
Out[70]:
In [72]:
df.apply(lambda x: x.max() - x.min())
Out[72]:
In [74]:
s = pd.Series(np.random.randint(0, 7, size=10))
s
Out[74]:
In [76]:
s.value_counts()
Out[76]:
In [78]:
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
s.str.lower()
Out[78]:
Merge¶
In [81]:
df = pd.DataFrame(np.random.randn(10, 4))
df
Out[81]:
In [87]:
# Row를 나누는 작업임 0~2 의 rows, 3~6의 rows, 7~9의 rows
pieces = [df[:3], df[3:7], df[7:]]
# pieces[0] 0~2의 rows를 출력
#pieces
# 나뉘어진 pices를 붙이기 위해서 pd.concat()
pd.concat(pieces)
Out[87]:
In [91]:
# Join
left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
left
Out[91]:
In [93]:
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
right
Out[93]:
In [96]:
pd.merge(left, right, on='key')
Out[96]:
In [98]:
df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
df
Out[98]:
In [100]:
s = df.iloc[3]
df.append(s, ignore_index=True)
Out[100]:
Grouping¶
In [104]:
df = pd.DataFrame({'A':['foo','bar','foo','bar','foo','bar','foo','foo'],
'B':['one','one','two','three','two','two','one','three'],
'C':np.random.randn(8),
'D':np.random.randn(8)})
df
Out[104]:
In [106]:
# A Column을 group해서 합을 더한 값 C,D
df.groupby('A').sum()
Out[106]:
In [108]:
df.groupby(['A','B']).sum()
Out[108]:
Reshaping¶
In [136]:
# zip은 김밥을 생각하면 되는데 당근, 햄 넣고 두개를 동시에 자른다고 생각하면됩니다.
# 리스트를 두개 넣으면 각 리스트에서 한개씩 값을 가져와서 tuple로 생성합니다.
# zip(*[['a','b','c'],['d','e','f']])
# [('a', 'd'), ('b', 'e'), ('c', 'f')]
tuples = list(zip(*[['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]))
# print tuples
# [('bar', 'one'), ('bar', 'two'), ('baz', 'one'), ('baz', 'two'), ('foo', 'one'), ('foo', 'two'), ('qux', 'one'), ('qux', 'two')]
# ('bar', 'one')의 tupler값을 multiindex로 생성하는 방법
index = pd.MultiIndex.from_tuples(tuples, names=['first','second'])
print index
df = pd.DataFrame(np.random.randn(8,2), index=index, columns=['A', 'B'])
print df
df2 = df[:4]
print df2
In [139]:
stacked = df2.stack()
print stacked
print type(stacked)
print len(stacked)
print stacked[0]
In [126]:
stacked.unstack()
Out[126]:
In [128]:
stacked.unstack(1)
Out[128]:
In [140]:
stacked.unstack(0)
Out[140]:
Pivot Tables¶
In [142]:
df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3,
'B' : ['A', 'B', 'C'] * 4,
'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,
'D' : np.random.randn(12),'E' : np.random.randn(12)})
print df
In [162]:
# pivot table을 만들기 위해서 values로 사용할 값, index, columns을 넣어주면 된다.
# C를 만약에 column으로 사용한다면, C의 값들의 set이 column으로 사용이 된다.
# A, B를 index로 사용하면 row의 index로 사용이 된다.
pivot = pd.pivot_table(df, values=['D','E'], index=['A','B'], columns=['C'])
print pivot
# pivot에서 값을 접근하는 방법은 아래와 같음
print pivot['D']['bar']['one']['A']
Time Series¶
In [181]:
# 2012년 1월 1일 0시 0분 0초 부터 시작해서 100개를 생성하는데, freq는 초를 단위로 해서 생성
rng = pd.date_range('1/1/2012', periods=100, freq='S')
ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
# 5분단위로 계산
ts.resample('5Min').sum()
Out[181]:
In [186]:
# 하루를 기준으로 2012년 3월 6일부터 5개를
rng = pd.date_range('3/6/2012 00:00', periods=5, freq='D')
print rng
ts = pd.Series(np.random.randn(len(rng)), rng)
print ts
In [187]:
# time zone을 표시하거나 변경하는 방법
ts_utc = ts.tz_localize('UTC')
ts_utc.tz_convert('US/Eastern')
Out[187]:
In [188]:
rng = pd.date_range('1/1/2012', periods=5, freq='M')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
print ts
ps = ts.to_period()
print ps
ps.to_timestamp()
Out[188]:
In [192]:
# Quarterly frequency
prng = pd.period_range('1990Q1', '2000Q4', freq='Q-NOV')
print prng
ts = pd.Series(np.random.randn(len(prng)), prng)
ts.index = (prng.asfreq('M', 'e') + 1).asfreq('H', 's') + 9
ts.head()
Out[192]:
Categoricals¶
In [213]:
# id, raw_grade를 columns으로 가지고 있는 테이블 생성
df = pd.DataFrame({"id":[1,2,3,4,5,6], "raw_grade":['a', 'b', 'b', 'a', 'a', 'e']})
df
Out[213]:
In [217]:
df['grade'] = df['raw_grade'].astype('category')
print df['grade']
In [218]:
# grade의 값을 Series.cat.categories를 사용해서 의미이는 이름으로 변경하는 방법
df['grade'].cat.categories=['very good', 'good','very bad']
df
Out[218]:
In [219]:
# 위에서 cat.categories는 length가 다르면 에러가 발생, 아래 set_categories는 categories를 추가.
# 만약 set_categories의 값이 기존에 없으면 NaN이 들어간다.
df["grade"] = df["grade"].cat.set_categories(["very bad", "bad", "medium", "good", "very good"])
print df['grade']
In [210]:
df.sort_values(by="grade")
Out[210]:
In [212]:
# Category별로 몇개의 값이 있는지 확인
df.groupby("grade").size()
Out[212]:
Plotting¶
In [232]:
%matplotlib inline
# pd.date_range를 이용해 2000년1월1일~ 1000개를 생성
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
try:
ts.plot()
except Exception:
pass
Data In/Out¶
In [258]:
# CSV 쓰는 방법
df.to_csv('foo.csv')
In [262]:
# CSV 읽는 방법
pd.read_csv('foo.csv').head()
Out[262]:
In [269]:
# excel 쓰는 방법
import openpyxl
df.to_excel('foo.xlsx', sheet_name='sheet1')
In [272]:
# excel 쓰는 방법
import xlrd
pd.read_excel('foo.xlsx', 'sheet1', index_col=None, na_values=['NA']).head()
Out[272]:
[참고] http://pandas.pydata.org/pandas-docs/stable/10min.html
반응형
'데이터분석' 카테고리의 다른 글
[Scikit-learn] large data set 학습시키는데 발생하는 문제 (0) | 2017.02.07 |
---|---|
데이터 용어 정리 (0) | 2017.02.07 |
[데이터 분석] Data Exploration Guide - The Art of Feature Engineering(4) (3) | 2016.07.06 |
[데이터 분석] 머신러닝 예제 - Loan Prediction (4) | 2016.07.06 |
[데이터 분석] Data Exploration Guide - Outlier(3) (0) | 2016.07.05 |