pandas滞后的多指数不规则时间序列数据,按月数计算。

问题描述 投票:0回答:1

我有以下的pandas数据框架。

df = pd.DataFrame(data = {
    'item': ['red','red','red','blue','blue'],
    'dt': pd.to_datetime(['2018-01-31', '2018-02-28', '2018-03-31', '2018-01-31', '2018-03-31']),
    's': [3.2, 4.8, 5.1, 5.3, 5.8],
    'r': [1,2,3,4,5],
    't': [7,8,9,10,11],
})

看起来


    item    dt          s   r   t
0   red     2018-01-31  3.2 1   7
1   red     2018-02-28  4.8 2   8
2   red     2018-03-31  5.1 3   9
3   blue    2018-01-31  5.3 4   10
4   blue    2018-03-31  5.8 5   11

注意,时间点是不规则的。"蓝色 "是缺少2月份的数据。所有日期都是有效的月末日期。

我想增加一列,即 "两个月前的s值",理想的情况是这样的

df['s_lag2m'] = df.set_index(['item','dt'])['s'].shift(2, 'M')

我会得到

    item    dt          s   r   t   s_lag2m
0   red     2018-01-31  3.2 1   7   NaN
1   red     2018-02-28  4.8 2   8   NaN
2   red     2018-03-31  5.1 3   9   3.2
3   blue    2018-01-31  5.3 4   10  NaN
4   blue    2018-03-31  5.8 5   11  5.3

但这是行不通的,它抛出的是 NotImplementedError: Not supported for type MultiIndex.

我怎样才能做到这一点?

pandas time-series multi-index
1个回答
1
投票

我们可以做到 reindex 之后 set_index 只有dt

df['New']=df.set_index(['dt']).groupby('item')['s'].shift(2, 'M').\
             reindex(pd.MultiIndex.from_frame(df[['item','dt']])).values
df
   item         dt    s  r   t  New
0   red 2018-01-31  3.2  1   7  NaN
1   red 2018-02-28  4.8  2   8  NaN
2   red 2018-03-31  5.1  3   9  3.2
3  blue 2018-01-31  5.3  4  10  NaN
4  blue 2018-03-31  5.8  5  11  5.3
© www.soinside.com 2019 - 2024. All rights reserved.