2012-10-23 105 views
2

在常規時間序列中,您可以及時將其向後或向前移位。如何轉移熊貓MultiIndex系列?

例如對於以下時間序列:

start = datetime(2012,1,1) 
end = datetime(2012,4,1) 
rng = pd.date_range(start,end) 
ts = pd.Series(np.random.randn(len(rng)), index = rng) 

我們可以接班:

ts.shift(2, freq="D") 

我怎樣才能做到這一點上只是一個水平多指標的時間序列?

例如以下多指標的時間序列:

mi = [(dt,i) for dt in rng for i in range(5)] 
ts_mi = pd.Series(np.random.randn(len(mi)), index = pd.MultiIndex.from_tuples(mi)) 

這可能看起來像:

2012-01-01 0 -0.805353 
      1 1.467167 
      2 -1.207204 
      3 1.658394 
      4 1.497559 
2012-01-02 0 -0.742510 
      1 0.764594 
      2 0.558660 
      3 -0.479370 
      4 0.653849 
... 

轉移它使用ts_mi.shift(2, freq="D")給出:

None -0.805353 
None 1.467167 
None -1.207204 
None 1.658394 
None 1.497559 
None -0.742510 
None 0.764594 
None 0.558660 
None -0.479370 
None 0.653849 
None -0.138347 
None 0.357479 
None -0.919202 
None 1.300977 
None -0.360398 
... 

回答

4
ts_mi.unstack().shift(2, freq='D').stack() 

可以看到,輸出是正確:

utils.side_by_side(ts_mi, ts_mi.unstack().shift(2, freq='D').stack()) 
2012-01-01 0 0.481555 2012-01-03 0 0.481555 
      1 0.000628    1 0.000628 
      2 2.509266    2 2.509266 
      3 0.021571    3 0.021571 
      4 -0.539981    4 -0.539981 
2012-01-02 0 -1.465450 2012-01-04 0 -1.465450 
      1 0.815251    1 0.815251 
      2 -1.489051    2 -1.489051 
      3 0.639746    3 0.639746 
      4 -0.176939    4 -0.176939 
2012-01-03 0 -0.441842 2012-01-05 0 -0.441842 
      1 -0.792810    1 -0.792810 
      2 -0.802665    2 -0.802665 
      3 1.922190    3 1.922190 
      4 0.165446    4 0.165446 
...       ...      

工作原理:df.unstack()將嵌套的0,1,2,3,4中的值移動到同名詞列,df.stack()恢復原始嵌套索引。

編輯:這裏是來自@Wes_McKinney

def side_by_side(*objs, **kwds): 
    from pandas.core.common import adjoin 
    space = kwds.get('space', 4) 
    reprs = [repr(obj).split('\n') for obj in objs] 
    print adjoin(space, *reprs) 
+0

酷,感謝side_by_side功能。我喜歡你在並排印刷方面所做的,BTW。 btw是哪個模塊?無法通過Google找到它。 – metakermit

+0

我從Wes的[PyCon 2012 talk](http://www.youtube.com/watch?v=w26x-z-BdWQ)(代碼[here](http://ow.ly/9w92O)) 。 – meteore

+1

在我的答案中內聯;希望對韋斯來說沒問題。 – meteore