2014-11-15 5 views
0

팬더를 처음 접했고 고정 창 크기로 롤링 평균을 얻으려고합니다. 하지만 타임 스탬프 튜플과 값을 나타내는 두 개의 목록이 있습니다. 나는 후자에 대한 무게로 전자를 사용하고 싶습니다. 또한 데이터의 갭이 식별 가능한지 확인하고 싶습니다 (타임 스탬프가 반드시 연속적 일 필요는 없습니다).시간 가중치가있는 롤링 평균 팬더를 계산합니다

예 목록 : 내가 지금 사용하고 무엇

ts = [(1415969999, 1415970014), (1415970014, 1415970030), (1415970030, 1415970045), (1415970045, 1415970060), (1415970060, 1415970075), (1415970075, 1415970090), (1415970090, 1415970105), (1415970105, 1415970120), (1415970120, 1415970135), (1415970135, 1415970150), (1415970150, 1415970165), (1415970165, 1415970181), (1415970181, 1415970286), (1415970286, 1415970301), (1415970301, 1415970316)...]

values = [8.0, 13.0, 11.75, 7.0, 8.5, 16.0, 16.0, 6.5, 4.0, 8.25, 5.5, 1.0, 0.0, 0.5, 0.5, 0.0, 0.25, 0.0, 0.25, 0.0, 0.5, 0.0, 2.25, 0.0, 0.25, 0.0, 0.25, 0.0, 1.0, 0.25, 0.25, 0.0, 0.25, 0.0, 0.5, 0.25, 0.0, 1.0, 0.0, 0.5...]

은 다음과 같습니다

pandas_series = pd.Series(values) window_averages = pd.rolling_mean(pandas_series, window=90) # 90 would be seconds here

하지만 그 가중치를 고려하지 않습니다. 나는 모양이 herehere 이었지만 꽤 함께 조각 수 없습니다.

편집

나는 일종의 내가 원하는 것을 얻을 수 있었다,하지만 난 솔루션이 매우 최적 생각하지 않습니다. 그것은 거의 I 하단에 필요한 입력을 나타내고,

후 다음과 같이 산출
import pandas as pd 

data = [(1415970014, 1415970030, 13.0), (1415970033, 1415970048, 11.75), (1415970048, 1415970053, 3.2)] 
start_range = data[0][0] 
end_range = data[len(data)-1][1]-1 
previous_end_time = start_range 
values = [] 

for t in data: 
    start_ts, end_ts, value = t 

    empties = [] 
    while start_ts > previous_end_time: 
     empties.append(previous_end_time) 
     values.append(-1) 
     previous_end_time += 1 

    window_length = end_ts-start_ts 
    values += [value]*window_length 
    previous_end_time = end_ts 

s_range_datetime_start = pd.to_datetime(start_range, unit='s') 
s_range_datetime_end = pd.to_datetime(end_range, unit='s') 
period_range = pd.period_range(s_range_datetime_start, s_range_datetime_end, freq='s') 

series = pd.Series(values, period_range) 
print series 

는, 기본적으로 데이터를 1 초 외삽 (I 여기서 지금 -1로 표시되는) 데이터의 차이를 포함한다.

2014-11-14 13:00:14 13.00 
2014-11-14 13:00:15 13.00 
2014-11-14 13:00:16 13.00 
2014-11-14 13:00:17 13.00 
2014-11-14 13:00:18 13.00 
2014-11-14 13:00:19 13.00 
2014-11-14 13:00:20 13.00 
2014-11-14 13:00:21 13.00 
2014-11-14 13:00:22 13.00 
2014-11-14 13:00:23 13.00 
2014-11-14 13:00:24 13.00 
2014-11-14 13:00:25 13.00 
2014-11-14 13:00:26 13.00 
2014-11-14 13:00:27 13.00 
2014-11-14 13:00:28 13.00 
2014-11-14 13:00:29 13.00 
2014-11-14 13:00:30 -1.00 
2014-11-14 13:00:31 -1.00 
2014-11-14 13:00:32 -1.00 
2014-11-14 13:00:33 11.75 
2014-11-14 13:00:34 11.75 
2014-11-14 13:00:35 11.75 
2014-11-14 13:00:36 11.75 
2014-11-14 13:00:37 11.75 
2014-11-14 13:00:38 11.75 
2014-11-14 13:00:39 11.75 
2014-11-14 13:00:40 11.75 
2014-11-14 13:00:41 11.75 
2014-11-14 13:00:42 11.75 
2014-11-14 13:00:43 11.75 
2014-11-14 13:00:44 11.75 
2014-11-14 13:00:45 11.75 
2014-11-14 13:00:46 11.75 
2014-11-14 13:00:47 11.75 
2014-11-14 13:00:48  3.20 
2014-11-14 13:00:49  3.20 
2014-11-14 13:00:50  3.20 
2014-11-14 13:00:51  3.20 
2014-11-14 13:00:52  3.20 

내 아이디어는이 기간에 롤링 평균을 적용하는 것이 었습니다.

답변

2

먼저 패키지까지 데이터

In [26]: df = DataFrame(ts) 

In [27]: df.columns=['start','end'] 

귀하의 값 (표시되는 내용에 대한)

In [28]: df['value'] = values[:len(df)] 

In [29]: df 
Out[29]: 
     start   end value 
0 1415969999 1415970014 8.00 
1 1415970014 1415970030 13.00 
2 1415970030 1415970045 11.75 
3 1415970045 1415970060 7.00 
4 1415970060 1415970075 8.50 
5 1415970075 1415970090 16.00 
6 1415970090 1415970105 16.00 
7 1415970105 1415970120 6.50 
8 1415970120 1415970135 4.00 
9 1415970135 1415970150 8.25 
10 1415970150 1415970165 5.50 
11 1415970165 1415970181 1.00 
12 1415970181 1415970286 0.00 
13 1415970286 1415970301 0.50 
14 1415970301 1415970316 0.50 

In [30]: df['start'] = pd.to_datetime(df['start'],unit='s') 

In [31]: df['end'] = pd.to_datetime(df['end'],unit='s') 

는 것 같은데 실제 날짜 시간에 타임 스탬프를 확인 너무 오래 여기에 있습니다 90s 창에서 모든 것을 다시 샘플링하려고합니다.

In [32]: df.groupby(pd.Grouper(key='start',freq='90s'))['value'].mean() 
Out[32]: 
start 
2014-11-14 12:58:30  8.000 
2014-11-14 13:00:00 11.250 
2014-11-14 13:01:30  6.875 
2014-11-14 13:03:00  0.000 
2014-11-14 13:04:30  0.500 
Freq: 90S, Name: value, dtype: float64 

데이터의 중요도가 무엇인지 확실하지 않습니다. Pls는 출력의 추가 예제를 제공합니다.

+0

위대한, 내 접근 방식보다 조금 더 잘 작동하는 것 같아요. 그러나 창 길이 (예 : 30 초)를 줄이면 타임 스탬프가 연속적이더라도 (일부는 타임 스탬프의 간격으로 인해 발생하며 괜찮습니다) 특정 값에 대해 NaN을 얻습니다. 이 문제를 어떻게 해결할 수 있습니까? 값을 보간 하시겠습니까? 감사. –

+0

마지막 질문 인 건배에 대해'ffill()'메소드를 찾았습니다. –

관련 문제