1. Series

Series는 다음과 같은 방식으로 생성할 수 있다.

In [20]: sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}

In [21]: obj3 = Series(sdata)

In [22]: obj3

Out[22]:

Ohio 35000

Oregon 16000

Texas 71000

Utah 50000

아래와 같이 index를 따로 지정할 수 있으며 index에 없넌 Utah는 나타나지 않으며 index에는 있지만 dictionary에 없는 California는 값을 갖지 않은체로 표시 된다. 

In [23]: states = ['California', 'Ohio', 'Oregon', 'Texas']

In [24]: obj4 = Series(sdata, index=states)

In [25]: obj4

Out[25]:

California NaN

Ohio 35000

Oregon 16000

Texas 71000

2. DataFrame

DataFrame은 다음과 같은 방식으로 생성할 수 있다.

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],

'year': [2000, 2001, 2002, 2001, 2002],

'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}

frame = DataFrame(data)

In [38]: frame

Out[38]:

pop state year

0 1.5 Ohio 2000

1 1.7 Ohio 2001

2 3.6 Ohio 2002

3 2.4 Nevada 2001

4 2.9 Nevada 2002

특정 column이나 row에 있는 값들을 호출하고 싶을 땐 다음과 같이 하면 된다.

In [40]: frame2 = DataFrame(data, columns=['year', 'state', 'pop', 'debt'],

....:                                index=['one', 'two', 'three', 'four', 'five'])

In [41]: frame2

Out[41]:

year state pop debt

one 2000 Ohio 1.5 NaN

two 2001 Ohio 1.7 NaN

three 2002 Ohio 3.6 NaN

four 2001 Nevada 2.4 NaN

five 2002 Nevada 2.9 NaN


In [42]: frame2.columns

Out[42]: Index([year, state, pop, debt], dtype=object)


In [43]: frame2['state']                 In [44]: frame2.year

Out[43]:                                     Out[44]:

one Ohio                                     one 2000

two Ohio                                      two 2001

three Ohio                                    three 2002

four Nevada                                 four 2001

five Nevada                                  five 2002

Name: state                                 Name: year


In [45]: frame2.ix['three']

Out[45]:

year 2002

state Ohio

pop 3.6

debt NaN

Name: three

최근에 python study를 하면서 정리도 할겸 포스팅을 하기로 했다. 잊지 않으려면, 나중에 찾아보려면 이렇게 기록으로 남기는것이 최선일 것이다.

1. Basic Indexing and Slicing

In [51]: arr = np.arange(10)

In [52]: arr

Out[52]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [53]: arr[5]

Out[53]: 5

In [54]: arr[5:8]

Out[54]: array([5, 6, 7])

In [55]: arr[5:8] = 12

In [56]: arr

Out[56]: array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])


 python에서 slicing을 할 경우 마지막 index는 수학 표현으로 치면 개구간이다. In[54]의 결과를 보면 8은 결과에 포함되어 있지 않음을 알 수 있다. 

다음은 Numpy에서 array를 call by reference로 처리하고 있다는 것을 보여주는 예제이다.

In [57]: arr_slice = arr[5:8]

In [58]: arr_slice[1] = 12345

In [59]: arr

Out[59]: array([ 0, 1, 2, 3, 4, 12, 12345, 12, 8, 9])

 혹여 이런식으로 'view'를 생성해서 원래 값과의 연결됨을 원치 않는다면 arr_slice = arr[5:8].copy() 명령어를 사용하면 된다.

2. Expressing Conditional Logic as Array Operations

numpy.where function은 어떤 조건에 따라 x 혹은 y를 경우게 맞게 빠르게 보여주는 기능을 제공한다. Python에 기본적으로 탑재되어 있는 기능을 사용하면 다음과 같이 구현해야 한다.

In [143]: result = [(x if c else y)

.....: for x, y, c in zip(xarr, yarr, cond)]

In [144]: result

Out[144]: [1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999, 2.5]

 이 방법은 large array에 대해서 빠르지 않을 뿐더러 multidimensional arrays에 적합하지 않다. numpy.where 함수를 쓰면 다음과 같이 구현 가능하다.

In [145]: result = np.where(cond, xarr, yarr)

In [146]: result

Out[146]: array([ 1.1, 2.2, 1.3, 1.4, 2.5])

numpy.where는 반드시 array를 필요로 하지 않는다.

In [147]: arr = randn(4, 4)

In [148]: arr

Out[148]:

array([[ 0.6372, 2.2043, 1.7904, 0.0752],

[-1.5926, -1.1536, 0.4413, 0.3483],

[-0.1798, 0.3299, 0.7827, -0.7585],

[ 0.5857, 0.1619, 1.3583, -1.3865]])

In [149]: np.where(arr > 0, 2, -2)

