2016-07-06 51 views
0

我目前正在重構對時間序列進行分析的算法,因爲實施對於除原型設計以外的任何操作都太慢。包裝時間序列以生成按日分組的滾動統計信息

該算法通過將時間序列分割成24h塊並將其排列並排排列,從而使每列包含24小時時間序列數據,從而生成DataFrame

下一步是循環每天(列),比較當天的(滾動)統計數據與前7天(列)的組合(滾動)統計量(數據的SNR非常差所以日子結合起來增強它)。問題是這是python中的for循環,它通過df.loc[]DataFrame中獲取片段,這非常緩慢。

我想盡可能地使用本地熊貓方法來加速算法,但是我有點卡在這一點。

我想產生一個命令,而不是一個循環滾動「參考」的統計(來自前7天由),我應該安排數據成一個大對角DataFrame像這樣

[[day 0] [day 1] [day 2] [day 3] [day 4] [day 5] [day 6] [nan..] [nan..] [nan..] [nan..] [nan..] [nan..] [nan..] ... 
[nan..] [day 1] [day 2] [day 3] [day 4] [day 5] [day 6] [day 7] [nan..] [nan..] [nan..] [nan..] [nan..] [nan..] ... 
etc.] 

然後,我可以簡單地應用df.rolling(foo).whatever()。

我試着在df.groupby(pd.TimeGrouper("1d"))的幫助下生成這樣的DataFrame,但是我想不到沒有循環的方法。

如果有人知道如何生成這樣一個框架或可以想出一個更好的方法來解決這個問題,我將不勝感激的幫助。

編輯: 思考一些關於這一點,DataFrame也可以是這樣的

[[day 0] [day 1] [day 2] [day 3] [day 4] [day 5] [day 6] 
[day 1] [day 2] [day 3] [day 4] [day 5] [day 6] [day 7] 
etc.] 

它看起來像一個漢克爾矩陣,每個元素都是一個時間序列數據的24小時的一個子集。

回答

0

原來,這比我想象的要容易得多。看第二個例子,我們可以看到,每一列都只是原始時間序列的副本,而後者又多了一天。

什麼,我想出了:

# duplicate timeseries 
refFrame = pd.concat([data] * refLen, axis=1) 

# shift each column by samples per day * day index 
refFrame = refFrame.apply(lambda x: x.shift(-int(x.name) * 144), 
          axis=0) 
# drop rows that contain nan after shifting 
refFrame.dropna(inplace=True) 
相關問題