2010-10-20 51 views
9

我有部分重疊的時間戳的兩個不同時間序列:如何在Python中聚合時間序列?

import scikits.timeseries as ts 
from datetime import datetime 
a = ts.time_series([1,2,3], dates=[datetime(2010,10,20), datetime(2010,10,21), datetime(2010,10,23)], freq='D') 
b = ts.time_series([4,5,6], dates=[datetime(2010,10,20), datetime(2010,10,22), datetime(2010,10,23)], freq='D') 

其表示以下數據:

Day: 20. 21. 22. 23. 
    a: 1 2 - 3 
    b: 4 - 5 6 

我想以計算每天的加權平均值與係數a(0.3)和b (0.7),而忽略缺失值:

Day 20.: (0.3 * 1 + 0.7 * 4)/(0.3 + 0.7) = 3.1/1. = 3.1 
Day 21.: (0.3 * 2   )/(0.3  ) = 0.6/0.3 = 2 
Day 22.: (   0.7 * 5)/(  0.7) = 3.5/0.7 = 5 
Day 23.: (0.3 * 3 + 0.7 * 6)/(0.3 + 0.7) = 3.1/1. = 5.1 

當我第一次嘗試對齊這些時間序列:

a1, b1 = ts.aligned(a, b) 

我得到正確蒙面的時間序列:

timeseries([1 2 -- 3], 
    dates = [20-Oct-2010 ... 23-Oct-2010], 
    freq = D) 

timeseries([4 -- 5 6], 
    dates = [20-Oct-2010 ... 23-Oct-2010], 
    freq = D) 

但是當我做a1 * 0.3 + b1 * 0.7,它忽略了價值,存在於只有一個時間序列:

timeseries([3.1 -- -- 5.1], 
    dates = [20-Oct-2010 ... 23-Oct-2010], 
    freq = D) 

我應該怎麼做收到期待的?

timeseries([3.1 2. 5. 5.1], 
    dates = [20-Oct-2010 ... 23-Oct-2010], 
    freq = D) 

編輯:答案應該也適用於不同的權重和不同缺失值兩個以上的初始時間序列。

因此,如果我們有四個時間序列與重量T1(0.1),T2(0.2),T3(0.3)和T4(0.4),在給定的時間戳記的權重將是:

  | T1 | T2 | T3 | T4 | 
weight  | 0.1 | 0.2 | 0.3 | 0.4 | 
------------------------------------- 
all present | 10% | 20% | 30% | 40% | 
T1 missing |  | 22% | 33% | 45% | 
T1,T2 miss. |  |  | 43% | 57% | 
T4 missing | 17% | 33% | 50% |  | 
etc. 
+0

「兩個以上的初始時間序列」 的?你的意思是T1,T2,T3?這不僅僅是((T1 * agg * T2)* agg * T3)?在這種情況下,任何數量的時間序列都可以通過簡單地應用解決方案作爲減少來進行彙總。如果不是,爲什麼不呢? – 2010-10-20 14:28:00

+0

@ S.Lott - 不是。你將如何處理T1(0.2),T2(0.2)和T3(0.6)的權重?如果在給定的時間戳Tl缺失,則T3的0.6代表實際上75%(T2然後是25%),而不是整個組的60%。在你的((T1 agg T2)agg T3)邏輯中,這是行不通的。 – eumiro 2010-10-20 14:40:08

+0

@eumiro:請**更新**您的問題與此要求。 – 2010-10-20 14:52:07

回答

3

我有試過並找到這個:

aWgt = 0.3 
bWgt = 0.7 

print (np.where(a1.mask, 0., a1.data * aWgt) + 
     np.where(b1.mask, 0., b1.data * bWgt))/(np.where(a1.mask, 0., aWgt) + 
               np.where(b1.mask, 0., bWgt)) 

# array([ 3.1, 2. , 5. , 5.1]) 

這適用於編輯的問題與多個初始時間序列。但希望有人會找到更好的。

編輯:這是我的函數:

def weightedAvg(weightedTimeseries): 
    sumA = np.sum((np.where(ts.mask, 0., ts.data * weight) for ts, weight in weightedTimeseries), axis=0) 
    sumB = np.sum((np.where(ts.mask, 0., weight) for ts, weight in weightedTimeseries), axis=0) 
    return np.divide(sumA, sumB) 

weightedAvg(((a1, 0.3), (bb, 0.7))) 
# array([ 3.1, 2. , 5. , 5.1]) 

適用於任何數量的時間序列;-)

+0

我認爲你的'weightedAvg'比我建議的更好,因爲它更簡單,並且佔用更少的內存。非常好! – unutbu 2010-10-20 23:42:30