2012-12-06 7 views
3

팬더를 사용하여 실시간으로 시리즈 작업을하고 싶습니다. 매초마다, 나는 기존 시리즈에 최신 관측치를 추가해야합니다. 내 시리즈는 DataFrame으로 그룹화되어 HDF5 파일에 저장됩니다.Pandas 시리즈 또는 DataFrame에 단일 행을 효율적으로 추가

>> existing_series = Series([7,13,97], [0,1,2]) 
>> updated_series = existing_series.append(Series([111], [3])) 

이 가장 효율적인 방법입니다 : 여기

나는 순간에 그것을 할 방법은? 무수한 게시물을 읽었으나 고주파 데이터의 효율성에 초점을 맞추지는 못합니다.

편집 : 모듈 선반과 피클에 대해 읽었습니다. 그들은 기본적으로 디스크에 목록을 저장하려고하는 것처럼 성취 할 것 같습니다. 내 목록이 크기 때문에 전체 목록을 메모리에로드하지 않고 한 번에 하나씩 효율적으로 값을 추가하는 방법이 있습니까?

+2

아마 그 어느 것보다 효율적이지만, Pandas/numpy 구조는 근본적으로 효율적으로 성장하는 데 적합하지 않습니다. 그들은 고정 된 크기로 만들어지고 그렇게 유지 될 때 가장 잘 작동합니다. – BrenBarn

+1

'append'는'concat'에 대한 래퍼입니다. 그래서'concat'는 약간 효율적입니다. 그러나 @BrenBarn은 Pandas가 HDF5 파일을 매 초마다 업데이트하는 것은 적절하지 않다고 말합니다. 어떤 이유로 판다가 절대적으로 필요한 경우 Series 목록을 수집하고 주기적으로 파일을 업데이트 할 수 있습니까? –

+0

브렌 (Bren)은 사전 할당되었을 때 가장 잘 작동하는 numpy/pandas에 관한 권리가 있습니다. 메모리가 제약이 없다면 거대한 제로 배열을 사전 할당하고 프로그램 끝 부분에 초과 0을 제거하십시오. 나는 Matti가 말하고있는 것의 약간이다라고 생각한다. – arynaq

답변

2

0.10의 새로운 PyTables 문서 (곧 제공 될 예정)를 보거나 마스터에서 얻을 수 있습니다. http://pandas.pydata.org/pandas-docs/dev/whatsnew.html

PyTables는 실제로 실제로 추가하기가 쉽고 매 초마다 HDFStore에 쓰면 작동합니다. DataFrame 테이블을 저장하려고합니다. 그런 다음 검색어와 같은 형식으로 데이터를 선택할 수 있습니다 (예 :

store.append('df', the_latest_df) 
store.append('df', the_latest_df) 
.... 
store.select('df', [ 'index>12:00:01' ]) 

이것이 모두 동일한 프로세스에서 발생하는 경우 큰 효과가 있습니다. 작가 프로세스가 있고 다른 프로세스가 읽는 중이라면 조금 까다 롭습니다 (하지만 현재 수행중인 작업에 따라 올바르게 작동 할 것입니다).

또 다른 옵션은 한 프로세스에서 다른 프로세스로 전송하기 위해 메시징을 사용하고 (메모리에 추가하는) 직렬화 문제를 방지하는 것입니다.

관련 문제