2014-04-03 2 views
0

저는 각 행 항목이 동작이며 시간 소인이있는 관찰 동작 데이터를 조작하고 있습니다. 데이터 세트에는 여러 관측 기간이 포함되며 동작은 Epoch 시간 표기법을 사용하는 타임 스탬프와 함께 실시간으로 기록됩니다. 데이터 프레임에 각 관측 기간 내에 시간대를 표시하는 새 열을 만들고 싶습니다. 특히, 각 관측 기간의 시작부터 5 분 간격으로 행 항목에 레이블을 지정하려고합니다. (고정 된 기간 동안 다른 행동의 빈도를 계산하려면이 값을 사용해야합니다.)5 분 시간 블록 만들기 (팬더 ​​/ 파이썬)

observation  epoch   behavior timeblock 
    1    12973561838 vo   1 
    1    12973561870 bc   1 
    1    12973561944 xp   2 
    1    12973562055 vo   3 
    1    12973562106 vo   3 
    2    12731709280 wc   4 
    2    12731709322 we   5 
    2    12731709361 vb   5 
    2    12731709374 vw   5 
    ... 
: 내가 같이 할 수있는 제품을 원하는 무엇

observation  epoch   behavior 
1    12973561838 vo 
1    12973561870 bc 
1    12973561944 xp 
1    12973562055 vo 
1    12973562106 vo 
2    12731709280 wc 
2    12731709322 we 
2    12731709361 vb 
2    12731709374 vw 
... 

은 다음과 같다 : 데이터는 (관련된 더 많은 열이있다,하지만 난 프리젠 테이션의 편의를 위해 그들을 밖으로 떠 났어요)과 같이

여기서 "타임 블록"# 1에는 첫 번째 관찰 시간 # 1 분이 포함되며, # 2 시간에는 5시에서 9시 59 분까지 ...에서 25시 이후까지가 관찰 기간마다 포함됩니다. 이 예에서 # 4에는 관찰 기간 # 2의 첫 번째 4:59 분이 포함됩니다. (Epoch 시간 값이 여기 내 시간 블록과 일치하지 않는다는 것을 알지만, 데이터를 축약하고 우연히 일부 타임 스탬프를 잡았 기 때문에이 값이 이해가되지 않을 것입니다.)

