2013-10-03 67 views
2

我有兩個數據流,都是一系列(時間戳,值)元組。 即:如何在Python中的數據流之間切換熊貓人

[(2013-04-03T22:16:36+0000, 2334.5), (2013-04-03T22:46:36+0000, 43543.23), ...] 

的想法是,這些人會被「優選」和一個沒有了,我想創建一個單一的時間序列即當可用的更高的優先級流的結果,並回落到當不是最不優選的流時。

我的想法是將來自兩個流的值的時間戳放入桶中,並使用桶作爲D​​ataFrame的索引,併爲每個流使用一列,並在每個桶中使用一列(時間戳,值)元組。然後,我可以通過每桶,並選擇具有最高點數的例如。

數據幀將是這個樣子:

timestamp   stream1         stream2 
2013-04-03 00:00:00 [(2013-04-03T00:16:36+0000, 2334.5),  [(2013-04-03T00:17:36+0000, 2314.5)] 
         (2013-04-03T00:17:36+0000, 2314.5)] 
2013-04-03 00:30:00 [(2013-04-03T00:43:44+0000, 43543.23), [(2013-04-03T00:47:36+0000, 2364.5)] 
         (2013-04-03T00:54:24+0000, 4443.23)] 
2013-04-03 01:00:00 []          [(2013-04-03T01:01:30+0000, 34.34)] 
2013-04-03 01:30:00 [(2013-04-03T01:35:32+0000, 238734.3)] [(2013-04-03T01:45:32+0000, 238734.3)] 

在這種情況下,時間戳已投入半小時桶,並且流1是首選流。對於00:00的桶,將選擇stream1中的兩個點,對於00:30的桶,將選擇流1中的兩個點,對於01:00的桶,stream2中的單個點將被選擇爲stream1沒有數據,對於01:30的桶,將選擇stream1中的單個數據點,因爲它是首選流。

我該怎麼做呢?我試圖創建數據幀並使用resample('h', how='count')拆分爲小時計數,並使用groupby,但無法將時間戳完全放入存儲桶中,併爲每個存儲桶的每個流創建值列表。

回答

2

我有一個解決方案,但我不知道它是多麼有效(是一個熊貓小白我自己),或者如果有一種方式,即是多「熊貓式」:檢查

hh = date_range('2013-01-01T00:30:00', periods=48, freq='1800S') 
s5 = date_range('2013-01-01', freq='5S', end='2013-01-02') 
s5 = s5[:720] + s5[1440:] # introduce a gap in the 5 second data 
hh_d = Series(hh.astype('int')/10 ** 9, index=hh) 
s5_d = Series(s5.astype('int')/10 ** 9, index=s5) 
df = DataFrame({ 
    'hh': hh_d, 
    '5s': s5_d, 
}) 
# Make a grouping, for simplicity by day, hour 
grp = df.groupby(lambda x: (x.day, x.hour)) 

result = TimeSeries() 
for name, group in grp: 
    winner = None 
    for column in group.keys(): # iterate over the columns (streams) 
     data = group[column].dropna() # ditch any NaNs that will be present 
     # next, perform the test (in this case, just the length) 
     if not winner or len(data) > len(group[winner].dropna()): 
      winner = column 
    # finally, add the data to the result set. 
    result = result.append(group[winner].dropna()) 

結果在5秒的時間間隔給出:

ipdb> result[719:725] 
2013-01-01 00:59:55 1357001995 
2013-01-01 01:00:00 1357002000 
2013-01-01 01:30:00 1357003800 
2013-01-01 02:00:00 1357005600 
2013-01-01 02:00:05 1357005605 
2013-01-01 02:00:10 1357005610 
dtype: float64 

這表明在間隙期間選擇了半小時的流。

上面的示例基於組中每列的長度,但我想可以應用任何測試。

希望有更多熊貓經驗的人可以詳細說明我的稻草人答案!