python-3.x - 基于多列创建滞后特征
问题描述
我有一个时间序列数据集。我需要提取滞后特征。我正在使用下面的代码,但得到了所有 NAN
df.groupby(['week','id1','id2','id3'],as_index=False)['value'].shift(1)
输入
week,id1,id2,id3,value
1,101,123,001,45
1,102,231,004,89
1,203,435,099,65
2,101,123,001,48
2,102,231,004,75
2,203,435,099,90
输出
week,id1,id2,id3,value,t-1
1,101,123,001,45,NAN
1,102,231,004,89,NAN
1,203,435,099,65,NAN
2,101,123,001,48,45
2,102,231,004,75,89
2,203,435,099,90,65
解决方案
你想转移到下周,所以'week'
从分组中删除:
df['t-1'] = df.groupby(['id1','id2','id3'],as_index=False)['value'].shift()
# week id1 id2 id3 value t-1
#0 1 101 123 1 45 NaN
#1 1 102 231 4 89 NaN
#2 1 203 435 99 65 NaN
#3 2 101 123 1 48 45.0
#4 2 102 231 4 75 89.0
#5 2 203 435 99 90 65.0
这是容易错过几周的错误。在这种情况下,我们可以在更改周后合并,这样可以确保它是前一周,而不管缺少周。
df2 = df.assign(week=df.week+1).rename(columns={'value': 't-1'})
df = df.merge(df2, on=['week', 'id1', 'id2', 'id3'], how='left')
引入和重命名许多列的另一种方法是suffixes
在合并中使用参数。这将重命名右侧 DataFrame 中的所有重叠列(不是键)。
df.merge(df.assign(week=df.week+1), # Manally lag
on=['week', 'id1', 'id2', 'id3'],
how='left',
suffixes=['', '_lagged'] # Right df columns -> _lagged
)
# week id1 id2 id3 value value_lagged
#0 1 101 123 1 45 NaN
#1 1 102 231 4 89 NaN
#2 1 203 435 99 65 NaN
#3 2 101 123 1 48 45.0
#4 2 102 231 4 75 89.0
#5 2 203 435 99 90 65.0
推荐阅读
- xml - Cardview 在另一个具有高度的视图上
- docker - 无法在 alpine:3.8 上获取 jdk (jdk-8u301-linux-x64.tar.gz)
- angular - Angular - 带有材料表和数据行的 FormArray 不正确
- python - Tkinter:如何调整图像大小以填充其标签框并让该标签框填充其列?
- latex - 如何将文本直接放在限制函数下方?
- jsp - 如何在一个 JSP 页面上执行 mySQL 查询并在另一个页面上显示结果?
- mysql - 将 mysql 数据转储导入 Maria DB
- javascript - 如何在我的 React Todo 列表中实现 React Beautiful 拖放功能?
- python - 如何在python中加密套接字连接
- create-react-app - 为什么我只在 CRA 构建期间收到 ESLint 警告,而在 CLI 上运行 Eslint 时却没有?