내가 지금까지 해봤 던 것 : 나는 groupby와 함꺼 혼란스러워했고 별도의 데이터 프레임에서 각각의 관찰 기간 동안 5 분 시간 블록의 시작과 끝에서 실제 에포크 값을 계산했습니다. 그러나 각 관측 기간에 대해 여러 값이있는 위의 원래 데이터 프레임에서 관측 기간 당 적용되는 함수에서 이들을 가져 오는 방법을 알 수는 없습니다. 나는 그 대답이 groupby와 적용 방법에 대한 더 나은 이해에 있다고 의심하지만, 이것을 땅에 떨어 뜨리는 데 어려움을 겪고있다. (또한 어쩌면 정확한 검색 용어를 사용하지 않고 있지만, 포럼에 이미 게시 된 내용을 많이 찾지는 못하고 있습니다. 단지 timeseries 작업에 대한 정보 만 찾을 수 있습니다.) 두 가지 옵션은 내가 생각했지만 프로그램하는 방법을 알아낼 수 없습니다 :

  1. 내가 최소한의 신기원 값을 기준으로 5 분 소요 시간 블록으로 기간을 분할 할 수있는 각각의 관찰 기간 동안 실제 에포크의 시점을 계산 관측 기간마다 (이 부분은 완료되었습니다.), 이것을 사용하여 시간 블록 레이블의 열을 생성하십시오 (이 부분은 제가 막혔습니다).

  2. 관측 기간의 각 에피 크 값에 기초하여 관측 기간 내의 각 행 항목에 대한 시작 시간을 계산하십시오 (여기에 붙어 있습니다). 그런 다음 관측 기간마다 다른 값 목록을 사용하는 대신 (개념적 솔루션 # 1에서와 같이) 표준 범위의 값 (분 0에서 4:59, 5에서 9:59 등)을 사용하여 시간 블록 레이블. 나도 이걸 시작하는 방법에 붙어있다.

귀하의 도움에 감사드립니다! 나는이 점을 넣었습니다

g_follow = teach_freq['Epoch'].groupby(teach_freq['observation']) 

start_follow = g_follow.min() 

:

업데이트 설명은

아래 이미 각 '관찰'기간 동안 초기 타임 스탬프의 테이블을 만들 GROUPBY을 사용했습니다 max (각 '관찰'기간의 끝 타임 스탬프를 표시)와 함께 데이터 프레임즉, 225 '관찰'주기로 다음 dataframe 생산 각 '관찰'주기가 다른 '분'값 또는 서로 다른 시작 시간을 갖는다

observation  min   max 
1    12973561838 12973563058 
2    12973571418 12973572718 
3    12973825256 12973826474 
... 

참고. 위의 옵션 # 1은 필자의 큰 데이터베이스에서 각 'Epoch'항목의 각 관찰에 대해 '최소'코드를 빼는 코드를 작성해야한다는 것을 의미합니다.

UPDATE :

#where the dataframe with timeblocks & start times is named blocks 
#each observation period is in column 'follow' 
#and each start time for the observation periods is in column 'first' 

min_time = lambda row: row['Epoch'] - blocks[blocks['follow'] == row['follow']]['first'] 

얹는 : 드미트리의 제안 코드를 기반으로, 나는 다음과 같은 사용하려고 해요

#where the dataframe with observed & timestamped behaviors is named teach_freq 

teach_freq['std_epoch'] = teach_freq.apply(min_time, axis=1) 

하지만이 프로그램을 실행할 때 나는 다음과 같은 오류가 발생합니다 :

ValueError: Wrong number of items passed 1, indices imply 225 

답변

1

이 문제가 발생하기 전에 - 이것이 내 해결책입니다.

  1. 관찰은 일부 타임 스탬프에서 시작됩니다. 우리가 시간부터 모든 시대를했을 결과로, 그래서 우리는 각 행에서 초기 타임 스탬프를 뺄 수 0

    timeseries['timeblock'] = timeseries['epoch'] - timeseries['epoch'][0] 
    
  2. 우리가 5 분 간격으로 매핑 할 수 있습니다이 '정상화'시간 필드 :

    timeseries['timeblock'] = timeseries['timeblock'].map(lambda x: int(x/300)) 
    

나는 오래지 않아 팬더를 사용하기 시작, 그래서 아마 존재보다 팬더와 같은 솔루션

[편집] 당신은 1로 timeblocks을 시작, 그래서 올바른 코드가 될 것이다

timeseries['timeblock'] = timeseries['timeblock'].map(lambda x: int(x/300)+1) 

[편집] 업데이트 - 나는 당신이 바로 그 분 시간을 빼기 위해이 기능을 적용 할 수 있습니다 생각

# let's say that data frame with observations and their mins is called omf 
min_time = lambda row: row['epoch'] - omf[omf['observation'] == row['observation']]['min'] 
timeseries['new_epoch'] = timeseries.apply(min_time,axis=1) 

[편집] 업데이트 전체 코드 - 당신의 표기와 시리즈를 사용 :

# Notice epoch lowercase, panda column names are case sensitive 
g_follow = teach_freq['epoch'].groupby(teach_freq['observation']) 
start_follow = g_follow.min() 
# Important - start_follow is a Series where observation is an index 
blocks = start_follow # to have the same notation 
# main part - using Series instead of DataFrame makes the indexing simpler 
min_time = lambda row: row['epoch'] - blocks[row['observation']] 
teach_freq['std_epoch'] = teach_freq.apply(min_time, axis=1) 
+0

좋아, 이것은 약간의 진전을 이루고 있습니다. 그러나 각각의 관찰 기간은 다른 시간에 시작됩니다 (날짜와 시간은 3 개월 이상 펼쳐집니다). 따라서 모든 '신기원'데이터에서 1 단계를 수행 할 수는 없습니다. 각 '관찰'그룹별로 별도로 적용해야합니다. 마찬가지로 '관찰'그룹에서 2 단계를 수행해야합니다. 그래서 나는 행동 계획이 당신이 제공 한 접근법을 사용하는 것이라고 생각하지만 groupby를 통해 적용 할 것입니다. –

+0

위의 설명을 추가했습니다. 5 분 시간 블록은 첫 번째 기간의 시작보다는 각 '관찰'기간의 시작을 기반으로해야합니다. –

+0

답변을 업데이트했습니다. 당신이 만든 데이터 프레임을 기반으로 오른쪽 분 값을 얻을 수 있고 신기원 열 – Dmitry