簡體   English   中英

將過去N天的日期行轉換為列

[英]Converting date row to column for last N days

我想使用諸如一年中的一周,一周中的一天,季節等功能來構建時間序列預測模型。

由於預測會受到最新值的高度影響,因此我想將過去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值

您可以使用groupby(id)shift 在使用以下命令之前,應df.sort_values('date')日期對df進行排序: df.sort_values('date')

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

使用上面的命令將產生以下df:

在此處輸入圖片說明

使用Timedelta進行時移

另一個答案是按數字索引移動。 在這種情況下可以使用,但是如果日期中有空格或日期未排序,它將中斷。

您可以通過將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       0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM