2016-08-30 2 views
0

이와 비슷한 질문이 있지만 내 데이터 프레임이 HDFStore 내부에있는 경우를 처리하지 못합니다.키/값 쌍 목록을 HDFStore에 저장된 팬더 데이터 프레임으로 변환

타임 스탬프/키/값 항목의 목록을 데이터 프레임으로 변환하고 타임 스탬프에 각각 인덱싱 된 여러 데이터 프레임으로 저장 한 다음 HDFStore에 저장해야합니다.

예제 코드 :이 코드를 실행

from pandas import HDFStore 
from pandas import DataFrame 
store = HDFStore('xxx', driver="H5FD_CORE") 
for i, k, v in ((0, 'x', 5), (1, 'y', 6)): 
    if k not in store: 
     store[k] = DataFrame() 
    store[k].set_value(i, 'value', v) 

후, store['x']는 비어 있습니다.

>>> store['x'] 
Empty DataFrame 
Columns: [] 
Index: [] 

그래서 분명히 그 지속되지 않는 이유 몇 가지 이유가있다, 또한 확실히 난 그냥이 물건이 작동하도록되어 방법을 모르는 경우입니다. HDFStore 내부에서 테이블/데이터 프레임에 추가하는 방법을 이해하면 논리를 분명히 이해할 수 있습니다.

데이터 프레임을 메모리에 보관하고 사전에 저장 한 다음 끝에 HDFStore에 할당 할 수도 있습니다. 나는 어떻게 든이 방법으로 그렇게하면 메모리를 절약 할 수 있다는 잘못된 생각이 들었습니다. 아마도 나는 그것에 대해서 틀렸을 것입니다.

+0

'타임 스탬프/키/값'데이터 세트의 샘플을 제공 할 수 있습니까? 어디에서 가져 왔습니까? – MaxU

+0

나는 그것을 약간 숙달했다. 데이터 자체는 생체 인식 센서를 사용하여 인체에서 가져온 타임 스탬프 및 측정 값을 포함하는 프로토 타입 레코드의 반복 가능한 데이터입니다. 필자가 원하는 것은 메트릭 당 데이터 프레임이므로 기본적으로 타임 스탬프와 값에 대한 두 개의 열이 타임 스탬프에 색인되어 있습니다. 그런 다음 이러한 모든 데이터 프레임을 하나의 HDFStore에 저장하십시오.내 선택이 아니라 연구원이 원하는 것입니다. – izak

답변

0

몇 가지 설명을 듣고 싶지만 아직 담당자가 없습니다. 컨텍스트가 없으면 접근 방법이 현명한 지 여부를 말하기는 어렵지만 거의 모든 경우에서 아니오라고 말하고자합니다. 반복 가능 객체의 목록

  • 을 감안할 때 : 내가 틀렸다,하지만 당신이하려는 것은 경우에 저를 수정 당신은 HDFStore, 두 안양의를 원할 것 [(timeA, key1, value1), (timeB, key1, value2), (timeC, key2, value1)]
  • 여기서
    • store[key1] = DataFrame([value1, value2], index=[timeA, timeB])
    • store[key2] = DataFrame([value1], index=[timeC])

올바른? 그렇다면

은 제가 추천하는 것은 상점 키의 "필터링", dataframes를 생성 한 다음, 가게에 전체 dataframe을 쓰기 때문에 같은 몇 가지 종류 :

dataTuples = [(0, 'x', 5), (1, 'y', 6), ...] 

# initializing the dict of lists, which will become a dict of df's 
sortedByStoreKey = {storeKey: [] for idx, storeKey, val in dataTuples} 

for idx, storeKey, val in dataTuples: 
    sortedByStoreKey[storeKey].append([idx, storeKey]) # appending a 2-list to a list 

# this can all be done with dict comprehensions but this is more legible imo 
for storeKey, dfContents in sortedByStoreKey.items(): 
    df = pd.DataFrame(dfContents, columns=['time', 'value']) 
    df['time'] = pd.to_datetime(df['time']) # make sure this is read as a pd.DatetimeIndex (as you said you wanted) 
    df.set_index('time', inplace=True) 
    sortedByStoreKey[storeKey] = df 

# now we write full dataframes to HDFStore 
with pd.HDFStore('xxx') as store: 
    for storeKey, df in sortedByStoreKey.values(): 
     store[storeKey] = df 

난 아주 라인을 현명하게하고 자원을 현명하게 처리 할 수있는보다 효율적인 방법이 있다고 확신하지만, 이것이 나를 가장 파이썬으로 생각합니다. dataTuples 개체가 거대한 (> = RAM 등) 경우 내 대답이 변경 될 수 있습니다.

일반적으로 저장소에 쓰기 전에 각 데이터 프레임을 전체적으로 만드는 것이 좋습니다. 내가 여기서 끝내고 있기 때문에, 내가 선택한 것을 할 수 있다는 것을 깨달았습니다. 누락 된 부분은 추가를 가능하게하는 table format으로 상점을 지정해야한다는 것입니다. 한 번에 한 행을 추가하는 것은 좋은 생각이 아닙니다.

+0

내가 용의함을 확인하십시오 : 다른 구조에서 데이터 프레임을 수집하고 나중에 HDF에 저장하십시오. 우리가 수백 메가 바이트에 달하는 데이터 세트를 말하고 있기 때문에 그것을 피하려고했습니다. 오오 음, 먼저 작동하게하고, 나중에 더 좋게 만드십시오. – izak

+0

글쎄, MB에 대해 얘기하면, 당신이 비교적 현대적인 컴퓨터에 있다면 문제가 없어야한다고 생각 하나? 필터링 할 상점 키가 많으면 문제가 될 수 있습니다. 당신이 생각하고있는 라인을 따라 [append] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.HDFStore.append.html#pandas.HDFStore.append) 또는 [put ] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.HDFStore.put.html#pandas.HDFStore.put) 메소드를 대신 사용하십시오. 이 경우 1 행 df를 만들어 셀 값 자체가 아닌 해당 메서드에 전달합니다. – StarFox

관련 문제