용량이 꽤 큰 데이터를 빠르게 읽고 처리하기 위해서 필요한 방법들이 있다. 무식하게 ASCII 파일로 기록해서 일일히 읽어 쓰는건 피하자. 나중에 필요한 구간에 대해서만 잘라 쓸 때에도 가장 원시적인 방법으로 데이터를 다 훑어야 한다.


그래서 DBMS를 사용하거나 HDF5 같은 특수화된 데이터 저장방법을 통해 데이터를 빠르고 편리하게 가공하길 추천한다.


그래서 HDF5 file을 만들었는데... Pandas에서 HDF5 포맷으로 dataframe을 저장할 때 중요한 옵션이 있었다.

참조할 링크: http://pandas.pydata.org/pandas-docs/dev/io.html#fixed-format


dataframe을 HDF5 파일로 저장할 때 format을 지정해줄 수 있다. 여기서 fixed format으로 지정해줄 경우, writing 속도는 빠르지만 dataframe을 추후에 수정할 수 없다. 근데 이게 문제가 아니라... querying도 안되고 일부 column만 불러오더라도 전체 table이 메모리로 올라오게 되어 메모리 부족 현상이 일어나기 십상이다. 


format을 table format으로 지정해주어 문제가 없다면 다행이다. 하지만 fixed format으로 지정된 HDF5 파일을 이미 만들었다면 어떻게 해야 할까? 다음과 같이 일부 table이나 column단위로 데이터를 쪼개 numpy의 binary 파일로 저장하는 방법을 써보자.


* 저장

1. 뽑아낸 series나 dataframe을 numpy array로 변환한다. (a = np.array(table))

2. numpy의 save() 를 이용하여 1에서 변환한 array를 저장한다.


* 불러오기

1. numpy의 load()를 이용해 이전에 만들어진 data.npy를 불러온다. ( a = numpy.load("data.npy") ) 

2. 위에서 리턴된 객체는 0-dim array여서 item()함수를 이용해 element를 뽑아온다. ( b = a.item() )

3. 얻어진 객체의 type을 확인하고 사용한다. 


만약 series나 dataframe을 그대로 numpy의 array에 저장했다면, 불러왔을 때에도 그대로 series 혹은 dataframe의 구조를 가진다. 

'Study > Computer' 카테고리의 다른 글

command line에서 파일 검색하기 in Linux  (0) 2014.07.22
Gephi에서 node에 여러 색 주기  (0) 2014.07.09
numpy array 잘라쓰기  (0) 2014.06.17
Python으로 n-gram 만들기  (0) 2014.05.22
Matplotlib 추천 Q&A 링크들  (0) 2014.05.21

numpy array가 있을 때 행 혹은 열을 잘라내는 방법




이 행렬의 변수 이름은 간단하게... mtx 라고 해두자.


1. 행 자르기

>>> mtx[0:2,:]


이 결과는, 



ㅎㅎㅎ 비슷한 방법으로 열도 자를 수 있다.


2. 열 자르기

>>> mtx[:,1:3]




'Study > Computer' 카테고리의 다른 글

Gephi에서 node에 여러 색 주기  (0) 2014.07.09
large data with numpy  (0) 2014.06.20
Python으로 n-gram 만들기  (0) 2014.05.22
Matplotlib 추천 Q&A 링크들  (0) 2014.05.21
위도, 경도 검색 프로그램  (0) 2014.05.09

세상에... Python으로 이렇게 간단힌 n-gram을 만들 수 있다니...!!


우선 zip 함수에 대해 알아보자. zip함수의 인자로 받은 리스트 등의 iterator들을 묶어주는 함수이다. 뭐 예를 들면...


>>> q = [1,2,3,4,5]

>>> w = [10, 20, 30, 40,50]

>>> r = [100, 200, 300, 400, 500]

>>> zip(q, w, r)

[(1, 10, 100), (2, 20, 200), (3, 30, 300), (4, 40, 400), (5, 50, 500), (6, 60, 600)]


이제 n-gram을 만들어보자. 위의 방법으로 만들기 떄문에 함수도 짧고 속도도 그만큼 빠르다.


>>> a = "I am a boy, you are a girl."

>>> b = a.split(" ")
['I', 'am', 'a', 'boy,', 'you', 'are', 'a', 'girl.']
>>> zip(b, b[1:])
[('I', 'am'), ('am', 'a'), ('a', 'boy,'), ('boy,', 'you'), ('you', 'are'), ('are', 'a'), ('a', 'girl.')]


b 리스트와 b 리스트 중 0번째 원소를 제외하고 1번째 원소부터 시작한 리스트를 zip으로 묶은 결과이다. 이렇게 bi-gram을 만들 수 있다. 


그럼 n-gram은...? 다음과 같이 만들면 된다고 한다. 


>>> zip( *[b[i:] for i in range(3)] )

>>> [('I', 'am', 'a'), ('am', 'a', 'boy,'), ('a', 'boy,', 'you'), ('boy,', 'you', 'are'), ('you', 'are', 'a'), ('are', 'a', 'girl.')]


원리는 간단하다. 

1. 리스트 내포(list comprehension) 문법으로 b[0:], b[1:], b[2:], ... 등의 리스트를 원소로 가지는 리스트를 하나 만든다. 

2. 만들어진 리스트의 원소들이 필요하기 때문에, 리스트 앞에 *을 붙여 리스트의 원소들이 함수의 argument로 들어가도록 해준다.

3. zip으로 묶어준다. 


새로 발견한건 아니고... 출처는 아래이다. Python 짱이네..

http://locallyoptimal.com/blog/2013/01/20/elegant-n-gram-generation-in-python/


'Study > Computer' 카테고리의 다른 글

large data with numpy  (0) 2014.06.20
numpy array 잘라쓰기  (0) 2014.06.17
Matplotlib 추천 Q&A 링크들  (0) 2014.05.21
위도, 경도 검색 프로그램  (0) 2014.05.09
Too many open files 에러가 로그에 남을 때  (0) 2014.04.07

+ Recent posts