首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将最近N天的日期行转换为列

将最近N天的日期行转换为列
EN

Stack Overflow用户
提问于 2018-12-20 01:25:19
回答 2查看 53关注 0票数 0

我想要使用诸如一年中的星期、一周中的某一天、季节等特性来构建一个时间序列预测模型。

由于预测将受到最新值的高度影响,我想使用最近5天的值作为特征,但我在学习数据准备方面遇到了问题:

我当前的表格如下所示:

代码语言:javascript
复制
    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

所以我希望每一行看起来像这样:

代码语言:javascript
复制
    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”列中日期的前一天,date_2是前两天,依此类推……

这样我就可以使用过去5天的信息和更多与这个问题无关的特征来预测第二天。可以用0填充NaN值

EN

回答 2

Stack Overflow用户

发布于 2018-12-20 02:01:00

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

代码语言:javascript
复制
for i in range(5):
    df['date_'+str(i+1)] = df.groupby('id')['score'].shift(i+1).fillna(0).astype(int)

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

票数 2
EN

Stack Overflow用户

发布于 2018-12-20 02:21:09

使用Timedelta实现时移

other answer正在按数字索引移位。在这种情况下有效,但如果日期中存在间隙,或者如果日期尚未排序,则它将中断。

可以通过将DataFrame转换为时间序列,然后将DataFrame.shift()freq参数与pandas.Timedelta对象一起使用来处理此问题。

示例数据:

代码语言:javascript
复制
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意味着我们需要几个循环来保持所有内容的分离:

代码语言:javascript
复制
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)

这与本例中的其他方法产生的输出相同,但如果在日期中有一个跳过,则会有所不同。

输出:

代码语言:javascript
复制
           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       0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53856362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档