Out[149]:

array([[ 2, 2, 2, 2],

    [-2, -2, 2, 2],

    [-2, 2, 2, -2],

    [ 2, 2, 2, -2]])

이런식으로 where에 자유롭게 input을 입력하여 사용할 수 있다.

3. Mathematical and Statistical Methods

Numpy에서는 sum, mean, std 같은 수학적 연산 함수를 제공한다. 

In [151]: arr = np.random.randn(5, 4) # normally-distributed data

In [152]: arr.mean()

Out[152]: 0.062814911084854597

In [153]: np.mean(arr)

Out[153]: 0.062814911084854597

In [154]: arr.sum()

Out[154]: 1.2562982216970919

mean(), sum()과 같이 method에 인수를 지정하지 않으면 대상 array에 모든 값을 대상으로 수학연산을 행한다. 그런데 method에 인수로 정수값을 할당하면 'axis'를 따라 연산을 행한다. 예를들면 다음과 같다.

In [157]: arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])

In [158]: arr.cumsum(0)                 In [159]: arr.cumprod(1)

Out[158]:                                     Out[159]:

array([[ 0, 1, 2],                           array([[ 0, 0, 0],

   [ 3, 5, 7],                                     [ 3, 12, 60],

   [ 9, 12, 15]])                                [ 6, 42, 336]])

cumsumcumprod는 이름에서 알 수 있듯이 누적해서 합, 곱을 해주는 method이다. 여기서 좀 헷갈렸던 점이 'axis'를 따라 연산을 한다는 점이었다. 보통 2d-array를 취급할 때 앞에 오는 숫자가 대부분 행, 뒤 숫자가 열을 의미하기에 결과를 보기 전에 cumsum(0)을 입력하면 [0,1,3],[3,7,12] 이런식으로 출력이 될거라고 예상했었다. 그런데 'axis'를 따라서 연산한다는 의미를 잘 생각해보면 x축, y축 처럼 그 축위를 움직이면서 그 위치에 해당하는 값들에 대해 연산해 준다는 것이었다. 설명은 명확히 쓰여 있었으나 그 동안 해오던 것과 달라서 헷갈렸던 부분이었다.

최근에 "Python for Data Analysis" 라는 책을 이용하여 python study를 시작하게 되었다. 이 책에서 가장 먼저 공부하기로 한 부분은 Chapter 4. NumPy Basics: Arrays and Vectorized Computation이다. 이 Chapter의 내용을 실습해보려면 numpy를 설치해야 하는데 이 부분에서 자꾸 에러가 발생하였다. 내가 사용한 명령어는 다음과 같다.

python -m pip install numpy

 Powershell에서 위의 명령어를 입력하면 뭔가 설치되는 듯 하다가 에러가 발생하였다. 에러 내용은 ~~를 찾을 수 없다.. 뭐 이런식이었다. 언제나 그렇듯 막힌 부분을 해결하기 위해 구글링을 하다보니 많은 사람들이 나와 같은 문제를 겪어왔다는 것을 확인할 수 있었다. 내가 numpy 설치를 시도한 노트북과 내 연구실의 PC모두 64비트 컴퓨터여서 에러가 발생하는 것이었다. 검색을 하다가 http://goo.gl/HG1Q1o 이 블로그에서 64비트 컴퓨터에 numpy를 설치하는 방법을 알게되었다. 

 그러나 이 때, 연구실 친구가 winPython을 써보라는 조언을 해주었다. winPython을 설치하면 유용한 package들이 한꺼번에 몽땅 설치된다는 것이었다. 그래서 구글에서 winpython을 입력하여 홈페이지에 접속해 보았더니 이 페이지에서는 친절하게 64비트용 유저를 위한 버전도 구별해서 설치파일을 올려두고 있었다.

 설치 파일을 다운 받고 본격적으로 책에 있는 내용을 실습해보려고 하니 아직도 numpy를 찾을 수 없다고 한다. 문제는 환경변수였다. winPython을 설치했지만 지금 내 PC에서 인식하고 있는 python은 얼마 전에 설치한 'C:\Python' 에 있는 파일들이었다. 서 이 파일들을 지우고 winPython이 설치된 폴더에서 python 실행파일이 있는 하위 폴더를 환경 변수에 추가해주고 Scripts 폴더도 추가해주니 powershell에서 아주 훌륭하게 작동하였다.

winPython을 설치하고 나면 설치되는 package들 (더 있지만 그림 크기상 담지 못하였음)

 위와 같이 package들을 설치해준다. 또한 이 책에서 실습용으로 사용하는 IDE인 iPython도 제공한다. winPython을 설치한 뒤에 shell에서 ipython을 입력하면 된다. winPython 정말 유용하다.


+ Recent posts