【问题标题】:How to shift a pandas MultiIndex Series?如何转换 pandas MultiIndex 系列?
【发布时间】:2012-10-13 08:57:37
【问题描述】:

在常规时间序列中,您可以及时将其向后或向前移动。

例如对于以下时间序列:

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 时间序列执行此操作?

例如对于以下 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
...

【问题讨论】:

    标签: python time-series pandas


    【解决方案1】:
    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)
    

    【讨论】:

    • 酷,谢谢。我喜欢你用并排打印所做的,顺便说一句。顺便说一句,它来自哪个模块?无法通过 Google 找到它。
    • 我是从 Wes 的PyCon 2012 talk(代码here)那里得到的。
    • 内联在我的回答中;希望韦斯没事。
    • 谢谢!这将在我关于 pandas 的 IPython 笔记本章节中派上用场。他们应该将它添加到 pandas 包中......以及ts_mi.shift(2, freq='D', level=0) :) 中的内容。
    猜你喜欢
    • 2018-07-25
    • 2023-03-02
    • 2019-01-07
    • 2017-04-28
    • 1970-01-01
    • 2013-03-22
    • 2017-11-24
    • 1970-01-01
    • 2019-11-27
    相关资源
    最近更新 更多