我想一个自定义的groupby移位函数,首先跳过前n天获取滞后1,2,3等。重要的是要注意,有失踪的日子,我们要跳过失踪的日子来获取滞后。
下面是一个示例df:
import pandas as pd
import numpy as np
# Sample data
data = {
'group': ['A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C'],
'date': ['2023-01-01', '2023-01-03', '2023-01-04', '2023-02-01', '2023-02-02', '2023-02-05', '2023-02-06',
'2023-03-02', '2023-03-04'],
'value': [1, 2, 3, 4, 5, 6, 7, 8, 9]
}
horizon = 2
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
display(df)
字符串
给定horizon=2,或者换句话说,在开始移位操作之前跳过1天,我希望输出如下所示:
的数据
以下是我失败的尝试:
def custom_shift(group, lag):
values = (group
.reindex(pd.date_range(start=group.index.min(), end=group.index.max()), fill_value=np.nan)
.shift(horizon-1)
.dropna()
.values
)
values = np.insert(values, 0, [np.nan]*(len(group.index) - len(values)))
return pd.Series(values, index=group.index).shift(lag)
df['value_lag1'] = (df
.set_index('date')
.groupby('group')['value']
.transform(custom_shift, lag=1)
.reset_index(drop=True)
)
df['value_lag2'] = (df
.set_index('date')
.groupby('group')['value']
.transform(custom_shift, lag=2)
.reset_index(drop=True)
)
display(df)
型
的
2条答案
按热度按时间km0tfn4u1#
据我所知,你应该从是否有两天
(horizon = 2)
的差异,并根据滞后,采取以前的值安装从行有2天的差异开始。我可以建议以下解决方案:按“组”分组并设置所需的值。字符串
输出量:
型
更新
型
你的改良版
型
yhxst69z2#
这是我的解决方案。但不幸的是效率不高
字符串