[英]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值
使用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.