将过去N天的日期行转换为列

时间:2018-12-19 17:25:19

标签: python pandas date group-by row

我想使用诸如一年中的一周,一周中的一天,季节等功能来构建时间序列预测模型。

由于预测将受到最新值的高度影响,因此我想将过去5天的值用作功能,但是我在准备数据进行学习时遇到了麻烦:

我当前的表格如下:

    date        id  score
0   2014-01-01  A   75
1   2014-01-01  B   1
2   2014-01-01  C   2
4   2014-01-02  A   84
5   2014-01-02  B   1
6   2014-01-02  C   3
8   2014-01-03  A   1
9   2014-01-03  B   1
10  2014-01-03  C   1

所以我希望每一行都像这样:

    date        id  score  date_1 date_2 date_3 date_4 date-5
10  2014-01-03  A   1      84     75     0      0      0 
 9  2014-01-03  B   1      1      1      0      0      0

Date_1是A的分数,它是“日期”列中日期的前一天,date_2是前两天,依此类推...

以便我可以使用最近5天的信息以及与该问题无关的更多功能来预测第二天。 可以用0填充NaN值。

2 个答案:

答案 0 :(得分:2)

您可以使用groupby(id)shift。在使用以下命令之前,应先按日期df.sort_values('date')对df进行排序:

for i in range(5):
    df['date_'+str(i+1)] = df.groupby('id')['score'].shift(i+1).fillna(0).astype(int)

使用上面的命令将产生以下df:

enter image description here

答案 1 :(得分:0)

使用Timedelta进行时移

other answer正在按数字索引移动。在这种情况下可以使用,但是如果日期中有空格或日期未排序,它将中断。

您可以通过将DataFrame转换为时间序列,然后将freq的{​​{1}}参数与DataFrame.shift()对象一起使用来解决此问题。

示例数据:

pandas.Timedelta

ID意味着我们需要几个循环来使所有内容分开:

import pandas as pd
df = pd.DataFrame({'date': ['2014-01-01'] * 3 +
                           ['2014-01-02'] * 3 +
                           ['2014-01-03'] * 3,
                   'id': ['A', 'B', 'C'] * 3,
                   'score': [75, 1, 2, 84, 1, 3, 1, 1, 1]})
df.date = pd.to_datetime(df.date)
df.set_index('date', inplace=True)

这将产生与本示例中其他方法相同的输出,但是如果您跳过日期,则将有所不同。

输出:

for i in range(5):
    for id in df.id.unique():
        col = 'date_{}'.format(i+1)
        freq = pd.Timedelta('{}d'.format(i+1))
        df.loc[df.id==id, col] = df.loc[df.id==id, 'score'].shift(freq=freq)
    df[col] = df[col].fillna(0).astype(int)