我想要使用诸如一年中的星期、一周中的某一天、季节等特性来构建一个时间序列预测模型。
由于预测将受到最新值的高度影响,我想使用最近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 0Date_1是A的分数,在“date”列中日期的前一天,date_2是前两天,依此类推……
这样我就可以使用过去5天的信息和更多与这个问题无关的特征来预测第二天。可以用0填充NaN值
发布于 2018-12-20 02:01:00
您可以使用groupby(id)和shift。在使用以下命令之前,应该先按date: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:

发布于 2018-12-20 02:21:09
使用Timedelta实现时移
other answer正在按数字索引移位。在这种情况下有效,但如果日期中存在间隙,或者如果日期尚未排序,则它将中断。
可以通过将DataFrame转换为时间序列,然后将DataFrame.shift()的freq参数与pandas.Timedelta对象一起使用来处理此问题。
示例数据:
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)ID意味着我们需要几个循环来保持所有内容的分离:
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)这与本例中的其他方法产生的输出相同,但如果在日期中有一个跳过,则会有所不同。
输出:
id score date_1 date_2 date_3 date_4 date_5
date
2014-01-01 A 75 0 0 0 0 0
2014-01-01 B 1 0 0 0 0 0
2014-01-01 C 2 0 0 0 0 0
2014-01-02 A 84 75 0 0 0 0
2014-01-02 B 1 1 0 0 0 0
2014-01-02 C 3 2 0 0 0 0
2014-01-03 A 1 84 75 0 0 0
2014-01-03 B 1 1 1 0 0 0
2014-01-03 C 1 3 2 0 0 0https://stackoverflow.com/questions/53856362
复制相似问题