在常规时间序列中,您可以及时向前或向后移动。
e.g。对于以下时间序列:
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")
如何在一个级别上为MultiIndex时间序列执行此操作?
e.g。对于以下MultiIndex时间序列:
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
...
答案 0 :(得分: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的side_by_side函数
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)