我想使用诸如一年中的一周,一周中的一天,季节等功能来构建时间序列预测模型。
由于预测将受到最新值的高度影响,因此我想将过去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值。
答案 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:
答案 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)