2016-09-26 211 views
1

我有一個數據集,它由一對記錄時間段內發生的事件的開始時間(如秒)組成。例如:如何將時間範圍/時間間隔分爲多個分箱間隔發生的時間間隔

#each tuple includes (start, stop) of the event happening 
data = [(0, 1), (5,8), (14,21), (29,30)] 

我想量化這個事情發生在任何我想要的大小的箱子裏的時間百分比。例如,如果我想5秒倉每個我想一個函數,將:到

  • 分裂該跨到多個二進制元素的任何元組
  • 加起來的總時間事件發生併除以塊大小獲取每個垃圾箱發生的時間事件

我大部分遇到第一個問題。

理想的情況下它會是這個樣子,其中bin_times是,我需要幫助的寫作功能,輸出是函數將返回什麼:

data = [(0, 1), (5,8), (15,21), (29,30)] 
bin_times(data, bin_size=5, total_length=40) 

>> [20, 60, 0, 100, 20, 20, 0, 0] 
+0

不應該(15-21)是(15,21),即用逗號? –

+0

對不起,只是修好了吧 – Lina

+0

不用擔心,有助於理解。 –

回答

1

如果你不介意使用numpy,這裏是策略:

import numpy as np 

def bin_times(data, bin_size, total_length): 
    times = np.zeros(total_length, dtype=np.bool) 
    for start, stop in data: 
     times[start:stop] = True 
    binned = 100 * np.average(times.reshape(-1, bin_size), axis=1) 
    return binned.tolist() 

data = [(0, 1), (5,8), (15,21), (29,30)] 
bin_times(data, 5, 40) 
// => [20.0, 60.0, 0.0, 100.0, 20.0, 20.0, 0.0, 0.0] 

來解釋bin_times()的邏輯,讓我用一個小例子:

data = [(0, 1), (3, 8)] 
bin_times(data, 3, 9) 
// => [33.3, 100.0, 66.6] 
  1. times數組編碼您的事件是否在每個單位時間間隔內發生。你首先每個條目設置爲False

    [False, False, False, False, False, False, False, False, False] 
    
  2. 讀取傳入data並打開相應的條目,以True

    [True, False, False, True, True, True, True, True, False] 
    
  3. 重塑成一個二維矩陣,其中長度行是bin_size

    [[True, False, False], 
    [True, True, True], 
    [True, True, False]] 
    
  4. Take平均每行中:

    [0.333, 1.000, 0.666] 
    
  5. 乘以100把這些數字成比例:

    [33.3, 100.0, 66.6] 
    
  6. 要隱藏的功能的消費者使用的numpy,使用.tolist()方法將生成的numpy數組轉換爲純Python列表。

警告:bin_size需求將平分total_length —重塑將拋出一個ValueError否則。